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; SSE2-LABEL: test_bitreverse_v16i8:
1013; SSE2:       # BB#0:
1014; SSE2-NEXT:    movdqa %xmm0, %xmm2
1015; SSE2-NEXT:    psrlw $7, %xmm2
1016; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1017; SSE2-NEXT:    pand %xmm1, %xmm1
1018; SSE2-NEXT:    pand %xmm2, %xmm1
1019; SSE2-NEXT:    movdqa %xmm0, %xmm2
1020; SSE2-NEXT:    psllw $7, %xmm2
1021; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
1022; SSE2-NEXT:    pand %xmm3, %xmm3
1023; SSE2-NEXT:    pand %xmm3, %xmm2
1024; SSE2-NEXT:    movdqa %xmm0, %xmm3
1025; SSE2-NEXT:    psllw $5, %xmm3
1026; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1027; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1028; SSE2-NEXT:    movdqa %xmm0, %xmm4
1029; SSE2-NEXT:    psllw $3, %xmm4
1030; SSE2-NEXT:    pand {{.*}}(%rip), %xmm4
1031; SSE2-NEXT:    pand {{.*}}(%rip), %xmm4
1032; SSE2-NEXT:    por %xmm3, %xmm4
1033; SSE2-NEXT:    movdqa %xmm0, %xmm3
1034; SSE2-NEXT:    paddb %xmm3, %xmm3
1035; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1036; SSE2-NEXT:    por %xmm4, %xmm3
1037; SSE2-NEXT:    movdqa %xmm0, %xmm4
1038; SSE2-NEXT:    psrlw $1, %xmm4
1039; SSE2-NEXT:    pand {{.*}}(%rip), %xmm4
1040; SSE2-NEXT:    pand {{.*}}(%rip), %xmm4
1041; SSE2-NEXT:    por %xmm3, %xmm4
1042; SSE2-NEXT:    movdqa %xmm0, %xmm3
1043; SSE2-NEXT:    psrlw $3, %xmm3
1044; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1045; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1046; SSE2-NEXT:    por %xmm4, %xmm3
1047; SSE2-NEXT:    psrlw $5, %xmm0
1048; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1049; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1050; SSE2-NEXT:    por %xmm3, %xmm0
1051; SSE2-NEXT:    por %xmm1, %xmm0
1052; SSE2-NEXT:    por %xmm2, %xmm0
1053; SSE2-NEXT:    retq
1054;
1055; SSSE3-LABEL: test_bitreverse_v16i8:
1056; SSSE3:       # BB#0:
1057; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1058; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1059; SSSE3-NEXT:    pand %xmm1, %xmm2
1060; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1061; SSSE3-NEXT:    pshufb %xmm2, %xmm3
1062; SSSE3-NEXT:    psrlw $4, %xmm0
1063; SSSE3-NEXT:    pand %xmm1, %xmm0
1064; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1065; SSSE3-NEXT:    pshufb %xmm0, %xmm1
1066; SSSE3-NEXT:    por %xmm3, %xmm1
1067; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1068; SSSE3-NEXT:    retq
1069;
1070; AVX-LABEL: test_bitreverse_v16i8:
1071; AVX:       # BB#0:
1072; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1073; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
1074; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1075; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
1076; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
1077; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
1078; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1079; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
1080; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
1081; AVX-NEXT:    retq
1082;
1083; XOP-LABEL: test_bitreverse_v16i8:
1084; XOP:       # BB#0:
1085; XOP-NEXT:    vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
1086; XOP-NEXT:    retq
1087  %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %a)
1088  ret <16 x i8> %b
1089}
1090
1091define <8 x i16> @test_bitreverse_v8i16(<8 x i16> %a) nounwind {
1092; SSE2-LABEL: test_bitreverse_v8i16:
1093; SSE2:       # BB#0:
1094; SSE2-NEXT:    pxor %xmm1, %xmm1
1095; SSE2-NEXT:    movdqa %xmm0, %xmm2
1096; 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]
1097; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[1,0,3,2,4,5,6,7]
1098; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,4,7,6]
1099; 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]
1100; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7]
1101; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,5,4,7,6]
1102; SSE2-NEXT:    packuswb %xmm2, %xmm1
1103; SSE2-NEXT:    movdqa %xmm1, %xmm0
1104; SSE2-NEXT:    psllw $7, %xmm0
1105; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
1106; SSE2-NEXT:    pand %xmm2, %xmm2
1107; SSE2-NEXT:    pand %xmm0, %xmm2
1108; SSE2-NEXT:    movdqa %xmm1, %xmm0
1109; SSE2-NEXT:    psllw $5, %xmm0
1110; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1111; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1112; SSE2-NEXT:    movdqa %xmm1, %xmm3
1113; SSE2-NEXT:    psllw $3, %xmm3
1114; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1115; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1116; SSE2-NEXT:    por %xmm0, %xmm3
1117; SSE2-NEXT:    movdqa %xmm1, %xmm0
1118; SSE2-NEXT:    paddb %xmm0, %xmm0
1119; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1120; SSE2-NEXT:    por %xmm3, %xmm0
1121; SSE2-NEXT:    movdqa %xmm1, %xmm3
1122; SSE2-NEXT:    psrlw $1, %xmm3
1123; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1124; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1125; SSE2-NEXT:    por %xmm0, %xmm3
1126; SSE2-NEXT:    movdqa %xmm1, %xmm0
1127; SSE2-NEXT:    psrlw $3, %xmm0
1128; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1129; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1130; SSE2-NEXT:    por %xmm3, %xmm0
1131; SSE2-NEXT:    movdqa %xmm1, %xmm3
1132; SSE2-NEXT:    psrlw $5, %xmm3
1133; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1134; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1135; SSE2-NEXT:    por %xmm0, %xmm3
1136; SSE2-NEXT:    psrlw $7, %xmm1
1137; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1138; SSE2-NEXT:    pand %xmm0, %xmm0
1139; SSE2-NEXT:    pand %xmm1, %xmm0
1140; SSE2-NEXT:    por %xmm3, %xmm0
1141; SSE2-NEXT:    por %xmm2, %xmm0
1142; SSE2-NEXT:    retq
1143;
1144; SSSE3-LABEL: test_bitreverse_v8i16:
1145; SSSE3:       # BB#0:
1146; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
1147; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1148; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1149; SSSE3-NEXT:    pand %xmm1, %xmm2
1150; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1151; SSSE3-NEXT:    pshufb %xmm2, %xmm3
1152; SSSE3-NEXT:    psrlw $4, %xmm0
1153; SSSE3-NEXT:    pand %xmm1, %xmm0
1154; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1155; SSSE3-NEXT:    pshufb %xmm0, %xmm1
1156; SSSE3-NEXT:    por %xmm3, %xmm1
1157; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1158; SSSE3-NEXT:    retq
1159;
1160; AVX-LABEL: test_bitreverse_v8i16:
1161; AVX:       # BB#0:
1162; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
1163; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1164; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
1165; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1166; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
1167; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
1168; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
1169; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1170; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
1171; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
1172; AVX-NEXT:    retq
1173;
1174; XOP-LABEL: test_bitreverse_v8i16:
1175; XOP:       # BB#0:
1176; XOP-NEXT:    vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
1177; XOP-NEXT:    retq
1178  %b = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a)
1179  ret <8 x i16> %b
1180}
1181
1182define <4 x i32> @test_bitreverse_v4i32(<4 x i32> %a) nounwind {
1183; SSE2-LABEL: test_bitreverse_v4i32:
1184; SSE2:       # BB#0:
1185; SSE2-NEXT:    pxor %xmm1, %xmm1
1186; SSE2-NEXT:    movdqa %xmm0, %xmm2
1187; 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]
1188; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
1189; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
1190; 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]
1191; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
1192; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,7,6,5,4]
1193; SSE2-NEXT:    packuswb %xmm2, %xmm1
1194; SSE2-NEXT:    movdqa %xmm1, %xmm0
1195; SSE2-NEXT:    psllw $7, %xmm0
1196; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
1197; SSE2-NEXT:    pand %xmm2, %xmm2
1198; SSE2-NEXT:    pand %xmm0, %xmm2
1199; SSE2-NEXT:    movdqa %xmm1, %xmm0
1200; SSE2-NEXT:    psllw $5, %xmm0
1201; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1202; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1203; SSE2-NEXT:    movdqa %xmm1, %xmm3
1204; SSE2-NEXT:    psllw $3, %xmm3
1205; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1206; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1207; SSE2-NEXT:    por %xmm0, %xmm3
1208; SSE2-NEXT:    movdqa %xmm1, %xmm0
1209; SSE2-NEXT:    paddb %xmm0, %xmm0
1210; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1211; SSE2-NEXT:    por %xmm3, %xmm0
1212; SSE2-NEXT:    movdqa %xmm1, %xmm3
1213; SSE2-NEXT:    psrlw $1, %xmm3
1214; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1215; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1216; SSE2-NEXT:    por %xmm0, %xmm3
1217; SSE2-NEXT:    movdqa %xmm1, %xmm0
1218; SSE2-NEXT:    psrlw $3, %xmm0
1219; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1220; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1221; SSE2-NEXT:    por %xmm3, %xmm0
1222; SSE2-NEXT:    movdqa %xmm1, %xmm3
1223; SSE2-NEXT:    psrlw $5, %xmm3
1224; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1225; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1226; SSE2-NEXT:    por %xmm0, %xmm3
1227; SSE2-NEXT:    psrlw $7, %xmm1
1228; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1229; SSE2-NEXT:    pand %xmm0, %xmm0
1230; SSE2-NEXT:    pand %xmm1, %xmm0
1231; SSE2-NEXT:    por %xmm3, %xmm0
1232; SSE2-NEXT:    por %xmm2, %xmm0
1233; SSE2-NEXT:    retq
1234;
1235; SSSE3-LABEL: test_bitreverse_v4i32:
1236; SSSE3:       # BB#0:
1237; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
1238; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1239; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1240; SSSE3-NEXT:    pand %xmm1, %xmm2
1241; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1242; SSSE3-NEXT:    pshufb %xmm2, %xmm3
1243; SSSE3-NEXT:    psrlw $4, %xmm0
1244; SSSE3-NEXT:    pand %xmm1, %xmm0
1245; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1246; SSSE3-NEXT:    pshufb %xmm0, %xmm1
1247; SSSE3-NEXT:    por %xmm3, %xmm1
1248; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1249; SSSE3-NEXT:    retq
1250;
1251; AVX-LABEL: test_bitreverse_v4i32:
1252; AVX:       # BB#0:
1253; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
1254; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1255; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
1256; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1257; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
1258; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
1259; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
1260; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1261; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
1262; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
1263; AVX-NEXT:    retq
1264;
1265; XOP-LABEL: test_bitreverse_v4i32:
1266; XOP:       # BB#0:
1267; XOP-NEXT:    vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
1268; XOP-NEXT:    retq
1269  %b = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a)
1270  ret <4 x i32> %b
1271}
1272
1273define <2 x i64> @test_bitreverse_v2i64(<2 x i64> %a) nounwind {
1274; SSE2-LABEL: test_bitreverse_v2i64:
1275; SSE2:       # BB#0:
1276; SSE2-NEXT:    pxor %xmm1, %xmm1
1277; SSE2-NEXT:    movdqa %xmm0, %xmm2
1278; 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]
1279; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
1280; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
1281; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
1282; 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]
1283; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1284; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
1285; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,7,6,5,4]
1286; SSE2-NEXT:    packuswb %xmm2, %xmm1
1287; SSE2-NEXT:    movdqa %xmm1, %xmm0
1288; SSE2-NEXT:    psllw $7, %xmm0
1289; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
1290; SSE2-NEXT:    pand %xmm2, %xmm2
1291; SSE2-NEXT:    pand %xmm0, %xmm2
1292; SSE2-NEXT:    movdqa %xmm1, %xmm0
1293; SSE2-NEXT:    psllw $5, %xmm0
1294; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1295; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1296; SSE2-NEXT:    movdqa %xmm1, %xmm3
1297; SSE2-NEXT:    psllw $3, %xmm3
1298; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1299; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1300; SSE2-NEXT:    por %xmm0, %xmm3
1301; SSE2-NEXT:    movdqa %xmm1, %xmm0
1302; SSE2-NEXT:    paddb %xmm0, %xmm0
1303; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1304; SSE2-NEXT:    por %xmm3, %xmm0
1305; SSE2-NEXT:    movdqa %xmm1, %xmm3
1306; SSE2-NEXT:    psrlw $1, %xmm3
1307; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1308; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1309; SSE2-NEXT:    por %xmm0, %xmm3
1310; SSE2-NEXT:    movdqa %xmm1, %xmm0
1311; SSE2-NEXT:    psrlw $3, %xmm0
1312; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1313; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1314; SSE2-NEXT:    por %xmm3, %xmm0
1315; SSE2-NEXT:    movdqa %xmm1, %xmm3
1316; SSE2-NEXT:    psrlw $5, %xmm3
1317; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1318; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1319; SSE2-NEXT:    por %xmm0, %xmm3
1320; SSE2-NEXT:    psrlw $7, %xmm1
1321; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1322; SSE2-NEXT:    pand %xmm0, %xmm0
1323; SSE2-NEXT:    pand %xmm1, %xmm0
1324; SSE2-NEXT:    por %xmm3, %xmm0
1325; SSE2-NEXT:    por %xmm2, %xmm0
1326; SSE2-NEXT:    retq
1327;
1328; SSSE3-LABEL: test_bitreverse_v2i64:
1329; SSSE3:       # BB#0:
1330; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1331; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1332; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1333; SSSE3-NEXT:    pand %xmm1, %xmm2
1334; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1335; SSSE3-NEXT:    pshufb %xmm2, %xmm3
1336; SSSE3-NEXT:    psrlw $4, %xmm0
1337; SSSE3-NEXT:    pand %xmm1, %xmm0
1338; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1339; SSSE3-NEXT:    pshufb %xmm0, %xmm1
1340; SSSE3-NEXT:    por %xmm3, %xmm1
1341; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1342; SSSE3-NEXT:    retq
1343;
1344; AVX-LABEL: test_bitreverse_v2i64:
1345; AVX:       # BB#0:
1346; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1347; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1348; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
1349; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1350; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
1351; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
1352; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
1353; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1354; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
1355; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
1356; AVX-NEXT:    retq
1357;
1358; XOP-LABEL: test_bitreverse_v2i64:
1359; XOP:       # BB#0:
1360; XOP-NEXT:    vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
1361; XOP-NEXT:    retq
1362  %b = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a)
1363  ret <2 x i64> %b
1364}
1365
1366define <32 x i8> @test_bitreverse_v32i8(<32 x i8> %a) nounwind {
1367; SSE2-LABEL: test_bitreverse_v32i8:
1368; SSE2:       # BB#0:
1369; SSE2-NEXT:    movdqa %xmm0, %xmm2
1370; SSE2-NEXT:    psllw $5, %xmm2
1371; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]
1372; SSE2-NEXT:    pand {{.*}}(%rip), %xmm9
1373; SSE2-NEXT:    pand %xmm9, %xmm2
1374; SSE2-NEXT:    movdqa %xmm0, %xmm5
1375; SSE2-NEXT:    psllw $7, %xmm5
1376; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
1377; SSE2-NEXT:    pand %xmm10, %xmm10
1378; SSE2-NEXT:    pand %xmm10, %xmm5
1379; SSE2-NEXT:    movdqa %xmm0, %xmm3
1380; SSE2-NEXT:    psllw $3, %xmm3
1381; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
1382; SSE2-NEXT:    pand {{.*}}(%rip), %xmm11
1383; SSE2-NEXT:    pand %xmm11, %xmm3
1384; SSE2-NEXT:    por %xmm2, %xmm3
1385; SSE2-NEXT:    movdqa %xmm0, %xmm2
1386; SSE2-NEXT:    paddb %xmm2, %xmm2
1387; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1388; SSE2-NEXT:    pand %xmm8, %xmm2
1389; SSE2-NEXT:    por %xmm3, %xmm2
1390; SSE2-NEXT:    movdqa %xmm0, %xmm3
1391; SSE2-NEXT:    psrlw $1, %xmm3
1392; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1393; SSE2-NEXT:    pand {{.*}}(%rip), %xmm12
1394; SSE2-NEXT:    pand %xmm12, %xmm3
1395; SSE2-NEXT:    por %xmm2, %xmm3
1396; SSE2-NEXT:    movdqa %xmm0, %xmm4
1397; SSE2-NEXT:    psrlw $3, %xmm4
1398; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
1399; SSE2-NEXT:    pand {{.*}}(%rip), %xmm6
1400; SSE2-NEXT:    pand %xmm6, %xmm4
1401; SSE2-NEXT:    por %xmm3, %xmm4
1402; SSE2-NEXT:    movdqa %xmm0, %xmm7
1403; SSE2-NEXT:    psrlw $5, %xmm7
1404; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1405; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
1406; SSE2-NEXT:    pand %xmm2, %xmm7
1407; SSE2-NEXT:    por %xmm4, %xmm7
1408; SSE2-NEXT:    psrlw $7, %xmm0
1409; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1410; SSE2-NEXT:    pand %xmm3, %xmm3
1411; SSE2-NEXT:    pand %xmm3, %xmm0
1412; SSE2-NEXT:    por %xmm7, %xmm0
1413; SSE2-NEXT:    por %xmm5, %xmm0
1414; SSE2-NEXT:    movdqa %xmm1, %xmm4
1415; SSE2-NEXT:    psllw $5, %xmm4
1416; SSE2-NEXT:    pand %xmm9, %xmm4
1417; SSE2-NEXT:    movdqa %xmm1, %xmm5
1418; SSE2-NEXT:    psllw $7, %xmm5
1419; SSE2-NEXT:    pand %xmm10, %xmm5
1420; SSE2-NEXT:    movdqa %xmm1, %xmm7
1421; SSE2-NEXT:    psllw $3, %xmm7
1422; SSE2-NEXT:    pand %xmm11, %xmm7
1423; SSE2-NEXT:    por %xmm4, %xmm7
1424; SSE2-NEXT:    movdqa %xmm1, %xmm4
1425; SSE2-NEXT:    paddb %xmm4, %xmm4
1426; SSE2-NEXT:    pand %xmm8, %xmm4
1427; SSE2-NEXT:    por %xmm7, %xmm4
1428; SSE2-NEXT:    movdqa %xmm1, %xmm7
1429; SSE2-NEXT:    psrlw $1, %xmm7
1430; SSE2-NEXT:    pand %xmm12, %xmm7
1431; SSE2-NEXT:    por %xmm4, %xmm7
1432; SSE2-NEXT:    movdqa %xmm1, %xmm4
1433; SSE2-NEXT:    psrlw $3, %xmm4
1434; SSE2-NEXT:    pand %xmm6, %xmm4
1435; SSE2-NEXT:    por %xmm7, %xmm4
1436; SSE2-NEXT:    movdqa %xmm1, %xmm6
1437; SSE2-NEXT:    psrlw $5, %xmm6
1438; SSE2-NEXT:    pand %xmm2, %xmm6
1439; SSE2-NEXT:    por %xmm4, %xmm6
1440; SSE2-NEXT:    psrlw $7, %xmm1
1441; SSE2-NEXT:    pand %xmm3, %xmm1
1442; SSE2-NEXT:    por %xmm6, %xmm1
1443; SSE2-NEXT:    por %xmm5, %xmm1
1444; SSE2-NEXT:    retq
1445;
1446; SSSE3-LABEL: test_bitreverse_v32i8:
1447; SSSE3:       # BB#0:
1448; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1449; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1450; SSSE3-NEXT:    pand %xmm4, %xmm2
1451; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1452; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1453; SSSE3-NEXT:    pshufb %xmm2, %xmm6
1454; SSSE3-NEXT:    psrlw $4, %xmm0
1455; SSSE3-NEXT:    pand %xmm4, %xmm0
1456; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1457; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1458; SSSE3-NEXT:    pshufb %xmm0, %xmm3
1459; SSSE3-NEXT:    por %xmm6, %xmm3
1460; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1461; SSSE3-NEXT:    pand %xmm4, %xmm0
1462; SSSE3-NEXT:    pshufb %xmm0, %xmm5
1463; SSSE3-NEXT:    psrlw $4, %xmm1
1464; SSSE3-NEXT:    pand %xmm4, %xmm1
1465; SSSE3-NEXT:    pshufb %xmm1, %xmm2
1466; SSSE3-NEXT:    por %xmm5, %xmm2
1467; SSSE3-NEXT:    movdqa %xmm3, %xmm0
1468; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1469; SSSE3-NEXT:    retq
1470;
1471; AVX1-LABEL: test_bitreverse_v32i8:
1472; AVX1:       # BB#0:
1473; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1474; AVX1-NEXT:    vmovaps {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1475; AVX1-NEXT:    vandps %xmm2, %xmm1, %xmm3
1476; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1477; AVX1-NEXT:    vpshufb %xmm3, %xmm4, %xmm3
1478; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
1479; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
1480; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1481; AVX1-NEXT:    vpshufb %xmm1, %xmm5, %xmm1
1482; AVX1-NEXT:    vpor %xmm1, %xmm3, %xmm1
1483; AVX1-NEXT:    vandps %xmm2, %xmm0, %xmm3
1484; AVX1-NEXT:    vpshufb %xmm3, %xmm4, %xmm3
1485; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
1486; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
1487; AVX1-NEXT:    vpshufb %xmm0, %xmm5, %xmm0
1488; AVX1-NEXT:    vpor %xmm0, %xmm3, %xmm0
1489; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1490; AVX1-NEXT:    retq
1491;
1492; AVX2-LABEL: test_bitreverse_v32i8:
1493; AVX2:       # BB#0:
1494; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1495; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
1496; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1497; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1498; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1499; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1500; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1501; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1502; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
1503; AVX2-NEXT:    retq
1504;
1505; XOPAVX1-LABEL: test_bitreverse_v32i8:
1506; XOPAVX1:       # BB#0:
1507; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1508; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]
1509; XOPAVX1-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1510; XOPAVX1-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1511; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1512; XOPAVX1-NEXT:    retq
1513;
1514; XOPAVX2-LABEL: test_bitreverse_v32i8:
1515; XOPAVX2:       # BB#0:
1516; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1517; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]
1518; XOPAVX2-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1519; XOPAVX2-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1520; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1521; XOPAVX2-NEXT:    retq
1522  %b = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %a)
1523  ret <32 x i8> %b
1524}
1525
1526define <16 x i16> @test_bitreverse_v16i16(<16 x i16> %a) nounwind {
1527; SSE2-LABEL: test_bitreverse_v16i16:
1528; SSE2:       # BB#0:
1529; SSE2-NEXT:    pxor %xmm9, %xmm9
1530; SSE2-NEXT:    movdqa %xmm0, %xmm2
1531; 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]
1532; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[1,0,3,2,4,5,6,7]
1533; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,4,7,6]
1534; 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]
1535; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7]
1536; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6]
1537; SSE2-NEXT:    packuswb %xmm2, %xmm0
1538; SSE2-NEXT:    movdqa %xmm0, %xmm2
1539; SSE2-NEXT:    psllw $5, %xmm2
1540; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]
1541; SSE2-NEXT:    pand {{.*}}(%rip), %xmm10
1542; SSE2-NEXT:    pand %xmm10, %xmm2
1543; SSE2-NEXT:    movdqa %xmm0, %xmm3
1544; SSE2-NEXT:    psllw $7, %xmm3
1545; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
1546; SSE2-NEXT:    pand %xmm11, %xmm11
1547; SSE2-NEXT:    pand %xmm11, %xmm3
1548; SSE2-NEXT:    movdqa %xmm0, %xmm4
1549; SSE2-NEXT:    psllw $3, %xmm4
1550; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
1551; SSE2-NEXT:    pand {{.*}}(%rip), %xmm12
1552; SSE2-NEXT:    pand %xmm12, %xmm4
1553; SSE2-NEXT:    por %xmm2, %xmm4
1554; SSE2-NEXT:    movdqa %xmm0, %xmm2
1555; SSE2-NEXT:    paddb %xmm2, %xmm2
1556; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1557; SSE2-NEXT:    pand %xmm8, %xmm2
1558; SSE2-NEXT:    por %xmm4, %xmm2
1559; SSE2-NEXT:    movdqa %xmm0, %xmm4
1560; SSE2-NEXT:    psrlw $1, %xmm4
1561; SSE2-NEXT:    movdqa {{.*#+}} xmm13 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1562; SSE2-NEXT:    pand {{.*}}(%rip), %xmm13
1563; SSE2-NEXT:    pand %xmm13, %xmm4
1564; SSE2-NEXT:    por %xmm2, %xmm4
1565; SSE2-NEXT:    movdqa %xmm0, %xmm5
1566; SSE2-NEXT:    psrlw $3, %xmm5
1567; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
1568; SSE2-NEXT:    pand {{.*}}(%rip), %xmm6
1569; SSE2-NEXT:    pand %xmm6, %xmm5
1570; SSE2-NEXT:    por %xmm4, %xmm5
1571; SSE2-NEXT:    movdqa %xmm0, %xmm7
1572; SSE2-NEXT:    psrlw $5, %xmm7
1573; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1574; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
1575; SSE2-NEXT:    pand %xmm2, %xmm7
1576; SSE2-NEXT:    por %xmm5, %xmm7
1577; SSE2-NEXT:    psrlw $7, %xmm0
1578; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1579; SSE2-NEXT:    pand %xmm4, %xmm4
1580; SSE2-NEXT:    pand %xmm4, %xmm0
1581; SSE2-NEXT:    por %xmm7, %xmm0
1582; SSE2-NEXT:    por %xmm3, %xmm0
1583; SSE2-NEXT:    movdqa %xmm1, %xmm3
1584; 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]
1585; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[1,0,3,2,4,5,6,7]
1586; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,4,7,6]
1587; 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]
1588; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,0,3,2,4,5,6,7]
1589; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,4,7,6]
1590; SSE2-NEXT:    packuswb %xmm3, %xmm1
1591; SSE2-NEXT:    movdqa %xmm1, %xmm5
1592; SSE2-NEXT:    psllw $5, %xmm5
1593; SSE2-NEXT:    pand %xmm10, %xmm5
1594; SSE2-NEXT:    movdqa %xmm1, %xmm3
1595; SSE2-NEXT:    psllw $7, %xmm3
1596; SSE2-NEXT:    pand %xmm11, %xmm3
1597; SSE2-NEXT:    movdqa %xmm1, %xmm7
1598; SSE2-NEXT:    psllw $3, %xmm7
1599; SSE2-NEXT:    pand %xmm12, %xmm7
1600; SSE2-NEXT:    por %xmm5, %xmm7
1601; SSE2-NEXT:    movdqa %xmm1, %xmm5
1602; SSE2-NEXT:    paddb %xmm5, %xmm5
1603; SSE2-NEXT:    pand %xmm8, %xmm5
1604; SSE2-NEXT:    por %xmm7, %xmm5
1605; SSE2-NEXT:    movdqa %xmm1, %xmm7
1606; SSE2-NEXT:    psrlw $1, %xmm7
1607; SSE2-NEXT:    pand %xmm13, %xmm7
1608; SSE2-NEXT:    por %xmm5, %xmm7
1609; SSE2-NEXT:    movdqa %xmm1, %xmm5
1610; SSE2-NEXT:    psrlw $3, %xmm5
1611; SSE2-NEXT:    pand %xmm6, %xmm5
1612; SSE2-NEXT:    por %xmm7, %xmm5
1613; SSE2-NEXT:    movdqa %xmm1, %xmm6
1614; SSE2-NEXT:    psrlw $5, %xmm6
1615; SSE2-NEXT:    pand %xmm2, %xmm6
1616; SSE2-NEXT:    por %xmm5, %xmm6
1617; SSE2-NEXT:    psrlw $7, %xmm1
1618; SSE2-NEXT:    pand %xmm4, %xmm1
1619; SSE2-NEXT:    por %xmm6, %xmm1
1620; SSE2-NEXT:    por %xmm3, %xmm1
1621; SSE2-NEXT:    retq
1622;
1623; SSSE3-LABEL: test_bitreverse_v16i16:
1624; SSSE3:       # BB#0:
1625; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
1626; SSSE3-NEXT:    pshufb %xmm4, %xmm0
1627; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1628; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1629; SSSE3-NEXT:    pand %xmm5, %xmm2
1630; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1631; SSSE3-NEXT:    movdqa %xmm6, %xmm7
1632; SSSE3-NEXT:    pshufb %xmm2, %xmm7
1633; SSSE3-NEXT:    psrlw $4, %xmm0
1634; SSSE3-NEXT:    pand %xmm5, %xmm0
1635; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1636; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1637; SSSE3-NEXT:    pshufb %xmm0, %xmm3
1638; SSSE3-NEXT:    por %xmm7, %xmm3
1639; SSSE3-NEXT:    pshufb %xmm4, %xmm1
1640; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1641; SSSE3-NEXT:    pand %xmm5, %xmm0
1642; SSSE3-NEXT:    pshufb %xmm0, %xmm6
1643; SSSE3-NEXT:    psrlw $4, %xmm1
1644; SSSE3-NEXT:    pand %xmm5, %xmm1
1645; SSSE3-NEXT:    pshufb %xmm1, %xmm2
1646; SSSE3-NEXT:    por %xmm6, %xmm2
1647; SSSE3-NEXT:    movdqa %xmm3, %xmm0
1648; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1649; SSSE3-NEXT:    retq
1650;
1651; AVX1-LABEL: test_bitreverse_v16i16:
1652; AVX1:       # BB#0:
1653; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1654; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
1655; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1656; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1657; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4
1658; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1659; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
1660; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
1661; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
1662; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1663; AVX1-NEXT:    vpshufb %xmm1, %xmm6, %xmm1
1664; AVX1-NEXT:    vpor %xmm1, %xmm4, %xmm1
1665; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1666; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm2
1667; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2
1668; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
1669; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1670; AVX1-NEXT:    vpshufb %xmm0, %xmm6, %xmm0
1671; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
1672; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1673; AVX1-NEXT:    retq
1674;
1675; AVX2-LABEL: test_bitreverse_v16i16:
1676; AVX2:       # BB#0:
1677; 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]
1678; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1679; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
1680; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1681; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1682; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1683; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1684; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1685; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1686; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
1687; AVX2-NEXT:    retq
1688;
1689; XOPAVX1-LABEL: test_bitreverse_v16i16:
1690; XOPAVX1:       # BB#0:
1691; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1692; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]
1693; XOPAVX1-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1694; XOPAVX1-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1695; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1696; XOPAVX1-NEXT:    retq
1697;
1698; XOPAVX2-LABEL: test_bitreverse_v16i16:
1699; XOPAVX2:       # BB#0:
1700; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1701; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]
1702; XOPAVX2-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1703; XOPAVX2-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1704; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1705; XOPAVX2-NEXT:    retq
1706  %b = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a)
1707  ret <16 x i16> %b
1708}
1709
1710define <8 x i32> @test_bitreverse_v8i32(<8 x i32> %a) nounwind {
1711; SSE2-LABEL: test_bitreverse_v8i32:
1712; SSE2:       # BB#0:
1713; SSE2-NEXT:    pxor %xmm9, %xmm9
1714; SSE2-NEXT:    movdqa %xmm0, %xmm2
1715; 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]
1716; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
1717; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
1718; 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]
1719; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
1720; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
1721; SSE2-NEXT:    packuswb %xmm2, %xmm0
1722; SSE2-NEXT:    movdqa %xmm0, %xmm2
1723; SSE2-NEXT:    psllw $5, %xmm2
1724; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]
1725; SSE2-NEXT:    pand {{.*}}(%rip), %xmm10
1726; SSE2-NEXT:    pand %xmm10, %xmm2
1727; SSE2-NEXT:    movdqa %xmm0, %xmm3
1728; SSE2-NEXT:    psllw $7, %xmm3
1729; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
1730; SSE2-NEXT:    pand %xmm11, %xmm11
1731; SSE2-NEXT:    pand %xmm11, %xmm3
1732; SSE2-NEXT:    movdqa %xmm0, %xmm4
1733; SSE2-NEXT:    psllw $3, %xmm4
1734; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
1735; SSE2-NEXT:    pand {{.*}}(%rip), %xmm12
1736; SSE2-NEXT:    pand %xmm12, %xmm4
1737; SSE2-NEXT:    por %xmm2, %xmm4
1738; SSE2-NEXT:    movdqa %xmm0, %xmm2
1739; SSE2-NEXT:    paddb %xmm2, %xmm2
1740; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1741; SSE2-NEXT:    pand %xmm8, %xmm2
1742; SSE2-NEXT:    por %xmm4, %xmm2
1743; SSE2-NEXT:    movdqa %xmm0, %xmm4
1744; SSE2-NEXT:    psrlw $1, %xmm4
1745; SSE2-NEXT:    movdqa {{.*#+}} xmm13 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1746; SSE2-NEXT:    pand {{.*}}(%rip), %xmm13
1747; SSE2-NEXT:    pand %xmm13, %xmm4
1748; SSE2-NEXT:    por %xmm2, %xmm4
1749; SSE2-NEXT:    movdqa %xmm0, %xmm5
1750; SSE2-NEXT:    psrlw $3, %xmm5
1751; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
1752; SSE2-NEXT:    pand {{.*}}(%rip), %xmm6
1753; SSE2-NEXT:    pand %xmm6, %xmm5
1754; SSE2-NEXT:    por %xmm4, %xmm5
1755; SSE2-NEXT:    movdqa %xmm0, %xmm7
1756; SSE2-NEXT:    psrlw $5, %xmm7
1757; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1758; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
1759; SSE2-NEXT:    pand %xmm2, %xmm7
1760; SSE2-NEXT:    por %xmm5, %xmm7
1761; SSE2-NEXT:    psrlw $7, %xmm0
1762; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1763; SSE2-NEXT:    pand %xmm4, %xmm4
1764; SSE2-NEXT:    pand %xmm4, %xmm0
1765; SSE2-NEXT:    por %xmm7, %xmm0
1766; SSE2-NEXT:    por %xmm3, %xmm0
1767; SSE2-NEXT:    movdqa %xmm1, %xmm3
1768; 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]
1769; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7]
1770; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]
1771; 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]
1772; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]
1773; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]
1774; SSE2-NEXT:    packuswb %xmm3, %xmm1
1775; SSE2-NEXT:    movdqa %xmm1, %xmm5
1776; SSE2-NEXT:    psllw $5, %xmm5
1777; SSE2-NEXT:    pand %xmm10, %xmm5
1778; SSE2-NEXT:    movdqa %xmm1, %xmm3
1779; SSE2-NEXT:    psllw $7, %xmm3
1780; SSE2-NEXT:    pand %xmm11, %xmm3
1781; SSE2-NEXT:    movdqa %xmm1, %xmm7
1782; SSE2-NEXT:    psllw $3, %xmm7
1783; SSE2-NEXT:    pand %xmm12, %xmm7
1784; SSE2-NEXT:    por %xmm5, %xmm7
1785; SSE2-NEXT:    movdqa %xmm1, %xmm5
1786; SSE2-NEXT:    paddb %xmm5, %xmm5
1787; SSE2-NEXT:    pand %xmm8, %xmm5
1788; SSE2-NEXT:    por %xmm7, %xmm5
1789; SSE2-NEXT:    movdqa %xmm1, %xmm7
1790; SSE2-NEXT:    psrlw $1, %xmm7
1791; SSE2-NEXT:    pand %xmm13, %xmm7
1792; SSE2-NEXT:    por %xmm5, %xmm7
1793; SSE2-NEXT:    movdqa %xmm1, %xmm5
1794; SSE2-NEXT:    psrlw $3, %xmm5
1795; SSE2-NEXT:    pand %xmm6, %xmm5
1796; SSE2-NEXT:    por %xmm7, %xmm5
1797; SSE2-NEXT:    movdqa %xmm1, %xmm6
1798; SSE2-NEXT:    psrlw $5, %xmm6
1799; SSE2-NEXT:    pand %xmm2, %xmm6
1800; SSE2-NEXT:    por %xmm5, %xmm6
1801; SSE2-NEXT:    psrlw $7, %xmm1
1802; SSE2-NEXT:    pand %xmm4, %xmm1
1803; SSE2-NEXT:    por %xmm6, %xmm1
1804; SSE2-NEXT:    por %xmm3, %xmm1
1805; SSE2-NEXT:    retq
1806;
1807; SSSE3-LABEL: test_bitreverse_v8i32:
1808; SSSE3:       # BB#0:
1809; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
1810; SSSE3-NEXT:    pshufb %xmm4, %xmm0
1811; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1812; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1813; SSSE3-NEXT:    pand %xmm5, %xmm2
1814; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1815; SSSE3-NEXT:    movdqa %xmm6, %xmm7
1816; SSSE3-NEXT:    pshufb %xmm2, %xmm7
1817; SSSE3-NEXT:    psrlw $4, %xmm0
1818; SSSE3-NEXT:    pand %xmm5, %xmm0
1819; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1820; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1821; SSSE3-NEXT:    pshufb %xmm0, %xmm3
1822; SSSE3-NEXT:    por %xmm7, %xmm3
1823; SSSE3-NEXT:    pshufb %xmm4, %xmm1
1824; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1825; SSSE3-NEXT:    pand %xmm5, %xmm0
1826; SSSE3-NEXT:    pshufb %xmm0, %xmm6
1827; SSSE3-NEXT:    psrlw $4, %xmm1
1828; SSSE3-NEXT:    pand %xmm5, %xmm1
1829; SSSE3-NEXT:    pshufb %xmm1, %xmm2
1830; SSSE3-NEXT:    por %xmm6, %xmm2
1831; SSSE3-NEXT:    movdqa %xmm3, %xmm0
1832; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1833; SSSE3-NEXT:    retq
1834;
1835; AVX1-LABEL: test_bitreverse_v8i32:
1836; AVX1:       # BB#0:
1837; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1838; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
1839; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1840; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1841; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4
1842; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1843; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
1844; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
1845; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
1846; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1847; AVX1-NEXT:    vpshufb %xmm1, %xmm6, %xmm1
1848; AVX1-NEXT:    vpor %xmm1, %xmm4, %xmm1
1849; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1850; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm2
1851; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2
1852; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
1853; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1854; AVX1-NEXT:    vpshufb %xmm0, %xmm6, %xmm0
1855; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
1856; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1857; AVX1-NEXT:    retq
1858;
1859; AVX2-LABEL: test_bitreverse_v8i32:
1860; AVX2:       # BB#0:
1861; 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]
1862; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1863; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
1864; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
1865; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
1866; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1867; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1868; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
1869; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1870; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
1871; AVX2-NEXT:    retq
1872;
1873; XOPAVX1-LABEL: test_bitreverse_v8i32:
1874; XOPAVX1:       # BB#0:
1875; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1876; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]
1877; XOPAVX1-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1878; XOPAVX1-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1879; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1880; XOPAVX1-NEXT:    retq
1881;
1882; XOPAVX2-LABEL: test_bitreverse_v8i32:
1883; XOPAVX2:       # BB#0:
1884; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1885; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]
1886; XOPAVX2-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
1887; XOPAVX2-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
1888; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1889; XOPAVX2-NEXT:    retq
1890  %b = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %a)
1891  ret <8 x i32> %b
1892}
1893
1894define <4 x i64> @test_bitreverse_v4i64(<4 x i64> %a) nounwind {
1895; SSE2-LABEL: test_bitreverse_v4i64:
1896; SSE2:       # BB#0:
1897; SSE2-NEXT:    pxor %xmm9, %xmm9
1898; SSE2-NEXT:    movdqa %xmm0, %xmm2
1899; 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]
1900; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
1901; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]
1902; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]
1903; 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]
1904; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1905; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
1906; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
1907; SSE2-NEXT:    packuswb %xmm2, %xmm0
1908; SSE2-NEXT:    movdqa %xmm0, %xmm2
1909; SSE2-NEXT:    psllw $5, %xmm2
1910; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]
1911; SSE2-NEXT:    pand {{.*}}(%rip), %xmm10
1912; SSE2-NEXT:    pand %xmm10, %xmm2
1913; SSE2-NEXT:    movdqa %xmm0, %xmm4
1914; SSE2-NEXT:    psllw $7, %xmm4
1915; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
1916; SSE2-NEXT:    pand %xmm11, %xmm11
1917; SSE2-NEXT:    pand %xmm11, %xmm4
1918; SSE2-NEXT:    movdqa %xmm0, %xmm3
1919; SSE2-NEXT:    psllw $3, %xmm3
1920; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
1921; SSE2-NEXT:    pand {{.*}}(%rip), %xmm12
1922; SSE2-NEXT:    pand %xmm12, %xmm3
1923; SSE2-NEXT:    por %xmm2, %xmm3
1924; SSE2-NEXT:    movdqa %xmm0, %xmm2
1925; SSE2-NEXT:    paddb %xmm2, %xmm2
1926; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1927; SSE2-NEXT:    pand %xmm8, %xmm2
1928; SSE2-NEXT:    por %xmm3, %xmm2
1929; SSE2-NEXT:    movdqa %xmm0, %xmm3
1930; SSE2-NEXT:    psrlw $1, %xmm3
1931; SSE2-NEXT:    movdqa {{.*#+}} xmm13 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1932; SSE2-NEXT:    pand {{.*}}(%rip), %xmm13
1933; SSE2-NEXT:    pand %xmm13, %xmm3
1934; SSE2-NEXT:    por %xmm2, %xmm3
1935; SSE2-NEXT:    movdqa %xmm0, %xmm5
1936; SSE2-NEXT:    psrlw $3, %xmm5
1937; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
1938; SSE2-NEXT:    pand {{.*}}(%rip), %xmm6
1939; SSE2-NEXT:    pand %xmm6, %xmm5
1940; SSE2-NEXT:    por %xmm3, %xmm5
1941; SSE2-NEXT:    movdqa %xmm0, %xmm7
1942; SSE2-NEXT:    psrlw $5, %xmm7
1943; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1944; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
1945; SSE2-NEXT:    pand %xmm2, %xmm7
1946; SSE2-NEXT:    por %xmm5, %xmm7
1947; SSE2-NEXT:    psrlw $7, %xmm0
1948; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1949; SSE2-NEXT:    pand %xmm3, %xmm3
1950; SSE2-NEXT:    pand %xmm3, %xmm0
1951; SSE2-NEXT:    por %xmm7, %xmm0
1952; SSE2-NEXT:    por %xmm4, %xmm0
1953; SSE2-NEXT:    movdqa %xmm1, %xmm4
1954; 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]
1955; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[2,3,0,1]
1956; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7]
1957; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4]
1958; 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]
1959; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1960; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]
1961; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]
1962; SSE2-NEXT:    packuswb %xmm4, %xmm1
1963; SSE2-NEXT:    movdqa %xmm1, %xmm5
1964; SSE2-NEXT:    psllw $5, %xmm5
1965; SSE2-NEXT:    pand %xmm10, %xmm5
1966; SSE2-NEXT:    movdqa %xmm1, %xmm4
1967; SSE2-NEXT:    psllw $7, %xmm4
1968; SSE2-NEXT:    pand %xmm11, %xmm4
1969; SSE2-NEXT:    movdqa %xmm1, %xmm7
1970; SSE2-NEXT:    psllw $3, %xmm7
1971; SSE2-NEXT:    pand %xmm12, %xmm7
1972; SSE2-NEXT:    por %xmm5, %xmm7
1973; SSE2-NEXT:    movdqa %xmm1, %xmm5
1974; SSE2-NEXT:    paddb %xmm5, %xmm5
1975; SSE2-NEXT:    pand %xmm8, %xmm5
1976; SSE2-NEXT:    por %xmm7, %xmm5
1977; SSE2-NEXT:    movdqa %xmm1, %xmm7
1978; SSE2-NEXT:    psrlw $1, %xmm7
1979; SSE2-NEXT:    pand %xmm13, %xmm7
1980; SSE2-NEXT:    por %xmm5, %xmm7
1981; SSE2-NEXT:    movdqa %xmm1, %xmm5
1982; SSE2-NEXT:    psrlw $3, %xmm5
1983; SSE2-NEXT:    pand %xmm6, %xmm5
1984; SSE2-NEXT:    por %xmm7, %xmm5
1985; SSE2-NEXT:    movdqa %xmm1, %xmm6
1986; SSE2-NEXT:    psrlw $5, %xmm6
1987; SSE2-NEXT:    pand %xmm2, %xmm6
1988; SSE2-NEXT:    por %xmm5, %xmm6
1989; SSE2-NEXT:    psrlw $7, %xmm1
1990; SSE2-NEXT:    pand %xmm3, %xmm1
1991; SSE2-NEXT:    por %xmm6, %xmm1
1992; SSE2-NEXT:    por %xmm4, %xmm1
1993; SSE2-NEXT:    retq
1994;
1995; SSSE3-LABEL: test_bitreverse_v4i64:
1996; SSSE3:       # BB#0:
1997; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
1998; SSSE3-NEXT:    pshufb %xmm4, %xmm0
1999; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2000; SSSE3-NEXT:    movdqa %xmm0, %xmm2
2001; SSSE3-NEXT:    pand %xmm5, %xmm2
2002; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2003; SSSE3-NEXT:    movdqa %xmm6, %xmm7
2004; SSSE3-NEXT:    pshufb %xmm2, %xmm7
2005; SSSE3-NEXT:    psrlw $4, %xmm0
2006; SSSE3-NEXT:    pand %xmm5, %xmm0
2007; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2008; SSSE3-NEXT:    movdqa %xmm2, %xmm3
2009; SSSE3-NEXT:    pshufb %xmm0, %xmm3
2010; SSSE3-NEXT:    por %xmm7, %xmm3
2011; SSSE3-NEXT:    pshufb %xmm4, %xmm1
2012; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2013; SSSE3-NEXT:    pand %xmm5, %xmm0
2014; SSSE3-NEXT:    pshufb %xmm0, %xmm6
2015; SSSE3-NEXT:    psrlw $4, %xmm1
2016; SSSE3-NEXT:    pand %xmm5, %xmm1
2017; SSSE3-NEXT:    pshufb %xmm1, %xmm2
2018; SSSE3-NEXT:    por %xmm6, %xmm2
2019; SSSE3-NEXT:    movdqa %xmm3, %xmm0
2020; SSSE3-NEXT:    movdqa %xmm2, %xmm1
2021; SSSE3-NEXT:    retq
2022;
2023; AVX1-LABEL: test_bitreverse_v4i64:
2024; AVX1:       # BB#0:
2025; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2026; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
2027; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
2028; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2029; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4
2030; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2031; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4
2032; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
2033; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
2034; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2035; AVX1-NEXT:    vpshufb %xmm1, %xmm6, %xmm1
2036; AVX1-NEXT:    vpor %xmm1, %xmm4, %xmm1
2037; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
2038; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm2
2039; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2
2040; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
2041; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
2042; AVX1-NEXT:    vpshufb %xmm0, %xmm6, %xmm0
2043; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
2044; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2045; AVX1-NEXT:    retq
2046;
2047; AVX2-LABEL: test_bitreverse_v4i64:
2048; AVX2:       # BB#0:
2049; 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]
2050; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2051; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
2052; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
2053; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
2054; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
2055; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
2056; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
2057; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
2058; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
2059; AVX2-NEXT:    retq
2060;
2061; XOPAVX1-LABEL: test_bitreverse_v4i64:
2062; XOPAVX1:       # BB#0:
2063; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2064; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]
2065; XOPAVX1-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
2066; XOPAVX1-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
2067; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2068; XOPAVX1-NEXT:    retq
2069;
2070; XOPAVX2-LABEL: test_bitreverse_v4i64:
2071; XOPAVX2:       # BB#0:
2072; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2073; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]
2074; XOPAVX2-NEXT:    vpperm %xmm2, %xmm1, %xmm0, %xmm1
2075; XOPAVX2-NEXT:    vpperm %xmm2, %xmm0, %xmm0, %xmm0
2076; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2077; XOPAVX2-NEXT:    retq
2078  %b = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %a)
2079  ret <4 x i64> %b
2080}
2081
2082declare i8 @llvm.bitreverse.i8(i8) readnone
2083declare i16 @llvm.bitreverse.i16(i16) readnone
2084declare i32 @llvm.bitreverse.i32(i32) readnone
2085declare i64 @llvm.bitreverse.i64(i64) readnone
2086
2087declare <16 x i8> @llvm.bitreverse.v16i8(<16 x i8>) readnone
2088declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>) readnone
2089declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>) readnone
2090declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>) readnone
2091
2092declare <32 x i8>  @llvm.bitreverse.v32i8(<32 x i8>) readnone
2093declare <16 x i16> @llvm.bitreverse.v16i16(<16 x i16>) readnone
2094declare <8 x i32>  @llvm.bitreverse.v8i32(<8 x i32>) readnone
2095declare <4 x i64>  @llvm.bitreverse.v4i64(<4 x i64>) readnone
2096