1 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 | FileCheck %s
2 ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 | FileCheck %s -check-prefix=CHECK-LE
4 ; The build[csilf] functions simply test the scalar_to_vector handling with
5 ; direct moves. This corresponds to the "insertelement" instruction. Subsequent
6 ; to this, there will be a splat corresponding to the shufflevector.
8 ; Function Attrs: nounwind
9 define <16 x i8> @buildc(i8 zeroext %a) {
11 %a.addr = alloca i8, align 1
12 store i8 %a, i8* %a.addr, align 1
13 %0 = load i8, i8* %a.addr, align 1
14 %splat.splatinsert = insertelement <16 x i8> undef, i8 %0, i32 0
15 %splat.splat = shufflevector <16 x i8> %splat.splatinsert, <16 x i8> undef, <16 x i32> zeroinitializer
16 ret <16 x i8> %splat.splat
17 ; CHECK: sldi [[REG1:[0-9]+]], 3, 56
18 ; CHECK: mtvsrd {{[0-9]+}}, [[REG1]]
19 ; CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
20 ; CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
23 ; Function Attrs: nounwind
24 define <8 x i16> @builds(i16 zeroext %a) {
26 %a.addr = alloca i16, align 2
27 store i16 %a, i16* %a.addr, align 2
28 %0 = load i16, i16* %a.addr, align 2
29 %splat.splatinsert = insertelement <8 x i16> undef, i16 %0, i32 0
30 %splat.splat = shufflevector <8 x i16> %splat.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer
31 ret <8 x i16> %splat.splat
32 ; CHECK: sldi [[REG1:[0-9]+]], 3, 48
33 ; CHECK: mtvsrd {{[0-9]+}}, [[REG1]]
34 ; CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
35 ; CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
38 ; Function Attrs: nounwind
39 define <4 x i32> @buildi(i32 zeroext %a) {
41 %a.addr = alloca i32, align 4
42 store i32 %a, i32* %a.addr, align 4
43 %0 = load i32, i32* %a.addr, align 4
44 %splat.splatinsert = insertelement <4 x i32> undef, i32 %0, i32 0
45 %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
46 ret <4 x i32> %splat.splat
47 ; CHECK: sldi [[REG1:[0-9]+]], 3, 32
48 ; CHECK: mtvsrd {{[0-9]+}}, [[REG1]]
49 ; CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
50 ; CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
53 ; Function Attrs: nounwind
54 define <2 x i64> @buildl(i64 %a) {
56 %a.addr = alloca i64, align 8
57 store i64 %a, i64* %a.addr, align 8
58 %0 = load i64, i64* %a.addr, align 8
59 %splat.splatinsert = insertelement <2 x i64> undef, i64 %0, i32 0
60 %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
61 ret <2 x i64> %splat.splat
62 ; FIXME-CHECK: mtvsrd {{[0-9]+}}, 3
63 ; FIXME-CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
64 ; FIXME-CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
67 ; Function Attrs: nounwind
68 define <4 x float> @buildf(float %a) {
70 %a.addr = alloca float, align 4
71 store float %a, float* %a.addr, align 4
72 %0 = load float, float* %a.addr, align 4
73 %splat.splatinsert = insertelement <4 x float> undef, float %0, i32 0
74 %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer
75 ret <4 x float> %splat.splat
76 ; CHECK: xscvdpspn {{[0-9]+}}, 1
77 ; CHECK-LE: xscvdpspn [[REG1:[0-9]+]], 1
78 ; CHECK-LE: xxsldwi {{[0-9]+}}, [[REG1]], [[REG1]], 1
81 ; Function Attrs: nounwind
82 define signext i8 @getsc0(<16 x i8> %vsc) {
84 %vsc.addr = alloca <16 x i8>, align 16
85 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
86 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
87 %vecext = extractelement <16 x i8> %0, i32 0
89 ; CHECK-LABEL: @getsc0
91 ; CHECK: rldicl 3, 3, 8, 56
93 ; CHECK-LE-LABEL: @getsc0
95 ; CHECK-LE: clrldi 3, 3, 56
96 ; CHECK-LE: extsb 3, 3
99 ; Function Attrs: nounwind
100 define signext i8 @getsc1(<16 x i8> %vsc) {
102 %vsc.addr = alloca <16 x i8>, align 16
103 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
104 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
105 %vecext = extractelement <16 x i8> %0, i32 1
107 ; CHECK-LABEL: @getsc1
108 ; CHECK: mfvsrd 3, 34
109 ; CHECK: rldicl 3, 3, 16, 56
111 ; CHECK-LE-LABEL: @getsc1
112 ; CHECK-LE: mfvsrd 3,
113 ; CHECK-LE: rldicl 3, 3, 56, 56
114 ; CHECK-LE: extsb 3, 3
117 ; Function Attrs: nounwind
118 define signext i8 @getsc2(<16 x i8> %vsc) {
120 %vsc.addr = alloca <16 x i8>, align 16
121 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
122 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
123 %vecext = extractelement <16 x i8> %0, i32 2
125 ; CHECK-LABEL: @getsc2
126 ; CHECK: mfvsrd 3, 34
127 ; CHECK: rldicl 3, 3, 24, 56
129 ; CHECK-LE-LABEL: @getsc2
130 ; CHECK-LE: mfvsrd 3,
131 ; CHECK-LE: rldicl 3, 3, 48, 56
132 ; CHECK-LE: extsb 3, 3
135 ; Function Attrs: nounwind
136 define signext i8 @getsc3(<16 x i8> %vsc) {
138 %vsc.addr = alloca <16 x i8>, align 16
139 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
140 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
141 %vecext = extractelement <16 x i8> %0, i32 3
143 ; CHECK-LABEL: @getsc3
144 ; CHECK: mfvsrd 3, 34
145 ; CHECK: rldicl 3, 3, 32, 56
147 ; CHECK-LE-LABEL: @getsc3
148 ; CHECK-LE: mfvsrd 3,
149 ; CHECK-LE: rldicl 3, 3, 40, 56
150 ; CHECK-LE: extsb 3, 3
153 ; Function Attrs: nounwind
154 define signext i8 @getsc4(<16 x i8> %vsc) {
156 %vsc.addr = alloca <16 x i8>, align 16
157 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
158 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
159 %vecext = extractelement <16 x i8> %0, i32 4
161 ; CHECK-LABEL: @getsc4
162 ; CHECK: mfvsrd 3, 34
163 ; CHECK: rldicl 3, 3, 40, 56
165 ; CHECK-LE-LABEL: @getsc4
166 ; CHECK-LE: mfvsrd 3,
167 ; CHECK-LE: rldicl 3, 3, 32, 56
168 ; CHECK-LE: extsb 3, 3
171 ; Function Attrs: nounwind
172 define signext i8 @getsc5(<16 x i8> %vsc) {
174 %vsc.addr = alloca <16 x i8>, align 16
175 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
176 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
177 %vecext = extractelement <16 x i8> %0, i32 5
179 ; CHECK-LABEL: @getsc5
180 ; CHECK: mfvsrd 3, 34
181 ; CHECK: rldicl 3, 3, 48, 56
183 ; CHECK-LE-LABEL: @getsc5
184 ; CHECK-LE: mfvsrd 3,
185 ; CHECK-LE: rldicl 3, 3, 24, 56
186 ; CHECK-LE: extsb 3, 3
189 ; Function Attrs: nounwind
190 define signext i8 @getsc6(<16 x i8> %vsc) {
192 %vsc.addr = alloca <16 x i8>, align 16
193 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
194 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
195 %vecext = extractelement <16 x i8> %0, i32 6
197 ; CHECK-LABEL: @getsc6
198 ; CHECK: mfvsrd 3, 34
199 ; CHECK: rldicl 3, 3, 56, 56
201 ; CHECK-LE-LABEL: @getsc6
202 ; CHECK-LE: mfvsrd 3,
203 ; CHECK-LE: rldicl 3, 3, 16, 56
204 ; CHECK-LE: extsb 3, 3
207 ; Function Attrs: nounwind
208 define signext i8 @getsc7(<16 x i8> %vsc) {
210 %vsc.addr = alloca <16 x i8>, align 16
211 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
212 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
213 %vecext = extractelement <16 x i8> %0, i32 7
215 ; CHECK-LABEL: @getsc7
216 ; CHECK: mfvsrd 3, 34
217 ; CHECK: clrldi 3, 3, 56
219 ; CHECK-LE-LABEL: @getsc7
220 ; CHECK-LE: mfvsrd 3,
221 ; CHECK-LE: rldicl 3, 3, 8, 56
222 ; CHECK-LE: extsb 3, 3
225 ; Function Attrs: nounwind
226 define signext i8 @getsc8(<16 x i8> %vsc) {
228 %vsc.addr = alloca <16 x i8>, align 16
229 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
230 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
231 %vecext = extractelement <16 x i8> %0, i32 8
233 ; CHECK-LABEL: @getsc8
235 ; CHECK: rldicl 3, 3, 8, 56
237 ; CHECK-LE-LABEL: @getsc8
238 ; CHECK-LE: mfvsrd 3, 34
239 ; CHECK-LE: clrldi 3, 3, 56
240 ; CHECK-LE: extsb 3, 3
243 ; Function Attrs: nounwind
244 define signext i8 @getsc9(<16 x i8> %vsc) {
246 %vsc.addr = alloca <16 x i8>, align 16
247 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
248 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
249 %vecext = extractelement <16 x i8> %0, i32 9
251 ; CHECK-LABEL: @getsc9
253 ; CHECK: rldicl 3, 3, 16, 56
255 ; CHECK-LE-LABEL: @getsc9
256 ; CHECK-LE: mfvsrd 3, 34
257 ; CHECK-LE: rldicl 3, 3, 56, 56
258 ; CHECK-LE: extsb 3, 3
261 ; Function Attrs: nounwind
262 define signext i8 @getsc10(<16 x i8> %vsc) {
264 %vsc.addr = alloca <16 x i8>, align 16
265 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
266 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
267 %vecext = extractelement <16 x i8> %0, i32 10
269 ; CHECK-LABEL: @getsc10
271 ; CHECK: rldicl 3, 3, 24, 56
273 ; CHECK-LE-LABEL: @getsc10
274 ; CHECK-LE: mfvsrd 3, 34
275 ; CHECK-LE: rldicl 3, 3, 48, 56
276 ; CHECK-LE: extsb 3, 3
279 ; Function Attrs: nounwind
280 define signext i8 @getsc11(<16 x i8> %vsc) {
282 %vsc.addr = alloca <16 x i8>, align 16
283 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
284 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
285 %vecext = extractelement <16 x i8> %0, i32 11
287 ; CHECK-LABEL: @getsc11
289 ; CHECK: rldicl 3, 3, 32, 56
291 ; CHECK-LE-LABEL: @getsc11
292 ; CHECK-LE: mfvsrd 3, 34
293 ; CHECK-LE: rldicl 3, 3, 40, 56
294 ; CHECK-LE: extsb 3, 3
297 ; Function Attrs: nounwind
298 define signext i8 @getsc12(<16 x i8> %vsc) {
300 %vsc.addr = alloca <16 x i8>, align 16
301 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
302 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
303 %vecext = extractelement <16 x i8> %0, i32 12
305 ; CHECK-LABEL: @getsc12
307 ; CHECK: rldicl 3, 3, 40, 56
309 ; CHECK-LE-LABEL: @getsc12
310 ; CHECK-LE: mfvsrd 3, 34
311 ; CHECK-LE: rldicl 3, 3, 32, 56
312 ; CHECK-LE: extsb 3, 3
315 ; Function Attrs: nounwind
316 define signext i8 @getsc13(<16 x i8> %vsc) {
318 %vsc.addr = alloca <16 x i8>, align 16
319 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
320 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
321 %vecext = extractelement <16 x i8> %0, i32 13
323 ; CHECK-LABEL: @getsc13
325 ; CHECK: rldicl 3, 3, 48, 56
327 ; CHECK-LE-LABEL: @getsc13
328 ; CHECK-LE: mfvsrd 3, 34
329 ; CHECK-LE: rldicl 3, 3, 24, 56
330 ; CHECK-LE: extsb 3, 3
333 ; Function Attrs: nounwind
334 define signext i8 @getsc14(<16 x i8> %vsc) {
336 %vsc.addr = alloca <16 x i8>, align 16
337 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
338 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
339 %vecext = extractelement <16 x i8> %0, i32 14
341 ; CHECK-LABEL: @getsc14
343 ; CHECK: rldicl 3, 3, 56, 56
345 ; CHECK-LE-LABEL: @getsc14
346 ; CHECK-LE: mfvsrd 3, 34
347 ; CHECK-LE: rldicl 3, 3, 16, 56
348 ; CHECK-LE: extsb 3, 3
351 ; Function Attrs: nounwind
352 define signext i8 @getsc15(<16 x i8> %vsc) {
354 %vsc.addr = alloca <16 x i8>, align 16
355 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
356 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
357 %vecext = extractelement <16 x i8> %0, i32 15
359 ; CHECK-LABEL: @getsc15
362 ; CHECK-LE-LABEL: @getsc15
363 ; CHECK-LE: mfvsrd 3, 34
364 ; CHECK-LE: rldicl 3, 3, 8, 56
365 ; CHECK-LE: extsb 3, 3
368 ; Function Attrs: nounwind
369 define zeroext i8 @getuc0(<16 x i8> %vuc) {
371 %vuc.addr = alloca <16 x i8>, align 16
372 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
373 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
374 %vecext = extractelement <16 x i8> %0, i32 0
376 ; CHECK-LABEL: @getuc0
377 ; CHECK: mfvsrd 3, 34
378 ; CHECK: rldicl 3, 3, 8, 56
379 ; CHECK: clrldi 3, 3, 56
380 ; CHECK-LE-LABEL: @getuc0
381 ; CHECK-LE: mfvsrd 3,
382 ; CHECK-LE: clrldi 3, 3, 56
385 ; Function Attrs: nounwind
386 define zeroext i8 @getuc1(<16 x i8> %vuc) {
388 %vuc.addr = alloca <16 x i8>, align 16
389 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
390 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
391 %vecext = extractelement <16 x i8> %0, i32 1
393 ; CHECK-LABEL: @getuc1
394 ; CHECK: mfvsrd 3, 34
395 ; CHECK: rldicl 3, 3, 16, 56
396 ; CHECK: clrldi 3, 3, 56
397 ; CHECK-LE-LABEL: @getuc1
398 ; CHECK-LE: mfvsrd 3,
399 ; CHECK-LE: rldicl 3, 3, 56, 56
400 ; CHECK-LE: clrldi 3, 3, 56
403 ; Function Attrs: nounwind
404 define zeroext i8 @getuc2(<16 x i8> %vuc) {
406 %vuc.addr = alloca <16 x i8>, align 16
407 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
408 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
409 %vecext = extractelement <16 x i8> %0, i32 2
411 ; CHECK-LABEL: @getuc2
412 ; CHECK: mfvsrd 3, 34
413 ; CHECK: rldicl 3, 3, 24, 56
414 ; CHECK: clrldi 3, 3, 56
415 ; CHECK-LE-LABEL: @getuc2
416 ; CHECK-LE: mfvsrd 3,
417 ; CHECK-LE: rldicl 3, 3, 48, 56
418 ; CHECK-LE: clrldi 3, 3, 56
421 ; Function Attrs: nounwind
422 define zeroext i8 @getuc3(<16 x i8> %vuc) {
424 %vuc.addr = alloca <16 x i8>, align 16
425 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
426 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
427 %vecext = extractelement <16 x i8> %0, i32 3
429 ; CHECK-LABEL: @getuc3
430 ; CHECK: mfvsrd 3, 34
431 ; CHECK: rldicl 3, 3, 32, 56
432 ; CHECK: clrldi 3, 3, 56
433 ; CHECK-LE-LABEL: @getuc3
434 ; CHECK-LE: mfvsrd 3,
435 ; CHECK-LE: rldicl 3, 3, 40, 56
436 ; CHECK-LE: clrldi 3, 3, 56
439 ; Function Attrs: nounwind
440 define zeroext i8 @getuc4(<16 x i8> %vuc) {
442 %vuc.addr = alloca <16 x i8>, align 16
443 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
444 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
445 %vecext = extractelement <16 x i8> %0, i32 4
447 ; CHECK-LABEL: @getuc4
448 ; CHECK: mfvsrd 3, 34
449 ; CHECK: rldicl 3, 3, 40, 56
450 ; CHECK: clrldi 3, 3, 56
451 ; CHECK-LE-LABEL: @getuc4
452 ; CHECK-LE: mfvsrd 3,
453 ; CHECK-LE: rldicl 3, 3, 32, 56
454 ; CHECK-LE: clrldi 3, 3, 56
457 ; Function Attrs: nounwind
458 define zeroext i8 @getuc5(<16 x i8> %vuc) {
460 %vuc.addr = alloca <16 x i8>, align 16
461 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
462 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
463 %vecext = extractelement <16 x i8> %0, i32 5
465 ; CHECK-LABEL: @getuc5
466 ; CHECK: mfvsrd 3, 34
467 ; CHECK: rldicl 3, 3, 48, 56
468 ; CHECK: clrldi 3, 3, 56
469 ; CHECK-LE-LABEL: @getuc5
470 ; CHECK-LE: mfvsrd 3,
471 ; CHECK-LE: rldicl 3, 3, 24, 56
472 ; CHECK-LE: clrldi 3, 3, 56
475 ; Function Attrs: nounwind
476 define zeroext i8 @getuc6(<16 x i8> %vuc) {
478 %vuc.addr = alloca <16 x i8>, align 16
479 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
480 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
481 %vecext = extractelement <16 x i8> %0, i32 6
483 ; CHECK-LABEL: @getuc6
484 ; CHECK: mfvsrd 3, 34
485 ; CHECK: rldicl 3, 3, 56, 56
486 ; CHECK: clrldi 3, 3, 56
487 ; CHECK-LE-LABEL: @getuc6
488 ; CHECK-LE: mfvsrd 3,
489 ; CHECK-LE: rldicl 3, 3, 16, 56
490 ; CHECK-LE: clrldi 3, 3, 56
493 ; Function Attrs: nounwind
494 define zeroext i8 @getuc7(<16 x i8> %vuc) {
496 %vuc.addr = alloca <16 x i8>, align 16
497 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
498 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
499 %vecext = extractelement <16 x i8> %0, i32 7
501 ; CHECK-LABEL: @getuc7
502 ; CHECK: mfvsrd 3, 34
503 ; CHECK: clrldi 3, 3, 56
504 ; CHECK-LE-LABEL: @getuc7
505 ; CHECK-LE: mfvsrd 3,
506 ; CHECK-LE: rldicl 3, 3, 8, 56
507 ; CHECK-LE: clrldi 3, 3, 56
510 ; Function Attrs: nounwind
511 define zeroext i8 @getuc8(<16 x i8> %vuc) {
513 %vuc.addr = alloca <16 x i8>, align 16
514 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
515 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
516 %vecext = extractelement <16 x i8> %0, i32 8
518 ; CHECK-LABEL: @getuc8
520 ; CHECK: rldicl 3, 3, 8, 56
521 ; CHECK: clrldi 3, 3, 56
522 ; CHECK-LE-LABEL: @getuc8
523 ; CHECK-LE: mfvsrd 3, 34
524 ; CHECK-LE: clrldi 3, 3, 56
527 ; Function Attrs: nounwind
528 define zeroext i8 @getuc9(<16 x i8> %vuc) {
530 %vuc.addr = alloca <16 x i8>, align 16
531 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
532 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
533 %vecext = extractelement <16 x i8> %0, i32 9
535 ; CHECK-LABEL: @getuc9
537 ; CHECK: rldicl 3, 3, 16, 56
538 ; CHECK: clrldi 3, 3, 56
539 ; CHECK-LE-LABEL: @getuc9
540 ; CHECK-LE: mfvsrd 3, 34
541 ; CHECK-LE: rldicl 3, 3, 56, 56
542 ; CHECK-LE: clrldi 3, 3, 56
545 ; Function Attrs: nounwind
546 define zeroext i8 @getuc10(<16 x i8> %vuc) {
548 %vuc.addr = alloca <16 x i8>, align 16
549 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
550 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
551 %vecext = extractelement <16 x i8> %0, i32 10
553 ; CHECK-LABEL: @getuc10
555 ; CHECK: rldicl 3, 3, 24, 56
556 ; CHECK: clrldi 3, 3, 56
557 ; CHECK-LE-LABEL: @getuc10
558 ; CHECK-LE: mfvsrd 3, 34
559 ; CHECK-LE: rldicl 3, 3, 48, 56
560 ; CHECK-LE: clrldi 3, 3, 56
563 ; Function Attrs: nounwind
564 define zeroext i8 @getuc11(<16 x i8> %vuc) {
566 %vuc.addr = alloca <16 x i8>, align 16
567 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
568 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
569 %vecext = extractelement <16 x i8> %0, i32 11
571 ; CHECK-LABEL: @getuc11
573 ; CHECK: rldicl 3, 3, 32, 56
574 ; CHECK: clrldi 3, 3, 56
575 ; CHECK-LE-LABEL: @getuc11
576 ; CHECK-LE: mfvsrd 3, 34
577 ; CHECK-LE: rldicl 3, 3, 40, 56
578 ; CHECK-LE: clrldi 3, 3, 56
581 ; Function Attrs: nounwind
582 define zeroext i8 @getuc12(<16 x i8> %vuc) {
584 %vuc.addr = alloca <16 x i8>, align 16
585 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
586 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
587 %vecext = extractelement <16 x i8> %0, i32 12
589 ; CHECK-LABEL: @getuc12
591 ; CHECK: rldicl 3, 3, 40, 56
592 ; CHECK: clrldi 3, 3, 56
593 ; CHECK-LE-LABEL: @getuc12
594 ; CHECK-LE: mfvsrd 3, 34
595 ; CHECK-LE: rldicl 3, 3, 32, 56
596 ; CHECK-LE: clrldi 3, 3, 56
599 ; Function Attrs: nounwind
600 define zeroext i8 @getuc13(<16 x i8> %vuc) {
602 %vuc.addr = alloca <16 x i8>, align 16
603 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
604 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
605 %vecext = extractelement <16 x i8> %0, i32 13
607 ; CHECK-LABEL: @getuc13
609 ; CHECK: rldicl 3, 3, 48, 56
610 ; CHECK: clrldi 3, 3, 56
611 ; CHECK-LE-LABEL: @getuc13
612 ; CHECK-LE: mfvsrd 3, 34
613 ; CHECK-LE: rldicl 3, 3, 24, 56
614 ; CHECK-LE: clrldi 3, 3, 56
617 ; Function Attrs: nounwind
618 define zeroext i8 @getuc14(<16 x i8> %vuc) {
620 %vuc.addr = alloca <16 x i8>, align 16
621 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
622 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
623 %vecext = extractelement <16 x i8> %0, i32 14
625 ; CHECK-LABEL: @getuc14
627 ; CHECK: rldicl 3, 3, 56, 56
628 ; CHECK: clrldi 3, 3, 56
629 ; CHECK-LE-LABEL: @getuc14
630 ; CHECK-LE: mfvsrd 3, 34
631 ; CHECK-LE: rldicl 3, 3, 16, 56
632 ; CHECK-LE: clrldi 3, 3, 56
635 ; Function Attrs: nounwind
636 define zeroext i8 @getuc15(<16 x i8> %vuc) {
638 %vuc.addr = alloca <16 x i8>, align 16
639 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
640 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
641 %vecext = extractelement <16 x i8> %0, i32 15
643 ; CHECK-LABEL: @getuc15
645 ; CHECK: clrldi 3, 3, 56
646 ; CHECK-LE-LABEL: @getuc15
647 ; CHECK-LE: mfvsrd 3, 34
648 ; CHECK-LE: rldicl 3, 3, 8, 56
649 ; CHECK-LE: clrldi 3, 3, 56
652 ; Function Attrs: nounwind
653 define signext i8 @getvelsc(<16 x i8> %vsc, i32 signext %i) {
655 %vsc.addr = alloca <16 x i8>, align 16
656 %i.addr = alloca i32, align 4
657 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
658 store i32 %i, i32* %i.addr, align 4
659 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
660 %1 = load i32, i32* %i.addr, align 4
661 %vecext = extractelement <16 x i8> %0, i32 %1
663 ; CHECK-LABEL: @getvelsc
664 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 8
665 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[ANDI]]
666 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
667 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
668 ; CHECK-DAG: li [[IMM7:[0-9]+]], 7
669 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM7]]
670 ; CHECK-DAG: sldi [[SHL:[0-9]+]], [[ANDC]], 3
671 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
672 ; CHECK-DAG: extsb 3, 3
673 ; CHECK-LE-LABEL: @getvelsc
674 ; CHECK-DAG-LE: li [[IMM8:[0-9]+]], 8
675 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM8]]
676 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[ANDC]]
677 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
678 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
679 ; CHECK-DAG-LE: li [[IMM7:[0-9]+]], 7
680 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM7]]
681 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 3
682 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
683 ; CHECK-DAG-LE: extsb 3, 3
686 ; Function Attrs: nounwind
687 define zeroext i8 @getveluc(<16 x i8> %vuc, i32 signext %i) {
689 %vuc.addr = alloca <16 x i8>, align 16
690 %i.addr = alloca i32, align 4
691 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
692 store i32 %i, i32* %i.addr, align 4
693 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
694 %1 = load i32, i32* %i.addr, align 4
695 %vecext = extractelement <16 x i8> %0, i32 %1
697 ; CHECK-LABEL: @getveluc
698 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 8
699 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[ANDI]]
700 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
701 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
702 ; CHECK-DAG: li [[IMM7:[0-9]+]], 7
703 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM7]]
704 ; CHECK-DAG: sldi [[SHL:[0-9]+]], [[ANDC]], 3
705 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
706 ; CHECK-DAG: clrldi 3, 3, 56
707 ; CHECK-LE-LABEL: @getveluc
708 ; CHECK-DAG-LE: li [[IMM8:[0-9]+]], 8
709 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM8]]
710 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[ANDC]]
711 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
712 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
713 ; CHECK-DAG-LE: li [[IMM7:[0-9]+]], 7
714 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM7]]
715 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 3
716 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
717 ; CHECK-DAG-LE: clrldi 3, 3, 56
720 ; Function Attrs: nounwind
721 define signext i16 @getss0(<8 x i16> %vss) {
723 %vss.addr = alloca <8 x i16>, align 16
724 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
725 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
726 %vecext = extractelement <8 x i16> %0, i32 0
728 ; CHECK-LABEL: @getss0
729 ; CHECK: mfvsrd 3, 34
730 ; CHECK: rldicl 3, 3, 16, 48
732 ; CHECK-LE-LABEL: @getss0
733 ; CHECK-LE: mfvsrd 3,
734 ; CHECK-LE: clrldi 3, 3, 48
735 ; CHECK-LE: extsh 3, 3
738 ; Function Attrs: nounwind
739 define signext i16 @getss1(<8 x i16> %vss) {
741 %vss.addr = alloca <8 x i16>, align 16
742 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
743 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
744 %vecext = extractelement <8 x i16> %0, i32 1
746 ; CHECK-LABEL: @getss1
747 ; CHECK: mfvsrd 3, 34
748 ; CHECK: rldicl 3, 3, 32, 48
750 ; CHECK-LE-LABEL: @getss1
751 ; CHECK-LE: mfvsrd 3,
752 ; CHECK-LE: rldicl 3, 3, 48, 48
753 ; CHECK-LE: extsh 3, 3
756 ; Function Attrs: nounwind
757 define signext i16 @getss2(<8 x i16> %vss) {
759 %vss.addr = alloca <8 x i16>, align 16
760 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
761 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
762 %vecext = extractelement <8 x i16> %0, i32 2
764 ; CHECK-LABEL: @getss2
765 ; CHECK: mfvsrd 3, 34
766 ; CHECK: rldicl 3, 3, 48, 48
768 ; CHECK-LE-LABEL: @getss2
769 ; CHECK-LE: mfvsrd 3,
770 ; CHECK-LE: rldicl 3, 3, 32, 48
771 ; CHECK-LE: extsh 3, 3
774 ; Function Attrs: nounwind
775 define signext i16 @getss3(<8 x i16> %vss) {
777 %vss.addr = alloca <8 x i16>, align 16
778 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
779 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
780 %vecext = extractelement <8 x i16> %0, i32 3
782 ; CHECK-LABEL: @getss3
783 ; CHECK: mfvsrd 3, 34
784 ; CHECK: clrldi 3, 3, 48
786 ; CHECK-LE-LABEL: @getss3
787 ; CHECK-LE: mfvsrd 3,
788 ; CHECK-LE: rldicl 3, 3, 16, 48
789 ; CHECK-LE: extsh 3, 3
792 ; Function Attrs: nounwind
793 define signext i16 @getss4(<8 x i16> %vss) {
795 %vss.addr = alloca <8 x i16>, align 16
796 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
797 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
798 %vecext = extractelement <8 x i16> %0, i32 4
800 ; CHECK-LABEL: @getss4
802 ; CHECK: rldicl 3, 3, 16, 48
804 ; CHECK-LE-LABEL: @getss4
805 ; CHECK-LE: mfvsrd 3, 34
806 ; CHECK-LE: clrldi 3, 3, 48
807 ; CHECK-LE: extsh 3, 3
810 ; Function Attrs: nounwind
811 define signext i16 @getss5(<8 x i16> %vss) {
813 %vss.addr = alloca <8 x i16>, align 16
814 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
815 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
816 %vecext = extractelement <8 x i16> %0, i32 5
818 ; CHECK-LABEL: @getss5
820 ; CHECK: rldicl 3, 3, 32, 48
822 ; CHECK-LE-LABEL: @getss5
823 ; CHECK-LE: mfvsrd 3, 34
824 ; CHECK-LE: rldicl 3, 3, 48, 48
825 ; CHECK-LE: extsh 3, 3
828 ; Function Attrs: nounwind
829 define signext i16 @getss6(<8 x i16> %vss) {
831 %vss.addr = alloca <8 x i16>, align 16
832 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
833 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
834 %vecext = extractelement <8 x i16> %0, i32 6
836 ; CHECK-LABEL: @getss6
838 ; CHECK: rldicl 3, 3, 48, 48
840 ; CHECK-LE-LABEL: @getss6
841 ; CHECK-LE: mfvsrd 3, 34
842 ; CHECK-LE: rldicl 3, 3, 32, 48
843 ; CHECK-LE: extsh 3, 3
846 ; Function Attrs: nounwind
847 define signext i16 @getss7(<8 x i16> %vss) {
849 %vss.addr = alloca <8 x i16>, align 16
850 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
851 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
852 %vecext = extractelement <8 x i16> %0, i32 7
854 ; CHECK-LABEL: @getss7
857 ; CHECK-LE-LABEL: @getss7
858 ; CHECK-LE: mfvsrd 3, 34
859 ; CHECK-LE: rldicl 3, 3, 16, 48
860 ; CHECK-LE: extsh 3, 3
863 ; Function Attrs: nounwind
864 define zeroext i16 @getus0(<8 x i16> %vus) {
866 %vus.addr = alloca <8 x i16>, align 16
867 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
868 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
869 %vecext = extractelement <8 x i16> %0, i32 0
871 ; CHECK-LABEL: @getus0
872 ; CHECK: mfvsrd 3, 34
873 ; CHECK: rldicl 3, 3, 16, 48
874 ; CHECK: clrldi 3, 3, 48
875 ; CHECK-LE-LABEL: @getus0
876 ; CHECK-LE: mfvsrd 3,
877 ; CHECK-LE: clrldi 3, 3, 48
880 ; Function Attrs: nounwind
881 define zeroext i16 @getus1(<8 x i16> %vus) {
883 %vus.addr = alloca <8 x i16>, align 16
884 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
885 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
886 %vecext = extractelement <8 x i16> %0, i32 1
888 ; CHECK-LABEL: @getus1
889 ; CHECK: mfvsrd 3, 34
890 ; CHECK: rldicl 3, 3, 32, 48
891 ; CHECK: clrldi 3, 3, 48
892 ; CHECK-LE-LABEL: @getus1
893 ; CHECK-LE: mfvsrd 3,
894 ; CHECK-LE: rldicl 3, 3, 48, 48
895 ; CHECK-LE: clrldi 3, 3, 48
898 ; Function Attrs: nounwind
899 define zeroext i16 @getus2(<8 x i16> %vus) {
901 %vus.addr = alloca <8 x i16>, align 16
902 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
903 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
904 %vecext = extractelement <8 x i16> %0, i32 2
906 ; CHECK-LABEL: @getus2
907 ; CHECK: mfvsrd 3, 34
908 ; CHECK: rldicl 3, 3, 48, 48
909 ; CHECK: clrldi 3, 3, 48
910 ; CHECK-LE-LABEL: @getus2
911 ; CHECK-LE: mfvsrd 3,
912 ; CHECK-LE: rldicl 3, 3, 32, 48
913 ; CHECK-LE: clrldi 3, 3, 48
916 ; Function Attrs: nounwind
917 define zeroext i16 @getus3(<8 x i16> %vus) {
919 %vus.addr = alloca <8 x i16>, align 16
920 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
921 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
922 %vecext = extractelement <8 x i16> %0, i32 3
924 ; CHECK-LABEL: @getus3
925 ; CHECK: mfvsrd 3, 34
926 ; CHECK: clrldi 3, 3, 48
927 ; CHECK-LE-LABEL: @getus3
928 ; CHECK-LE: mfvsrd 3,
929 ; CHECK-LE: rldicl 3, 3, 16, 48
930 ; CHECK-LE: clrldi 3, 3, 48
933 ; Function Attrs: nounwind
934 define zeroext i16 @getus4(<8 x i16> %vus) {
936 %vus.addr = alloca <8 x i16>, align 16
937 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
938 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
939 %vecext = extractelement <8 x i16> %0, i32 4
941 ; CHECK-LABEL: @getus4
943 ; CHECK: rldicl 3, 3, 16, 48
944 ; CHECK: clrldi 3, 3, 48
945 ; CHECK-LE-LABEL: @getus4
946 ; CHECK-LE: mfvsrd 3, 34
947 ; CHECK-LE: clrldi 3, 3, 48
950 ; Function Attrs: nounwind
951 define zeroext i16 @getus5(<8 x i16> %vus) {
953 %vus.addr = alloca <8 x i16>, align 16
954 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
955 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
956 %vecext = extractelement <8 x i16> %0, i32 5
958 ; CHECK-LABEL: @getus5
960 ; CHECK: rldicl 3, 3, 32, 48
961 ; CHECK: clrldi 3, 3, 48
962 ; CHECK-LE-LABEL: @getus5
963 ; CHECK-LE: mfvsrd 3, 34
964 ; CHECK-LE: rldicl 3, 3, 48, 48
965 ; CHECK-LE: clrldi 3, 3, 48
968 ; Function Attrs: nounwind
969 define zeroext i16 @getus6(<8 x i16> %vus) {
971 %vus.addr = alloca <8 x i16>, align 16
972 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
973 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
974 %vecext = extractelement <8 x i16> %0, i32 6
976 ; CHECK-LABEL: @getus6
978 ; CHECK: rldicl 3, 3, 48, 48
979 ; CHECK: clrldi 3, 3, 48
980 ; CHECK-LE-LABEL: @getus6
981 ; CHECK-LE: mfvsrd 3, 34
982 ; CHECK-LE: rldicl 3, 3, 32, 48
983 ; CHECK-LE: clrldi 3, 3, 48
986 ; Function Attrs: nounwind
987 define zeroext i16 @getus7(<8 x i16> %vus) {
989 %vus.addr = alloca <8 x i16>, align 16
990 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
991 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
992 %vecext = extractelement <8 x i16> %0, i32 7
994 ; CHECK-LABEL: @getus7
996 ; CHECK: clrldi 3, 3, 48
997 ; CHECK-LE-LABEL: @getus7
998 ; CHECK-LE: mfvsrd 3, 34
999 ; CHECK-LE: rldicl 3, 3, 16, 48
1000 ; CHECK-LE: clrldi 3, 3, 48
1003 ; Function Attrs: nounwind
1004 define signext i16 @getvelss(<8 x i16> %vss, i32 signext %i) {
1006 %vss.addr = alloca <8 x i16>, align 16
1007 %i.addr = alloca i32, align 4
1008 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
1009 store i32 %i, i32* %i.addr, align 4
1010 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
1011 %1 = load i32, i32* %i.addr, align 4
1012 %vecext = extractelement <8 x i16> %0, i32 %1
1014 ; CHECK-LABEL: @getvelss
1015 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 4
1016 ; CHECK-DAG: sldi [[MUL2:[0-9]+]], [[ANDI]], 1
1017 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
1018 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
1019 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
1020 ; CHECK-DAG: li [[IMM3:[0-9]+]], 3
1021 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM3]]
1022 ; CHECK-DAG: rldicr [[SHL:[0-9]+]], [[ANDC]], 4, 60
1023 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
1024 ; CHECK-DAG: extsh 3, 3
1025 ; CHECK-LE-LABEL: @getvelss
1026 ; CHECK-DAG-LE: li [[IMM4:[0-9]+]], 4
1027 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM4]]
1028 ; CHECK-DAG-LE: sldi [[MUL2:[0-9]+]], [[ANDC]], 1
1029 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
1030 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
1031 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
1032 ; CHECK-DAG-LE: li [[IMM3:[0-9]+]], 3
1033 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM3]]
1034 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 4
1035 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
1036 ; CHECK-DAG-LE: extsh 3, 3
1039 ; Function Attrs: nounwind
1040 define zeroext i16 @getvelus(<8 x i16> %vus, i32 signext %i) {
1042 %vus.addr = alloca <8 x i16>, align 16
1043 %i.addr = alloca i32, align 4
1044 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
1045 store i32 %i, i32* %i.addr, align 4
1046 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
1047 %1 = load i32, i32* %i.addr, align 4
1048 %vecext = extractelement <8 x i16> %0, i32 %1
1050 ; CHECK-LABEL: @getvelus
1051 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 4
1052 ; CHECK-DAG: sldi [[MUL2:[0-9]+]], [[ANDI]], 1
1053 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
1054 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
1055 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
1056 ; CHECK-DAG: li [[IMM3:[0-9]+]], 3
1057 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM3]]
1058 ; CHECK-DAG: rldicr [[SHL:[0-9]+]], [[ANDC]], 4, 60
1059 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
1060 ; CHECK-DAG: clrldi 3, 3, 48
1061 ; CHECK-LE-LABEL: @getvelus
1062 ; CHECK-DAG-LE: li [[IMM4:[0-9]+]], 4
1063 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM4]]
1064 ; CHECK-DAG-LE: sldi [[MUL2:[0-9]+]], [[ANDC]], 1
1065 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
1066 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
1067 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
1068 ; CHECK-DAG-LE: li [[IMM3:[0-9]+]], 3
1069 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM3]]
1070 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 4
1071 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
1072 ; CHECK-DAG-LE: clrldi 3, 3, 48
1075 ; Function Attrs: nounwind
1076 define signext i32 @getsi0(<4 x i32> %vsi) {
1078 %vsi.addr = alloca <4 x i32>, align 16
1079 store <4 x i32> %vsi, <4 x i32>* %vsi.addr, align 16
1080 %0 = load <4 x i32>, <4 x i32>* %vsi.addr, align 16
1081 %vecext = extractelement <4 x i32> %0, i32 0
1083 ; CHECK-LABEL: @getsi0
1084 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1085 ; CHECK: mfvsrwz 3, [[SHL]]
1087 ; CHECK-LE-LABEL: @getsi0
1088 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1089 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1090 ; CHECK-LE: extsw 3, 3
1093 ; Function Attrs: nounwind
1094 define signext i32 @getsi1(<4 x i32> %vsi) {
1096 %vsi.addr = alloca <4 x i32>, align 16
1097 store <4 x i32> %vsi, <4 x i32>* %vsi.addr, align 16
1098 %0 = load <4 x i32>, <4 x i32>* %vsi.addr, align 16
1099 %vecext = extractelement <4 x i32> %0, i32 1
1101 ; CHECK-LABEL: @getsi1
1102 ; CHECK: mfvsrwz 3, 34
1104 ; CHECK-LE-LABEL: @getsi1
1105 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1106 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1107 ; CHECK-LE: extsw 3, 3
1110 ; Function Attrs: nounwind
1111 define signext i32 @getsi2(<4 x i32> %vsi) {
1113 %vsi.addr = alloca <4 x i32>, align 16
1114 store <4 x i32> %vsi, <4 x i32>* %vsi.addr, align 16
1115 %0 = load <4 x i32>, <4 x i32>* %vsi.addr, align 16
1116 %vecext = extractelement <4 x i32> %0, i32 2
1118 ; CHECK-LABEL: @getsi2
1119 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1120 ; CHECK: mfvsrwz 3, [[SHL]]
1122 ; CHECK-LE-LABEL: @getsi2
1123 ; CHECK-LE: mfvsrwz 3, 34
1124 ; CHECK-LE: extsw 3, 3
1127 ; Function Attrs: nounwind
1128 define signext i32 @getsi3(<4 x i32> %vsi) {
1130 %vsi.addr = alloca <4 x i32>, align 16
1131 store <4 x i32> %vsi, <4 x i32>* %vsi.addr, align 16
1132 %0 = load <4 x i32>, <4 x i32>* %vsi.addr, align 16
1133 %vecext = extractelement <4 x i32> %0, i32 3
1135 ; CHECK-LABEL: @getsi3
1136 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1137 ; CHECK: mfvsrwz 3, [[SHL]]
1139 ; CHECK-LE-LABEL: @getsi3
1140 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1141 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1142 ; CHECK-LE: extsw 3, 3
1145 ; Function Attrs: nounwind
1146 define zeroext i32 @getui0(<4 x i32> %vui) {
1148 %vui.addr = alloca <4 x i32>, align 16
1149 store <4 x i32> %vui, <4 x i32>* %vui.addr, align 16
1150 %0 = load <4 x i32>, <4 x i32>* %vui.addr, align 16
1151 %vecext = extractelement <4 x i32> %0, i32 0
1153 ; CHECK-LABEL: @getui0
1154 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1155 ; CHECK: mfvsrwz 3, [[SHL]]
1156 ; CHECK: clrldi 3, 3, 32
1157 ; CHECK-LE-LABEL: @getui0
1158 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1159 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1160 ; CHECK-LE: clrldi 3, 3, 32
1163 ; Function Attrs: nounwind
1164 define zeroext i32 @getui1(<4 x i32> %vui) {
1166 %vui.addr = alloca <4 x i32>, align 16
1167 store <4 x i32> %vui, <4 x i32>* %vui.addr, align 16
1168 %0 = load <4 x i32>, <4 x i32>* %vui.addr, align 16
1169 %vecext = extractelement <4 x i32> %0, i32 1
1171 ; CHECK-LABEL: @getui1
1172 ; CHECK: mfvsrwz 3, 34
1173 ; CHECK: clrldi 3, 3, 32
1174 ; CHECK-LE-LABEL: @getui1
1175 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1176 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1177 ; CHECK-LE: clrldi 3, 3, 32
1180 ; Function Attrs: nounwind
1181 define zeroext i32 @getui2(<4 x i32> %vui) {
1183 %vui.addr = alloca <4 x i32>, align 16
1184 store <4 x i32> %vui, <4 x i32>* %vui.addr, align 16
1185 %0 = load <4 x i32>, <4 x i32>* %vui.addr, align 16
1186 %vecext = extractelement <4 x i32> %0, i32 2
1188 ; CHECK-LABEL: @getui2
1189 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1190 ; CHECK: mfvsrwz 3, [[SHL]]
1191 ; CHECK: clrldi 3, 3, 32
1192 ; CHECK-LE-LABEL: @getui2
1193 ; CHECK-LE: mfvsrwz 3, 34
1194 ; CHECK-LE: clrldi 3, 3, 32
1197 ; Function Attrs: nounwind
1198 define zeroext i32 @getui3(<4 x i32> %vui) {
1200 %vui.addr = alloca <4 x i32>, align 16
1201 store <4 x i32> %vui, <4 x i32>* %vui.addr, align 16
1202 %0 = load <4 x i32>, <4 x i32>* %vui.addr, align 16
1203 %vecext = extractelement <4 x i32> %0, i32 3
1205 ; CHECK-LABEL: @getui3
1206 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1207 ; CHECK: mfvsrwz 3, [[SHL]]
1208 ; CHECK: clrldi 3, 3, 32
1209 ; CHECK-LE-LABEL: @getui3
1210 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1211 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1212 ; CHECK-LE: clrldi 3, 3, 32
1215 ; Function Attrs: nounwind
1216 define signext i32 @getvelsi(<4 x i32> %vsi, i32 signext %i) {
1218 %vsi.addr = alloca <4 x i32>, align 16
1219 %i.addr = alloca i32, align 4
1220 store <4 x i32> %vsi, <4 x i32>* %vsi.addr, align 16
1221 store i32 %i, i32* %i.addr, align 4
1222 %0 = load <4 x i32>, <4 x i32>* %vsi.addr, align 16
1223 %1 = load i32, i32* %i.addr, align 4
1224 %vecext = extractelement <4 x i32> %0, i32 %1
1226 ; CHECK-LABEL: @getvelsi
1227 ; CHECK-LE-LABEL: @getvelsi
1228 ; FIXME: add check patterns when variable element extraction is implemented
1231 ; Function Attrs: nounwind
1232 define zeroext i32 @getvelui(<4 x i32> %vui, i32 signext %i) {
1234 %vui.addr = alloca <4 x i32>, align 16
1235 %i.addr = alloca i32, align 4
1236 store <4 x i32> %vui, <4 x i32>* %vui.addr, align 16
1237 store i32 %i, i32* %i.addr, align 4
1238 %0 = load <4 x i32>, <4 x i32>* %vui.addr, align 16
1239 %1 = load i32, i32* %i.addr, align 4
1240 %vecext = extractelement <4 x i32> %0, i32 %1
1242 ; CHECK-LABEL: @getvelui
1243 ; CHECK-LE-LABEL: @getvelui
1244 ; FIXME: add check patterns when variable element extraction is implemented
1247 ; Function Attrs: nounwind
1248 define i64 @getsl0(<2 x i64> %vsl) {
1250 %vsl.addr = alloca <2 x i64>, align 16
1251 store <2 x i64> %vsl, <2 x i64>* %vsl.addr, align 16
1252 %0 = load <2 x i64>, <2 x i64>* %vsl.addr, align 16
1253 %vecext = extractelement <2 x i64> %0, i32 0
1255 ; CHECK-LABEL: @getsl0
1256 ; CHECK: mfvsrd 3, 34
1257 ; CHECK-LE-LABEL: @getsl0
1258 ; CHECK-LE: xxswapd [[SWP:[0-9]+]], 34
1259 ; CHECK-LE: mfvsrd 3, [[SWP]]
1262 ; Function Attrs: nounwind
1263 define i64 @getsl1(<2 x i64> %vsl) {
1265 %vsl.addr = alloca <2 x i64>, align 16
1266 store <2 x i64> %vsl, <2 x i64>* %vsl.addr, align 16
1267 %0 = load <2 x i64>, <2 x i64>* %vsl.addr, align 16
1268 %vecext = extractelement <2 x i64> %0, i32 1
1270 ; CHECK-LABEL: @getsl1
1271 ; CHECK: xxswapd [[SWP:[0-9]+]], 34
1272 ; CHECK: mfvsrd 3, [[SWP]]
1273 ; CHECK-LE-LABEL: @getsl1
1274 ; CHECK-LE: mfvsrd 3, 34
1277 ; Function Attrs: nounwind
1278 define i64 @getul0(<2 x i64> %vul) {
1280 %vul.addr = alloca <2 x i64>, align 16
1281 store <2 x i64> %vul, <2 x i64>* %vul.addr, align 16
1282 %0 = load <2 x i64>, <2 x i64>* %vul.addr, align 16
1283 %vecext = extractelement <2 x i64> %0, i32 0
1285 ; CHECK-LABEL: @getul0
1286 ; CHECK: mfvsrd 3, 34
1287 ; CHECK-LE-LABEL: @getul0
1288 ; CHECK-LE: xxswapd [[SWP:[0-9]+]], 34
1289 ; CHECK-LE: mfvsrd 3, [[SWP]]
1292 ; Function Attrs: nounwind
1293 define i64 @getul1(<2 x i64> %vul) {
1295 %vul.addr = alloca <2 x i64>, align 16
1296 store <2 x i64> %vul, <2 x i64>* %vul.addr, align 16
1297 %0 = load <2 x i64>, <2 x i64>* %vul.addr, align 16
1298 %vecext = extractelement <2 x i64> %0, i32 1
1300 ; CHECK-LABEL: @getul1
1301 ; CHECK: xxswapd [[SWP:[0-9]+]], 34
1302 ; CHECK: mfvsrd 3, [[SWP]]
1303 ; CHECK-LE-LABEL: @getul1
1304 ; CHECK-LE: mfvsrd 3, 34
1307 ; Function Attrs: nounwind
1308 define i64 @getvelsl(<2 x i64> %vsl, i32 signext %i) {
1310 %vsl.addr = alloca <2 x i64>, align 16
1311 %i.addr = alloca i32, align 4
1312 store <2 x i64> %vsl, <2 x i64>* %vsl.addr, align 16
1313 store i32 %i, i32* %i.addr, align 4
1314 %0 = load <2 x i64>, <2 x i64>* %vsl.addr, align 16
1315 %1 = load i32, i32* %i.addr, align 4
1316 %vecext = extractelement <2 x i64> %0, i32 %1
1318 ; CHECK-LABEL: @getvelsl
1319 ; CHECK-LE-LABEL: @getvelsl
1320 ; FIXME: add check patterns when variable element extraction is implemented
1323 ; Function Attrs: nounwind
1324 define i64 @getvelul(<2 x i64> %vul, i32 signext %i) {
1326 %vul.addr = alloca <2 x i64>, align 16
1327 %i.addr = alloca i32, align 4
1328 store <2 x i64> %vul, <2 x i64>* %vul.addr, align 16
1329 store i32 %i, i32* %i.addr, align 4
1330 %0 = load <2 x i64>, <2 x i64>* %vul.addr, align 16
1331 %1 = load i32, i32* %i.addr, align 4
1332 %vecext = extractelement <2 x i64> %0, i32 %1
1334 ; CHECK-LABEL: @getvelul
1335 ; CHECK-LE-LABEL: @getvelul
1336 ; FIXME: add check patterns when variable element extraction is implemented
1339 ; Function Attrs: nounwind
1340 define float @getf0(<4 x float> %vf) {
1342 %vf.addr = alloca <4 x float>, align 16
1343 store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1344 %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1345 %vecext = extractelement <4 x float> %0, i32 0
1347 ; CHECK-LABEL: @getf0
1348 ; CHECK: xscvspdpn 1, 34
1349 ; CHECK-LE-LABEL: @getf0
1350 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1351 ; CHECK-LE: xscvspdpn 1, [[SHL]]
1354 ; Function Attrs: nounwind
1355 define float @getf1(<4 x float> %vf) {
1357 %vf.addr = alloca <4 x float>, align 16
1358 store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1359 %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1360 %vecext = extractelement <4 x float> %0, i32 1
1362 ; CHECK-LABEL: @getf1
1363 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1364 ; CHECK: xscvspdpn 1, [[SHL]]
1365 ; CHECK-LE-LABEL: @getf1
1366 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1367 ; CHECK-LE: xscvspdpn 1, [[SHL]]
1370 ; Function Attrs: nounwind
1371 define float @getf2(<4 x float> %vf) {
1373 %vf.addr = alloca <4 x float>, align 16
1374 store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1375 %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1376 %vecext = extractelement <4 x float> %0, i32 2
1378 ; CHECK-LABEL: @getf2
1379 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1380 ; CHECK: xscvspdpn 1, [[SHL]]
1381 ; CHECK-LE-LABEL: @getf2
1382 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1383 ; CHECK-LE: xscvspdpn 1, [[SHL]]
1386 ; Function Attrs: nounwind
1387 define float @getf3(<4 x float> %vf) {
1389 %vf.addr = alloca <4 x float>, align 16
1390 store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1391 %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1392 %vecext = extractelement <4 x float> %0, i32 3
1394 ; CHECK-LABEL: @getf3
1395 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1396 ; CHECK: xscvspdpn 1, [[SHL]]
1397 ; CHECK-LE-LABEL: @getf3
1398 ; CHECK-LE: xscvspdpn 1, 34
1401 ; Function Attrs: nounwind
1402 define float @getvelf(<4 x float> %vf, i32 signext %i) {
1404 %vf.addr = alloca <4 x float>, align 16
1405 %i.addr = alloca i32, align 4
1406 store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1407 store i32 %i, i32* %i.addr, align 4
1408 %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1409 %1 = load i32, i32* %i.addr, align 4
1410 %vecext = extractelement <4 x float> %0, i32 %1
1412 ; CHECK-LABEL: @getvelf
1413 ; CHECK-LE-LABEL: @getvelf
1414 ; FIXME: add check patterns when variable element extraction is implemented
1417 ; Function Attrs: nounwind
1418 define double @getd0(<2 x double> %vd) {
1420 %vd.addr = alloca <2 x double>, align 16
1421 store <2 x double> %vd, <2 x double>* %vd.addr, align 16
1422 %0 = load <2 x double>, <2 x double>* %vd.addr, align 16
1423 %vecext = extractelement <2 x double> %0, i32 0
1425 ; CHECK-LABEL: @getd0
1426 ; CHECK: xxlor 1, 34, 34
1427 ; CHECK-LE-LABEL: @getd0
1428 ; CHECK-LE: xxswapd 1, 34
1431 ; Function Attrs: nounwind
1432 define double @getd1(<2 x double> %vd) {
1434 %vd.addr = alloca <2 x double>, align 16
1435 store <2 x double> %vd, <2 x double>* %vd.addr, align 16
1436 %0 = load <2 x double>, <2 x double>* %vd.addr, align 16
1437 %vecext = extractelement <2 x double> %0, i32 1
1439 ; CHECK-LABEL: @getd1
1440 ; CHECK: xxswapd 1, 34
1441 ; CHECK-LE-LABEL: @getd1
1442 ; CHECK-LE: xxlor 1, 34, 34
1445 ; Function Attrs: nounwind
1446 define double @getveld(<2 x double> %vd, i32 signext %i) {
1448 %vd.addr = alloca <2 x double>, align 16
1449 %i.addr = alloca i32, align 4
1450 store <2 x double> %vd, <2 x double>* %vd.addr, align 16
1451 store i32 %i, i32* %i.addr, align 4
1452 %0 = load <2 x double>, <2 x double>* %vd.addr, align 16
1453 %1 = load i32, i32* %i.addr, align 4
1454 %vecext = extractelement <2 x double> %0, i32 %1
1456 ; CHECK-LABEL: @getveld
1457 ; CHECK-LE-LABEL: @getveld
1458 ; FIXME: add check patterns when variable element extraction is implemented