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 -fast-isel -mtriple=i686-unknown-unknown -mattr=+bmi | FileCheck %s --check-prefix=X32 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -fast-isel -mtriple=x86_64-unknown-unknown -mattr=+bmi | FileCheck %s --check-prefix=X64 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; NOTE: This should use IR equivalent to what is generated by clang/test/CodeGen/bmi-builtins.c 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; 8*9880d681SAndroid Build Coastguard Worker; AMD Intrinsics 9*9880d681SAndroid Build Coastguard Worker; 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine i16 @test__tzcnt_u16(i16 %a0) { 12*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__tzcnt_u16: 13*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 14*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 15*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movzwl %ax, %ecx 16*9880d681SAndroid Build Coastguard Worker; X32-NEXT: cmpl $0, %ecx 17*9880d681SAndroid Build Coastguard Worker; X32-NEXT: jne .LBB0_1 18*9880d681SAndroid Build Coastguard Worker; X32-NEXT: # BB#2: 19*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movw $16, %ax 20*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 21*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .LBB0_1: 22*9880d681SAndroid Build Coastguard Worker; X32-NEXT: tzcntw %ax, %ax 23*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 24*9880d681SAndroid Build Coastguard Worker; 25*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__tzcnt_u16: 26*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 27*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movw $16, %cx 28*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movzwl %di, %edx 29*9880d681SAndroid Build Coastguard Worker; X64-NEXT: tzcntw %dx, %ax 30*9880d681SAndroid Build Coastguard Worker; X64-NEXT: cmpl $0, %edx 31*9880d681SAndroid Build Coastguard Worker; X64-NEXT: cmovew %cx, %ax 32*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 33*9880d681SAndroid Build Coastguard Worker %zext = zext i16 %a0 to i32 34*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %zext, 0 35*9880d681SAndroid Build Coastguard Worker %cttz = call i16 @llvm.cttz.i16(i16 %a0, i1 true) 36*9880d681SAndroid Build Coastguard Worker %res = select i1 %cmp, i16 %cttz, i16 16 37*9880d681SAndroid Build Coastguard Worker ret i16 %res 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine i32 @test__andn_u32(i32 %a0, i32 %a1) { 41*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__andn_u32: 42*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 43*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 44*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl $-1, %eax 45*9880d681SAndroid Build Coastguard Worker; X32-NEXT: andl {{[0-9]+}}(%esp), %eax 46*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 47*9880d681SAndroid Build Coastguard Worker; 48*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__andn_u32: 49*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 50*9880d681SAndroid Build Coastguard Worker; X64-NEXT: xorl $-1, %edi 51*9880d681SAndroid Build Coastguard Worker; X64-NEXT: andl %esi, %edi 52*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 53*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 54*9880d681SAndroid Build Coastguard Worker %xor = xor i32 %a0, -1 55*9880d681SAndroid Build Coastguard Worker %res = and i32 %xor, %a1 56*9880d681SAndroid Build Coastguard Worker ret i32 %res 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine i32 @test__bextr_u32(i32 %a0, i32 %a1) { 60*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__bextr_u32: 61*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 62*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 63*9880d681SAndroid Build Coastguard Worker; X32-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax 64*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 65*9880d681SAndroid Build Coastguard Worker; 66*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__bextr_u32: 67*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 68*9880d681SAndroid Build Coastguard Worker; X64-NEXT: bextrl %esi, %edi, %eax 69*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 70*9880d681SAndroid Build Coastguard Worker %res = call i32 @llvm.x86.bmi.bextr.32(i32 %a0, i32 %a1) 71*9880d681SAndroid Build Coastguard Worker ret i32 %res 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine i32 @test__blsi_u32(i32 %a0) { 75*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__blsi_u32: 76*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 77*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 78*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl %eax, %eax 79*9880d681SAndroid Build Coastguard Worker; X32-NEXT: subl %ecx, %eax 80*9880d681SAndroid Build Coastguard Worker; X32-NEXT: andl %ecx, %eax 81*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 82*9880d681SAndroid Build Coastguard Worker; 83*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__blsi_u32: 84*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 85*9880d681SAndroid Build Coastguard Worker; X64-NEXT: xorl %eax, %eax 86*9880d681SAndroid Build Coastguard Worker; X64-NEXT: subl %edi, %eax 87*9880d681SAndroid Build Coastguard Worker; X64-NEXT: andl %edi, %eax 88*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 89*9880d681SAndroid Build Coastguard Worker %neg = sub i32 0, %a0 90*9880d681SAndroid Build Coastguard Worker %res = and i32 %a0, %neg 91*9880d681SAndroid Build Coastguard Worker ret i32 %res 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerdefine i32 @test__blsmsk_u32(i32 %a0) { 95*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__blsmsk_u32: 96*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 97*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 98*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl %ecx, %eax 99*9880d681SAndroid Build Coastguard Worker; X32-NEXT: subl $1, %eax 100*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl %ecx, %eax 101*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 102*9880d681SAndroid Build Coastguard Worker; 103*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__blsmsk_u32: 104*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 105*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 106*9880d681SAndroid Build Coastguard Worker; X64-NEXT: subl $1, %eax 107*9880d681SAndroid Build Coastguard Worker; X64-NEXT: xorl %edi, %eax 108*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 109*9880d681SAndroid Build Coastguard Worker %dec = sub i32 %a0, 1 110*9880d681SAndroid Build Coastguard Worker %res = xor i32 %a0, %dec 111*9880d681SAndroid Build Coastguard Worker ret i32 %res 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefine i32 @test__blsr_u32(i32 %a0) { 115*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__blsr_u32: 116*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 117*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 118*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl %ecx, %eax 119*9880d681SAndroid Build Coastguard Worker; X32-NEXT: subl $1, %eax 120*9880d681SAndroid Build Coastguard Worker; X32-NEXT: andl %ecx, %eax 121*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 122*9880d681SAndroid Build Coastguard Worker; 123*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__blsr_u32: 124*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 125*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 126*9880d681SAndroid Build Coastguard Worker; X64-NEXT: subl $1, %eax 127*9880d681SAndroid Build Coastguard Worker; X64-NEXT: andl %edi, %eax 128*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 129*9880d681SAndroid Build Coastguard Worker %dec = sub i32 %a0, 1 130*9880d681SAndroid Build Coastguard Worker %res = and i32 %a0, %dec 131*9880d681SAndroid Build Coastguard Worker ret i32 %res 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine i32 @test__tzcnt_u32(i32 %a0) { 135*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__tzcnt_u32: 136*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 137*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 138*9880d681SAndroid Build Coastguard Worker; X32-NEXT: cmpl $0, %eax 139*9880d681SAndroid Build Coastguard Worker; X32-NEXT: jne .LBB6_1 140*9880d681SAndroid Build Coastguard Worker; X32-NEXT: # BB#2: 141*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl $32, %eax 142*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 143*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .LBB6_1: 144*9880d681SAndroid Build Coastguard Worker; X32-NEXT: tzcntl %eax, %eax 145*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 146*9880d681SAndroid Build Coastguard Worker; 147*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__tzcnt_u32: 148*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 149*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl $32, %ecx 150*9880d681SAndroid Build Coastguard Worker; X64-NEXT: tzcntl %edi, %eax 151*9880d681SAndroid Build Coastguard Worker; X64-NEXT: cmovbl %ecx, %eax 152*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 153*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %a0, 0 154*9880d681SAndroid Build Coastguard Worker %cttz = call i32 @llvm.cttz.i32(i32 %a0, i1 true) 155*9880d681SAndroid Build Coastguard Worker %res = select i1 %cmp, i32 %cttz, i32 32 156*9880d681SAndroid Build Coastguard Worker ret i32 %res 157*9880d681SAndroid Build Coastguard Worker} 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker; 160*9880d681SAndroid Build Coastguard Worker; Intel intrinsics 161*9880d681SAndroid Build Coastguard Worker; 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerdefine i16 @test_tzcnt_u16(i16 %a0) { 164*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_tzcnt_u16: 165*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 166*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 167*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movzwl %ax, %ecx 168*9880d681SAndroid Build Coastguard Worker; X32-NEXT: cmpl $0, %ecx 169*9880d681SAndroid Build Coastguard Worker; X32-NEXT: jne .LBB7_1 170*9880d681SAndroid Build Coastguard Worker; X32-NEXT: # BB#2: 171*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movw $16, %ax 172*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 173*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .LBB7_1: 174*9880d681SAndroid Build Coastguard Worker; X32-NEXT: tzcntw %ax, %ax 175*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 176*9880d681SAndroid Build Coastguard Worker; 177*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_tzcnt_u16: 178*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 179*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movw $16, %cx 180*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movzwl %di, %edx 181*9880d681SAndroid Build Coastguard Worker; X64-NEXT: tzcntw %dx, %ax 182*9880d681SAndroid Build Coastguard Worker; X64-NEXT: cmpl $0, %edx 183*9880d681SAndroid Build Coastguard Worker; X64-NEXT: cmovew %cx, %ax 184*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 185*9880d681SAndroid Build Coastguard Worker %zext = zext i16 %a0 to i32 186*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %zext, 0 187*9880d681SAndroid Build Coastguard Worker %cttz = call i16 @llvm.cttz.i16(i16 %a0, i1 true) 188*9880d681SAndroid Build Coastguard Worker %res = select i1 %cmp, i16 %cttz, i16 16 189*9880d681SAndroid Build Coastguard Worker ret i16 %res 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerdefine i32 @test_andn_u32(i32 %a0, i32 %a1) { 193*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_andn_u32: 194*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 195*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 196*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl $-1, %eax 197*9880d681SAndroid Build Coastguard Worker; X32-NEXT: andl {{[0-9]+}}(%esp), %eax 198*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 199*9880d681SAndroid Build Coastguard Worker; 200*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_andn_u32: 201*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 202*9880d681SAndroid Build Coastguard Worker; X64-NEXT: xorl $-1, %edi 203*9880d681SAndroid Build Coastguard Worker; X64-NEXT: andl %esi, %edi 204*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 205*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 206*9880d681SAndroid Build Coastguard Worker %xor = xor i32 %a0, -1 207*9880d681SAndroid Build Coastguard Worker %res = and i32 %xor, %a1 208*9880d681SAndroid Build Coastguard Worker ret i32 %res 209*9880d681SAndroid Build Coastguard Worker} 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Workerdefine i32 @test_bextr_u32(i32 %a0, i32 %a1, i32 %a2) { 212*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_bextr_u32: 213*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 214*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 215*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 216*9880d681SAndroid Build Coastguard Worker; X32-NEXT: andl $255, %ecx 217*9880d681SAndroid Build Coastguard Worker; X32-NEXT: andl $255, %eax 218*9880d681SAndroid Build Coastguard Worker; X32-NEXT: shll $8, %eax 219*9880d681SAndroid Build Coastguard Worker; X32-NEXT: orl %ecx, %eax 220*9880d681SAndroid Build Coastguard Worker; X32-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax 221*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 222*9880d681SAndroid Build Coastguard Worker; 223*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_bextr_u32: 224*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 225*9880d681SAndroid Build Coastguard Worker; X64-NEXT: andl $255, %esi 226*9880d681SAndroid Build Coastguard Worker; X64-NEXT: andl $255, %edx 227*9880d681SAndroid Build Coastguard Worker; X64-NEXT: shll $8, %edx 228*9880d681SAndroid Build Coastguard Worker; X64-NEXT: orl %esi, %edx 229*9880d681SAndroid Build Coastguard Worker; X64-NEXT: bextrl %edx, %edi, %eax 230*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 231*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %a1, 255 232*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %a2, 255 233*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %and2, 8 234*9880d681SAndroid Build Coastguard Worker %or = or i32 %and1, %shl 235*9880d681SAndroid Build Coastguard Worker %res = call i32 @llvm.x86.bmi.bextr.32(i32 %a0, i32 %or) 236*9880d681SAndroid Build Coastguard Worker ret i32 %res 237*9880d681SAndroid Build Coastguard Worker} 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Workerdefine i32 @test_blsi_u32(i32 %a0) { 240*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_blsi_u32: 241*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 242*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 243*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl %eax, %eax 244*9880d681SAndroid Build Coastguard Worker; X32-NEXT: subl %ecx, %eax 245*9880d681SAndroid Build Coastguard Worker; X32-NEXT: andl %ecx, %eax 246*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 247*9880d681SAndroid Build Coastguard Worker; 248*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_blsi_u32: 249*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 250*9880d681SAndroid Build Coastguard Worker; X64-NEXT: xorl %eax, %eax 251*9880d681SAndroid Build Coastguard Worker; X64-NEXT: subl %edi, %eax 252*9880d681SAndroid Build Coastguard Worker; X64-NEXT: andl %edi, %eax 253*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 254*9880d681SAndroid Build Coastguard Worker %neg = sub i32 0, %a0 255*9880d681SAndroid Build Coastguard Worker %res = and i32 %a0, %neg 256*9880d681SAndroid Build Coastguard Worker ret i32 %res 257*9880d681SAndroid Build Coastguard Worker} 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Workerdefine i32 @test_blsmsk_u32(i32 %a0) { 260*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_blsmsk_u32: 261*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 262*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 263*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl %ecx, %eax 264*9880d681SAndroid Build Coastguard Worker; X32-NEXT: subl $1, %eax 265*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl %ecx, %eax 266*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 267*9880d681SAndroid Build Coastguard Worker; 268*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_blsmsk_u32: 269*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 270*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 271*9880d681SAndroid Build Coastguard Worker; X64-NEXT: subl $1, %eax 272*9880d681SAndroid Build Coastguard Worker; X64-NEXT: xorl %edi, %eax 273*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 274*9880d681SAndroid Build Coastguard Worker %dec = sub i32 %a0, 1 275*9880d681SAndroid Build Coastguard Worker %res = xor i32 %a0, %dec 276*9880d681SAndroid Build Coastguard Worker ret i32 %res 277*9880d681SAndroid Build Coastguard Worker} 278*9880d681SAndroid Build Coastguard Worker 279*9880d681SAndroid Build Coastguard Workerdefine i32 @test_blsr_u32(i32 %a0) { 280*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_blsr_u32: 281*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 282*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 283*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl %ecx, %eax 284*9880d681SAndroid Build Coastguard Worker; X32-NEXT: subl $1, %eax 285*9880d681SAndroid Build Coastguard Worker; X32-NEXT: andl %ecx, %eax 286*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 287*9880d681SAndroid Build Coastguard Worker; 288*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_blsr_u32: 289*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 290*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 291*9880d681SAndroid Build Coastguard Worker; X64-NEXT: subl $1, %eax 292*9880d681SAndroid Build Coastguard Worker; X64-NEXT: andl %edi, %eax 293*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 294*9880d681SAndroid Build Coastguard Worker %dec = sub i32 %a0, 1 295*9880d681SAndroid Build Coastguard Worker %res = and i32 %a0, %dec 296*9880d681SAndroid Build Coastguard Worker ret i32 %res 297*9880d681SAndroid Build Coastguard Worker} 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Workerdefine i32 @test_tzcnt_u32(i32 %a0) { 300*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_tzcnt_u32: 301*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 302*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 303*9880d681SAndroid Build Coastguard Worker; X32-NEXT: cmpl $0, %eax 304*9880d681SAndroid Build Coastguard Worker; X32-NEXT: jne .LBB13_1 305*9880d681SAndroid Build Coastguard Worker; X32-NEXT: # BB#2: 306*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl $32, %eax 307*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 308*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .LBB13_1: 309*9880d681SAndroid Build Coastguard Worker; X32-NEXT: tzcntl %eax, %eax 310*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 311*9880d681SAndroid Build Coastguard Worker; 312*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_tzcnt_u32: 313*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 314*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl $32, %ecx 315*9880d681SAndroid Build Coastguard Worker; X64-NEXT: tzcntl %edi, %eax 316*9880d681SAndroid Build Coastguard Worker; X64-NEXT: cmovbl %ecx, %eax 317*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 318*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %a0, 0 319*9880d681SAndroid Build Coastguard Worker %cttz = call i32 @llvm.cttz.i32(i32 %a0, i1 true) 320*9880d681SAndroid Build Coastguard Worker %res = select i1 %cmp, i32 %cttz, i32 32 321*9880d681SAndroid Build Coastguard Worker ret i32 %res 322*9880d681SAndroid Build Coastguard Worker} 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.cttz.i16(i16, i1) 325*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.cttz.i32(i32, i1) 326*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.bmi.bextr.32(i32, i32) 327