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