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=+tbm | FileCheck %s --check-prefix=X32 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -fast-isel -mtriple=x86_64-unknown-unknown -mattr=+tbm | 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/tbm-builtins.c 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine i32 @test__bextri_u32(i32 %a0) { 8*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__bextri_u32: 9*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 10*9880d681SAndroid Build Coastguard Worker; X32-NEXT: bextr $1, {{[0-9]+}}(%esp), %eax 11*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 12*9880d681SAndroid Build Coastguard Worker; 13*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__bextri_u32: 14*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 15*9880d681SAndroid Build Coastguard Worker; X64-NEXT: bextr $1, %edi, %eax 16*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 17*9880d681SAndroid Build Coastguard Worker %1 = call i32 @llvm.x86.tbm.bextri.u32(i32 %a0, i32 1) 18*9880d681SAndroid Build Coastguard Worker ret i32 %1 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine i32 @test__blcfill_u32(i32 %a0) { 22*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__blcfill_u32: 23*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 24*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 25*9880d681SAndroid Build Coastguard Worker; X32-NEXT: leal 1(%ecx), %eax 26*9880d681SAndroid Build Coastguard Worker; X32-NEXT: andl %ecx, %eax 27*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 28*9880d681SAndroid Build Coastguard Worker; 29*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__blcfill_u32: 30*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 31*9880d681SAndroid Build Coastguard Worker; X64-NEXT: # kill: %EDI<def> %EDI<kill> %RDI<def> 32*9880d681SAndroid Build Coastguard Worker; X64-NEXT: leal 1(%rdi), %eax 33*9880d681SAndroid Build Coastguard Worker; X64-NEXT: andl %edi, %eax 34*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 35*9880d681SAndroid Build Coastguard Worker %1 = add i32 %a0, 1 36*9880d681SAndroid Build Coastguard Worker %2 = and i32 %a0, %1 37*9880d681SAndroid Build Coastguard Worker ret i32 %2 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine i32 @test__blci_u32(i32 %a0) { 41*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__blci_u32: 42*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 43*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 44*9880d681SAndroid Build Coastguard Worker; X32-NEXT: leal 1(%ecx), %eax 45*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl $-1, %eax 46*9880d681SAndroid Build Coastguard Worker; X32-NEXT: orl %ecx, %eax 47*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 48*9880d681SAndroid Build Coastguard Worker; 49*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__blci_u32: 50*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 51*9880d681SAndroid Build Coastguard Worker; X64-NEXT: # kill: %EDI<def> %EDI<kill> %RDI<def> 52*9880d681SAndroid Build Coastguard Worker; X64-NEXT: leal 1(%rdi), %eax 53*9880d681SAndroid Build Coastguard Worker; X64-NEXT: xorl $-1, %eax 54*9880d681SAndroid Build Coastguard Worker; X64-NEXT: orl %edi, %eax 55*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 56*9880d681SAndroid Build Coastguard Worker %1 = add i32 %a0, 1 57*9880d681SAndroid Build Coastguard Worker %2 = xor i32 %1, -1 58*9880d681SAndroid Build Coastguard Worker %3 = or i32 %a0, %2 59*9880d681SAndroid Build Coastguard Worker ret i32 %3 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine i32 @test__blcic_u32(i32 %a0) { 63*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__blcic_u32: 64*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 65*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 66*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl %eax, %ecx 67*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl $-1, %ecx 68*9880d681SAndroid Build Coastguard Worker; X32-NEXT: addl $1, %eax 69*9880d681SAndroid Build Coastguard Worker; X32-NEXT: andl %ecx, %eax 70*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 71*9880d681SAndroid Build Coastguard Worker; 72*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__blcic_u32: 73*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 74*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 75*9880d681SAndroid Build Coastguard Worker; X64-NEXT: xorl $-1, %eax 76*9880d681SAndroid Build Coastguard Worker; X64-NEXT: addl $1, %edi 77*9880d681SAndroid Build Coastguard Worker; X64-NEXT: andl %eax, %edi 78*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 79*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 80*9880d681SAndroid Build Coastguard Worker %1 = xor i32 %a0, -1 81*9880d681SAndroid Build Coastguard Worker %2 = add i32 %a0, 1 82*9880d681SAndroid Build Coastguard Worker %3 = and i32 %1, %2 83*9880d681SAndroid Build Coastguard Worker ret i32 %3 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerdefine i32 @test__blcmsk_u32(i32 %a0) { 87*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__blcmsk_u32: 88*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 89*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 90*9880d681SAndroid Build Coastguard Worker; X32-NEXT: leal 1(%ecx), %eax 91*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl %ecx, %eax 92*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 93*9880d681SAndroid Build Coastguard Worker; 94*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__blcmsk_u32: 95*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 96*9880d681SAndroid Build Coastguard Worker; X64-NEXT: # kill: %EDI<def> %EDI<kill> %RDI<def> 97*9880d681SAndroid Build Coastguard Worker; X64-NEXT: leal 1(%rdi), %eax 98*9880d681SAndroid Build Coastguard Worker; X64-NEXT: xorl %edi, %eax 99*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 100*9880d681SAndroid Build Coastguard Worker %1 = add i32 %a0, 1 101*9880d681SAndroid Build Coastguard Worker %2 = xor i32 %a0, %1 102*9880d681SAndroid Build Coastguard Worker ret i32 %2 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdefine i32 @test__blcs_u32(i32 %a0) { 106*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__blcs_u32: 107*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 108*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 109*9880d681SAndroid Build Coastguard Worker; X32-NEXT: leal 1(%ecx), %eax 110*9880d681SAndroid Build Coastguard Worker; X32-NEXT: orl %ecx, %eax 111*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 112*9880d681SAndroid Build Coastguard Worker; 113*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__blcs_u32: 114*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 115*9880d681SAndroid Build Coastguard Worker; X64-NEXT: # kill: %EDI<def> %EDI<kill> %RDI<def> 116*9880d681SAndroid Build Coastguard Worker; X64-NEXT: leal 1(%rdi), %eax 117*9880d681SAndroid Build Coastguard Worker; X64-NEXT: orl %edi, %eax 118*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 119*9880d681SAndroid Build Coastguard Worker %1 = add i32 %a0, 1 120*9880d681SAndroid Build Coastguard Worker %2 = or i32 %a0, %1 121*9880d681SAndroid Build Coastguard Worker ret i32 %2 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerdefine i32 @test__blsfill_u32(i32 %a0) { 125*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__blsfill_u32: 126*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 127*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 128*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl %ecx, %eax 129*9880d681SAndroid Build Coastguard Worker; X32-NEXT: subl $1, %eax 130*9880d681SAndroid Build Coastguard Worker; X32-NEXT: orl %ecx, %eax 131*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 132*9880d681SAndroid Build Coastguard Worker; 133*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__blsfill_u32: 134*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 135*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 136*9880d681SAndroid Build Coastguard Worker; X64-NEXT: subl $1, %eax 137*9880d681SAndroid Build Coastguard Worker; X64-NEXT: orl %edi, %eax 138*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 139*9880d681SAndroid Build Coastguard Worker %1 = sub i32 %a0, 1 140*9880d681SAndroid Build Coastguard Worker %2 = or i32 %a0, %1 141*9880d681SAndroid Build Coastguard Worker ret i32 %2 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdefine i32 @test__blsic_u32(i32 %a0) { 145*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__blsic_u32: 146*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 147*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 148*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl %eax, %ecx 149*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl $-1, %ecx 150*9880d681SAndroid Build Coastguard Worker; X32-NEXT: subl $1, %eax 151*9880d681SAndroid Build Coastguard Worker; X32-NEXT: orl %ecx, %eax 152*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 153*9880d681SAndroid Build Coastguard Worker; 154*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__blsic_u32: 155*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 156*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 157*9880d681SAndroid Build Coastguard Worker; X64-NEXT: xorl $-1, %eax 158*9880d681SAndroid Build Coastguard Worker; X64-NEXT: subl $1, %edi 159*9880d681SAndroid Build Coastguard Worker; X64-NEXT: orl %eax, %edi 160*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 161*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 162*9880d681SAndroid Build Coastguard Worker %1 = xor i32 %a0, -1 163*9880d681SAndroid Build Coastguard Worker %2 = sub i32 %a0, 1 164*9880d681SAndroid Build Coastguard Worker %3 = or i32 %1, %2 165*9880d681SAndroid Build Coastguard Worker ret i32 %3 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerdefine i32 @test__t1mskc_u32(i32 %a0) { 169*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__t1mskc_u32: 170*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 171*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 172*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl %eax, %ecx 173*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl $-1, %ecx 174*9880d681SAndroid Build Coastguard Worker; X32-NEXT: addl $1, %eax 175*9880d681SAndroid Build Coastguard Worker; X32-NEXT: orl %ecx, %eax 176*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 177*9880d681SAndroid Build Coastguard Worker; 178*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__t1mskc_u32: 179*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 180*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 181*9880d681SAndroid Build Coastguard Worker; X64-NEXT: xorl $-1, %eax 182*9880d681SAndroid Build Coastguard Worker; X64-NEXT: addl $1, %edi 183*9880d681SAndroid Build Coastguard Worker; X64-NEXT: orl %eax, %edi 184*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 185*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 186*9880d681SAndroid Build Coastguard Worker %1 = xor i32 %a0, -1 187*9880d681SAndroid Build Coastguard Worker %2 = add i32 %a0, 1 188*9880d681SAndroid Build Coastguard Worker %3 = or i32 %1, %2 189*9880d681SAndroid Build Coastguard Worker ret i32 %3 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerdefine i32 @test__tzmsk_u32(i32 %a0) { 193*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__tzmsk_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: movl %eax, %ecx 197*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl $-1, %ecx 198*9880d681SAndroid Build Coastguard Worker; X32-NEXT: subl $1, %eax 199*9880d681SAndroid Build Coastguard Worker; X32-NEXT: andl %ecx, %eax 200*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 201*9880d681SAndroid Build Coastguard Worker; 202*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__tzmsk_u32: 203*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 204*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 205*9880d681SAndroid Build Coastguard Worker; X64-NEXT: xorl $-1, %eax 206*9880d681SAndroid Build Coastguard Worker; X64-NEXT: subl $1, %edi 207*9880d681SAndroid Build Coastguard Worker; X64-NEXT: andl %eax, %edi 208*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %edi, %eax 209*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 210*9880d681SAndroid Build Coastguard Worker %1 = xor i32 %a0, -1 211*9880d681SAndroid Build Coastguard Worker %2 = sub i32 %a0, 1 212*9880d681SAndroid Build Coastguard Worker %3 = and i32 %1, %2 213*9880d681SAndroid Build Coastguard Worker ret i32 %3 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.tbm.bextri.u32(i32, i32) 217