1 ; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+bmi,+bmi2,+popcnt | FileCheck %s
3 declare void @foo64(i64)
10 define void @neg(i32 %x) nounwind {
12 %cmp = icmp eq i32 %sub, 0
13 br i1 %cmp, label %return, label %bb
16 tail call void @foo(i32 %sub)
28 define void @sar(i32 %x) nounwind {
29 %ashr = ashr i32 %x, 1
30 %cmp = icmp eq i32 %ashr, 0
31 br i1 %cmp, label %return, label %bb
34 tail call void @foo(i32 %ashr)
46 define void @shr(i32 %x) nounwind {
47 %ashr = lshr i32 %x, 1
48 %cmp = icmp eq i32 %ashr, 0
49 br i1 %cmp, label %return, label %bb
52 tail call void @foo(i32 %ashr)
60 ; CHECK: shrl $3, %edi
64 define void @shri(i32 %x) nounwind {
65 %ashr = lshr i32 %x, 3
66 %cmp = icmp eq i32 %ashr, 0
67 br i1 %cmp, label %return, label %bb
70 tail call void @foo(i32 %ashr)
78 ; CHECK: addl %edi, %edi
82 define void @shl(i32 %x) nounwind {
84 %cmp = icmp eq i32 %shl, 0
85 br i1 %cmp, label %return, label %bb
88 tail call void @foo(i32 %shl)
96 ; CHECK: shll $4, %edi
100 define void @shli(i32 %x) nounwind {
102 %cmp = icmp eq i32 %shl, 0
103 br i1 %cmp, label %return, label %bb
106 tail call void @foo(i32 %shl)
114 ; CHECK: movabsq $-9223372036854775808, %rax
115 ; CHECK-NEXT: addq %rdi, %rax
116 ; CHECK-NEXT: adcq $0, %rsi
117 ; CHECK-NEXT: sete %al
119 define zeroext i1 @adc(i128 %x) nounwind {
120 %add = add i128 %x, 9223372036854775808
121 %cmp = icmp ult i128 %add, 18446744073709551616
126 ; CHECK: cmpq %rdx, %rdi
127 ; CHECK-NEXT: sbbq %rcx, %rsi
128 ; CHECK-NEXT: setns %al
130 define zeroext i1 @sbb(i128 %x, i128 %y) nounwind {
131 %sub = sub i128 %x, %y
132 %cmp = icmp sge i128 %sub, 0
137 ; CHECK: andnl %esi, %edi, %edi
141 define void @andn(i32 %x, i32 %y) nounwind {
142 %not = xor i32 %x, -1
143 %andn = and i32 %y, %not
144 %cmp = icmp eq i32 %andn, 0
145 br i1 %cmp, label %return, label %bb
148 tail call void @foo(i32 %andn)
155 ; CHECK-LABEL: bextr:
156 ; CHECK: bextrl %esi, %edi, %edi
160 declare i32 @llvm.x86.bmi.bextr.32(i32, i32) nounwind readnone
161 define void @bextr(i32 %x, i32 %y) nounwind {
162 %bextr = tail call i32 @llvm.x86.bmi.bextr.32(i32 %x, i32 %y)
163 %cmp = icmp eq i32 %bextr, 0
164 br i1 %cmp, label %return, label %bb
167 tail call void @foo(i32 %bextr)
174 ; CHECK-LABEL: popcnt:
179 declare i32 @llvm.ctpop.i32(i32) nounwind readnone
180 define void @popcnt(i32 %x) nounwind {
181 %popcnt = tail call i32 @llvm.ctpop.i32(i32 %x)
182 %cmp = icmp eq i32 %popcnt, 0
183 br i1 %cmp, label %return, label %bb
186 tail call void @foo(i32 %popcnt)