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; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3,+gfni | FileCheck %s --check-prefix=ALL --check-prefix=GFNISSE
11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+gfni | FileCheck %s --check-prefix=ALL --check-prefix=GFNIAVX
12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+gfni | FileCheck %s --check-prefix=ALL --check-prefix=GFNIAVX2
13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+gfni | FileCheck %s --check-prefix=ALL --check-prefix=GFNIAVX512F
14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+gfni | FileCheck %s --check-prefix=ALL --check-prefix=GFNIAVX512BW
15
16; Make sure we don't crash with avx512bw and xop
17; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx512bw
18
19define i8 @test_bitreverse_i8(i8 %a) nounwind {
20; SSE-LABEL: test_bitreverse_i8:
21; SSE:       # %bb.0:
22; SSE-NEXT:    rolb $4, %dil
23; SSE-NEXT:    movl %edi, %eax
24; SSE-NEXT:    andb $51, %al
25; SSE-NEXT:    shlb $2, %al
26; SSE-NEXT:    shrb $2, %dil
27; SSE-NEXT:    andb $51, %dil
28; SSE-NEXT:    orb %al, %dil
29; SSE-NEXT:    movl %edi, %eax
30; SSE-NEXT:    andb $85, %al
31; SSE-NEXT:    addb %al, %al
32; SSE-NEXT:    shrb %dil
33; SSE-NEXT:    andb $85, %dil
34; SSE-NEXT:    orb %dil, %al
35; SSE-NEXT:    retq
36;
37; AVX-LABEL: test_bitreverse_i8:
38; AVX:       # %bb.0:
39; AVX-NEXT:    rolb $4, %dil
40; AVX-NEXT:    movl %edi, %eax
41; AVX-NEXT:    andb $51, %al
42; AVX-NEXT:    shlb $2, %al
43; AVX-NEXT:    shrb $2, %dil
44; AVX-NEXT:    andb $51, %dil
45; AVX-NEXT:    orb %al, %dil
46; AVX-NEXT:    movl %edi, %eax
47; AVX-NEXT:    andb $85, %al
48; AVX-NEXT:    addb %al, %al
49; AVX-NEXT:    shrb %dil
50; AVX-NEXT:    andb $85, %dil
51; AVX-NEXT:    orb %dil, %al
52; AVX-NEXT:    retq
53;
54; XOP-LABEL: test_bitreverse_i8:
55; XOP:       # %bb.0:
56; XOP-NEXT:    vmovd %edi, %xmm0
57; XOP-NEXT:    vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0
58; XOP-NEXT:    vmovd %xmm0, %eax
59; XOP-NEXT:    # kill: def $al killed $al killed $eax
60; XOP-NEXT:    retq
61;
62; GFNISSE-LABEL: test_bitreverse_i8:
63; GFNISSE:       # %bb.0:
64; GFNISSE-NEXT:    rolb $4, %dil
65; GFNISSE-NEXT:    movl %edi, %eax
66; GFNISSE-NEXT:    andb $51, %al
67; GFNISSE-NEXT:    shlb $2, %al
68; GFNISSE-NEXT:    shrb $2, %dil
69; GFNISSE-NEXT:    andb $51, %dil
70; GFNISSE-NEXT:    orb %al, %dil
71; GFNISSE-NEXT:    movl %edi, %eax
72; GFNISSE-NEXT:    andb $85, %al
73; GFNISSE-NEXT:    addb %al, %al
74; GFNISSE-NEXT:    shrb %dil
75; GFNISSE-NEXT:    andb $85, %dil
76; GFNISSE-NEXT:    orb %dil, %al
77; GFNISSE-NEXT:    retq
78;
79; GFNIAVX-LABEL: test_bitreverse_i8:
80; GFNIAVX:       # %bb.0:
81; GFNIAVX-NEXT:    rolb $4, %dil
82; GFNIAVX-NEXT:    movl %edi, %eax
83; GFNIAVX-NEXT:    andb $51, %al
84; GFNIAVX-NEXT:    shlb $2, %al
85; GFNIAVX-NEXT:    shrb $2, %dil
86; GFNIAVX-NEXT:    andb $51, %dil
87; GFNIAVX-NEXT:    orb %al, %dil
88; GFNIAVX-NEXT:    movl %edi, %eax
89; GFNIAVX-NEXT:    andb $85, %al
90; GFNIAVX-NEXT:    addb %al, %al
91; GFNIAVX-NEXT:    shrb %dil
92; GFNIAVX-NEXT:    andb $85, %dil
93; GFNIAVX-NEXT:    orb %dil, %al
94; GFNIAVX-NEXT:    retq
95;
96; GFNIAVX2-LABEL: test_bitreverse_i8:
97; GFNIAVX2:       # %bb.0:
98; GFNIAVX2-NEXT:    rolb $4, %dil
99; GFNIAVX2-NEXT:    movl %edi, %eax
100; GFNIAVX2-NEXT:    andb $51, %al
101; GFNIAVX2-NEXT:    shlb $2, %al
102; GFNIAVX2-NEXT:    shrb $2, %dil
103; GFNIAVX2-NEXT:    andb $51, %dil
104; GFNIAVX2-NEXT:    orb %al, %dil
105; GFNIAVX2-NEXT:    movl %edi, %eax
106; GFNIAVX2-NEXT:    andb $85, %al
107; GFNIAVX2-NEXT:    addb %al, %al
108; GFNIAVX2-NEXT:    shrb %dil
109; GFNIAVX2-NEXT:    andb $85, %dil
110; GFNIAVX2-NEXT:    orb %dil, %al
111; GFNIAVX2-NEXT:    retq
112;
113; GFNIAVX512F-LABEL: test_bitreverse_i8:
114; GFNIAVX512F:       # %bb.0:
115; GFNIAVX512F-NEXT:    rolb $4, %dil
116; GFNIAVX512F-NEXT:    movl %edi, %eax
117; GFNIAVX512F-NEXT:    andb $51, %al
118; GFNIAVX512F-NEXT:    shlb $2, %al
119; GFNIAVX512F-NEXT:    shrb $2, %dil
120; GFNIAVX512F-NEXT:    andb $51, %dil
121; GFNIAVX512F-NEXT:    orb %al, %dil
122; GFNIAVX512F-NEXT:    movl %edi, %eax
123; GFNIAVX512F-NEXT:    andb $85, %al
124; GFNIAVX512F-NEXT:    addb %al, %al
125; GFNIAVX512F-NEXT:    shrb %dil
126; GFNIAVX512F-NEXT:    andb $85, %dil
127; GFNIAVX512F-NEXT:    orb %dil, %al
128; GFNIAVX512F-NEXT:    retq
129;
130; GFNIAVX512BW-LABEL: test_bitreverse_i8:
131; GFNIAVX512BW:       # %bb.0:
132; GFNIAVX512BW-NEXT:    rolb $4, %dil
133; GFNIAVX512BW-NEXT:    movl %edi, %eax
134; GFNIAVX512BW-NEXT:    andb $51, %al
135; GFNIAVX512BW-NEXT:    shlb $2, %al
136; GFNIAVX512BW-NEXT:    shrb $2, %dil
137; GFNIAVX512BW-NEXT:    andb $51, %dil
138; GFNIAVX512BW-NEXT:    orb %al, %dil
139; GFNIAVX512BW-NEXT:    movl %edi, %eax
140; GFNIAVX512BW-NEXT:    andb $85, %al
141; GFNIAVX512BW-NEXT:    addb %al, %al
142; GFNIAVX512BW-NEXT:    shrb %dil
143; GFNIAVX512BW-NEXT:    andb $85, %dil
144; GFNIAVX512BW-NEXT:    orb %dil, %al
145; GFNIAVX512BW-NEXT:    retq
146  %b = call i8 @llvm.bitreverse.i8(i8 %a)
147  ret i8 %b
148}
149
150define i16 @test_bitreverse_i16(i16 %a) nounwind {
151; SSE-LABEL: test_bitreverse_i16:
152; SSE:       # %bb.0:
153; SSE-NEXT:    # kill: def $edi killed $edi def $rdi
154; SSE-NEXT:    rolw $8, %di
155; SSE-NEXT:    movl %edi, %eax
156; SSE-NEXT:    andl $3855, %eax # imm = 0xF0F
157; SSE-NEXT:    shll $4, %eax
158; SSE-NEXT:    shrl $4, %edi
159; SSE-NEXT:    andl $3855, %edi # imm = 0xF0F
160; SSE-NEXT:    orl %eax, %edi
161; SSE-NEXT:    movl %edi, %eax
162; SSE-NEXT:    andl $13107, %eax # imm = 0x3333
163; SSE-NEXT:    shrl $2, %edi
164; SSE-NEXT:    andl $13107, %edi # imm = 0x3333
165; SSE-NEXT:    leal (%rdi,%rax,4), %eax
166; SSE-NEXT:    movl %eax, %ecx
167; SSE-NEXT:    andl $21845, %ecx # imm = 0x5555
168; SSE-NEXT:    shrl %eax
169; SSE-NEXT:    andl $21845, %eax # imm = 0x5555
170; SSE-NEXT:    leal (%rax,%rcx,2), %eax
171; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
172; SSE-NEXT:    retq
173;
174; AVX-LABEL: test_bitreverse_i16:
175; AVX:       # %bb.0:
176; AVX-NEXT:    # kill: def $edi killed $edi def $rdi
177; AVX-NEXT:    rolw $8, %di
178; AVX-NEXT:    movl %edi, %eax
179; AVX-NEXT:    andl $3855, %eax # imm = 0xF0F
180; AVX-NEXT:    shll $4, %eax
181; AVX-NEXT:    shrl $4, %edi
182; AVX-NEXT:    andl $3855, %edi # imm = 0xF0F
183; AVX-NEXT:    orl %eax, %edi
184; AVX-NEXT:    movl %edi, %eax
185; AVX-NEXT:    andl $13107, %eax # imm = 0x3333
186; AVX-NEXT:    shrl $2, %edi
187; AVX-NEXT:    andl $13107, %edi # imm = 0x3333
188; AVX-NEXT:    leal (%rdi,%rax,4), %eax
189; AVX-NEXT:    movl %eax, %ecx
190; AVX-NEXT:    andl $21845, %ecx # imm = 0x5555
191; AVX-NEXT:    shrl %eax
192; AVX-NEXT:    andl $21845, %eax # imm = 0x5555
193; AVX-NEXT:    leal (%rax,%rcx,2), %eax
194; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
195; AVX-NEXT:    retq
196;
197; XOP-LABEL: test_bitreverse_i16:
198; XOP:       # %bb.0:
199; XOP-NEXT:    vmovd %edi, %xmm0
200; XOP-NEXT:    vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0
201; XOP-NEXT:    vmovd %xmm0, %eax
202; XOP-NEXT:    # kill: def $ax killed $ax killed $eax
203; XOP-NEXT:    retq
204;
205; GFNISSE-LABEL: test_bitreverse_i16:
206; GFNISSE:       # %bb.0:
207; GFNISSE-NEXT:    # kill: def $edi killed $edi def $rdi
208; GFNISSE-NEXT:    rolw $8, %di
209; GFNISSE-NEXT:    movl %edi, %eax
210; GFNISSE-NEXT:    andl $3855, %eax # imm = 0xF0F
211; GFNISSE-NEXT:    shll $4, %eax
212; GFNISSE-NEXT:    shrl $4, %edi
213; GFNISSE-NEXT:    andl $3855, %edi # imm = 0xF0F
214; GFNISSE-NEXT:    orl %eax, %edi
215; GFNISSE-NEXT:    movl %edi, %eax
216; GFNISSE-NEXT:    andl $13107, %eax # imm = 0x3333
217; GFNISSE-NEXT:    shrl $2, %edi
218; GFNISSE-NEXT:    andl $13107, %edi # imm = 0x3333
219; GFNISSE-NEXT:    leal (%rdi,%rax,4), %eax
220; GFNISSE-NEXT:    movl %eax, %ecx
221; GFNISSE-NEXT:    andl $21845, %ecx # imm = 0x5555
222; GFNISSE-NEXT:    shrl %eax
223; GFNISSE-NEXT:    andl $21845, %eax # imm = 0x5555
224; GFNISSE-NEXT:    leal (%rax,%rcx,2), %eax
225; GFNISSE-NEXT:    # kill: def $ax killed $ax killed $eax
226; GFNISSE-NEXT:    retq
227;
228; GFNIAVX-LABEL: test_bitreverse_i16:
229; GFNIAVX:       # %bb.0:
230; GFNIAVX-NEXT:    # kill: def $edi killed $edi def $rdi
231; GFNIAVX-NEXT:    rolw $8, %di
232; GFNIAVX-NEXT:    movl %edi, %eax
233; GFNIAVX-NEXT:    andl $3855, %eax # imm = 0xF0F
234; GFNIAVX-NEXT:    shll $4, %eax
235; GFNIAVX-NEXT:    shrl $4, %edi
236; GFNIAVX-NEXT:    andl $3855, %edi # imm = 0xF0F
237; GFNIAVX-NEXT:    orl %eax, %edi
238; GFNIAVX-NEXT:    movl %edi, %eax
239; GFNIAVX-NEXT:    andl $13107, %eax # imm = 0x3333
240; GFNIAVX-NEXT:    shrl $2, %edi
241; GFNIAVX-NEXT:    andl $13107, %edi # imm = 0x3333
242; GFNIAVX-NEXT:    leal (%rdi,%rax,4), %eax
243; GFNIAVX-NEXT:    movl %eax, %ecx
244; GFNIAVX-NEXT:    andl $21845, %ecx # imm = 0x5555
245; GFNIAVX-NEXT:    shrl %eax
246; GFNIAVX-NEXT:    andl $21845, %eax # imm = 0x5555
247; GFNIAVX-NEXT:    leal (%rax,%rcx,2), %eax
248; GFNIAVX-NEXT:    # kill: def $ax killed $ax killed $eax
249; GFNIAVX-NEXT:    retq
250;
251; GFNIAVX2-LABEL: test_bitreverse_i16:
252; GFNIAVX2:       # %bb.0:
253; GFNIAVX2-NEXT:    # kill: def $edi killed $edi def $rdi
254; GFNIAVX2-NEXT:    rolw $8, %di
255; GFNIAVX2-NEXT:    movl %edi, %eax
256; GFNIAVX2-NEXT:    andl $3855, %eax # imm = 0xF0F
257; GFNIAVX2-NEXT:    shll $4, %eax
258; GFNIAVX2-NEXT:    shrl $4, %edi
259; GFNIAVX2-NEXT:    andl $3855, %edi # imm = 0xF0F
260; GFNIAVX2-NEXT:    orl %eax, %edi
261; GFNIAVX2-NEXT:    movl %edi, %eax
262; GFNIAVX2-NEXT:    andl $13107, %eax # imm = 0x3333
263; GFNIAVX2-NEXT:    shrl $2, %edi
264; GFNIAVX2-NEXT:    andl $13107, %edi # imm = 0x3333
265; GFNIAVX2-NEXT:    leal (%rdi,%rax,4), %eax
266; GFNIAVX2-NEXT:    movl %eax, %ecx
267; GFNIAVX2-NEXT:    andl $21845, %ecx # imm = 0x5555
268; GFNIAVX2-NEXT:    shrl %eax
269; GFNIAVX2-NEXT:    andl $21845, %eax # imm = 0x5555
270; GFNIAVX2-NEXT:    leal (%rax,%rcx,2), %eax
271; GFNIAVX2-NEXT:    # kill: def $ax killed $ax killed $eax
272; GFNIAVX2-NEXT:    retq
273;
274; GFNIAVX512F-LABEL: test_bitreverse_i16:
275; GFNIAVX512F:       # %bb.0:
276; GFNIAVX512F-NEXT:    # kill: def $edi killed $edi def $rdi
277; GFNIAVX512F-NEXT:    rolw $8, %di
278; GFNIAVX512F-NEXT:    movl %edi, %eax
279; GFNIAVX512F-NEXT:    andl $3855, %eax # imm = 0xF0F
280; GFNIAVX512F-NEXT:    shll $4, %eax
281; GFNIAVX512F-NEXT:    shrl $4, %edi
282; GFNIAVX512F-NEXT:    andl $3855, %edi # imm = 0xF0F
283; GFNIAVX512F-NEXT:    orl %eax, %edi
284; GFNIAVX512F-NEXT:    movl %edi, %eax
285; GFNIAVX512F-NEXT:    andl $13107, %eax # imm = 0x3333
286; GFNIAVX512F-NEXT:    shrl $2, %edi
287; GFNIAVX512F-NEXT:    andl $13107, %edi # imm = 0x3333
288; GFNIAVX512F-NEXT:    leal (%rdi,%rax,4), %eax
289; GFNIAVX512F-NEXT:    movl %eax, %ecx
290; GFNIAVX512F-NEXT:    andl $21845, %ecx # imm = 0x5555
291; GFNIAVX512F-NEXT:    shrl %eax
292; GFNIAVX512F-NEXT:    andl $21845, %eax # imm = 0x5555
293; GFNIAVX512F-NEXT:    leal (%rax,%rcx,2), %eax
294; GFNIAVX512F-NEXT:    # kill: def $ax killed $ax killed $eax
295; GFNIAVX512F-NEXT:    retq
296;
297; GFNIAVX512BW-LABEL: test_bitreverse_i16:
298; GFNIAVX512BW:       # %bb.0:
299; GFNIAVX512BW-NEXT:    # kill: def $edi killed $edi def $rdi
300; GFNIAVX512BW-NEXT:    rolw $8, %di
301; GFNIAVX512BW-NEXT:    movl %edi, %eax
302; GFNIAVX512BW-NEXT:    andl $3855, %eax # imm = 0xF0F
303; GFNIAVX512BW-NEXT:    shll $4, %eax
304; GFNIAVX512BW-NEXT:    shrl $4, %edi
305; GFNIAVX512BW-NEXT:    andl $3855, %edi # imm = 0xF0F
306; GFNIAVX512BW-NEXT:    orl %eax, %edi
307; GFNIAVX512BW-NEXT:    movl %edi, %eax
308; GFNIAVX512BW-NEXT:    andl $13107, %eax # imm = 0x3333
309; GFNIAVX512BW-NEXT:    shrl $2, %edi
310; GFNIAVX512BW-NEXT:    andl $13107, %edi # imm = 0x3333
311; GFNIAVX512BW-NEXT:    leal (%rdi,%rax,4), %eax
312; GFNIAVX512BW-NEXT:    movl %eax, %ecx
313; GFNIAVX512BW-NEXT:    andl $21845, %ecx # imm = 0x5555
314; GFNIAVX512BW-NEXT:    shrl %eax
315; GFNIAVX512BW-NEXT:    andl $21845, %eax # imm = 0x5555
316; GFNIAVX512BW-NEXT:    leal (%rax,%rcx,2), %eax
317; GFNIAVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
318; GFNIAVX512BW-NEXT:    retq
319  %b = call i16 @llvm.bitreverse.i16(i16 %a)
320  ret i16 %b
321}
322
323define i32 @test_bitreverse_i32(i32 %a) nounwind {
324; SSE-LABEL: test_bitreverse_i32:
325; SSE:       # %bb.0:
326; SSE-NEXT:    # kill: def $edi killed $edi def $rdi
327; SSE-NEXT:    bswapl %edi
328; SSE-NEXT:    movl %edi, %eax
329; SSE-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
330; SSE-NEXT:    shll $4, %eax
331; SSE-NEXT:    shrl $4, %edi
332; SSE-NEXT:    andl $252645135, %edi # imm = 0xF0F0F0F
333; SSE-NEXT:    orl %eax, %edi
334; SSE-NEXT:    movl %edi, %eax
335; SSE-NEXT:    andl $858993459, %eax # imm = 0x33333333
336; SSE-NEXT:    shrl $2, %edi
337; SSE-NEXT:    andl $858993459, %edi # imm = 0x33333333
338; SSE-NEXT:    leal (%rdi,%rax,4), %eax
339; SSE-NEXT:    movl %eax, %ecx
340; SSE-NEXT:    andl $1431655765, %ecx # imm = 0x55555555
341; SSE-NEXT:    shrl %eax
342; SSE-NEXT:    andl $1431655765, %eax # imm = 0x55555555
343; SSE-NEXT:    leal (%rax,%rcx,2), %eax
344; SSE-NEXT:    retq
345;
346; AVX-LABEL: test_bitreverse_i32:
347; AVX:       # %bb.0:
348; AVX-NEXT:    # kill: def $edi killed $edi def $rdi
349; AVX-NEXT:    bswapl %edi
350; AVX-NEXT:    movl %edi, %eax
351; AVX-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
352; AVX-NEXT:    shll $4, %eax
353; AVX-NEXT:    shrl $4, %edi
354; AVX-NEXT:    andl $252645135, %edi # imm = 0xF0F0F0F
355; AVX-NEXT:    orl %eax, %edi
356; AVX-NEXT:    movl %edi, %eax
357; AVX-NEXT:    andl $858993459, %eax # imm = 0x33333333
358; AVX-NEXT:    shrl $2, %edi
359; AVX-NEXT:    andl $858993459, %edi # imm = 0x33333333
360; AVX-NEXT:    leal (%rdi,%rax,4), %eax
361; AVX-NEXT:    movl %eax, %ecx
362; AVX-NEXT:    andl $1431655765, %ecx # imm = 0x55555555
363; AVX-NEXT:    shrl %eax
364; AVX-NEXT:    andl $1431655765, %eax # imm = 0x55555555
365; AVX-NEXT:    leal (%rax,%rcx,2), %eax
366; AVX-NEXT:    retq
367;
368; XOP-LABEL: test_bitreverse_i32:
369; XOP:       # %bb.0:
370; XOP-NEXT:    vmovd %edi, %xmm0
371; XOP-NEXT:    vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0
372; XOP-NEXT:    vmovd %xmm0, %eax
373; XOP-NEXT:    retq
374;
375; GFNISSE-LABEL: test_bitreverse_i32:
376; GFNISSE:       # %bb.0:
377; GFNISSE-NEXT:    # kill: def $edi killed $edi def $rdi
378; GFNISSE-NEXT:    bswapl %edi
379; GFNISSE-NEXT:    movl %edi, %eax
380; GFNISSE-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
381; GFNISSE-NEXT:    shll $4, %eax
382; GFNISSE-NEXT:    shrl $4, %edi
383; GFNISSE-NEXT:    andl $252645135, %edi # imm = 0xF0F0F0F
384; GFNISSE-NEXT:    orl %eax, %edi
385; GFNISSE-NEXT:    movl %edi, %eax
386; GFNISSE-NEXT:    andl $858993459, %eax # imm = 0x33333333
387; GFNISSE-NEXT:    shrl $2, %edi
388; GFNISSE-NEXT:    andl $858993459, %edi # imm = 0x33333333
389; GFNISSE-NEXT:    leal (%rdi,%rax,4), %eax
390; GFNISSE-NEXT:    movl %eax, %ecx
391; GFNISSE-NEXT:    andl $1431655765, %ecx # imm = 0x55555555
392; GFNISSE-NEXT:    shrl %eax
393; GFNISSE-NEXT:    andl $1431655765, %eax # imm = 0x55555555
394; GFNISSE-NEXT:    leal (%rax,%rcx,2), %eax
395; GFNISSE-NEXT:    retq
396;
397; GFNIAVX-LABEL: test_bitreverse_i32:
398; GFNIAVX:       # %bb.0:
399; GFNIAVX-NEXT:    # kill: def $edi killed $edi def $rdi
400; GFNIAVX-NEXT:    bswapl %edi
401; GFNIAVX-NEXT:    movl %edi, %eax
402; GFNIAVX-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
403; GFNIAVX-NEXT:    shll $4, %eax
404; GFNIAVX-NEXT:    shrl $4, %edi
405; GFNIAVX-NEXT:    andl $252645135, %edi # imm = 0xF0F0F0F
406; GFNIAVX-NEXT:    orl %eax, %edi
407; GFNIAVX-NEXT:    movl %edi, %eax
408; GFNIAVX-NEXT:    andl $858993459, %eax # imm = 0x33333333
409; GFNIAVX-NEXT:    shrl $2, %edi
410; GFNIAVX-NEXT:    andl $858993459, %edi # imm = 0x33333333
411; GFNIAVX-NEXT:    leal (%rdi,%rax,4), %eax
412; GFNIAVX-NEXT:    movl %eax, %ecx
413; GFNIAVX-NEXT:    andl $1431655765, %ecx # imm = 0x55555555
414; GFNIAVX-NEXT:    shrl %eax
415; GFNIAVX-NEXT:    andl $1431655765, %eax # imm = 0x55555555
416; GFNIAVX-NEXT:    leal (%rax,%rcx,2), %eax
417; GFNIAVX-NEXT:    retq
418;
419; GFNIAVX2-LABEL: test_bitreverse_i32:
420; GFNIAVX2:       # %bb.0:
421; GFNIAVX2-NEXT:    # kill: def $edi killed $edi def $rdi
422; GFNIAVX2-NEXT:    bswapl %edi
423; GFNIAVX2-NEXT:    movl %edi, %eax
424; GFNIAVX2-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
425; GFNIAVX2-NEXT:    shll $4, %eax
426; GFNIAVX2-NEXT:    shrl $4, %edi
427; GFNIAVX2-NEXT:    andl $252645135, %edi # imm = 0xF0F0F0F
428; GFNIAVX2-NEXT:    orl %eax, %edi
429; GFNIAVX2-NEXT:    movl %edi, %eax
430; GFNIAVX2-NEXT:    andl $858993459, %eax # imm = 0x33333333
431; GFNIAVX2-NEXT:    shrl $2, %edi
432; GFNIAVX2-NEXT:    andl $858993459, %edi # imm = 0x33333333
433; GFNIAVX2-NEXT:    leal (%rdi,%rax,4), %eax
434; GFNIAVX2-NEXT:    movl %eax, %ecx
435; GFNIAVX2-NEXT:    andl $1431655765, %ecx # imm = 0x55555555
436; GFNIAVX2-NEXT:    shrl %eax
437; GFNIAVX2-NEXT:    andl $1431655765, %eax # imm = 0x55555555
438; GFNIAVX2-NEXT:    leal (%rax,%rcx,2), %eax
439; GFNIAVX2-NEXT:    retq
440;
441; GFNIAVX512F-LABEL: test_bitreverse_i32:
442; GFNIAVX512F:       # %bb.0:
443; GFNIAVX512F-NEXT:    # kill: def $edi killed $edi def $rdi
444; GFNIAVX512F-NEXT:    bswapl %edi
445; GFNIAVX512F-NEXT:    movl %edi, %eax
446; GFNIAVX512F-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
447; GFNIAVX512F-NEXT:    shll $4, %eax
448; GFNIAVX512F-NEXT:    shrl $4, %edi
449; GFNIAVX512F-NEXT:    andl $252645135, %edi # imm = 0xF0F0F0F
450; GFNIAVX512F-NEXT:    orl %eax, %edi
451; GFNIAVX512F-NEXT:    movl %edi, %eax
452; GFNIAVX512F-NEXT:    andl $858993459, %eax # imm = 0x33333333
453; GFNIAVX512F-NEXT:    shrl $2, %edi
454; GFNIAVX512F-NEXT:    andl $858993459, %edi # imm = 0x33333333
455; GFNIAVX512F-NEXT:    leal (%rdi,%rax,4), %eax
456; GFNIAVX512F-NEXT:    movl %eax, %ecx
457; GFNIAVX512F-NEXT:    andl $1431655765, %ecx # imm = 0x55555555
458; GFNIAVX512F-NEXT:    shrl %eax
459; GFNIAVX512F-NEXT:    andl $1431655765, %eax # imm = 0x55555555
460; GFNIAVX512F-NEXT:    leal (%rax,%rcx,2), %eax
461; GFNIAVX512F-NEXT:    retq
462;
463; GFNIAVX512BW-LABEL: test_bitreverse_i32:
464; GFNIAVX512BW:       # %bb.0:
465; GFNIAVX512BW-NEXT:    # kill: def $edi killed $edi def $rdi
466; GFNIAVX512BW-NEXT:    bswapl %edi
467; GFNIAVX512BW-NEXT:    movl %edi, %eax
468; GFNIAVX512BW-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F
469; GFNIAVX512BW-NEXT:    shll $4, %eax
470; GFNIAVX512BW-NEXT:    shrl $4, %edi
471; GFNIAVX512BW-NEXT:    andl $252645135, %edi # imm = 0xF0F0F0F
472; GFNIAVX512BW-NEXT:    orl %eax, %edi
473; GFNIAVX512BW-NEXT:    movl %edi, %eax
474; GFNIAVX512BW-NEXT:    andl $858993459, %eax # imm = 0x33333333
475; GFNIAVX512BW-NEXT:    shrl $2, %edi
476; GFNIAVX512BW-NEXT:    andl $858993459, %edi # imm = 0x33333333
477; GFNIAVX512BW-NEXT:    leal (%rdi,%rax,4), %eax
478; GFNIAVX512BW-NEXT:    movl %eax, %ecx
479; GFNIAVX512BW-NEXT:    andl $1431655765, %ecx # imm = 0x55555555
480; GFNIAVX512BW-NEXT:    shrl %eax
481; GFNIAVX512BW-NEXT:    andl $1431655765, %eax # imm = 0x55555555
482; GFNIAVX512BW-NEXT:    leal (%rax,%rcx,2), %eax
483; GFNIAVX512BW-NEXT:    retq
484  %b = call i32 @llvm.bitreverse.i32(i32 %a)
485  ret i32 %b
486}
487
488define i64 @test_bitreverse_i64(i64 %a) nounwind {
489; SSE-LABEL: test_bitreverse_i64:
490; SSE:       # %bb.0:
491; SSE-NEXT:    bswapq %rdi
492; SSE-NEXT:    movq %rdi, %rax
493; SSE-NEXT:    shrq $4, %rax
494; SSE-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F
495; SSE-NEXT:    andq %rcx, %rax
496; SSE-NEXT:    andq %rcx, %rdi
497; SSE-NEXT:    shlq $4, %rdi
498; SSE-NEXT:    orq %rax, %rdi
499; SSE-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333
500; SSE-NEXT:    movq %rdi, %rcx
501; SSE-NEXT:    andq %rax, %rcx
502; SSE-NEXT:    shrq $2, %rdi
503; SSE-NEXT:    andq %rax, %rdi
504; SSE-NEXT:    leaq (%rdi,%rcx,4), %rax
505; SSE-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555
506; SSE-NEXT:    movq %rax, %rdx
507; SSE-NEXT:    andq %rcx, %rdx
508; SSE-NEXT:    shrq %rax
509; SSE-NEXT:    andq %rcx, %rax
510; SSE-NEXT:    leaq (%rax,%rdx,2), %rax
511; SSE-NEXT:    retq
512;
513; AVX-LABEL: test_bitreverse_i64:
514; AVX:       # %bb.0:
515; AVX-NEXT:    bswapq %rdi
516; AVX-NEXT:    movq %rdi, %rax
517; AVX-NEXT:    shrq $4, %rax
518; AVX-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F
519; AVX-NEXT:    andq %rcx, %rax
520; AVX-NEXT:    andq %rcx, %rdi
521; AVX-NEXT:    shlq $4, %rdi
522; AVX-NEXT:    orq %rax, %rdi
523; AVX-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333
524; AVX-NEXT:    movq %rdi, %rcx
525; AVX-NEXT:    andq %rax, %rcx
526; AVX-NEXT:    shrq $2, %rdi
527; AVX-NEXT:    andq %rax, %rdi
528; AVX-NEXT:    leaq (%rdi,%rcx,4), %rax
529; AVX-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555
530; AVX-NEXT:    movq %rax, %rdx
531; AVX-NEXT:    andq %rcx, %rdx
532; AVX-NEXT:    shrq %rax
533; AVX-NEXT:    andq %rcx, %rax
534; AVX-NEXT:    leaq (%rax,%rdx,2), %rax
535; AVX-NEXT:    retq
536;
537; XOP-LABEL: test_bitreverse_i64:
538; XOP:       # %bb.0:
539; XOP-NEXT:    vmovq %rdi, %xmm0
540; XOP-NEXT:    vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0
541; XOP-NEXT:    vmovq %xmm0, %rax
542; XOP-NEXT:    retq
543;
544; GFNISSE-LABEL: test_bitreverse_i64:
545; GFNISSE:       # %bb.0:
546; GFNISSE-NEXT:    bswapq %rdi
547; GFNISSE-NEXT:    movq %rdi, %rax
548; GFNISSE-NEXT:    shrq $4, %rax
549; GFNISSE-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F
550; GFNISSE-NEXT:    andq %rcx, %rax
551; GFNISSE-NEXT:    andq %rcx, %rdi
552; GFNISSE-NEXT:    shlq $4, %rdi
553; GFNISSE-NEXT:    orq %rax, %rdi
554; GFNISSE-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333
555; GFNISSE-NEXT:    movq %rdi, %rcx
556; GFNISSE-NEXT:    andq %rax, %rcx
557; GFNISSE-NEXT:    shrq $2, %rdi
558; GFNISSE-NEXT:    andq %rax, %rdi
559; GFNISSE-NEXT:    leaq (%rdi,%rcx,4), %rax
560; GFNISSE-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555
561; GFNISSE-NEXT:    movq %rax, %rdx
562; GFNISSE-NEXT:    andq %rcx, %rdx
563; GFNISSE-NEXT:    shrq %rax
564; GFNISSE-NEXT:    andq %rcx, %rax
565; GFNISSE-NEXT:    leaq (%rax,%rdx,2), %rax
566; GFNISSE-NEXT:    retq
567;
568; GFNIAVX-LABEL: test_bitreverse_i64:
569; GFNIAVX:       # %bb.0:
570; GFNIAVX-NEXT:    bswapq %rdi
571; GFNIAVX-NEXT:    movq %rdi, %rax
572; GFNIAVX-NEXT:    shrq $4, %rax
573; GFNIAVX-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F
574; GFNIAVX-NEXT:    andq %rcx, %rax
575; GFNIAVX-NEXT:    andq %rcx, %rdi
576; GFNIAVX-NEXT:    shlq $4, %rdi
577; GFNIAVX-NEXT:    orq %rax, %rdi
578; GFNIAVX-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333
579; GFNIAVX-NEXT:    movq %rdi, %rcx
580; GFNIAVX-NEXT:    andq %rax, %rcx
581; GFNIAVX-NEXT:    shrq $2, %rdi
582; GFNIAVX-NEXT:    andq %rax, %rdi
583; GFNIAVX-NEXT:    leaq (%rdi,%rcx,4), %rax
584; GFNIAVX-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555
585; GFNIAVX-NEXT:    movq %rax, %rdx
586; GFNIAVX-NEXT:    andq %rcx, %rdx
587; GFNIAVX-NEXT:    shrq %rax
588; GFNIAVX-NEXT:    andq %rcx, %rax
589; GFNIAVX-NEXT:    leaq (%rax,%rdx,2), %rax
590; GFNIAVX-NEXT:    retq
591;
592; GFNIAVX2-LABEL: test_bitreverse_i64:
593; GFNIAVX2:       # %bb.0:
594; GFNIAVX2-NEXT:    bswapq %rdi
595; GFNIAVX2-NEXT:    movq %rdi, %rax
596; GFNIAVX2-NEXT:    shrq $4, %rax
597; GFNIAVX2-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F
598; GFNIAVX2-NEXT:    andq %rcx, %rax
599; GFNIAVX2-NEXT:    andq %rcx, %rdi
600; GFNIAVX2-NEXT:    shlq $4, %rdi
601; GFNIAVX2-NEXT:    orq %rax, %rdi
602; GFNIAVX2-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333
603; GFNIAVX2-NEXT:    movq %rdi, %rcx
604; GFNIAVX2-NEXT:    andq %rax, %rcx
605; GFNIAVX2-NEXT:    shrq $2, %rdi
606; GFNIAVX2-NEXT:    andq %rax, %rdi
607; GFNIAVX2-NEXT:    leaq (%rdi,%rcx,4), %rax
608; GFNIAVX2-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555
609; GFNIAVX2-NEXT:    movq %rax, %rdx
610; GFNIAVX2-NEXT:    andq %rcx, %rdx
611; GFNIAVX2-NEXT:    shrq %rax
612; GFNIAVX2-NEXT:    andq %rcx, %rax
613; GFNIAVX2-NEXT:    leaq (%rax,%rdx,2), %rax
614; GFNIAVX2-NEXT:    retq
615;
616; GFNIAVX512F-LABEL: test_bitreverse_i64:
617; GFNIAVX512F:       # %bb.0:
618; GFNIAVX512F-NEXT:    bswapq %rdi
619; GFNIAVX512F-NEXT:    movq %rdi, %rax
620; GFNIAVX512F-NEXT:    shrq $4, %rax
621; GFNIAVX512F-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F
622; GFNIAVX512F-NEXT:    andq %rcx, %rax
623; GFNIAVX512F-NEXT:    andq %rcx, %rdi
624; GFNIAVX512F-NEXT:    shlq $4, %rdi
625; GFNIAVX512F-NEXT:    orq %rax, %rdi
626; GFNIAVX512F-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333
627; GFNIAVX512F-NEXT:    movq %rdi, %rcx
628; GFNIAVX512F-NEXT:    andq %rax, %rcx
629; GFNIAVX512F-NEXT:    shrq $2, %rdi
630; GFNIAVX512F-NEXT:    andq %rax, %rdi
631; GFNIAVX512F-NEXT:    leaq (%rdi,%rcx,4), %rax
632; GFNIAVX512F-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555
633; GFNIAVX512F-NEXT:    movq %rax, %rdx
634; GFNIAVX512F-NEXT:    andq %rcx, %rdx
635; GFNIAVX512F-NEXT:    shrq %rax
636; GFNIAVX512F-NEXT:    andq %rcx, %rax
637; GFNIAVX512F-NEXT:    leaq (%rax,%rdx,2), %rax
638; GFNIAVX512F-NEXT:    retq
639;
640; GFNIAVX512BW-LABEL: test_bitreverse_i64:
641; GFNIAVX512BW:       # %bb.0:
642; GFNIAVX512BW-NEXT:    bswapq %rdi
643; GFNIAVX512BW-NEXT:    movq %rdi, %rax
644; GFNIAVX512BW-NEXT:    shrq $4, %rax
645; GFNIAVX512BW-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F
646; GFNIAVX512BW-NEXT:    andq %rcx, %rax
647; GFNIAVX512BW-NEXT:    andq %rcx, %rdi
648; GFNIAVX512BW-NEXT:    shlq $4, %rdi
649; GFNIAVX512BW-NEXT:    orq %rax, %rdi
650; GFNIAVX512BW-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333
651; GFNIAVX512BW-NEXT:    movq %rdi, %rcx
652; GFNIAVX512BW-NEXT:    andq %rax, %rcx
653; GFNIAVX512BW-NEXT:    shrq $2, %rdi
654; GFNIAVX512BW-NEXT:    andq %rax, %rdi
655; GFNIAVX512BW-NEXT:    leaq (%rdi,%rcx,4), %rax
656; GFNIAVX512BW-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555
657; GFNIAVX512BW-NEXT:    movq %rax, %rdx
658; GFNIAVX512BW-NEXT:    andq %rcx, %rdx
659; GFNIAVX512BW-NEXT:    shrq %rax
660; GFNIAVX512BW-NEXT:    andq %rcx, %rax
661; GFNIAVX512BW-NEXT:    leaq (%rax,%rdx,2), %rax
662; GFNIAVX512BW-NEXT:    retq
663  %b = call i64 @llvm.bitreverse.i64(i64 %a)
664  ret i64 %b
665}
666
667define <16 x i8> @test_bitreverse_v16i8(<16 x i8> %a) nounwind {
668; SSE2-LABEL: test_bitreverse_v16i8:
669; SSE2:       # %bb.0:
670; SSE2-NEXT:    movdqa %xmm0, %xmm1
671; SSE2-NEXT:    psllw $4, %xmm1
672; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
673; SSE2-NEXT:    psrlw $4, %xmm0
674; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
675; SSE2-NEXT:    por %xmm1, %xmm0
676; SSE2-NEXT:    movdqa %xmm0, %xmm1
677; SSE2-NEXT:    psrlw $2, %xmm1
678; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
679; SSE2-NEXT:    pand %xmm2, %xmm1
680; SSE2-NEXT:    pand %xmm2, %xmm0
681; SSE2-NEXT:    psllw $2, %xmm0
682; SSE2-NEXT:    por %xmm1, %xmm0
683; SSE2-NEXT:    movdqa %xmm0, %xmm1
684; SSE2-NEXT:    psrlw $1, %xmm1
685; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
686; SSE2-NEXT:    pand %xmm2, %xmm1
687; SSE2-NEXT:    pand %xmm2, %xmm0
688; SSE2-NEXT:    paddb %xmm0, %xmm0
689; SSE2-NEXT:    por %xmm1, %xmm0
690; SSE2-NEXT:    retq
691;
692; SSSE3-LABEL: test_bitreverse_v16i8:
693; SSSE3:       # %bb.0:
694; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
695; SSSE3-NEXT:    movdqa %xmm0, %xmm2
696; SSSE3-NEXT:    pand %xmm1, %xmm2
697; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
698; SSSE3-NEXT:    pshufb %xmm2, %xmm3
699; SSSE3-NEXT:    psrlw $4, %xmm0
700; SSSE3-NEXT:    pand %xmm1, %xmm0
701; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
702; SSSE3-NEXT:    pshufb %xmm0, %xmm1
703; SSSE3-NEXT:    por %xmm3, %xmm1
704; SSSE3-NEXT:    movdqa %xmm1, %xmm0
705; SSSE3-NEXT:    retq
706;
707; AVX-LABEL: test_bitreverse_v16i8:
708; AVX:       # %bb.0:
709; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
710; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
711; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
712; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
713; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
714; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
715; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
716; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
717; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
718; AVX-NEXT:    retq
719;
720; XOP-LABEL: test_bitreverse_v16i8:
721; XOP:       # %bb.0:
722; XOP-NEXT:    vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0
723; XOP-NEXT:    retq
724;
725; GFNISSE-LABEL: test_bitreverse_v16i8:
726; GFNISSE:       # %bb.0:
727; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
728; GFNISSE-NEXT:    retq
729;
730; GFNIAVX-LABEL: test_bitreverse_v16i8:
731; GFNIAVX:       # %bb.0:
732; GFNIAVX-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
733; GFNIAVX-NEXT:    retq
734;
735; GFNIAVX2-LABEL: test_bitreverse_v16i8:
736; GFNIAVX2:       # %bb.0:
737; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
738; GFNIAVX2-NEXT:    retq
739;
740; GFNIAVX512F-LABEL: test_bitreverse_v16i8:
741; GFNIAVX512F:       # %bb.0:
742; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
743; GFNIAVX512F-NEXT:    retq
744;
745; GFNIAVX512BW-LABEL: test_bitreverse_v16i8:
746; GFNIAVX512BW:       # %bb.0:
747; GFNIAVX512BW-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
748; GFNIAVX512BW-NEXT:    retq
749  %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %a)
750  ret <16 x i8> %b
751}
752
753define <8 x i16> @test_bitreverse_v8i16(<8 x i16> %a) nounwind {
754; SSE2-LABEL: test_bitreverse_v8i16:
755; SSE2:       # %bb.0:
756; SSE2-NEXT:    movdqa %xmm0, %xmm1
757; SSE2-NEXT:    psrlw $8, %xmm1
758; SSE2-NEXT:    psllw $8, %xmm0
759; SSE2-NEXT:    por %xmm1, %xmm0
760; SSE2-NEXT:    movdqa %xmm0, %xmm1
761; SSE2-NEXT:    psllw $4, %xmm1
762; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
763; SSE2-NEXT:    psrlw $4, %xmm0
764; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
765; SSE2-NEXT:    por %xmm1, %xmm0
766; SSE2-NEXT:    movdqa %xmm0, %xmm1
767; SSE2-NEXT:    psrlw $2, %xmm1
768; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
769; SSE2-NEXT:    pand %xmm2, %xmm1
770; SSE2-NEXT:    pand %xmm2, %xmm0
771; SSE2-NEXT:    psllw $2, %xmm0
772; SSE2-NEXT:    por %xmm1, %xmm0
773; SSE2-NEXT:    movdqa %xmm0, %xmm1
774; SSE2-NEXT:    psrlw $1, %xmm1
775; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
776; SSE2-NEXT:    pand %xmm2, %xmm1
777; SSE2-NEXT:    pand %xmm2, %xmm0
778; SSE2-NEXT:    paddb %xmm0, %xmm0
779; SSE2-NEXT:    por %xmm1, %xmm0
780; SSE2-NEXT:    retq
781;
782; SSSE3-LABEL: test_bitreverse_v8i16:
783; SSSE3:       # %bb.0:
784; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
785; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
786; SSSE3-NEXT:    movdqa %xmm0, %xmm2
787; SSSE3-NEXT:    pand %xmm1, %xmm2
788; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
789; SSSE3-NEXT:    pshufb %xmm2, %xmm3
790; SSSE3-NEXT:    psrlw $4, %xmm0
791; SSSE3-NEXT:    pand %xmm1, %xmm0
792; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
793; SSSE3-NEXT:    pshufb %xmm0, %xmm1
794; SSSE3-NEXT:    por %xmm3, %xmm1
795; SSSE3-NEXT:    movdqa %xmm1, %xmm0
796; SSSE3-NEXT:    retq
797;
798; AVX-LABEL: test_bitreverse_v8i16:
799; AVX:       # %bb.0:
800; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
801; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
802; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
803; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
804; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
805; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
806; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
807; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
808; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
809; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
810; AVX-NEXT:    retq
811;
812; XOP-LABEL: test_bitreverse_v8i16:
813; XOP:       # %bb.0:
814; XOP-NEXT:    vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0
815; XOP-NEXT:    retq
816;
817; GFNISSE-LABEL: test_bitreverse_v8i16:
818; GFNISSE:       # %bb.0:
819; GFNISSE-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
820; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
821; GFNISSE-NEXT:    retq
822;
823; GFNIAVX-LABEL: test_bitreverse_v8i16:
824; GFNIAVX:       # %bb.0:
825; GFNIAVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
826; GFNIAVX-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
827; GFNIAVX-NEXT:    retq
828;
829; GFNIAVX2-LABEL: test_bitreverse_v8i16:
830; GFNIAVX2:       # %bb.0:
831; GFNIAVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
832; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
833; GFNIAVX2-NEXT:    retq
834;
835; GFNIAVX512F-LABEL: test_bitreverse_v8i16:
836; GFNIAVX512F:       # %bb.0:
837; GFNIAVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
838; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
839; GFNIAVX512F-NEXT:    retq
840;
841; GFNIAVX512BW-LABEL: test_bitreverse_v8i16:
842; GFNIAVX512BW:       # %bb.0:
843; GFNIAVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
844; GFNIAVX512BW-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
845; GFNIAVX512BW-NEXT:    retq
846  %b = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a)
847  ret <8 x i16> %b
848}
849
850define <4 x i32> @test_bitreverse_v4i32(<4 x i32> %a) nounwind {
851; SSE2-LABEL: test_bitreverse_v4i32:
852; SSE2:       # %bb.0:
853; SSE2-NEXT:    pxor %xmm1, %xmm1
854; SSE2-NEXT:    movdqa %xmm0, %xmm2
855; 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]
856; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
857; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
858; 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]
859; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
860; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
861; SSE2-NEXT:    packuswb %xmm2, %xmm0
862; SSE2-NEXT:    movdqa %xmm0, %xmm1
863; SSE2-NEXT:    psllw $4, %xmm1
864; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
865; SSE2-NEXT:    psrlw $4, %xmm0
866; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
867; SSE2-NEXT:    por %xmm1, %xmm0
868; SSE2-NEXT:    movdqa %xmm0, %xmm1
869; SSE2-NEXT:    psrlw $2, %xmm1
870; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
871; SSE2-NEXT:    pand %xmm2, %xmm1
872; SSE2-NEXT:    pand %xmm2, %xmm0
873; SSE2-NEXT:    psllw $2, %xmm0
874; SSE2-NEXT:    por %xmm1, %xmm0
875; SSE2-NEXT:    movdqa %xmm0, %xmm1
876; SSE2-NEXT:    psrlw $1, %xmm1
877; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
878; SSE2-NEXT:    pand %xmm2, %xmm1
879; SSE2-NEXT:    pand %xmm2, %xmm0
880; SSE2-NEXT:    paddb %xmm0, %xmm0
881; SSE2-NEXT:    por %xmm1, %xmm0
882; SSE2-NEXT:    retq
883;
884; SSSE3-LABEL: test_bitreverse_v4i32:
885; SSSE3:       # %bb.0:
886; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
887; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
888; SSSE3-NEXT:    movdqa %xmm0, %xmm2
889; SSSE3-NEXT:    pand %xmm1, %xmm2
890; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
891; SSSE3-NEXT:    pshufb %xmm2, %xmm3
892; SSSE3-NEXT:    psrlw $4, %xmm0
893; SSSE3-NEXT:    pand %xmm1, %xmm0
894; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
895; SSSE3-NEXT:    pshufb %xmm0, %xmm1
896; SSSE3-NEXT:    por %xmm3, %xmm1
897; SSSE3-NEXT:    movdqa %xmm1, %xmm0
898; SSSE3-NEXT:    retq
899;
900; AVX-LABEL: test_bitreverse_v4i32:
901; AVX:       # %bb.0:
902; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
903; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
904; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
905; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
906; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
907; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
908; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
909; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
910; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
911; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
912; AVX-NEXT:    retq
913;
914; XOP-LABEL: test_bitreverse_v4i32:
915; XOP:       # %bb.0:
916; XOP-NEXT:    vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0
917; XOP-NEXT:    retq
918;
919; GFNISSE-LABEL: test_bitreverse_v4i32:
920; GFNISSE:       # %bb.0:
921; GFNISSE-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
922; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
923; GFNISSE-NEXT:    retq
924;
925; GFNIAVX-LABEL: test_bitreverse_v4i32:
926; GFNIAVX:       # %bb.0:
927; GFNIAVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
928; GFNIAVX-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
929; GFNIAVX-NEXT:    retq
930;
931; GFNIAVX2-LABEL: test_bitreverse_v4i32:
932; GFNIAVX2:       # %bb.0:
933; GFNIAVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
934; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
935; GFNIAVX2-NEXT:    retq
936;
937; GFNIAVX512F-LABEL: test_bitreverse_v4i32:
938; GFNIAVX512F:       # %bb.0:
939; GFNIAVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
940; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
941; GFNIAVX512F-NEXT:    retq
942;
943; GFNIAVX512BW-LABEL: test_bitreverse_v4i32:
944; GFNIAVX512BW:       # %bb.0:
945; GFNIAVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
946; GFNIAVX512BW-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
947; GFNIAVX512BW-NEXT:    retq
948  %b = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a)
949  ret <4 x i32> %b
950}
951
952define <2 x i64> @test_bitreverse_v2i64(<2 x i64> %a) nounwind {
953; SSE2-LABEL: test_bitreverse_v2i64:
954; SSE2:       # %bb.0:
955; SSE2-NEXT:    pxor %xmm1, %xmm1
956; SSE2-NEXT:    movdqa %xmm0, %xmm2
957; 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]
958; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
959; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
960; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
961; 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]
962; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
963; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
964; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
965; SSE2-NEXT:    packuswb %xmm2, %xmm0
966; SSE2-NEXT:    movdqa %xmm0, %xmm1
967; SSE2-NEXT:    psllw $4, %xmm1
968; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
969; SSE2-NEXT:    psrlw $4, %xmm0
970; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
971; SSE2-NEXT:    por %xmm1, %xmm0
972; SSE2-NEXT:    movdqa %xmm0, %xmm1
973; SSE2-NEXT:    psrlw $2, %xmm1
974; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
975; SSE2-NEXT:    pand %xmm2, %xmm1
976; SSE2-NEXT:    pand %xmm2, %xmm0
977; SSE2-NEXT:    psllw $2, %xmm0
978; SSE2-NEXT:    por %xmm1, %xmm0
979; SSE2-NEXT:    movdqa %xmm0, %xmm1
980; SSE2-NEXT:    psrlw $1, %xmm1
981; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
982; SSE2-NEXT:    pand %xmm2, %xmm1
983; SSE2-NEXT:    pand %xmm2, %xmm0
984; SSE2-NEXT:    paddb %xmm0, %xmm0
985; SSE2-NEXT:    por %xmm1, %xmm0
986; SSE2-NEXT:    retq
987;
988; SSSE3-LABEL: test_bitreverse_v2i64:
989; SSSE3:       # %bb.0:
990; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
991; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
992; SSSE3-NEXT:    movdqa %xmm0, %xmm2
993; SSSE3-NEXT:    pand %xmm1, %xmm2
994; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
995; SSSE3-NEXT:    pshufb %xmm2, %xmm3
996; SSSE3-NEXT:    psrlw $4, %xmm0
997; SSSE3-NEXT:    pand %xmm1, %xmm0
998; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
999; SSSE3-NEXT:    pshufb %xmm0, %xmm1
1000; SSSE3-NEXT:    por %xmm3, %xmm1
1001; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1002; SSSE3-NEXT:    retq
1003;
1004; AVX-LABEL: test_bitreverse_v2i64:
1005; AVX:       # %bb.0:
1006; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1007; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1008; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
1009; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1010; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
1011; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
1012; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
1013; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1014; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
1015; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
1016; AVX-NEXT:    retq
1017;
1018; XOP-LABEL: test_bitreverse_v2i64:
1019; XOP:       # %bb.0:
1020; XOP-NEXT:    vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0
1021; XOP-NEXT:    retq
1022;
1023; GFNISSE-LABEL: test_bitreverse_v2i64:
1024; GFNISSE:       # %bb.0:
1025; GFNISSE-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1026; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1027; GFNISSE-NEXT:    retq
1028;
1029; GFNIAVX-LABEL: test_bitreverse_v2i64:
1030; GFNIAVX:       # %bb.0:
1031; GFNIAVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1032; GFNIAVX-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1033; GFNIAVX-NEXT:    retq
1034;
1035; GFNIAVX2-LABEL: test_bitreverse_v2i64:
1036; GFNIAVX2:       # %bb.0:
1037; GFNIAVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1038; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1039; GFNIAVX2-NEXT:    retq
1040;
1041; GFNIAVX512F-LABEL: test_bitreverse_v2i64:
1042; GFNIAVX512F:       # %bb.0:
1043; GFNIAVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1044; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1045; GFNIAVX512F-NEXT:    retq
1046;
1047; GFNIAVX512BW-LABEL: test_bitreverse_v2i64:
1048; GFNIAVX512BW:       # %bb.0:
1049; GFNIAVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1050; GFNIAVX512BW-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1051; GFNIAVX512BW-NEXT:    retq
1052  %b = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a)
1053  ret <2 x i64> %b
1054}
1055
1056define <32 x i8> @test_bitreverse_v32i8(<32 x i8> %a) nounwind {
1057; SSE2-LABEL: test_bitreverse_v32i8:
1058; SSE2:       # %bb.0:
1059; SSE2-NEXT:    movdqa %xmm1, %xmm2
1060; SSE2-NEXT:    movdqa %xmm0, %xmm3
1061; SSE2-NEXT:    psllw $4, %xmm3
1062; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1063; SSE2-NEXT:    movdqa %xmm1, %xmm4
1064; SSE2-NEXT:    pandn %xmm3, %xmm4
1065; SSE2-NEXT:    psrlw $4, %xmm0
1066; SSE2-NEXT:    pand %xmm1, %xmm0
1067; SSE2-NEXT:    por %xmm4, %xmm0
1068; SSE2-NEXT:    movdqa %xmm0, %xmm4
1069; SSE2-NEXT:    psrlw $2, %xmm4
1070; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1071; SSE2-NEXT:    pand %xmm3, %xmm4
1072; SSE2-NEXT:    pand %xmm3, %xmm0
1073; SSE2-NEXT:    psllw $2, %xmm0
1074; SSE2-NEXT:    por %xmm4, %xmm0
1075; SSE2-NEXT:    movdqa %xmm0, %xmm5
1076; SSE2-NEXT:    psrlw $1, %xmm5
1077; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
1078; SSE2-NEXT:    pand %xmm4, %xmm5
1079; SSE2-NEXT:    pand %xmm4, %xmm0
1080; SSE2-NEXT:    paddb %xmm0, %xmm0
1081; SSE2-NEXT:    por %xmm5, %xmm0
1082; SSE2-NEXT:    movdqa %xmm2, %xmm5
1083; SSE2-NEXT:    psllw $4, %xmm5
1084; SSE2-NEXT:    psrlw $4, %xmm2
1085; SSE2-NEXT:    pand %xmm1, %xmm2
1086; SSE2-NEXT:    pandn %xmm5, %xmm1
1087; SSE2-NEXT:    por %xmm2, %xmm1
1088; SSE2-NEXT:    movdqa %xmm1, %xmm2
1089; SSE2-NEXT:    psrlw $2, %xmm2
1090; SSE2-NEXT:    pand %xmm3, %xmm2
1091; SSE2-NEXT:    pand %xmm3, %xmm1
1092; SSE2-NEXT:    psllw $2, %xmm1
1093; SSE2-NEXT:    por %xmm2, %xmm1
1094; SSE2-NEXT:    movdqa %xmm1, %xmm2
1095; SSE2-NEXT:    psrlw $1, %xmm2
1096; SSE2-NEXT:    pand %xmm4, %xmm2
1097; SSE2-NEXT:    pand %xmm4, %xmm1
1098; SSE2-NEXT:    paddb %xmm1, %xmm1
1099; SSE2-NEXT:    por %xmm2, %xmm1
1100; SSE2-NEXT:    retq
1101;
1102; SSSE3-LABEL: test_bitreverse_v32i8:
1103; SSSE3:       # %bb.0:
1104; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1105; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1106; SSSE3-NEXT:    pand %xmm4, %xmm2
1107; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1108; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1109; SSSE3-NEXT:    pshufb %xmm2, %xmm6
1110; SSSE3-NEXT:    psrlw $4, %xmm0
1111; SSSE3-NEXT:    pand %xmm4, %xmm0
1112; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1113; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1114; SSSE3-NEXT:    pshufb %xmm0, %xmm3
1115; SSSE3-NEXT:    por %xmm6, %xmm3
1116; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1117; SSSE3-NEXT:    pand %xmm4, %xmm0
1118; SSSE3-NEXT:    pshufb %xmm0, %xmm5
1119; SSSE3-NEXT:    psrlw $4, %xmm1
1120; SSSE3-NEXT:    pand %xmm4, %xmm1
1121; SSSE3-NEXT:    pshufb %xmm1, %xmm2
1122; SSSE3-NEXT:    por %xmm5, %xmm2
1123; SSSE3-NEXT:    movdqa %xmm3, %xmm0
1124; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1125; SSSE3-NEXT:    retq
1126;
1127; AVX1-LABEL: test_bitreverse_v32i8:
1128; AVX1:       # %bb.0:
1129; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1130; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1131; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm3
1132; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1133; AVX1-NEXT:    vpshufb %xmm3, %xmm4, %xmm3
1134; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
1135; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
1136; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1137; AVX1-NEXT:    vpshufb %xmm1, %xmm5, %xmm1
1138; AVX1-NEXT:    vpor %xmm1, %xmm3, %xmm1
1139; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm3
1140; AVX1-NEXT:    vpshufb %xmm3, %xmm4, %xmm3
1141; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
1142; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
1143; AVX1-NEXT:    vpshufb %xmm0, %xmm5, %xmm0
1144; AVX1-NEXT:    vpor %xmm0, %xmm3, %xmm0
1145; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1146; AVX1-NEXT:    retq
1147;
1148; AVX2-LABEL: test_bitreverse_v32i8:
1149; AVX2:       # %bb.0:
1150; 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]
1151; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
1152; 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]
1153; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1154; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1155; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1156; 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]
1157; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1158; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
1159; AVX2-NEXT:    retq
1160;
1161; AVX512-LABEL: test_bitreverse_v32i8:
1162; AVX512:       # %bb.0:
1163; 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]
1164; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
1165; 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]
1166; AVX512-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1167; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm0
1168; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm0
1169; 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]
1170; AVX512-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1171; AVX512-NEXT:    vpor %ymm0, %ymm2, %ymm0
1172; AVX512-NEXT:    retq
1173;
1174; XOPAVX1-LABEL: test_bitreverse_v32i8:
1175; XOPAVX1:       # %bb.0:
1176; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1177; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]
1178; XOPAVX1-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1179; XOPAVX1-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1180; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1181; XOPAVX1-NEXT:    retq
1182;
1183; XOPAVX2-LABEL: test_bitreverse_v32i8:
1184; XOPAVX2:       # %bb.0:
1185; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1186; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]
1187; XOPAVX2-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1188; XOPAVX2-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1189; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1190; XOPAVX2-NEXT:    retq
1191;
1192; GFNISSE-LABEL: test_bitreverse_v32i8:
1193; GFNISSE:       # %bb.0:
1194; GFNISSE-NEXT:    movdqa {{.*#+}} xmm2 = [9241421688590303745,9241421688590303745]
1195; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm2, %xmm0
1196; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm2, %xmm1
1197; GFNISSE-NEXT:    retq
1198;
1199; GFNIAVX-LABEL: test_bitreverse_v32i8:
1200; GFNIAVX:       # %bb.0:
1201; GFNIAVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
1202; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [9241421688590303745,9241421688590303745]
1203; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm2, %xmm1, %xmm1
1204; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm2, %xmm0, %xmm0
1205; GFNIAVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1206; GFNIAVX-NEXT:    retq
1207;
1208; GFNIAVX2-LABEL: test_bitreverse_v32i8:
1209; GFNIAVX2:       # %bb.0:
1210; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
1211; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0
1212; GFNIAVX2-NEXT:    retq
1213;
1214; GFNIAVX512F-LABEL: test_bitreverse_v32i8:
1215; GFNIAVX512F:       # %bb.0:
1216; GFNIAVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
1217; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0
1218; GFNIAVX512F-NEXT:    retq
1219;
1220; GFNIAVX512BW-LABEL: test_bitreverse_v32i8:
1221; GFNIAVX512BW:       # %bb.0:
1222; GFNIAVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
1223; GFNIAVX512BW-NEXT:    vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0
1224; GFNIAVX512BW-NEXT:    retq
1225  %b = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %a)
1226  ret <32 x i8> %b
1227}
1228
1229define <16 x i16> @test_bitreverse_v16i16(<16 x i16> %a) nounwind {
1230; SSE2-LABEL: test_bitreverse_v16i16:
1231; SSE2:       # %bb.0:
1232; SSE2-NEXT:    movdqa %xmm1, %xmm2
1233; SSE2-NEXT:    movdqa %xmm0, %xmm1
1234; SSE2-NEXT:    psrlw $8, %xmm1
1235; SSE2-NEXT:    psllw $8, %xmm0
1236; SSE2-NEXT:    por %xmm1, %xmm0
1237; SSE2-NEXT:    movdqa %xmm0, %xmm3
1238; SSE2-NEXT:    psllw $4, %xmm3
1239; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1240; SSE2-NEXT:    movdqa %xmm1, %xmm4
1241; SSE2-NEXT:    pandn %xmm3, %xmm4
1242; SSE2-NEXT:    psrlw $4, %xmm0
1243; SSE2-NEXT:    pand %xmm1, %xmm0
1244; SSE2-NEXT:    por %xmm4, %xmm0
1245; SSE2-NEXT:    movdqa %xmm0, %xmm4
1246; SSE2-NEXT:    psrlw $2, %xmm4
1247; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1248; SSE2-NEXT:    pand %xmm3, %xmm4
1249; SSE2-NEXT:    pand %xmm3, %xmm0
1250; SSE2-NEXT:    psllw $2, %xmm0
1251; SSE2-NEXT:    por %xmm4, %xmm0
1252; SSE2-NEXT:    movdqa %xmm0, %xmm5
1253; SSE2-NEXT:    psrlw $1, %xmm5
1254; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
1255; SSE2-NEXT:    pand %xmm4, %xmm5
1256; SSE2-NEXT:    pand %xmm4, %xmm0
1257; SSE2-NEXT:    paddb %xmm0, %xmm0
1258; SSE2-NEXT:    por %xmm5, %xmm0
1259; SSE2-NEXT:    movdqa %xmm2, %xmm5
1260; SSE2-NEXT:    psrlw $8, %xmm5
1261; SSE2-NEXT:    psllw $8, %xmm2
1262; SSE2-NEXT:    por %xmm5, %xmm2
1263; SSE2-NEXT:    movdqa %xmm2, %xmm5
1264; SSE2-NEXT:    psllw $4, %xmm5
1265; SSE2-NEXT:    psrlw $4, %xmm2
1266; SSE2-NEXT:    pand %xmm1, %xmm2
1267; SSE2-NEXT:    pandn %xmm5, %xmm1
1268; SSE2-NEXT:    por %xmm2, %xmm1
1269; SSE2-NEXT:    movdqa %xmm1, %xmm2
1270; SSE2-NEXT:    psrlw $2, %xmm2
1271; SSE2-NEXT:    pand %xmm3, %xmm2
1272; SSE2-NEXT:    pand %xmm3, %xmm1
1273; SSE2-NEXT:    psllw $2, %xmm1
1274; SSE2-NEXT:    por %xmm2, %xmm1
1275; SSE2-NEXT:    movdqa %xmm1, %xmm2
1276; SSE2-NEXT:    psrlw $1, %xmm2
1277; SSE2-NEXT:    pand %xmm4, %xmm2
1278; SSE2-NEXT:    pand %xmm4, %xmm1
1279; SSE2-NEXT:    paddb %xmm1, %xmm1
1280; SSE2-NEXT:    por %xmm2, %xmm1
1281; SSE2-NEXT:    retq
1282;
1283; SSSE3-LABEL: test_bitreverse_v16i16:
1284; SSSE3:       # %bb.0:
1285; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
1286; SSSE3-NEXT:    pshufb %xmm4, %xmm0
1287; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1288; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1289; SSSE3-NEXT:    pand %xmm5, %xmm2
1290; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1291; SSSE3-NEXT:    movdqa %xmm6, %xmm7
1292; SSSE3-NEXT:    pshufb %xmm2, %xmm7
1293; SSSE3-NEXT:    psrlw $4, %xmm0
1294; SSSE3-NEXT:    pand %xmm5, %xmm0
1295; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1296; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1297; SSSE3-NEXT:    pshufb %xmm0, %xmm3
1298; SSSE3-NEXT:    por %xmm7, %xmm3
1299; SSSE3-NEXT:    pshufb %xmm4, %xmm1
1300; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1301; SSSE3-NEXT:    pand %xmm5, %xmm0
1302; SSSE3-NEXT:    pshufb %xmm0, %xmm6
1303; SSSE3-NEXT:    psrlw $4, %xmm1
1304; SSSE3-NEXT:    pand %xmm5, %xmm1
1305; SSSE3-NEXT:    pshufb %xmm1, %xmm2
1306; SSSE3-NEXT:    por %xmm6, %xmm2
1307; SSSE3-NEXT:    movdqa %xmm3, %xmm0
1308; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1309; SSSE3-NEXT:    retq
1310;
1311; AVX1-LABEL: test_bitreverse_v16i16:
1312; AVX1:       # %bb.0:
1313; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1314; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
1315; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1316; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1317; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4
1318; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1319; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
1320; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
1321; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
1322; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1323; AVX1-NEXT:    vpshufb %xmm1, %xmm6, %xmm1
1324; AVX1-NEXT:    vpor %xmm1, %xmm4, %xmm1
1325; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1326; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm2
1327; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2
1328; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
1329; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1330; AVX1-NEXT:    vpshufb %xmm0, %xmm6, %xmm0
1331; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
1332; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1333; AVX1-NEXT:    retq
1334;
1335; AVX2-LABEL: test_bitreverse_v16i16:
1336; AVX2:       # %bb.0:
1337; 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]
1338; 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]
1339; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
1340; 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]
1341; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1342; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1343; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1344; 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]
1345; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1346; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
1347; AVX2-NEXT:    retq
1348;
1349; AVX512-LABEL: test_bitreverse_v16i16:
1350; AVX512:       # %bb.0:
1351; 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]
1352; 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]
1353; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
1354; 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]
1355; AVX512-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1356; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm0
1357; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm0
1358; 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]
1359; AVX512-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1360; AVX512-NEXT:    vpor %ymm0, %ymm2, %ymm0
1361; AVX512-NEXT:    retq
1362;
1363; XOPAVX1-LABEL: test_bitreverse_v16i16:
1364; XOPAVX1:       # %bb.0:
1365; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1366; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]
1367; XOPAVX1-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1368; XOPAVX1-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1369; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1370; XOPAVX1-NEXT:    retq
1371;
1372; XOPAVX2-LABEL: test_bitreverse_v16i16:
1373; XOPAVX2:       # %bb.0:
1374; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1375; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]
1376; XOPAVX2-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1377; XOPAVX2-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1378; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1379; XOPAVX2-NEXT:    retq
1380;
1381; GFNISSE-LABEL: test_bitreverse_v16i16:
1382; GFNISSE:       # %bb.0:
1383; GFNISSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
1384; GFNISSE-NEXT:    pshufb %xmm2, %xmm0
1385; GFNISSE-NEXT:    movdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745]
1386; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm3, %xmm0
1387; GFNISSE-NEXT:    pshufb %xmm2, %xmm1
1388; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm3, %xmm1
1389; GFNISSE-NEXT:    retq
1390;
1391; GFNIAVX-LABEL: test_bitreverse_v16i16:
1392; GFNIAVX:       # %bb.0:
1393; GFNIAVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
1394; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
1395; GFNIAVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1396; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745]
1397; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm1, %xmm1
1398; GFNIAVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1399; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm0, %xmm0
1400; GFNIAVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1401; GFNIAVX-NEXT:    retq
1402;
1403; GFNIAVX2-LABEL: test_bitreverse_v16i16:
1404; GFNIAVX2:       # %bb.0:
1405; GFNIAVX2-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]
1406; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
1407; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0
1408; GFNIAVX2-NEXT:    retq
1409;
1410; GFNIAVX512F-LABEL: test_bitreverse_v16i16:
1411; GFNIAVX512F:       # %bb.0:
1412; GFNIAVX512F-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]
1413; GFNIAVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
1414; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0
1415; GFNIAVX512F-NEXT:    retq
1416;
1417; GFNIAVX512BW-LABEL: test_bitreverse_v16i16:
1418; GFNIAVX512BW:       # %bb.0:
1419; GFNIAVX512BW-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]
1420; GFNIAVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
1421; GFNIAVX512BW-NEXT:    vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0
1422; GFNIAVX512BW-NEXT:    retq
1423  %b = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a)
1424  ret <16 x i16> %b
1425}
1426
1427define <8 x i32> @test_bitreverse_v8i32(<8 x i32> %a) nounwind {
1428; SSE2-LABEL: test_bitreverse_v8i32:
1429; SSE2:       # %bb.0:
1430; SSE2-NEXT:    movdqa %xmm1, %xmm2
1431; SSE2-NEXT:    pxor %xmm3, %xmm3
1432; SSE2-NEXT:    movdqa %xmm0, %xmm1
1433; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm3[8],xmm1[9],xmm3[9],xmm1[10],xmm3[10],xmm1[11],xmm3[11],xmm1[12],xmm3[12],xmm1[13],xmm3[13],xmm1[14],xmm3[14],xmm1[15],xmm3[15]
1434; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]
1435; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]
1436; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1437; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
1438; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
1439; SSE2-NEXT:    packuswb %xmm1, %xmm0
1440; SSE2-NEXT:    movdqa %xmm0, %xmm4
1441; SSE2-NEXT:    psllw $4, %xmm4
1442; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1443; SSE2-NEXT:    movdqa %xmm1, %xmm5
1444; SSE2-NEXT:    pandn %xmm4, %xmm5
1445; SSE2-NEXT:    psrlw $4, %xmm0
1446; SSE2-NEXT:    pand %xmm1, %xmm0
1447; SSE2-NEXT:    por %xmm5, %xmm0
1448; SSE2-NEXT:    movdqa %xmm0, %xmm5
1449; SSE2-NEXT:    psrlw $2, %xmm5
1450; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1451; SSE2-NEXT:    pand %xmm4, %xmm5
1452; SSE2-NEXT:    pand %xmm4, %xmm0
1453; SSE2-NEXT:    psllw $2, %xmm0
1454; SSE2-NEXT:    por %xmm5, %xmm0
1455; SSE2-NEXT:    movdqa %xmm0, %xmm6
1456; SSE2-NEXT:    psrlw $1, %xmm6
1457; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
1458; SSE2-NEXT:    pand %xmm5, %xmm6
1459; SSE2-NEXT:    pand %xmm5, %xmm0
1460; SSE2-NEXT:    paddb %xmm0, %xmm0
1461; SSE2-NEXT:    por %xmm6, %xmm0
1462; SSE2-NEXT:    movdqa %xmm2, %xmm6
1463; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm3[8],xmm6[9],xmm3[9],xmm6[10],xmm3[10],xmm6[11],xmm3[11],xmm6[12],xmm3[12],xmm6[13],xmm3[13],xmm6[14],xmm3[14],xmm6[15],xmm3[15]
1464; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]
1465; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]
1466; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
1467; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
1468; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
1469; SSE2-NEXT:    packuswb %xmm6, %xmm2
1470; SSE2-NEXT:    movdqa %xmm2, %xmm3
1471; SSE2-NEXT:    psllw $4, %xmm3
1472; SSE2-NEXT:    psrlw $4, %xmm2
1473; SSE2-NEXT:    pand %xmm1, %xmm2
1474; SSE2-NEXT:    pandn %xmm3, %xmm1
1475; SSE2-NEXT:    por %xmm2, %xmm1
1476; SSE2-NEXT:    movdqa %xmm1, %xmm2
1477; SSE2-NEXT:    psrlw $2, %xmm2
1478; SSE2-NEXT:    pand %xmm4, %xmm2
1479; SSE2-NEXT:    pand %xmm4, %xmm1
1480; SSE2-NEXT:    psllw $2, %xmm1
1481; SSE2-NEXT:    por %xmm2, %xmm1
1482; SSE2-NEXT:    movdqa %xmm1, %xmm2
1483; SSE2-NEXT:    psrlw $1, %xmm2
1484; SSE2-NEXT:    pand %xmm5, %xmm2
1485; SSE2-NEXT:    pand %xmm5, %xmm1
1486; SSE2-NEXT:    paddb %xmm1, %xmm1
1487; SSE2-NEXT:    por %xmm2, %xmm1
1488; SSE2-NEXT:    retq
1489;
1490; SSSE3-LABEL: test_bitreverse_v8i32:
1491; SSSE3:       # %bb.0:
1492; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
1493; SSSE3-NEXT:    pshufb %xmm4, %xmm0
1494; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1495; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1496; SSSE3-NEXT:    pand %xmm5, %xmm2
1497; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1498; SSSE3-NEXT:    movdqa %xmm6, %xmm7
1499; SSSE3-NEXT:    pshufb %xmm2, %xmm7
1500; SSSE3-NEXT:    psrlw $4, %xmm0
1501; SSSE3-NEXT:    pand %xmm5, %xmm0
1502; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1503; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1504; SSSE3-NEXT:    pshufb %xmm0, %xmm3
1505; SSSE3-NEXT:    por %xmm7, %xmm3
1506; SSSE3-NEXT:    pshufb %xmm4, %xmm1
1507; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1508; SSSE3-NEXT:    pand %xmm5, %xmm0
1509; SSSE3-NEXT:    pshufb %xmm0, %xmm6
1510; SSSE3-NEXT:    psrlw $4, %xmm1
1511; SSSE3-NEXT:    pand %xmm5, %xmm1
1512; SSSE3-NEXT:    pshufb %xmm1, %xmm2
1513; SSSE3-NEXT:    por %xmm6, %xmm2
1514; SSSE3-NEXT:    movdqa %xmm3, %xmm0
1515; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1516; SSSE3-NEXT:    retq
1517;
1518; AVX1-LABEL: test_bitreverse_v8i32:
1519; AVX1:       # %bb.0:
1520; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1521; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
1522; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1523; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1524; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4
1525; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1526; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
1527; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
1528; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
1529; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1530; AVX1-NEXT:    vpshufb %xmm1, %xmm6, %xmm1
1531; AVX1-NEXT:    vpor %xmm1, %xmm4, %xmm1
1532; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1533; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm2
1534; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2
1535; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
1536; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1537; AVX1-NEXT:    vpshufb %xmm0, %xmm6, %xmm0
1538; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
1539; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1540; AVX1-NEXT:    retq
1541;
1542; AVX2-LABEL: test_bitreverse_v8i32:
1543; AVX2:       # %bb.0:
1544; 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]
1545; 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]
1546; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
1547; 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]
1548; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1549; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1550; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1551; 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]
1552; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1553; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
1554; AVX2-NEXT:    retq
1555;
1556; AVX512-LABEL: test_bitreverse_v8i32:
1557; AVX512:       # %bb.0:
1558; 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]
1559; 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]
1560; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
1561; 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]
1562; AVX512-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1563; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm0
1564; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm0
1565; 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]
1566; AVX512-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1567; AVX512-NEXT:    vpor %ymm0, %ymm2, %ymm0
1568; AVX512-NEXT:    retq
1569;
1570; XOPAVX1-LABEL: test_bitreverse_v8i32:
1571; XOPAVX1:       # %bb.0:
1572; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1573; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]
1574; XOPAVX1-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1575; XOPAVX1-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1576; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1577; XOPAVX1-NEXT:    retq
1578;
1579; XOPAVX2-LABEL: test_bitreverse_v8i32:
1580; XOPAVX2:       # %bb.0:
1581; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1582; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]
1583; XOPAVX2-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1584; XOPAVX2-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1585; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1586; XOPAVX2-NEXT:    retq
1587;
1588; GFNISSE-LABEL: test_bitreverse_v8i32:
1589; GFNISSE:       # %bb.0:
1590; GFNISSE-NEXT:    movdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
1591; GFNISSE-NEXT:    pshufb %xmm2, %xmm0
1592; GFNISSE-NEXT:    movdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745]
1593; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm3, %xmm0
1594; GFNISSE-NEXT:    pshufb %xmm2, %xmm1
1595; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm3, %xmm1
1596; GFNISSE-NEXT:    retq
1597;
1598; GFNIAVX-LABEL: test_bitreverse_v8i32:
1599; GFNIAVX:       # %bb.0:
1600; GFNIAVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
1601; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
1602; GFNIAVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1603; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745]
1604; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm1, %xmm1
1605; GFNIAVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1606; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm0, %xmm0
1607; GFNIAVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1608; GFNIAVX-NEXT:    retq
1609;
1610; GFNIAVX2-LABEL: test_bitreverse_v8i32:
1611; GFNIAVX2:       # %bb.0:
1612; GFNIAVX2-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]
1613; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
1614; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0
1615; GFNIAVX2-NEXT:    retq
1616;
1617; GFNIAVX512F-LABEL: test_bitreverse_v8i32:
1618; GFNIAVX512F:       # %bb.0:
1619; GFNIAVX512F-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]
1620; GFNIAVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
1621; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0
1622; GFNIAVX512F-NEXT:    retq
1623;
1624; GFNIAVX512BW-LABEL: test_bitreverse_v8i32:
1625; GFNIAVX512BW:       # %bb.0:
1626; GFNIAVX512BW-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]
1627; GFNIAVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
1628; GFNIAVX512BW-NEXT:    vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0
1629; GFNIAVX512BW-NEXT:    retq
1630  %b = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %a)
1631  ret <8 x i32> %b
1632}
1633
1634define <4 x i64> @test_bitreverse_v4i64(<4 x i64> %a) nounwind {
1635; SSE2-LABEL: test_bitreverse_v4i64:
1636; SSE2:       # %bb.0:
1637; SSE2-NEXT:    movdqa %xmm1, %xmm2
1638; SSE2-NEXT:    pxor %xmm3, %xmm3
1639; SSE2-NEXT:    movdqa %xmm0, %xmm1
1640; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm3[8],xmm1[9],xmm3[9],xmm1[10],xmm3[10],xmm1[11],xmm3[11],xmm1[12],xmm3[12],xmm1[13],xmm3[13],xmm1[14],xmm3[14],xmm1[15],xmm3[15]
1641; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1642; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]
1643; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]
1644; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1645; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1646; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
1647; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
1648; SSE2-NEXT:    packuswb %xmm1, %xmm0
1649; SSE2-NEXT:    movdqa %xmm0, %xmm4
1650; SSE2-NEXT:    psllw $4, %xmm4
1651; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1652; SSE2-NEXT:    movdqa %xmm1, %xmm5
1653; SSE2-NEXT:    pandn %xmm4, %xmm5
1654; SSE2-NEXT:    psrlw $4, %xmm0
1655; SSE2-NEXT:    pand %xmm1, %xmm0
1656; SSE2-NEXT:    por %xmm5, %xmm0
1657; SSE2-NEXT:    movdqa %xmm0, %xmm5
1658; SSE2-NEXT:    psrlw $2, %xmm5
1659; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1660; SSE2-NEXT:    pand %xmm4, %xmm5
1661; SSE2-NEXT:    pand %xmm4, %xmm0
1662; SSE2-NEXT:    psllw $2, %xmm0
1663; SSE2-NEXT:    por %xmm5, %xmm0
1664; SSE2-NEXT:    movdqa %xmm0, %xmm6
1665; SSE2-NEXT:    psrlw $1, %xmm6
1666; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
1667; SSE2-NEXT:    pand %xmm5, %xmm6
1668; SSE2-NEXT:    pand %xmm5, %xmm0
1669; SSE2-NEXT:    paddb %xmm0, %xmm0
1670; SSE2-NEXT:    por %xmm6, %xmm0
1671; SSE2-NEXT:    movdqa %xmm2, %xmm6
1672; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm3[8],xmm6[9],xmm3[9],xmm6[10],xmm3[10],xmm6[11],xmm3[11],xmm6[12],xmm3[12],xmm6[13],xmm3[13],xmm6[14],xmm3[14],xmm6[15],xmm3[15]
1673; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[2,3,0,1]
1674; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]
1675; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]
1676; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
1677; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
1678; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
1679; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
1680; SSE2-NEXT:    packuswb %xmm6, %xmm2
1681; SSE2-NEXT:    movdqa %xmm2, %xmm3
1682; SSE2-NEXT:    psllw $4, %xmm3
1683; SSE2-NEXT:    psrlw $4, %xmm2
1684; SSE2-NEXT:    pand %xmm1, %xmm2
1685; SSE2-NEXT:    pandn %xmm3, %xmm1
1686; SSE2-NEXT:    por %xmm2, %xmm1
1687; SSE2-NEXT:    movdqa %xmm1, %xmm2
1688; SSE2-NEXT:    psrlw $2, %xmm2
1689; SSE2-NEXT:    pand %xmm4, %xmm2
1690; SSE2-NEXT:    pand %xmm4, %xmm1
1691; SSE2-NEXT:    psllw $2, %xmm1
1692; SSE2-NEXT:    por %xmm2, %xmm1
1693; SSE2-NEXT:    movdqa %xmm1, %xmm2
1694; SSE2-NEXT:    psrlw $1, %xmm2
1695; SSE2-NEXT:    pand %xmm5, %xmm2
1696; SSE2-NEXT:    pand %xmm5, %xmm1
1697; SSE2-NEXT:    paddb %xmm1, %xmm1
1698; SSE2-NEXT:    por %xmm2, %xmm1
1699; SSE2-NEXT:    retq
1700;
1701; SSSE3-LABEL: test_bitreverse_v4i64:
1702; SSSE3:       # %bb.0:
1703; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1704; SSSE3-NEXT:    pshufb %xmm4, %xmm0
1705; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1706; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1707; SSSE3-NEXT:    pand %xmm5, %xmm2
1708; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1709; SSSE3-NEXT:    movdqa %xmm6, %xmm7
1710; SSSE3-NEXT:    pshufb %xmm2, %xmm7
1711; SSSE3-NEXT:    psrlw $4, %xmm0
1712; SSSE3-NEXT:    pand %xmm5, %xmm0
1713; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1714; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1715; SSSE3-NEXT:    pshufb %xmm0, %xmm3
1716; SSSE3-NEXT:    por %xmm7, %xmm3
1717; SSSE3-NEXT:    pshufb %xmm4, %xmm1
1718; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1719; SSSE3-NEXT:    pand %xmm5, %xmm0
1720; SSSE3-NEXT:    pshufb %xmm0, %xmm6
1721; SSSE3-NEXT:    psrlw $4, %xmm1
1722; SSSE3-NEXT:    pand %xmm5, %xmm1
1723; SSSE3-NEXT:    pshufb %xmm1, %xmm2
1724; SSSE3-NEXT:    por %xmm6, %xmm2
1725; SSSE3-NEXT:    movdqa %xmm3, %xmm0
1726; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1727; SSSE3-NEXT:    retq
1728;
1729; AVX1-LABEL: test_bitreverse_v4i64:
1730; AVX1:       # %bb.0:
1731; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1732; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1733; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1734; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1735; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4
1736; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1737; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
1738; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
1739; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
1740; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1741; AVX1-NEXT:    vpshufb %xmm1, %xmm6, %xmm1
1742; AVX1-NEXT:    vpor %xmm1, %xmm4, %xmm1
1743; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1744; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm2
1745; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2
1746; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
1747; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1748; AVX1-NEXT:    vpshufb %xmm0, %xmm6, %xmm0
1749; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
1750; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1751; AVX1-NEXT:    retq
1752;
1753; AVX2-LABEL: test_bitreverse_v4i64:
1754; AVX2:       # %bb.0:
1755; 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]
1756; 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]
1757; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
1758; 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]
1759; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1760; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1761; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1762; 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]
1763; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1764; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
1765; AVX2-NEXT:    retq
1766;
1767; AVX512-LABEL: test_bitreverse_v4i64:
1768; AVX512:       # %bb.0:
1769; 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]
1770; 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]
1771; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
1772; 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]
1773; AVX512-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1774; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm0
1775; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm0
1776; 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]
1777; AVX512-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1778; AVX512-NEXT:    vpor %ymm0, %ymm2, %ymm0
1779; AVX512-NEXT:    retq
1780;
1781; XOPAVX1-LABEL: test_bitreverse_v4i64:
1782; XOPAVX1:       # %bb.0:
1783; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1784; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]
1785; XOPAVX1-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1786; XOPAVX1-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1787; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1788; XOPAVX1-NEXT:    retq
1789;
1790; XOPAVX2-LABEL: test_bitreverse_v4i64:
1791; XOPAVX2:       # %bb.0:
1792; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1793; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]
1794; XOPAVX2-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1795; XOPAVX2-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1796; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1797; XOPAVX2-NEXT:    retq
1798;
1799; GFNISSE-LABEL: test_bitreverse_v4i64:
1800; GFNISSE:       # %bb.0:
1801; GFNISSE-NEXT:    movdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1802; GFNISSE-NEXT:    pshufb %xmm2, %xmm0
1803; GFNISSE-NEXT:    movdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745]
1804; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm3, %xmm0
1805; GFNISSE-NEXT:    pshufb %xmm2, %xmm1
1806; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm3, %xmm1
1807; GFNISSE-NEXT:    retq
1808;
1809; GFNIAVX-LABEL: test_bitreverse_v4i64:
1810; GFNIAVX:       # %bb.0:
1811; GFNIAVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
1812; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1813; GFNIAVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1814; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745]
1815; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm1, %xmm1
1816; GFNIAVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1817; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm0, %xmm0
1818; GFNIAVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1819; GFNIAVX-NEXT:    retq
1820;
1821; GFNIAVX2-LABEL: test_bitreverse_v4i64:
1822; GFNIAVX2:       # %bb.0:
1823; GFNIAVX2-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]
1824; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
1825; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0
1826; GFNIAVX2-NEXT:    retq
1827;
1828; GFNIAVX512F-LABEL: test_bitreverse_v4i64:
1829; GFNIAVX512F:       # %bb.0:
1830; GFNIAVX512F-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]
1831; GFNIAVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
1832; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0
1833; GFNIAVX512F-NEXT:    retq
1834;
1835; GFNIAVX512BW-LABEL: test_bitreverse_v4i64:
1836; GFNIAVX512BW:       # %bb.0:
1837; GFNIAVX512BW-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]
1838; GFNIAVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
1839; GFNIAVX512BW-NEXT:    vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0
1840; GFNIAVX512BW-NEXT:    retq
1841  %b = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %a)
1842  ret <4 x i64> %b
1843}
1844
1845define <64 x i8> @test_bitreverse_v64i8(<64 x i8> %a) nounwind {
1846; SSE2-LABEL: test_bitreverse_v64i8:
1847; SSE2:       # %bb.0:
1848; SSE2-NEXT:    movdqa %xmm3, %xmm4
1849; SSE2-NEXT:    movdqa %xmm0, %xmm5
1850; SSE2-NEXT:    psllw $4, %xmm5
1851; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1852; SSE2-NEXT:    movdqa %xmm3, %xmm6
1853; SSE2-NEXT:    pandn %xmm5, %xmm6
1854; SSE2-NEXT:    psrlw $4, %xmm0
1855; SSE2-NEXT:    pand %xmm3, %xmm0
1856; SSE2-NEXT:    por %xmm6, %xmm0
1857; SSE2-NEXT:    movdqa %xmm0, %xmm6
1858; SSE2-NEXT:    psrlw $2, %xmm6
1859; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1860; SSE2-NEXT:    pand %xmm8, %xmm6
1861; SSE2-NEXT:    pand %xmm8, %xmm0
1862; SSE2-NEXT:    psllw $2, %xmm0
1863; SSE2-NEXT:    por %xmm6, %xmm0
1864; SSE2-NEXT:    movdqa %xmm0, %xmm7
1865; SSE2-NEXT:    psrlw $1, %xmm7
1866; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
1867; SSE2-NEXT:    pand %xmm6, %xmm7
1868; SSE2-NEXT:    pand %xmm6, %xmm0
1869; SSE2-NEXT:    paddb %xmm0, %xmm0
1870; SSE2-NEXT:    por %xmm7, %xmm0
1871; SSE2-NEXT:    movdqa %xmm1, %xmm7
1872; SSE2-NEXT:    psllw $4, %xmm7
1873; SSE2-NEXT:    movdqa %xmm3, %xmm5
1874; SSE2-NEXT:    pandn %xmm7, %xmm5
1875; SSE2-NEXT:    psrlw $4, %xmm1
1876; SSE2-NEXT:    pand %xmm3, %xmm1
1877; SSE2-NEXT:    por %xmm5, %xmm1
1878; SSE2-NEXT:    movdqa %xmm1, %xmm5
1879; SSE2-NEXT:    psrlw $2, %xmm5
1880; SSE2-NEXT:    pand %xmm8, %xmm5
1881; SSE2-NEXT:    pand %xmm8, %xmm1
1882; SSE2-NEXT:    psllw $2, %xmm1
1883; SSE2-NEXT:    por %xmm5, %xmm1
1884; SSE2-NEXT:    movdqa %xmm1, %xmm5
1885; SSE2-NEXT:    psrlw $1, %xmm5
1886; SSE2-NEXT:    pand %xmm6, %xmm5
1887; SSE2-NEXT:    pand %xmm6, %xmm1
1888; SSE2-NEXT:    paddb %xmm1, %xmm1
1889; SSE2-NEXT:    por %xmm5, %xmm1
1890; SSE2-NEXT:    movdqa %xmm2, %xmm5
1891; SSE2-NEXT:    psllw $4, %xmm5
1892; SSE2-NEXT:    movdqa %xmm3, %xmm7
1893; SSE2-NEXT:    pandn %xmm5, %xmm7
1894; SSE2-NEXT:    psrlw $4, %xmm2
1895; SSE2-NEXT:    pand %xmm3, %xmm2
1896; SSE2-NEXT:    por %xmm7, %xmm2
1897; SSE2-NEXT:    movdqa %xmm2, %xmm5
1898; SSE2-NEXT:    psrlw $2, %xmm5
1899; SSE2-NEXT:    pand %xmm8, %xmm5
1900; SSE2-NEXT:    pand %xmm8, %xmm2
1901; SSE2-NEXT:    psllw $2, %xmm2
1902; SSE2-NEXT:    por %xmm5, %xmm2
1903; SSE2-NEXT:    movdqa %xmm2, %xmm5
1904; SSE2-NEXT:    psrlw $1, %xmm5
1905; SSE2-NEXT:    pand %xmm6, %xmm5
1906; SSE2-NEXT:    pand %xmm6, %xmm2
1907; SSE2-NEXT:    paddb %xmm2, %xmm2
1908; SSE2-NEXT:    por %xmm5, %xmm2
1909; SSE2-NEXT:    movdqa %xmm4, %xmm5
1910; SSE2-NEXT:    psllw $4, %xmm5
1911; SSE2-NEXT:    psrlw $4, %xmm4
1912; SSE2-NEXT:    pand %xmm3, %xmm4
1913; SSE2-NEXT:    pandn %xmm5, %xmm3
1914; SSE2-NEXT:    por %xmm4, %xmm3
1915; SSE2-NEXT:    movdqa %xmm3, %xmm4
1916; SSE2-NEXT:    psrlw $2, %xmm4
1917; SSE2-NEXT:    pand %xmm8, %xmm4
1918; SSE2-NEXT:    pand %xmm8, %xmm3
1919; SSE2-NEXT:    psllw $2, %xmm3
1920; SSE2-NEXT:    por %xmm4, %xmm3
1921; SSE2-NEXT:    movdqa %xmm3, %xmm4
1922; SSE2-NEXT:    psrlw $1, %xmm4
1923; SSE2-NEXT:    pand %xmm6, %xmm4
1924; SSE2-NEXT:    pand %xmm6, %xmm3
1925; SSE2-NEXT:    paddb %xmm3, %xmm3
1926; SSE2-NEXT:    por %xmm4, %xmm3
1927; SSE2-NEXT:    retq
1928;
1929; SSSE3-LABEL: test_bitreverse_v64i8:
1930; SSSE3:       # %bb.0:
1931; SSSE3-NEXT:    movdqa %xmm0, %xmm5
1932; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1933; SSSE3-NEXT:    pand %xmm8, %xmm0
1934; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1935; SSSE3-NEXT:    movdqa %xmm9, %xmm6
1936; SSSE3-NEXT:    pshufb %xmm0, %xmm6
1937; SSSE3-NEXT:    psrlw $4, %xmm5
1938; SSSE3-NEXT:    pand %xmm8, %xmm5
1939; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1940; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1941; SSSE3-NEXT:    pshufb %xmm5, %xmm0
1942; SSSE3-NEXT:    por %xmm6, %xmm0
1943; SSSE3-NEXT:    movdqa %xmm1, %xmm5
1944; SSSE3-NEXT:    pand %xmm8, %xmm5
1945; SSSE3-NEXT:    movdqa %xmm9, %xmm6
1946; SSSE3-NEXT:    pshufb %xmm5, %xmm6
1947; SSSE3-NEXT:    psrlw $4, %xmm1
1948; SSSE3-NEXT:    pand %xmm8, %xmm1
1949; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1950; SSSE3-NEXT:    pshufb %xmm1, %xmm5
1951; SSSE3-NEXT:    por %xmm6, %xmm5
1952; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1953; SSSE3-NEXT:    pand %xmm8, %xmm1
1954; SSSE3-NEXT:    movdqa %xmm9, %xmm7
1955; SSSE3-NEXT:    pshufb %xmm1, %xmm7
1956; SSSE3-NEXT:    psrlw $4, %xmm2
1957; SSSE3-NEXT:    pand %xmm8, %xmm2
1958; SSSE3-NEXT:    movdqa %xmm4, %xmm6
1959; SSSE3-NEXT:    pshufb %xmm2, %xmm6
1960; SSSE3-NEXT:    por %xmm7, %xmm6
1961; SSSE3-NEXT:    movdqa %xmm3, %xmm1
1962; SSSE3-NEXT:    pand %xmm8, %xmm1
1963; SSSE3-NEXT:    pshufb %xmm1, %xmm9
1964; SSSE3-NEXT:    psrlw $4, %xmm3
1965; SSSE3-NEXT:    pand %xmm8, %xmm3
1966; SSSE3-NEXT:    pshufb %xmm3, %xmm4
1967; SSSE3-NEXT:    por %xmm9, %xmm4
1968; SSSE3-NEXT:    movdqa %xmm5, %xmm1
1969; SSSE3-NEXT:    movdqa %xmm6, %xmm2
1970; SSSE3-NEXT:    movdqa %xmm4, %xmm3
1971; SSSE3-NEXT:    retq
1972;
1973; AVX1-LABEL: test_bitreverse_v64i8:
1974; AVX1:       # %bb.0:
1975; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1976; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1977; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm4
1978; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1979; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
1980; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
1981; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1982; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1983; AVX1-NEXT:    vpshufb %xmm2, %xmm6, %xmm2
1984; AVX1-NEXT:    vpor %xmm2, %xmm4, %xmm2
1985; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm4
1986; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
1987; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
1988; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1989; AVX1-NEXT:    vpshufb %xmm0, %xmm6, %xmm0
1990; AVX1-NEXT:    vpor %xmm0, %xmm4, %xmm0
1991; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1992; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1993; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm4
1994; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
1995; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
1996; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1997; AVX1-NEXT:    vpshufb %xmm2, %xmm6, %xmm2
1998; AVX1-NEXT:    vpor %xmm2, %xmm4, %xmm2
1999; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4
2000; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
2001; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
2002; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
2003; AVX1-NEXT:    vpshufb %xmm1, %xmm6, %xmm1
2004; AVX1-NEXT:    vpor %xmm1, %xmm4, %xmm1
2005; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2006; AVX1-NEXT:    retq
2007;
2008; AVX2-LABEL: test_bitreverse_v64i8:
2009; AVX2:       # %bb.0:
2010; 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]
2011; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm3
2012; 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]
2013; AVX2-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
2014; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
2015; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
2016; 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]
2017; AVX2-NEXT:    vpshufb %ymm0, %ymm5, %ymm0
2018; AVX2-NEXT:    vpor %ymm0, %ymm3, %ymm0
2019; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm3
2020; AVX2-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
2021; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
2022; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
2023; AVX2-NEXT:    vpshufb %ymm1, %ymm5, %ymm1
2024; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
2025; AVX2-NEXT:    retq
2026;
2027; AVX512F-LABEL: test_bitreverse_v64i8:
2028; AVX512F:       # %bb.0:
2029; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2030; 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]
2031; AVX512F-NEXT:    vpand %ymm2, %ymm1, %ymm3
2032; 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]
2033; AVX512F-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
2034; AVX512F-NEXT:    vpand %ymm2, %ymm0, %ymm5
2035; AVX512F-NEXT:    vpshufb %ymm5, %ymm4, %ymm4
2036; AVX512F-NEXT:    vinserti64x4 $1, %ymm3, %zmm4, %zmm3
2037; AVX512F-NEXT:    vpsrlw $4, %ymm1, %ymm1
2038; AVX512F-NEXT:    vpand %ymm2, %ymm1, %ymm1
2039; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [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]
2040; AVX512F-NEXT:    vpshufb %ymm1, %ymm4, %ymm1
2041; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm0
2042; AVX512F-NEXT:    vpand %ymm2, %ymm0, %ymm0
2043; AVX512F-NEXT:    vpshufb %ymm0, %ymm4, %ymm0
2044; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
2045; AVX512F-NEXT:    vporq %zmm0, %zmm3, %zmm0
2046; AVX512F-NEXT:    retq
2047;
2048; AVX512BW-LABEL: test_bitreverse_v64i8:
2049; AVX512BW:       # %bb.0:
2050; 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]
2051; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
2052; 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]
2053; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
2054; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
2055; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
2056; 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]
2057; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm0
2058; AVX512BW-NEXT:    vporq %zmm0, %zmm2, %zmm0
2059; AVX512BW-NEXT:    retq
2060;
2061; XOPAVX1-LABEL: test_bitreverse_v64i8:
2062; XOPAVX1:       # %bb.0:
2063; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2064; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]
2065; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2066; XOPAVX1-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
2067; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2068; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2069; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2070; XOPAVX1-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
2071; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2072; XOPAVX1-NEXT:    retq
2073;
2074; XOPAVX2-LABEL: test_bitreverse_v64i8:
2075; XOPAVX2:       # %bb.0:
2076; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
2077; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]
2078; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2079; XOPAVX2-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
2080; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
2081; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
2082; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2083; XOPAVX2-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
2084; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
2085; XOPAVX2-NEXT:    retq
2086;
2087; GFNISSE-LABEL: test_bitreverse_v64i8:
2088; GFNISSE:       # %bb.0:
2089; GFNISSE-NEXT:    movdqa {{.*#+}} xmm4 = [9241421688590303745,9241421688590303745]
2090; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm0
2091; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm1
2092; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm2
2093; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm3
2094; GFNISSE-NEXT:    retq
2095;
2096; GFNIAVX-LABEL: test_bitreverse_v64i8:
2097; GFNIAVX:       # %bb.0:
2098; GFNIAVX-NEXT:    vextractf128 $1, %ymm0, %xmm2
2099; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745]
2100; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm2, %xmm2
2101; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm0, %xmm0
2102; GFNIAVX-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2103; GFNIAVX-NEXT:    vextractf128 $1, %ymm1, %xmm2
2104; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm2, %xmm2
2105; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm1, %xmm1
2106; GFNIAVX-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2107; GFNIAVX-NEXT:    retq
2108;
2109; GFNIAVX2-LABEL: test_bitreverse_v64i8:
2110; GFNIAVX2:       # %bb.0:
2111; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
2112; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm2, %ymm0, %ymm0
2113; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm2, %ymm1, %ymm1
2114; GFNIAVX2-NEXT:    retq
2115;
2116; GFNIAVX512F-LABEL: test_bitreverse_v64i8:
2117; GFNIAVX512F:       # %bb.0:
2118; GFNIAVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2119; GFNIAVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
2120; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, %ymm2, %ymm1, %ymm1
2121; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, %ymm2, %ymm0, %ymm0
2122; GFNIAVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
2123; GFNIAVX512F-NEXT:    retq
2124;
2125; GFNIAVX512BW-LABEL: test_bitreverse_v64i8:
2126; GFNIAVX512BW:       # %bb.0:
2127; GFNIAVX512BW-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
2128; GFNIAVX512BW-NEXT:    retq
2129  %b = call <64 x i8> @llvm.bitreverse.v64i8(<64 x i8> %a)
2130  ret <64 x i8> %b
2131}
2132
2133define <32 x i16> @test_bitreverse_v32i16(<32 x i16> %a) nounwind {
2134; SSE2-LABEL: test_bitreverse_v32i16:
2135; SSE2:       # %bb.0:
2136; SSE2-NEXT:    movdqa %xmm3, %xmm4
2137; SSE2-NEXT:    movdqa %xmm0, %xmm3
2138; SSE2-NEXT:    psrlw $8, %xmm3
2139; SSE2-NEXT:    psllw $8, %xmm0
2140; SSE2-NEXT:    por %xmm3, %xmm0
2141; SSE2-NEXT:    movdqa %xmm0, %xmm5
2142; SSE2-NEXT:    psllw $4, %xmm5
2143; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2144; SSE2-NEXT:    movdqa %xmm3, %xmm6
2145; SSE2-NEXT:    pandn %xmm5, %xmm6
2146; SSE2-NEXT:    psrlw $4, %xmm0
2147; SSE2-NEXT:    pand %xmm3, %xmm0
2148; SSE2-NEXT:    por %xmm6, %xmm0
2149; SSE2-NEXT:    movdqa %xmm0, %xmm6
2150; SSE2-NEXT:    psrlw $2, %xmm6
2151; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
2152; SSE2-NEXT:    pand %xmm8, %xmm6
2153; SSE2-NEXT:    pand %xmm8, %xmm0
2154; SSE2-NEXT:    psllw $2, %xmm0
2155; SSE2-NEXT:    por %xmm6, %xmm0
2156; SSE2-NEXT:    movdqa %xmm0, %xmm7
2157; SSE2-NEXT:    psrlw $1, %xmm7
2158; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
2159; SSE2-NEXT:    pand %xmm6, %xmm7
2160; SSE2-NEXT:    pand %xmm6, %xmm0
2161; SSE2-NEXT:    paddb %xmm0, %xmm0
2162; SSE2-NEXT:    por %xmm7, %xmm0
2163; SSE2-NEXT:    movdqa %xmm1, %xmm7
2164; SSE2-NEXT:    psrlw $8, %xmm7
2165; SSE2-NEXT:    psllw $8, %xmm1
2166; SSE2-NEXT:    por %xmm7, %xmm1
2167; SSE2-NEXT:    movdqa %xmm1, %xmm7
2168; SSE2-NEXT:    psllw $4, %xmm7
2169; SSE2-NEXT:    movdqa %xmm3, %xmm5
2170; SSE2-NEXT:    pandn %xmm7, %xmm5
2171; SSE2-NEXT:    psrlw $4, %xmm1
2172; SSE2-NEXT:    pand %xmm3, %xmm1
2173; SSE2-NEXT:    por %xmm5, %xmm1
2174; SSE2-NEXT:    movdqa %xmm1, %xmm5
2175; SSE2-NEXT:    psrlw $2, %xmm5
2176; SSE2-NEXT:    pand %xmm8, %xmm5
2177; SSE2-NEXT:    pand %xmm8, %xmm1
2178; SSE2-NEXT:    psllw $2, %xmm1
2179; SSE2-NEXT:    por %xmm5, %xmm1
2180; SSE2-NEXT:    movdqa %xmm1, %xmm5
2181; SSE2-NEXT:    psrlw $1, %xmm5
2182; SSE2-NEXT:    pand %xmm6, %xmm5
2183; SSE2-NEXT:    pand %xmm6, %xmm1
2184; SSE2-NEXT:    paddb %xmm1, %xmm1
2185; SSE2-NEXT:    por %xmm5, %xmm1
2186; SSE2-NEXT:    movdqa %xmm2, %xmm5
2187; SSE2-NEXT:    psrlw $8, %xmm5
2188; SSE2-NEXT:    psllw $8, %xmm2
2189; SSE2-NEXT:    por %xmm5, %xmm2
2190; SSE2-NEXT:    movdqa %xmm2, %xmm5
2191; SSE2-NEXT:    psllw $4, %xmm5
2192; SSE2-NEXT:    movdqa %xmm3, %xmm7
2193; SSE2-NEXT:    pandn %xmm5, %xmm7
2194; SSE2-NEXT:    psrlw $4, %xmm2
2195; SSE2-NEXT:    pand %xmm3, %xmm2
2196; SSE2-NEXT:    por %xmm7, %xmm2
2197; SSE2-NEXT:    movdqa %xmm2, %xmm5
2198; SSE2-NEXT:    psrlw $2, %xmm5
2199; SSE2-NEXT:    pand %xmm8, %xmm5
2200; SSE2-NEXT:    pand %xmm8, %xmm2
2201; SSE2-NEXT:    psllw $2, %xmm2
2202; SSE2-NEXT:    por %xmm5, %xmm2
2203; SSE2-NEXT:    movdqa %xmm2, %xmm5
2204; SSE2-NEXT:    psrlw $1, %xmm5
2205; SSE2-NEXT:    pand %xmm6, %xmm5
2206; SSE2-NEXT:    pand %xmm6, %xmm2
2207; SSE2-NEXT:    paddb %xmm2, %xmm2
2208; SSE2-NEXT:    por %xmm5, %xmm2
2209; SSE2-NEXT:    movdqa %xmm4, %xmm5
2210; SSE2-NEXT:    psrlw $8, %xmm5
2211; SSE2-NEXT:    psllw $8, %xmm4
2212; SSE2-NEXT:    por %xmm5, %xmm4
2213; SSE2-NEXT:    movdqa %xmm4, %xmm5
2214; SSE2-NEXT:    psllw $4, %xmm5
2215; SSE2-NEXT:    psrlw $4, %xmm4
2216; SSE2-NEXT:    pand %xmm3, %xmm4
2217; SSE2-NEXT:    pandn %xmm5, %xmm3
2218; SSE2-NEXT:    por %xmm4, %xmm3
2219; SSE2-NEXT:    movdqa %xmm3, %xmm4
2220; SSE2-NEXT:    psrlw $2, %xmm4
2221; SSE2-NEXT:    pand %xmm8, %xmm4
2222; SSE2-NEXT:    pand %xmm8, %xmm3
2223; SSE2-NEXT:    psllw $2, %xmm3
2224; SSE2-NEXT:    por %xmm4, %xmm3
2225; SSE2-NEXT:    movdqa %xmm3, %xmm4
2226; SSE2-NEXT:    psrlw $1, %xmm4
2227; SSE2-NEXT:    pand %xmm6, %xmm4
2228; SSE2-NEXT:    pand %xmm6, %xmm3
2229; SSE2-NEXT:    paddb %xmm3, %xmm3
2230; SSE2-NEXT:    por %xmm4, %xmm3
2231; SSE2-NEXT:    retq
2232;
2233; SSSE3-LABEL: test_bitreverse_v32i16:
2234; SSSE3:       # %bb.0:
2235; SSSE3-NEXT:    movdqa %xmm1, %xmm5
2236; SSSE3-NEXT:    movdqa %xmm0, %xmm1
2237; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
2238; SSSE3-NEXT:    pshufb %xmm8, %xmm1
2239; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2240; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2241; SSSE3-NEXT:    pand %xmm9, %xmm0
2242; SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2243; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2244; SSSE3-NEXT:    pshufb %xmm0, %xmm6
2245; SSSE3-NEXT:    psrlw $4, %xmm1
2246; SSSE3-NEXT:    pand %xmm9, %xmm1
2247; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2248; SSSE3-NEXT:    movdqa %xmm4, %xmm0
2249; SSSE3-NEXT:    pshufb %xmm1, %xmm0
2250; SSSE3-NEXT:    por %xmm6, %xmm0
2251; SSSE3-NEXT:    pshufb %xmm8, %xmm5
2252; SSSE3-NEXT:    movdqa %xmm5, %xmm1
2253; SSSE3-NEXT:    pand %xmm9, %xmm1
2254; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2255; SSSE3-NEXT:    pshufb %xmm1, %xmm6
2256; SSSE3-NEXT:    psrlw $4, %xmm5
2257; SSSE3-NEXT:    pand %xmm9, %xmm5
2258; SSSE3-NEXT:    movdqa %xmm4, %xmm1
2259; SSSE3-NEXT:    pshufb %xmm5, %xmm1
2260; SSSE3-NEXT:    por %xmm6, %xmm1
2261; SSSE3-NEXT:    pshufb %xmm8, %xmm2
2262; SSSE3-NEXT:    movdqa %xmm2, %xmm5
2263; SSSE3-NEXT:    pand %xmm9, %xmm5
2264; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2265; SSSE3-NEXT:    pshufb %xmm5, %xmm6
2266; SSSE3-NEXT:    psrlw $4, %xmm2
2267; SSSE3-NEXT:    pand %xmm9, %xmm2
2268; SSSE3-NEXT:    movdqa %xmm4, %xmm5
2269; SSSE3-NEXT:    pshufb %xmm2, %xmm5
2270; SSSE3-NEXT:    por %xmm6, %xmm5
2271; SSSE3-NEXT:    pshufb %xmm8, %xmm3
2272; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2273; SSSE3-NEXT:    pand %xmm9, %xmm2
2274; SSSE3-NEXT:    pshufb %xmm2, %xmm7
2275; SSSE3-NEXT:    psrlw $4, %xmm3
2276; SSSE3-NEXT:    pand %xmm9, %xmm3
2277; SSSE3-NEXT:    pshufb %xmm3, %xmm4
2278; SSSE3-NEXT:    por %xmm7, %xmm4
2279; SSSE3-NEXT:    movdqa %xmm5, %xmm2
2280; SSSE3-NEXT:    movdqa %xmm4, %xmm3
2281; SSSE3-NEXT:    retq
2282;
2283; AVX1-LABEL: test_bitreverse_v32i16:
2284; AVX1:       # %bb.0:
2285; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2286; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
2287; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2288; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2289; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm5
2290; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2291; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
2292; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
2293; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2294; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2295; AVX1-NEXT:    vpshufb %xmm2, %xmm7, %xmm2
2296; AVX1-NEXT:    vpor %xmm2, %xmm5, %xmm2
2297; AVX1-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
2298; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm5
2299; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
2300; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
2301; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
2302; AVX1-NEXT:    vpshufb %xmm0, %xmm7, %xmm0
2303; AVX1-NEXT:    vpor %xmm0, %xmm5, %xmm0
2304; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2305; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2306; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2307; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm5
2308; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
2309; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
2310; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2311; AVX1-NEXT:    vpshufb %xmm2, %xmm7, %xmm2
2312; AVX1-NEXT:    vpor %xmm2, %xmm5, %xmm2
2313; AVX1-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
2314; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm3
2315; AVX1-NEXT:    vpshufb %xmm3, %xmm6, %xmm3
2316; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
2317; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
2318; AVX1-NEXT:    vpshufb %xmm1, %xmm7, %xmm1
2319; AVX1-NEXT:    vpor %xmm1, %xmm3, %xmm1
2320; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2321; AVX1-NEXT:    retq
2322;
2323; AVX2-LABEL: test_bitreverse_v32i16:
2324; AVX2:       # %bb.0:
2325; 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]
2326; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
2327; 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]
2328; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm4
2329; 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]
2330; AVX2-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
2331; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
2332; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm0
2333; 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]
2334; AVX2-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
2335; AVX2-NEXT:    vpor %ymm0, %ymm4, %ymm0
2336; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
2337; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm2
2338; AVX2-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
2339; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
2340; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1
2341; AVX2-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
2342; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
2343; AVX2-NEXT:    retq
2344;
2345; AVX512F-LABEL: test_bitreverse_v32i16:
2346; AVX512F:       # %bb.0:
2347; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2348; 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]
2349; AVX512F-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
2350; 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]
2351; AVX512F-NEXT:    vpand %ymm3, %ymm1, %ymm4
2352; 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]
2353; AVX512F-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
2354; AVX512F-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
2355; AVX512F-NEXT:    vpand %ymm3, %ymm0, %ymm2
2356; AVX512F-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
2357; AVX512F-NEXT:    vinserti64x4 $1, %ymm4, %zmm2, %zmm2
2358; AVX512F-NEXT:    vpsrlw $4, %ymm1, %ymm1
2359; AVX512F-NEXT:    vpand %ymm3, %ymm1, %ymm1
2360; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [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]
2361; AVX512F-NEXT:    vpshufb %ymm1, %ymm4, %ymm1
2362; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm0
2363; AVX512F-NEXT:    vpand %ymm3, %ymm0, %ymm0
2364; AVX512F-NEXT:    vpshufb %ymm0, %ymm4, %ymm0
2365; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
2366; AVX512F-NEXT:    vporq %zmm0, %zmm2, %zmm0
2367; AVX512F-NEXT:    retq
2368;
2369; AVX512BW-LABEL: test_bitreverse_v32i16:
2370; AVX512BW:       # %bb.0:
2371; 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]
2372; 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]
2373; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
2374; 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]
2375; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
2376; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
2377; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
2378; 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]
2379; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm0
2380; AVX512BW-NEXT:    vporq %zmm0, %zmm2, %zmm0
2381; AVX512BW-NEXT:    retq
2382;
2383; XOPAVX1-LABEL: test_bitreverse_v32i16:
2384; XOPAVX1:       # %bb.0:
2385; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2386; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]
2387; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2388; XOPAVX1-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
2389; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2390; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2391; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2392; XOPAVX1-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
2393; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2394; XOPAVX1-NEXT:    retq
2395;
2396; XOPAVX2-LABEL: test_bitreverse_v32i16:
2397; XOPAVX2:       # %bb.0:
2398; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
2399; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]
2400; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2401; XOPAVX2-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
2402; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
2403; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
2404; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2405; XOPAVX2-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
2406; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
2407; XOPAVX2-NEXT:    retq
2408;
2409; GFNISSE-LABEL: test_bitreverse_v32i16:
2410; GFNISSE:       # %bb.0:
2411; GFNISSE-NEXT:    movdqa {{.*#+}} xmm4 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
2412; GFNISSE-NEXT:    pshufb %xmm4, %xmm0
2413; GFNISSE-NEXT:    movdqa {{.*#+}} xmm5 = [9241421688590303745,9241421688590303745]
2414; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm0
2415; GFNISSE-NEXT:    pshufb %xmm4, %xmm1
2416; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm1
2417; GFNISSE-NEXT:    pshufb %xmm4, %xmm2
2418; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm2
2419; GFNISSE-NEXT:    pshufb %xmm4, %xmm3
2420; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm3
2421; GFNISSE-NEXT:    retq
2422;
2423; GFNIAVX-LABEL: test_bitreverse_v32i16:
2424; GFNIAVX:       # %bb.0:
2425; GFNIAVX-NEXT:    vextractf128 $1, %ymm0, %xmm2
2426; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
2427; GFNIAVX-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2428; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm4 = [9241421688590303745,9241421688590303745]
2429; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm2, %xmm2
2430; GFNIAVX-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
2431; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm0, %xmm0
2432; GFNIAVX-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2433; GFNIAVX-NEXT:    vextractf128 $1, %ymm1, %xmm2
2434; GFNIAVX-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2435; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm2, %xmm2
2436; GFNIAVX-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
2437; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm1, %xmm1
2438; GFNIAVX-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2439; GFNIAVX-NEXT:    retq
2440;
2441; GFNIAVX2-LABEL: test_bitreverse_v32i16:
2442; GFNIAVX2:       # %bb.0:
2443; GFNIAVX2-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]
2444; GFNIAVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
2445; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
2446; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm0, %ymm0
2447; GFNIAVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
2448; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm1, %ymm1
2449; GFNIAVX2-NEXT:    retq
2450;
2451; GFNIAVX512F-LABEL: test_bitreverse_v32i16:
2452; GFNIAVX512F:       # %bb.0:
2453; GFNIAVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2454; GFNIAVX512F-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]
2455; GFNIAVX512F-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
2456; GFNIAVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
2457; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm1, %ymm1
2458; GFNIAVX512F-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
2459; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm0, %ymm0
2460; GFNIAVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
2461; GFNIAVX512F-NEXT:    retq
2462;
2463; GFNIAVX512BW-LABEL: test_bitreverse_v32i16:
2464; GFNIAVX512BW:       # %bb.0:
2465; GFNIAVX512BW-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]
2466; GFNIAVX512BW-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
2467; GFNIAVX512BW-NEXT:    retq
2468  %b = call <32 x i16> @llvm.bitreverse.v32i16(<32 x i16> %a)
2469  ret <32 x i16> %b
2470}
2471
2472define <16 x i32> @test_bitreverse_v16i32(<16 x i32> %a) nounwind {
2473; SSE2-LABEL: test_bitreverse_v16i32:
2474; SSE2:       # %bb.0:
2475; SSE2-NEXT:    movdqa %xmm3, %xmm4
2476; SSE2-NEXT:    pxor %xmm8, %xmm8
2477; SSE2-NEXT:    movdqa %xmm0, %xmm3
2478; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm8[8],xmm3[9],xmm8[9],xmm3[10],xmm8[10],xmm3[11],xmm8[11],xmm3[12],xmm8[12],xmm3[13],xmm8[13],xmm3[14],xmm8[14],xmm3[15],xmm8[15]
2479; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7]
2480; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]
2481; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm8[0],xmm0[1],xmm8[1],xmm0[2],xmm8[2],xmm0[3],xmm8[3],xmm0[4],xmm8[4],xmm0[5],xmm8[5],xmm0[6],xmm8[6],xmm0[7],xmm8[7]
2482; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
2483; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
2484; SSE2-NEXT:    packuswb %xmm3, %xmm0
2485; SSE2-NEXT:    movdqa %xmm0, %xmm6
2486; SSE2-NEXT:    psllw $4, %xmm6
2487; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2488; SSE2-NEXT:    movdqa %xmm3, %xmm7
2489; SSE2-NEXT:    pandn %xmm6, %xmm7
2490; SSE2-NEXT:    psrlw $4, %xmm0
2491; SSE2-NEXT:    pand %xmm3, %xmm0
2492; SSE2-NEXT:    por %xmm7, %xmm0
2493; SSE2-NEXT:    movdqa %xmm0, %xmm7
2494; SSE2-NEXT:    psrlw $2, %xmm7
2495; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
2496; SSE2-NEXT:    pand %xmm9, %xmm7
2497; SSE2-NEXT:    pand %xmm9, %xmm0
2498; SSE2-NEXT:    psllw $2, %xmm0
2499; SSE2-NEXT:    por %xmm7, %xmm0
2500; SSE2-NEXT:    movdqa %xmm0, %xmm5
2501; SSE2-NEXT:    psrlw $1, %xmm5
2502; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
2503; SSE2-NEXT:    pand %xmm7, %xmm5
2504; SSE2-NEXT:    pand %xmm7, %xmm0
2505; SSE2-NEXT:    paddb %xmm0, %xmm0
2506; SSE2-NEXT:    por %xmm5, %xmm0
2507; SSE2-NEXT:    movdqa %xmm1, %xmm5
2508; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm8[8],xmm5[9],xmm8[9],xmm5[10],xmm8[10],xmm5[11],xmm8[11],xmm5[12],xmm8[12],xmm5[13],xmm8[13],xmm5[14],xmm8[14],xmm5[15],xmm8[15]
2509; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7]
2510; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4]
2511; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm8[0],xmm1[1],xmm8[1],xmm1[2],xmm8[2],xmm1[3],xmm8[3],xmm1[4],xmm8[4],xmm1[5],xmm8[5],xmm1[6],xmm8[6],xmm1[7],xmm8[7]
2512; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]
2513; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]
2514; SSE2-NEXT:    packuswb %xmm5, %xmm1
2515; SSE2-NEXT:    movdqa %xmm1, %xmm5
2516; SSE2-NEXT:    psllw $4, %xmm5
2517; SSE2-NEXT:    movdqa %xmm3, %xmm6
2518; SSE2-NEXT:    pandn %xmm5, %xmm6
2519; SSE2-NEXT:    psrlw $4, %xmm1
2520; SSE2-NEXT:    pand %xmm3, %xmm1
2521; SSE2-NEXT:    por %xmm6, %xmm1
2522; SSE2-NEXT:    movdqa %xmm1, %xmm5
2523; SSE2-NEXT:    psrlw $2, %xmm5
2524; SSE2-NEXT:    pand %xmm9, %xmm5
2525; SSE2-NEXT:    pand %xmm9, %xmm1
2526; SSE2-NEXT:    psllw $2, %xmm1
2527; SSE2-NEXT:    por %xmm5, %xmm1
2528; SSE2-NEXT:    movdqa %xmm1, %xmm5
2529; SSE2-NEXT:    psrlw $1, %xmm5
2530; SSE2-NEXT:    pand %xmm7, %xmm5
2531; SSE2-NEXT:    pand %xmm7, %xmm1
2532; SSE2-NEXT:    paddb %xmm1, %xmm1
2533; SSE2-NEXT:    por %xmm5, %xmm1
2534; SSE2-NEXT:    movdqa %xmm2, %xmm5
2535; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm8[8],xmm5[9],xmm8[9],xmm5[10],xmm8[10],xmm5[11],xmm8[11],xmm5[12],xmm8[12],xmm5[13],xmm8[13],xmm5[14],xmm8[14],xmm5[15],xmm8[15]
2536; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7]
2537; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4]
2538; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm8[0],xmm2[1],xmm8[1],xmm2[2],xmm8[2],xmm2[3],xmm8[3],xmm2[4],xmm8[4],xmm2[5],xmm8[5],xmm2[6],xmm8[6],xmm2[7],xmm8[7]
2539; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
2540; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
2541; SSE2-NEXT:    packuswb %xmm5, %xmm2
2542; SSE2-NEXT:    movdqa %xmm2, %xmm5
2543; SSE2-NEXT:    psllw $4, %xmm5
2544; SSE2-NEXT:    movdqa %xmm3, %xmm6
2545; SSE2-NEXT:    pandn %xmm5, %xmm6
2546; SSE2-NEXT:    psrlw $4, %xmm2
2547; SSE2-NEXT:    pand %xmm3, %xmm2
2548; SSE2-NEXT:    por %xmm6, %xmm2
2549; SSE2-NEXT:    movdqa %xmm2, %xmm5
2550; SSE2-NEXT:    psrlw $2, %xmm5
2551; SSE2-NEXT:    pand %xmm9, %xmm5
2552; SSE2-NEXT:    pand %xmm9, %xmm2
2553; SSE2-NEXT:    psllw $2, %xmm2
2554; SSE2-NEXT:    por %xmm5, %xmm2
2555; SSE2-NEXT:    movdqa %xmm2, %xmm5
2556; SSE2-NEXT:    psrlw $1, %xmm5
2557; SSE2-NEXT:    pand %xmm7, %xmm5
2558; SSE2-NEXT:    pand %xmm7, %xmm2
2559; SSE2-NEXT:    paddb %xmm2, %xmm2
2560; SSE2-NEXT:    por %xmm5, %xmm2
2561; SSE2-NEXT:    movdqa %xmm4, %xmm5
2562; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm8[8],xmm5[9],xmm8[9],xmm5[10],xmm8[10],xmm5[11],xmm8[11],xmm5[12],xmm8[12],xmm5[13],xmm8[13],xmm5[14],xmm8[14],xmm5[15],xmm8[15]
2563; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7]
2564; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4]
2565; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm8[0],xmm4[1],xmm8[1],xmm4[2],xmm8[2],xmm4[3],xmm8[3],xmm4[4],xmm8[4],xmm4[5],xmm8[5],xmm4[6],xmm8[6],xmm4[7],xmm8[7]
2566; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7]
2567; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4]
2568; SSE2-NEXT:    packuswb %xmm5, %xmm4
2569; SSE2-NEXT:    movdqa %xmm4, %xmm5
2570; SSE2-NEXT:    psllw $4, %xmm5
2571; SSE2-NEXT:    psrlw $4, %xmm4
2572; SSE2-NEXT:    pand %xmm3, %xmm4
2573; SSE2-NEXT:    pandn %xmm5, %xmm3
2574; SSE2-NEXT:    por %xmm4, %xmm3
2575; SSE2-NEXT:    movdqa %xmm3, %xmm4
2576; SSE2-NEXT:    psrlw $2, %xmm4
2577; SSE2-NEXT:    pand %xmm9, %xmm4
2578; SSE2-NEXT:    pand %xmm9, %xmm3
2579; SSE2-NEXT:    psllw $2, %xmm3
2580; SSE2-NEXT:    por %xmm4, %xmm3
2581; SSE2-NEXT:    movdqa %xmm3, %xmm4
2582; SSE2-NEXT:    psrlw $1, %xmm4
2583; SSE2-NEXT:    pand %xmm7, %xmm4
2584; SSE2-NEXT:    pand %xmm7, %xmm3
2585; SSE2-NEXT:    paddb %xmm3, %xmm3
2586; SSE2-NEXT:    por %xmm4, %xmm3
2587; SSE2-NEXT:    retq
2588;
2589; SSSE3-LABEL: test_bitreverse_v16i32:
2590; SSSE3:       # %bb.0:
2591; SSSE3-NEXT:    movdqa %xmm1, %xmm5
2592; SSSE3-NEXT:    movdqa %xmm0, %xmm1
2593; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
2594; SSSE3-NEXT:    pshufb %xmm8, %xmm1
2595; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2596; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2597; SSSE3-NEXT:    pand %xmm9, %xmm0
2598; SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2599; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2600; SSSE3-NEXT:    pshufb %xmm0, %xmm6
2601; SSSE3-NEXT:    psrlw $4, %xmm1
2602; SSSE3-NEXT:    pand %xmm9, %xmm1
2603; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2604; SSSE3-NEXT:    movdqa %xmm4, %xmm0
2605; SSSE3-NEXT:    pshufb %xmm1, %xmm0
2606; SSSE3-NEXT:    por %xmm6, %xmm0
2607; SSSE3-NEXT:    pshufb %xmm8, %xmm5
2608; SSSE3-NEXT:    movdqa %xmm5, %xmm1
2609; SSSE3-NEXT:    pand %xmm9, %xmm1
2610; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2611; SSSE3-NEXT:    pshufb %xmm1, %xmm6
2612; SSSE3-NEXT:    psrlw $4, %xmm5
2613; SSSE3-NEXT:    pand %xmm9, %xmm5
2614; SSSE3-NEXT:    movdqa %xmm4, %xmm1
2615; SSSE3-NEXT:    pshufb %xmm5, %xmm1
2616; SSSE3-NEXT:    por %xmm6, %xmm1
2617; SSSE3-NEXT:    pshufb %xmm8, %xmm2
2618; SSSE3-NEXT:    movdqa %xmm2, %xmm5
2619; SSSE3-NEXT:    pand %xmm9, %xmm5
2620; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2621; SSSE3-NEXT:    pshufb %xmm5, %xmm6
2622; SSSE3-NEXT:    psrlw $4, %xmm2
2623; SSSE3-NEXT:    pand %xmm9, %xmm2
2624; SSSE3-NEXT:    movdqa %xmm4, %xmm5
2625; SSSE3-NEXT:    pshufb %xmm2, %xmm5
2626; SSSE3-NEXT:    por %xmm6, %xmm5
2627; SSSE3-NEXT:    pshufb %xmm8, %xmm3
2628; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2629; SSSE3-NEXT:    pand %xmm9, %xmm2
2630; SSSE3-NEXT:    pshufb %xmm2, %xmm7
2631; SSSE3-NEXT:    psrlw $4, %xmm3
2632; SSSE3-NEXT:    pand %xmm9, %xmm3
2633; SSSE3-NEXT:    pshufb %xmm3, %xmm4
2634; SSSE3-NEXT:    por %xmm7, %xmm4
2635; SSSE3-NEXT:    movdqa %xmm5, %xmm2
2636; SSSE3-NEXT:    movdqa %xmm4, %xmm3
2637; SSSE3-NEXT:    retq
2638;
2639; AVX1-LABEL: test_bitreverse_v16i32:
2640; AVX1:       # %bb.0:
2641; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2642; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
2643; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2644; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2645; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm5
2646; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2647; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
2648; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
2649; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2650; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2651; AVX1-NEXT:    vpshufb %xmm2, %xmm7, %xmm2
2652; AVX1-NEXT:    vpor %xmm2, %xmm5, %xmm2
2653; AVX1-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
2654; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm5
2655; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
2656; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
2657; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
2658; AVX1-NEXT:    vpshufb %xmm0, %xmm7, %xmm0
2659; AVX1-NEXT:    vpor %xmm0, %xmm5, %xmm0
2660; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2661; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2662; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2663; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm5
2664; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
2665; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
2666; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2667; AVX1-NEXT:    vpshufb %xmm2, %xmm7, %xmm2
2668; AVX1-NEXT:    vpor %xmm2, %xmm5, %xmm2
2669; AVX1-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
2670; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm3
2671; AVX1-NEXT:    vpshufb %xmm3, %xmm6, %xmm3
2672; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
2673; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
2674; AVX1-NEXT:    vpshufb %xmm1, %xmm7, %xmm1
2675; AVX1-NEXT:    vpor %xmm1, %xmm3, %xmm1
2676; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2677; AVX1-NEXT:    retq
2678;
2679; AVX2-LABEL: test_bitreverse_v16i32:
2680; AVX2:       # %bb.0:
2681; 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]
2682; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
2683; 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]
2684; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm4
2685; 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]
2686; AVX2-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
2687; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
2688; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm0
2689; 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]
2690; AVX2-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
2691; AVX2-NEXT:    vpor %ymm0, %ymm4, %ymm0
2692; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
2693; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm2
2694; AVX2-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
2695; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
2696; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1
2697; AVX2-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
2698; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
2699; AVX2-NEXT:    retq
2700;
2701; AVX512F-LABEL: test_bitreverse_v16i32:
2702; AVX512F:       # %bb.0:
2703; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2704; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
2705; AVX512F-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
2706; 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]
2707; AVX512F-NEXT:    vpand %ymm3, %ymm1, %ymm4
2708; 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]
2709; AVX512F-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
2710; AVX512F-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
2711; AVX512F-NEXT:    vpand %ymm3, %ymm0, %ymm2
2712; AVX512F-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
2713; AVX512F-NEXT:    vinserti64x4 $1, %ymm4, %zmm2, %zmm2
2714; AVX512F-NEXT:    vpsrlw $4, %ymm1, %ymm1
2715; AVX512F-NEXT:    vpand %ymm3, %ymm1, %ymm1
2716; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [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]
2717; AVX512F-NEXT:    vpshufb %ymm1, %ymm4, %ymm1
2718; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm0
2719; AVX512F-NEXT:    vpand %ymm3, %ymm0, %ymm0
2720; AVX512F-NEXT:    vpshufb %ymm0, %ymm4, %ymm0
2721; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
2722; AVX512F-NEXT:    vporq %zmm0, %zmm2, %zmm0
2723; AVX512F-NEXT:    retq
2724;
2725; AVX512BW-LABEL: test_bitreverse_v16i32:
2726; AVX512BW:       # %bb.0:
2727; 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]
2728; 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]
2729; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
2730; 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]
2731; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
2732; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
2733; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
2734; 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]
2735; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm0
2736; AVX512BW-NEXT:    vporq %zmm0, %zmm2, %zmm0
2737; AVX512BW-NEXT:    retq
2738;
2739; XOPAVX1-LABEL: test_bitreverse_v16i32:
2740; XOPAVX1:       # %bb.0:
2741; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2742; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]
2743; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2744; XOPAVX1-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
2745; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2746; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2747; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2748; XOPAVX1-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
2749; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2750; XOPAVX1-NEXT:    retq
2751;
2752; XOPAVX2-LABEL: test_bitreverse_v16i32:
2753; XOPAVX2:       # %bb.0:
2754; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
2755; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]
2756; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2757; XOPAVX2-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
2758; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
2759; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
2760; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
2761; XOPAVX2-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
2762; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
2763; XOPAVX2-NEXT:    retq
2764;
2765; GFNISSE-LABEL: test_bitreverse_v16i32:
2766; GFNISSE:       # %bb.0:
2767; GFNISSE-NEXT:    movdqa {{.*#+}} xmm4 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
2768; GFNISSE-NEXT:    pshufb %xmm4, %xmm0
2769; GFNISSE-NEXT:    movdqa {{.*#+}} xmm5 = [9241421688590303745,9241421688590303745]
2770; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm0
2771; GFNISSE-NEXT:    pshufb %xmm4, %xmm1
2772; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm1
2773; GFNISSE-NEXT:    pshufb %xmm4, %xmm2
2774; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm2
2775; GFNISSE-NEXT:    pshufb %xmm4, %xmm3
2776; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm3
2777; GFNISSE-NEXT:    retq
2778;
2779; GFNIAVX-LABEL: test_bitreverse_v16i32:
2780; GFNIAVX:       # %bb.0:
2781; GFNIAVX-NEXT:    vextractf128 $1, %ymm0, %xmm2
2782; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
2783; GFNIAVX-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2784; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm4 = [9241421688590303745,9241421688590303745]
2785; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm2, %xmm2
2786; GFNIAVX-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
2787; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm0, %xmm0
2788; GFNIAVX-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2789; GFNIAVX-NEXT:    vextractf128 $1, %ymm1, %xmm2
2790; GFNIAVX-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2791; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm2, %xmm2
2792; GFNIAVX-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
2793; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm1, %xmm1
2794; GFNIAVX-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2795; GFNIAVX-NEXT:    retq
2796;
2797; GFNIAVX2-LABEL: test_bitreverse_v16i32:
2798; GFNIAVX2:       # %bb.0:
2799; GFNIAVX2-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]
2800; GFNIAVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
2801; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
2802; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm0, %ymm0
2803; GFNIAVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
2804; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm1, %ymm1
2805; GFNIAVX2-NEXT:    retq
2806;
2807; GFNIAVX512F-LABEL: test_bitreverse_v16i32:
2808; GFNIAVX512F:       # %bb.0:
2809; GFNIAVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2810; GFNIAVX512F-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]
2811; GFNIAVX512F-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
2812; GFNIAVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
2813; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm1, %ymm1
2814; GFNIAVX512F-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
2815; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm0, %ymm0
2816; GFNIAVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
2817; GFNIAVX512F-NEXT:    retq
2818;
2819; GFNIAVX512BW-LABEL: test_bitreverse_v16i32:
2820; GFNIAVX512BW:       # %bb.0:
2821; GFNIAVX512BW-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]
2822; GFNIAVX512BW-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
2823; GFNIAVX512BW-NEXT:    retq
2824  %b = call <16 x i32> @llvm.bitreverse.v16i32(<16 x i32> %a)
2825  ret <16 x i32> %b
2826}
2827
2828define <8 x i64> @test_bitreverse_v8i64(<8 x i64> %a) nounwind {
2829; SSE2-LABEL: test_bitreverse_v8i64:
2830; SSE2:       # %bb.0:
2831; SSE2-NEXT:    movdqa %xmm3, %xmm4
2832; SSE2-NEXT:    pxor %xmm8, %xmm8
2833; SSE2-NEXT:    movdqa %xmm0, %xmm3
2834; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm8[8],xmm3[9],xmm8[9],xmm3[10],xmm8[10],xmm3[11],xmm8[11],xmm3[12],xmm8[12],xmm3[13],xmm8[13],xmm3[14],xmm8[14],xmm3[15],xmm8[15]
2835; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
2836; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7]
2837; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]
2838; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm8[0],xmm0[1],xmm8[1],xmm0[2],xmm8[2],xmm0[3],xmm8[3],xmm0[4],xmm8[4],xmm0[5],xmm8[5],xmm0[6],xmm8[6],xmm0[7],xmm8[7]
2839; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2840; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
2841; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
2842; SSE2-NEXT:    packuswb %xmm3, %xmm0
2843; SSE2-NEXT:    movdqa %xmm0, %xmm6
2844; SSE2-NEXT:    psllw $4, %xmm6
2845; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2846; SSE2-NEXT:    movdqa %xmm3, %xmm7
2847; SSE2-NEXT:    pandn %xmm6, %xmm7
2848; SSE2-NEXT:    psrlw $4, %xmm0
2849; SSE2-NEXT:    pand %xmm3, %xmm0
2850; SSE2-NEXT:    por %xmm7, %xmm0
2851; SSE2-NEXT:    movdqa %xmm0, %xmm7
2852; SSE2-NEXT:    psrlw $2, %xmm7
2853; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
2854; SSE2-NEXT:    pand %xmm9, %xmm7
2855; SSE2-NEXT:    pand %xmm9, %xmm0
2856; SSE2-NEXT:    psllw $2, %xmm0
2857; SSE2-NEXT:    por %xmm7, %xmm0
2858; SSE2-NEXT:    movdqa %xmm0, %xmm5
2859; SSE2-NEXT:    psrlw $1, %xmm5
2860; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]
2861; SSE2-NEXT:    pand %xmm7, %xmm5
2862; SSE2-NEXT:    pand %xmm7, %xmm0
2863; SSE2-NEXT:    paddb %xmm0, %xmm0
2864; SSE2-NEXT:    por %xmm5, %xmm0
2865; SSE2-NEXT:    movdqa %xmm1, %xmm5
2866; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm8[8],xmm5[9],xmm8[9],xmm5[10],xmm8[10],xmm5[11],xmm8[11],xmm5[12],xmm8[12],xmm5[13],xmm8[13],xmm5[14],xmm8[14],xmm5[15],xmm8[15]
2867; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[2,3,0,1]
2868; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7]
2869; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4]
2870; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm8[0],xmm1[1],xmm8[1],xmm1[2],xmm8[2],xmm1[3],xmm8[3],xmm1[4],xmm8[4],xmm1[5],xmm8[5],xmm1[6],xmm8[6],xmm1[7],xmm8[7]
2871; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2872; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]
2873; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]
2874; SSE2-NEXT:    packuswb %xmm5, %xmm1
2875; SSE2-NEXT:    movdqa %xmm1, %xmm5
2876; SSE2-NEXT:    psllw $4, %xmm5
2877; SSE2-NEXT:    movdqa %xmm3, %xmm6
2878; SSE2-NEXT:    pandn %xmm5, %xmm6
2879; SSE2-NEXT:    psrlw $4, %xmm1
2880; SSE2-NEXT:    pand %xmm3, %xmm1
2881; SSE2-NEXT:    por %xmm6, %xmm1
2882; SSE2-NEXT:    movdqa %xmm1, %xmm5
2883; SSE2-NEXT:    psrlw $2, %xmm5
2884; SSE2-NEXT:    pand %xmm9, %xmm5
2885; SSE2-NEXT:    pand %xmm9, %xmm1
2886; SSE2-NEXT:    psllw $2, %xmm1
2887; SSE2-NEXT:    por %xmm5, %xmm1
2888; SSE2-NEXT:    movdqa %xmm1, %xmm5
2889; SSE2-NEXT:    psrlw $1, %xmm5
2890; SSE2-NEXT:    pand %xmm7, %xmm5
2891; SSE2-NEXT:    pand %xmm7, %xmm1
2892; SSE2-NEXT:    paddb %xmm1, %xmm1
2893; SSE2-NEXT:    por %xmm5, %xmm1
2894; SSE2-NEXT:    movdqa %xmm2, %xmm5
2895; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm8[8],xmm5[9],xmm8[9],xmm5[10],xmm8[10],xmm5[11],xmm8[11],xmm5[12],xmm8[12],xmm5[13],xmm8[13],xmm5[14],xmm8[14],xmm5[15],xmm8[15]
2896; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[2,3,0,1]
2897; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7]
2898; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4]
2899; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm8[0],xmm2[1],xmm8[1],xmm2[2],xmm8[2],xmm2[3],xmm8[3],xmm2[4],xmm8[4],xmm2[5],xmm8[5],xmm2[6],xmm8[6],xmm2[7],xmm8[7]
2900; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
2901; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
2902; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
2903; SSE2-NEXT:    packuswb %xmm5, %xmm2
2904; SSE2-NEXT:    movdqa %xmm2, %xmm5
2905; SSE2-NEXT:    psllw $4, %xmm5
2906; SSE2-NEXT:    movdqa %xmm3, %xmm6
2907; SSE2-NEXT:    pandn %xmm5, %xmm6
2908; SSE2-NEXT:    psrlw $4, %xmm2
2909; SSE2-NEXT:    pand %xmm3, %xmm2
2910; SSE2-NEXT:    por %xmm6, %xmm2
2911; SSE2-NEXT:    movdqa %xmm2, %xmm5
2912; SSE2-NEXT:    psrlw $2, %xmm5
2913; SSE2-NEXT:    pand %xmm9, %xmm5
2914; SSE2-NEXT:    pand %xmm9, %xmm2
2915; SSE2-NEXT:    psllw $2, %xmm2
2916; SSE2-NEXT:    por %xmm5, %xmm2
2917; SSE2-NEXT:    movdqa %xmm2, %xmm5
2918; SSE2-NEXT:    psrlw $1, %xmm5
2919; SSE2-NEXT:    pand %xmm7, %xmm5
2920; SSE2-NEXT:    pand %xmm7, %xmm2
2921; SSE2-NEXT:    paddb %xmm2, %xmm2
2922; SSE2-NEXT:    por %xmm5, %xmm2
2923; SSE2-NEXT:    movdqa %xmm4, %xmm5
2924; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm8[8],xmm5[9],xmm8[9],xmm5[10],xmm8[10],xmm5[11],xmm8[11],xmm5[12],xmm8[12],xmm5[13],xmm8[13],xmm5[14],xmm8[14],xmm5[15],xmm8[15]
2925; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[2,3,0,1]
2926; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7]
2927; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4]
2928; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm8[0],xmm4[1],xmm8[1],xmm4[2],xmm8[2],xmm4[3],xmm8[3],xmm4[4],xmm8[4],xmm4[5],xmm8[5],xmm4[6],xmm8[6],xmm4[7],xmm8[7]
2929; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[2,3,0,1]
2930; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7]
2931; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4]
2932; SSE2-NEXT:    packuswb %xmm5, %xmm4
2933; SSE2-NEXT:    movdqa %xmm4, %xmm5
2934; SSE2-NEXT:    psllw $4, %xmm5
2935; SSE2-NEXT:    psrlw $4, %xmm4
2936; SSE2-NEXT:    pand %xmm3, %xmm4
2937; SSE2-NEXT:    pandn %xmm5, %xmm3
2938; SSE2-NEXT:    por %xmm4, %xmm3
2939; SSE2-NEXT:    movdqa %xmm3, %xmm4
2940; SSE2-NEXT:    psrlw $2, %xmm4
2941; SSE2-NEXT:    pand %xmm9, %xmm4
2942; SSE2-NEXT:    pand %xmm9, %xmm3
2943; SSE2-NEXT:    psllw $2, %xmm3
2944; SSE2-NEXT:    por %xmm4, %xmm3
2945; SSE2-NEXT:    movdqa %xmm3, %xmm4
2946; SSE2-NEXT:    psrlw $1, %xmm4
2947; SSE2-NEXT:    pand %xmm7, %xmm4
2948; SSE2-NEXT:    pand %xmm7, %xmm3
2949; SSE2-NEXT:    paddb %xmm3, %xmm3
2950; SSE2-NEXT:    por %xmm4, %xmm3
2951; SSE2-NEXT:    retq
2952;
2953; SSSE3-LABEL: test_bitreverse_v8i64:
2954; SSSE3:       # %bb.0:
2955; SSSE3-NEXT:    movdqa %xmm1, %xmm5
2956; SSSE3-NEXT:    movdqa %xmm0, %xmm1
2957; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
2958; SSSE3-NEXT:    pshufb %xmm8, %xmm1
2959; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2960; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2961; SSSE3-NEXT:    pand %xmm9, %xmm0
2962; SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2963; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2964; SSSE3-NEXT:    pshufb %xmm0, %xmm6
2965; SSSE3-NEXT:    psrlw $4, %xmm1
2966; SSSE3-NEXT:    pand %xmm9, %xmm1
2967; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2968; SSSE3-NEXT:    movdqa %xmm4, %xmm0
2969; SSSE3-NEXT:    pshufb %xmm1, %xmm0
2970; SSSE3-NEXT:    por %xmm6, %xmm0
2971; SSSE3-NEXT:    pshufb %xmm8, %xmm5
2972; SSSE3-NEXT:    movdqa %xmm5, %xmm1
2973; SSSE3-NEXT:    pand %xmm9, %xmm1
2974; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2975; SSSE3-NEXT:    pshufb %xmm1, %xmm6
2976; SSSE3-NEXT:    psrlw $4, %xmm5
2977; SSSE3-NEXT:    pand %xmm9, %xmm5
2978; SSSE3-NEXT:    movdqa %xmm4, %xmm1
2979; SSSE3-NEXT:    pshufb %xmm5, %xmm1
2980; SSSE3-NEXT:    por %xmm6, %xmm1
2981; SSSE3-NEXT:    pshufb %xmm8, %xmm2
2982; SSSE3-NEXT:    movdqa %xmm2, %xmm5
2983; SSSE3-NEXT:    pand %xmm9, %xmm5
2984; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2985; SSSE3-NEXT:    pshufb %xmm5, %xmm6
2986; SSSE3-NEXT:    psrlw $4, %xmm2
2987; SSSE3-NEXT:    pand %xmm9, %xmm2
2988; SSSE3-NEXT:    movdqa %xmm4, %xmm5
2989; SSSE3-NEXT:    pshufb %xmm2, %xmm5
2990; SSSE3-NEXT:    por %xmm6, %xmm5
2991; SSSE3-NEXT:    pshufb %xmm8, %xmm3
2992; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2993; SSSE3-NEXT:    pand %xmm9, %xmm2
2994; SSSE3-NEXT:    pshufb %xmm2, %xmm7
2995; SSSE3-NEXT:    psrlw $4, %xmm3
2996; SSSE3-NEXT:    pand %xmm9, %xmm3
2997; SSSE3-NEXT:    pshufb %xmm3, %xmm4
2998; SSSE3-NEXT:    por %xmm7, %xmm4
2999; SSSE3-NEXT:    movdqa %xmm5, %xmm2
3000; SSSE3-NEXT:    movdqa %xmm4, %xmm3
3001; SSSE3-NEXT:    retq
3002;
3003; AVX1-LABEL: test_bitreverse_v8i64:
3004; AVX1:       # %bb.0:
3005; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
3006; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
3007; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
3008; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
3009; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm5
3010; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
3011; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
3012; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
3013; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
3014; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
3015; AVX1-NEXT:    vpshufb %xmm2, %xmm7, %xmm2
3016; AVX1-NEXT:    vpor %xmm2, %xmm5, %xmm2
3017; AVX1-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
3018; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm5
3019; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
3020; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
3021; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
3022; AVX1-NEXT:    vpshufb %xmm0, %xmm7, %xmm0
3023; AVX1-NEXT:    vpor %xmm0, %xmm5, %xmm0
3024; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
3025; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
3026; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
3027; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm5
3028; AVX1-NEXT:    vpshufb %xmm5, %xmm6, %xmm5
3029; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
3030; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
3031; AVX1-NEXT:    vpshufb %xmm2, %xmm7, %xmm2
3032; AVX1-NEXT:    vpor %xmm2, %xmm5, %xmm2
3033; AVX1-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
3034; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm3
3035; AVX1-NEXT:    vpshufb %xmm3, %xmm6, %xmm3
3036; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
3037; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
3038; AVX1-NEXT:    vpshufb %xmm1, %xmm7, %xmm1
3039; AVX1-NEXT:    vpor %xmm1, %xmm3, %xmm1
3040; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3041; AVX1-NEXT:    retq
3042;
3043; AVX2-LABEL: test_bitreverse_v8i64:
3044; AVX2:       # %bb.0:
3045; 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]
3046; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
3047; 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]
3048; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm4
3049; 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]
3050; AVX2-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
3051; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
3052; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm0
3053; 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]
3054; AVX2-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
3055; AVX2-NEXT:    vpor %ymm0, %ymm4, %ymm0
3056; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
3057; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm2
3058; AVX2-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
3059; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
3060; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1
3061; AVX2-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
3062; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
3063; AVX2-NEXT:    retq
3064;
3065; AVX512F-LABEL: test_bitreverse_v8i64:
3066; AVX512F:       # %bb.0:
3067; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
3068; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
3069; AVX512F-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
3070; 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]
3071; AVX512F-NEXT:    vpand %ymm3, %ymm1, %ymm4
3072; 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]
3073; AVX512F-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
3074; AVX512F-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
3075; AVX512F-NEXT:    vpand %ymm3, %ymm0, %ymm2
3076; AVX512F-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
3077; AVX512F-NEXT:    vinserti64x4 $1, %ymm4, %zmm2, %zmm2
3078; AVX512F-NEXT:    vpsrlw $4, %ymm1, %ymm1
3079; AVX512F-NEXT:    vpand %ymm3, %ymm1, %ymm1
3080; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [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]
3081; AVX512F-NEXT:    vpshufb %ymm1, %ymm4, %ymm1
3082; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm0
3083; AVX512F-NEXT:    vpand %ymm3, %ymm0, %ymm0
3084; AVX512F-NEXT:    vpshufb %ymm0, %ymm4, %ymm0
3085; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
3086; AVX512F-NEXT:    vporq %zmm0, %zmm2, %zmm0
3087; AVX512F-NEXT:    retq
3088;
3089; AVX512BW-LABEL: test_bitreverse_v8i64:
3090; AVX512BW:       # %bb.0:
3091; 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]
3092; 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]
3093; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
3094; 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]
3095; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
3096; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
3097; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
3098; 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]
3099; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm0
3100; AVX512BW-NEXT:    vporq %zmm0, %zmm2, %zmm0
3101; AVX512BW-NEXT:    retq
3102;
3103; XOPAVX1-LABEL: test_bitreverse_v8i64:
3104; XOPAVX1:       # %bb.0:
3105; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
3106; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]
3107; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
3108; XOPAVX1-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
3109; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
3110; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
3111; XOPAVX1-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
3112; XOPAVX1-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
3113; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3114; XOPAVX1-NEXT:    retq
3115;
3116; XOPAVX2-LABEL: test_bitreverse_v8i64:
3117; XOPAVX2:       # %bb.0:
3118; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
3119; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]
3120; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
3121; XOPAVX2-NEXT:    vpperm %xmm3, %xmm0, %xmm0, %xmm0
3122; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
3123; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
3124; XOPAVX2-NEXT:    vpperm %xmm3, %xmm2, %xmm0, %xmm2
3125; XOPAVX2-NEXT:    vpperm %xmm3, %xmm1, %xmm0, %xmm1
3126; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
3127; XOPAVX2-NEXT:    retq
3128;
3129; GFNISSE-LABEL: test_bitreverse_v8i64:
3130; GFNISSE:       # %bb.0:
3131; GFNISSE-NEXT:    movdqa {{.*#+}} xmm4 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
3132; GFNISSE-NEXT:    pshufb %xmm4, %xmm0
3133; GFNISSE-NEXT:    movdqa {{.*#+}} xmm5 = [9241421688590303745,9241421688590303745]
3134; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm0
3135; GFNISSE-NEXT:    pshufb %xmm4, %xmm1
3136; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm1
3137; GFNISSE-NEXT:    pshufb %xmm4, %xmm2
3138; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm2
3139; GFNISSE-NEXT:    pshufb %xmm4, %xmm3
3140; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm3
3141; GFNISSE-NEXT:    retq
3142;
3143; GFNIAVX-LABEL: test_bitreverse_v8i64:
3144; GFNIAVX:       # %bb.0:
3145; GFNIAVX-NEXT:    vextractf128 $1, %ymm0, %xmm2
3146; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
3147; GFNIAVX-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
3148; GFNIAVX-NEXT:    vmovdqa {{.*#+}} xmm4 = [9241421688590303745,9241421688590303745]
3149; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm2, %xmm2
3150; GFNIAVX-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
3151; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm0, %xmm0
3152; GFNIAVX-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
3153; GFNIAVX-NEXT:    vextractf128 $1, %ymm1, %xmm2
3154; GFNIAVX-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
3155; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm2, %xmm2
3156; GFNIAVX-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
3157; GFNIAVX-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm1, %xmm1
3158; GFNIAVX-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
3159; GFNIAVX-NEXT:    retq
3160;
3161; GFNIAVX2-LABEL: test_bitreverse_v8i64:
3162; GFNIAVX2:       # %bb.0:
3163; GFNIAVX2-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]
3164; GFNIAVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
3165; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
3166; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm0, %ymm0
3167; GFNIAVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
3168; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm1, %ymm1
3169; GFNIAVX2-NEXT:    retq
3170;
3171; GFNIAVX512F-LABEL: test_bitreverse_v8i64:
3172; GFNIAVX512F:       # %bb.0:
3173; GFNIAVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
3174; GFNIAVX512F-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]
3175; GFNIAVX512F-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
3176; GFNIAVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
3177; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm1, %ymm1
3178; GFNIAVX512F-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
3179; GFNIAVX512F-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm0, %ymm0
3180; GFNIAVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
3181; GFNIAVX512F-NEXT:    retq
3182;
3183; GFNIAVX512BW-LABEL: test_bitreverse_v8i64:
3184; GFNIAVX512BW:       # %bb.0:
3185; GFNIAVX512BW-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]
3186; GFNIAVX512BW-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
3187; GFNIAVX512BW-NEXT:    retq
3188  %b = call <8 x i64> @llvm.bitreverse.v8i64(<8 x i64> %a)
3189  ret <8 x i64> %b
3190}
3191
3192;
3193; Constant Folding
3194;
3195
3196define i32 @fold_bitreverse_i32() nounwind {
3197; ALL-LABEL: fold_bitreverse_i32:
3198; ALL:       # %bb.0:
3199; ALL-NEXT:    movl $16711935, %eax # imm = 0xFF00FF
3200; ALL-NEXT:    retq
3201  %b = call i32 @llvm.bitreverse.i32(i32 4278255360)
3202  ret i32 %b
3203}
3204
3205define <16 x i8> @fold_bitreverse_v16i8() nounwind {
3206; SSE-LABEL: fold_bitreverse_v16i8:
3207; SSE:       # %bb.0:
3208; SSE-NEXT:    movaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]
3209; SSE-NEXT:    retq
3210;
3211; AVX-LABEL: fold_bitreverse_v16i8:
3212; AVX:       # %bb.0:
3213; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]
3214; AVX-NEXT:    retq
3215;
3216; XOP-LABEL: fold_bitreverse_v16i8:
3217; XOP:       # %bb.0:
3218; XOP-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]
3219; XOP-NEXT:    retq
3220;
3221; GFNISSE-LABEL: fold_bitreverse_v16i8:
3222; GFNISSE:       # %bb.0:
3223; GFNISSE-NEXT:    movaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]
3224; GFNISSE-NEXT:    retq
3225;
3226; GFNIAVX-LABEL: fold_bitreverse_v16i8:
3227; GFNIAVX:       # %bb.0:
3228; GFNIAVX-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]
3229; GFNIAVX-NEXT:    retq
3230;
3231; GFNIAVX2-LABEL: fold_bitreverse_v16i8:
3232; GFNIAVX2:       # %bb.0:
3233; GFNIAVX2-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]
3234; GFNIAVX2-NEXT:    retq
3235;
3236; GFNIAVX512F-LABEL: fold_bitreverse_v16i8:
3237; GFNIAVX512F:       # %bb.0:
3238; GFNIAVX512F-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]
3239; GFNIAVX512F-NEXT:    retq
3240;
3241; GFNIAVX512BW-LABEL: fold_bitreverse_v16i8:
3242; GFNIAVX512BW:       # %bb.0:
3243; GFNIAVX512BW-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]
3244; GFNIAVX512BW-NEXT:    retq
3245  %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>)
3246  ret <16 x i8> %b
3247}
3248
3249define <16 x i16> @fold_bitreverse_v16i16() nounwind {
3250; SSE-LABEL: fold_bitreverse_v16i16:
3251; SSE:       # %bb.0:
3252; SSE-NEXT:    movaps {{.*#+}} xmm0 = [0,65535,16384,49151,8192,57343,24576,40959]
3253; SSE-NEXT:    movaps {{.*#+}} xmm1 = [4096,61439,20480,45055,12288,53247,28672,36863]
3254; SSE-NEXT:    retq
3255;
3256; AVX-LABEL: fold_bitreverse_v16i16:
3257; AVX:       # %bb.0:
3258; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863]
3259; AVX-NEXT:    retq
3260;
3261; XOP-LABEL: fold_bitreverse_v16i16:
3262; XOP:       # %bb.0:
3263; XOP-NEXT:    vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863]
3264; XOP-NEXT:    retq
3265;
3266; GFNISSE-LABEL: fold_bitreverse_v16i16:
3267; GFNISSE:       # %bb.0:
3268; GFNISSE-NEXT:    movaps {{.*#+}} xmm0 = [0,65535,16384,49151,8192,57343,24576,40959]
3269; GFNISSE-NEXT:    movaps {{.*#+}} xmm1 = [4096,61439,20480,45055,12288,53247,28672,36863]
3270; GFNISSE-NEXT:    retq
3271;
3272; GFNIAVX-LABEL: fold_bitreverse_v16i16:
3273; GFNIAVX:       # %bb.0:
3274; GFNIAVX-NEXT:    vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863]
3275; GFNIAVX-NEXT:    retq
3276;
3277; GFNIAVX2-LABEL: fold_bitreverse_v16i16:
3278; GFNIAVX2:       # %bb.0:
3279; GFNIAVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863]
3280; GFNIAVX2-NEXT:    retq
3281;
3282; GFNIAVX512F-LABEL: fold_bitreverse_v16i16:
3283; GFNIAVX512F:       # %bb.0:
3284; GFNIAVX512F-NEXT:    vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863]
3285; GFNIAVX512F-NEXT:    retq
3286;
3287; GFNIAVX512BW-LABEL: fold_bitreverse_v16i16:
3288; GFNIAVX512BW:       # %bb.0:
3289; GFNIAVX512BW-NEXT:    vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863]
3290; GFNIAVX512BW-NEXT:    retq
3291  %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>)
3292  ret <16 x i16> %b
3293}
3294
3295define <16 x i32> @fold_bitreverse_v16i32() nounwind {
3296; SSE-LABEL: fold_bitreverse_v16i32:
3297; SSE:       # %bb.0:
3298; SSE-NEXT:    movaps {{.*#+}} xmm0 = [0,4294967295,1073741824,3221225471]
3299; SSE-NEXT:    movaps {{.*#+}} xmm1 = [536870912,3758096383,1610612736,2684354559]
3300; SSE-NEXT:    movaps {{.*#+}} xmm2 = [268435456,4026531839,1342177280,2952790015]
3301; SSE-NEXT:    movaps {{.*#+}} xmm3 = [805306368,3489660927,1879048192,2415919103]
3302; SSE-NEXT:    retq
3303;
3304; AVX1-LABEL: fold_bitreverse_v16i32:
3305; AVX1:       # %bb.0:
3306; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559]
3307; AVX1-NEXT:    vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]
3308; AVX1-NEXT:    retq
3309;
3310; AVX2-LABEL: fold_bitreverse_v16i32:
3311; AVX2:       # %bb.0:
3312; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559]
3313; AVX2-NEXT:    vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]
3314; AVX2-NEXT:    retq
3315;
3316; AVX512-LABEL: fold_bitreverse_v16i32:
3317; AVX512:       # %bb.0:
3318; AVX512-NEXT:    vmovaps {{.*#+}} zmm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559,268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]
3319; AVX512-NEXT:    retq
3320;
3321; XOP-LABEL: fold_bitreverse_v16i32:
3322; XOP:       # %bb.0:
3323; XOP-NEXT:    vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559]
3324; XOP-NEXT:    vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]
3325; XOP-NEXT:    retq
3326;
3327; GFNISSE-LABEL: fold_bitreverse_v16i32:
3328; GFNISSE:       # %bb.0:
3329; GFNISSE-NEXT:    movaps {{.*#+}} xmm0 = [0,4294967295,1073741824,3221225471]
3330; GFNISSE-NEXT:    movaps {{.*#+}} xmm1 = [536870912,3758096383,1610612736,2684354559]
3331; GFNISSE-NEXT:    movaps {{.*#+}} xmm2 = [268435456,4026531839,1342177280,2952790015]
3332; GFNISSE-NEXT:    movaps {{.*#+}} xmm3 = [805306368,3489660927,1879048192,2415919103]
3333; GFNISSE-NEXT:    retq
3334;
3335; GFNIAVX-LABEL: fold_bitreverse_v16i32:
3336; GFNIAVX:       # %bb.0:
3337; GFNIAVX-NEXT:    vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559]
3338; GFNIAVX-NEXT:    vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]
3339; GFNIAVX-NEXT:    retq
3340;
3341; GFNIAVX2-LABEL: fold_bitreverse_v16i32:
3342; GFNIAVX2:       # %bb.0:
3343; GFNIAVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559]
3344; GFNIAVX2-NEXT:    vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]
3345; GFNIAVX2-NEXT:    retq
3346;
3347; GFNIAVX512F-LABEL: fold_bitreverse_v16i32:
3348; GFNIAVX512F:       # %bb.0:
3349; GFNIAVX512F-NEXT:    vmovaps {{.*#+}} zmm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559,268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]
3350; GFNIAVX512F-NEXT:    retq
3351;
3352; GFNIAVX512BW-LABEL: fold_bitreverse_v16i32:
3353; GFNIAVX512BW:       # %bb.0:
3354; GFNIAVX512BW-NEXT:    vmovaps {{.*#+}} zmm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559,268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]
3355; GFNIAVX512BW-NEXT:    retq
3356  %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>)
3357  ret <16 x i32> %b
3358}
3359
3360declare i8 @llvm.bitreverse.i8(i8) readnone
3361declare i16 @llvm.bitreverse.i16(i16) readnone
3362declare i32 @llvm.bitreverse.i32(i32) readnone
3363declare i64 @llvm.bitreverse.i64(i64) readnone
3364
3365declare <16 x i8> @llvm.bitreverse.v16i8(<16 x i8>) readnone
3366declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>) readnone
3367declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>) readnone
3368declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>) readnone
3369
3370declare <32 x i8>  @llvm.bitreverse.v32i8(<32 x i8>) readnone
3371declare <16 x i16> @llvm.bitreverse.v16i16(<16 x i16>) readnone
3372declare <8 x i32>  @llvm.bitreverse.v8i32(<8 x i32>) readnone
3373declare <4 x i64>  @llvm.bitreverse.v4i64(<4 x i64>) readnone
3374
3375declare <64 x i8>  @llvm.bitreverse.v64i8(<64 x i8>) readnone
3376declare <32 x i16> @llvm.bitreverse.v32i16(<32 x i16>) readnone
3377declare <16 x i32>  @llvm.bitreverse.v16i32(<16 x i32>) readnone
3378declare <8 x i64>  @llvm.bitreverse.v8i64(<8 x i64>) readnone
3379