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