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=i686-unknown | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; These tests just check that the plumbing is in place for @llvm.bitreverse. The 5*9880d681SAndroid Build Coastguard Worker; actual output is massive at the moment as llvm.bitreverse is not yet legal. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdeclare <2 x i16> @llvm.bitreverse.v2i16(<2 x i16>) readnone 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine <2 x i16> @test_bitreverse_v2i16(<2 x i16> %a) nounwind { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitreverse_v2i16: 11*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pushl %edi 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pushl %esi 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movzwl {{[0-9]+}}(%esp), %edx 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movzwl {{[0-9]+}}(%esp), %eax 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %ecx 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $15, %ecx 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $2, %esi 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $13, %esi 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %ecx, %esi 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %ecx 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $4, %ecx 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $11, %ecx 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %ecx 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $8, %esi 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $9, %esi 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %ecx, %esi 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edi 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $16, %edi 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $7, %edi 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edi 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %ecx 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $32, %ecx 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $5, %ecx 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edi, %ecx 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $64, %esi 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $3, %esi 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: leal (%eax,%eax), %edi 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $256, %edi # imm = 0x100 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edi 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl %esi 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $128, %esi 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edi, %esi 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edi 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $3, %edi 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $64, %edi 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edi 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $5, %esi 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $32, %esi 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edi, %esi 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edi 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $7, %edi 58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $16, %edi 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edi 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $9, %esi 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $8, %esi 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edi, %esi 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edi 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $11, %edi 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $4, %edi 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edi 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $13, %esi 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $2, %esi 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edi, %esi 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $15, %eax 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %eax 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %ecx, %eax 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %ecx 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $15, %ecx 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %esi 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $2, %esi 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $13, %esi 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %ecx, %esi 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %ecx 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $4, %ecx 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $11, %ecx 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %ecx 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %esi 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $8, %esi 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $9, %esi 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %ecx, %esi 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %edi 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $16, %edi 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $7, %edi 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edi 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %ecx 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $32, %ecx 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $5, %ecx 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edi, %ecx 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %esi 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $64, %esi 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $3, %esi 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: leal (%edx,%edx), %edi 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $256, %edi # imm = 0x100 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edi 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %esi 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl %esi 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $128, %esi 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edi, %esi 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %edi 108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $3, %edi 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $64, %edi 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edi 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %esi 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $5, %esi 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $32, %esi 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edi, %esi 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %edi 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $7, %edi 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $16, %edi 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edi 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %esi 120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $9, %esi 121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $8, %esi 122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edi, %esi 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %edi 124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $11, %edi 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $4, %edi 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edi 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edx, %esi 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $13, %esi 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $2, %esi 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edi, %esi 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $15, %edx 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edx 133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %ecx, %edx 134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: # kill: %DX<def> %DX<kill> %EDX<kill> 136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: popl %esi 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: popl %edi 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 139*9880d681SAndroid Build Coastguard Worker %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %a) 140*9880d681SAndroid Build Coastguard Worker ret <2 x i16> %b 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Workerdeclare i24 @llvm.bitreverse.i24(i24) readnone 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdefine i24 @test_bitreverse_i24(i24 %a) nounwind { 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitreverse_i24: 147*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pushl %esi 149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %ecx 151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $31, %ecx 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $2, %edx 154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $29, %edx 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %ecx, %edx 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %ecx 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $4, %ecx 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $27, %ecx 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edx, %ecx 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $8, %edx 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $25, %edx 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %ecx, %edx 164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $16, %esi 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $23, %esi 167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edx, %esi 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %ecx 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $32, %ecx 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $21, %ecx 171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %ecx 172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $64, %edx 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $19, %edx 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $17, %esi 177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $16777216, %esi # imm = 0x1000000 178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edx, %esi 179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $15, %edx 181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $8388608, %edx # imm = 0x800000 182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edx 183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $13, %esi 185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $4194304, %esi # imm = 0x400000 186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edx, %esi 187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $11, %edx 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $2097152, %edx # imm = 0x200000 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edx 191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 192*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $9, %esi 193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $1048576, %esi # imm = 0x100000 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edx, %esi 195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $7, %edx 197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $524288, %edx # imm = 0x80000 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edx 199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shll $5, %esi 201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $262144, %esi # imm = 0x40000 202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edx, %esi 203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: leal (,%eax,8), %edx 204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $131072, %edx # imm = 0x20000 205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edx 206*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: leal (%eax,%eax), %esi 207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $65536, %esi # imm = 0x10000 208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edx, %esi 209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl %edx 211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $32768, %edx # imm = 0x8000 212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edx 213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $3, %esi 215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $16384, %esi # imm = 0x4000 216*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edx, %esi 217*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $5, %edx 219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $8192, %edx # imm = 0x2000 220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edx 221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $7, %esi 223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $4096, %esi # imm = 0x1000 224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edx, %esi 225*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 226*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $9, %edx 227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $2048, %edx # imm = 0x800 228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edx 229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 230*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $11, %esi 231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $1024, %esi # imm = 0x400 232*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edx, %esi 233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $13, %edx 235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $512, %edx # imm = 0x200 236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edx 237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $15, %eax 238*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $256, %eax # imm = 0x100 239*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %edx, %eax 240*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %ecx, %eax 241*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrl $8, %eax 242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: popl %esi 243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 244*9880d681SAndroid Build Coastguard Worker %b = call i24 @llvm.bitreverse.i24(i24 %a) 245*9880d681SAndroid Build Coastguard Worker ret i24 %b 246*9880d681SAndroid Build Coastguard Worker} 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Workerdeclare i8 @llvm.bitreverse.i8(i8) readnone 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Workerdefine i8 @test_bitreverse_i8(i8 %a) { 251*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitreverse_i8: 252*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 253*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movb {{[0-9]+}}(%esp), %al 254*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %ecx 255*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shlb $7, %cl 256*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 257*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shlb $5, %dl 258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andb $64, %dl 259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movb %al, %ah 260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shlb $3, %ah 261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andb $32, %ah 262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orb %dl, %ah 263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 264*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addb %dl, %dl 265*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andb $16, %dl 266*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orb %ah, %dl 267*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movb %al, %ah 268*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrb %ah 269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andb $8, %ah 270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orb %dl, %ah 271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrb $3, %dl 273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andb $4, %dl 274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orb %ah, %dl 275*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movb %al, %ah 276*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrb $5, %ah 277*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andb $2, %ah 278*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orb %dl, %ah 279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrb $7, %al 280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orb %ah, %al 281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orb %cl, %al 282*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 283*9880d681SAndroid Build Coastguard Worker %b = call i8 @llvm.bitreverse.i8(i8 %a) 284*9880d681SAndroid Build Coastguard Worker ret i8 %b 285*9880d681SAndroid Build Coastguard Worker} 286*9880d681SAndroid Build Coastguard Worker 287*9880d681SAndroid Build Coastguard Workerdeclare i4 @llvm.bitreverse.i4(i4) readnone 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Workerdefine i4 @test_bitreverse_i4(i4 %a) { 290*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitreverse_i4: 291*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movb {{[0-9]+}}(%esp), %al 293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %ecx 294*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shlb $7, %cl 295*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %edx 296*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shlb $5, %dl 297*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andb $64, %dl 298*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movb %al, %ah 299*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shlb $3, %ah 300*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andb $32, %ah 301*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orb %dl, %ah 302*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addb %al, %al 303*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andb $16, %al 304*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orb %ah, %al 305*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orb %cl, %al 306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shrb $4, %al 307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 308*9880d681SAndroid Build Coastguard Worker %b = call i4 @llvm.bitreverse.i4(i4 %a) 309*9880d681SAndroid Build Coastguard Worker ret i4 %b 310*9880d681SAndroid Build Coastguard Worker} 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Worker; These tests check that bitreverse(constant) calls are folded 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Workerdefine <2 x i16> @fold_v2i16() { 315*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_v2i16: 316*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 317*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movw $-4096, %ax # imm = 0xF000 318*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movw $240, %dx 319*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 320*9880d681SAndroid Build Coastguard Worker %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> <i16 15, i16 3840>) 321*9880d681SAndroid Build Coastguard Worker ret <2 x i16> %b 322*9880d681SAndroid Build Coastguard Worker} 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Workerdefine i24 @fold_i24() { 325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_i24: 326*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 327*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl $2048, %eax # imm = 0x800 328*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 329*9880d681SAndroid Build Coastguard Worker %b = call i24 @llvm.bitreverse.i24(i24 4096) 330*9880d681SAndroid Build Coastguard Worker ret i24 %b 331*9880d681SAndroid Build Coastguard Worker} 332*9880d681SAndroid Build Coastguard Worker 333*9880d681SAndroid Build Coastguard Workerdefine i8 @fold_i8() { 334*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_i8: 335*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 336*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movb $-16, %al 337*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 338*9880d681SAndroid Build Coastguard Worker %b = call i8 @llvm.bitreverse.i8(i8 15) 339*9880d681SAndroid Build Coastguard Worker ret i8 %b 340*9880d681SAndroid Build Coastguard Worker} 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Workerdefine i4 @fold_i4() { 343*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fold_i4: 344*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 345*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movb $1, %al 346*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 347*9880d681SAndroid Build Coastguard Worker %b = call i4 @llvm.bitreverse.i4(i4 8) 348*9880d681SAndroid Build Coastguard Worker ret i4 %b 349*9880d681SAndroid Build Coastguard Worker} 350*9880d681SAndroid Build Coastguard Worker 351*9880d681SAndroid Build Coastguard Worker; These tests check that bitreverse(bitreverse()) calls are removed 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Workerdefine i8 @identity_i8(i8 %a) { 354*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: identity_i8: 355*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 356*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movb {{[0-9]+}}(%esp), %al 357*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 358*9880d681SAndroid Build Coastguard Worker %b = call i8 @llvm.bitreverse.i8(i8 %a) 359*9880d681SAndroid Build Coastguard Worker %c = call i8 @llvm.bitreverse.i8(i8 %b) 360*9880d681SAndroid Build Coastguard Worker ret i8 %c 361*9880d681SAndroid Build Coastguard Worker} 362*9880d681SAndroid Build Coastguard Worker 363*9880d681SAndroid Build Coastguard Workerdefine <2 x i16> @identity_v2i16(<2 x i16> %a) { 364*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: identity_v2i16: 365*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 366*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movzwl {{[0-9]+}}(%esp), %eax 367*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movzwl {{[0-9]+}}(%esp), %edx 368*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 369*9880d681SAndroid Build Coastguard Worker %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %a) 370*9880d681SAndroid Build Coastguard Worker %c = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %b) 371*9880d681SAndroid Build Coastguard Worker ret <2 x i16> %c 372*9880d681SAndroid Build Coastguard Worker} 373*9880d681SAndroid Build Coastguard Worker 374*9880d681SAndroid Build Coastguard Worker; These tests check that bitreverse(undef) calls are removed 375*9880d681SAndroid Build Coastguard Worker 376*9880d681SAndroid Build Coastguard Workerdefine i8 @undef_i8() { 377*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: undef_i8: 378*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 379*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 380*9880d681SAndroid Build Coastguard Worker %b = call i8 @llvm.bitreverse.i8(i8 undef) 381*9880d681SAndroid Build Coastguard Worker ret i8 %b 382*9880d681SAndroid Build Coastguard Worker} 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard Workerdefine <2 x i16> @undef_v2i16() { 385*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: undef_v2i16: 386*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 387*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 388*9880d681SAndroid Build Coastguard Worker %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> undef) 389*9880d681SAndroid Build Coastguard Worker ret <2 x i16> %b 390*9880d681SAndroid Build Coastguard Worker} 391