xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/bitreverse.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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