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 @d = common global double 0.000000e+00, align 8
10 ; Function Attrs: nounwind
11 define <16 x i8> @buildc(i8 zeroext %a) {
13 %a.addr = alloca i8, align 1
14 store i8 %a, i8* %a.addr, align 1
15 %0 = load i8, i8* %a.addr, align 1
16 %splat.splatinsert = insertelement <16 x i8> undef, i8 %0, i32 0
17 %splat.splat = shufflevector <16 x i8> %splat.splatinsert, <16 x i8> undef, <16 x i32> zeroinitializer
18 ret <16 x i8> %splat.splat
19 ; CHECK: sldi [[REG1:[0-9]+]], 3, 56
20 ; CHECK: mtvsrd {{[0-9]+}}, [[REG1]]
21 ; CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
22 ; CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
25 ; Function Attrs: nounwind
26 define <8 x i16> @builds(i16 zeroext %a) {
28 %a.addr = alloca i16, align 2
29 store i16 %a, i16* %a.addr, align 2
30 %0 = load i16, i16* %a.addr, align 2
31 %splat.splatinsert = insertelement <8 x i16> undef, i16 %0, i32 0
32 %splat.splat = shufflevector <8 x i16> %splat.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer
33 ret <8 x i16> %splat.splat
34 ; CHECK: sldi [[REG1:[0-9]+]], 3, 48
35 ; CHECK: mtvsrd {{[0-9]+}}, [[REG1]]
36 ; CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
37 ; CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
40 ; Function Attrs: nounwind
41 define <4 x i32> @buildi(i32 zeroext %a) {
43 %a.addr = alloca i32, align 4
44 store i32 %a, i32* %a.addr, align 4
45 %0 = load i32, i32* %a.addr, align 4
46 %splat.splatinsert = insertelement <4 x i32> undef, i32 %0, i32 0
47 %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
48 ret <4 x i32> %splat.splat
49 ; CHECK: sldi [[REG1:[0-9]+]], 3, 32
50 ; CHECK: mtvsrd {{[0-9]+}}, [[REG1]]
51 ; CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
52 ; CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
55 ; Function Attrs: nounwind
56 define <2 x i64> @buildl(i64 %a) {
58 %a.addr = alloca i64, align 8
59 store i64 %a, i64* %a.addr, align 8
60 %0 = load i64, i64* %a.addr, align 8
61 %splat.splatinsert = insertelement <2 x i64> undef, i64 %0, i32 0
62 %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
63 ret <2 x i64> %splat.splat
64 ; CHECK: mtvsrd {{[0-9]+}}, 3
65 ; CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
66 ; CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
69 ; Function Attrs: nounwind
70 define <4 x float> @buildf(float %a) {
72 %a.addr = alloca float, align 4
73 store float %a, float* %a.addr, align 4
74 %0 = load float, float* %a.addr, align 4
75 %splat.splatinsert = insertelement <4 x float> undef, float %0, i32 0
76 %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer
77 ret <4 x float> %splat.splat
78 ; CHECK: xscvdpspn {{[0-9]+}}, 1
79 ; CHECK-LE: xscvdpspn [[REG1:[0-9]+]], 1
80 ; CHECK-LE: xxsldwi {{[0-9]+}}, [[REG1]], [[REG1]], 1
83 ; The optimization to remove stack operations from PPCDAGToDAGISel::Select
84 ; should still trigger for v2f64, producing an lxvdsx.
85 ; Function Attrs: nounwind
86 define <2 x double> @buildd() #0 {
88 %0 = load double, double* @d, align 8
89 %splat.splatinsert = insertelement <2 x double> undef, double %0, i32 0
90 %splat.splat = shufflevector <2 x double> %splat.splatinsert, <2 x double> undef, <2 x i32> zeroinitializer
91 ret <2 x double> %splat.splat
92 ; CHECK: ld [[REG1:[0-9]+]], .LC0@toc@l
93 ; CHECK: lxvdsx 34, 0, [[REG1]]
94 ; CHECK-LE: ld [[REG1:[0-9]+]], .LC0@toc@l
95 ; CHECK-LE: lxvdsx 34, 0, [[REG1]]
98 ; Function Attrs: nounwind
99 define signext i8 @getsc0(<16 x i8> %vsc) {
101 %vsc.addr = alloca <16 x i8>, align 16
102 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
103 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
104 %vecext = extractelement <16 x i8> %0, i32 0
106 ; CHECK-LABEL: @getsc0
107 ; CHECK: mfvsrd 3, 34
108 ; CHECK: rldicl 3, 3, 8, 56
110 ; CHECK-LE-LABEL: @getsc0
111 ; CHECK-LE: mfvsrd 3,
112 ; CHECK-LE: clrldi 3, 3, 56
113 ; CHECK-LE: extsb 3, 3
116 ; Function Attrs: nounwind
117 define signext i8 @getsc1(<16 x i8> %vsc) {
119 %vsc.addr = alloca <16 x i8>, align 16
120 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
121 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
122 %vecext = extractelement <16 x i8> %0, i32 1
124 ; CHECK-LABEL: @getsc1
125 ; CHECK: mfvsrd 3, 34
126 ; CHECK: rldicl 3, 3, 16, 56
128 ; CHECK-LE-LABEL: @getsc1
129 ; CHECK-LE: mfvsrd 3,
130 ; CHECK-LE: rldicl 3, 3, 56, 56
131 ; CHECK-LE: extsb 3, 3
134 ; Function Attrs: nounwind
135 define signext i8 @getsc2(<16 x i8> %vsc) {
137 %vsc.addr = alloca <16 x i8>, align 16
138 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
139 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
140 %vecext = extractelement <16 x i8> %0, i32 2
142 ; CHECK-LABEL: @getsc2
143 ; CHECK: mfvsrd 3, 34
144 ; CHECK: rldicl 3, 3, 24, 56
146 ; CHECK-LE-LABEL: @getsc2
147 ; CHECK-LE: mfvsrd 3,
148 ; CHECK-LE: rldicl 3, 3, 48, 56
149 ; CHECK-LE: extsb 3, 3
152 ; Function Attrs: nounwind
153 define signext i8 @getsc3(<16 x i8> %vsc) {
155 %vsc.addr = alloca <16 x i8>, align 16
156 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
157 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
158 %vecext = extractelement <16 x i8> %0, i32 3
160 ; CHECK-LABEL: @getsc3
161 ; CHECK: mfvsrd 3, 34
162 ; CHECK: rldicl 3, 3, 32, 56
164 ; CHECK-LE-LABEL: @getsc3
165 ; CHECK-LE: mfvsrd 3,
166 ; CHECK-LE: rldicl 3, 3, 40, 56
167 ; CHECK-LE: extsb 3, 3
170 ; Function Attrs: nounwind
171 define signext i8 @getsc4(<16 x i8> %vsc) {
173 %vsc.addr = alloca <16 x i8>, align 16
174 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
175 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
176 %vecext = extractelement <16 x i8> %0, i32 4
178 ; CHECK-LABEL: @getsc4
179 ; CHECK: mfvsrd 3, 34
180 ; CHECK: rldicl 3, 3, 40, 56
182 ; CHECK-LE-LABEL: @getsc4
183 ; CHECK-LE: mfvsrd 3,
184 ; CHECK-LE: rldicl 3, 3, 32, 56
185 ; CHECK-LE: extsb 3, 3
188 ; Function Attrs: nounwind
189 define signext i8 @getsc5(<16 x i8> %vsc) {
191 %vsc.addr = alloca <16 x i8>, align 16
192 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
193 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
194 %vecext = extractelement <16 x i8> %0, i32 5
196 ; CHECK-LABEL: @getsc5
197 ; CHECK: mfvsrd 3, 34
198 ; CHECK: rldicl 3, 3, 48, 56
200 ; CHECK-LE-LABEL: @getsc5
201 ; CHECK-LE: mfvsrd 3,
202 ; CHECK-LE: rldicl 3, 3, 24, 56
203 ; CHECK-LE: extsb 3, 3
206 ; Function Attrs: nounwind
207 define signext i8 @getsc6(<16 x i8> %vsc) {
209 %vsc.addr = alloca <16 x i8>, align 16
210 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
211 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
212 %vecext = extractelement <16 x i8> %0, i32 6
214 ; CHECK-LABEL: @getsc6
215 ; CHECK: mfvsrd 3, 34
216 ; CHECK: rldicl 3, 3, 56, 56
218 ; CHECK-LE-LABEL: @getsc6
219 ; CHECK-LE: mfvsrd 3,
220 ; CHECK-LE: rldicl 3, 3, 16, 56
221 ; CHECK-LE: extsb 3, 3
224 ; Function Attrs: nounwind
225 define signext i8 @getsc7(<16 x i8> %vsc) {
227 %vsc.addr = alloca <16 x i8>, align 16
228 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
229 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
230 %vecext = extractelement <16 x i8> %0, i32 7
232 ; CHECK-LABEL: @getsc7
233 ; CHECK: mfvsrd 3, 34
234 ; CHECK: clrldi 3, 3, 56
236 ; CHECK-LE-LABEL: @getsc7
237 ; CHECK-LE: mfvsrd 3,
238 ; CHECK-LE: rldicl 3, 3, 8, 56
239 ; CHECK-LE: extsb 3, 3
242 ; Function Attrs: nounwind
243 define signext i8 @getsc8(<16 x i8> %vsc) {
245 %vsc.addr = alloca <16 x i8>, align 16
246 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
247 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
248 %vecext = extractelement <16 x i8> %0, i32 8
250 ; CHECK-LABEL: @getsc8
252 ; CHECK: rldicl 3, 3, 8, 56
254 ; CHECK-LE-LABEL: @getsc8
255 ; CHECK-LE: mfvsrd 3, 34
256 ; CHECK-LE: clrldi 3, 3, 56
257 ; CHECK-LE: extsb 3, 3
260 ; Function Attrs: nounwind
261 define signext i8 @getsc9(<16 x i8> %vsc) {
263 %vsc.addr = alloca <16 x i8>, align 16
264 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
265 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
266 %vecext = extractelement <16 x i8> %0, i32 9
268 ; CHECK-LABEL: @getsc9
270 ; CHECK: rldicl 3, 3, 16, 56
272 ; CHECK-LE-LABEL: @getsc9
273 ; CHECK-LE: mfvsrd 3, 34
274 ; CHECK-LE: rldicl 3, 3, 56, 56
275 ; CHECK-LE: extsb 3, 3
278 ; Function Attrs: nounwind
279 define signext i8 @getsc10(<16 x i8> %vsc) {
281 %vsc.addr = alloca <16 x i8>, align 16
282 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
283 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
284 %vecext = extractelement <16 x i8> %0, i32 10
286 ; CHECK-LABEL: @getsc10
288 ; CHECK: rldicl 3, 3, 24, 56
290 ; CHECK-LE-LABEL: @getsc10
291 ; CHECK-LE: mfvsrd 3, 34
292 ; CHECK-LE: rldicl 3, 3, 48, 56
293 ; CHECK-LE: extsb 3, 3
296 ; Function Attrs: nounwind
297 define signext i8 @getsc11(<16 x i8> %vsc) {
299 %vsc.addr = alloca <16 x i8>, align 16
300 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
301 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
302 %vecext = extractelement <16 x i8> %0, i32 11
304 ; CHECK-LABEL: @getsc11
306 ; CHECK: rldicl 3, 3, 32, 56
308 ; CHECK-LE-LABEL: @getsc11
309 ; CHECK-LE: mfvsrd 3, 34
310 ; CHECK-LE: rldicl 3, 3, 40, 56
311 ; CHECK-LE: extsb 3, 3
314 ; Function Attrs: nounwind
315 define signext i8 @getsc12(<16 x i8> %vsc) {
317 %vsc.addr = alloca <16 x i8>, align 16
318 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
319 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
320 %vecext = extractelement <16 x i8> %0, i32 12
322 ; CHECK-LABEL: @getsc12
324 ; CHECK: rldicl 3, 3, 40, 56
326 ; CHECK-LE-LABEL: @getsc12
327 ; CHECK-LE: mfvsrd 3, 34
328 ; CHECK-LE: rldicl 3, 3, 32, 56
329 ; CHECK-LE: extsb 3, 3
332 ; Function Attrs: nounwind
333 define signext i8 @getsc13(<16 x i8> %vsc) {
335 %vsc.addr = alloca <16 x i8>, align 16
336 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
337 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
338 %vecext = extractelement <16 x i8> %0, i32 13
340 ; CHECK-LABEL: @getsc13
342 ; CHECK: rldicl 3, 3, 48, 56
344 ; CHECK-LE-LABEL: @getsc13
345 ; CHECK-LE: mfvsrd 3, 34
346 ; CHECK-LE: rldicl 3, 3, 24, 56
347 ; CHECK-LE: extsb 3, 3
350 ; Function Attrs: nounwind
351 define signext i8 @getsc14(<16 x i8> %vsc) {
353 %vsc.addr = alloca <16 x i8>, align 16
354 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
355 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
356 %vecext = extractelement <16 x i8> %0, i32 14
358 ; CHECK-LABEL: @getsc14
360 ; CHECK: rldicl 3, 3, 56, 56
362 ; CHECK-LE-LABEL: @getsc14
363 ; CHECK-LE: mfvsrd 3, 34
364 ; CHECK-LE: rldicl 3, 3, 16, 56
365 ; CHECK-LE: extsb 3, 3
368 ; Function Attrs: nounwind
369 define signext i8 @getsc15(<16 x i8> %vsc) {
371 %vsc.addr = alloca <16 x i8>, align 16
372 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
373 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
374 %vecext = extractelement <16 x i8> %0, i32 15
376 ; CHECK-LABEL: @getsc15
379 ; CHECK-LE-LABEL: @getsc15
380 ; CHECK-LE: mfvsrd 3, 34
381 ; CHECK-LE: rldicl 3, 3, 8, 56
382 ; CHECK-LE: extsb 3, 3
385 ; Function Attrs: nounwind
386 define zeroext i8 @getuc0(<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 0
393 ; CHECK-LABEL: @getuc0
394 ; CHECK: mfvsrd 3, 34
395 ; CHECK: rldicl 3, 3, 8, 56
396 ; CHECK: clrldi 3, 3, 56
397 ; CHECK-LE-LABEL: @getuc0
398 ; CHECK-LE: mfvsrd 3,
399 ; CHECK-LE: clrldi 3, 3, 56
402 ; Function Attrs: nounwind
403 define zeroext i8 @getuc1(<16 x i8> %vuc) {
405 %vuc.addr = alloca <16 x i8>, align 16
406 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
407 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
408 %vecext = extractelement <16 x i8> %0, i32 1
410 ; CHECK-LABEL: @getuc1
411 ; CHECK: mfvsrd 3, 34
412 ; CHECK: rldicl 3, 3, 16, 56
413 ; CHECK: clrldi 3, 3, 56
414 ; CHECK-LE-LABEL: @getuc1
415 ; CHECK-LE: mfvsrd 3,
416 ; CHECK-LE: rldicl 3, 3, 56, 56
417 ; CHECK-LE: clrldi 3, 3, 56
420 ; Function Attrs: nounwind
421 define zeroext i8 @getuc2(<16 x i8> %vuc) {
423 %vuc.addr = alloca <16 x i8>, align 16
424 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
425 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
426 %vecext = extractelement <16 x i8> %0, i32 2
428 ; CHECK-LABEL: @getuc2
429 ; CHECK: mfvsrd 3, 34
430 ; CHECK: rldicl 3, 3, 24, 56
431 ; CHECK: clrldi 3, 3, 56
432 ; CHECK-LE-LABEL: @getuc2
433 ; CHECK-LE: mfvsrd 3,
434 ; CHECK-LE: rldicl 3, 3, 48, 56
435 ; CHECK-LE: clrldi 3, 3, 56
438 ; Function Attrs: nounwind
439 define zeroext i8 @getuc3(<16 x i8> %vuc) {
441 %vuc.addr = alloca <16 x i8>, align 16
442 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
443 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
444 %vecext = extractelement <16 x i8> %0, i32 3
446 ; CHECK-LABEL: @getuc3
447 ; CHECK: mfvsrd 3, 34
448 ; CHECK: rldicl 3, 3, 32, 56
449 ; CHECK: clrldi 3, 3, 56
450 ; CHECK-LE-LABEL: @getuc3
451 ; CHECK-LE: mfvsrd 3,
452 ; CHECK-LE: rldicl 3, 3, 40, 56
453 ; CHECK-LE: clrldi 3, 3, 56
456 ; Function Attrs: nounwind
457 define zeroext i8 @getuc4(<16 x i8> %vuc) {
459 %vuc.addr = alloca <16 x i8>, align 16
460 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
461 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
462 %vecext = extractelement <16 x i8> %0, i32 4
464 ; CHECK-LABEL: @getuc4
465 ; CHECK: mfvsrd 3, 34
466 ; CHECK: rldicl 3, 3, 40, 56
467 ; CHECK: clrldi 3, 3, 56
468 ; CHECK-LE-LABEL: @getuc4
469 ; CHECK-LE: mfvsrd 3,
470 ; CHECK-LE: rldicl 3, 3, 32, 56
471 ; CHECK-LE: clrldi 3, 3, 56
474 ; Function Attrs: nounwind
475 define zeroext i8 @getuc5(<16 x i8> %vuc) {
477 %vuc.addr = alloca <16 x i8>, align 16
478 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
479 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
480 %vecext = extractelement <16 x i8> %0, i32 5
482 ; CHECK-LABEL: @getuc5
483 ; CHECK: mfvsrd 3, 34
484 ; CHECK: rldicl 3, 3, 48, 56
485 ; CHECK: clrldi 3, 3, 56
486 ; CHECK-LE-LABEL: @getuc5
487 ; CHECK-LE: mfvsrd 3,
488 ; CHECK-LE: rldicl 3, 3, 24, 56
489 ; CHECK-LE: clrldi 3, 3, 56
492 ; Function Attrs: nounwind
493 define zeroext i8 @getuc6(<16 x i8> %vuc) {
495 %vuc.addr = alloca <16 x i8>, align 16
496 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
497 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
498 %vecext = extractelement <16 x i8> %0, i32 6
500 ; CHECK-LABEL: @getuc6
501 ; CHECK: mfvsrd 3, 34
502 ; CHECK: rldicl 3, 3, 56, 56
503 ; CHECK: clrldi 3, 3, 56
504 ; CHECK-LE-LABEL: @getuc6
505 ; CHECK-LE: mfvsrd 3,
506 ; CHECK-LE: rldicl 3, 3, 16, 56
507 ; CHECK-LE: clrldi 3, 3, 56
510 ; Function Attrs: nounwind
511 define zeroext i8 @getuc7(<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 7
518 ; CHECK-LABEL: @getuc7
519 ; CHECK: mfvsrd 3, 34
520 ; CHECK: clrldi 3, 3, 56
521 ; CHECK-LE-LABEL: @getuc7
522 ; CHECK-LE: mfvsrd 3,
523 ; CHECK-LE: rldicl 3, 3, 8, 56
524 ; CHECK-LE: clrldi 3, 3, 56
527 ; Function Attrs: nounwind
528 define zeroext i8 @getuc8(<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 8
535 ; CHECK-LABEL: @getuc8
537 ; CHECK: rldicl 3, 3, 8, 56
538 ; CHECK: clrldi 3, 3, 56
539 ; CHECK-LE-LABEL: @getuc8
540 ; CHECK-LE: mfvsrd 3, 34
541 ; CHECK-LE: clrldi 3, 3, 56
544 ; Function Attrs: nounwind
545 define zeroext i8 @getuc9(<16 x i8> %vuc) {
547 %vuc.addr = alloca <16 x i8>, align 16
548 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
549 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
550 %vecext = extractelement <16 x i8> %0, i32 9
552 ; CHECK-LABEL: @getuc9
554 ; CHECK: rldicl 3, 3, 16, 56
555 ; CHECK: clrldi 3, 3, 56
556 ; CHECK-LE-LABEL: @getuc9
557 ; CHECK-LE: mfvsrd 3, 34
558 ; CHECK-LE: rldicl 3, 3, 56, 56
559 ; CHECK-LE: clrldi 3, 3, 56
562 ; Function Attrs: nounwind
563 define zeroext i8 @getuc10(<16 x i8> %vuc) {
565 %vuc.addr = alloca <16 x i8>, align 16
566 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
567 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
568 %vecext = extractelement <16 x i8> %0, i32 10
570 ; CHECK-LABEL: @getuc10
572 ; CHECK: rldicl 3, 3, 24, 56
573 ; CHECK: clrldi 3, 3, 56
574 ; CHECK-LE-LABEL: @getuc10
575 ; CHECK-LE: mfvsrd 3, 34
576 ; CHECK-LE: rldicl 3, 3, 48, 56
577 ; CHECK-LE: clrldi 3, 3, 56
580 ; Function Attrs: nounwind
581 define zeroext i8 @getuc11(<16 x i8> %vuc) {
583 %vuc.addr = alloca <16 x i8>, align 16
584 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
585 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
586 %vecext = extractelement <16 x i8> %0, i32 11
588 ; CHECK-LABEL: @getuc11
590 ; CHECK: rldicl 3, 3, 32, 56
591 ; CHECK: clrldi 3, 3, 56
592 ; CHECK-LE-LABEL: @getuc11
593 ; CHECK-LE: mfvsrd 3, 34
594 ; CHECK-LE: rldicl 3, 3, 40, 56
595 ; CHECK-LE: clrldi 3, 3, 56
598 ; Function Attrs: nounwind
599 define zeroext i8 @getuc12(<16 x i8> %vuc) {
601 %vuc.addr = alloca <16 x i8>, align 16
602 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
603 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
604 %vecext = extractelement <16 x i8> %0, i32 12
606 ; CHECK-LABEL: @getuc12
608 ; CHECK: rldicl 3, 3, 40, 56
609 ; CHECK: clrldi 3, 3, 56
610 ; CHECK-LE-LABEL: @getuc12
611 ; CHECK-LE: mfvsrd 3, 34
612 ; CHECK-LE: rldicl 3, 3, 32, 56
613 ; CHECK-LE: clrldi 3, 3, 56
616 ; Function Attrs: nounwind
617 define zeroext i8 @getuc13(<16 x i8> %vuc) {
619 %vuc.addr = alloca <16 x i8>, align 16
620 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
621 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
622 %vecext = extractelement <16 x i8> %0, i32 13
624 ; CHECK-LABEL: @getuc13
626 ; CHECK: rldicl 3, 3, 48, 56
627 ; CHECK: clrldi 3, 3, 56
628 ; CHECK-LE-LABEL: @getuc13
629 ; CHECK-LE: mfvsrd 3, 34
630 ; CHECK-LE: rldicl 3, 3, 24, 56
631 ; CHECK-LE: clrldi 3, 3, 56
634 ; Function Attrs: nounwind
635 define zeroext i8 @getuc14(<16 x i8> %vuc) {
637 %vuc.addr = alloca <16 x i8>, align 16
638 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
639 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
640 %vecext = extractelement <16 x i8> %0, i32 14
642 ; CHECK-LABEL: @getuc14
644 ; CHECK: rldicl 3, 3, 56, 56
645 ; CHECK: clrldi 3, 3, 56
646 ; CHECK-LE-LABEL: @getuc14
647 ; CHECK-LE: mfvsrd 3, 34
648 ; CHECK-LE: rldicl 3, 3, 16, 56
649 ; CHECK-LE: clrldi 3, 3, 56
652 ; Function Attrs: nounwind
653 define zeroext i8 @getuc15(<16 x i8> %vuc) {
655 %vuc.addr = alloca <16 x i8>, align 16
656 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
657 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
658 %vecext = extractelement <16 x i8> %0, i32 15
660 ; CHECK-LABEL: @getuc15
662 ; CHECK: clrldi 3, 3, 56
663 ; CHECK-LE-LABEL: @getuc15
664 ; CHECK-LE: mfvsrd 3, 34
665 ; CHECK-LE: rldicl 3, 3, 8, 56
666 ; CHECK-LE: clrldi 3, 3, 56
669 ; Function Attrs: nounwind
670 define signext i8 @getvelsc(<16 x i8> %vsc, i32 signext %i) {
672 %vsc.addr = alloca <16 x i8>, align 16
673 %i.addr = alloca i32, align 4
674 store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
675 store i32 %i, i32* %i.addr, align 4
676 %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
677 %1 = load i32, i32* %i.addr, align 4
678 %vecext = extractelement <16 x i8> %0, i32 %1
680 ; CHECK-LABEL: @getvelsc
681 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 8
682 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[ANDI]]
683 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
684 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
685 ; CHECK-DAG: li [[IMM7:[0-9]+]], 7
686 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM7]]
687 ; CHECK-DAG: sldi [[SHL:[0-9]+]], [[ANDC]], 3
688 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
689 ; CHECK-DAG: extsb 3, 3
690 ; CHECK-LE-LABEL: @getvelsc
691 ; CHECK-DAG-LE: li [[IMM8:[0-9]+]], 8
692 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM8]]
693 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[ANDC]]
694 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
695 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
696 ; CHECK-DAG-LE: li [[IMM7:[0-9]+]], 7
697 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM7]]
698 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 3
699 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
700 ; CHECK-DAG-LE: extsb 3, 3
703 ; Function Attrs: nounwind
704 define zeroext i8 @getveluc(<16 x i8> %vuc, i32 signext %i) {
706 %vuc.addr = alloca <16 x i8>, align 16
707 %i.addr = alloca i32, align 4
708 store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
709 store i32 %i, i32* %i.addr, align 4
710 %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
711 %1 = load i32, i32* %i.addr, align 4
712 %vecext = extractelement <16 x i8> %0, i32 %1
714 ; CHECK-LABEL: @getveluc
715 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 8
716 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[ANDI]]
717 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
718 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
719 ; CHECK-DAG: li [[IMM7:[0-9]+]], 7
720 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM7]]
721 ; CHECK-DAG: sldi [[SHL:[0-9]+]], [[ANDC]], 3
722 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
723 ; CHECK-DAG: clrldi 3, 3, 56
724 ; CHECK-LE-LABEL: @getveluc
725 ; CHECK-DAG-LE: li [[IMM8:[0-9]+]], 8
726 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM8]]
727 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[ANDC]]
728 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
729 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
730 ; CHECK-DAG-LE: li [[IMM7:[0-9]+]], 7
731 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM7]]
732 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 3
733 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
734 ; CHECK-DAG-LE: clrldi 3, 3, 56
737 ; Function Attrs: nounwind
738 define signext i16 @getss0(<8 x i16> %vss) {
740 %vss.addr = alloca <8 x i16>, align 16
741 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
742 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
743 %vecext = extractelement <8 x i16> %0, i32 0
745 ; CHECK-LABEL: @getss0
746 ; CHECK: mfvsrd 3, 34
747 ; CHECK: rldicl 3, 3, 16, 48
749 ; CHECK-LE-LABEL: @getss0
750 ; CHECK-LE: mfvsrd 3,
751 ; CHECK-LE: clrldi 3, 3, 48
752 ; CHECK-LE: extsh 3, 3
755 ; Function Attrs: nounwind
756 define signext i16 @getss1(<8 x i16> %vss) {
758 %vss.addr = alloca <8 x i16>, align 16
759 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
760 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
761 %vecext = extractelement <8 x i16> %0, i32 1
763 ; CHECK-LABEL: @getss1
764 ; CHECK: mfvsrd 3, 34
765 ; CHECK: rldicl 3, 3, 32, 48
767 ; CHECK-LE-LABEL: @getss1
768 ; CHECK-LE: mfvsrd 3,
769 ; CHECK-LE: rldicl 3, 3, 48, 48
770 ; CHECK-LE: extsh 3, 3
773 ; Function Attrs: nounwind
774 define signext i16 @getss2(<8 x i16> %vss) {
776 %vss.addr = alloca <8 x i16>, align 16
777 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
778 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
779 %vecext = extractelement <8 x i16> %0, i32 2
781 ; CHECK-LABEL: @getss2
782 ; CHECK: mfvsrd 3, 34
783 ; CHECK: rldicl 3, 3, 48, 48
785 ; CHECK-LE-LABEL: @getss2
786 ; CHECK-LE: mfvsrd 3,
787 ; CHECK-LE: rldicl 3, 3, 32, 48
788 ; CHECK-LE: extsh 3, 3
791 ; Function Attrs: nounwind
792 define signext i16 @getss3(<8 x i16> %vss) {
794 %vss.addr = alloca <8 x i16>, align 16
795 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
796 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
797 %vecext = extractelement <8 x i16> %0, i32 3
799 ; CHECK-LABEL: @getss3
800 ; CHECK: mfvsrd 3, 34
801 ; CHECK: clrldi 3, 3, 48
803 ; CHECK-LE-LABEL: @getss3
804 ; CHECK-LE: mfvsrd 3,
805 ; CHECK-LE: rldicl 3, 3, 16, 48
806 ; CHECK-LE: extsh 3, 3
809 ; Function Attrs: nounwind
810 define signext i16 @getss4(<8 x i16> %vss) {
812 %vss.addr = alloca <8 x i16>, align 16
813 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
814 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
815 %vecext = extractelement <8 x i16> %0, i32 4
817 ; CHECK-LABEL: @getss4
819 ; CHECK: rldicl 3, 3, 16, 48
821 ; CHECK-LE-LABEL: @getss4
822 ; CHECK-LE: mfvsrd 3, 34
823 ; CHECK-LE: clrldi 3, 3, 48
824 ; CHECK-LE: extsh 3, 3
827 ; Function Attrs: nounwind
828 define signext i16 @getss5(<8 x i16> %vss) {
830 %vss.addr = alloca <8 x i16>, align 16
831 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
832 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
833 %vecext = extractelement <8 x i16> %0, i32 5
835 ; CHECK-LABEL: @getss5
837 ; CHECK: rldicl 3, 3, 32, 48
839 ; CHECK-LE-LABEL: @getss5
840 ; CHECK-LE: mfvsrd 3, 34
841 ; CHECK-LE: rldicl 3, 3, 48, 48
842 ; CHECK-LE: extsh 3, 3
845 ; Function Attrs: nounwind
846 define signext i16 @getss6(<8 x i16> %vss) {
848 %vss.addr = alloca <8 x i16>, align 16
849 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
850 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
851 %vecext = extractelement <8 x i16> %0, i32 6
853 ; CHECK-LABEL: @getss6
855 ; CHECK: rldicl 3, 3, 48, 48
857 ; CHECK-LE-LABEL: @getss6
858 ; CHECK-LE: mfvsrd 3, 34
859 ; CHECK-LE: rldicl 3, 3, 32, 48
860 ; CHECK-LE: extsh 3, 3
863 ; Function Attrs: nounwind
864 define signext i16 @getss7(<8 x i16> %vss) {
866 %vss.addr = alloca <8 x i16>, align 16
867 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
868 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
869 %vecext = extractelement <8 x i16> %0, i32 7
871 ; CHECK-LABEL: @getss7
874 ; CHECK-LE-LABEL: @getss7
875 ; CHECK-LE: mfvsrd 3, 34
876 ; CHECK-LE: rldicl 3, 3, 16, 48
877 ; CHECK-LE: extsh 3, 3
880 ; Function Attrs: nounwind
881 define zeroext i16 @getus0(<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 0
888 ; CHECK-LABEL: @getus0
889 ; CHECK: mfvsrd 3, 34
890 ; CHECK: rldicl 3, 3, 16, 48
891 ; CHECK: clrldi 3, 3, 48
892 ; CHECK-LE-LABEL: @getus0
893 ; CHECK-LE: mfvsrd 3,
894 ; CHECK-LE: clrldi 3, 3, 48
897 ; Function Attrs: nounwind
898 define zeroext i16 @getus1(<8 x i16> %vus) {
900 %vus.addr = alloca <8 x i16>, align 16
901 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
902 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
903 %vecext = extractelement <8 x i16> %0, i32 1
905 ; CHECK-LABEL: @getus1
906 ; CHECK: mfvsrd 3, 34
907 ; CHECK: rldicl 3, 3, 32, 48
908 ; CHECK: clrldi 3, 3, 48
909 ; CHECK-LE-LABEL: @getus1
910 ; CHECK-LE: mfvsrd 3,
911 ; CHECK-LE: rldicl 3, 3, 48, 48
912 ; CHECK-LE: clrldi 3, 3, 48
915 ; Function Attrs: nounwind
916 define zeroext i16 @getus2(<8 x i16> %vus) {
918 %vus.addr = alloca <8 x i16>, align 16
919 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
920 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
921 %vecext = extractelement <8 x i16> %0, i32 2
923 ; CHECK-LABEL: @getus2
924 ; CHECK: mfvsrd 3, 34
925 ; CHECK: rldicl 3, 3, 48, 48
926 ; CHECK: clrldi 3, 3, 48
927 ; CHECK-LE-LABEL: @getus2
928 ; CHECK-LE: mfvsrd 3,
929 ; CHECK-LE: rldicl 3, 3, 32, 48
930 ; CHECK-LE: clrldi 3, 3, 48
933 ; Function Attrs: nounwind
934 define zeroext i16 @getus3(<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 3
941 ; CHECK-LABEL: @getus3
942 ; CHECK: mfvsrd 3, 34
943 ; CHECK: clrldi 3, 3, 48
944 ; CHECK-LE-LABEL: @getus3
945 ; CHECK-LE: mfvsrd 3,
946 ; CHECK-LE: rldicl 3, 3, 16, 48
947 ; CHECK-LE: clrldi 3, 3, 48
950 ; Function Attrs: nounwind
951 define zeroext i16 @getus4(<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 4
958 ; CHECK-LABEL: @getus4
960 ; CHECK: rldicl 3, 3, 16, 48
961 ; CHECK: clrldi 3, 3, 48
962 ; CHECK-LE-LABEL: @getus4
963 ; CHECK-LE: mfvsrd 3, 34
964 ; CHECK-LE: clrldi 3, 3, 48
967 ; Function Attrs: nounwind
968 define zeroext i16 @getus5(<8 x i16> %vus) {
970 %vus.addr = alloca <8 x i16>, align 16
971 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
972 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
973 %vecext = extractelement <8 x i16> %0, i32 5
975 ; CHECK-LABEL: @getus5
977 ; CHECK: rldicl 3, 3, 32, 48
978 ; CHECK: clrldi 3, 3, 48
979 ; CHECK-LE-LABEL: @getus5
980 ; CHECK-LE: mfvsrd 3, 34
981 ; CHECK-LE: rldicl 3, 3, 48, 48
982 ; CHECK-LE: clrldi 3, 3, 48
985 ; Function Attrs: nounwind
986 define zeroext i16 @getus6(<8 x i16> %vus) {
988 %vus.addr = alloca <8 x i16>, align 16
989 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
990 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
991 %vecext = extractelement <8 x i16> %0, i32 6
993 ; CHECK-LABEL: @getus6
995 ; CHECK: rldicl 3, 3, 48, 48
996 ; CHECK: clrldi 3, 3, 48
997 ; CHECK-LE-LABEL: @getus6
998 ; CHECK-LE: mfvsrd 3, 34
999 ; CHECK-LE: rldicl 3, 3, 32, 48
1000 ; CHECK-LE: clrldi 3, 3, 48
1003 ; Function Attrs: nounwind
1004 define zeroext i16 @getus7(<8 x i16> %vus) {
1006 %vus.addr = alloca <8 x i16>, align 16
1007 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
1008 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
1009 %vecext = extractelement <8 x i16> %0, i32 7
1011 ; CHECK-LABEL: @getus7
1013 ; CHECK: clrldi 3, 3, 48
1014 ; CHECK-LE-LABEL: @getus7
1015 ; CHECK-LE: mfvsrd 3, 34
1016 ; CHECK-LE: rldicl 3, 3, 16, 48
1017 ; CHECK-LE: clrldi 3, 3, 48
1020 ; Function Attrs: nounwind
1021 define signext i16 @getvelss(<8 x i16> %vss, i32 signext %i) {
1023 %vss.addr = alloca <8 x i16>, align 16
1024 %i.addr = alloca i32, align 4
1025 store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
1026 store i32 %i, i32* %i.addr, align 4
1027 %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
1028 %1 = load i32, i32* %i.addr, align 4
1029 %vecext = extractelement <8 x i16> %0, i32 %1
1031 ; CHECK-LABEL: @getvelss
1032 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 4
1033 ; CHECK-DAG: sldi [[MUL2:[0-9]+]], [[ANDI]], 1
1034 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
1035 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
1036 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
1037 ; CHECK-DAG: li [[IMM3:[0-9]+]], 3
1038 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM3]]
1039 ; CHECK-DAG: rldicr [[SHL:[0-9]+]], [[ANDC]], 4, 60
1040 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
1041 ; CHECK-DAG: extsh 3, 3
1042 ; CHECK-LE-LABEL: @getvelss
1043 ; CHECK-DAG-LE: li [[IMM4:[0-9]+]], 4
1044 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM4]]
1045 ; CHECK-DAG-LE: sldi [[MUL2:[0-9]+]], [[ANDC]], 1
1046 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
1047 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
1048 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
1049 ; CHECK-DAG-LE: li [[IMM3:[0-9]+]], 3
1050 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM3]]
1051 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 4
1052 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
1053 ; CHECK-DAG-LE: extsh 3, 3
1056 ; Function Attrs: nounwind
1057 define zeroext i16 @getvelus(<8 x i16> %vus, i32 signext %i) {
1059 %vus.addr = alloca <8 x i16>, align 16
1060 %i.addr = alloca i32, align 4
1061 store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
1062 store i32 %i, i32* %i.addr, align 4
1063 %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
1064 %1 = load i32, i32* %i.addr, align 4
1065 %vecext = extractelement <8 x i16> %0, i32 %1
1067 ; CHECK-LABEL: @getvelus
1068 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 4
1069 ; CHECK-DAG: sldi [[MUL2:[0-9]+]], [[ANDI]], 1
1070 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
1071 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
1072 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
1073 ; CHECK-DAG: li [[IMM3:[0-9]+]], 3
1074 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM3]]
1075 ; CHECK-DAG: rldicr [[SHL:[0-9]+]], [[ANDC]], 4, 60
1076 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
1077 ; CHECK-DAG: clrldi 3, 3, 48
1078 ; CHECK-LE-LABEL: @getvelus
1079 ; CHECK-DAG-LE: li [[IMM4:[0-9]+]], 4
1080 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM4]]
1081 ; CHECK-DAG-LE: sldi [[MUL2:[0-9]+]], [[ANDC]], 1
1082 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
1083 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
1084 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
1085 ; CHECK-DAG-LE: li [[IMM3:[0-9]+]], 3
1086 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM3]]
1087 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 4
1088 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
1089 ; CHECK-DAG-LE: clrldi 3, 3, 48
1092 ; Function Attrs: nounwind
1093 define signext i32 @getsi0(<4 x i32> %vsi) {
1095 %vsi.addr = alloca <4 x i32>, align 16
1096 store <4 x i32> %vsi, <4 x i32>* %vsi.addr, align 16
1097 %0 = load <4 x i32>, <4 x i32>* %vsi.addr, align 16
1098 %vecext = extractelement <4 x i32> %0, i32 0
1100 ; CHECK-LABEL: @getsi0
1101 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1102 ; CHECK: mfvsrwz 3, [[SHL]]
1104 ; CHECK-LE-LABEL: @getsi0
1105 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1106 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1107 ; CHECK-LE: extsw 3, 3
1110 ; Function Attrs: nounwind
1111 define signext i32 @getsi1(<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 1
1118 ; CHECK-LABEL: @getsi1
1119 ; CHECK: mfvsrwz 3, 34
1121 ; CHECK-LE-LABEL: @getsi1
1122 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1123 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1124 ; CHECK-LE: extsw 3, 3
1127 ; Function Attrs: nounwind
1128 define signext i32 @getsi2(<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 2
1135 ; CHECK-LABEL: @getsi2
1136 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1137 ; CHECK: mfvsrwz 3, [[SHL]]
1139 ; CHECK-LE-LABEL: @getsi2
1140 ; CHECK-LE: mfvsrwz 3, 34
1141 ; CHECK-LE: extsw 3, 3
1144 ; Function Attrs: nounwind
1145 define signext i32 @getsi3(<4 x i32> %vsi) {
1147 %vsi.addr = alloca <4 x i32>, align 16
1148 store <4 x i32> %vsi, <4 x i32>* %vsi.addr, align 16
1149 %0 = load <4 x i32>, <4 x i32>* %vsi.addr, align 16
1150 %vecext = extractelement <4 x i32> %0, i32 3
1152 ; CHECK-LABEL: @getsi3
1153 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1154 ; CHECK: mfvsrwz 3, [[SHL]]
1156 ; CHECK-LE-LABEL: @getsi3
1157 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1158 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1159 ; CHECK-LE: extsw 3, 3
1162 ; Function Attrs: nounwind
1163 define zeroext i32 @getui0(<4 x i32> %vui) {
1165 %vui.addr = alloca <4 x i32>, align 16
1166 store <4 x i32> %vui, <4 x i32>* %vui.addr, align 16
1167 %0 = load <4 x i32>, <4 x i32>* %vui.addr, align 16
1168 %vecext = extractelement <4 x i32> %0, i32 0
1170 ; CHECK-LABEL: @getui0
1171 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1172 ; CHECK: mfvsrwz 3, [[SHL]]
1173 ; CHECK: clrldi 3, 3, 32
1174 ; CHECK-LE-LABEL: @getui0
1175 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1176 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1177 ; CHECK-LE: clrldi 3, 3, 32
1180 ; Function Attrs: nounwind
1181 define zeroext i32 @getui1(<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 1
1188 ; CHECK-LABEL: @getui1
1189 ; CHECK: mfvsrwz 3, 34
1190 ; CHECK: clrldi 3, 3, 32
1191 ; CHECK-LE-LABEL: @getui1
1192 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1193 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1194 ; CHECK-LE: clrldi 3, 3, 32
1197 ; Function Attrs: nounwind
1198 define zeroext i32 @getui2(<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 2
1205 ; CHECK-LABEL: @getui2
1206 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1207 ; CHECK: mfvsrwz 3, [[SHL]]
1208 ; CHECK: clrldi 3, 3, 32
1209 ; CHECK-LE-LABEL: @getui2
1210 ; CHECK-LE: mfvsrwz 3, 34
1211 ; CHECK-LE: clrldi 3, 3, 32
1214 ; Function Attrs: nounwind
1215 define zeroext i32 @getui3(<4 x i32> %vui) {
1217 %vui.addr = alloca <4 x i32>, align 16
1218 store <4 x i32> %vui, <4 x i32>* %vui.addr, align 16
1219 %0 = load <4 x i32>, <4 x i32>* %vui.addr, align 16
1220 %vecext = extractelement <4 x i32> %0, i32 3
1222 ; CHECK-LABEL: @getui3
1223 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1224 ; CHECK: mfvsrwz 3, [[SHL]]
1225 ; CHECK: clrldi 3, 3, 32
1226 ; CHECK-LE-LABEL: @getui3
1227 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1228 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1229 ; CHECK-LE: clrldi 3, 3, 32
1232 ; Function Attrs: nounwind
1233 define signext i32 @getvelsi(<4 x i32> %vsi, i32 signext %i) {
1235 %vsi.addr = alloca <4 x i32>, align 16
1236 %i.addr = alloca i32, align 4
1237 store <4 x i32> %vsi, <4 x i32>* %vsi.addr, align 16
1238 store i32 %i, i32* %i.addr, align 4
1239 %0 = load <4 x i32>, <4 x i32>* %vsi.addr, align 16
1240 %1 = load i32, i32* %i.addr, align 4
1241 %vecext = extractelement <4 x i32> %0, i32 %1
1243 ; CHECK-LABEL: @getvelsi
1244 ; CHECK-LE-LABEL: @getvelsi
1245 ; FIXME: add check patterns when variable element extraction is implemented
1248 ; Function Attrs: nounwind
1249 define zeroext i32 @getvelui(<4 x i32> %vui, i32 signext %i) {
1251 %vui.addr = alloca <4 x i32>, align 16
1252 %i.addr = alloca i32, align 4
1253 store <4 x i32> %vui, <4 x i32>* %vui.addr, align 16
1254 store i32 %i, i32* %i.addr, align 4
1255 %0 = load <4 x i32>, <4 x i32>* %vui.addr, align 16
1256 %1 = load i32, i32* %i.addr, align 4
1257 %vecext = extractelement <4 x i32> %0, i32 %1
1259 ; CHECK-LABEL: @getvelui
1260 ; CHECK-LE-LABEL: @getvelui
1261 ; FIXME: add check patterns when variable element extraction is implemented
1264 ; Function Attrs: nounwind
1265 define i64 @getsl0(<2 x i64> %vsl) {
1267 %vsl.addr = alloca <2 x i64>, align 16
1268 store <2 x i64> %vsl, <2 x i64>* %vsl.addr, align 16
1269 %0 = load <2 x i64>, <2 x i64>* %vsl.addr, align 16
1270 %vecext = extractelement <2 x i64> %0, i32 0
1272 ; CHECK-LABEL: @getsl0
1273 ; CHECK: mfvsrd 3, 34
1274 ; CHECK-LE-LABEL: @getsl0
1275 ; CHECK-LE: xxswapd [[SWP:[0-9]+]], 34
1276 ; CHECK-LE: mfvsrd 3, [[SWP]]
1279 ; Function Attrs: nounwind
1280 define i64 @getsl1(<2 x i64> %vsl) {
1282 %vsl.addr = alloca <2 x i64>, align 16
1283 store <2 x i64> %vsl, <2 x i64>* %vsl.addr, align 16
1284 %0 = load <2 x i64>, <2 x i64>* %vsl.addr, align 16
1285 %vecext = extractelement <2 x i64> %0, i32 1
1287 ; CHECK-LABEL: @getsl1
1288 ; CHECK: xxswapd [[SWP:[0-9]+]], 34
1289 ; CHECK: mfvsrd 3, [[SWP]]
1290 ; CHECK-LE-LABEL: @getsl1
1291 ; CHECK-LE: mfvsrd 3, 34
1294 ; Function Attrs: nounwind
1295 define i64 @getul0(<2 x i64> %vul) {
1297 %vul.addr = alloca <2 x i64>, align 16
1298 store <2 x i64> %vul, <2 x i64>* %vul.addr, align 16
1299 %0 = load <2 x i64>, <2 x i64>* %vul.addr, align 16
1300 %vecext = extractelement <2 x i64> %0, i32 0
1302 ; CHECK-LABEL: @getul0
1303 ; CHECK: mfvsrd 3, 34
1304 ; CHECK-LE-LABEL: @getul0
1305 ; CHECK-LE: xxswapd [[SWP:[0-9]+]], 34
1306 ; CHECK-LE: mfvsrd 3, [[SWP]]
1309 ; Function Attrs: nounwind
1310 define i64 @getul1(<2 x i64> %vul) {
1312 %vul.addr = alloca <2 x i64>, align 16
1313 store <2 x i64> %vul, <2 x i64>* %vul.addr, align 16
1314 %0 = load <2 x i64>, <2 x i64>* %vul.addr, align 16
1315 %vecext = extractelement <2 x i64> %0, i32 1
1317 ; CHECK-LABEL: @getul1
1318 ; CHECK: xxswapd [[SWP:[0-9]+]], 34
1319 ; CHECK: mfvsrd 3, [[SWP]]
1320 ; CHECK-LE-LABEL: @getul1
1321 ; CHECK-LE: mfvsrd 3, 34
1324 ; Function Attrs: nounwind
1325 define i64 @getvelsl(<2 x i64> %vsl, i32 signext %i) {
1327 %vsl.addr = alloca <2 x i64>, align 16
1328 %i.addr = alloca i32, align 4
1329 store <2 x i64> %vsl, <2 x i64>* %vsl.addr, align 16
1330 store i32 %i, i32* %i.addr, align 4
1331 %0 = load <2 x i64>, <2 x i64>* %vsl.addr, align 16
1332 %1 = load i32, i32* %i.addr, align 4
1333 %vecext = extractelement <2 x i64> %0, i32 %1
1335 ; CHECK-LABEL: @getvelsl
1336 ; CHECK-LE-LABEL: @getvelsl
1337 ; FIXME: add check patterns when variable element extraction is implemented
1340 ; Function Attrs: nounwind
1341 define i64 @getvelul(<2 x i64> %vul, i32 signext %i) {
1343 %vul.addr = alloca <2 x i64>, align 16
1344 %i.addr = alloca i32, align 4
1345 store <2 x i64> %vul, <2 x i64>* %vul.addr, align 16
1346 store i32 %i, i32* %i.addr, align 4
1347 %0 = load <2 x i64>, <2 x i64>* %vul.addr, align 16
1348 %1 = load i32, i32* %i.addr, align 4
1349 %vecext = extractelement <2 x i64> %0, i32 %1
1351 ; CHECK-LABEL: @getvelul
1352 ; CHECK-LE-LABEL: @getvelul
1353 ; FIXME: add check patterns when variable element extraction is implemented
1356 ; Function Attrs: nounwind
1357 define float @getf0(<4 x float> %vf) {
1359 %vf.addr = alloca <4 x float>, align 16
1360 store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1361 %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1362 %vecext = extractelement <4 x float> %0, i32 0
1364 ; CHECK-LABEL: @getf0
1365 ; CHECK: xscvspdpn 1, 34
1366 ; CHECK-LE-LABEL: @getf0
1367 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1368 ; CHECK-LE: xscvspdpn 1, [[SHL]]
1371 ; Function Attrs: nounwind
1372 define float @getf1(<4 x float> %vf) {
1374 %vf.addr = alloca <4 x float>, align 16
1375 store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1376 %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1377 %vecext = extractelement <4 x float> %0, i32 1
1379 ; CHECK-LABEL: @getf1
1380 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1381 ; CHECK: xscvspdpn 1, [[SHL]]
1382 ; CHECK-LE-LABEL: @getf1
1383 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1384 ; CHECK-LE: xscvspdpn 1, [[SHL]]
1387 ; Function Attrs: nounwind
1388 define float @getf2(<4 x float> %vf) {
1390 %vf.addr = alloca <4 x float>, align 16
1391 store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1392 %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1393 %vecext = extractelement <4 x float> %0, i32 2
1395 ; CHECK-LABEL: @getf2
1396 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1397 ; CHECK: xscvspdpn 1, [[SHL]]
1398 ; CHECK-LE-LABEL: @getf2
1399 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1400 ; CHECK-LE: xscvspdpn 1, [[SHL]]
1403 ; Function Attrs: nounwind
1404 define float @getf3(<4 x float> %vf) {
1406 %vf.addr = alloca <4 x float>, align 16
1407 store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1408 %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1409 %vecext = extractelement <4 x float> %0, i32 3
1411 ; CHECK-LABEL: @getf3
1412 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1413 ; CHECK: xscvspdpn 1, [[SHL]]
1414 ; CHECK-LE-LABEL: @getf3
1415 ; CHECK-LE: xscvspdpn 1, 34
1418 ; Function Attrs: nounwind
1419 define float @getvelf(<4 x float> %vf, i32 signext %i) {
1421 %vf.addr = alloca <4 x float>, align 16
1422 %i.addr = alloca i32, align 4
1423 store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1424 store i32 %i, i32* %i.addr, align 4
1425 %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1426 %1 = load i32, i32* %i.addr, align 4
1427 %vecext = extractelement <4 x float> %0, i32 %1
1429 ; CHECK-LABEL: @getvelf
1430 ; CHECK-LE-LABEL: @getvelf
1431 ; FIXME: add check patterns when variable element extraction is implemented
1434 ; Function Attrs: nounwind
1435 define double @getd0(<2 x double> %vd) {
1437 %vd.addr = alloca <2 x double>, align 16
1438 store <2 x double> %vd, <2 x double>* %vd.addr, align 16
1439 %0 = load <2 x double>, <2 x double>* %vd.addr, align 16
1440 %vecext = extractelement <2 x double> %0, i32 0
1442 ; CHECK-LABEL: @getd0
1443 ; CHECK: xxlor 1, 34, 34
1444 ; CHECK-LE-LABEL: @getd0
1445 ; CHECK-LE: xxswapd 1, 34
1448 ; Function Attrs: nounwind
1449 define double @getd1(<2 x double> %vd) {
1451 %vd.addr = alloca <2 x double>, align 16
1452 store <2 x double> %vd, <2 x double>* %vd.addr, align 16
1453 %0 = load <2 x double>, <2 x double>* %vd.addr, align 16
1454 %vecext = extractelement <2 x double> %0, i32 1
1456 ; CHECK-LABEL: @getd1
1457 ; CHECK: xxswapd 1, 34
1458 ; CHECK-LE-LABEL: @getd1
1459 ; CHECK-LE: xxlor 1, 34, 34
1462 ; Function Attrs: nounwind
1463 define double @getveld(<2 x double> %vd, i32 signext %i) {
1465 %vd.addr = alloca <2 x double>, align 16
1466 %i.addr = alloca i32, align 4
1467 store <2 x double> %vd, <2 x double>* %vd.addr, align 16
1468 store i32 %i, i32* %i.addr, align 4
1469 %0 = load <2 x double>, <2 x double>* %vd.addr, align 16
1470 %1 = load i32, i32* %i.addr, align 4
1471 %vecext = extractelement <2 x double> %0, i32 %1
1473 ; CHECK-LABEL: @getveld
1474 ; CHECK-LE-LABEL: @getveld
1475 ; FIXME: add check patterns when variable element extraction is implemented