[DAGCombiner] Eliminate dead stores to stack.
[llvm-complete.git] / test / CodeGen / X86 / vector-bitreverse.ll
blobdf1b5041caf343d526b55cf77efc0eb0275695ed
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX  --check-prefix=AVX512  --check-prefix=AVX512F
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX  --check-prefix=AVX512  --check-prefix=AVX512BW
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
11 ; Make sure we don't crash with avx512bw and xop
12 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx512bw
14 define i8 @test_bitreverse_i8(i8 %a) nounwind {
15 ; SSE-LABEL: test_bitreverse_i8:
16 ; SSE:       # %bb.0:
17 ; SSE-NEXT:    movl %edi, %eax
18 ; SSE-NEXT:    rolb $4, %al
19 ; SSE-NEXT:    movl %eax, %ecx
20 ; SSE-NEXT:    andb $51, %cl
21 ; SSE-NEXT:    shlb $2, %cl
22 ; SSE-NEXT:    andb $-52, %al
23 ; SSE-NEXT:    shrb $2, %al
24 ; SSE-NEXT:    orb %cl, %al
25 ; SSE-NEXT:    movl %eax, %ecx
26 ; SSE-NEXT:    andb $85, %cl
27 ; SSE-NEXT:    addb %cl, %cl
28 ; SSE-NEXT:    andb $-86, %al
29 ; SSE-NEXT:    shrb %al
30 ; SSE-NEXT:    orb %cl, %al
31 ; SSE-NEXT:    # kill: def $al killed $al killed $eax
32 ; SSE-NEXT:    retq
34 ; AVX-LABEL: test_bitreverse_i8:
35 ; AVX:       # %bb.0:
36 ; AVX-NEXT:    movl %edi, %eax
37 ; AVX-NEXT:    rolb $4, %al
38 ; AVX-NEXT:    movl %eax, %ecx
39 ; AVX-NEXT:    andb $51, %cl
40 ; AVX-NEXT:    shlb $2, %cl
41 ; AVX-NEXT:    andb $-52, %al
42 ; AVX-NEXT:    shrb $2, %al
43 ; AVX-NEXT:    orb %cl, %al
44 ; AVX-NEXT:    movl %eax, %ecx
45 ; AVX-NEXT:    andb $85, %cl
46 ; AVX-NEXT:    addb %cl, %cl
47 ; AVX-NEXT:    andb $-86, %al
48 ; AVX-NEXT:    shrb %al
49 ; AVX-NEXT:    orb %cl, %al
50 ; AVX-NEXT:    # kill: def $al killed $al killed $eax
51 ; AVX-NEXT:    retq
53 ; XOP-LABEL: test_bitreverse_i8:
54 ; XOP:       # %bb.0:
55 ; XOP-NEXT:    vmovd %edi, %xmm0
56 ; XOP-NEXT:    vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
57 ; XOP-NEXT:    vpextrb $0, %xmm0, %eax
58 ; XOP-NEXT:    # kill: def $al killed $al killed $eax
59 ; XOP-NEXT:    retq
60   %b = call i8 @llvm.bitreverse.i8(i8 %a)
61   ret i8 %b
64 define i16 @test_bitreverse_i16(i16 %a) nounwind {
65 ; SSE-LABEL: test_bitreverse_i16:
66 ; SSE:       # %bb.0:
67 ; SSE-NEXT:    # kill: def $edi killed $edi def $rdi
68 ; SSE-NEXT:    rolw $8, %di
69 ; SSE-NEXT:    movl %edi, %eax
70 ; SSE-NEXT:    andl $3855, %eax # imm = 0xF0F
71 ; SSE-NEXT:    shll $4, %eax
72 ; SSE-NEXT:    andl $61680, %edi # imm = 0xF0F0
73 ; SSE-NEXT:    shrl $4, %edi
74 ; SSE-NEXT:    orl %eax, %edi
75 ; SSE-NEXT:    movl %edi, %eax
76 ; SSE-NEXT:    andl $13107, %eax # imm = 0x3333
77 ; SSE-NEXT:    andl $52428, %edi # imm = 0xCCCC
78 ; SSE-NEXT:    shrl $2, %edi
79 ; SSE-NEXT:    leal (%rdi,%rax,4), %eax
80 ; SSE-NEXT:    movl %eax, %ecx
81 ; SSE-NEXT:    andl $21845, %ecx # imm = 0x5555
82 ; SSE-NEXT:    andl $43690, %eax # imm = 0xAAAA
83 ; SSE-NEXT:    shrl %eax
84 ; SSE-NEXT:    leal (%rax,%rcx,2), %eax
85 ; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
86 ; SSE-NEXT:    retq
88 ; AVX-LABEL: test_bitreverse_i16:
89 ; AVX:       # %bb.0:
90 ; AVX-NEXT:    # kill: def $edi killed $edi def $rdi
91 ; AVX-NEXT:    rolw $8, %di
92 ; AVX-NEXT:    movl %edi, %eax
93 ; AVX-NEXT:    andl $3855, %eax # imm = 0xF0F
94 ; AVX-NEXT:    shll $4, %eax
95 ; AVX-NEXT:    andl $61680, %edi # imm = 0xF0F0
96 ; AVX-NEXT:    shrl $4, %edi
97 ; AVX-NEXT:    orl %eax, %edi
98 ; AVX-NEXT:    movl %edi, %eax
99 ; AVX-NEXT:    andl $13107, %eax # imm = 0x3333
100 ; AVX-NEXT:    andl $52428, %edi # imm = 0xCCCC
101 ; AVX-NEXT:    shrl $2, %edi
102 ; AVX-NEXT:    leal (%rdi,%rax,4), %eax
103 ; AVX-NEXT:    movl %eax, %ecx
104 ; AVX-NEXT:    andl $21845, %ecx # imm = 0x5555
105 ; AVX-NEXT:    andl $43690, %eax # imm = 0xAAAA
106 ; AVX-NEXT:    shrl %eax
107 ; AVX-NEXT:    leal (%rax,%rcx,2), %eax
108 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
109 ; AVX-NEXT:    retq
111 ; XOP-LABEL: test_bitreverse_i16:
112 ; XOP:       # %bb.0:
113 ; XOP-NEXT:    vmovd %edi, %xmm0
114 ; XOP-NEXT:    vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
115 ; XOP-NEXT:    vmovd %xmm0, %eax
116 ; XOP-NEXT:    # kill: def $ax killed $ax killed $eax
117 ; XOP-NEXT:    retq
118   %b = call i16 @llvm.bitreverse.i16(i16 %a)
119   ret i16 %b
122 define i32 @test_bitreverse_i32(i32 %a) nounwind {
123 ; SSE-LABEL: test_bitreverse_i32:
124 ; SSE:       # %bb.0:
125 ; SSE-NEXT:    # kill: def $edi killed $edi def $rdi
126 ; SSE-NEXT:    bswapl %edi
127 ; SSE-NEXT:    movl %edi, %eax
128 ; SSE-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
129 ; SSE-NEXT:    shll $4, %eax
130 ; SSE-NEXT:    andl $-252645136, %edi # imm = 0xF0F0F0F0
131 ; SSE-NEXT:    shrl $4, %edi
132 ; SSE-NEXT:    orl %eax, %edi
133 ; SSE-NEXT:    movl %edi, %eax
134 ; SSE-NEXT:    andl $858993459, %eax # imm = 0x33333333
135 ; SSE-NEXT:    andl $-858993460, %edi # imm = 0xCCCCCCCC
136 ; SSE-NEXT:    shrl $2, %edi
137 ; SSE-NEXT:    leal (%rdi,%rax,4), %eax
138 ; SSE-NEXT:    movl %eax, %ecx
139 ; SSE-NEXT:    andl $1431655765, %ecx # imm = 0x55555555
140 ; SSE-NEXT:    andl $-1431655766, %eax # imm = 0xAAAAAAAA
141 ; SSE-NEXT:    shrl %eax
142 ; SSE-NEXT:    leal (%rax,%rcx,2), %eax
143 ; SSE-NEXT:    retq
145 ; AVX-LABEL: test_bitreverse_i32:
146 ; AVX:       # %bb.0:
147 ; AVX-NEXT:    # kill: def $edi killed $edi def $rdi
148 ; AVX-NEXT:    bswapl %edi
149 ; AVX-NEXT:    movl %edi, %eax
150 ; AVX-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
151 ; AVX-NEXT:    shll $4, %eax
152 ; AVX-NEXT:    andl $-252645136, %edi # imm = 0xF0F0F0F0
153 ; AVX-NEXT:    shrl $4, %edi
154 ; AVX-NEXT:    orl %eax, %edi
155 ; AVX-NEXT:    movl %edi, %eax
156 ; AVX-NEXT:    andl $858993459, %eax # imm = 0x33333333
157 ; AVX-NEXT:    andl $-858993460, %edi # imm = 0xCCCCCCCC
158 ; AVX-NEXT:    shrl $2, %edi
159 ; AVX-NEXT:    leal (%rdi,%rax,4), %eax
160 ; AVX-NEXT:    movl %eax, %ecx
161 ; AVX-NEXT:    andl $1431655765, %ecx # imm = 0x55555555
162 ; AVX-NEXT:    andl $-1431655766, %eax # imm = 0xAAAAAAAA
163 ; AVX-NEXT:    shrl %eax
164 ; AVX-NEXT:    leal (%rax,%rcx,2), %eax
165 ; AVX-NEXT:    retq
167 ; XOP-LABEL: test_bitreverse_i32:
168 ; XOP:       # %bb.0:
169 ; XOP-NEXT:    vmovd %edi, %xmm0
170 ; XOP-NEXT:    vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
171 ; XOP-NEXT:    vmovd %xmm0, %eax
172 ; XOP-NEXT:    retq
173   %b = call i32 @llvm.bitreverse.i32(i32 %a)
174   ret i32 %b
177 define i64 @test_bitreverse_i64(i64 %a) nounwind {
178 ; SSE-LABEL: test_bitreverse_i64:
179 ; SSE:       # %bb.0:
180 ; SSE-NEXT:    bswapq %rdi
181 ; SSE-NEXT:    movabsq $1085102592571150095, %rax # imm = 0xF0F0F0F0F0F0F0F
182 ; SSE-NEXT:    andq %rdi, %rax
183 ; SSE-NEXT:    shlq $4, %rax
184 ; SSE-NEXT:    movabsq $-1085102592571150096, %rcx # imm = 0xF0F0F0F0F0F0F0F0
185 ; SSE-NEXT:    andq %rdi, %rcx
186 ; SSE-NEXT:    shrq $4, %rcx
187 ; SSE-NEXT:    orq %rax, %rcx
188 ; SSE-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333
189 ; SSE-NEXT:    andq %rcx, %rax
190 ; SSE-NEXT:    movabsq $-3689348814741910324, %rdx # imm = 0xCCCCCCCCCCCCCCCC
191 ; SSE-NEXT:    andq %rcx, %rdx
192 ; SSE-NEXT:    shrq $2, %rdx
193 ; SSE-NEXT:    leaq (%rdx,%rax,4), %rax
194 ; SSE-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555
195 ; SSE-NEXT:    andq %rax, %rcx
196 ; SSE-NEXT:    movabsq $-6148914691236517206, %rdx # imm = 0xAAAAAAAAAAAAAAAA
197 ; SSE-NEXT:    andq %rax, %rdx
198 ; SSE-NEXT:    shrq %rdx
199 ; SSE-NEXT:    leaq (%rdx,%rcx,2), %rax
200 ; SSE-NEXT:    retq
202 ; AVX-LABEL: test_bitreverse_i64:
203 ; AVX:       # %bb.0:
204 ; AVX-NEXT:    bswapq %rdi
205 ; AVX-NEXT:    movabsq $1085102592571150095, %rax # imm = 0xF0F0F0F0F0F0F0F
206 ; AVX-NEXT:    andq %rdi, %rax
207 ; AVX-NEXT:    shlq $4, %rax
208 ; AVX-NEXT:    movabsq $-1085102592571150096, %rcx # imm = 0xF0F0F0F0F0F0F0F0
209 ; AVX-NEXT:    andq %rdi, %rcx
210 ; AVX-NEXT:    shrq $4, %rcx
211 ; AVX-NEXT:    orq %rax, %rcx
212 ; AVX-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333
213 ; AVX-NEXT:    andq %rcx, %rax
214 ; AVX-NEXT:    movabsq $-3689348814741910324, %rdx # imm = 0xCCCCCCCCCCCCCCCC
215 ; AVX-NEXT:    andq %rcx, %rdx
216 ; AVX-NEXT:    shrq $2, %rdx
217 ; AVX-NEXT:    leaq (%rdx,%rax,4), %rax
218 ; AVX-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555
219 ; AVX-NEXT:    andq %rax, %rcx
220 ; AVX-NEXT:    movabsq $-6148914691236517206, %rdx # imm = 0xAAAAAAAAAAAAAAAA
221 ; AVX-NEXT:    andq %rax, %rdx
222 ; AVX-NEXT:    shrq %rdx
223 ; AVX-NEXT:    leaq (%rdx,%rcx,2), %rax
224 ; AVX-NEXT:    retq
226 ; XOP-LABEL: test_bitreverse_i64:
227 ; XOP:       # %bb.0:
228 ; XOP-NEXT:    vmovq %rdi, %xmm0
229 ; XOP-NEXT:    vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
230 ; XOP-NEXT:    vmovq %xmm0, %rax
231 ; XOP-NEXT:    retq
232   %b = call i64 @llvm.bitreverse.i64(i64 %a)
233   ret i64 %b
236 define <16 x i8> @test_bitreverse_v16i8(<16 x i8> %a) nounwind {
237 ; SSE2-LABEL: test_bitreverse_v16i8:
238 ; SSE2:       # %bb.0:
239 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
240 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
241 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
242 ; SSE2-NEXT:    pand %xmm0, %xmm2
243 ; SSE2-NEXT:    psllw $4, %xmm2
244 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
245 ; SSE2-NEXT:    psrlw $4, %xmm1
246 ; SSE2-NEXT:    pand %xmm0, %xmm1
247 ; SSE2-NEXT:    pandn %xmm2, %xmm0
248 ; SSE2-NEXT:    por %xmm1, %xmm0
249 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
250 ; SSE2-NEXT:    pand %xmm0, %xmm1
251 ; SSE2-NEXT:    psllw $2, %xmm1
252 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
253 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
254 ; SSE2-NEXT:    psrlw $2, %xmm0
255 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
256 ; SSE2-NEXT:    por %xmm1, %xmm0
257 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
258 ; SSE2-NEXT:    pand %xmm0, %xmm1
259 ; SSE2-NEXT:    paddb %xmm1, %xmm1
260 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
261 ; SSE2-NEXT:    psrlw $1, %xmm0
262 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
263 ; SSE2-NEXT:    por %xmm1, %xmm0
264 ; SSE2-NEXT:    retq
266 ; SSSE3-LABEL: test_bitreverse_v16i8:
267 ; SSSE3:       # %bb.0:
268 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
269 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
270 ; SSSE3-NEXT:    pand %xmm1, %xmm2
271 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
272 ; SSSE3-NEXT:    pshufb %xmm2, %xmm3
273 ; SSSE3-NEXT:    psrlw $4, %xmm0
274 ; SSSE3-NEXT:    pand %xmm1, %xmm0
275 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
276 ; SSSE3-NEXT:    pshufb %xmm0, %xmm1
277 ; SSSE3-NEXT:    por %xmm3, %xmm1
278 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
279 ; SSSE3-NEXT:    retq
281 ; AVX-LABEL: test_bitreverse_v16i8:
282 ; AVX:       # %bb.0:
283 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
284 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
285 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
286 ; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
287 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
288 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
289 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
290 ; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
291 ; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
292 ; AVX-NEXT:    retq
294 ; XOP-LABEL: test_bitreverse_v16i8:
295 ; XOP:       # %bb.0:
296 ; XOP-NEXT:    vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
297 ; XOP-NEXT:    retq
298   %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %a)
299   ret <16 x i8> %b
302 define <8 x i16> @test_bitreverse_v8i16(<8 x i16> %a) nounwind {
303 ; SSE2-LABEL: test_bitreverse_v8i16:
304 ; SSE2:       # %bb.0:
305 ; SSE2-NEXT:    pxor %xmm1, %xmm1
306 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
307 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
308 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[1,0,3,2,4,5,6,7]
309 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,4,7,6]
310 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
311 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7]
312 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,5,4,7,6]
313 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
314 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
315 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
316 ; SSE2-NEXT:    pand %xmm0, %xmm2
317 ; SSE2-NEXT:    psllw $4, %xmm2
318 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
319 ; SSE2-NEXT:    psrlw $4, %xmm1
320 ; SSE2-NEXT:    pand %xmm0, %xmm1
321 ; SSE2-NEXT:    pandn %xmm2, %xmm0
322 ; SSE2-NEXT:    por %xmm1, %xmm0
323 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
324 ; SSE2-NEXT:    pand %xmm0, %xmm1
325 ; SSE2-NEXT:    psllw $2, %xmm1
326 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
327 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
328 ; SSE2-NEXT:    psrlw $2, %xmm0
329 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
330 ; SSE2-NEXT:    por %xmm1, %xmm0
331 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
332 ; SSE2-NEXT:    pand %xmm0, %xmm1
333 ; SSE2-NEXT:    paddb %xmm1, %xmm1
334 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
335 ; SSE2-NEXT:    psrlw $1, %xmm0
336 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
337 ; SSE2-NEXT:    por %xmm1, %xmm0
338 ; SSE2-NEXT:    retq
340 ; SSSE3-LABEL: test_bitreverse_v8i16:
341 ; SSSE3:       # %bb.0:
342 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
343 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
344 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
345 ; SSSE3-NEXT:    pand %xmm1, %xmm2
346 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
347 ; SSSE3-NEXT:    pshufb %xmm2, %xmm3
348 ; SSSE3-NEXT:    psrlw $4, %xmm0
349 ; SSSE3-NEXT:    pand %xmm1, %xmm0
350 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
351 ; SSSE3-NEXT:    pshufb %xmm0, %xmm1
352 ; SSSE3-NEXT:    por %xmm3, %xmm1
353 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
354 ; SSSE3-NEXT:    retq
356 ; AVX-LABEL: test_bitreverse_v8i16:
357 ; AVX:       # %bb.0:
358 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
359 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
360 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
361 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
362 ; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
363 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
364 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
365 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
366 ; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
367 ; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
368 ; AVX-NEXT:    retq
370 ; XOP-LABEL: test_bitreverse_v8i16:
371 ; XOP:       # %bb.0:
372 ; XOP-NEXT:    vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
373 ; XOP-NEXT:    retq
374   %b = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a)
375   ret <8 x i16> %b
378 define <4 x i32> @test_bitreverse_v4i32(<4 x i32> %a) nounwind {
379 ; SSE2-LABEL: test_bitreverse_v4i32:
380 ; SSE2:       # %bb.0:
381 ; SSE2-NEXT:    pxor %xmm1, %xmm1
382 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
383 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
384 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
385 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
386 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
387 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
388 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,7,6,5,4]
389 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
390 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
391 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
392 ; SSE2-NEXT:    pand %xmm0, %xmm2
393 ; SSE2-NEXT:    psllw $4, %xmm2
394 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
395 ; SSE2-NEXT:    psrlw $4, %xmm1
396 ; SSE2-NEXT:    pand %xmm0, %xmm1
397 ; SSE2-NEXT:    pandn %xmm2, %xmm0
398 ; SSE2-NEXT:    por %xmm1, %xmm0
399 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
400 ; SSE2-NEXT:    pand %xmm0, %xmm1
401 ; SSE2-NEXT:    psllw $2, %xmm1
402 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
403 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
404 ; SSE2-NEXT:    psrlw $2, %xmm0
405 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
406 ; SSE2-NEXT:    por %xmm1, %xmm0
407 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
408 ; SSE2-NEXT:    pand %xmm0, %xmm1
409 ; SSE2-NEXT:    paddb %xmm1, %xmm1
410 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
411 ; SSE2-NEXT:    psrlw $1, %xmm0
412 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
413 ; SSE2-NEXT:    por %xmm1, %xmm0
414 ; SSE2-NEXT:    retq
416 ; SSSE3-LABEL: test_bitreverse_v4i32:
417 ; SSSE3:       # %bb.0:
418 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
419 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
420 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
421 ; SSSE3-NEXT:    pand %xmm1, %xmm2
422 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
423 ; SSSE3-NEXT:    pshufb %xmm2, %xmm3
424 ; SSSE3-NEXT:    psrlw $4, %xmm0
425 ; SSSE3-NEXT:    pand %xmm1, %xmm0
426 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
427 ; SSSE3-NEXT:    pshufb %xmm0, %xmm1
428 ; SSSE3-NEXT:    por %xmm3, %xmm1
429 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
430 ; SSSE3-NEXT:    retq
432 ; AVX-LABEL: test_bitreverse_v4i32:
433 ; AVX:       # %bb.0:
434 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
435 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
436 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
437 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
438 ; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
439 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
440 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
441 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
442 ; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
443 ; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
444 ; AVX-NEXT:    retq
446 ; XOP-LABEL: test_bitreverse_v4i32:
447 ; XOP:       # %bb.0:
448 ; XOP-NEXT:    vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
449 ; XOP-NEXT:    retq
450   %b = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a)
451   ret <4 x i32> %b
454 define <2 x i64> @test_bitreverse_v2i64(<2 x i64> %a) nounwind {
455 ; SSE2-LABEL: test_bitreverse_v2i64:
456 ; SSE2:       # %bb.0:
457 ; SSE2-NEXT:    pxor %xmm1, %xmm1
458 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
459 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
460 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
461 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
462 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
463 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
464 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
465 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
466 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,7,6,5,4]
467 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
468 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
469 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
470 ; SSE2-NEXT:    pand %xmm0, %xmm2
471 ; SSE2-NEXT:    psllw $4, %xmm2
472 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
473 ; SSE2-NEXT:    psrlw $4, %xmm1
474 ; SSE2-NEXT:    pand %xmm0, %xmm1
475 ; SSE2-NEXT:    pandn %xmm2, %xmm0
476 ; SSE2-NEXT:    por %xmm1, %xmm0
477 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
478 ; SSE2-NEXT:    pand %xmm0, %xmm1
479 ; SSE2-NEXT:    psllw $2, %xmm1
480 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
481 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
482 ; SSE2-NEXT:    psrlw $2, %xmm0
483 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
484 ; SSE2-NEXT:    por %xmm1, %xmm0
485 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
486 ; SSE2-NEXT:    pand %xmm0, %xmm1
487 ; SSE2-NEXT:    paddb %xmm1, %xmm1
488 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
489 ; SSE2-NEXT:    psrlw $1, %xmm0
490 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
491 ; SSE2-NEXT:    por %xmm1, %xmm0
492 ; SSE2-NEXT:    retq
494 ; SSSE3-LABEL: test_bitreverse_v2i64:
495 ; SSSE3:       # %bb.0:
496 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
497 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
498 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
499 ; SSSE3-NEXT:    pand %xmm1, %xmm2
500 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
501 ; SSSE3-NEXT:    pshufb %xmm2, %xmm3
502 ; SSSE3-NEXT:    psrlw $4, %xmm0
503 ; SSSE3-NEXT:    pand %xmm1, %xmm0
504 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
505 ; SSSE3-NEXT:    pshufb %xmm0, %xmm1
506 ; SSSE3-NEXT:    por %xmm3, %xmm1
507 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
508 ; SSSE3-NEXT:    retq
510 ; AVX-LABEL: test_bitreverse_v2i64:
511 ; AVX:       # %bb.0:
512 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
513 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
514 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
515 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
516 ; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
517 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
518 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
519 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
520 ; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
521 ; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
522 ; AVX-NEXT:    retq
524 ; XOP-LABEL: test_bitreverse_v2i64:
525 ; XOP:       # %bb.0:
526 ; XOP-NEXT:    vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
527 ; XOP-NEXT:    retq
528   %b = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a)
529   ret <2 x i64> %b
532 define <32 x i8> @test_bitreverse_v32i8(<32 x i8> %a) nounwind {
533 ; SSE2-LABEL: test_bitreverse_v32i8:
534 ; SSE2:       # %bb.0:
535 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
536 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
537 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
538 ; SSE2-NEXT:    pand %xmm1, %xmm3
539 ; SSE2-NEXT:    psllw $4, %xmm3
540 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
541 ; SSE2-NEXT:    pandn %xmm3, %xmm4
542 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
543 ; SSE2-NEXT:    pand %xmm8, %xmm0
544 ; SSE2-NEXT:    psrlw $4, %xmm0
545 ; SSE2-NEXT:    pand %xmm1, %xmm0
546 ; SSE2-NEXT:    por %xmm4, %xmm0
547 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
548 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
549 ; SSE2-NEXT:    pand %xmm3, %xmm4
550 ; SSE2-NEXT:    psllw $2, %xmm4
551 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
552 ; SSE2-NEXT:    pand %xmm9, %xmm4
553 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204]
554 ; SSE2-NEXT:    pand %xmm10, %xmm0
555 ; SSE2-NEXT:    psrlw $2, %xmm0
556 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
557 ; SSE2-NEXT:    pand %xmm11, %xmm0
558 ; SSE2-NEXT:    por %xmm4, %xmm0
559 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170]
560 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
561 ; SSE2-NEXT:    pand %xmm4, %xmm5
562 ; SSE2-NEXT:    psrlw $1, %xmm5
563 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
564 ; SSE2-NEXT:    pand %xmm6, %xmm5
565 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
566 ; SSE2-NEXT:    pand %xmm7, %xmm0
567 ; SSE2-NEXT:    paddb %xmm0, %xmm0
568 ; SSE2-NEXT:    por %xmm5, %xmm0
569 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
570 ; SSE2-NEXT:    pand %xmm1, %xmm5
571 ; SSE2-NEXT:    psllw $4, %xmm5
572 ; SSE2-NEXT:    pand %xmm8, %xmm2
573 ; SSE2-NEXT:    psrlw $4, %xmm2
574 ; SSE2-NEXT:    pand %xmm1, %xmm2
575 ; SSE2-NEXT:    pandn %xmm5, %xmm1
576 ; SSE2-NEXT:    por %xmm2, %xmm1
577 ; SSE2-NEXT:    pand %xmm1, %xmm3
578 ; SSE2-NEXT:    psllw $2, %xmm3
579 ; SSE2-NEXT:    pand %xmm9, %xmm3
580 ; SSE2-NEXT:    pand %xmm10, %xmm1
581 ; SSE2-NEXT:    psrlw $2, %xmm1
582 ; SSE2-NEXT:    pand %xmm11, %xmm1
583 ; SSE2-NEXT:    por %xmm3, %xmm1
584 ; SSE2-NEXT:    pand %xmm1, %xmm4
585 ; SSE2-NEXT:    psrlw $1, %xmm4
586 ; SSE2-NEXT:    pand %xmm6, %xmm4
587 ; SSE2-NEXT:    pand %xmm7, %xmm1
588 ; SSE2-NEXT:    paddb %xmm1, %xmm1
589 ; SSE2-NEXT:    por %xmm4, %xmm1
590 ; SSE2-NEXT:    retq
592 ; SSSE3-LABEL: test_bitreverse_v32i8:
593 ; SSSE3:       # %bb.0:
594 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
595 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
596 ; SSSE3-NEXT:    pand %xmm4, %xmm2
597 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
598 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
599 ; SSSE3-NEXT:    pshufb %xmm2, %xmm6
600 ; SSSE3-NEXT:    psrlw $4, %xmm0
601 ; SSSE3-NEXT:    pand %xmm4, %xmm0
602 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
603 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
604 ; SSSE3-NEXT:    pshufb %xmm0, %xmm3
605 ; SSSE3-NEXT:    por %xmm6, %xmm3
606 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
607 ; SSSE3-NEXT:    pand %xmm4, %xmm0
608 ; SSSE3-NEXT:    pshufb %xmm0, %xmm5
609 ; SSSE3-NEXT:    psrlw $4, %xmm1
610 ; SSSE3-NEXT:    pand %xmm4, %xmm1
611 ; SSSE3-NEXT:    pshufb %xmm1, %xmm2
612 ; SSSE3-NEXT:    por %xmm5, %xmm2
613 ; SSSE3-NEXT:    movdqa %xmm3, %xmm0
614 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
615 ; SSSE3-NEXT:    retq
617 ; AVX1-LABEL: test_bitreverse_v32i8:
618 ; AVX1:       # %bb.0:
619 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
620 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
621 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm3
622 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
623 ; AVX1-NEXT:    vpshufb %xmm3, %xmm4, %xmm3
624 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
625 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
626 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
627 ; AVX1-NEXT:    vpshufb %xmm1, %xmm5, %xmm1
628 ; AVX1-NEXT:    vpor %xmm1, %xmm3, %xmm1
629 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm3
630 ; AVX1-NEXT:    vpshufb %xmm3, %xmm4, %xmm3
631 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
632 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
633 ; AVX1-NEXT:    vpshufb %xmm0, %xmm5, %xmm0
634 ; AVX1-NEXT:    vpor %xmm0, %xmm3, %xmm0
635 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
636 ; AVX1-NEXT:    retq
638 ; AVX2-LABEL: test_bitreverse_v32i8:
639 ; AVX2:       # %bb.0:
640 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
641 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
642 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
643 ; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
644 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
645 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
646 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
647 ; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
648 ; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
649 ; AVX2-NEXT:    retq
651 ; AVX512-LABEL: test_bitreverse_v32i8:
652 ; AVX512:       # %bb.0:
653 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
654 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
655 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
656 ; AVX512-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
657 ; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm0
658 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm0
659 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
660 ; AVX512-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
661 ; AVX512-NEXT:    vpor %ymm0, %ymm2, %ymm0
662 ; AVX512-NEXT:    retq
664 ; XOPAVX1-LABEL: test_bitreverse_v32i8:
665 ; XOPAVX1:       # %bb.0:
666 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
667 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]
668 ; XOPAVX1-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
669 ; XOPAVX1-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
670 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
671 ; XOPAVX1-NEXT:    retq
673 ; XOPAVX2-LABEL: test_bitreverse_v32i8:
674 ; XOPAVX2:       # %bb.0:
675 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
676 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]
677 ; XOPAVX2-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
678 ; XOPAVX2-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
679 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
680 ; XOPAVX2-NEXT:    retq
681   %b = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %a)
682   ret <32 x i8> %b
685 define <16 x i16> @test_bitreverse_v16i16(<16 x i16> %a) nounwind {
686 ; SSE2-LABEL: test_bitreverse_v16i16:
687 ; SSE2:       # %bb.0:
688 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
689 ; SSE2-NEXT:    pxor %xmm4, %xmm4
690 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
691 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15]
692 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,0,3,2,4,5,6,7]
693 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,4,7,6]
694 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
695 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7]
696 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6]
697 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
698 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
699 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
700 ; SSE2-NEXT:    pand %xmm1, %xmm3
701 ; SSE2-NEXT:    psllw $4, %xmm3
702 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
703 ; SSE2-NEXT:    pandn %xmm3, %xmm5
704 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
705 ; SSE2-NEXT:    pand %xmm8, %xmm0
706 ; SSE2-NEXT:    psrlw $4, %xmm0
707 ; SSE2-NEXT:    pand %xmm1, %xmm0
708 ; SSE2-NEXT:    por %xmm5, %xmm0
709 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
710 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
711 ; SSE2-NEXT:    pand %xmm3, %xmm5
712 ; SSE2-NEXT:    psllw $2, %xmm5
713 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
714 ; SSE2-NEXT:    pand %xmm9, %xmm5
715 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204]
716 ; SSE2-NEXT:    pand %xmm10, %xmm0
717 ; SSE2-NEXT:    psrlw $2, %xmm0
718 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
719 ; SSE2-NEXT:    pand %xmm11, %xmm0
720 ; SSE2-NEXT:    por %xmm5, %xmm0
721 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170]
722 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
723 ; SSE2-NEXT:    pand %xmm5, %xmm6
724 ; SSE2-NEXT:    psrlw $1, %xmm6
725 ; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
726 ; SSE2-NEXT:    pand %xmm12, %xmm6
727 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
728 ; SSE2-NEXT:    pand %xmm7, %xmm0
729 ; SSE2-NEXT:    paddb %xmm0, %xmm0
730 ; SSE2-NEXT:    por %xmm6, %xmm0
731 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
732 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm4[8],xmm6[9],xmm4[9],xmm6[10],xmm4[10],xmm6[11],xmm4[11],xmm6[12],xmm4[12],xmm6[13],xmm4[13],xmm6[14],xmm4[14],xmm6[15],xmm4[15]
733 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm6[1,0,3,2,4,5,6,7]
734 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,5,4,7,6]
735 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]
736 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[1,0,3,2,4,5,6,7]
737 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,4,7,6]
738 ; SSE2-NEXT:    packuswb %xmm6, %xmm2
739 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
740 ; SSE2-NEXT:    pand %xmm1, %xmm4
741 ; SSE2-NEXT:    psllw $4, %xmm4
742 ; SSE2-NEXT:    pand %xmm8, %xmm2
743 ; SSE2-NEXT:    psrlw $4, %xmm2
744 ; SSE2-NEXT:    pand %xmm1, %xmm2
745 ; SSE2-NEXT:    pandn %xmm4, %xmm1
746 ; SSE2-NEXT:    por %xmm2, %xmm1
747 ; SSE2-NEXT:    pand %xmm1, %xmm3
748 ; SSE2-NEXT:    psllw $2, %xmm3
749 ; SSE2-NEXT:    pand %xmm9, %xmm3
750 ; SSE2-NEXT:    pand %xmm10, %xmm1
751 ; SSE2-NEXT:    psrlw $2, %xmm1
752 ; SSE2-NEXT:    pand %xmm11, %xmm1
753 ; SSE2-NEXT:    por %xmm3, %xmm1
754 ; SSE2-NEXT:    pand %xmm1, %xmm5
755 ; SSE2-NEXT:    psrlw $1, %xmm5
756 ; SSE2-NEXT:    pand %xmm12, %xmm5
757 ; SSE2-NEXT:    pand %xmm7, %xmm1
758 ; SSE2-NEXT:    paddb %xmm1, %xmm1
759 ; SSE2-NEXT:    por %xmm5, %xmm1
760 ; SSE2-NEXT:    retq
762 ; SSSE3-LABEL: test_bitreverse_v16i16:
763 ; SSSE3:       # %bb.0:
764 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
765 ; SSSE3-NEXT:    pshufb %xmm4, %xmm0
766 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
767 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
768 ; SSSE3-NEXT:    pand %xmm5, %xmm2
769 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
770 ; SSSE3-NEXT:    movdqa %xmm6, %xmm7
771 ; SSSE3-NEXT:    pshufb %xmm2, %xmm7
772 ; SSSE3-NEXT:    psrlw $4, %xmm0
773 ; SSSE3-NEXT:    pand %xmm5, %xmm0
774 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
775 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
776 ; SSSE3-NEXT:    pshufb %xmm0, %xmm3
777 ; SSSE3-NEXT:    por %xmm7, %xmm3
778 ; SSSE3-NEXT:    pshufb %xmm4, %xmm1
779 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
780 ; SSSE3-NEXT:    pand %xmm5, %xmm0
781 ; SSSE3-NEXT:    pshufb %xmm0, %xmm6
782 ; SSSE3-NEXT:    psrlw $4, %xmm1
783 ; SSSE3-NEXT:    pand %xmm5, %xmm1
784 ; SSSE3-NEXT:    pshufb %xmm1, %xmm2
785 ; SSSE3-NEXT:    por %xmm6, %xmm2
786 ; SSSE3-NEXT:    movdqa %xmm3, %xmm0
787 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
788 ; SSSE3-NEXT:    retq
790 ; AVX1-LABEL: test_bitreverse_v16i16:
791 ; AVX1:       # %bb.0:
792 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
793 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
794 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
795 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
796 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4
797 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
798 ; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
799 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
800 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
801 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
802 ; AVX1-NEXT:    vpshufb %xmm1, %xmm6, %xmm1
803 ; AVX1-NEXT:    vpor %xmm1, %xmm4, %xmm1
804 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
805 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm2
806 ; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2
807 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
808 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
809 ; AVX1-NEXT:    vpshufb %xmm0, %xmm6, %xmm0
810 ; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
811 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
812 ; AVX1-NEXT:    retq
814 ; AVX2-LABEL: test_bitreverse_v16i16:
815 ; AVX2:       # %bb.0:
816 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30]
817 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
818 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
819 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
820 ; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
821 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
822 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
823 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
824 ; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
825 ; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
826 ; AVX2-NEXT:    retq
828 ; AVX512-LABEL: test_bitreverse_v16i16:
829 ; AVX512:       # %bb.0:
830 ; AVX512-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30]
831 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
832 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
833 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
834 ; AVX512-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
835 ; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm0
836 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm0
837 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
838 ; AVX512-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
839 ; AVX512-NEXT:    vpor %ymm0, %ymm2, %ymm0
840 ; AVX512-NEXT:    retq
842 ; XOPAVX1-LABEL: test_bitreverse_v16i16:
843 ; XOPAVX1:       # %bb.0:
844 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
845 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]
846 ; XOPAVX1-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
847 ; XOPAVX1-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
848 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
849 ; XOPAVX1-NEXT:    retq
851 ; XOPAVX2-LABEL: test_bitreverse_v16i16:
852 ; XOPAVX2:       # %bb.0:
853 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
854 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]
855 ; XOPAVX2-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
856 ; XOPAVX2-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
857 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
858 ; XOPAVX2-NEXT:    retq
859   %b = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a)
860   ret <16 x i16> %b
863 define <8 x i32> @test_bitreverse_v8i32(<8 x i32> %a) nounwind {
864 ; SSE2-LABEL: test_bitreverse_v8i32:
865 ; SSE2:       # %bb.0:
866 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
867 ; SSE2-NEXT:    pxor %xmm4, %xmm4
868 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
869 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15]
870 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]
871 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]
872 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
873 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
874 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
875 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
876 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
877 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
878 ; SSE2-NEXT:    pand %xmm1, %xmm3
879 ; SSE2-NEXT:    psllw $4, %xmm3
880 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
881 ; SSE2-NEXT:    pandn %xmm3, %xmm5
882 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
883 ; SSE2-NEXT:    pand %xmm8, %xmm0
884 ; SSE2-NEXT:    psrlw $4, %xmm0
885 ; SSE2-NEXT:    pand %xmm1, %xmm0
886 ; SSE2-NEXT:    por %xmm5, %xmm0
887 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
888 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
889 ; SSE2-NEXT:    pand %xmm3, %xmm5
890 ; SSE2-NEXT:    psllw $2, %xmm5
891 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
892 ; SSE2-NEXT:    pand %xmm9, %xmm5
893 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204]
894 ; SSE2-NEXT:    pand %xmm10, %xmm0
895 ; SSE2-NEXT:    psrlw $2, %xmm0
896 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
897 ; SSE2-NEXT:    pand %xmm11, %xmm0
898 ; SSE2-NEXT:    por %xmm5, %xmm0
899 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170]
900 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
901 ; SSE2-NEXT:    pand %xmm5, %xmm6
902 ; SSE2-NEXT:    psrlw $1, %xmm6
903 ; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
904 ; SSE2-NEXT:    pand %xmm12, %xmm6
905 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
906 ; SSE2-NEXT:    pand %xmm7, %xmm0
907 ; SSE2-NEXT:    paddb %xmm0, %xmm0
908 ; SSE2-NEXT:    por %xmm6, %xmm0
909 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
910 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm4[8],xmm6[9],xmm4[9],xmm6[10],xmm4[10],xmm6[11],xmm4[11],xmm6[12],xmm4[12],xmm6[13],xmm4[13],xmm6[14],xmm4[14],xmm6[15],xmm4[15]
911 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]
912 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]
913 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]
914 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
915 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
916 ; SSE2-NEXT:    packuswb %xmm6, %xmm2
917 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
918 ; SSE2-NEXT:    pand %xmm1, %xmm4
919 ; SSE2-NEXT:    psllw $4, %xmm4
920 ; SSE2-NEXT:    pand %xmm8, %xmm2
921 ; SSE2-NEXT:    psrlw $4, %xmm2
922 ; SSE2-NEXT:    pand %xmm1, %xmm2
923 ; SSE2-NEXT:    pandn %xmm4, %xmm1
924 ; SSE2-NEXT:    por %xmm2, %xmm1
925 ; SSE2-NEXT:    pand %xmm1, %xmm3
926 ; SSE2-NEXT:    psllw $2, %xmm3
927 ; SSE2-NEXT:    pand %xmm9, %xmm3
928 ; SSE2-NEXT:    pand %xmm10, %xmm1
929 ; SSE2-NEXT:    psrlw $2, %xmm1
930 ; SSE2-NEXT:    pand %xmm11, %xmm1
931 ; SSE2-NEXT:    por %xmm3, %xmm1
932 ; SSE2-NEXT:    pand %xmm1, %xmm5
933 ; SSE2-NEXT:    psrlw $1, %xmm5
934 ; SSE2-NEXT:    pand %xmm12, %xmm5
935 ; SSE2-NEXT:    pand %xmm7, %xmm1
936 ; SSE2-NEXT:    paddb %xmm1, %xmm1
937 ; SSE2-NEXT:    por %xmm5, %xmm1
938 ; SSE2-NEXT:    retq
940 ; SSSE3-LABEL: test_bitreverse_v8i32:
941 ; SSSE3:       # %bb.0:
942 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
943 ; SSSE3-NEXT:    pshufb %xmm4, %xmm0
944 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
945 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
946 ; SSSE3-NEXT:    pand %xmm5, %xmm2
947 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
948 ; SSSE3-NEXT:    movdqa %xmm6, %xmm7
949 ; SSSE3-NEXT:    pshufb %xmm2, %xmm7
950 ; SSSE3-NEXT:    psrlw $4, %xmm0
951 ; SSSE3-NEXT:    pand %xmm5, %xmm0
952 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
953 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
954 ; SSSE3-NEXT:    pshufb %xmm0, %xmm3
955 ; SSSE3-NEXT:    por %xmm7, %xmm3
956 ; SSSE3-NEXT:    pshufb %xmm4, %xmm1
957 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
958 ; SSSE3-NEXT:    pand %xmm5, %xmm0
959 ; SSSE3-NEXT:    pshufb %xmm0, %xmm6
960 ; SSSE3-NEXT:    psrlw $4, %xmm1
961 ; SSSE3-NEXT:    pand %xmm5, %xmm1
962 ; SSSE3-NEXT:    pshufb %xmm1, %xmm2
963 ; SSSE3-NEXT:    por %xmm6, %xmm2
964 ; SSSE3-NEXT:    movdqa %xmm3, %xmm0
965 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
966 ; SSSE3-NEXT:    retq
968 ; AVX1-LABEL: test_bitreverse_v8i32:
969 ; AVX1:       # %bb.0:
970 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
971 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
972 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
973 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
974 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4
975 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
976 ; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
977 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
978 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
979 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
980 ; AVX1-NEXT:    vpshufb %xmm1, %xmm6, %xmm1
981 ; AVX1-NEXT:    vpor %xmm1, %xmm4, %xmm1
982 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
983 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm2
984 ; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2
985 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
986 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
987 ; AVX1-NEXT:    vpshufb %xmm0, %xmm6, %xmm0
988 ; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
989 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
990 ; AVX1-NEXT:    retq
992 ; AVX2-LABEL: test_bitreverse_v8i32:
993 ; AVX2:       # %bb.0:
994 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28]
995 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
996 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
997 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
998 ; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
999 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1000 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1001 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1002 ; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1003 ; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
1004 ; AVX2-NEXT:    retq
1006 ; AVX512-LABEL: test_bitreverse_v8i32:
1007 ; AVX512:       # %bb.0:
1008 ; AVX512-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28]
1009 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1010 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
1011 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1012 ; AVX512-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1013 ; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm0
1014 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm0
1015 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1016 ; AVX512-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1017 ; AVX512-NEXT:    vpor %ymm0, %ymm2, %ymm0
1018 ; AVX512-NEXT:    retq
1020 ; XOPAVX1-LABEL: test_bitreverse_v8i32:
1021 ; XOPAVX1:       # %bb.0:
1022 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1023 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]
1024 ; XOPAVX1-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1025 ; XOPAVX1-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1026 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1027 ; XOPAVX1-NEXT:    retq
1029 ; XOPAVX2-LABEL: test_bitreverse_v8i32:
1030 ; XOPAVX2:       # %bb.0:
1031 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1032 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]
1033 ; XOPAVX2-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1034 ; XOPAVX2-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1035 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1036 ; XOPAVX2-NEXT:    retq
1037   %b = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %a)
1038   ret <8 x i32> %b
1041 define <4 x i64> @test_bitreverse_v4i64(<4 x i64> %a) nounwind {
1042 ; SSE2-LABEL: test_bitreverse_v4i64:
1043 ; SSE2:       # %bb.0:
1044 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1045 ; SSE2-NEXT:    pxor %xmm4, %xmm4
1046 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1047 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15]
1048 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1049 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]
1050 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]
1051 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
1052 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1053 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
1054 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
1055 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
1056 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1057 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1058 ; SSE2-NEXT:    pand %xmm1, %xmm3
1059 ; SSE2-NEXT:    psllw $4, %xmm3
1060 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
1061 ; SSE2-NEXT:    pandn %xmm3, %xmm5
1062 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
1063 ; SSE2-NEXT:    pand %xmm8, %xmm0
1064 ; SSE2-NEXT:    psrlw $4, %xmm0
1065 ; SSE2-NEXT:    pand %xmm1, %xmm0
1066 ; SSE2-NEXT:    por %xmm5, %xmm0
1067 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1068 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1069 ; SSE2-NEXT:    pand %xmm3, %xmm5
1070 ; SSE2-NEXT:    psllw $2, %xmm5
1071 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
1072 ; SSE2-NEXT:    pand %xmm9, %xmm5
1073 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204]
1074 ; SSE2-NEXT:    pand %xmm10, %xmm0
1075 ; SSE2-NEXT:    psrlw $2, %xmm0
1076 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
1077 ; SSE2-NEXT:    pand %xmm11, %xmm0
1078 ; SSE2-NEXT:    por %xmm5, %xmm0
1079 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170]
1080 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
1081 ; SSE2-NEXT:    pand %xmm5, %xmm6
1082 ; SSE2-NEXT:    psrlw $1, %xmm6
1083 ; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
1084 ; SSE2-NEXT:    pand %xmm12, %xmm6
1085 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
1086 ; SSE2-NEXT:    pand %xmm7, %xmm0
1087 ; SSE2-NEXT:    paddb %xmm0, %xmm0
1088 ; SSE2-NEXT:    por %xmm6, %xmm0
1089 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
1090 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm4[8],xmm6[9],xmm4[9],xmm6[10],xmm4[10],xmm6[11],xmm4[11],xmm6[12],xmm4[12],xmm6[13],xmm4[13],xmm6[14],xmm4[14],xmm6[15],xmm4[15]
1091 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[2,3,0,1]
1092 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]
1093 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]
1094 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]
1095 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
1096 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
1097 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
1098 ; SSE2-NEXT:    packuswb %xmm6, %xmm2
1099 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1100 ; SSE2-NEXT:    pand %xmm1, %xmm4
1101 ; SSE2-NEXT:    psllw $4, %xmm4
1102 ; SSE2-NEXT:    pand %xmm8, %xmm2
1103 ; SSE2-NEXT:    psrlw $4, %xmm2
1104 ; SSE2-NEXT:    pand %xmm1, %xmm2
1105 ; SSE2-NEXT:    pandn %xmm4, %xmm1
1106 ; SSE2-NEXT:    por %xmm2, %xmm1
1107 ; SSE2-NEXT:    pand %xmm1, %xmm3
1108 ; SSE2-NEXT:    psllw $2, %xmm3
1109 ; SSE2-NEXT:    pand %xmm9, %xmm3
1110 ; SSE2-NEXT:    pand %xmm10, %xmm1
1111 ; SSE2-NEXT:    psrlw $2, %xmm1
1112 ; SSE2-NEXT:    pand %xmm11, %xmm1
1113 ; SSE2-NEXT:    por %xmm3, %xmm1
1114 ; SSE2-NEXT:    pand %xmm1, %xmm5
1115 ; SSE2-NEXT:    psrlw $1, %xmm5
1116 ; SSE2-NEXT:    pand %xmm12, %xmm5
1117 ; SSE2-NEXT:    pand %xmm7, %xmm1
1118 ; SSE2-NEXT:    paddb %xmm1, %xmm1
1119 ; SSE2-NEXT:    por %xmm5, %xmm1
1120 ; SSE2-NEXT:    retq
1122 ; SSSE3-LABEL: test_bitreverse_v4i64:
1123 ; SSSE3:       # %bb.0:
1124 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1125 ; SSSE3-NEXT:    pshufb %xmm4, %xmm0
1126 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1127 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1128 ; SSSE3-NEXT:    pand %xmm5, %xmm2
1129 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1130 ; SSSE3-NEXT:    movdqa %xmm6, %xmm7
1131 ; SSSE3-NEXT:    pshufb %xmm2, %xmm7
1132 ; SSSE3-NEXT:    psrlw $4, %xmm0
1133 ; SSSE3-NEXT:    pand %xmm5, %xmm0
1134 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1135 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1136 ; SSSE3-NEXT:    pshufb %xmm0, %xmm3
1137 ; SSSE3-NEXT:    por %xmm7, %xmm3
1138 ; SSSE3-NEXT:    pshufb %xmm4, %xmm1
1139 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1140 ; SSSE3-NEXT:    pand %xmm5, %xmm0
1141 ; SSSE3-NEXT:    pshufb %xmm0, %xmm6
1142 ; SSSE3-NEXT:    psrlw $4, %xmm1
1143 ; SSSE3-NEXT:    pand %xmm5, %xmm1
1144 ; SSSE3-NEXT:    pshufb %xmm1, %xmm2
1145 ; SSSE3-NEXT:    por %xmm6, %xmm2
1146 ; SSSE3-NEXT:    movdqa %xmm3, %xmm0
1147 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1148 ; SSSE3-NEXT:    retq
1150 ; AVX1-LABEL: test_bitreverse_v4i64:
1151 ; AVX1:       # %bb.0:
1152 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1153 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1154 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1155 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1156 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4
1157 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1158 ; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
1159 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
1160 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
1161 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1162 ; AVX1-NEXT:    vpshufb %xmm1, %xmm6, %xmm1
1163 ; AVX1-NEXT:    vpor %xmm1, %xmm4, %xmm1
1164 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1165 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm2
1166 ; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2
1167 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
1168 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1169 ; AVX1-NEXT:    vpshufb %xmm0, %xmm6, %xmm0
1170 ; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
1171 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1172 ; AVX1-NEXT:    retq
1174 ; AVX2-LABEL: test_bitreverse_v4i64:
1175 ; AVX2:       # %bb.0:
1176 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24]
1177 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1178 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
1179 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1180 ; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1181 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1182 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1183 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1184 ; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1185 ; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
1186 ; AVX2-NEXT:    retq
1188 ; AVX512-LABEL: test_bitreverse_v4i64:
1189 ; AVX512:       # %bb.0:
1190 ; AVX512-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24]
1191 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1192 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
1193 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1194 ; AVX512-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1195 ; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm0
1196 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm0
1197 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1198 ; AVX512-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1199 ; AVX512-NEXT:    vpor %ymm0, %ymm2, %ymm0
1200 ; AVX512-NEXT:    retq
1202 ; XOPAVX1-LABEL: test_bitreverse_v4i64:
1203 ; XOPAVX1:       # %bb.0:
1204 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1205 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]
1206 ; XOPAVX1-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1207 ; XOPAVX1-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1208 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1209 ; XOPAVX1-NEXT:    retq
1211 ; XOPAVX2-LABEL: test_bitreverse_v4i64:
1212 ; XOPAVX2:       # %bb.0:
1213 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1214 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]
1215 ; XOPAVX2-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1216 ; XOPAVX2-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1217 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1218 ; XOPAVX2-NEXT:    retq
1219   %b = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %a)
1220   ret <4 x i64> %b
1223 define <64 x i8> @test_bitreverse_v64i8(<64 x i8> %a) nounwind {
1224 ; SSE2-LABEL: test_bitreverse_v64i8:
1225 ; SSE2:       # %bb.0:
1226 ; SSE2-NEXT:    movdqa %xmm3, %xmm14
1227 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1228 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1229 ; SSE2-NEXT:    pand %xmm3, %xmm5
1230 ; SSE2-NEXT:    psllw $4, %xmm5
1231 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
1232 ; SSE2-NEXT:    pandn %xmm5, %xmm6
1233 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
1234 ; SSE2-NEXT:    pand %xmm9, %xmm0
1235 ; SSE2-NEXT:    psrlw $4, %xmm0
1236 ; SSE2-NEXT:    pand %xmm3, %xmm0
1237 ; SSE2-NEXT:    por %xmm6, %xmm0
1238 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1239 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
1240 ; SSE2-NEXT:    pand %xmm5, %xmm6
1241 ; SSE2-NEXT:    psllw $2, %xmm6
1242 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
1243 ; SSE2-NEXT:    pand %xmm8, %xmm6
1244 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204]
1245 ; SSE2-NEXT:    pand %xmm10, %xmm0
1246 ; SSE2-NEXT:    psrlw $2, %xmm0
1247 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
1248 ; SSE2-NEXT:    pand %xmm11, %xmm0
1249 ; SSE2-NEXT:    por %xmm6, %xmm0
1250 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170]
1251 ; SSE2-NEXT:    movdqa %xmm0, %xmm7
1252 ; SSE2-NEXT:    pand %xmm6, %xmm7
1253 ; SSE2-NEXT:    psrlw $1, %xmm7
1254 ; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
1255 ; SSE2-NEXT:    pand %xmm12, %xmm7
1256 ; SSE2-NEXT:    movdqa {{.*#+}} xmm13 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
1257 ; SSE2-NEXT:    pand %xmm13, %xmm0
1258 ; SSE2-NEXT:    paddb %xmm0, %xmm0
1259 ; SSE2-NEXT:    por %xmm7, %xmm0
1260 ; SSE2-NEXT:    movdqa %xmm1, %xmm7
1261 ; SSE2-NEXT:    pand %xmm3, %xmm7
1262 ; SSE2-NEXT:    psllw $4, %xmm7
1263 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1264 ; SSE2-NEXT:    pandn %xmm7, %xmm4
1265 ; SSE2-NEXT:    pand %xmm9, %xmm1
1266 ; SSE2-NEXT:    psrlw $4, %xmm1
1267 ; SSE2-NEXT:    pand %xmm3, %xmm1
1268 ; SSE2-NEXT:    por %xmm4, %xmm1
1269 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1270 ; SSE2-NEXT:    pand %xmm5, %xmm4
1271 ; SSE2-NEXT:    psllw $2, %xmm4
1272 ; SSE2-NEXT:    pand %xmm8, %xmm4
1273 ; SSE2-NEXT:    pand %xmm10, %xmm1
1274 ; SSE2-NEXT:    psrlw $2, %xmm1
1275 ; SSE2-NEXT:    pand %xmm11, %xmm1
1276 ; SSE2-NEXT:    por %xmm4, %xmm1
1277 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1278 ; SSE2-NEXT:    pand %xmm6, %xmm4
1279 ; SSE2-NEXT:    psrlw $1, %xmm4
1280 ; SSE2-NEXT:    pand %xmm12, %xmm4
1281 ; SSE2-NEXT:    pand %xmm13, %xmm1
1282 ; SSE2-NEXT:    paddb %xmm1, %xmm1
1283 ; SSE2-NEXT:    por %xmm4, %xmm1
1284 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1285 ; SSE2-NEXT:    pand %xmm3, %xmm4
1286 ; SSE2-NEXT:    psllw $4, %xmm4
1287 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
1288 ; SSE2-NEXT:    pandn %xmm4, %xmm7
1289 ; SSE2-NEXT:    pand %xmm9, %xmm2
1290 ; SSE2-NEXT:    psrlw $4, %xmm2
1291 ; SSE2-NEXT:    pand %xmm3, %xmm2
1292 ; SSE2-NEXT:    por %xmm7, %xmm2
1293 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1294 ; SSE2-NEXT:    pand %xmm5, %xmm4
1295 ; SSE2-NEXT:    psllw $2, %xmm4
1296 ; SSE2-NEXT:    pand %xmm8, %xmm4
1297 ; SSE2-NEXT:    pand %xmm10, %xmm2
1298 ; SSE2-NEXT:    psrlw $2, %xmm2
1299 ; SSE2-NEXT:    pand %xmm11, %xmm2
1300 ; SSE2-NEXT:    por %xmm4, %xmm2
1301 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1302 ; SSE2-NEXT:    pand %xmm6, %xmm4
1303 ; SSE2-NEXT:    psrlw $1, %xmm4
1304 ; SSE2-NEXT:    pand %xmm12, %xmm4
1305 ; SSE2-NEXT:    pand %xmm13, %xmm2
1306 ; SSE2-NEXT:    paddb %xmm2, %xmm2
1307 ; SSE2-NEXT:    por %xmm4, %xmm2
1308 ; SSE2-NEXT:    movdqa %xmm14, %xmm4
1309 ; SSE2-NEXT:    pand %xmm3, %xmm4
1310 ; SSE2-NEXT:    psllw $4, %xmm4
1311 ; SSE2-NEXT:    pand %xmm9, %xmm14
1312 ; SSE2-NEXT:    psrlw $4, %xmm14
1313 ; SSE2-NEXT:    pand %xmm3, %xmm14
1314 ; SSE2-NEXT:    pandn %xmm4, %xmm3
1315 ; SSE2-NEXT:    por %xmm14, %xmm3
1316 ; SSE2-NEXT:    pand %xmm3, %xmm5
1317 ; SSE2-NEXT:    psllw $2, %xmm5
1318 ; SSE2-NEXT:    pand %xmm8, %xmm5
1319 ; SSE2-NEXT:    pand %xmm10, %xmm3
1320 ; SSE2-NEXT:    psrlw $2, %xmm3
1321 ; SSE2-NEXT:    pand %xmm11, %xmm3
1322 ; SSE2-NEXT:    por %xmm5, %xmm3
1323 ; SSE2-NEXT:    pand %xmm3, %xmm6
1324 ; SSE2-NEXT:    psrlw $1, %xmm6
1325 ; SSE2-NEXT:    pand %xmm12, %xmm6
1326 ; SSE2-NEXT:    pand %xmm13, %xmm3
1327 ; SSE2-NEXT:    paddb %xmm3, %xmm3
1328 ; SSE2-NEXT:    por %xmm6, %xmm3
1329 ; SSE2-NEXT:    retq
1331 ; SSSE3-LABEL: test_bitreverse_v64i8:
1332 ; SSSE3:       # %bb.0:
1333 ; SSSE3-NEXT:    movdqa %xmm0, %xmm5
1334 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1335 ; SSSE3-NEXT:    pand %xmm8, %xmm0
1336 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1337 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
1338 ; SSSE3-NEXT:    pshufb %xmm0, %xmm6
1339 ; SSSE3-NEXT:    psrlw $4, %xmm5
1340 ; SSSE3-NEXT:    pand %xmm8, %xmm5
1341 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1342 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1343 ; SSSE3-NEXT:    pshufb %xmm5, %xmm0
1344 ; SSSE3-NEXT:    por %xmm6, %xmm0
1345 ; SSSE3-NEXT:    movdqa %xmm1, %xmm5
1346 ; SSSE3-NEXT:    pand %xmm8, %xmm5
1347 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
1348 ; SSSE3-NEXT:    pshufb %xmm5, %xmm6
1349 ; SSSE3-NEXT:    psrlw $4, %xmm1
1350 ; SSSE3-NEXT:    pand %xmm8, %xmm1
1351 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1352 ; SSSE3-NEXT:    pshufb %xmm1, %xmm5
1353 ; SSSE3-NEXT:    por %xmm6, %xmm5
1354 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1355 ; SSSE3-NEXT:    pand %xmm8, %xmm1
1356 ; SSSE3-NEXT:    movdqa %xmm9, %xmm7
1357 ; SSSE3-NEXT:    pshufb %xmm1, %xmm7
1358 ; SSSE3-NEXT:    psrlw $4, %xmm2
1359 ; SSSE3-NEXT:    pand %xmm8, %xmm2
1360 ; SSSE3-NEXT:    movdqa %xmm4, %xmm6
1361 ; SSSE3-NEXT:    pshufb %xmm2, %xmm6
1362 ; SSSE3-NEXT:    por %xmm7, %xmm6
1363 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
1364 ; SSSE3-NEXT:    pand %xmm8, %xmm1
1365 ; SSSE3-NEXT:    pshufb %xmm1, %xmm9
1366 ; SSSE3-NEXT:    psrlw $4, %xmm3
1367 ; SSSE3-NEXT:    pand %xmm8, %xmm3
1368 ; SSSE3-NEXT:    pshufb %xmm3, %xmm4
1369 ; SSSE3-NEXT:    por %xmm9, %xmm4
1370 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
1371 ; SSSE3-NEXT:    movdqa %xmm6, %xmm2
1372 ; SSSE3-NEXT:    movdqa %xmm4, %xmm3
1373 ; SSSE3-NEXT:    retq
1375 ; AVX1-LABEL: test_bitreverse_v64i8:
1376 ; AVX1:       # %bb.0:
1377 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1378 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1379 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm4
1380 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1381 ; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
1382 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
1383 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1384 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1385 ; AVX1-NEXT:    vpshufb %xmm2, %xmm6, %xmm2
1386 ; AVX1-NEXT:    vpor %xmm2, %xmm4, %xmm2
1387 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm4
1388 ; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
1389 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
1390 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1391 ; AVX1-NEXT:    vpshufb %xmm0, %xmm6, %xmm0
1392 ; AVX1-NEXT:    vpor %xmm0, %xmm4, %xmm0
1393 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1394 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1395 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm4
1396 ; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
1397 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
1398 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1399 ; AVX1-NEXT:    vpshufb %xmm2, %xmm6, %xmm2
1400 ; AVX1-NEXT:    vpor %xmm2, %xmm4, %xmm2
1401 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4
1402 ; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
1403 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
1404 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
1405 ; AVX1-NEXT:    vpshufb %xmm1, %xmm6, %xmm1
1406 ; AVX1-NEXT:    vpor %xmm1, %xmm4, %xmm1
1407 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1408 ; AVX1-NEXT:    retq
1410 ; AVX2-LABEL: test_bitreverse_v64i8:
1411 ; AVX2:       # %bb.0:
1412 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1413 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm3
1414 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1415 ; AVX2-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
1416 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1417 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
1418 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1419 ; AVX2-NEXT:    vpshufb %ymm0, %ymm5, %ymm0
1420 ; AVX2-NEXT:    vpor %ymm0, %ymm3, %ymm0
1421 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm3
1422 ; AVX2-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
1423 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
1424 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
1425 ; AVX2-NEXT:    vpshufb %ymm1, %ymm5, %ymm1
1426 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1427 ; AVX2-NEXT:    retq
1429 ; AVX512F-LABEL: test_bitreverse_v64i8:
1430 ; AVX512F:       # %bb.0:
1431 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1432 ; AVX512F-NEXT:    vpand %ymm2, %ymm0, %ymm3
1433 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1434 ; AVX512F-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
1435 ; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm0
1436 ; AVX512F-NEXT:    vpand %ymm2, %ymm0, %ymm0
1437 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm5 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1438 ; AVX512F-NEXT:    vpshufb %ymm0, %ymm5, %ymm0
1439 ; AVX512F-NEXT:    vpor %ymm0, %ymm3, %ymm0
1440 ; AVX512F-NEXT:    vpand %ymm2, %ymm1, %ymm3
1441 ; AVX512F-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
1442 ; AVX512F-NEXT:    vpsrlw $4, %ymm1, %ymm1
1443 ; AVX512F-NEXT:    vpand %ymm2, %ymm1, %ymm1
1444 ; AVX512F-NEXT:    vpshufb %ymm1, %ymm5, %ymm1
1445 ; AVX512F-NEXT:    vpor %ymm1, %ymm3, %ymm1
1446 ; AVX512F-NEXT:    retq
1448 ; AVX512BW-LABEL: test_bitreverse_v64i8:
1449 ; AVX512BW:       # %bb.0:
1450 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1451 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
1452 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1453 ; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
1454 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
1455 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
1456 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1457 ; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm0
1458 ; AVX512BW-NEXT:    vporq %zmm0, %zmm2, %zmm0
1459 ; AVX512BW-NEXT:    retq
1461 ; XOPAVX1-LABEL: test_bitreverse_v64i8:
1462 ; XOPAVX1:       # %bb.0:
1463 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1464 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]
1465 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
1466 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
1467 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1468 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1469 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
1470 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
1471 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1472 ; XOPAVX1-NEXT:    retq
1474 ; XOPAVX2-LABEL: test_bitreverse_v64i8:
1475 ; XOPAVX2:       # %bb.0:
1476 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
1477 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]
1478 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
1479 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
1480 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1481 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
1482 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
1483 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
1484 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
1485 ; XOPAVX2-NEXT:    retq
1486   %b = call <64 x i8> @llvm.bitreverse.v64i8(<64 x i8> %a)
1487   ret <64 x i8> %b
1490 define <32 x i16> @test_bitreverse_v32i16(<32 x i16> %a) nounwind {
1491 ; SSE2-LABEL: test_bitreverse_v32i16:
1492 ; SSE2:       # %bb.0:
1493 ; SSE2-NEXT:    movdqa %xmm3, %xmm15
1494 ; SSE2-NEXT:    pxor %xmm14, %xmm14
1495 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1496 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm14[8],xmm3[9],xmm14[9],xmm3[10],xmm14[10],xmm3[11],xmm14[11],xmm3[12],xmm14[12],xmm3[13],xmm14[13],xmm3[14],xmm14[14],xmm3[15],xmm14[15]
1497 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[1,0,3,2,4,5,6,7]
1498 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,4,7,6]
1499 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm14[0],xmm0[1],xmm14[1],xmm0[2],xmm14[2],xmm0[3],xmm14[3],xmm0[4],xmm14[4],xmm0[5],xmm14[5],xmm0[6],xmm14[6],xmm0[7],xmm14[7]
1500 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7]
1501 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6]
1502 ; SSE2-NEXT:    packuswb %xmm3, %xmm0
1503 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1504 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1505 ; SSE2-NEXT:    pand %xmm3, %xmm5
1506 ; SSE2-NEXT:    psllw $4, %xmm5
1507 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
1508 ; SSE2-NEXT:    pandn %xmm5, %xmm7
1509 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
1510 ; SSE2-NEXT:    pand %xmm8, %xmm0
1511 ; SSE2-NEXT:    psrlw $4, %xmm0
1512 ; SSE2-NEXT:    pand %xmm3, %xmm0
1513 ; SSE2-NEXT:    por %xmm7, %xmm0
1514 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1515 ; SSE2-NEXT:    movdqa %xmm0, %xmm7
1516 ; SSE2-NEXT:    pand %xmm5, %xmm7
1517 ; SSE2-NEXT:    psllw $2, %xmm7
1518 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
1519 ; SSE2-NEXT:    pand %xmm9, %xmm7
1520 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204]
1521 ; SSE2-NEXT:    pand %xmm10, %xmm0
1522 ; SSE2-NEXT:    psrlw $2, %xmm0
1523 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
1524 ; SSE2-NEXT:    pand %xmm11, %xmm0
1525 ; SSE2-NEXT:    por %xmm7, %xmm0
1526 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170]
1527 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
1528 ; SSE2-NEXT:    pand %xmm7, %xmm6
1529 ; SSE2-NEXT:    psrlw $1, %xmm6
1530 ; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
1531 ; SSE2-NEXT:    pand %xmm12, %xmm6
1532 ; SSE2-NEXT:    movdqa {{.*#+}} xmm13 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
1533 ; SSE2-NEXT:    pand %xmm13, %xmm0
1534 ; SSE2-NEXT:    paddb %xmm0, %xmm0
1535 ; SSE2-NEXT:    por %xmm6, %xmm0
1536 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
1537 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm14[8],xmm6[9],xmm14[9],xmm6[10],xmm14[10],xmm6[11],xmm14[11],xmm6[12],xmm14[12],xmm6[13],xmm14[13],xmm6[14],xmm14[14],xmm6[15],xmm14[15]
1538 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm6[1,0,3,2,4,5,6,7]
1539 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,5,4,7,6]
1540 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm14[0],xmm1[1],xmm14[1],xmm1[2],xmm14[2],xmm1[3],xmm14[3],xmm1[4],xmm14[4],xmm1[5],xmm14[5],xmm1[6],xmm14[6],xmm1[7],xmm14[7]
1541 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,0,3,2,4,5,6,7]
1542 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,4,7,6]
1543 ; SSE2-NEXT:    packuswb %xmm6, %xmm1
1544 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
1545 ; SSE2-NEXT:    pand %xmm3, %xmm6
1546 ; SSE2-NEXT:    psllw $4, %xmm6
1547 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1548 ; SSE2-NEXT:    pandn %xmm6, %xmm4
1549 ; SSE2-NEXT:    pand %xmm8, %xmm1
1550 ; SSE2-NEXT:    psrlw $4, %xmm1
1551 ; SSE2-NEXT:    pand %xmm3, %xmm1
1552 ; SSE2-NEXT:    por %xmm4, %xmm1
1553 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1554 ; SSE2-NEXT:    pand %xmm5, %xmm4
1555 ; SSE2-NEXT:    psllw $2, %xmm4
1556 ; SSE2-NEXT:    pand %xmm9, %xmm4
1557 ; SSE2-NEXT:    pand %xmm10, %xmm1
1558 ; SSE2-NEXT:    psrlw $2, %xmm1
1559 ; SSE2-NEXT:    pand %xmm11, %xmm1
1560 ; SSE2-NEXT:    por %xmm4, %xmm1
1561 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1562 ; SSE2-NEXT:    pand %xmm7, %xmm4
1563 ; SSE2-NEXT:    psrlw $1, %xmm4
1564 ; SSE2-NEXT:    pand %xmm12, %xmm4
1565 ; SSE2-NEXT:    pand %xmm13, %xmm1
1566 ; SSE2-NEXT:    paddb %xmm1, %xmm1
1567 ; SSE2-NEXT:    por %xmm4, %xmm1
1568 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1569 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm14[8],xmm4[9],xmm14[9],xmm4[10],xmm14[10],xmm4[11],xmm14[11],xmm4[12],xmm14[12],xmm4[13],xmm14[13],xmm4[14],xmm14[14],xmm4[15],xmm14[15]
1570 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[1,0,3,2,4,5,6,7]
1571 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,4,7,6]
1572 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm14[0],xmm2[1],xmm14[1],xmm2[2],xmm14[2],xmm2[3],xmm14[3],xmm2[4],xmm14[4],xmm2[5],xmm14[5],xmm2[6],xmm14[6],xmm2[7],xmm14[7]
1573 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[1,0,3,2,4,5,6,7]
1574 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,4,7,6]
1575 ; SSE2-NEXT:    packuswb %xmm4, %xmm2
1576 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1577 ; SSE2-NEXT:    pand %xmm3, %xmm4
1578 ; SSE2-NEXT:    psllw $4, %xmm4
1579 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
1580 ; SSE2-NEXT:    pandn %xmm4, %xmm6
1581 ; SSE2-NEXT:    pand %xmm8, %xmm2
1582 ; SSE2-NEXT:    psrlw $4, %xmm2
1583 ; SSE2-NEXT:    pand %xmm3, %xmm2
1584 ; SSE2-NEXT:    por %xmm6, %xmm2
1585 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1586 ; SSE2-NEXT:    pand %xmm5, %xmm4
1587 ; SSE2-NEXT:    psllw $2, %xmm4
1588 ; SSE2-NEXT:    pand %xmm9, %xmm4
1589 ; SSE2-NEXT:    pand %xmm10, %xmm2
1590 ; SSE2-NEXT:    psrlw $2, %xmm2
1591 ; SSE2-NEXT:    pand %xmm11, %xmm2
1592 ; SSE2-NEXT:    por %xmm4, %xmm2
1593 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1594 ; SSE2-NEXT:    pand %xmm7, %xmm4
1595 ; SSE2-NEXT:    psrlw $1, %xmm4
1596 ; SSE2-NEXT:    pand %xmm12, %xmm4
1597 ; SSE2-NEXT:    pand %xmm13, %xmm2
1598 ; SSE2-NEXT:    paddb %xmm2, %xmm2
1599 ; SSE2-NEXT:    por %xmm4, %xmm2
1600 ; SSE2-NEXT:    movdqa %xmm15, %xmm4
1601 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm14[8],xmm4[9],xmm14[9],xmm4[10],xmm14[10],xmm4[11],xmm14[11],xmm4[12],xmm14[12],xmm4[13],xmm14[13],xmm4[14],xmm14[14],xmm4[15],xmm14[15]
1602 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[1,0,3,2,4,5,6,7]
1603 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,4,7,6]
1604 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm15 = xmm15[0],xmm14[0],xmm15[1],xmm14[1],xmm15[2],xmm14[2],xmm15[3],xmm14[3],xmm15[4],xmm14[4],xmm15[5],xmm14[5],xmm15[6],xmm14[6],xmm15[7],xmm14[7]
1605 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm15[1,0,3,2,4,5,6,7]
1606 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,5,4,7,6]
1607 ; SSE2-NEXT:    packuswb %xmm4, %xmm6
1608 ; SSE2-NEXT:    movdqa %xmm6, %xmm4
1609 ; SSE2-NEXT:    pand %xmm3, %xmm4
1610 ; SSE2-NEXT:    psllw $4, %xmm4
1611 ; SSE2-NEXT:    pand %xmm8, %xmm6
1612 ; SSE2-NEXT:    psrlw $4, %xmm6
1613 ; SSE2-NEXT:    pand %xmm3, %xmm6
1614 ; SSE2-NEXT:    pandn %xmm4, %xmm3
1615 ; SSE2-NEXT:    por %xmm6, %xmm3
1616 ; SSE2-NEXT:    pand %xmm3, %xmm5
1617 ; SSE2-NEXT:    psllw $2, %xmm5
1618 ; SSE2-NEXT:    pand %xmm9, %xmm5
1619 ; SSE2-NEXT:    pand %xmm10, %xmm3
1620 ; SSE2-NEXT:    psrlw $2, %xmm3
1621 ; SSE2-NEXT:    pand %xmm11, %xmm3
1622 ; SSE2-NEXT:    por %xmm5, %xmm3
1623 ; SSE2-NEXT:    pand %xmm3, %xmm7
1624 ; SSE2-NEXT:    psrlw $1, %xmm7
1625 ; SSE2-NEXT:    pand %xmm12, %xmm7
1626 ; SSE2-NEXT:    pand %xmm13, %xmm3
1627 ; SSE2-NEXT:    paddb %xmm3, %xmm3
1628 ; SSE2-NEXT:    por %xmm7, %xmm3
1629 ; SSE2-NEXT:    retq
1631 ; SSSE3-LABEL: test_bitreverse_v32i16:
1632 ; SSSE3:       # %bb.0:
1633 ; SSSE3-NEXT:    movdqa %xmm1, %xmm5
1634 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1635 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
1636 ; SSSE3-NEXT:    pshufb %xmm8, %xmm1
1637 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1638 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1639 ; SSSE3-NEXT:    pand %xmm9, %xmm0
1640 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1641 ; SSSE3-NEXT:    movdqa %xmm7, %xmm6
1642 ; SSSE3-NEXT:    pshufb %xmm0, %xmm6
1643 ; SSSE3-NEXT:    psrlw $4, %xmm1
1644 ; SSSE3-NEXT:    pand %xmm9, %xmm1
1645 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1646 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1647 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
1648 ; SSSE3-NEXT:    por %xmm6, %xmm0
1649 ; SSSE3-NEXT:    pshufb %xmm8, %xmm5
1650 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
1651 ; SSSE3-NEXT:    pand %xmm9, %xmm1
1652 ; SSSE3-NEXT:    movdqa %xmm7, %xmm6
1653 ; SSSE3-NEXT:    pshufb %xmm1, %xmm6
1654 ; SSSE3-NEXT:    psrlw $4, %xmm5
1655 ; SSSE3-NEXT:    pand %xmm9, %xmm5
1656 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
1657 ; SSSE3-NEXT:    pshufb %xmm5, %xmm1
1658 ; SSSE3-NEXT:    por %xmm6, %xmm1
1659 ; SSSE3-NEXT:    pshufb %xmm8, %xmm2
1660 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1661 ; SSSE3-NEXT:    pand %xmm9, %xmm5
1662 ; SSSE3-NEXT:    movdqa %xmm7, %xmm6
1663 ; SSSE3-NEXT:    pshufb %xmm5, %xmm6
1664 ; SSSE3-NEXT:    psrlw $4, %xmm2
1665 ; SSSE3-NEXT:    pand %xmm9, %xmm2
1666 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1667 ; SSSE3-NEXT:    pshufb %xmm2, %xmm5
1668 ; SSSE3-NEXT:    por %xmm6, %xmm5
1669 ; SSSE3-NEXT:    pshufb %xmm8, %xmm3
1670 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1671 ; SSSE3-NEXT:    pand %xmm9, %xmm2
1672 ; SSSE3-NEXT:    pshufb %xmm2, %xmm7
1673 ; SSSE3-NEXT:    psrlw $4, %xmm3
1674 ; SSSE3-NEXT:    pand %xmm9, %xmm3
1675 ; SSSE3-NEXT:    pshufb %xmm3, %xmm4
1676 ; SSSE3-NEXT:    por %xmm7, %xmm4
1677 ; SSSE3-NEXT:    movdqa %xmm5, %xmm2
1678 ; SSSE3-NEXT:    movdqa %xmm4, %xmm3
1679 ; SSSE3-NEXT:    retq
1681 ; AVX1-LABEL: test_bitreverse_v32i16:
1682 ; AVX1:       # %bb.0:
1683 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1684 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
1685 ; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
1686 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1687 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm5
1688 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1689 ; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
1690 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
1691 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
1692 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1693 ; AVX1-NEXT:    vpshufb %xmm2, %xmm7, %xmm2
1694 ; AVX1-NEXT:    vpor %xmm2, %xmm5, %xmm2
1695 ; AVX1-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
1696 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm5
1697 ; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
1698 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
1699 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
1700 ; AVX1-NEXT:    vpshufb %xmm0, %xmm7, %xmm0
1701 ; AVX1-NEXT:    vpor %xmm0, %xmm5, %xmm0
1702 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1703 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1704 ; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
1705 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm5
1706 ; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
1707 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
1708 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
1709 ; AVX1-NEXT:    vpshufb %xmm2, %xmm7, %xmm2
1710 ; AVX1-NEXT:    vpor %xmm2, %xmm5, %xmm2
1711 ; AVX1-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1712 ; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm3
1713 ; AVX1-NEXT:    vpshufb %xmm3, %xmm6, %xmm3
1714 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
1715 ; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
1716 ; AVX1-NEXT:    vpshufb %xmm1, %xmm7, %xmm1
1717 ; AVX1-NEXT:    vpor %xmm1, %xmm3, %xmm1
1718 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1719 ; AVX1-NEXT:    retq
1721 ; AVX2-LABEL: test_bitreverse_v32i16:
1722 ; AVX2:       # %bb.0:
1723 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
1724 ; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
1725 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1726 ; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm4
1727 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1728 ; AVX2-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
1729 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1730 ; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm0
1731 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1732 ; AVX2-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
1733 ; AVX2-NEXT:    vpor %ymm0, %ymm4, %ymm0
1734 ; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
1735 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm2
1736 ; AVX2-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
1737 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
1738 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1
1739 ; AVX2-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
1740 ; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
1741 ; AVX2-NEXT:    retq
1743 ; AVX512F-LABEL: test_bitreverse_v32i16:
1744 ; AVX512F:       # %bb.0:
1745 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
1746 ; AVX512F-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
1747 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1748 ; AVX512F-NEXT:    vpand %ymm3, %ymm0, %ymm4
1749 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1750 ; AVX512F-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
1751 ; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm0
1752 ; AVX512F-NEXT:    vpand %ymm3, %ymm0, %ymm0
1753 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1754 ; AVX512F-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
1755 ; AVX512F-NEXT:    vpor %ymm0, %ymm4, %ymm0
1756 ; AVX512F-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
1757 ; AVX512F-NEXT:    vpand %ymm3, %ymm1, %ymm2
1758 ; AVX512F-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
1759 ; AVX512F-NEXT:    vpsrlw $4, %ymm1, %ymm1
1760 ; AVX512F-NEXT:    vpand %ymm3, %ymm1, %ymm1
1761 ; AVX512F-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
1762 ; AVX512F-NEXT:    vpor %ymm1, %ymm2, %ymm1
1763 ; AVX512F-NEXT:    retq
1765 ; AVX512BW-LABEL: test_bitreverse_v32i16:
1766 ; AVX512BW:       # %bb.0:
1767 ; AVX512BW-NEXT:    vpshufb {{.*#+}} zmm0 = zmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30,33,32,35,34,37,36,39,38,41,40,43,42,45,44,47,46,49,48,51,50,53,52,55,54,57,56,59,58,61,60,63,62]
1768 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1769 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
1770 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1771 ; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
1772 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
1773 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
1774 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1775 ; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm0
1776 ; AVX512BW-NEXT:    vporq %zmm0, %zmm2, %zmm0
1777 ; AVX512BW-NEXT:    retq
1779 ; XOPAVX1-LABEL: test_bitreverse_v32i16:
1780 ; XOPAVX1:       # %bb.0:
1781 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1782 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]
1783 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
1784 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
1785 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1786 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1787 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
1788 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
1789 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1790 ; XOPAVX1-NEXT:    retq
1792 ; XOPAVX2-LABEL: test_bitreverse_v32i16:
1793 ; XOPAVX2:       # %bb.0:
1794 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
1795 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]
1796 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
1797 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
1798 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1799 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
1800 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
1801 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
1802 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
1803 ; XOPAVX2-NEXT:    retq
1804   %b = call <32 x i16> @llvm.bitreverse.v32i16(<32 x i16> %a)
1805   ret <32 x i16> %b
1808 define <16 x i32> @test_bitreverse_v16i32(<16 x i32> %a) nounwind {
1809 ; SSE2-LABEL: test_bitreverse_v16i32:
1810 ; SSE2:       # %bb.0:
1811 ; SSE2-NEXT:    movdqa %xmm3, %xmm15
1812 ; SSE2-NEXT:    pxor %xmm14, %xmm14
1813 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1814 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm14[8],xmm3[9],xmm14[9],xmm3[10],xmm14[10],xmm3[11],xmm14[11],xmm3[12],xmm14[12],xmm3[13],xmm14[13],xmm3[14],xmm14[14],xmm3[15],xmm14[15]
1815 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7]
1816 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]
1817 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm14[0],xmm0[1],xmm14[1],xmm0[2],xmm14[2],xmm0[3],xmm14[3],xmm0[4],xmm14[4],xmm0[5],xmm14[5],xmm0[6],xmm14[6],xmm0[7],xmm14[7]
1818 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
1819 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
1820 ; SSE2-NEXT:    packuswb %xmm3, %xmm0
1821 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1822 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1823 ; SSE2-NEXT:    pand %xmm3, %xmm5
1824 ; SSE2-NEXT:    psllw $4, %xmm5
1825 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
1826 ; SSE2-NEXT:    pandn %xmm5, %xmm7
1827 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
1828 ; SSE2-NEXT:    pand %xmm8, %xmm0
1829 ; SSE2-NEXT:    psrlw $4, %xmm0
1830 ; SSE2-NEXT:    pand %xmm3, %xmm0
1831 ; SSE2-NEXT:    por %xmm7, %xmm0
1832 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1833 ; SSE2-NEXT:    movdqa %xmm0, %xmm7
1834 ; SSE2-NEXT:    pand %xmm5, %xmm7
1835 ; SSE2-NEXT:    psllw $2, %xmm7
1836 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
1837 ; SSE2-NEXT:    pand %xmm9, %xmm7
1838 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204]
1839 ; SSE2-NEXT:    pand %xmm10, %xmm0
1840 ; SSE2-NEXT:    psrlw $2, %xmm0
1841 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
1842 ; SSE2-NEXT:    pand %xmm11, %xmm0
1843 ; SSE2-NEXT:    por %xmm7, %xmm0
1844 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170]
1845 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
1846 ; SSE2-NEXT:    pand %xmm7, %xmm6
1847 ; SSE2-NEXT:    psrlw $1, %xmm6
1848 ; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
1849 ; SSE2-NEXT:    pand %xmm12, %xmm6
1850 ; SSE2-NEXT:    movdqa {{.*#+}} xmm13 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
1851 ; SSE2-NEXT:    pand %xmm13, %xmm0
1852 ; SSE2-NEXT:    paddb %xmm0, %xmm0
1853 ; SSE2-NEXT:    por %xmm6, %xmm0
1854 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
1855 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm14[8],xmm6[9],xmm14[9],xmm6[10],xmm14[10],xmm6[11],xmm14[11],xmm6[12],xmm14[12],xmm6[13],xmm14[13],xmm6[14],xmm14[14],xmm6[15],xmm14[15]
1856 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]
1857 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]
1858 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm14[0],xmm1[1],xmm14[1],xmm1[2],xmm14[2],xmm1[3],xmm14[3],xmm1[4],xmm14[4],xmm1[5],xmm14[5],xmm1[6],xmm14[6],xmm1[7],xmm14[7]
1859 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]
1860 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]
1861 ; SSE2-NEXT:    packuswb %xmm6, %xmm1
1862 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
1863 ; SSE2-NEXT:    pand %xmm3, %xmm6
1864 ; SSE2-NEXT:    psllw $4, %xmm6
1865 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1866 ; SSE2-NEXT:    pandn %xmm6, %xmm4
1867 ; SSE2-NEXT:    pand %xmm8, %xmm1
1868 ; SSE2-NEXT:    psrlw $4, %xmm1
1869 ; SSE2-NEXT:    pand %xmm3, %xmm1
1870 ; SSE2-NEXT:    por %xmm4, %xmm1
1871 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1872 ; SSE2-NEXT:    pand %xmm5, %xmm4
1873 ; SSE2-NEXT:    psllw $2, %xmm4
1874 ; SSE2-NEXT:    pand %xmm9, %xmm4
1875 ; SSE2-NEXT:    pand %xmm10, %xmm1
1876 ; SSE2-NEXT:    psrlw $2, %xmm1
1877 ; SSE2-NEXT:    pand %xmm11, %xmm1
1878 ; SSE2-NEXT:    por %xmm4, %xmm1
1879 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1880 ; SSE2-NEXT:    pand %xmm7, %xmm4
1881 ; SSE2-NEXT:    psrlw $1, %xmm4
1882 ; SSE2-NEXT:    pand %xmm12, %xmm4
1883 ; SSE2-NEXT:    pand %xmm13, %xmm1
1884 ; SSE2-NEXT:    paddb %xmm1, %xmm1
1885 ; SSE2-NEXT:    por %xmm4, %xmm1
1886 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1887 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm14[8],xmm4[9],xmm14[9],xmm4[10],xmm14[10],xmm4[11],xmm14[11],xmm4[12],xmm14[12],xmm4[13],xmm14[13],xmm4[14],xmm14[14],xmm4[15],xmm14[15]
1888 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7]
1889 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4]
1890 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm14[0],xmm2[1],xmm14[1],xmm2[2],xmm14[2],xmm2[3],xmm14[3],xmm2[4],xmm14[4],xmm2[5],xmm14[5],xmm2[6],xmm14[6],xmm2[7],xmm14[7]
1891 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
1892 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
1893 ; SSE2-NEXT:    packuswb %xmm4, %xmm2
1894 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1895 ; SSE2-NEXT:    pand %xmm3, %xmm4
1896 ; SSE2-NEXT:    psllw $4, %xmm4
1897 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
1898 ; SSE2-NEXT:    pandn %xmm4, %xmm6
1899 ; SSE2-NEXT:    pand %xmm8, %xmm2
1900 ; SSE2-NEXT:    psrlw $4, %xmm2
1901 ; SSE2-NEXT:    pand %xmm3, %xmm2
1902 ; SSE2-NEXT:    por %xmm6, %xmm2
1903 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1904 ; SSE2-NEXT:    pand %xmm5, %xmm4
1905 ; SSE2-NEXT:    psllw $2, %xmm4
1906 ; SSE2-NEXT:    pand %xmm9, %xmm4
1907 ; SSE2-NEXT:    pand %xmm10, %xmm2
1908 ; SSE2-NEXT:    psrlw $2, %xmm2
1909 ; SSE2-NEXT:    pand %xmm11, %xmm2
1910 ; SSE2-NEXT:    por %xmm4, %xmm2
1911 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1912 ; SSE2-NEXT:    pand %xmm7, %xmm4
1913 ; SSE2-NEXT:    psrlw $1, %xmm4
1914 ; SSE2-NEXT:    pand %xmm12, %xmm4
1915 ; SSE2-NEXT:    pand %xmm13, %xmm2
1916 ; SSE2-NEXT:    paddb %xmm2, %xmm2
1917 ; SSE2-NEXT:    por %xmm4, %xmm2
1918 ; SSE2-NEXT:    movdqa %xmm15, %xmm4
1919 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm14[8],xmm4[9],xmm14[9],xmm4[10],xmm14[10],xmm4[11],xmm14[11],xmm4[12],xmm14[12],xmm4[13],xmm14[13],xmm4[14],xmm14[14],xmm4[15],xmm14[15]
1920 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7]
1921 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4]
1922 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm15 = xmm15[0],xmm14[0],xmm15[1],xmm14[1],xmm15[2],xmm14[2],xmm15[3],xmm14[3],xmm15[4],xmm14[4],xmm15[5],xmm14[5],xmm15[6],xmm14[6],xmm15[7],xmm14[7]
1923 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm15[3,2,1,0,4,5,6,7]
1924 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]
1925 ; SSE2-NEXT:    packuswb %xmm4, %xmm6
1926 ; SSE2-NEXT:    movdqa %xmm6, %xmm4
1927 ; SSE2-NEXT:    pand %xmm3, %xmm4
1928 ; SSE2-NEXT:    psllw $4, %xmm4
1929 ; SSE2-NEXT:    pand %xmm8, %xmm6
1930 ; SSE2-NEXT:    psrlw $4, %xmm6
1931 ; SSE2-NEXT:    pand %xmm3, %xmm6
1932 ; SSE2-NEXT:    pandn %xmm4, %xmm3
1933 ; SSE2-NEXT:    por %xmm6, %xmm3
1934 ; SSE2-NEXT:    pand %xmm3, %xmm5
1935 ; SSE2-NEXT:    psllw $2, %xmm5
1936 ; SSE2-NEXT:    pand %xmm9, %xmm5
1937 ; SSE2-NEXT:    pand %xmm10, %xmm3
1938 ; SSE2-NEXT:    psrlw $2, %xmm3
1939 ; SSE2-NEXT:    pand %xmm11, %xmm3
1940 ; SSE2-NEXT:    por %xmm5, %xmm3
1941 ; SSE2-NEXT:    pand %xmm3, %xmm7
1942 ; SSE2-NEXT:    psrlw $1, %xmm7
1943 ; SSE2-NEXT:    pand %xmm12, %xmm7
1944 ; SSE2-NEXT:    pand %xmm13, %xmm3
1945 ; SSE2-NEXT:    paddb %xmm3, %xmm3
1946 ; SSE2-NEXT:    por %xmm7, %xmm3
1947 ; SSE2-NEXT:    retq
1949 ; SSSE3-LABEL: test_bitreverse_v16i32:
1950 ; SSSE3:       # %bb.0:
1951 ; SSSE3-NEXT:    movdqa %xmm1, %xmm5
1952 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1953 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
1954 ; SSSE3-NEXT:    pshufb %xmm8, %xmm1
1955 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1956 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1957 ; SSSE3-NEXT:    pand %xmm9, %xmm0
1958 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1959 ; SSSE3-NEXT:    movdqa %xmm7, %xmm6
1960 ; SSSE3-NEXT:    pshufb %xmm0, %xmm6
1961 ; SSSE3-NEXT:    psrlw $4, %xmm1
1962 ; SSSE3-NEXT:    pand %xmm9, %xmm1
1963 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1964 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1965 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
1966 ; SSSE3-NEXT:    por %xmm6, %xmm0
1967 ; SSSE3-NEXT:    pshufb %xmm8, %xmm5
1968 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
1969 ; SSSE3-NEXT:    pand %xmm9, %xmm1
1970 ; SSSE3-NEXT:    movdqa %xmm7, %xmm6
1971 ; SSSE3-NEXT:    pshufb %xmm1, %xmm6
1972 ; SSSE3-NEXT:    psrlw $4, %xmm5
1973 ; SSSE3-NEXT:    pand %xmm9, %xmm5
1974 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
1975 ; SSSE3-NEXT:    pshufb %xmm5, %xmm1
1976 ; SSSE3-NEXT:    por %xmm6, %xmm1
1977 ; SSSE3-NEXT:    pshufb %xmm8, %xmm2
1978 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1979 ; SSSE3-NEXT:    pand %xmm9, %xmm5
1980 ; SSSE3-NEXT:    movdqa %xmm7, %xmm6
1981 ; SSSE3-NEXT:    pshufb %xmm5, %xmm6
1982 ; SSSE3-NEXT:    psrlw $4, %xmm2
1983 ; SSSE3-NEXT:    pand %xmm9, %xmm2
1984 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1985 ; SSSE3-NEXT:    pshufb %xmm2, %xmm5
1986 ; SSSE3-NEXT:    por %xmm6, %xmm5
1987 ; SSSE3-NEXT:    pshufb %xmm8, %xmm3
1988 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1989 ; SSSE3-NEXT:    pand %xmm9, %xmm2
1990 ; SSSE3-NEXT:    pshufb %xmm2, %xmm7
1991 ; SSSE3-NEXT:    psrlw $4, %xmm3
1992 ; SSSE3-NEXT:    pand %xmm9, %xmm3
1993 ; SSSE3-NEXT:    pshufb %xmm3, %xmm4
1994 ; SSSE3-NEXT:    por %xmm7, %xmm4
1995 ; SSSE3-NEXT:    movdqa %xmm5, %xmm2
1996 ; SSSE3-NEXT:    movdqa %xmm4, %xmm3
1997 ; SSSE3-NEXT:    retq
1999 ; AVX1-LABEL: test_bitreverse_v16i32:
2000 ; AVX1:       # %bb.0:
2001 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2002 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
2003 ; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2004 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2005 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm5
2006 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2007 ; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
2008 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
2009 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2010 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2011 ; AVX1-NEXT:    vpshufb %xmm2, %xmm7, %xmm2
2012 ; AVX1-NEXT:    vpor %xmm2, %xmm5, %xmm2
2013 ; AVX1-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
2014 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm5
2015 ; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
2016 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
2017 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
2018 ; AVX1-NEXT:    vpshufb %xmm0, %xmm7, %xmm0
2019 ; AVX1-NEXT:    vpor %xmm0, %xmm5, %xmm0
2020 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2021 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2022 ; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2023 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm5
2024 ; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
2025 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
2026 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2027 ; AVX1-NEXT:    vpshufb %xmm2, %xmm7, %xmm2
2028 ; AVX1-NEXT:    vpor %xmm2, %xmm5, %xmm2
2029 ; AVX1-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
2030 ; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm3
2031 ; AVX1-NEXT:    vpshufb %xmm3, %xmm6, %xmm3
2032 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
2033 ; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
2034 ; AVX1-NEXT:    vpshufb %xmm1, %xmm7, %xmm1
2035 ; AVX1-NEXT:    vpor %xmm1, %xmm3, %xmm1
2036 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2037 ; AVX1-NEXT:    retq
2039 ; AVX2-LABEL: test_bitreverse_v16i32:
2040 ; AVX2:       # %bb.0:
2041 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
2042 ; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
2043 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2044 ; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm4
2045 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2046 ; AVX2-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
2047 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
2048 ; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm0
2049 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2050 ; AVX2-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
2051 ; AVX2-NEXT:    vpor %ymm0, %ymm4, %ymm0
2052 ; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
2053 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm2
2054 ; AVX2-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
2055 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
2056 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1
2057 ; AVX2-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
2058 ; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
2059 ; AVX2-NEXT:    retq
2061 ; AVX512F-LABEL: test_bitreverse_v16i32:
2062 ; AVX512F:       # %bb.0:
2063 ; AVX512F-NEXT:    vpsrld $24, %zmm0, %zmm1
2064 ; AVX512F-NEXT:    vpsrld $8, %zmm0, %zmm2
2065 ; AVX512F-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm2, %zmm2
2066 ; AVX512F-NEXT:    vpord %zmm1, %zmm2, %zmm1
2067 ; AVX512F-NEXT:    vpslld $24, %zmm0, %zmm2
2068 ; AVX512F-NEXT:    vpslld $8, %zmm0, %zmm0
2069 ; AVX512F-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm0
2070 ; AVX512F-NEXT:    vpord %zmm1, %zmm0, %zmm0
2071 ; AVX512F-NEXT:    vpord %zmm0, %zmm2, %zmm0
2072 ; AVX512F-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm1
2073 ; AVX512F-NEXT:    vpslld $4, %zmm1, %zmm1
2074 ; AVX512F-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm0
2075 ; AVX512F-NEXT:    vpsrld $4, %zmm0, %zmm0
2076 ; AVX512F-NEXT:    vpord %zmm1, %zmm0, %zmm0
2077 ; AVX512F-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm1
2078 ; AVX512F-NEXT:    vpslld $2, %zmm1, %zmm1
2079 ; AVX512F-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm0
2080 ; AVX512F-NEXT:    vpsrld $2, %zmm0, %zmm0
2081 ; AVX512F-NEXT:    vpord %zmm1, %zmm0, %zmm0
2082 ; AVX512F-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm1
2083 ; AVX512F-NEXT:    vpslld $1, %zmm1, %zmm1
2084 ; AVX512F-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm0
2085 ; AVX512F-NEXT:    vpsrld $1, %zmm0, %zmm0
2086 ; AVX512F-NEXT:    vpord %zmm1, %zmm0, %zmm0
2087 ; AVX512F-NEXT:    retq
2089 ; AVX512BW-LABEL: test_bitreverse_v16i32:
2090 ; AVX512BW:       # %bb.0:
2091 ; AVX512BW-NEXT:    vpshufb {{.*#+}} zmm0 = zmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28,35,34,33,32,39,38,37,36,43,42,41,40,47,46,45,44,51,50,49,48,55,54,53,52,59,58,57,56,63,62,61,60]
2092 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2093 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
2094 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2095 ; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
2096 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
2097 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
2098 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2099 ; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm0
2100 ; AVX512BW-NEXT:    vporq %zmm0, %zmm2, %zmm0
2101 ; AVX512BW-NEXT:    retq
2103 ; XOPAVX1-LABEL: test_bitreverse_v16i32:
2104 ; XOPAVX1:       # %bb.0:
2105 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2106 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]
2107 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2108 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
2109 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2110 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2111 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2112 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
2113 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2114 ; XOPAVX1-NEXT:    retq
2116 ; XOPAVX2-LABEL: test_bitreverse_v16i32:
2117 ; XOPAVX2:       # %bb.0:
2118 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
2119 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]
2120 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2121 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
2122 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
2123 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
2124 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2125 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
2126 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
2127 ; XOPAVX2-NEXT:    retq
2128   %b = call <16 x i32> @llvm.bitreverse.v16i32(<16 x i32> %a)
2129   ret <16 x i32> %b
2132 define <8 x i64> @test_bitreverse_v8i64(<8 x i64> %a) nounwind {
2133 ; SSE2-LABEL: test_bitreverse_v8i64:
2134 ; SSE2:       # %bb.0:
2135 ; SSE2-NEXT:    movdqa %xmm3, %xmm15
2136 ; SSE2-NEXT:    pxor %xmm14, %xmm14
2137 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
2138 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm14[8],xmm3[9],xmm14[9],xmm3[10],xmm14[10],xmm3[11],xmm14[11],xmm3[12],xmm14[12],xmm3[13],xmm14[13],xmm3[14],xmm14[14],xmm3[15],xmm14[15]
2139 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
2140 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7]
2141 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]
2142 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm14[0],xmm0[1],xmm14[1],xmm0[2],xmm14[2],xmm0[3],xmm14[3],xmm0[4],xmm14[4],xmm0[5],xmm14[5],xmm0[6],xmm14[6],xmm0[7],xmm14[7]
2143 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2144 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
2145 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
2146 ; SSE2-NEXT:    packuswb %xmm3, %xmm0
2147 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2148 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
2149 ; SSE2-NEXT:    pand %xmm3, %xmm5
2150 ; SSE2-NEXT:    psllw $4, %xmm5
2151 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
2152 ; SSE2-NEXT:    pandn %xmm5, %xmm7
2153 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
2154 ; SSE2-NEXT:    pand %xmm8, %xmm0
2155 ; SSE2-NEXT:    psrlw $4, %xmm0
2156 ; SSE2-NEXT:    pand %xmm3, %xmm0
2157 ; SSE2-NEXT:    por %xmm7, %xmm0
2158 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
2159 ; SSE2-NEXT:    movdqa %xmm0, %xmm7
2160 ; SSE2-NEXT:    pand %xmm5, %xmm7
2161 ; SSE2-NEXT:    psllw $2, %xmm7
2162 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
2163 ; SSE2-NEXT:    pand %xmm9, %xmm7
2164 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204]
2165 ; SSE2-NEXT:    pand %xmm10, %xmm0
2166 ; SSE2-NEXT:    psrlw $2, %xmm0
2167 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
2168 ; SSE2-NEXT:    pand %xmm11, %xmm0
2169 ; SSE2-NEXT:    por %xmm7, %xmm0
2170 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170]
2171 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
2172 ; SSE2-NEXT:    pand %xmm7, %xmm6
2173 ; SSE2-NEXT:    psrlw $1, %xmm6
2174 ; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
2175 ; SSE2-NEXT:    pand %xmm12, %xmm6
2176 ; SSE2-NEXT:    movdqa {{.*#+}} xmm13 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
2177 ; SSE2-NEXT:    pand %xmm13, %xmm0
2178 ; SSE2-NEXT:    paddb %xmm0, %xmm0
2179 ; SSE2-NEXT:    por %xmm6, %xmm0
2180 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
2181 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm14[8],xmm6[9],xmm14[9],xmm6[10],xmm14[10],xmm6[11],xmm14[11],xmm6[12],xmm14[12],xmm6[13],xmm14[13],xmm6[14],xmm14[14],xmm6[15],xmm14[15]
2182 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[2,3,0,1]
2183 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]
2184 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]
2185 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm14[0],xmm1[1],xmm14[1],xmm1[2],xmm14[2],xmm1[3],xmm14[3],xmm1[4],xmm14[4],xmm1[5],xmm14[5],xmm1[6],xmm14[6],xmm1[7],xmm14[7]
2186 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2187 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]
2188 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]
2189 ; SSE2-NEXT:    packuswb %xmm6, %xmm1
2190 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
2191 ; SSE2-NEXT:    pand %xmm3, %xmm6
2192 ; SSE2-NEXT:    psllw $4, %xmm6
2193 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
2194 ; SSE2-NEXT:    pandn %xmm6, %xmm4
2195 ; SSE2-NEXT:    pand %xmm8, %xmm1
2196 ; SSE2-NEXT:    psrlw $4, %xmm1
2197 ; SSE2-NEXT:    pand %xmm3, %xmm1
2198 ; SSE2-NEXT:    por %xmm4, %xmm1
2199 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
2200 ; SSE2-NEXT:    pand %xmm5, %xmm4
2201 ; SSE2-NEXT:    psllw $2, %xmm4
2202 ; SSE2-NEXT:    pand %xmm9, %xmm4
2203 ; SSE2-NEXT:    pand %xmm10, %xmm1
2204 ; SSE2-NEXT:    psrlw $2, %xmm1
2205 ; SSE2-NEXT:    pand %xmm11, %xmm1
2206 ; SSE2-NEXT:    por %xmm4, %xmm1
2207 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
2208 ; SSE2-NEXT:    pand %xmm7, %xmm4
2209 ; SSE2-NEXT:    psrlw $1, %xmm4
2210 ; SSE2-NEXT:    pand %xmm12, %xmm4
2211 ; SSE2-NEXT:    pand %xmm13, %xmm1
2212 ; SSE2-NEXT:    paddb %xmm1, %xmm1
2213 ; SSE2-NEXT:    por %xmm4, %xmm1
2214 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
2215 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm14[8],xmm4[9],xmm14[9],xmm4[10],xmm14[10],xmm4[11],xmm14[11],xmm4[12],xmm14[12],xmm4[13],xmm14[13],xmm4[14],xmm14[14],xmm4[15],xmm14[15]
2216 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[2,3,0,1]
2217 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7]
2218 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4]
2219 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm14[0],xmm2[1],xmm14[1],xmm2[2],xmm14[2],xmm2[3],xmm14[3],xmm2[4],xmm14[4],xmm2[5],xmm14[5],xmm2[6],xmm14[6],xmm2[7],xmm14[7]
2220 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
2221 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
2222 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
2223 ; SSE2-NEXT:    packuswb %xmm4, %xmm2
2224 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
2225 ; SSE2-NEXT:    pand %xmm3, %xmm4
2226 ; SSE2-NEXT:    psllw $4, %xmm4
2227 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
2228 ; SSE2-NEXT:    pandn %xmm4, %xmm6
2229 ; SSE2-NEXT:    pand %xmm8, %xmm2
2230 ; SSE2-NEXT:    psrlw $4, %xmm2
2231 ; SSE2-NEXT:    pand %xmm3, %xmm2
2232 ; SSE2-NEXT:    por %xmm6, %xmm2
2233 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
2234 ; SSE2-NEXT:    pand %xmm5, %xmm4
2235 ; SSE2-NEXT:    psllw $2, %xmm4
2236 ; SSE2-NEXT:    pand %xmm9, %xmm4
2237 ; SSE2-NEXT:    pand %xmm10, %xmm2
2238 ; SSE2-NEXT:    psrlw $2, %xmm2
2239 ; SSE2-NEXT:    pand %xmm11, %xmm2
2240 ; SSE2-NEXT:    por %xmm4, %xmm2
2241 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
2242 ; SSE2-NEXT:    pand %xmm7, %xmm4
2243 ; SSE2-NEXT:    psrlw $1, %xmm4
2244 ; SSE2-NEXT:    pand %xmm12, %xmm4
2245 ; SSE2-NEXT:    pand %xmm13, %xmm2
2246 ; SSE2-NEXT:    paddb %xmm2, %xmm2
2247 ; SSE2-NEXT:    por %xmm4, %xmm2
2248 ; SSE2-NEXT:    movdqa %xmm15, %xmm4
2249 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm14[8],xmm4[9],xmm14[9],xmm4[10],xmm14[10],xmm4[11],xmm14[11],xmm4[12],xmm14[12],xmm4[13],xmm14[13],xmm4[14],xmm14[14],xmm4[15],xmm14[15]
2250 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[2,3,0,1]
2251 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7]
2252 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4]
2253 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm15 = xmm15[0],xmm14[0],xmm15[1],xmm14[1],xmm15[2],xmm14[2],xmm15[3],xmm14[3],xmm15[4],xmm14[4],xmm15[5],xmm14[5],xmm15[6],xmm14[6],xmm15[7],xmm14[7]
2254 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm15[2,3,0,1]
2255 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]
2256 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]
2257 ; SSE2-NEXT:    packuswb %xmm4, %xmm6
2258 ; SSE2-NEXT:    movdqa %xmm6, %xmm4
2259 ; SSE2-NEXT:    pand %xmm3, %xmm4
2260 ; SSE2-NEXT:    psllw $4, %xmm4
2261 ; SSE2-NEXT:    pand %xmm8, %xmm6
2262 ; SSE2-NEXT:    psrlw $4, %xmm6
2263 ; SSE2-NEXT:    pand %xmm3, %xmm6
2264 ; SSE2-NEXT:    pandn %xmm4, %xmm3
2265 ; SSE2-NEXT:    por %xmm6, %xmm3
2266 ; SSE2-NEXT:    pand %xmm3, %xmm5
2267 ; SSE2-NEXT:    psllw $2, %xmm5
2268 ; SSE2-NEXT:    pand %xmm9, %xmm5
2269 ; SSE2-NEXT:    pand %xmm10, %xmm3
2270 ; SSE2-NEXT:    psrlw $2, %xmm3
2271 ; SSE2-NEXT:    pand %xmm11, %xmm3
2272 ; SSE2-NEXT:    por %xmm5, %xmm3
2273 ; SSE2-NEXT:    pand %xmm3, %xmm7
2274 ; SSE2-NEXT:    psrlw $1, %xmm7
2275 ; SSE2-NEXT:    pand %xmm12, %xmm7
2276 ; SSE2-NEXT:    pand %xmm13, %xmm3
2277 ; SSE2-NEXT:    paddb %xmm3, %xmm3
2278 ; SSE2-NEXT:    por %xmm7, %xmm3
2279 ; SSE2-NEXT:    retq
2281 ; SSSE3-LABEL: test_bitreverse_v8i64:
2282 ; SSSE3:       # %bb.0:
2283 ; SSSE3-NEXT:    movdqa %xmm1, %xmm5
2284 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
2285 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
2286 ; SSSE3-NEXT:    pshufb %xmm8, %xmm1
2287 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2288 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2289 ; SSSE3-NEXT:    pand %xmm9, %xmm0
2290 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2291 ; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2292 ; SSSE3-NEXT:    pshufb %xmm0, %xmm6
2293 ; SSSE3-NEXT:    psrlw $4, %xmm1
2294 ; SSSE3-NEXT:    pand %xmm9, %xmm1
2295 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2296 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
2297 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
2298 ; SSSE3-NEXT:    por %xmm6, %xmm0
2299 ; SSSE3-NEXT:    pshufb %xmm8, %xmm5
2300 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
2301 ; SSSE3-NEXT:    pand %xmm9, %xmm1
2302 ; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2303 ; SSSE3-NEXT:    pshufb %xmm1, %xmm6
2304 ; SSSE3-NEXT:    psrlw $4, %xmm5
2305 ; SSSE3-NEXT:    pand %xmm9, %xmm5
2306 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
2307 ; SSSE3-NEXT:    pshufb %xmm5, %xmm1
2308 ; SSSE3-NEXT:    por %xmm6, %xmm1
2309 ; SSSE3-NEXT:    pshufb %xmm8, %xmm2
2310 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
2311 ; SSSE3-NEXT:    pand %xmm9, %xmm5
2312 ; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2313 ; SSSE3-NEXT:    pshufb %xmm5, %xmm6
2314 ; SSSE3-NEXT:    psrlw $4, %xmm2
2315 ; SSSE3-NEXT:    pand %xmm9, %xmm2
2316 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
2317 ; SSSE3-NEXT:    pshufb %xmm2, %xmm5
2318 ; SSSE3-NEXT:    por %xmm6, %xmm5
2319 ; SSSE3-NEXT:    pshufb %xmm8, %xmm3
2320 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2321 ; SSSE3-NEXT:    pand %xmm9, %xmm2
2322 ; SSSE3-NEXT:    pshufb %xmm2, %xmm7
2323 ; SSSE3-NEXT:    psrlw $4, %xmm3
2324 ; SSSE3-NEXT:    pand %xmm9, %xmm3
2325 ; SSSE3-NEXT:    pshufb %xmm3, %xmm4
2326 ; SSSE3-NEXT:    por %xmm7, %xmm4
2327 ; SSSE3-NEXT:    movdqa %xmm5, %xmm2
2328 ; SSSE3-NEXT:    movdqa %xmm4, %xmm3
2329 ; SSSE3-NEXT:    retq
2331 ; AVX1-LABEL: test_bitreverse_v8i64:
2332 ; AVX1:       # %bb.0:
2333 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2334 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
2335 ; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2336 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2337 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm5
2338 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2339 ; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
2340 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
2341 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2342 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2343 ; AVX1-NEXT:    vpshufb %xmm2, %xmm7, %xmm2
2344 ; AVX1-NEXT:    vpor %xmm2, %xmm5, %xmm2
2345 ; AVX1-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
2346 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm5
2347 ; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
2348 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
2349 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
2350 ; AVX1-NEXT:    vpshufb %xmm0, %xmm7, %xmm0
2351 ; AVX1-NEXT:    vpor %xmm0, %xmm5, %xmm0
2352 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2353 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2354 ; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2355 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm5
2356 ; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
2357 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
2358 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2359 ; AVX1-NEXT:    vpshufb %xmm2, %xmm7, %xmm2
2360 ; AVX1-NEXT:    vpor %xmm2, %xmm5, %xmm2
2361 ; AVX1-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
2362 ; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm3
2363 ; AVX1-NEXT:    vpshufb %xmm3, %xmm6, %xmm3
2364 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
2365 ; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
2366 ; AVX1-NEXT:    vpshufb %xmm1, %xmm7, %xmm1
2367 ; AVX1-NEXT:    vpor %xmm1, %xmm3, %xmm1
2368 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2369 ; AVX1-NEXT:    retq
2371 ; AVX2-LABEL: test_bitreverse_v8i64:
2372 ; AVX2:       # %bb.0:
2373 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
2374 ; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
2375 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2376 ; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm4
2377 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2378 ; AVX2-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
2379 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
2380 ; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm0
2381 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2382 ; AVX2-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
2383 ; AVX2-NEXT:    vpor %ymm0, %ymm4, %ymm0
2384 ; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
2385 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm2
2386 ; AVX2-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
2387 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
2388 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1
2389 ; AVX2-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
2390 ; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
2391 ; AVX2-NEXT:    retq
2393 ; AVX512F-LABEL: test_bitreverse_v8i64:
2394 ; AVX512F:       # %bb.0:
2395 ; AVX512F-NEXT:    vpsrlq $56, %zmm0, %zmm1
2396 ; AVX512F-NEXT:    vpsrlq $40, %zmm0, %zmm2
2397 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
2398 ; AVX512F-NEXT:    vporq %zmm1, %zmm2, %zmm1
2399 ; AVX512F-NEXT:    vpsrlq $24, %zmm0, %zmm2
2400 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
2401 ; AVX512F-NEXT:    vporq %zmm1, %zmm2, %zmm1
2402 ; AVX512F-NEXT:    vpsrlq $8, %zmm0, %zmm2
2403 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
2404 ; AVX512F-NEXT:    vporq %zmm1, %zmm2, %zmm1
2405 ; AVX512F-NEXT:    vpsllq $8, %zmm0, %zmm2
2406 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
2407 ; AVX512F-NEXT:    vpsllq $24, %zmm0, %zmm3
2408 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm3, %zmm3
2409 ; AVX512F-NEXT:    vporq %zmm2, %zmm3, %zmm2
2410 ; AVX512F-NEXT:    vpsllq $56, %zmm0, %zmm3
2411 ; AVX512F-NEXT:    vpsllq $40, %zmm0, %zmm0
2412 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm0
2413 ; AVX512F-NEXT:    vporq %zmm2, %zmm0, %zmm0
2414 ; AVX512F-NEXT:    vporq %zmm1, %zmm0, %zmm0
2415 ; AVX512F-NEXT:    vporq %zmm0, %zmm3, %zmm0
2416 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm1
2417 ; AVX512F-NEXT:    vpsllq $4, %zmm1, %zmm1
2418 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm0
2419 ; AVX512F-NEXT:    vpsrlq $4, %zmm0, %zmm0
2420 ; AVX512F-NEXT:    vporq %zmm1, %zmm0, %zmm0
2421 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm1
2422 ; AVX512F-NEXT:    vpsllq $2, %zmm1, %zmm1
2423 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm0
2424 ; AVX512F-NEXT:    vpsrlq $2, %zmm0, %zmm0
2425 ; AVX512F-NEXT:    vporq %zmm1, %zmm0, %zmm0
2426 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm1
2427 ; AVX512F-NEXT:    vpsllq $1, %zmm1, %zmm1
2428 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm0
2429 ; AVX512F-NEXT:    vpsrlq $1, %zmm0, %zmm0
2430 ; AVX512F-NEXT:    vporq %zmm1, %zmm0, %zmm0
2431 ; AVX512F-NEXT:    retq
2433 ; AVX512BW-LABEL: test_bitreverse_v8i64:
2434 ; AVX512BW:       # %bb.0:
2435 ; AVX512BW-NEXT:    vpshufb {{.*#+}} zmm0 = zmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24,39,38,37,36,35,34,33,32,47,46,45,44,43,42,41,40,55,54,53,52,51,50,49,48,63,62,61,60,59,58,57,56]
2436 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2437 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
2438 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2439 ; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
2440 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
2441 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
2442 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2443 ; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm0
2444 ; AVX512BW-NEXT:    vporq %zmm0, %zmm2, %zmm0
2445 ; AVX512BW-NEXT:    retq
2447 ; XOPAVX1-LABEL: test_bitreverse_v8i64:
2448 ; XOPAVX1:       # %bb.0:
2449 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2450 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]
2451 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2452 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
2453 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2454 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2455 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2456 ; XOPAVX1-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
2457 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2458 ; XOPAVX1-NEXT:    retq
2460 ; XOPAVX2-LABEL: test_bitreverse_v8i64:
2461 ; XOPAVX2:       # %bb.0:
2462 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
2463 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]
2464 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2465 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
2466 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
2467 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
2468 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2469 ; XOPAVX2-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
2470 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
2471 ; XOPAVX2-NEXT:    retq
2472   %b = call <8 x i64> @llvm.bitreverse.v8i64(<8 x i64> %a)
2473   ret <8 x i64> %b
2477 ; Constant Folding
2480 define i32 @fold_bitreverse_i32() nounwind {
2481 ; ALL-LABEL: fold_bitreverse_i32:
2482 ; ALL:       # %bb.0:
2483 ; ALL-NEXT:    movl $16711935, %eax # imm = 0xFF00FF
2484 ; ALL-NEXT:    retq
2485   %b = call i32 @llvm.bitreverse.i32(i32 4278255360)
2486   ret i32 %b
2489 define <16 x i8> @fold_bitreverse_v16i8() nounwind {
2490 ; SSE-LABEL: fold_bitreverse_v16i8:
2491 ; SSE:       # %bb.0:
2492 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]
2493 ; SSE-NEXT:    retq
2495 ; AVX-LABEL: fold_bitreverse_v16i8:
2496 ; AVX:       # %bb.0:
2497 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]
2498 ; AVX-NEXT:    retq
2500 ; XOP-LABEL: fold_bitreverse_v16i8:
2501 ; XOP:       # %bb.0:
2502 ; XOP-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]
2503 ; XOP-NEXT:    retq
2504   %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> <i8 0, i8 -1, i8 2, i8 -3, i8 4, i8 -5, i8 6, i8 -7, i8 8, i8 -9, i8 10, i8 -11, i8 12, i8 -13, i8 14, i8 -15>)
2505   ret <16 x i8> %b
2508 define <16 x i16> @fold_bitreverse_v16i16() nounwind {
2509 ; SSE-LABEL: fold_bitreverse_v16i16:
2510 ; SSE:       # %bb.0:
2511 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [0,65535,16384,49151,8192,57343,24576,40959]
2512 ; SSE-NEXT:    movaps {{.*#+}} xmm1 = [4096,61439,20480,45055,12288,53247,28672,36863]
2513 ; SSE-NEXT:    retq
2515 ; AVX-LABEL: fold_bitreverse_v16i16:
2516 ; AVX:       # %bb.0:
2517 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863]
2518 ; AVX-NEXT:    retq
2520 ; XOP-LABEL: fold_bitreverse_v16i16:
2521 ; XOP:       # %bb.0:
2522 ; XOP-NEXT:    vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863]
2523 ; XOP-NEXT:    retq
2524   %b = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> <i16 0, i16 -1, i16 2, i16 -3, i16 4, i16 -5, i16 6, i16 -7, i16 8, i16 -9, i16 10, i16 -11, i16 12, i16 -13, i16 14, i16 -15>)
2525   ret <16 x i16> %b
2528 define <16 x i32> @fold_bitreverse_v16i32() nounwind {
2529 ; SSE-LABEL: fold_bitreverse_v16i32:
2530 ; SSE:       # %bb.0:
2531 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [0,4294967295,1073741824,3221225471]
2532 ; SSE-NEXT:    movaps {{.*#+}} xmm1 = [536870912,3758096383,1610612736,2684354559]
2533 ; SSE-NEXT:    movaps {{.*#+}} xmm2 = [268435456,4026531839,1342177280,2952790015]
2534 ; SSE-NEXT:    movaps {{.*#+}} xmm3 = [805306368,3489660927,1879048192,2415919103]
2535 ; SSE-NEXT:    retq
2537 ; AVX1-LABEL: fold_bitreverse_v16i32:
2538 ; AVX1:       # %bb.0:
2539 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559]
2540 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]
2541 ; AVX1-NEXT:    retq
2543 ; AVX2-LABEL: fold_bitreverse_v16i32:
2544 ; AVX2:       # %bb.0:
2545 ; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559]
2546 ; AVX2-NEXT:    vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]
2547 ; AVX2-NEXT:    retq
2549 ; AVX512-LABEL: fold_bitreverse_v16i32:
2550 ; AVX512:       # %bb.0:
2551 ; AVX512-NEXT:    vmovaps {{.*#+}} zmm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559,268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]
2552 ; AVX512-NEXT:    retq
2554 ; XOP-LABEL: fold_bitreverse_v16i32:
2555 ; XOP:       # %bb.0:
2556 ; XOP-NEXT:    vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559]
2557 ; XOP-NEXT:    vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]
2558 ; XOP-NEXT:    retq
2559   %b = call <16 x i32> @llvm.bitreverse.v16i32(<16 x i32> <i32 0, i32 -1, i32 2, i32 -3, i32 4, i32 -5, i32 6, i32 -7, i32 8, i32 -9, i32 10, i32 -11, i32 12, i32 -13, i32 14, i32 -15>)
2560   ret <16 x i32> %b
2563 declare i8 @llvm.bitreverse.i8(i8) readnone
2564 declare i16 @llvm.bitreverse.i16(i16) readnone
2565 declare i32 @llvm.bitreverse.i32(i32) readnone
2566 declare i64 @llvm.bitreverse.i64(i64) readnone
2568 declare <16 x i8> @llvm.bitreverse.v16i8(<16 x i8>) readnone
2569 declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>) readnone
2570 declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>) readnone
2571 declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>) readnone
2573 declare <32 x i8>  @llvm.bitreverse.v32i8(<32 x i8>) readnone
2574 declare <16 x i16> @llvm.bitreverse.v16i16(<16 x i16>) readnone
2575 declare <8 x i32>  @llvm.bitreverse.v8i32(<8 x i32>) readnone
2576 declare <4 x i64>  @llvm.bitreverse.v4i64(<4 x i64>) readnone
2578 declare <64 x i8>  @llvm.bitreverse.v64i8(<64 x i8>) readnone
2579 declare <32 x i16> @llvm.bitreverse.v32i16(<32 x i16>) readnone
2580 declare <16 x i32>  @llvm.bitreverse.v16i32(<16 x i32>) readnone
2581 declare <8 x i64>  @llvm.bitreverse.v8i64(<8 x i64>) readnone