1 ; 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
10 ; The following testcases take one halfword element from the second vector and
11 ; inserts it at various locations in the first vector
12 define <8 x i16> @shuffle_vector_halfword_0_8(<8 x i16> %a, <8 x i16> %b) {
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>
24 define <8 x i16> @shuffle_vector_halfword_1_15(<8 x i16> %a, <8 x i16> %b) {
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>
36 define <8 x i16> @shuffle_vector_halfword_2_9(<8 x i16> %a, <8 x i16> %b) {
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>
48 define <8 x i16> @shuffle_vector_halfword_3_13(<8 x i16> %a, <8 x i16> %b) {
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>
60 define <8 x i16> @shuffle_vector_halfword_4_10(<8 x i16> %a, <8 x i16> %b) {
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>
72 define <8 x i16> @shuffle_vector_halfword_5_14(<8 x i16> %a, <8 x i16> %b) {
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>
84 define <8 x i16> @shuffle_vector_halfword_6_11(<8 x i16> %a, <8 x i16> %b) {
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>
95 define <8 x i16> @shuffle_vector_halfword_7_12(<8 x i16> %a, <8 x i16> %b) {
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
106 define <8 x i16> @shuffle_vector_halfword_8_1(<8 x i16> %a, <8 x i16> %b) {
108 ; CHECK-LABEL: shuffle_vector_halfword_8_1
109 ; CHECK: vsldoi 2, 2, 2, 6
110 ; CHECK: vinserth 3, 2, 14
112 ; CHECK-BE-LABEL: shuffle_vector_halfword_8_1
113 ; CHECK-BE: vsldoi 2, 2, 2, 12
114 ; CHECK-BE: vinserth 3, 2, 0
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
120 ; The following testcases take one halfword element from the first vector and
121 ; inserts it at various locations in the second vector
122 define <8 x i16> @shuffle_vector_halfword_9_7(<8 x i16> %a, <8 x i16> %b) {
124 ; CHECK-LABEL: shuffle_vector_halfword_9_7
125 ; CHECK: vsldoi 2, 2, 2, 10
126 ; CHECK: vinserth 3, 2, 12
128 ; CHECK-BE-LABEL: shuffle_vector_halfword_9_7
129 ; CHECK-BE: vsldoi 2, 2, 2, 8
130 ; CHECK-BE: vinserth 3, 2, 2
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
136 define <8 x i16> @shuffle_vector_halfword_10_4(<8 x i16> %a, <8 x i16> %b) {
138 ; CHECK-LABEL: shuffle_vector_halfword_10_4
139 ; CHECK: vinserth 3, 2, 10
141 ; CHECK-BE-LABEL: shuffle_vector_halfword_10_4
142 ; CHECK-BE: vsldoi 2, 2, 2, 2
143 ; CHECK-BE: vinserth 3, 2, 4
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
149 define <8 x i16> @shuffle_vector_halfword_11_2(<8 x i16> %a, <8 x i16> %b) {
151 ; CHECK-LABEL: shuffle_vector_halfword_11_2
152 ; CHECK: vsldoi 2, 2, 2, 4
153 ; CHECK: vinserth 3, 2, 8
155 ; CHECK-BE-LABEL: shuffle_vector_halfword_11_2
156 ; CHECK-BE: vsldoi 2, 2, 2, 14
157 ; CHECK-BE: vinserth 3, 2, 6
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
163 define <8 x i16> @shuffle_vector_halfword_12_6(<8 x i16> %a, <8 x i16> %b) {
165 ; CHECK-LABEL: shuffle_vector_halfword_12_6
166 ; CHECK: vsldoi 2, 2, 2, 12
167 ; CHECK: vinserth 3, 2, 6
169 ; CHECK-BE-LABEL: shuffle_vector_halfword_12_6
170 ; CHECK-BE: vsldoi 2, 2, 2, 6
171 ; CHECK-BE: vinserth 3, 2, 8
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
177 define <8 x i16> @shuffle_vector_halfword_13_3(<8 x i16> %a, <8 x i16> %b) {
179 ; CHECK-LABEL: shuffle_vector_halfword_13_3
180 ; CHECK: vsldoi 2, 2, 2, 2
181 ; CHECK: vinserth 3, 2, 4
183 ; CHECK-BE-LABEL: shuffle_vector_halfword_13_3
184 ; CHECK-BE: vinserth 3, 2, 10
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
190 define <8 x i16> @shuffle_vector_halfword_14_5(<8 x i16> %a, <8 x i16> %b) {
192 ; CHECK-LABEL: shuffle_vector_halfword_14_5
193 ; CHECK: vsldoi 2, 2, 2, 14
194 ; CHECK: vinserth 3, 2, 2
196 ; CHECK-BE-LABEL: shuffle_vector_halfword_14_5
197 ; CHECK-BE: vsldoi 2, 2, 2, 4
198 ; CHECK-BE: vinserth 3, 2, 12
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
204 define <8 x i16> @shuffle_vector_halfword_15_0(<8 x i16> %a, <8 x i16> %b) {
206 ; CHECK-LABEL: shuffle_vector_halfword_15_0
207 ; CHECK: vsldoi 2, 2, 2, 8
208 ; CHECK: vinserth 3, 2, 0
210 ; CHECK-BE-LABEL: shuffle_vector_halfword_15_0
211 ; CHECK-BE: vsldoi 2, 2, 2, 10
212 ; CHECK-BE: vinserth 3, 2, 14
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
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
221 define <8 x i16> @shuffle_vector_halfword_0_4(<8 x i16> %a) {
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
231 define <8 x i16> @shuffle_vector_halfword_1_3(<8 x i16> %a) {
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
241 define <8 x i16> @shuffle_vector_halfword_2_3(<8 x i16> %a) {
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
251 define <8 x i16> @shuffle_vector_halfword_3_4(<8 x i16> %a) {
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
261 define <8 x i16> @shuffle_vector_halfword_4_3(<8 x i16> %a) {
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
271 define <8 x i16> @shuffle_vector_halfword_5_3(<8 x i16> %a) {
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
281 define <8 x i16> @shuffle_vector_halfword_6_4(<8 x i16> %a) {
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
291 define <8 x i16> @shuffle_vector_halfword_7_4(<8 x i16> %a) {
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
301 ; The following testcases take one byte element from the second vector and
302 ; inserts it at various locations in the first vector
303 define <16 x i8> @shuffle_vector_byte_0_16(<16 x i8> %a, <16 x i8> %b) {
305 ; CHECK-LABEL: shuffle_vector_byte_0_16
306 ; CHECK: vsldoi 3, 3, 3, 8
307 ; CHECK: vinsertb 2, 3, 15
308 ; CHECK-BE-LABEL: shuffle_vector_byte_0_16
309 ; CHECK-BE: vsldoi 3, 3, 3, 9
310 ; CHECK-BE: vinsertb 2, 3, 0
311 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
312 ret <16 x i8> %vecins
315 define <16 x i8> @shuffle_vector_byte_1_25(<16 x i8> %a, <16 x i8> %b) {
317 ; CHECK-LABEL: shuffle_vector_byte_1_25
318 ; CHECK: vsldoi 3, 3, 3, 15
319 ; CHECK: vinsertb 2, 3, 14
320 ; CHECK-BE-LABEL: shuffle_vector_byte_1_25
321 ; CHECK-BE: vsldoi 3, 3, 3, 2
322 ; CHECK-BE: vinsertb 2, 3, 1
323 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 25, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
324 ret <16 x i8> %vecins
327 define <16 x i8> @shuffle_vector_byte_2_18(<16 x i8> %a, <16 x i8> %b) {
329 ; CHECK-LABEL: shuffle_vector_byte_2_18
330 ; CHECK: vsldoi 3, 3, 3, 6
331 ; CHECK: vinsertb 2, 3, 13
332 ; CHECK-BE-LABEL: shuffle_vector_byte_2_18
333 ; CHECK-BE: vsldoi 3, 3, 3, 11
334 ; CHECK-BE: vinsertb 2, 3, 2
335 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 18, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
336 ret <16 x i8> %vecins
339 define <16 x i8> @shuffle_vector_byte_3_27(<16 x i8> %a, <16 x i8> %b) {
341 ; CHECK-LABEL: shuffle_vector_byte_3_27
342 ; CHECK: vsldoi 3, 3, 3, 13
343 ; CHECK: vinsertb 2, 3, 12
344 ; CHECK-BE-LABEL: shuffle_vector_byte_3_27
345 ; CHECK-BE: vsldoi 3, 3, 3, 4
346 ; CHECK-BE: vinsertb 2, 3, 3
347 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 27, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
348 ret <16 x i8> %vecins
351 define <16 x i8> @shuffle_vector_byte_4_20(<16 x i8> %a, <16 x i8> %b) {
353 ; CHECK-LABEL: shuffle_vector_byte_4_20
354 ; CHECK: vsldoi 3, 3, 3, 4
355 ; CHECK: vinsertb 2, 3, 11
356 ; CHECK-BE-LABEL: shuffle_vector_byte_4_20
357 ; CHECK-BE: vsldoi 3, 3, 3, 13
358 ; CHECK-BE: vinsertb 2, 3, 4
359 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 20, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
360 ret <16 x i8> %vecins
363 define <16 x i8> @shuffle_vector_byte_5_29(<16 x i8> %a, <16 x i8> %b) {
365 ; CHECK-LABEL: shuffle_vector_byte_5_29
366 ; CHECK: vsldoi 3, 3, 3, 11
367 ; CHECK: vinsertb 2, 3, 10
368 ; CHECK-BE-LABEL: shuffle_vector_byte_5_29
369 ; CHECK-BE: vsldoi 3, 3, 3, 6
370 ; CHECK-BE: vinsertb 2, 3, 5
371 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 29, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
372 ret <16 x i8> %vecins
375 define <16 x i8> @shuffle_vector_byte_6_22(<16 x i8> %a, <16 x i8> %b) {
377 ; CHECK-LABEL: shuffle_vector_byte_6_22
378 ; CHECK: vsldoi 3, 3, 3, 2
379 ; CHECK: vinsertb 2, 3, 9
380 ; CHECK-BE-LABEL: shuffle_vector_byte_6_22
381 ; CHECK-BE: vsldoi 3, 3, 3, 15
382 ; CHECK-BE: vinsertb 2, 3, 6
383 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 22, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
384 ret <16 x i8> %vecins
387 define <16 x i8> @shuffle_vector_byte_7_31(<16 x i8> %a, <16 x i8> %b) {
389 ; CHECK-LABEL: shuffle_vector_byte_7_31
390 ; CHECK: vsldoi 3, 3, 3, 9
391 ; CHECK: vinsertb 2, 3, 8
392 ; CHECK-BE-LABEL: shuffle_vector_byte_7_31
393 ; CHECK-BE: vsldoi 3, 3, 3, 8
394 ; CHECK-BE: vinsertb 2, 3, 7
395 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 31, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
396 ret <16 x i8> %vecins
399 define <16 x i8> @shuffle_vector_byte_8_24(<16 x i8> %a, <16 x i8> %b) {
401 ; CHECK-LABEL: shuffle_vector_byte_8_24
402 ; CHECK: vinsertb 2, 3, 7
403 ; CHECK-BE-LABEL: shuffle_vector_byte_8_24
404 ; CHECK-BE: vsldoi 3, 3, 3, 1
405 ; CHECK-BE: vinsertb 2, 3, 8
406 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 24, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
407 ret <16 x i8> %vecins
410 define <16 x i8> @shuffle_vector_byte_9_17(<16 x i8> %a, <16 x i8> %b) {
412 ; CHECK-LABEL: shuffle_vector_byte_9_17
413 ; CHECK: vsldoi 3, 3, 3, 7
414 ; CHECK: vinsertb 2, 3, 6
415 ; CHECK-BE-LABEL: shuffle_vector_byte_9_17
416 ; CHECK-BE: vsldoi 3, 3, 3, 10
417 ; CHECK-BE: vinsertb 2, 3, 9
418 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 17, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
419 ret <16 x i8> %vecins
422 define <16 x i8> @shuffle_vector_byte_10_26(<16 x i8> %a, <16 x i8> %b) {
424 ; CHECK-LABEL: shuffle_vector_byte_10_26
425 ; CHECK: vsldoi 3, 3, 3, 14
426 ; CHECK: vinsertb 2, 3, 5
427 ; CHECK-BE-LABEL: shuffle_vector_byte_10_26
428 ; CHECK-BE: vsldoi 3, 3, 3, 3
429 ; CHECK-BE: vinsertb 2, 3, 10
430 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 26, i32 11, i32 12, i32 13, i32 14, i32 15>
431 ret <16 x i8> %vecins
434 define <16 x i8> @shuffle_vector_byte_11_19(<16 x i8> %a, <16 x i8> %b) {
436 ; CHECK-LABEL: shuffle_vector_byte_11_19
437 ; CHECK: vsldoi 3, 3, 3, 5
438 ; CHECK: vinsertb 2, 3, 4
439 ; CHECK-BE-LABEL: shuffle_vector_byte_11_19
440 ; CHECK-BE: vsldoi 3, 3, 3, 12
441 ; CHECK-BE: vinsertb 2, 3, 11
442 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 19, i32 12, i32 13, i32 14, i32 15>
443 ret <16 x i8> %vecins
446 define <16 x i8> @shuffle_vector_byte_12_28(<16 x i8> %a, <16 x i8> %b) {
448 ; CHECK-LABEL: shuffle_vector_byte_12_28
449 ; CHECK: vsldoi 3, 3, 3, 12
450 ; CHECK: vinsertb 2, 3, 3
451 ; CHECK-BE-LABEL: shuffle_vector_byte_12_28
452 ; CHECK-BE: vsldoi 3, 3, 3, 5
453 ; CHECK-BE: vinsertb 2, 3, 12
454 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 28, i32 13, i32 14, i32 15>
455 ret <16 x i8> %vecins
458 define <16 x i8> @shuffle_vector_byte_13_21(<16 x i8> %a, <16 x i8> %b) {
460 ; CHECK-LABEL: shuffle_vector_byte_13_21
461 ; CHECK: vsldoi 3, 3, 3, 3
462 ; CHECK: vinsertb 2, 3, 2
463 ; CHECK-BE-LABEL: shuffle_vector_byte_13_21
464 ; CHECK-BE: vsldoi 3, 3, 3, 14
465 ; CHECK-BE: vinsertb 2, 3, 13
466 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 21, i32 14, i32 15>
467 ret <16 x i8> %vecins
470 define <16 x i8> @shuffle_vector_byte_14_30(<16 x i8> %a, <16 x i8> %b) {
472 ; CHECK-LABEL: shuffle_vector_byte_14_30
473 ; CHECK: vsldoi 3, 3, 3, 10
474 ; CHECK: vinsertb 2, 3, 1
475 ; CHECK-BE-LABEL: shuffle_vector_byte_14_30
476 ; CHECK-BE: vsldoi 3, 3, 3, 7
477 ; CHECK-BE: vinsertb 2, 3, 14
478 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 30, i32 15>
479 ret <16 x i8> %vecins
482 define <16 x i8> @shuffle_vector_byte_15_23(<16 x i8> %a, <16 x i8> %b) {
484 ; CHECK-LABEL: shuffle_vector_byte_15_23
485 ; CHECK: vsldoi 3, 3, 3, 1
486 ; CHECK: vinsertb 2, 3, 0
487 ; CHECK-BE-LABEL: shuffle_vector_byte_15_23
488 ; CHECK-BE: vinsertb 2, 3, 15
489 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 23>
490 ret <16 x i8> %vecins
493 ; The following testcases take one byte element from the first vector and
494 ; inserts it at various locations in the second vector
495 define <16 x i8> @shuffle_vector_byte_16_8(<16 x i8> %a, <16 x i8> %b) {
497 ; CHECK-LABEL: shuffle_vector_byte_16_8
498 ; CHECK: vinsertb 3, 2, 15
500 ; CHECK-BE-LABEL: shuffle_vector_byte_16_8
501 ; CHECK-BE: vsldoi 2, 2, 2, 1
502 ; CHECK-BE: vinsertb 3, 2, 0
504 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 8, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
505 ret <16 x i8> %vecins
508 define <16 x i8> @shuffle_vector_byte_17_1(<16 x i8> %a, <16 x i8> %b) {
510 ; CHECK-LABEL: shuffle_vector_byte_17_1
511 ; CHECK: vsldoi 2, 2, 2, 7
512 ; CHECK: vinsertb 3, 2, 14
514 ; CHECK-BE-LABEL: shuffle_vector_byte_17_1
515 ; CHECK-BE: vsldoi 2, 2, 2, 10
516 ; CHECK-BE: vinsertb 3, 2, 1
518 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 1, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
519 ret <16 x i8> %vecins
522 define <16 x i8> @shuffle_vector_byte_18_10(<16 x i8> %a, <16 x i8> %b) {
524 ; CHECK-LABEL: shuffle_vector_byte_18_10
525 ; CHECK: vsldoi 2, 2, 2, 14
526 ; CHECK: vinsertb 3, 2, 13
528 ; CHECK-BE-LABEL: shuffle_vector_byte_18_10
529 ; CHECK-BE: vsldoi 2, 2, 2, 3
530 ; CHECK-BE: vinsertb 3, 2, 2
532 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 10, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
533 ret <16 x i8> %vecins
536 define <16 x i8> @shuffle_vector_byte_19_3(<16 x i8> %a, <16 x i8> %b) {
538 ; CHECK-LABEL: shuffle_vector_byte_19_3
539 ; CHECK: vsldoi 2, 2, 2, 5
540 ; CHECK: vinsertb 3, 2, 12
542 ; CHECK-BE-LABEL: shuffle_vector_byte_19_3
543 ; CHECK-BE: vsldoi 2, 2, 2, 12
544 ; CHECK-BE: vinsertb 3, 2, 3
546 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 3, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
547 ret <16 x i8> %vecins
550 define <16 x i8> @shuffle_vector_byte_20_12(<16 x i8> %a, <16 x i8> %b) {
552 ; CHECK-LABEL: shuffle_vector_byte_20_12
553 ; CHECK: vsldoi 2, 2, 2, 12
554 ; CHECK: vinsertb 3, 2, 11
556 ; CHECK-BE-LABEL: shuffle_vector_byte_20_12
557 ; CHECK-BE: vsldoi 2, 2, 2, 5
558 ; CHECK-BE: vinsertb 3, 2, 4
560 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 12, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
561 ret <16 x i8> %vecins
564 define <16 x i8> @shuffle_vector_byte_21_5(<16 x i8> %a, <16 x i8> %b) {
566 ; CHECK-LABEL: shuffle_vector_byte_21_5
567 ; CHECK: vsldoi 2, 2, 2, 3
568 ; CHECK: vinsertb 3, 2, 10
570 ; CHECK-BE-LABEL: shuffle_vector_byte_21_5
571 ; CHECK-BE: vsldoi 2, 2, 2, 14
572 ; CHECK-BE: vinsertb 3, 2, 5
574 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 5, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
575 ret <16 x i8> %vecins
578 define <16 x i8> @shuffle_vector_byte_22_14(<16 x i8> %a, <16 x i8> %b) {
580 ; CHECK-LABEL: shuffle_vector_byte_22_14
581 ; CHECK: vsldoi 2, 2, 2, 10
582 ; CHECK: vinsertb 3, 2, 9
584 ; CHECK-BE-LABEL: shuffle_vector_byte_22_14
585 ; CHECK-BE: vsldoi 2, 2, 2, 7
586 ; CHECK-BE: vinsertb 3, 2, 6
588 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 14, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
589 ret <16 x i8> %vecins
592 define <16 x i8> @shuffle_vector_byte_23_7(<16 x i8> %a, <16 x i8> %b) {
594 ; CHECK-LABEL: shuffle_vector_byte_23_7
595 ; CHECK: vsldoi 2, 2, 2, 1
596 ; CHECK: vinsertb 3, 2, 8
598 ; CHECK-BE-LABEL: shuffle_vector_byte_23_7
599 ; CHECK-BE: vinsertb 3, 2, 7
601 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 7, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
602 ret <16 x i8> %vecins
605 define <16 x i8> @shuffle_vector_byte_24_0(<16 x i8> %a, <16 x i8> %b) {
607 ; CHECK-LABEL: shuffle_vector_byte_24_0
608 ; CHECK: vsldoi 2, 2, 2, 8
609 ; CHECK: vinsertb 3, 2, 7
611 ; CHECK-BE-LABEL: shuffle_vector_byte_24_0
612 ; CHECK-BE: vsldoi 2, 2, 2, 9
613 ; CHECK-BE: vinsertb 3, 2, 8
615 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 0, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
616 ret <16 x i8> %vecins
619 define <16 x i8> @shuffle_vector_byte_25_9(<16 x i8> %a, <16 x i8> %b) {
621 ; CHECK-LABEL: shuffle_vector_byte_25_9
622 ; CHECK: vsldoi 2, 2, 2, 15
623 ; CHECK: vinsertb 3, 2, 6
625 ; CHECK-BE-LABEL: shuffle_vector_byte_25_9
626 ; CHECK-BE: vsldoi 2, 2, 2, 2
627 ; CHECK-BE: vinsertb 3, 2, 9
629 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 9, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
630 ret <16 x i8> %vecins
633 define <16 x i8> @shuffle_vector_byte_26_2(<16 x i8> %a, <16 x i8> %b) {
635 ; CHECK-LABEL: shuffle_vector_byte_26_2
636 ; CHECK: vsldoi 2, 2, 2, 6
637 ; CHECK: vinsertb 3, 2, 5
639 ; CHECK-BE-LABEL: shuffle_vector_byte_26_2
640 ; CHECK-BE: vsldoi 2, 2, 2, 11
641 ; CHECK-BE: vinsertb 3, 2, 10
643 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 2, i32 27, i32 28, i32 29, i32 30, i32 31>
644 ret <16 x i8> %vecins
647 define <16 x i8> @shuffle_vector_byte_27_11(<16 x i8> %a, <16 x i8> %b) {
649 ; CHECK-LABEL: shuffle_vector_byte_27_11
650 ; CHECK: vsldoi 2, 2, 2, 13
651 ; CHECK: vinsertb 3, 2, 4
653 ; CHECK-BE-LABEL: shuffle_vector_byte_27_11
654 ; CHECK-BE: vsldoi 2, 2, 2, 4
655 ; CHECK-BE: vinsertb 3, 2, 11
657 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 11, i32 28, i32 29, i32 30, i32 31>
658 ret <16 x i8> %vecins
661 define <16 x i8> @shuffle_vector_byte_28_4(<16 x i8> %a, <16 x i8> %b) {
663 ; CHECK-LABEL: shuffle_vector_byte_28_4
664 ; CHECK: vsldoi 2, 2, 2, 4
665 ; CHECK: vinsertb 3, 2, 3
667 ; CHECK-BE-LABEL: shuffle_vector_byte_28_4
668 ; CHECK-BE: vsldoi 2, 2, 2, 13
669 ; CHECK-BE: vinsertb 3, 2, 12
671 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 4, i32 29, i32 30, i32 31>
672 ret <16 x i8> %vecins
675 define <16 x i8> @shuffle_vector_byte_29_13(<16 x i8> %a, <16 x i8> %b) {
677 ; CHECK-LABEL: shuffle_vector_byte_29_13
678 ; CHECK: vsldoi 2, 2, 2, 11
679 ; CHECK: vinsertb 3, 2, 2
681 ; CHECK-BE-LABEL: shuffle_vector_byte_29_13
682 ; CHECK-BE: vsldoi 2, 2, 2, 6
683 ; CHECK-BE: vinsertb 3, 2, 13
685 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 13, i32 30, i32 31>
686 ret <16 x i8> %vecins
689 define <16 x i8> @shuffle_vector_byte_30_6(<16 x i8> %a, <16 x i8> %b) {
691 ; CHECK-LABEL: shuffle_vector_byte_30_6
692 ; CHECK: vsldoi 2, 2, 2, 2
693 ; CHECK: vinsertb 3, 2, 1
695 ; CHECK-BE-LABEL: shuffle_vector_byte_30_6
696 ; CHECK-BE: vsldoi 2, 2, 2, 15
697 ; CHECK-BE: vinsertb 3, 2, 14
699 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 6, i32 31>
700 ret <16 x i8> %vecins
703 define <16 x i8> @shuffle_vector_byte_31_15(<16 x i8> %a, <16 x i8> %b) {
705 ; CHECK-LABEL: shuffle_vector_byte_31_15
706 ; CHECK: vsldoi 2, 2, 2, 9
707 ; CHECK: vinsertb 3, 2, 0
709 ; CHECK-BE-LABEL: shuffle_vector_byte_31_15
710 ; CHECK-BE: vsldoi 2, 2, 2, 8
711 ; CHECK-BE: vinsertb 3, 2, 15
713 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 15>
714 ret <16 x i8> %vecins
717 ; The following testcases use the same vector in both arguments of the
718 ; shufflevector. If byte element 7 in BE mode(or 8 in LE mode) is the one
719 ; we're attempting to insert, then we can use the vector insert instruction
720 define <16 x i8> @shuffle_vector_byte_0_7(<16 x i8> %a) {
722 ; CHECK-LABEL: shuffle_vector_byte_0_7
723 ; CHECK-NOT: vinsertb
724 ; CHECK-BE-LABEL: shuffle_vector_byte_0_7
725 ; CHECK-BE: vinsertb 2, 2, 0
726 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 7, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
727 ret <16 x i8> %vecins
730 define <16 x i8> @shuffle_vector_byte_1_8(<16 x i8> %a) {
732 ; CHECK-LABEL: shuffle_vector_byte_1_8
733 ; CHECK: vinsertb 2, 2, 14
734 ; CHECK-BE-LABEL: shuffle_vector_byte_1_8
735 ; CHECK-BE-NOT: vinsertb
736 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 8, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
737 ret <16 x i8> %vecins
740 define <16 x i8> @shuffle_vector_byte_2_8(<16 x i8> %a) {
742 ; CHECK-LABEL: shuffle_vector_byte_2_8
743 ; CHECK: vinsertb 2, 2, 13
744 ; CHECK-BE-LABEL: shuffle_vector_byte_2_8
745 ; CHECK-BE-NOT: vinsertb
746 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 8, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
747 ret <16 x i8> %vecins
750 define <16 x i8> @shuffle_vector_byte_3_7(<16 x i8> %a) {
752 ; CHECK-LABEL: shuffle_vector_byte_3_7
753 ; CHECK-NOT: vinsertb
754 ; CHECK-BE-LABEL: shuffle_vector_byte_3_7
755 ; CHECK-BE: vinsertb 2, 2, 3
756 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 7, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
757 ret <16 x i8> %vecins
760 define <16 x i8> @shuffle_vector_byte_4_7(<16 x i8> %a) {
762 ; CHECK-LABEL: shuffle_vector_byte_4_7
763 ; CHECK-NOT: vinsertb
764 ; CHECK-BE-LABEL: shuffle_vector_byte_4_7
765 ; CHECK-BE: vinsertb 2, 2, 4
766 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 7, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
767 ret <16 x i8> %vecins
770 define <16 x i8> @shuffle_vector_byte_5_8(<16 x i8> %a) {
772 ; CHECK-LABEL: shuffle_vector_byte_5_8
773 ; CHECK: vinsertb 2, 2, 10
774 ; CHECK-BE-LABEL: shuffle_vector_byte_5_8
775 ; CHECK-BE-NOT: vinsertb
776 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 8, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
777 ret <16 x i8> %vecins
780 define <16 x i8> @shuffle_vector_byte_6_8(<16 x i8> %a) {
782 ; CHECK-LABEL: shuffle_vector_byte_6_8
783 ; CHECK: vinsertb 2, 2, 9
784 ; CHECK-BE-LABEL: shuffle_vector_byte_6_8
785 ; CHECK-BE-NOT: vinsertb
786 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 8, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
787 ret <16 x i8> %vecins
790 define <16 x i8> @shuffle_vector_byte_7_8(<16 x i8> %a) {
792 ; CHECK-LABEL: shuffle_vector_byte_7_8
793 ; CHECK: vinsertb 2, 2, 8
794 ; CHECK-BE-LABEL: shuffle_vector_byte_7_8
795 ; CHECK-BE-NOT: vinsertb
796 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 8, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
797 ret <16 x i8> %vecins
800 define <16 x i8> @shuffle_vector_byte_8_7(<16 x i8> %a) {
802 ; CHECK-LABEL: shuffle_vector_byte_8_7
803 ; CHECK-NOT: vinsertb
804 ; CHECK-BE-LABEL: shuffle_vector_byte_8_7
805 ; CHECK-BE: vinsertb 2, 2, 8
806 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 7, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
807 ret <16 x i8> %vecins
810 define <16 x i8> @shuffle_vector_byte_9_7(<16 x i8> %a) {
812 ; CHECK-LABEL: shuffle_vector_byte_9_7
813 ; CHECK-NOT: vinsertb
814 ; CHECK-BE-LABEL: shuffle_vector_byte_9_7
815 ; CHECK-BE: vinsertb 2, 2, 9
816 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 7, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
817 ret <16 x i8> %vecins
820 define <16 x i8> @shuffle_vector_byte_10_7(<16 x i8> %a) {
822 ; CHECK-LABEL: shuffle_vector_byte_10_7
823 ; CHECK-NOT: vinsertb
824 ; CHECK-BE-LABEL: shuffle_vector_byte_10_7
825 ; CHECK-BE: vinsertb 2, 2, 10
826 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 7, i32 11, i32 12, i32 13, i32 14, i32 15>
827 ret <16 x i8> %vecins
830 define <16 x i8> @shuffle_vector_byte_11_8(<16 x i8> %a) {
832 ; CHECK-LABEL: shuffle_vector_byte_11_8
833 ; CHECK: vinsertb 2, 2, 4
834 ; CHECK-BE-LABEL: shuffle_vector_byte_11_8
835 ; CHECK-BE-NOT: vinsertb
836 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 8, i32 12, i32 13, i32 14, i32 15>
837 ret <16 x i8> %vecins
840 define <16 x i8> @shuffle_vector_byte_12_8(<16 x i8> %a) {
842 ; CHECK-LABEL: shuffle_vector_byte_12_8
843 ; CHECK: vinsertb 2, 2, 3
844 ; CHECK-BE-LABEL: shuffle_vector_byte_12_8
845 ; CHECK-BE-NOT: vinsertb
846 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 8, i32 13, i32 14, i32 15>
847 ret <16 x i8> %vecins
850 define <16 x i8> @shuffle_vector_byte_13_7(<16 x i8> %a) {
852 ; CHECK-LABEL: shuffle_vector_byte_13_7
853 ; CHECK-NOT: vinsertb
854 ; CHECK-BE-LABEL: shuffle_vector_byte_13_7
855 ; CHECK-BE: vinsertb 2, 2, 13
856 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 7, i32 14, i32 15>
857 ret <16 x i8> %vecins
860 define <16 x i8> @shuffle_vector_byte_14_7(<16 x i8> %a) {
862 ; CHECK-LABEL: shuffle_vector_byte_14_7
863 ; CHECK-NOT: vinsertb
864 ; CHECK-BE-LABEL: shuffle_vector_byte_14_7
865 ; CHECK-BE: vinsertb 2, 2, 14
866 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 7, i32 15>
867 ret <16 x i8> %vecins
870 define <16 x i8> @shuffle_vector_byte_15_8(<16 x i8> %a) {
872 ; CHECK-LABEL: shuffle_vector_byte_15_8
873 ; CHECK: vinsertb 2, 2, 0
874 ; CHECK-BE-LABEL: shuffle_vector_byte_15_8
875 ; CHECK-BE-NOT: vinsertb
876 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 8>
877 ret <16 x i8> %vecins
880 ; The following tests try to insert one halfword element into the vector. We
881 ; should always be using the 'vinserth' instruction.
882 define <8 x i16> @insert_halfword_0(<8 x i16> %a, i16 %b) {
884 ; CHECK-LABEL: insert_halfword_0
885 ; CHECK: vinserth 2, 3, 14
886 ; CHECK-BE-LABEL: insert_halfword_0
887 ; CHECK-BE: vinserth 2, 3, 0
888 %vecins = insertelement <8 x i16> %a, i16 %b, i32 0
889 ret <8 x i16> %vecins
892 define <8 x i16> @insert_halfword_1(<8 x i16> %a, i16 %b) {
894 ; CHECK-LABEL: insert_halfword_1
895 ; CHECK: vinserth 2, 3, 12
896 ; CHECK-BE-LABEL: insert_halfword_1
897 ; CHECK-BE: vinserth 2, 3, 2
898 %vecins = insertelement <8 x i16> %a, i16 %b, i32 1
899 ret <8 x i16> %vecins
902 define <8 x i16> @insert_halfword_2(<8 x i16> %a, i16 %b) {
904 ; CHECK-LABEL: insert_halfword_2
905 ; CHECK: vinserth 2, 3, 10
906 ; CHECK-BE-LABEL: insert_halfword_2
907 ; CHECK-BE: vinserth 2, 3, 4
908 %vecins = insertelement <8 x i16> %a, i16 %b, i32 2
909 ret <8 x i16> %vecins
912 define <8 x i16> @insert_halfword_3(<8 x i16> %a, i16 %b) {
914 ; CHECK-LABEL: insert_halfword_3
915 ; CHECK: vinserth 2, 3, 8
916 ; CHECK-BE-LABEL: insert_halfword_3
917 ; CHECK-BE: vinserth 2, 3, 6
918 %vecins = insertelement <8 x i16> %a, i16 %b, i32 3
919 ret <8 x i16> %vecins
922 define <8 x i16> @insert_halfword_4(<8 x i16> %a, i16 %b) {
924 ; CHECK-LABEL: insert_halfword_4
925 ; CHECK: vinserth 2, 3, 6
926 ; CHECK-BE-LABEL: insert_halfword_4
927 ; CHECK-BE: vinserth 2, 3, 8
928 %vecins = insertelement <8 x i16> %a, i16 %b, i32 4
929 ret <8 x i16> %vecins
932 define <8 x i16> @insert_halfword_5(<8 x i16> %a, i16 %b) {
934 ; CHECK-LABEL: insert_halfword_5
935 ; CHECK: vinserth 2, 3, 4
936 ; CHECK-BE-LABEL: insert_halfword_5
937 ; CHECK-BE: vinserth 2, 3, 10
938 %vecins = insertelement <8 x i16> %a, i16 %b, i32 5
939 ret <8 x i16> %vecins
942 define <8 x i16> @insert_halfword_6(<8 x i16> %a, i16 %b) {
944 ; CHECK-LABEL: insert_halfword_6
945 ; CHECK: vinserth 2, 3, 2
946 ; CHECK-BE-LABEL: insert_halfword_6
947 ; CHECK-BE: vinserth 2, 3, 12
948 %vecins = insertelement <8 x i16> %a, i16 %b, i32 6
949 ret <8 x i16> %vecins
952 define <8 x i16> @insert_halfword_7(<8 x i16> %a, i16 %b) {
954 ; CHECK-LABEL: insert_halfword_7
955 ; CHECK: vinserth 2, 3, 0
956 ; CHECK-BE-LABEL: insert_halfword_7
957 ; CHECK-BE: vinserth 2, 3, 14
958 %vecins = insertelement <8 x i16> %a, i16 %b, i32 7
959 ret <8 x i16> %vecins
962 ; The following tests try to insert one byte element into the vector. We
963 ; should always be using the 'vinsertb' instruction.
964 define <16 x i8> @insert_byte_0(<16 x i8> %a, i8 %b) {
966 ; CHECK-LABEL: insert_byte_0
967 ; CHECK: vinsertb 2, 3, 15
968 ; CHECK-BE-LABEL: insert_byte_0
969 ; CHECK-BE: vinsertb 2, 3, 0
970 %vecins = insertelement <16 x i8> %a, i8 %b, i32 0
971 ret <16 x i8> %vecins
974 define <16 x i8> @insert_byte_1(<16 x i8> %a, i8 %b) {
976 ; CHECK-LABEL: insert_byte_1
977 ; CHECK: vinsertb 2, 3, 14
978 ; CHECK-BE-LABEL: insert_byte_1
979 ; CHECK-BE: vinsertb 2, 3, 1
980 %vecins = insertelement <16 x i8> %a, i8 %b, i32 1
981 ret <16 x i8> %vecins
984 define <16 x i8> @insert_byte_2(<16 x i8> %a, i8 %b) {
986 ; CHECK-LABEL: insert_byte_2
987 ; CHECK: vinsertb 2, 3, 13
988 ; CHECK-BE-LABEL: insert_byte_2
989 ; CHECK-BE: vinsertb 2, 3, 2
990 %vecins = insertelement <16 x i8> %a, i8 %b, i32 2
991 ret <16 x i8> %vecins
994 define <16 x i8> @insert_byte_3(<16 x i8> %a, i8 %b) {
996 ; CHECK-LABEL: insert_byte_3
997 ; CHECK: vinsertb 2, 3, 12
998 ; CHECK-BE-LABEL: insert_byte_3
999 ; CHECK-BE: vinsertb 2, 3, 3
1000 %vecins = insertelement <16 x i8> %a, i8 %b, i32 3
1001 ret <16 x i8> %vecins
1004 define <16 x i8> @insert_byte_4(<16 x i8> %a, i8 %b) {
1006 ; CHECK-LABEL: insert_byte_4
1007 ; CHECK: vinsertb 2, 3, 11
1008 ; CHECK-BE-LABEL: insert_byte_4
1009 ; CHECK-BE: vinsertb 2, 3, 4
1010 %vecins = insertelement <16 x i8> %a, i8 %b, i32 4
1011 ret <16 x i8> %vecins
1014 define <16 x i8> @insert_byte_5(<16 x i8> %a, i8 %b) {
1016 ; CHECK-LABEL: insert_byte_5
1017 ; CHECK: vinsertb 2, 3, 10
1018 ; CHECK-BE-LABEL: insert_byte_5
1019 ; CHECK-BE: vinsertb 2, 3, 5
1020 %vecins = insertelement <16 x i8> %a, i8 %b, i32 5
1021 ret <16 x i8> %vecins
1024 define <16 x i8> @insert_byte_6(<16 x i8> %a, i8 %b) {
1026 ; CHECK-LABEL: insert_byte_6
1027 ; CHECK: vinsertb 2, 3, 9
1028 ; CHECK-BE-LABEL: insert_byte_6
1029 ; CHECK-BE: vinsertb 2, 3, 6
1030 %vecins = insertelement <16 x i8> %a, i8 %b, i32 6
1031 ret <16 x i8> %vecins
1034 define <16 x i8> @insert_byte_7(<16 x i8> %a, i8 %b) {
1036 ; CHECK-LABEL: insert_byte_7
1037 ; CHECK: vinsertb 2, 3, 8
1038 ; CHECK-BE-LABEL: insert_byte_7
1039 ; CHECK-BE: vinsertb 2, 3, 7
1040 %vecins = insertelement <16 x i8> %a, i8 %b, i32 7
1041 ret <16 x i8> %vecins
1044 define <16 x i8> @insert_byte_8(<16 x i8> %a, i8 %b) {
1046 ; CHECK-LABEL: insert_byte_8
1047 ; CHECK: vinsertb 2, 3, 7
1048 ; CHECK-BE-LABEL: insert_byte_8
1049 ; CHECK-BE: vinsertb 2, 3, 8
1050 %vecins = insertelement <16 x i8> %a, i8 %b, i32 8
1051 ret <16 x i8> %vecins
1054 define <16 x i8> @insert_byte_9(<16 x i8> %a, i8 %b) {
1056 ; CHECK-LABEL: insert_byte_9
1057 ; CHECK: vinsertb 2, 3, 6
1058 ; CHECK-BE-LABEL: insert_byte_9
1059 ; CHECK-BE: vinsertb 2, 3, 9
1060 %vecins = insertelement <16 x i8> %a, i8 %b, i32 9
1061 ret <16 x i8> %vecins
1064 define <16 x i8> @insert_byte_10(<16 x i8> %a, i8 %b) {
1066 ; CHECK-LABEL: insert_byte_10
1067 ; CHECK: vinsertb 2, 3, 5
1068 ; CHECK-BE-LABEL: insert_byte_10
1069 ; CHECK-BE: vinsertb 2, 3, 10
1070 %vecins = insertelement <16 x i8> %a, i8 %b, i32 10
1071 ret <16 x i8> %vecins
1074 define <16 x i8> @insert_byte_11(<16 x i8> %a, i8 %b) {
1076 ; CHECK-LABEL: insert_byte_11
1077 ; CHECK: vinsertb 2, 3, 4
1078 ; CHECK-BE-LABEL: insert_byte_11
1079 ; CHECK-BE: vinsertb 2, 3, 11
1080 %vecins = insertelement <16 x i8> %a, i8 %b, i32 11
1081 ret <16 x i8> %vecins
1084 define <16 x i8> @insert_byte_12(<16 x i8> %a, i8 %b) {
1086 ; CHECK-LABEL: insert_byte_12
1087 ; CHECK: vinsertb 2, 3, 3
1088 ; CHECK-BE-LABEL: insert_byte_12
1089 ; CHECK-BE: vinsertb 2, 3, 12
1090 %vecins = insertelement <16 x i8> %a, i8 %b, i32 12
1091 ret <16 x i8> %vecins
1094 define <16 x i8> @insert_byte_13(<16 x i8> %a, i8 %b) {
1096 ; CHECK-LABEL: insert_byte_13
1097 ; CHECK: vinsertb 2, 3, 2
1098 ; CHECK-BE-LABEL: insert_byte_13
1099 ; CHECK-BE: vinsertb 2, 3, 13
1100 %vecins = insertelement <16 x i8> %a, i8 %b, i32 13
1101 ret <16 x i8> %vecins
1104 define <16 x i8> @insert_byte_14(<16 x i8> %a, i8 %b) {
1106 ; CHECK-LABEL: insert_byte_14
1107 ; CHECK: vinsertb 2, 3, 1
1108 ; CHECK-BE-LABEL: insert_byte_14
1109 ; CHECK-BE: vinsertb 2, 3, 14
1110 %vecins = insertelement <16 x i8> %a, i8 %b, i32 14
1111 ret <16 x i8> %vecins
1114 define <16 x i8> @insert_byte_15(<16 x i8> %a, i8 %b) {
1116 ; CHECK-LABEL: insert_byte_15
1117 ; CHECK: vinsertb 2, 3, 0
1118 ; CHECK-BE-LABEL: insert_byte_15
1119 ; CHECK-BE: vinsertb 2, 3, 15
1120 %vecins = insertelement <16 x i8> %a, i8 %b, i32 15
1121 ret <16 x i8> %vecins