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