blob: 31bbc4b135163722a8cfb369536bd4ce2959ff7f [file] [log] [blame]
Graham Yiu67152612017-11-01 18:06:56 +00001; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-linux-gnu \
2; RUN: -verify-machineinstrs < %s | FileCheck %s
3; RUN: llc -O0 -mcpu=pwr9 -mtriple=powerpc64le-unknown-linux-gnu \
4; RUN: -verify-machineinstrs < %s | FileCheck %s
5; RUN: llc -mcpu=pwr9 -mtriple=powerpc64-unknown-linux-gnu \
6; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK-BE
7; RUN: llc -O0 -mcpu=pwr9 -mtriple=powerpc64-unknown-linux-gnu \
8; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK-BE
9
10; The following testcases take one halfword element from the second vector and
11; inserts it at various locations in the first vector
12define <8 x i16> @shuffle_vector_halfword_0_8(<8 x i16> %a, <8 x i16> %b) {
13entry:
14; CHECK-LABEL: shuffle_vector_halfword_0_8
15; CHECK: vsldoi 3, 3, 3, 8
16; CHECK: vinserth 2, 3, 14
17; CHECK-BE-LABEL: shuffle_vector_halfword_0_8
18; CHECK-BE: vsldoi 3, 3, 3, 10
19; CHECK-BE: vinserth 2, 3, 0
20 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
21 ret <8 x i16> %vecins
22}
23
24define <8 x i16> @shuffle_vector_halfword_1_15(<8 x i16> %a, <8 x i16> %b) {
25entry:
26; CHECK-LABEL: shuffle_vector_halfword_1_15
27; CHECK: vsldoi 3, 3, 3, 10
28; CHECK: vinserth 2, 3, 12
29; CHECK-BE-LABEL: shuffle_vector_halfword_1_15
30; CHECK-BE: vsldoi 3, 3, 3, 8
31; CHECK-BE: vinserth 2, 3, 2
32 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 15, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
33 ret <8 x i16> %vecins
34}
35
36define <8 x i16> @shuffle_vector_halfword_2_9(<8 x i16> %a, <8 x i16> %b) {
37entry:
38; CHECK-LABEL: shuffle_vector_halfword_2_9
39; CHECK: vsldoi 3, 3, 3, 6
40; CHECK: vinserth 2, 3, 10
41; CHECK-BE-LABEL: shuffle_vector_halfword_2_9
42; CHECK-BE: vsldoi 3, 3, 3, 12
43; CHECK-BE: vinserth 2, 3, 4
44 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 9, i32 3, i32 4, i32 5, i32 6, i32 7>
45 ret <8 x i16> %vecins
46}
47
48define <8 x i16> @shuffle_vector_halfword_3_13(<8 x i16> %a, <8 x i16> %b) {
49entry:
50; CHECK-LABEL: shuffle_vector_halfword_3_13
51; CHECK: vsldoi 3, 3, 3, 14
52; CHECK: vinserth 2, 3, 8
53; CHECK-BE-LABEL: shuffle_vector_halfword_3_13
54; CHECK-BE: vsldoi 3, 3, 3, 4
55; CHECK-BE: vinserth 2, 3, 6
56 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 13, i32 4, i32 5, i32 6, i32 7>
57 ret <8 x i16> %vecins
58}
59
60define <8 x i16> @shuffle_vector_halfword_4_10(<8 x i16> %a, <8 x i16> %b) {
61entry:
62; CHECK-LABEL: shuffle_vector_halfword_4_10
63; CHECK: vsldoi 3, 3, 3, 4
64; CHECK: vinserth 2, 3, 6
65; CHECK-BE-LABEL: shuffle_vector_halfword_4_10
66; CHECK-BE: vsldoi 3, 3, 3, 14
67; CHECK-BE: vinserth 2, 3, 8
68 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 10, i32 5, i32 6, i32 7>
69 ret <8 x i16> %vecins
70}
71
72define <8 x i16> @shuffle_vector_halfword_5_14(<8 x i16> %a, <8 x i16> %b) {
73entry:
74; CHECK-LABEL: shuffle_vector_halfword_5_14
75; CHECK: vsldoi 3, 3, 3, 12
76; CHECK: vinserth 2, 3, 4
77; CHECK-BE-LABEL: shuffle_vector_halfword_5_14
78; CHECK-BE: vsldoi 3, 3, 3, 6
79; CHECK-BE: vinserth 2, 3, 10
80 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 14, i32 6, i32 7>
81 ret <8 x i16> %vecins
82}
83
84define <8 x i16> @shuffle_vector_halfword_6_11(<8 x i16> %a, <8 x i16> %b) {
85entry:
86; CHECK-LABEL: shuffle_vector_halfword_6_11
87; CHECK: vsldoi 3, 3, 3, 2
88; CHECK: vinserth 2, 3, 2
89; CHECK-BE-LABEL: shuffle_vector_halfword_6_11
90; CHECK-BE: vinserth 2, 3, 12
91 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 11, i32 7>
92 ret <8 x i16> %vecins
93}
94
95define <8 x i16> @shuffle_vector_halfword_7_12(<8 x i16> %a, <8 x i16> %b) {
96entry:
97; CHECK-LABEL: shuffle_vector_halfword_7_12
98; CHECK: vinserth 2, 3, 0
99; CHECK-BE-LABEL: shuffle_vector_halfword_7_12
100; CHECK-BE: vsldoi 3, 3, 3, 2
101; CHECK-BE: vinserth 2, 3, 14
102 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 12>
103 ret <8 x i16> %vecins
104}
105
106define <8 x i16> @shuffle_vector_halfword_8_1(<8 x i16> %a, <8 x i16> %b) {
107entry:
108; CHECK-LABEL: shuffle_vector_halfword_8_1
109; CHECK: vsldoi 2, 2, 2, 6
110; CHECK: vinserth 3, 2, 14
111; CHECK: vmr 2, 3
112; CHECK-BE-LABEL: shuffle_vector_halfword_8_1
113; CHECK-BE: vsldoi 2, 2, 2, 12
114; CHECK-BE: vinserth 3, 2, 0
115; CHECK-BE: vmr 2, 3
116 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
117 ret <8 x i16> %vecins
118}
119
120; The following testcases take one halfword element from the first vector and
121; inserts it at various locations in the second vector
122define <8 x i16> @shuffle_vector_halfword_9_7(<8 x i16> %a, <8 x i16> %b) {
123entry:
124; CHECK-LABEL: shuffle_vector_halfword_9_7
125; CHECK: vsldoi 2, 2, 2, 10
126; CHECK: vinserth 3, 2, 12
127; CHECK: vmr 2, 3
128; CHECK-BE-LABEL: shuffle_vector_halfword_9_7
129; CHECK-BE: vsldoi 2, 2, 2, 8
130; CHECK-BE: vinserth 3, 2, 2
131; CHECK-BE: vmr 2, 3
132 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 7, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
133 ret <8 x i16> %vecins
134}
135
136define <8 x i16> @shuffle_vector_halfword_10_4(<8 x i16> %a, <8 x i16> %b) {
137entry:
138; CHECK-LABEL: shuffle_vector_halfword_10_4
139; CHECK: vinserth 3, 2, 10
140; CHECK: vmr 2, 3
141; CHECK-BE-LABEL: shuffle_vector_halfword_10_4
142; CHECK-BE: vsldoi 2, 2, 2, 2
143; CHECK-BE: vinserth 3, 2, 4
144; CHECK-BE: vmr 2, 3
145 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 9, i32 4, i32 11, i32 12, i32 13, i32 14, i32 15>
146 ret <8 x i16> %vecins
147}
148
149define <8 x i16> @shuffle_vector_halfword_11_2(<8 x i16> %a, <8 x i16> %b) {
150entry:
151; CHECK-LABEL: shuffle_vector_halfword_11_2
152; CHECK: vsldoi 2, 2, 2, 4
153; CHECK: vinserth 3, 2, 8
154; CHECK: vmr 2, 3
155; CHECK-BE-LABEL: shuffle_vector_halfword_11_2
156; CHECK-BE: vsldoi 2, 2, 2, 14
157; CHECK-BE: vinserth 3, 2, 6
158; CHECK-BE: vmr 2, 3
159 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 9, i32 10, i32 2, i32 12, i32 13, i32 14, i32 15>
160 ret <8 x i16> %vecins
161}
162
163define <8 x i16> @shuffle_vector_halfword_12_6(<8 x i16> %a, <8 x i16> %b) {
164entry:
165; CHECK-LABEL: shuffle_vector_halfword_12_6
166; CHECK: vsldoi 2, 2, 2, 12
167; CHECK: vinserth 3, 2, 6
168; CHECK: vmr 2, 3
169; CHECK-BE-LABEL: shuffle_vector_halfword_12_6
170; CHECK-BE: vsldoi 2, 2, 2, 6
171; CHECK-BE: vinserth 3, 2, 8
172; CHECK-BE: vmr 2, 3
173 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 6, i32 13, i32 14, i32 15>
174 ret <8 x i16> %vecins
175}
176
177define <8 x i16> @shuffle_vector_halfword_13_3(<8 x i16> %a, <8 x i16> %b) {
178entry:
179; CHECK-LABEL: shuffle_vector_halfword_13_3
180; CHECK: vsldoi 2, 2, 2, 2
181; CHECK: vinserth 3, 2, 4
182; CHECK: vmr 2, 3
183; CHECK-BE-LABEL: shuffle_vector_halfword_13_3
184; CHECK-BE: vinserth 3, 2, 10
185; CHECK-BE: vmr 2, 3
186 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 3, i32 14, i32 15>
187 ret <8 x i16> %vecins
188}
189
190define <8 x i16> @shuffle_vector_halfword_14_5(<8 x i16> %a, <8 x i16> %b) {
191entry:
192; CHECK-LABEL: shuffle_vector_halfword_14_5
193; CHECK: vsldoi 2, 2, 2, 14
194; CHECK: vinserth 3, 2, 2
195; CHECK: vmr 2, 3
196; CHECK-BE-LABEL: shuffle_vector_halfword_14_5
197; CHECK-BE: vsldoi 2, 2, 2, 4
198; CHECK-BE: vinserth 3, 2, 12
199; CHECK-BE: vmr 2, 3
200 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 5, i32 15>
201 ret <8 x i16> %vecins
202}
203
204define <8 x i16> @shuffle_vector_halfword_15_0(<8 x i16> %a, <8 x i16> %b) {
205entry:
206; CHECK-LABEL: shuffle_vector_halfword_15_0
207; CHECK: vsldoi 2, 2, 2, 8
208; CHECK: vinserth 3, 2, 0
209; CHECK: vmr 2, 3
210; CHECK-BE-LABEL: shuffle_vector_halfword_15_0
211; CHECK-BE: vsldoi 2, 2, 2, 10
212; CHECK-BE: vinserth 3, 2, 14
213; CHECK-BE: vmr 2, 3
214 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 0>
215 ret <8 x i16> %vecins
216}
217
218; The following testcases use the same vector in both arguments of the
219; shufflevector. If halfword element 3 in BE mode(or 4 in LE mode) is the one
220; we're attempting to insert, then we can use the vector insert instruction
221define <8 x i16> @shuffle_vector_halfword_0_4(<8 x i16> %a) {
222entry:
223; CHECK-LABEL: shuffle_vector_halfword_0_4
224; CHECK: vinserth 2, 2, 14
225; CHECK-BE-LABEL: shuffle_vector_halfword_0_4
226; CHECK-BE-NOT: vinserth
227 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 4, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
228 ret <8 x i16> %vecins
229}
230
231define <8 x i16> @shuffle_vector_halfword_1_3(<8 x i16> %a) {
232entry:
233; CHECK-LABEL: shuffle_vector_halfword_1_3
234; CHECK-NOT: vinserth
235; CHECK-BE-LABEL: shuffle_vector_halfword_1_3
236; CHECK-BE: vinserth 2, 2, 2
237 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 3, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
238 ret <8 x i16> %vecins
239}
240
241define <8 x i16> @shuffle_vector_halfword_2_3(<8 x i16> %a) {
242entry:
243; CHECK-LABEL: shuffle_vector_halfword_2_3
244; CHECK-NOT: vinserth
245; CHECK-BE-LABEL: shuffle_vector_halfword_2_3
246; CHECK-BE: vinserth 2, 2, 4
247 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 3, i32 3, i32 4, i32 5, i32 6, i32 7>
248 ret <8 x i16> %vecins
249}
250
251define <8 x i16> @shuffle_vector_halfword_3_4(<8 x i16> %a) {
252entry:
253; CHECK-LABEL: shuffle_vector_halfword_3_4
254; CHECK: vinserth 2, 2, 8
255; CHECK-BE-LABEL: shuffle_vector_halfword_3_4
256; CHECK-BE-NOT: vinserth
257 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 4, i32 4, i32 5, i32 6, i32 7>
258 ret <8 x i16> %vecins
259}
260
261define <8 x i16> @shuffle_vector_halfword_4_3(<8 x i16> %a) {
262entry:
263; CHECK-LABEL: shuffle_vector_halfword_4_3
264; CHECK-NOT: vinserth
265; CHECK-BE-LABEL: shuffle_vector_halfword_4_3
266; CHECK-BE: vinserth 2, 2, 8
267 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 3, i32 5, i32 6, i32 7>
268 ret <8 x i16> %vecins
269}
270
271define <8 x i16> @shuffle_vector_halfword_5_3(<8 x i16> %a) {
272entry:
273; CHECK-LABEL: shuffle_vector_halfword_5_3
274; CHECK-NOT: vinserth
275; CHECK-BE-LABEL: shuffle_vector_halfword_5_3
276; CHECK-BE: vinserth 2, 2, 10
277 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 3, i32 6, i32 7>
278 ret <8 x i16> %vecins
279}
280
281define <8 x i16> @shuffle_vector_halfword_6_4(<8 x i16> %a) {
282entry:
283; CHECK-LABEL: shuffle_vector_halfword_6_4
284; CHECK: vinserth 2, 2, 2
285; CHECK-BE-LABEL: shuffle_vector_halfword_6_4
286; CHECK-BE-NOT: vinserth
287 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 4, i32 7>
288 ret <8 x i16> %vecins
289}
290
291define <8 x i16> @shuffle_vector_halfword_7_4(<8 x i16> %a) {
292entry:
293; CHECK-LABEL: shuffle_vector_halfword_7_4
294; CHECK: vinserth 2, 2, 0
295; CHECK-BE-LABEL: shuffle_vector_halfword_7_4
296; CHECK-BE-NOT: vinserth
297 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 4>
298 ret <8 x i16> %vecins
299}
300