1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+bmi,+bmi2,+popcnt,+lzcnt | FileCheck %s 2*9880d681SAndroid Build Coastguard Workerdeclare void @foo(i32) 3*9880d681SAndroid Build Coastguard Workerdeclare void @foo32(i32) 4*9880d681SAndroid Build Coastguard Workerdeclare void @foo64(i64) 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: neg: 7*9880d681SAndroid Build Coastguard Worker; CHECK: negl %edi 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 9*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo 10*9880d681SAndroid Build Coastguard Worker; CHECK: ret 11*9880d681SAndroid Build Coastguard Workerdefine void @neg(i32 %x) nounwind { 12*9880d681SAndroid Build Coastguard Worker %sub = sub i32 0, %x 13*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %sub, 0 14*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %return, label %bb 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerbb: 17*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %sub) 18*9880d681SAndroid Build Coastguard Worker br label %return 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerreturn: 21*9880d681SAndroid Build Coastguard Worker ret void 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sar: 25*9880d681SAndroid Build Coastguard Worker; CHECK: sarl %edi 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 27*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo 28*9880d681SAndroid Build Coastguard Worker; CHECK: ret 29*9880d681SAndroid Build Coastguard Workerdefine void @sar(i32 %x) nounwind { 30*9880d681SAndroid Build Coastguard Worker %ashr = ashr i32 %x, 1 31*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %ashr, 0 32*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %return, label %bb 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerbb: 35*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %ashr) 36*9880d681SAndroid Build Coastguard Worker br label %return 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerreturn: 39*9880d681SAndroid Build Coastguard Worker ret void 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shr: 43*9880d681SAndroid Build Coastguard Worker; CHECK: shrl %edi 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 45*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo 46*9880d681SAndroid Build Coastguard Worker; CHECK: ret 47*9880d681SAndroid Build Coastguard Workerdefine void @shr(i32 %x) nounwind { 48*9880d681SAndroid Build Coastguard Worker %ashr = lshr i32 %x, 1 49*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %ashr, 0 50*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %return, label %bb 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerbb: 53*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %ashr) 54*9880d681SAndroid Build Coastguard Worker br label %return 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerreturn: 57*9880d681SAndroid Build Coastguard Worker ret void 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shri: 61*9880d681SAndroid Build Coastguard Worker; CHECK: shrl $3, %edi 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 63*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo 64*9880d681SAndroid Build Coastguard Worker; CHECK: ret 65*9880d681SAndroid Build Coastguard Workerdefine void @shri(i32 %x) nounwind { 66*9880d681SAndroid Build Coastguard Worker %ashr = lshr i32 %x, 3 67*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %ashr, 0 68*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %return, label %bb 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerbb: 71*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %ashr) 72*9880d681SAndroid Build Coastguard Worker br label %return 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerreturn: 75*9880d681SAndroid Build Coastguard Worker ret void 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shl: 79*9880d681SAndroid Build Coastguard Worker; CHECK: addl %edi, %edi 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 81*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo 82*9880d681SAndroid Build Coastguard Worker; CHECK: ret 83*9880d681SAndroid Build Coastguard Workerdefine void @shl(i32 %x) nounwind { 84*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 1 85*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %shl, 0 86*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %return, label %bb 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerbb: 89*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %shl) 90*9880d681SAndroid Build Coastguard Worker br label %return 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerreturn: 93*9880d681SAndroid Build Coastguard Worker ret void 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shli: 97*9880d681SAndroid Build Coastguard Worker; CHECK: shll $4, %edi 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 99*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo 100*9880d681SAndroid Build Coastguard Worker; CHECK: ret 101*9880d681SAndroid Build Coastguard Workerdefine void @shli(i32 %x) nounwind { 102*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 4 103*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %shl, 0 104*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %return, label %bb 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerbb: 107*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %shl) 108*9880d681SAndroid Build Coastguard Worker br label %return 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerreturn: 111*9880d681SAndroid Build Coastguard Worker ret void 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: adc: 115*9880d681SAndroid Build Coastguard Worker; CHECK: movabsq $-9223372036854775808, %rax 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addq %rdi, %rax 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adcq $0, %rsi 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sete %al 119*9880d681SAndroid Build Coastguard Worker; CHECK: ret 120*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @adc(i128 %x) nounwind { 121*9880d681SAndroid Build Coastguard Worker %add = add i128 %x, 9223372036854775808 122*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i128 %add, 18446744073709551616 123*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sbb: 127*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq %rdx, %rdi 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sbbq %rcx, %rsi 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: setns %al 130*9880d681SAndroid Build Coastguard Worker; CHECK: ret 131*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @sbb(i128 %x, i128 %y) nounwind { 132*9880d681SAndroid Build Coastguard Worker %sub = sub i128 %x, %y 133*9880d681SAndroid Build Coastguard Worker %cmp = icmp sge i128 %sub, 0 134*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: andn: 138*9880d681SAndroid Build Coastguard Worker; CHECK: andnl %esi, %edi, %edi 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 140*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo 141*9880d681SAndroid Build Coastguard Worker; CHECK: ret 142*9880d681SAndroid Build Coastguard Workerdefine void @andn(i32 %x, i32 %y) nounwind { 143*9880d681SAndroid Build Coastguard Worker %not = xor i32 %x, -1 144*9880d681SAndroid Build Coastguard Worker %andn = and i32 %y, %not 145*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %andn, 0 146*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %return, label %bb 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Workerbb: 149*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %andn) 150*9880d681SAndroid Build Coastguard Worker br label %return 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerreturn: 153*9880d681SAndroid Build Coastguard Worker ret void 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bextr: 157*9880d681SAndroid Build Coastguard Worker; CHECK: bextrl %esi, %edi, %edi 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 159*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo 160*9880d681SAndroid Build Coastguard Worker; CHECK: ret 161*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.bmi.bextr.32(i32, i32) nounwind readnone 162*9880d681SAndroid Build Coastguard Workerdefine void @bextr(i32 %x, i32 %y) nounwind { 163*9880d681SAndroid Build Coastguard Worker %bextr = tail call i32 @llvm.x86.bmi.bextr.32(i32 %x, i32 %y) 164*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %bextr, 0 165*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %return, label %bb 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerbb: 168*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %bextr) 169*9880d681SAndroid Build Coastguard Worker br label %return 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerreturn: 172*9880d681SAndroid Build Coastguard Worker ret void 173*9880d681SAndroid Build Coastguard Worker} 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: popcnt: 176*9880d681SAndroid Build Coastguard Worker; CHECK: popcntl 177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 178*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo 179*9880d681SAndroid Build Coastguard Worker; CHECK: ret 180*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.ctpop.i32(i32) nounwind readnone 181*9880d681SAndroid Build Coastguard Workerdefine void @popcnt(i32 %x) nounwind { 182*9880d681SAndroid Build Coastguard Worker %popcnt = tail call i32 @llvm.ctpop.i32(i32 %x) 183*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %popcnt, 0 184*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %return, label %bb 185*9880d681SAndroid Build Coastguard Worker; 186*9880d681SAndroid Build Coastguard Workerbb: 187*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %popcnt) 188*9880d681SAndroid Build Coastguard Worker br label %return 189*9880d681SAndroid Build Coastguard Worker; 190*9880d681SAndroid Build Coastguard Workerreturn: 191*9880d681SAndroid Build Coastguard Worker ret void 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testCTZ 195*9880d681SAndroid Build Coastguard Worker; CHECK: tzcntq 196*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: test 197*9880d681SAndroid Build Coastguard Worker; CHECK: cmovaeq 198*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.cttz.i64(i64, i1) 199*9880d681SAndroid Build Coastguard Workerdefine i64 @testCTZ(i64 %v) nounwind { 200*9880d681SAndroid Build Coastguard Worker %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true) 201*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i64 %v, 0 202*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 255, i64 %cnt 203*9880d681SAndroid Build Coastguard Worker ret i64 %cond 204*9880d681SAndroid Build Coastguard Worker} 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testCTZ2 207*9880d681SAndroid Build Coastguard Worker; CHECK: tzcntl 208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jb 209*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo 210*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.cttz.i32(i32, i1) 211*9880d681SAndroid Build Coastguard Workerdefine void @testCTZ2(i32 %v) nounwind { 212*9880d681SAndroid Build Coastguard Worker %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true) 213*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %v, 0 214*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %return, label %bb 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerbb: 217*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %cnt) 218*9880d681SAndroid Build Coastguard Worker br label %return 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Workerreturn: 221*9880d681SAndroid Build Coastguard Worker tail call void @foo32(i32 %cnt) 222*9880d681SAndroid Build Coastguard Worker ret void 223*9880d681SAndroid Build Coastguard Worker} 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testCTZ3 226*9880d681SAndroid Build Coastguard Worker; CHECK: tzcntl 227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jae 228*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo 229*9880d681SAndroid Build Coastguard Workerdefine void @testCTZ3(i32 %v) nounwind { 230*9880d681SAndroid Build Coastguard Worker %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true) 231*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %v, 0 232*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %return, label %bb 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Workerbb: 235*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %cnt) 236*9880d681SAndroid Build Coastguard Worker br label %return 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Workerreturn: 239*9880d681SAndroid Build Coastguard Worker tail call void @foo32(i32 %cnt) 240*9880d681SAndroid Build Coastguard Worker ret void 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testCLZ 244*9880d681SAndroid Build Coastguard Worker; CHECK: lzcntq 245*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: test 246*9880d681SAndroid Build Coastguard Worker; CHECK: cmovaeq 247*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.ctlz.i64(i64, i1) 248*9880d681SAndroid Build Coastguard Workerdefine i64 @testCLZ(i64 %v) nounwind { 249*9880d681SAndroid Build Coastguard Worker %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true) 250*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i64 %v, 0 251*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 %cnt, i64 255 252*9880d681SAndroid Build Coastguard Worker ret i64 %cond 253*9880d681SAndroid Build Coastguard Worker} 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testPOPCNT 256*9880d681SAndroid Build Coastguard Worker; CHECK: popcntq 257*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: test 258*9880d681SAndroid Build Coastguard Worker; CHECK: cmovneq 259*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.ctpop.i64(i64) 260*9880d681SAndroid Build Coastguard Workerdefine i64 @testPOPCNT(i64 %v) nounwind { 261*9880d681SAndroid Build Coastguard Worker %cnt = tail call i64 @llvm.ctpop.i64(i64 %v) 262*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i64 %v, 0 263*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i64 %cnt, i64 255 264*9880d681SAndroid Build Coastguard Worker ret i64 %cond 265*9880d681SAndroid Build Coastguard Worker} 266