1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi,+bmi2 | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i8 @llvm.cttz.i8(i8, i1) 5*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.cttz.i16(i16, i1) 6*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.cttz.i32(i32, i1) 7*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.cttz.i64(i64, i1) 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine i8 @t1(i8 %x) { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t1: 11*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movzbl %dil, %eax 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl $256, %eax # imm = 0x100 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tzcntl %eax, %eax 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 17*9880d681SAndroid Build Coastguard Worker %tmp = tail call i8 @llvm.cttz.i8( i8 %x, i1 false ) 18*9880d681SAndroid Build Coastguard Worker ret i8 %tmp 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine i16 @t2(i16 %x) { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t2: 23*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tzcntw %di, %ax 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 26*9880d681SAndroid Build Coastguard Worker %tmp = tail call i16 @llvm.cttz.i16( i16 %x, i1 false ) 27*9880d681SAndroid Build Coastguard Worker ret i16 %tmp 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine i32 @t3(i32 %x) { 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t3: 32*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tzcntl %edi, %eax 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 35*9880d681SAndroid Build Coastguard Worker %tmp = tail call i32 @llvm.cttz.i32( i32 %x, i1 false ) 36*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine i32 @tzcnt32_load(i32* %x) { 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: tzcnt32_load: 41*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tzcntl (%rdi), %eax 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 44*9880d681SAndroid Build Coastguard Worker %x1 = load i32, i32* %x 45*9880d681SAndroid Build Coastguard Worker %tmp = tail call i32 @llvm.cttz.i32(i32 %x1, i1 false ) 46*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdefine i64 @t4(i64 %x) { 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t4: 51*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tzcntq %rdi, %rax 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 54*9880d681SAndroid Build Coastguard Worker %tmp = tail call i64 @llvm.cttz.i64( i64 %x, i1 false ) 55*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdefine i8 @t5(i8 %x) { 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t5: 60*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movzbl %dil, %eax 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tzcntl %eax, %eax 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 65*9880d681SAndroid Build Coastguard Worker %tmp = tail call i8 @llvm.cttz.i8( i8 %x, i1 true ) 66*9880d681SAndroid Build Coastguard Worker ret i8 %tmp 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerdefine i16 @t6(i16 %x) { 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t6: 71*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tzcntw %di, %ax 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 74*9880d681SAndroid Build Coastguard Worker %tmp = tail call i16 @llvm.cttz.i16( i16 %x, i1 true ) 75*9880d681SAndroid Build Coastguard Worker ret i16 %tmp 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine i32 @t7(i32 %x) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t7: 80*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tzcntl %edi, %eax 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 83*9880d681SAndroid Build Coastguard Worker %tmp = tail call i32 @llvm.cttz.i32( i32 %x, i1 true ) 84*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine i64 @t8(i64 %x) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t8: 89*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tzcntq %rdi, %rax 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 92*9880d681SAndroid Build Coastguard Worker %tmp = tail call i64 @llvm.cttz.i64( i64 %x, i1 true ) 93*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerdefine i32 @andn32(i32 %x, i32 %y) { 97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: andn32: 98*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnl %esi, %edi, %eax 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 101*9880d681SAndroid Build Coastguard Worker %tmp1 = xor i32 %x, -1 102*9880d681SAndroid Build Coastguard Worker %tmp2 = and i32 %y, %tmp1 103*9880d681SAndroid Build Coastguard Worker ret i32 %tmp2 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefine i32 @andn32_load(i32 %x, i32* %y) { 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: andn32_load: 108*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnl (%rsi), %edi, %eax 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 111*9880d681SAndroid Build Coastguard Worker %y1 = load i32, i32* %y 112*9880d681SAndroid Build Coastguard Worker %tmp1 = xor i32 %x, -1 113*9880d681SAndroid Build Coastguard Worker %tmp2 = and i32 %y1, %tmp1 114*9880d681SAndroid Build Coastguard Worker ret i32 %tmp2 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine i64 @andn64(i64 %x, i64 %y) { 118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: andn64: 119*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnq %rsi, %rdi, %rax 121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 122*9880d681SAndroid Build Coastguard Worker %tmp1 = xor i64 %x, -1 123*9880d681SAndroid Build Coastguard Worker %tmp2 = and i64 %tmp1, %y 124*9880d681SAndroid Build Coastguard Worker ret i64 %tmp2 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker; Don't choose a 'test' if an 'andn' can be used. 128*9880d681SAndroid Build Coastguard Workerdefine i1 @andn_cmp(i32 %x, i32 %y) { 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: andn_cmp: 130*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnl %esi, %edi, %eax 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sete %al 133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 134*9880d681SAndroid Build Coastguard Worker %notx = xor i32 %x, -1 135*9880d681SAndroid Build Coastguard Worker %and = and i32 %notx, %y 136*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 137*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker; Recognize a disguised andn in the following 4 tests. 141*9880d681SAndroid Build Coastguard Workerdefine i1 @and_cmp1(i32 %x, i32 %y) { 142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_cmp1: 143*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnl %esi, %edi, %eax 145*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sete %al 146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 147*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, %y 148*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, %y 149*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerdefine i1 @and_cmp2(i32 %x, i32 %y) { 153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_cmp2: 154*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnl %esi, %edi, %eax 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: setne %al 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 158*9880d681SAndroid Build Coastguard Worker %and = and i32 %y, %x 159*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %and, %y 160*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerdefine i1 @and_cmp3(i32 %x, i32 %y) { 164*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_cmp3: 165*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnl %esi, %edi, %eax 167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sete %al 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 169*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, %y 170*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %y, %and 171*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 172*9880d681SAndroid Build Coastguard Worker} 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Workerdefine i1 @and_cmp4(i32 %x, i32 %y) { 175*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_cmp4: 176*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnl %esi, %edi, %eax 178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: setne %al 179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 180*9880d681SAndroid Build Coastguard Worker %and = and i32 %y, %x 181*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %y, %and 182*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker; A mask and compare against constant is ok for an 'andn' too 186*9880d681SAndroid Build Coastguard Worker; even though the BMI instruction doesn't have an immediate form. 187*9880d681SAndroid Build Coastguard Workerdefine i1 @and_cmp_const(i32 %x) { 188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_cmp_const: 189*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl $43, %eax 191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnl %eax, %edi, %eax 192*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sete %al 193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 194*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 43 195*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 43 196*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 197*9880d681SAndroid Build Coastguard Worker} 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Worker; But don't use 'andn' if the mask is a power-of-two. 200*9880d681SAndroid Build Coastguard Workerdefine i1 @and_cmp_const_power_of_two(i32 %x, i32 %y) { 201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_cmp_const_power_of_two: 202*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: btl %esi, %edi 204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: setae %al 205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 206*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %y 207*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, %shl 208*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %and, %shl 209*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 210*9880d681SAndroid Build Coastguard Worker} 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Worker; Don't transform to 'andn' if there's another use of the 'and'. 213*9880d681SAndroid Build Coastguard Workerdefine i32 @and_cmp_not_one_use(i32 %x) { 214*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_cmp_not_one_use: 215*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 216*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $37, %edi 217*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorl %eax, %eax 218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmpl $37, %edi 219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sete %al 220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addl %edi, %eax 221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 222*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 37 223*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 37 224*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %cmp to i32 225*9880d681SAndroid Build Coastguard Worker %add = add i32 %and, %ext 226*9880d681SAndroid Build Coastguard Worker ret i32 %add 227*9880d681SAndroid Build Coastguard Worker} 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Worker; Verify that we're not transforming invalid comparison predicates. 230*9880d681SAndroid Build Coastguard Workerdefine i1 @not_an_andn1(i32 %x, i32 %y) { 231*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: not_an_andn1: 232*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl %esi, %edi 234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmpl %edi, %esi 235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: setg %al 236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 237*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, %y 238*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %y, %and 239*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 240*9880d681SAndroid Build Coastguard Worker} 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Workerdefine i1 @not_an_andn2(i32 %x, i32 %y) { 243*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: not_an_andn2: 244*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl %esi, %edi 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmpl %edi, %esi 247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: setbe %al 248*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 249*9880d681SAndroid Build Coastguard Worker %and = and i32 %y, %x 250*9880d681SAndroid Build Coastguard Worker %cmp = icmp ule i32 %y, %and 251*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 252*9880d681SAndroid Build Coastguard Worker} 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker; Don't choose a 'test' if an 'andn' can be used. 255*9880d681SAndroid Build Coastguard Workerdefine i1 @andn_cmp_swap_ops(i64 %x, i64 %y) { 256*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: andn_cmp_swap_ops: 257*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnq %rsi, %rdi, %rax 259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sete %al 260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 261*9880d681SAndroid Build Coastguard Worker %notx = xor i64 %x, -1 262*9880d681SAndroid Build Coastguard Worker %and = and i64 %y, %notx 263*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %and, 0 264*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 265*9880d681SAndroid Build Coastguard Worker} 266*9880d681SAndroid Build Coastguard Worker 267*9880d681SAndroid Build Coastguard Worker; Use a 'test' (not an 'and') because 'andn' only works for i32/i64. 268*9880d681SAndroid Build Coastguard Workerdefine i1 @andn_cmp_i8(i8 %x, i8 %y) { 269*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: andn_cmp_i8: 270*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: notb %sil 272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: testb %sil, %dil 273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sete %al 274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 275*9880d681SAndroid Build Coastguard Worker %noty = xor i8 %y, -1 276*9880d681SAndroid Build Coastguard Worker %and = and i8 %x, %noty 277*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %and, 0 278*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 279*9880d681SAndroid Build Coastguard Worker} 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Workerdefine i32 @bextr32(i32 %x, i32 %y) { 282*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bextr32: 283*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 284*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bextrl %esi, %edi, %eax 285*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 286*9880d681SAndroid Build Coastguard Worker %tmp = tail call i32 @llvm.x86.bmi.bextr.32(i32 %x, i32 %y) 287*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 288*9880d681SAndroid Build Coastguard Worker} 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Workerdefine i32 @bextr32_load(i32* %x, i32 %y) { 291*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bextr32_load: 292*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bextrl %esi, (%rdi), %eax 294*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 295*9880d681SAndroid Build Coastguard Worker %x1 = load i32, i32* %x 296*9880d681SAndroid Build Coastguard Worker %tmp = tail call i32 @llvm.x86.bmi.bextr.32(i32 %x1, i32 %y) 297*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 298*9880d681SAndroid Build Coastguard Worker} 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.bmi.bextr.32(i32, i32) 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Workerdefine i32 @bextr32b(i32 %x) uwtable ssp { 303*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bextr32b: 304*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 305*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl $3076, %eax # imm = 0xC04 306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bextrl %eax, %edi, %eax 307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 308*9880d681SAndroid Build Coastguard Worker %1 = lshr i32 %x, 4 309*9880d681SAndroid Build Coastguard Worker %2 = and i32 %1, 4095 310*9880d681SAndroid Build Coastguard Worker ret i32 %2 311*9880d681SAndroid Build Coastguard Worker} 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Workerdefine i32 @bextr32b_load(i32* %x) uwtable ssp { 314*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bextr32b_load: 315*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 316*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl $3076, %eax # imm = 0xC04 317*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bextrl %eax, (%rdi), %eax 318*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 319*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %x 320*9880d681SAndroid Build Coastguard Worker %2 = lshr i32 %1, 4 321*9880d681SAndroid Build Coastguard Worker %3 = and i32 %2, 4095 322*9880d681SAndroid Build Coastguard Worker ret i32 %3 323*9880d681SAndroid Build Coastguard Worker} 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Workerdefine i64 @bextr64(i64 %x, i64 %y) { 326*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bextr64: 327*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 328*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bextrq %rsi, %rdi, %rax 329*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 330*9880d681SAndroid Build Coastguard Worker %tmp = tail call i64 @llvm.x86.bmi.bextr.64(i64 %x, i64 %y) 331*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 332*9880d681SAndroid Build Coastguard Worker} 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.x86.bmi.bextr.64(i64, i64) 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Workerdefine i64 @bextr64b(i64 %x) uwtable ssp { 337*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bextr64b: 338*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 339*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl $3076, %eax # imm = 0xC04 340*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bextrl %eax, %edi, %eax 341*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 342*9880d681SAndroid Build Coastguard Worker %1 = lshr i64 %x, 4 343*9880d681SAndroid Build Coastguard Worker %2 = and i64 %1, 4095 344*9880d681SAndroid Build Coastguard Worker ret i64 %2 345*9880d681SAndroid Build Coastguard Worker} 346*9880d681SAndroid Build Coastguard Worker 347*9880d681SAndroid Build Coastguard Workerdefine i64 @bextr64b_load(i64* %x) { 348*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bextr64b_load: 349*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 350*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl $3076, %eax # imm = 0xC04 351*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bextrl %eax, (%rdi), %eax 352*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 353*9880d681SAndroid Build Coastguard Worker %1 = load i64, i64* %x, align 8 354*9880d681SAndroid Build Coastguard Worker %2 = lshr i64 %1, 4 355*9880d681SAndroid Build Coastguard Worker %3 = and i64 %2, 4095 356*9880d681SAndroid Build Coastguard Worker ret i64 %3 357*9880d681SAndroid Build Coastguard Worker} 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Workerdefine i32 @non_bextr32(i32 %x) { 360*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: non_bextr32: 361*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: # %entry 362*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $2, %edi 363*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $111, %edi 364*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edi, %eax 365*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 366*9880d681SAndroid Build Coastguard Workerentry: 367*9880d681SAndroid Build Coastguard Worker %shr = lshr i32 %x, 2 368*9880d681SAndroid Build Coastguard Worker %and = and i32 %shr, 111 369*9880d681SAndroid Build Coastguard Worker ret i32 %and 370*9880d681SAndroid Build Coastguard Worker} 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard Workerdefine i64 @non_bextr64(i64 %x) { 373*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: non_bextr64: 374*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: # %entry 375*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrq $2, %rdi 376*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movabsq $8589934590, %rax # imm = 0x1FFFFFFFE 377*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andq %rdi, %rax 378*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 379*9880d681SAndroid Build Coastguard Workerentry: 380*9880d681SAndroid Build Coastguard Worker %shr = lshr i64 %x, 2 381*9880d681SAndroid Build Coastguard Worker %and = and i64 %shr, 8589934590 382*9880d681SAndroid Build Coastguard Worker ret i64 %and 383*9880d681SAndroid Build Coastguard Worker} 384*9880d681SAndroid Build Coastguard Worker 385*9880d681SAndroid Build Coastguard Workerdefine i32 @bzhi32(i32 %x, i32 %y) { 386*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bzhi32: 387*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 388*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bzhil %esi, %edi, %eax 389*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 390*9880d681SAndroid Build Coastguard Worker %tmp = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %x, i32 %y) 391*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 392*9880d681SAndroid Build Coastguard Worker} 393*9880d681SAndroid Build Coastguard Worker 394*9880d681SAndroid Build Coastguard Workerdefine i32 @bzhi32_load(i32* %x, i32 %y) { 395*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bzhi32_load: 396*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 397*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bzhil %esi, (%rdi), %eax 398*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 399*9880d681SAndroid Build Coastguard Worker %x1 = load i32, i32* %x 400*9880d681SAndroid Build Coastguard Worker %tmp = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %x1, i32 %y) 401*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 402*9880d681SAndroid Build Coastguard Worker} 403*9880d681SAndroid Build Coastguard Worker 404*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.bmi.bzhi.32(i32, i32) 405*9880d681SAndroid Build Coastguard Worker 406*9880d681SAndroid Build Coastguard Workerdefine i64 @bzhi64(i64 %x, i64 %y) { 407*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bzhi64: 408*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 409*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bzhiq %rsi, %rdi, %rax 410*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 411*9880d681SAndroid Build Coastguard Worker %tmp = tail call i64 @llvm.x86.bmi.bzhi.64(i64 %x, i64 %y) 412*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 413*9880d681SAndroid Build Coastguard Worker} 414*9880d681SAndroid Build Coastguard Worker 415*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.x86.bmi.bzhi.64(i64, i64) 416*9880d681SAndroid Build Coastguard Worker 417*9880d681SAndroid Build Coastguard Workerdefine i32 @bzhi32b(i32 %x, i8 zeroext %index) { 418*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bzhi32b: 419*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: # %entry 420*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bzhil %esi, %edi, %eax 421*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 422*9880d681SAndroid Build Coastguard Workerentry: 423*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %index to i32 424*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %conv 425*9880d681SAndroid Build Coastguard Worker %sub = add nsw i32 %shl, -1 426*9880d681SAndroid Build Coastguard Worker %and = and i32 %sub, %x 427*9880d681SAndroid Build Coastguard Worker ret i32 %and 428*9880d681SAndroid Build Coastguard Worker} 429*9880d681SAndroid Build Coastguard Worker 430*9880d681SAndroid Build Coastguard Workerdefine i32 @bzhi32b_load(i32* %w, i8 zeroext %index) { 431*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bzhi32b_load: 432*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: # %entry 433*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bzhil %esi, (%rdi), %eax 434*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 435*9880d681SAndroid Build Coastguard Workerentry: 436*9880d681SAndroid Build Coastguard Worker %x = load i32, i32* %w 437*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %index to i32 438*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %conv 439*9880d681SAndroid Build Coastguard Worker %sub = add nsw i32 %shl, -1 440*9880d681SAndroid Build Coastguard Worker %and = and i32 %sub, %x 441*9880d681SAndroid Build Coastguard Worker ret i32 %and 442*9880d681SAndroid Build Coastguard Worker} 443*9880d681SAndroid Build Coastguard Worker 444*9880d681SAndroid Build Coastguard Workerdefine i32 @bzhi32c(i32 %x, i8 zeroext %index) { 445*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bzhi32c: 446*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: # %entry 447*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bzhil %esi, %edi, %eax 448*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 449*9880d681SAndroid Build Coastguard Workerentry: 450*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %index to i32 451*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %conv 452*9880d681SAndroid Build Coastguard Worker %sub = add nsw i32 %shl, -1 453*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, %sub 454*9880d681SAndroid Build Coastguard Worker ret i32 %and 455*9880d681SAndroid Build Coastguard Worker} 456*9880d681SAndroid Build Coastguard Worker 457*9880d681SAndroid Build Coastguard Workerdefine i64 @bzhi64b(i64 %x, i8 zeroext %index) { 458*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bzhi64b: 459*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: # %entry 460*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: # kill: %ESI<def> %ESI<kill> %RSI<def> 461*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bzhiq %rsi, %rdi, %rax 462*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 463*9880d681SAndroid Build Coastguard Workerentry: 464*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %index to i64 465*9880d681SAndroid Build Coastguard Worker %shl = shl i64 1, %conv 466*9880d681SAndroid Build Coastguard Worker %sub = add nsw i64 %shl, -1 467*9880d681SAndroid Build Coastguard Worker %and = and i64 %x, %sub 468*9880d681SAndroid Build Coastguard Worker ret i64 %and 469*9880d681SAndroid Build Coastguard Worker} 470*9880d681SAndroid Build Coastguard Worker 471*9880d681SAndroid Build Coastguard Workerdefine i64 @bzhi64_constant_mask(i64 %x) { 472*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bzhi64_constant_mask: 473*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: # %entry 474*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movb $62, %al 475*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bzhiq %rax, %rdi, %rax 476*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 477*9880d681SAndroid Build Coastguard Workerentry: 478*9880d681SAndroid Build Coastguard Worker %and = and i64 %x, 4611686018427387903 479*9880d681SAndroid Build Coastguard Worker ret i64 %and 480*9880d681SAndroid Build Coastguard Worker} 481*9880d681SAndroid Build Coastguard Worker 482*9880d681SAndroid Build Coastguard Workerdefine i64 @bzhi64_small_constant_mask(i64 %x) { 483*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bzhi64_small_constant_mask: 484*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: # %entry 485*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $2147483647, %edi # imm = 0x7FFFFFFF 486*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movq %rdi, %rax 487*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 488*9880d681SAndroid Build Coastguard Workerentry: 489*9880d681SAndroid Build Coastguard Worker %and = and i64 %x, 2147483647 490*9880d681SAndroid Build Coastguard Worker ret i64 %and 491*9880d681SAndroid Build Coastguard Worker} 492*9880d681SAndroid Build Coastguard Worker 493*9880d681SAndroid Build Coastguard Workerdefine i32 @blsi32(i32 %x) { 494*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: blsi32: 495*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 496*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blsil %edi, %eax 497*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 498*9880d681SAndroid Build Coastguard Worker %tmp = sub i32 0, %x 499*9880d681SAndroid Build Coastguard Worker %tmp2 = and i32 %x, %tmp 500*9880d681SAndroid Build Coastguard Worker ret i32 %tmp2 501*9880d681SAndroid Build Coastguard Worker} 502*9880d681SAndroid Build Coastguard Worker 503*9880d681SAndroid Build Coastguard Workerdefine i32 @blsi32_load(i32* %x) { 504*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: blsi32_load: 505*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 506*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blsil (%rdi), %eax 507*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 508*9880d681SAndroid Build Coastguard Worker %x1 = load i32, i32* %x 509*9880d681SAndroid Build Coastguard Worker %tmp = sub i32 0, %x1 510*9880d681SAndroid Build Coastguard Worker %tmp2 = and i32 %x1, %tmp 511*9880d681SAndroid Build Coastguard Worker ret i32 %tmp2 512*9880d681SAndroid Build Coastguard Worker} 513*9880d681SAndroid Build Coastguard Worker 514*9880d681SAndroid Build Coastguard Workerdefine i64 @blsi64(i64 %x) { 515*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: blsi64: 516*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 517*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blsiq %rdi, %rax 518*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 519*9880d681SAndroid Build Coastguard Worker %tmp = sub i64 0, %x 520*9880d681SAndroid Build Coastguard Worker %tmp2 = and i64 %tmp, %x 521*9880d681SAndroid Build Coastguard Worker ret i64 %tmp2 522*9880d681SAndroid Build Coastguard Worker} 523*9880d681SAndroid Build Coastguard Worker 524*9880d681SAndroid Build Coastguard Workerdefine i32 @blsmsk32(i32 %x) { 525*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: blsmsk32: 526*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 527*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blsmskl %edi, %eax 528*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 529*9880d681SAndroid Build Coastguard Worker %tmp = sub i32 %x, 1 530*9880d681SAndroid Build Coastguard Worker %tmp2 = xor i32 %x, %tmp 531*9880d681SAndroid Build Coastguard Worker ret i32 %tmp2 532*9880d681SAndroid Build Coastguard Worker} 533*9880d681SAndroid Build Coastguard Worker 534*9880d681SAndroid Build Coastguard Workerdefine i32 @blsmsk32_load(i32* %x) { 535*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: blsmsk32_load: 536*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 537*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blsmskl (%rdi), %eax 538*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 539*9880d681SAndroid Build Coastguard Worker %x1 = load i32, i32* %x 540*9880d681SAndroid Build Coastguard Worker %tmp = sub i32 %x1, 1 541*9880d681SAndroid Build Coastguard Worker %tmp2 = xor i32 %x1, %tmp 542*9880d681SAndroid Build Coastguard Worker ret i32 %tmp2 543*9880d681SAndroid Build Coastguard Worker} 544*9880d681SAndroid Build Coastguard Worker 545*9880d681SAndroid Build Coastguard Workerdefine i64 @blsmsk64(i64 %x) { 546*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: blsmsk64: 547*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 548*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blsmskq %rdi, %rax 549*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 550*9880d681SAndroid Build Coastguard Worker %tmp = sub i64 %x, 1 551*9880d681SAndroid Build Coastguard Worker %tmp2 = xor i64 %tmp, %x 552*9880d681SAndroid Build Coastguard Worker ret i64 %tmp2 553*9880d681SAndroid Build Coastguard Worker} 554*9880d681SAndroid Build Coastguard Worker 555*9880d681SAndroid Build Coastguard Workerdefine i32 @blsr32(i32 %x) { 556*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: blsr32: 557*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 558*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blsrl %edi, %eax 559*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 560*9880d681SAndroid Build Coastguard Worker %tmp = sub i32 %x, 1 561*9880d681SAndroid Build Coastguard Worker %tmp2 = and i32 %x, %tmp 562*9880d681SAndroid Build Coastguard Worker ret i32 %tmp2 563*9880d681SAndroid Build Coastguard Worker} 564*9880d681SAndroid Build Coastguard Worker 565*9880d681SAndroid Build Coastguard Workerdefine i32 @blsr32_load(i32* %x) { 566*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: blsr32_load: 567*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 568*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blsrl (%rdi), %eax 569*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 570*9880d681SAndroid Build Coastguard Worker %x1 = load i32, i32* %x 571*9880d681SAndroid Build Coastguard Worker %tmp = sub i32 %x1, 1 572*9880d681SAndroid Build Coastguard Worker %tmp2 = and i32 %x1, %tmp 573*9880d681SAndroid Build Coastguard Worker ret i32 %tmp2 574*9880d681SAndroid Build Coastguard Worker} 575*9880d681SAndroid Build Coastguard Worker 576*9880d681SAndroid Build Coastguard Workerdefine i64 @blsr64(i64 %x) { 577*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: blsr64: 578*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 579*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blsrq %rdi, %rax 580*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 581*9880d681SAndroid Build Coastguard Worker %tmp = sub i64 %x, 1 582*9880d681SAndroid Build Coastguard Worker %tmp2 = and i64 %tmp, %x 583*9880d681SAndroid Build Coastguard Worker ret i64 %tmp2 584*9880d681SAndroid Build Coastguard Worker} 585*9880d681SAndroid Build Coastguard Worker 586*9880d681SAndroid Build Coastguard Workerdefine i32 @pdep32(i32 %x, i32 %y) { 587*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pdep32: 588*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 589*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pdepl %esi, %edi, %eax 590*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 591*9880d681SAndroid Build Coastguard Worker %tmp = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 %y) 592*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 593*9880d681SAndroid Build Coastguard Worker} 594*9880d681SAndroid Build Coastguard Worker 595*9880d681SAndroid Build Coastguard Workerdefine i32 @pdep32_load(i32 %x, i32* %y) { 596*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pdep32_load: 597*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 598*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pdepl (%rsi), %edi, %eax 599*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 600*9880d681SAndroid Build Coastguard Worker %y1 = load i32, i32* %y 601*9880d681SAndroid Build Coastguard Worker %tmp = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 %y1) 602*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 603*9880d681SAndroid Build Coastguard Worker} 604*9880d681SAndroid Build Coastguard Worker 605*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.bmi.pdep.32(i32, i32) 606*9880d681SAndroid Build Coastguard Worker 607*9880d681SAndroid Build Coastguard Workerdefine i64 @pdep64(i64 %x, i64 %y) { 608*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pdep64: 609*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 610*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pdepq %rsi, %rdi, %rax 611*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 612*9880d681SAndroid Build Coastguard Worker %tmp = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 %y) 613*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 614*9880d681SAndroid Build Coastguard Worker} 615*9880d681SAndroid Build Coastguard Worker 616*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.x86.bmi.pdep.64(i64, i64) 617*9880d681SAndroid Build Coastguard Worker 618*9880d681SAndroid Build Coastguard Workerdefine i32 @pext32(i32 %x, i32 %y) { 619*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pext32: 620*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 621*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pextl %esi, %edi, %eax 622*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 623*9880d681SAndroid Build Coastguard Worker %tmp = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 %y) 624*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 625*9880d681SAndroid Build Coastguard Worker} 626*9880d681SAndroid Build Coastguard Worker 627*9880d681SAndroid Build Coastguard Workerdefine i32 @pext32_load(i32 %x, i32* %y) { 628*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pext32_load: 629*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 630*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pextl (%rsi), %edi, %eax 631*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 632*9880d681SAndroid Build Coastguard Worker %y1 = load i32, i32* %y 633*9880d681SAndroid Build Coastguard Worker %tmp = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 %y1) 634*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 635*9880d681SAndroid Build Coastguard Worker} 636*9880d681SAndroid Build Coastguard Worker 637*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.bmi.pext.32(i32, i32) 638*9880d681SAndroid Build Coastguard Worker 639*9880d681SAndroid Build Coastguard Workerdefine i64 @pext64(i64 %x, i64 %y) { 640*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pext64: 641*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 642*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pextq %rsi, %rdi, %rax 643*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 644*9880d681SAndroid Build Coastguard Worker %tmp = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 %y) 645*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 646*9880d681SAndroid Build Coastguard Worker} 647*9880d681SAndroid Build Coastguard Worker 648*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.x86.bmi.pext.64(i64, i64) 649*9880d681SAndroid Build Coastguard Worker 650