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