blob: c5b830001a058506fcf2ab36c08da3795ed4120e [file] [log] [blame]
Simon Pilgrimb87ffe82016-03-30 14:14:00 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
4
5define i8 @test_bitreverse_i8(i8 %a) {
6; ALL-LABEL: test_bitreverse_i8:
7; ALL: # BB#0:
8; ALL-NEXT: vmovd %edi, %xmm0
9; ALL-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
10; ALL-NEXT: vpextrb $0, %xmm0, %eax
11; ALL-NEXT: retq
12 %b = call i8 @llvm.bitreverse.i8(i8 %a)
13 ret i8 %b
14}
15
16define i16 @test_bitreverse_i16(i16 %a) {
17; ALL-LABEL: test_bitreverse_i16:
18; ALL: # BB#0:
19; ALL-NEXT: vmovd %edi, %xmm0
20; ALL-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
21; ALL-NEXT: vmovd %xmm0, %eax
22; ALL-NEXT: retq
23 %b = call i16 @llvm.bitreverse.i16(i16 %a)
24 ret i16 %b
25}
26
27define i32 @test_bitreverse_i32(i32 %a) {
28; ALL-LABEL: test_bitreverse_i32:
29; ALL: # BB#0:
30; ALL-NEXT: vmovd %edi, %xmm0
31; ALL-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
32; ALL-NEXT: vmovd %xmm0, %eax
33; ALL-NEXT: retq
34 %b = call i32 @llvm.bitreverse.i32(i32 %a)
35 ret i32 %b
36}
37
38define i64 @test_bitreverse_i64(i64 %a) {
39; ALL-LABEL: test_bitreverse_i64:
40; ALL: # BB#0:
41; ALL-NEXT: vmovq %rdi, %xmm0
42; ALL-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
43; ALL-NEXT: vmovq %xmm0, %rax
44; ALL-NEXT: retq
45 %b = call i64 @llvm.bitreverse.i64(i64 %a)
46 ret i64 %b
47}
48
49define <16 x i8> @test_bitreverse_v16i8(<16 x i8> %a) {
50; ALL-LABEL: test_bitreverse_v16i8:
51; ALL: # BB#0:
52; ALL-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
53; ALL-NEXT: retq
54 %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %a)
55 ret <16 x i8> %b
56}
57
58define <8 x i16> @test_bitreverse_v8i16(<8 x i16> %a) {
59; ALL-LABEL: test_bitreverse_v8i16:
60; ALL: # BB#0:
61; ALL-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
62; ALL-NEXT: retq
63 %b = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a)
64 ret <8 x i16> %b
65}
66
67define <4 x i32> @test_bitreverse_v4i32(<4 x i32> %a) {
68; ALL-LABEL: test_bitreverse_v4i32:
69; ALL: # BB#0:
70; ALL-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
71; ALL-NEXT: retq
72 %b = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a)
73 ret <4 x i32> %b
74}
75
76define <2 x i64> @test_bitreverse_v2i64(<2 x i64> %a) {
77; ALL-LABEL: test_bitreverse_v2i64:
78; ALL: # BB#0:
79; ALL-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0
80; ALL-NEXT: retq
81 %b = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a)
82 ret <2 x i64> %b
83}
84
85define <32 x i8> @test_bitreverse_v32i8(<32 x i8> %a) {
86; XOPAVX1-LABEL: test_bitreverse_v32i8:
87; XOPAVX1: # BB#0:
88; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
89; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]
90; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1
91; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0
92; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
93; XOPAVX1-NEXT: retq
94;
95; XOPAVX2-LABEL: test_bitreverse_v32i8:
96; XOPAVX2: # BB#0:
97; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
98; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]
99; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1
100; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0
101; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
102; XOPAVX2-NEXT: retq
103 %b = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %a)
104 ret <32 x i8> %b
105}
106
107define <16 x i16> @test_bitreverse_v16i16(<16 x i16> %a) {
108; XOPAVX1-LABEL: test_bitreverse_v16i16:
109; XOPAVX1: # BB#0:
110; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
111; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]
112; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1
113; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0
114; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
115; XOPAVX1-NEXT: retq
116;
117; XOPAVX2-LABEL: test_bitreverse_v16i16:
118; XOPAVX2: # BB#0:
119; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
120; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]
121; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1
122; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0
123; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
124; XOPAVX2-NEXT: retq
125 %b = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a)
126 ret <16 x i16> %b
127}
128
129define <8 x i32> @test_bitreverse_v8i32(<8 x i32> %a) {
130; XOPAVX1-LABEL: test_bitreverse_v8i32:
131; XOPAVX1: # BB#0:
132; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
133; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]
134; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1
135; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0
136; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
137; XOPAVX1-NEXT: retq
138;
139; XOPAVX2-LABEL: test_bitreverse_v8i32:
140; XOPAVX2: # BB#0:
141; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
142; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]
143; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1
144; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0
145; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
146; XOPAVX2-NEXT: retq
147 %b = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %a)
148 ret <8 x i32> %b
149}
150
151define <4 x i64> @test_bitreverse_v4i64(<4 x i64> %a) {
152; XOPAVX1-LABEL: test_bitreverse_v4i64:
153; XOPAVX1: # BB#0:
154; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
155; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]
156; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1
157; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0
158; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
159; XOPAVX1-NEXT: retq
160;
161; XOPAVX2-LABEL: test_bitreverse_v4i64:
162; XOPAVX2: # BB#0:
163; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
164; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]
165; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1
166; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0
167; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
168; XOPAVX2-NEXT: retq
169 %b = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %a)
170 ret <4 x i64> %b
171}
172
173declare i8 @llvm.bitreverse.i8(i8) readnone
174declare i16 @llvm.bitreverse.i16(i16) readnone
175declare i32 @llvm.bitreverse.i32(i32) readnone
176declare i64 @llvm.bitreverse.i64(i64) readnone
177
178declare <16 x i8> @llvm.bitreverse.v16i8(<16 x i8>) readnone
179declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>) readnone
180declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>) readnone
181declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>) readnone
182
183declare <32 x i8> @llvm.bitreverse.v32i8(<32 x i8>) readnone
184declare <16 x i16> @llvm.bitreverse.v16i16(<16 x i16>) readnone
185declare <8 x i32> @llvm.bitreverse.v8i32(<8 x i32>) readnone
186declare <4 x i64> @llvm.bitreverse.v4i64(<4 x i64>) readnone