1 ; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+bmi,+bmi2,+popcnt,+lzcnt | FileCheck %s
3 declare void @foo32(i32)
4 declare void @foo64(i64)
11 define void @neg(i32 %x) nounwind {
13 %cmp = icmp eq i32 %sub, 0
14 br i1 %cmp, label %return, label %bb
17 tail call void @foo(i32 %sub)
29 define void @sar(i32 %x) nounwind {
30 %ashr = ashr i32 %x, 1
31 %cmp = icmp eq i32 %ashr, 0
32 br i1 %cmp, label %return, label %bb
35 tail call void @foo(i32 %ashr)
47 define void @shr(i32 %x) nounwind {
48 %ashr = lshr i32 %x, 1
49 %cmp = icmp eq i32 %ashr, 0
50 br i1 %cmp, label %return, label %bb
53 tail call void @foo(i32 %ashr)
61 ; CHECK: shrl $3, %edi
65 define void @shri(i32 %x) nounwind {
66 %ashr = lshr i32 %x, 3
67 %cmp = icmp eq i32 %ashr, 0
68 br i1 %cmp, label %return, label %bb
71 tail call void @foo(i32 %ashr)
79 ; CHECK: addl %edi, %edi
83 define void @shl(i32 %x) nounwind {
85 %cmp = icmp eq i32 %shl, 0
86 br i1 %cmp, label %return, label %bb
89 tail call void @foo(i32 %shl)
97 ; CHECK: shll $4, %edi
101 define void @shli(i32 %x) nounwind {
103 %cmp = icmp eq i32 %shl, 0
104 br i1 %cmp, label %return, label %bb
107 tail call void @foo(i32 %shl)
115 ; CHECK: movabsq $-9223372036854775808, %rax
116 ; CHECK-NEXT: addq %rdi, %rax
117 ; CHECK-NEXT: adcq $0, %rsi
118 ; CHECK-NEXT: sete %al
120 define zeroext i1 @adc(i128 %x) nounwind {
121 %add = add i128 %x, 9223372036854775808
122 %cmp = icmp ult i128 %add, 18446744073709551616
127 ; CHECK: cmpq %rdx, %rdi
128 ; CHECK-NEXT: sbbq %rcx, %rsi
129 ; CHECK-NEXT: setns %al
131 define zeroext i1 @sbb(i128 %x, i128 %y) nounwind {
132 %sub = sub i128 %x, %y
133 %cmp = icmp sge i128 %sub, 0
138 ; CHECK: andnl %esi, %edi, %edi
142 define void @andn(i32 %x, i32 %y) nounwind {
143 %not = xor i32 %x, -1
144 %andn = and i32 %y, %not
145 %cmp = icmp eq i32 %andn, 0
146 br i1 %cmp, label %return, label %bb
149 tail call void @foo(i32 %andn)
156 ; CHECK-LABEL: bextr:
157 ; CHECK: bextrl %esi, %edi, %edi
161 declare i32 @llvm.x86.bmi.bextr.32(i32, i32) nounwind readnone
162 define void @bextr(i32 %x, i32 %y) nounwind {
163 %bextr = tail call i32 @llvm.x86.bmi.bextr.32(i32 %x, i32 %y)
164 %cmp = icmp eq i32 %bextr, 0
165 br i1 %cmp, label %return, label %bb
168 tail call void @foo(i32 %bextr)
175 ; CHECK-LABEL: popcnt:
180 declare i32 @llvm.ctpop.i32(i32) nounwind readnone
181 define void @popcnt(i32 %x) nounwind {
182 %popcnt = tail call i32 @llvm.ctpop.i32(i32 %x)
183 %cmp = icmp eq i32 %popcnt, 0
184 br i1 %cmp, label %return, label %bb
187 tail call void @foo(i32 %popcnt)
194 ; CHECK-LABEL: testCTZ
198 declare i64 @llvm.cttz.i64(i64, i1)
199 define i64 @testCTZ(i64 %v) nounwind {
200 %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true)
201 %tobool = icmp eq i64 %v, 0
202 %cond = select i1 %tobool, i64 255, i64 %cnt
206 ; CHECK-LABEL: testCTZ2
210 declare i32 @llvm.cttz.i32(i32, i1)
211 define void @testCTZ2(i32 %v) nounwind {
212 %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true)
213 %cmp = icmp eq i32 %v, 0
214 br i1 %cmp, label %return, label %bb
217 tail call void @foo(i32 %cnt)
221 tail call void @foo32(i32 %cnt)
225 ; CHECK-LABEL: testCTZ3
229 define void @testCTZ3(i32 %v) nounwind {
230 %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true)
231 %cmp = icmp ne i32 %v, 0
232 br i1 %cmp, label %return, label %bb
235 tail call void @foo(i32 %cnt)
239 tail call void @foo32(i32 %cnt)
243 ; CHECK-LABEL: testCLZ
247 declare i64 @llvm.ctlz.i64(i64, i1)
248 define i64 @testCLZ(i64 %v) nounwind {
249 %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true)
250 %tobool = icmp ne i64 %v, 0
251 %cond = select i1 %tobool, i64 %cnt, i64 255
255 ; CHECK-LABEL: testPOPCNT
259 declare i64 @llvm.ctpop.i64(i64)
260 define i64 @testPOPCNT(i64 %v) nounwind {
261 %cnt = tail call i64 @llvm.ctpop.i64(i64 %v)
262 %tobool = icmp ne i64 %v, 0
263 %cond = select i1 %tobool, i64 %cnt, i64 255