[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / PowerPC / aix32-p8-scalar_vector_conversions.ll
blob19e298a633e0bd23c5d1e19e7bf35877b6e19cd4
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=powerpc-ibm-aix-xcoff -verify-machineinstrs \
3 ; RUN:          -mcpu=pwr8 -vec-extabi | FileCheck %s
5 ; The build[csilf] functions simply test the scalar_to_vector handling with
6 ; direct moves. This corresponds to the "insertelement" instruction. Subsequent
7 ; to this, there will be a splat corresponding to the shufflevector.
9 @d = common global double 0.000000e+00, align 8
11 ; Function Attrs: norecurse nounwind readnone
12 define <16 x i8> @buildc(i8 zeroext %a) {
13 ; CHECK-LABEL: buildc:
14 ; CHECK:       # %bb.0: # %entry
15 ; CHECK-NEXT:    mtvsrwz 34, 3
16 ; CHECK-NEXT:    vspltb 2, 2, 7
17 ; CHECK-NEXT:    blr
18 entry:
19   %splat.splatinsert = insertelement <16 x i8> undef, i8 %a, i32 0
20   %splat.splat = shufflevector <16 x i8> %splat.splatinsert, <16 x i8> undef, <16 x i32> zeroinitializer
21   ret <16 x i8> %splat.splat
24 ; Function Attrs: norecurse nounwind readnone
25 define <8 x i16> @builds(i16 zeroext %a) {
26 ; CHECK-LABEL: builds:
27 ; CHECK:       # %bb.0: # %entry
28 ; CHECK-NEXT:    sth 3, -16(1)
29 ; CHECK-NEXT:    addi 3, 1, -16
30 ; CHECK-NEXT:    lxvw4x 34, 0, 3
31 ; CHECK-NEXT:    vsplth 2, 2, 0
32 ; CHECK-NEXT:    blr
33 entry:
34   %splat.splatinsert = insertelement <8 x i16> undef, i16 %a, i32 0
35   %splat.splat = shufflevector <8 x i16> %splat.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer
36   ret <8 x i16> %splat.splat
39 ; Function Attrs: norecurse nounwind readnone
40 define <4 x i32> @buildi(i32 zeroext %a) {
41 ; CHECK-LABEL: buildi:
42 ; CHECK:       # %bb.0: # %entry
43 ; CHECK-NEXT:    stw 3, -16(1)
44 ; CHECK-NEXT:    addi 3, 1, -16
45 ; CHECK-NEXT:    lxvw4x 0, 0, 3
46 ; CHECK-NEXT:    xxspltw 34, 0, 0
47 ; CHECK-NEXT:    blr
48 entry:
49   %splat.splatinsert = insertelement <4 x i32> undef, i32 %a, i32 0
50   %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
51   ret <4 x i32> %splat.splat
54 ; Function Attrs: norecurse nounwind readnone
55 define <2 x i64> @buildl(i64 %a) {
56 ; CHECK-LABEL: buildl:
57 ; CHECK:       # %bb.0: # %entry
58 ; CHECK-NEXT:    stw 3, -32(1)
59 ; CHECK-NEXT:    lwz 3, L..C0(2) # %const.0
60 ; CHECK-NEXT:    stw 4, -16(1)
61 ; CHECK-NEXT:    lxvw4x 34, 0, 3
62 ; CHECK-NEXT:    addi 3, 1, -16
63 ; CHECK-NEXT:    lxvw4x 35, 0, 3
64 ; CHECK-NEXT:    addi 3, 1, -32
65 ; CHECK-NEXT:    lxvw4x 36, 0, 3
66 ; CHECK-NEXT:    vperm 2, 4, 3, 2
67 ; CHECK-NEXT:    blr
68 entry:
69   %splat.splatinsert = insertelement <2 x i64> undef, i64 %a, i32 0
70   %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
71   ret <2 x i64> %splat.splat
74 ; Function Attrs: norecurse nounwind readnone
75 define <4 x float> @buildf(float %a) {
76 ; CHECK-LABEL: buildf:
77 ; CHECK:       # %bb.0: # %entry
78 ; CHECK-NEXT:    xscvdpspn 0, 1
79 ; CHECK-NEXT:    xxspltw 34, 0, 1
80 ; CHECK-NEXT:    blr
81 entry:
82   %splat.splatinsert = insertelement <4 x float> undef, float %a, i32 0
83   %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer
84   ret <4 x float> %splat.splat
87 ; The optimization to remove stack operations from PPCDAGToDAGISel::Select
88 ; should still trigger for v2f64, producing an lxvdsx.
89 ; Function Attrs: norecurse nounwind readonly
90 define <2 x double> @buildd() {
91 ; CHECK-LABEL: buildd:
92 ; CHECK:       # %bb.0: # %entry
93 ; CHECK-NEXT:    lwz 3, L..C1(2) # @d
94 ; CHECK-NEXT:    lxvdsx 34, 0, 3
95 ; CHECK-NEXT:    blr
96 entry:
97   %0 = load double, ptr @d, align 8
98   %splat.splatinsert = insertelement <2 x double> undef, double %0, i32 0
99   %splat.splat = shufflevector <2 x double> %splat.splatinsert, <2 x double> undef, <2 x i32> zeroinitializer
100   ret <2 x double> %splat.splat
103 ; Function Attrs: norecurse nounwind readnone
104 define signext i8 @getsc0(<16 x i8> %vsc) {
105 ; CHECK-LABEL: getsc0:
106 ; CHECK:       # %bb.0: # %entry
107 ; CHECK-NEXT:    addi 3, 1, -16
108 ; CHECK-NEXT:    stxvw4x 34, 0, 3
109 ; CHECK-NEXT:    lbz 3, -16(1)
110 ; CHECK-NEXT:    extsb 3, 3
111 ; CHECK-NEXT:    blr
112 entry:
113   %vecext = extractelement <16 x i8> %vsc, i32 0
114   ret i8 %vecext
117 ; Function Attrs: norecurse nounwind readnone
118 define signext i8 @getsc1(<16 x i8> %vsc) {
119 ; CHECK-LABEL: getsc1:
120 ; CHECK:       # %bb.0: # %entry
121 ; CHECK-NEXT:    addi 3, 1, -16
122 ; CHECK-NEXT:    stxvw4x 34, 0, 3
123 ; CHECK-NEXT:    lbz 3, -15(1)
124 ; CHECK-NEXT:    extsb 3, 3
125 ; CHECK-NEXT:    blr
126 entry:
127   %vecext = extractelement <16 x i8> %vsc, i32 1
128   ret i8 %vecext
131 ; Function Attrs: norecurse nounwind readnone
132 define signext i8 @getsc2(<16 x i8> %vsc) {
133 ; CHECK-LABEL: getsc2:
134 ; CHECK:       # %bb.0: # %entry
135 ; CHECK-NEXT:    addi 3, 1, -16
136 ; CHECK-NEXT:    stxvw4x 34, 0, 3
137 ; CHECK-NEXT:    lbz 3, -14(1)
138 ; CHECK-NEXT:    extsb 3, 3
139 ; CHECK-NEXT:    blr
140 entry:
141   %vecext = extractelement <16 x i8> %vsc, i32 2
142   ret i8 %vecext
145 ; Function Attrs: norecurse nounwind readnone
146 define signext i8 @getsc3(<16 x i8> %vsc) {
147 ; CHECK-LABEL: getsc3:
148 ; CHECK:       # %bb.0: # %entry
149 ; CHECK-NEXT:    addi 3, 1, -16
150 ; CHECK-NEXT:    stxvw4x 34, 0, 3
151 ; CHECK-NEXT:    lbz 3, -13(1)
152 ; CHECK-NEXT:    extsb 3, 3
153 ; CHECK-NEXT:    blr
154 entry:
155   %vecext = extractelement <16 x i8> %vsc, i32 3
156   ret i8 %vecext
159 ; Function Attrs: norecurse nounwind readnone
160 define signext i8 @getsc4(<16 x i8> %vsc) {
161 ; CHECK-LABEL: getsc4:
162 ; CHECK:       # %bb.0: # %entry
163 ; CHECK-NEXT:    addi 3, 1, -16
164 ; CHECK-NEXT:    stxvw4x 34, 0, 3
165 ; CHECK-NEXT:    lbz 3, -12(1)
166 ; CHECK-NEXT:    extsb 3, 3
167 ; CHECK-NEXT:    blr
168 entry:
169   %vecext = extractelement <16 x i8> %vsc, i32 4
170   ret i8 %vecext
173 ; Function Attrs: norecurse nounwind readnone
174 define signext i8 @getsc5(<16 x i8> %vsc) {
175 ; CHECK-LABEL: getsc5:
176 ; CHECK:       # %bb.0: # %entry
177 ; CHECK-NEXT:    addi 3, 1, -16
178 ; CHECK-NEXT:    stxvw4x 34, 0, 3
179 ; CHECK-NEXT:    lbz 3, -11(1)
180 ; CHECK-NEXT:    extsb 3, 3
181 ; CHECK-NEXT:    blr
182 entry:
183   %vecext = extractelement <16 x i8> %vsc, i32 5
184   ret i8 %vecext
187 ; Function Attrs: norecurse nounwind readnone
188 define signext i8 @getsc6(<16 x i8> %vsc) {
189 ; CHECK-LABEL: getsc6:
190 ; CHECK:       # %bb.0: # %entry
191 ; CHECK-NEXT:    addi 3, 1, -16
192 ; CHECK-NEXT:    stxvw4x 34, 0, 3
193 ; CHECK-NEXT:    lbz 3, -10(1)
194 ; CHECK-NEXT:    extsb 3, 3
195 ; CHECK-NEXT:    blr
196 entry:
197   %vecext = extractelement <16 x i8> %vsc, i32 6
198   ret i8 %vecext
201 ; Function Attrs: norecurse nounwind readnone
202 define signext i8 @getsc7(<16 x i8> %vsc) {
203 ; CHECK-LABEL: getsc7:
204 ; CHECK:       # %bb.0: # %entry
205 ; CHECK-NEXT:    addi 3, 1, -16
206 ; CHECK-NEXT:    stxvw4x 34, 0, 3
207 ; CHECK-NEXT:    lbz 3, -9(1)
208 ; CHECK-NEXT:    extsb 3, 3
209 ; CHECK-NEXT:    blr
210 entry:
211   %vecext = extractelement <16 x i8> %vsc, i32 7
212   ret i8 %vecext
215 ; Function Attrs: norecurse nounwind readnone
216 define signext i8 @getsc8(<16 x i8> %vsc) {
217 ; CHECK-LABEL: getsc8:
218 ; CHECK:       # %bb.0: # %entry
219 ; CHECK-NEXT:    addi 3, 1, -16
220 ; CHECK-NEXT:    stxvw4x 34, 0, 3
221 ; CHECK-NEXT:    lbz 3, -8(1)
222 ; CHECK-NEXT:    extsb 3, 3
223 ; CHECK-NEXT:    blr
224 entry:
225   %vecext = extractelement <16 x i8> %vsc, i32 8
226   ret i8 %vecext
229 ; Function Attrs: norecurse nounwind readnone
230 define signext i8 @getsc9(<16 x i8> %vsc) {
231 ; CHECK-LABEL: getsc9:
232 ; CHECK:       # %bb.0: # %entry
233 ; CHECK-NEXT:    addi 3, 1, -16
234 ; CHECK-NEXT:    stxvw4x 34, 0, 3
235 ; CHECK-NEXT:    lbz 3, -7(1)
236 ; CHECK-NEXT:    extsb 3, 3
237 ; CHECK-NEXT:    blr
238 entry:
239   %vecext = extractelement <16 x i8> %vsc, i32 9
240   ret i8 %vecext
243 ; Function Attrs: norecurse nounwind readnone
244 define signext i8 @getsc10(<16 x i8> %vsc) {
245 ; CHECK-LABEL: getsc10:
246 ; CHECK:       # %bb.0: # %entry
247 ; CHECK-NEXT:    addi 3, 1, -16
248 ; CHECK-NEXT:    stxvw4x 34, 0, 3
249 ; CHECK-NEXT:    lbz 3, -6(1)
250 ; CHECK-NEXT:    extsb 3, 3
251 ; CHECK-NEXT:    blr
252 entry:
253   %vecext = extractelement <16 x i8> %vsc, i32 10
254   ret i8 %vecext
257 ; Function Attrs: norecurse nounwind readnone
258 define signext i8 @getsc11(<16 x i8> %vsc) {
259 ; CHECK-LABEL: getsc11:
260 ; CHECK:       # %bb.0: # %entry
261 ; CHECK-NEXT:    addi 3, 1, -16
262 ; CHECK-NEXT:    stxvw4x 34, 0, 3
263 ; CHECK-NEXT:    lbz 3, -5(1)
264 ; CHECK-NEXT:    extsb 3, 3
265 ; CHECK-NEXT:    blr
266 entry:
267   %vecext = extractelement <16 x i8> %vsc, i32 11
268   ret i8 %vecext
271 ; Function Attrs: norecurse nounwind readnone
272 define signext i8 @getsc12(<16 x i8> %vsc) {
273 ; CHECK-LABEL: getsc12:
274 ; CHECK:       # %bb.0: # %entry
275 ; CHECK-NEXT:    addi 3, 1, -16
276 ; CHECK-NEXT:    stxvw4x 34, 0, 3
277 ; CHECK-NEXT:    lbz 3, -4(1)
278 ; CHECK-NEXT:    extsb 3, 3
279 ; CHECK-NEXT:    blr
280 entry:
281   %vecext = extractelement <16 x i8> %vsc, i32 12
282   ret i8 %vecext
285 ; Function Attrs: norecurse nounwind readnone
286 define signext i8 @getsc13(<16 x i8> %vsc) {
287 ; CHECK-LABEL: getsc13:
288 ; CHECK:       # %bb.0: # %entry
289 ; CHECK-NEXT:    addi 3, 1, -16
290 ; CHECK-NEXT:    stxvw4x 34, 0, 3
291 ; CHECK-NEXT:    lbz 3, -3(1)
292 ; CHECK-NEXT:    extsb 3, 3
293 ; CHECK-NEXT:    blr
294 entry:
295   %vecext = extractelement <16 x i8> %vsc, i32 13
296   ret i8 %vecext
299 ; Function Attrs: norecurse nounwind readnone
300 define signext i8 @getsc14(<16 x i8> %vsc) {
301 ; CHECK-LABEL: getsc14:
302 ; CHECK:       # %bb.0: # %entry
303 ; CHECK-NEXT:    addi 3, 1, -16
304 ; CHECK-NEXT:    stxvw4x 34, 0, 3
305 ; CHECK-NEXT:    lbz 3, -2(1)
306 ; CHECK-NEXT:    extsb 3, 3
307 ; CHECK-NEXT:    blr
308 entry:
309   %vecext = extractelement <16 x i8> %vsc, i32 14
310   ret i8 %vecext
313 ; Function Attrs: norecurse nounwind readnone
314 define signext i8 @getsc15(<16 x i8> %vsc) {
315 ; CHECK-LABEL: getsc15:
316 ; CHECK:       # %bb.0: # %entry
317 ; CHECK-NEXT:    addi 3, 1, -16
318 ; CHECK-NEXT:    stxvw4x 34, 0, 3
319 ; CHECK-NEXT:    lbz 3, -1(1)
320 ; CHECK-NEXT:    extsb 3, 3
321 ; CHECK-NEXT:    blr
322 entry:
323   %vecext = extractelement <16 x i8> %vsc, i32 15
324   ret i8 %vecext
327 ; Function Attrs: norecurse nounwind readnone
328 define zeroext i8 @getuc0(<16 x i8> %vuc) {
329 ; CHECK-LABEL: getuc0:
330 ; CHECK:       # %bb.0: # %entry
331 ; CHECK-NEXT:    addi 3, 1, -16
332 ; CHECK-NEXT:    stxvw4x 34, 0, 3
333 ; CHECK-NEXT:    lbz 3, -16(1)
334 ; CHECK-NEXT:    blr
335 entry:
336   %vecext = extractelement <16 x i8> %vuc, i32 0
337   ret i8 %vecext
340 ; Function Attrs: norecurse nounwind readnone
341 define zeroext i8 @getuc1(<16 x i8> %vuc) {
342 ; CHECK-LABEL: getuc1:
343 ; CHECK:       # %bb.0: # %entry
344 ; CHECK-NEXT:    addi 3, 1, -16
345 ; CHECK-NEXT:    stxvw4x 34, 0, 3
346 ; CHECK-NEXT:    lbz 3, -15(1)
347 ; CHECK-NEXT:    blr
348 entry:
349   %vecext = extractelement <16 x i8> %vuc, i32 1
350   ret i8 %vecext
353 ; Function Attrs: norecurse nounwind readnone
354 define zeroext i8 @getuc2(<16 x i8> %vuc) {
355 ; CHECK-LABEL: getuc2:
356 ; CHECK:       # %bb.0: # %entry
357 ; CHECK-NEXT:    addi 3, 1, -16
358 ; CHECK-NEXT:    stxvw4x 34, 0, 3
359 ; CHECK-NEXT:    lbz 3, -14(1)
360 ; CHECK-NEXT:    blr
361 entry:
362   %vecext = extractelement <16 x i8> %vuc, i32 2
363   ret i8 %vecext
366 ; Function Attrs: norecurse nounwind readnone
367 define zeroext i8 @getuc3(<16 x i8> %vuc) {
368 ; CHECK-LABEL: getuc3:
369 ; CHECK:       # %bb.0: # %entry
370 ; CHECK-NEXT:    addi 3, 1, -16
371 ; CHECK-NEXT:    stxvw4x 34, 0, 3
372 ; CHECK-NEXT:    lbz 3, -13(1)
373 ; CHECK-NEXT:    blr
374 entry:
375   %vecext = extractelement <16 x i8> %vuc, i32 3
376   ret i8 %vecext
379 ; Function Attrs: norecurse nounwind readnone
380 define zeroext i8 @getuc4(<16 x i8> %vuc) {
381 ; CHECK-LABEL: getuc4:
382 ; CHECK:       # %bb.0: # %entry
383 ; CHECK-NEXT:    addi 3, 1, -16
384 ; CHECK-NEXT:    stxvw4x 34, 0, 3
385 ; CHECK-NEXT:    lbz 3, -12(1)
386 ; CHECK-NEXT:    blr
387 entry:
388   %vecext = extractelement <16 x i8> %vuc, i32 4
389   ret i8 %vecext
392 ; Function Attrs: norecurse nounwind readnone
393 define zeroext i8 @getuc5(<16 x i8> %vuc) {
394 ; CHECK-LABEL: getuc5:
395 ; CHECK:       # %bb.0: # %entry
396 ; CHECK-NEXT:    addi 3, 1, -16
397 ; CHECK-NEXT:    stxvw4x 34, 0, 3
398 ; CHECK-NEXT:    lbz 3, -11(1)
399 ; CHECK-NEXT:    blr
400 entry:
401   %vecext = extractelement <16 x i8> %vuc, i32 5
402   ret i8 %vecext
405 ; Function Attrs: norecurse nounwind readnone
406 define zeroext i8 @getuc6(<16 x i8> %vuc) {
407 ; CHECK-LABEL: getuc6:
408 ; CHECK:       # %bb.0: # %entry
409 ; CHECK-NEXT:    addi 3, 1, -16
410 ; CHECK-NEXT:    stxvw4x 34, 0, 3
411 ; CHECK-NEXT:    lbz 3, -10(1)
412 ; CHECK-NEXT:    blr
413 entry:
414   %vecext = extractelement <16 x i8> %vuc, i32 6
415   ret i8 %vecext
418 ; Function Attrs: norecurse nounwind readnone
419 define zeroext i8 @getuc7(<16 x i8> %vuc) {
420 ; CHECK-LABEL: getuc7:
421 ; CHECK:       # %bb.0: # %entry
422 ; CHECK-NEXT:    addi 3, 1, -16
423 ; CHECK-NEXT:    stxvw4x 34, 0, 3
424 ; CHECK-NEXT:    lbz 3, -9(1)
425 ; CHECK-NEXT:    blr
426 entry:
427   %vecext = extractelement <16 x i8> %vuc, i32 7
428   ret i8 %vecext
431 ; Function Attrs: norecurse nounwind readnone
432 define zeroext i8 @getuc8(<16 x i8> %vuc) {
433 ; CHECK-LABEL: getuc8:
434 ; CHECK:       # %bb.0: # %entry
435 ; CHECK-NEXT:    addi 3, 1, -16
436 ; CHECK-NEXT:    stxvw4x 34, 0, 3
437 ; CHECK-NEXT:    lbz 3, -8(1)
438 ; CHECK-NEXT:    blr
439 entry:
440   %vecext = extractelement <16 x i8> %vuc, i32 8
441   ret i8 %vecext
444 ; Function Attrs: norecurse nounwind readnone
445 define zeroext i8 @getuc9(<16 x i8> %vuc) {
446 ; CHECK-LABEL: getuc9:
447 ; CHECK:       # %bb.0: # %entry
448 ; CHECK-NEXT:    addi 3, 1, -16
449 ; CHECK-NEXT:    stxvw4x 34, 0, 3
450 ; CHECK-NEXT:    lbz 3, -7(1)
451 ; CHECK-NEXT:    blr
452 entry:
453   %vecext = extractelement <16 x i8> %vuc, i32 9
454   ret i8 %vecext
457 ; Function Attrs: norecurse nounwind readnone
458 define zeroext i8 @getuc10(<16 x i8> %vuc) {
459 ; CHECK-LABEL: getuc10:
460 ; CHECK:       # %bb.0: # %entry
461 ; CHECK-NEXT:    addi 3, 1, -16
462 ; CHECK-NEXT:    stxvw4x 34, 0, 3
463 ; CHECK-NEXT:    lbz 3, -6(1)
464 ; CHECK-NEXT:    blr
465 entry:
466   %vecext = extractelement <16 x i8> %vuc, i32 10
467   ret i8 %vecext
470 ; Function Attrs: norecurse nounwind readnone
471 define zeroext i8 @getuc11(<16 x i8> %vuc) {
472 ; CHECK-LABEL: getuc11:
473 ; CHECK:       # %bb.0: # %entry
474 ; CHECK-NEXT:    addi 3, 1, -16
475 ; CHECK-NEXT:    stxvw4x 34, 0, 3
476 ; CHECK-NEXT:    lbz 3, -5(1)
477 ; CHECK-NEXT:    blr
478 entry:
479   %vecext = extractelement <16 x i8> %vuc, i32 11
480   ret i8 %vecext
483 ; Function Attrs: norecurse nounwind readnone
484 define zeroext i8 @getuc12(<16 x i8> %vuc) {
486 ; CHECK-LABEL: getuc12:
487 ; CHECK:       # %bb.0: # %entry
488 ; CHECK-NEXT:    addi 3, 1, -16
489 ; CHECK-NEXT:    stxvw4x 34, 0, 3
490 ; CHECK-NEXT:    lbz 3, -4(1)
491 ; CHECK-NEXT:    blr
492 entry:
493   %vecext = extractelement <16 x i8> %vuc, i32 12
494   ret i8 %vecext
497 ; Function Attrs: norecurse nounwind readnone
498 define zeroext i8 @getuc13(<16 x i8> %vuc) {
499 ; CHECK-LABEL: getuc13:
500 ; CHECK:       # %bb.0: # %entry
501 ; CHECK-NEXT:    addi 3, 1, -16
502 ; CHECK-NEXT:    stxvw4x 34, 0, 3
503 ; CHECK-NEXT:    lbz 3, -3(1)
504 ; CHECK-NEXT:    blr
505 entry:
506   %vecext = extractelement <16 x i8> %vuc, i32 13
507   ret i8 %vecext
510 ; Function Attrs: norecurse nounwind readnone
511 define zeroext i8 @getuc14(<16 x i8> %vuc) {
512 ; CHECK-LABEL: getuc14:
513 ; CHECK:       # %bb.0: # %entry
514 ; CHECK-NEXT:    addi 3, 1, -16
515 ; CHECK-NEXT:    stxvw4x 34, 0, 3
516 ; CHECK-NEXT:    lbz 3, -2(1)
517 ; CHECK-NEXT:    blr
518 entry:
519   %vecext = extractelement <16 x i8> %vuc, i32 14
520   ret i8 %vecext
523 ; Function Attrs: norecurse nounwind readnone
524 define zeroext i8 @getuc15(<16 x i8> %vuc) {
525 ; CHECK-LABEL: getuc15:
526 ; CHECK:       # %bb.0: # %entry
527 ; CHECK-NEXT:    addi 3, 1, -16
528 ; CHECK-NEXT:    stxvw4x 34, 0, 3
529 ; CHECK-NEXT:    lbz 3, -1(1)
530 ; CHECK-NEXT:    blr
531 entry:
532   %vecext = extractelement <16 x i8> %vuc, i32 15
533   ret i8 %vecext
536 ; Function Attrs: norecurse nounwind readnone
537 define signext i8 @getvelsc(<16 x i8> %vsc, i32 signext %i) {
538 ; CHECK-LABEL: getvelsc:
539 ; CHECK:       # %bb.0: # %entry
540 ; CHECK-NEXT:    addi 4, 1, -16
541 ; CHECK-NEXT:    clrlwi 3, 3, 28
542 ; CHECK-NEXT:    stxvw4x 34, 0, 4
543 ; CHECK-NEXT:    lbzx 3, 4, 3
544 ; CHECK-NEXT:    extsb 3, 3
545 ; CHECK-NEXT:    blr
546 entry:
547   %vecext = extractelement <16 x i8> %vsc, i32 %i
548   ret i8 %vecext
551 ; Function Attrs: norecurse nounwind readnone
552 define zeroext i8 @getveluc(<16 x i8> %vuc, i32 signext %i) {
553 ; CHECK-LABEL: getveluc:
554 ; CHECK:       # %bb.0: # %entry
555 ; CHECK-NEXT:    addi 4, 1, -16
556 ; CHECK-NEXT:    clrlwi 3, 3, 28
557 ; CHECK-NEXT:    stxvw4x 34, 0, 4
558 ; CHECK-NEXT:    lbzx 3, 4, 3
559 ; CHECK-NEXT:    blr
560 entry:
561   %vecext = extractelement <16 x i8> %vuc, i32 %i
562   ret i8 %vecext
565 ; Function Attrs: norecurse nounwind readnone
566 define signext i16 @getss0(<8 x i16> %vss) {
567 ; CHECK-LABEL: getss0:
568 ; CHECK:       # %bb.0: # %entry
569 ; CHECK-NEXT:    addi 3, 1, -16
570 ; CHECK-NEXT:    stxvw4x 34, 0, 3
571 ; CHECK-NEXT:    lha 3, -16(1)
572 ; CHECK-NEXT:    blr
573 entry:
574   %vecext = extractelement <8 x i16> %vss, i32 0
575   ret i16 %vecext
578 ; Function Attrs: norecurse nounwind readnone
579 define signext i16 @getss1(<8 x i16> %vss) {
580 ; CHECK-LABEL: getss1:
581 ; CHECK:       # %bb.0: # %entry
582 ; CHECK-NEXT:    addi 3, 1, -16
583 ; CHECK-NEXT:    stxvw4x 34, 0, 3
584 ; CHECK-NEXT:    lha 3, -14(1)
585 ; CHECK-NEXT:    blr
586 entry:
587   %vecext = extractelement <8 x i16> %vss, i32 1
588   ret i16 %vecext
591 ; Function Attrs: norecurse nounwind readnone
592 define signext i16 @getss2(<8 x i16> %vss) {
593 ; CHECK-LABEL: getss2:
594 ; CHECK:       # %bb.0: # %entry
595 ; CHECK-NEXT:    addi 3, 1, -16
596 ; CHECK-NEXT:    stxvw4x 34, 0, 3
597 ; CHECK-NEXT:    lha 3, -12(1)
598 ; CHECK-NEXT:    blr
599 entry:
600   %vecext = extractelement <8 x i16> %vss, i32 2
601   ret i16 %vecext
604 ; Function Attrs: norecurse nounwind readnone
605 define signext i16 @getss3(<8 x i16> %vss) {
606 ; CHECK-LABEL: getss3:
607 ; CHECK:       # %bb.0: # %entry
608 ; CHECK-NEXT:    addi 3, 1, -16
609 ; CHECK-NEXT:    stxvw4x 34, 0, 3
610 ; CHECK-NEXT:    lha 3, -10(1)
611 ; CHECK-NEXT:    blr
612 entry:
613   %vecext = extractelement <8 x i16> %vss, i32 3
614   ret i16 %vecext
617 ; Function Attrs: norecurse nounwind readnone
618 define signext i16 @getss4(<8 x i16> %vss) {
619 ; CHECK-LABEL: getss4:
620 ; CHECK:       # %bb.0: # %entry
621 ; CHECK-NEXT:    addi 3, 1, -16
622 ; CHECK-NEXT:    stxvw4x 34, 0, 3
623 ; CHECK-NEXT:    lha 3, -8(1)
624 ; CHECK-NEXT:    blr
625 entry:
626   %vecext = extractelement <8 x i16> %vss, i32 4
627   ret i16 %vecext
630 ; Function Attrs: norecurse nounwind readnone
631 define signext i16 @getss5(<8 x i16> %vss) {
632 ; CHECK-LABEL: getss5:
633 ; CHECK:       # %bb.0: # %entry
634 ; CHECK-NEXT:    addi 3, 1, -16
635 ; CHECK-NEXT:    stxvw4x 34, 0, 3
636 ; CHECK-NEXT:    lha 3, -6(1)
637 ; CHECK-NEXT:    blr
638 entry:
639   %vecext = extractelement <8 x i16> %vss, i32 5
640   ret i16 %vecext
643 ; Function Attrs: norecurse nounwind readnone
644 define signext i16 @getss6(<8 x i16> %vss) {
645 ; CHECK-LABEL: getss6:
646 ; CHECK:       # %bb.0: # %entry
647 ; CHECK-NEXT:    addi 3, 1, -16
648 ; CHECK-NEXT:    stxvw4x 34, 0, 3
649 ; CHECK-NEXT:    lha 3, -4(1)
650 ; CHECK-NEXT:    blr
651 entry:
652   %vecext = extractelement <8 x i16> %vss, i32 6
653   ret i16 %vecext
656 ; Function Attrs: norecurse nounwind readnone
657 define signext i16 @getss7(<8 x i16> %vss) {
658 ; CHECK-LABEL: getss7:
659 ; CHECK:       # %bb.0: # %entry
660 ; CHECK-NEXT:    addi 3, 1, -16
661 ; CHECK-NEXT:    stxvw4x 34, 0, 3
662 ; CHECK-NEXT:    lha 3, -2(1)
663 ; CHECK-NEXT:    blr
664 entry:
665   %vecext = extractelement <8 x i16> %vss, i32 7
666   ret i16 %vecext
669 ; Function Attrs: norecurse nounwind readnone
670 define zeroext i16 @getus0(<8 x i16> %vus) {
671 ; CHECK-LABEL: getus0:
672 ; CHECK:       # %bb.0: # %entry
673 ; CHECK-NEXT:    addi 3, 1, -16
674 ; CHECK-NEXT:    stxvw4x 34, 0, 3
675 ; CHECK-NEXT:    lhz 3, -16(1)
676 ; CHECK-NEXT:    blr
677 entry:
678   %vecext = extractelement <8 x i16> %vus, i32 0
679   ret i16 %vecext
682 ; Function Attrs: norecurse nounwind readnone
683 define zeroext i16 @getus1(<8 x i16> %vus) {
684 ; CHECK-LABEL: getus1:
685 ; CHECK:       # %bb.0: # %entry
686 ; CHECK-NEXT:    addi 3, 1, -16
687 ; CHECK-NEXT:    stxvw4x 34, 0, 3
688 ; CHECK-NEXT:    lhz 3, -14(1)
689 ; CHECK-NEXT:    blr
690 entry:
691   %vecext = extractelement <8 x i16> %vus, i32 1
692   ret i16 %vecext
695 ; Function Attrs: norecurse nounwind readnone
696 define zeroext i16 @getus2(<8 x i16> %vus) {
697 ; CHECK-LABEL: getus2:
698 ; CHECK:       # %bb.0: # %entry
699 ; CHECK-NEXT:    addi 3, 1, -16
700 ; CHECK-NEXT:    stxvw4x 34, 0, 3
701 ; CHECK-NEXT:    lhz 3, -12(1)
702 ; CHECK-NEXT:    blr
703 entry:
704   %vecext = extractelement <8 x i16> %vus, i32 2
705   ret i16 %vecext
708 ; Function Attrs: norecurse nounwind readnone
709 define zeroext i16 @getus3(<8 x i16> %vus) {
710 ; CHECK-LABEL: getus3:
711 ; CHECK:       # %bb.0: # %entry
712 ; CHECK-NEXT:    addi 3, 1, -16
713 ; CHECK-NEXT:    stxvw4x 34, 0, 3
714 ; CHECK-NEXT:    lhz 3, -10(1)
715 ; CHECK-NEXT:    blr
716 entry:
717   %vecext = extractelement <8 x i16> %vus, i32 3
718   ret i16 %vecext
721 ; Function Attrs: norecurse nounwind readnone
722 define zeroext i16 @getus4(<8 x i16> %vus) {
723 ; CHECK-LABEL: getus4:
724 ; CHECK:       # %bb.0: # %entry
725 ; CHECK-NEXT:    addi 3, 1, -16
726 ; CHECK-NEXT:    stxvw4x 34, 0, 3
727 ; CHECK-NEXT:    lhz 3, -8(1)
728 ; CHECK-NEXT:    blr
729 entry:
730   %vecext = extractelement <8 x i16> %vus, i32 4
731   ret i16 %vecext
734 ; Function Attrs: norecurse nounwind readnone
735 define zeroext i16 @getus5(<8 x i16> %vus) {
736 ; CHECK-LABEL: getus5:
737 ; CHECK:       # %bb.0: # %entry
738 ; CHECK-NEXT:    addi 3, 1, -16
739 ; CHECK-NEXT:    stxvw4x 34, 0, 3
740 ; CHECK-NEXT:    lhz 3, -6(1)
741 ; CHECK-NEXT:    blr
742 entry:
743   %vecext = extractelement <8 x i16> %vus, i32 5
744   ret i16 %vecext
747 ; Function Attrs: norecurse nounwind readnone
748 define zeroext i16 @getus6(<8 x i16> %vus) {
749 ; CHECK-LABEL: getus6:
750 ; CHECK:       # %bb.0: # %entry
751 ; CHECK-NEXT:    addi 3, 1, -16
752 ; CHECK-NEXT:    stxvw4x 34, 0, 3
753 ; CHECK-NEXT:    lhz 3, -4(1)
754 ; CHECK-NEXT:    blr
755 entry:
756   %vecext = extractelement <8 x i16> %vus, i32 6
757   ret i16 %vecext
760 ; Function Attrs: norecurse nounwind readnone
761 define zeroext i16 @getus7(<8 x i16> %vus) {
762 ; CHECK-LABEL: getus7:
763 ; CHECK:       # %bb.0: # %entry
764 ; CHECK-NEXT:    addi 3, 1, -16
765 ; CHECK-NEXT:    stxvw4x 34, 0, 3
766 ; CHECK-NEXT:    lhz 3, -2(1)
767 ; CHECK-NEXT:    blr
768 entry:
769   %vecext = extractelement <8 x i16> %vus, i32 7
770   ret i16 %vecext
773 ; Function Attrs: norecurse nounwind readnone
774 define signext i16 @getvelss(<8 x i16> %vss, i32 signext %i) {
775 ; CHECK-LABEL: getvelss:
776 ; CHECK:       # %bb.0: # %entry
777 ; CHECK-NEXT:    addi 4, 1, -16
778 ; CHECK-NEXT:    rlwinm 3, 3, 1, 28, 30
779 ; CHECK-NEXT:    stxvw4x 34, 0, 4
780 ; CHECK-NEXT:    lhax 3, 4, 3
781 ; CHECK-NEXT:    blr
782 entry:
783   %vecext = extractelement <8 x i16> %vss, i32 %i
784   ret i16 %vecext
787 ; Function Attrs: norecurse nounwind readnone
788 define zeroext i16 @getvelus(<8 x i16> %vus, i32 signext %i) {
789 ; CHECK-LABEL: getvelus:
790 ; CHECK:       # %bb.0: # %entry
791 ; CHECK-NEXT:    addi 4, 1, -16
792 ; CHECK-NEXT:    rlwinm 3, 3, 1, 28, 30
793 ; CHECK-NEXT:    stxvw4x 34, 0, 4
794 ; CHECK-NEXT:    lhzx 3, 4, 3
795 ; CHECK-NEXT:    blr
796 entry:
797   %vecext = extractelement <8 x i16> %vus, i32 %i
798   ret i16 %vecext
801 ; Function Attrs: norecurse nounwind readnone
802 define signext i32 @getsi0(<4 x i32> %vsi) {
803 ; CHECK-LABEL: getsi0:
804 ; CHECK:       # %bb.0: # %entry
805 ; CHECK-NEXT:    addi 3, 1, -16
806 ; CHECK-NEXT:    stxvw4x 34, 0, 3
807 ; CHECK-NEXT:    lwz 3, -16(1)
808 ; CHECK-NEXT:    blr
809 entry:
810   %vecext = extractelement <4 x i32> %vsi, i32 0
811   ret i32 %vecext
814 ; Function Attrs: norecurse nounwind readnone
815 define signext i32 @getsi1(<4 x i32> %vsi) {
816 ; CHECK-LABEL: getsi1:
817 ; CHECK:       # %bb.0: # %entry
818 ; CHECK-NEXT:    addi 3, 1, -16
819 ; CHECK-NEXT:    stxvw4x 34, 0, 3
820 ; CHECK-NEXT:    lwz 3, -12(1)
821 ; CHECK-NEXT:    blr
822 entry:
823   %vecext = extractelement <4 x i32> %vsi, i32 1
824   ret i32 %vecext
827 ; Function Attrs: norecurse nounwind readnone
828 define signext i32 @getsi2(<4 x i32> %vsi) {
829 ; CHECK-LABEL: getsi2:
830 ; CHECK:       # %bb.0: # %entry
831 ; CHECK-NEXT:    addi 3, 1, -16
832 ; CHECK-NEXT:    stxvw4x 34, 0, 3
833 ; CHECK-NEXT:    lwz 3, -8(1)
834 ; CHECK-NEXT:    blr
835 entry:
836   %vecext = extractelement <4 x i32> %vsi, i32 2
837   ret i32 %vecext
840 ; Function Attrs: norecurse nounwind readnone
841 define signext i32 @getsi3(<4 x i32> %vsi) {
842 ; CHECK-LABEL: getsi3:
843 ; CHECK:       # %bb.0: # %entry
844 ; CHECK-NEXT:    addi 3, 1, -16
845 ; CHECK-NEXT:    stxvw4x 34, 0, 3
846 ; CHECK-NEXT:    lwz 3, -4(1)
847 ; CHECK-NEXT:    blr
848 entry:
849   %vecext = extractelement <4 x i32> %vsi, i32 3
850   ret i32 %vecext
853 ; Function Attrs: norecurse nounwind readnone
854 define zeroext i32 @getui0(<4 x i32> %vui) {
855 ; CHECK-LABEL: getui0:
856 ; CHECK:       # %bb.0: # %entry
857 ; CHECK-NEXT:    addi 3, 1, -16
858 ; CHECK-NEXT:    stxvw4x 34, 0, 3
859 ; CHECK-NEXT:    lwz 3, -16(1)
860 ; CHECK-NEXT:    blr
861 entry:
862   %vecext = extractelement <4 x i32> %vui, i32 0
863   ret i32 %vecext
866 ; Function Attrs: norecurse nounwind readnone
867 define zeroext i32 @getui1(<4 x i32> %vui) {
868 ; CHECK-LABEL: getui1:
869 ; CHECK:       # %bb.0: # %entry
870 ; CHECK-NEXT:    addi 3, 1, -16
871 ; CHECK-NEXT:    stxvw4x 34, 0, 3
872 ; CHECK-NEXT:    lwz 3, -12(1)
873 ; CHECK-NEXT:    blr
874 entry:
875   %vecext = extractelement <4 x i32> %vui, i32 1
876   ret i32 %vecext
879 ; Function Attrs: norecurse nounwind readnone
880 define zeroext i32 @getui2(<4 x i32> %vui) {
881 ; CHECK-LABEL: getui2:
882 ; CHECK:       # %bb.0: # %entry
883 ; CHECK-NEXT:    addi 3, 1, -16
884 ; CHECK-NEXT:    stxvw4x 34, 0, 3
885 ; CHECK-NEXT:    lwz 3, -8(1)
886 ; CHECK-NEXT:    blr
887 entry:
888   %vecext = extractelement <4 x i32> %vui, i32 2
889   ret i32 %vecext
892 ; Function Attrs: norecurse nounwind readnone
893 define zeroext i32 @getui3(<4 x i32> %vui) {
894 ; CHECK-LABEL: getui3:
895 ; CHECK:       # %bb.0: # %entry
896 ; CHECK-NEXT:    addi 3, 1, -16
897 ; CHECK-NEXT:    stxvw4x 34, 0, 3
898 ; CHECK-NEXT:    lwz 3, -4(1)
899 ; CHECK-NEXT:    blr
900 entry:
901   %vecext = extractelement <4 x i32> %vui, i32 3
902   ret i32 %vecext
905 ; Function Attrs: norecurse nounwind readnone
906 define signext i32 @getvelsi(<4 x i32> %vsi, i32 signext %i) {
907 ; CHECK-LABEL: getvelsi:
908 ; CHECK:       # %bb.0: # %entry
909 ; CHECK-NEXT:    addi 4, 1, -16
910 ; CHECK-NEXT:    rlwinm 3, 3, 2, 28, 29
911 ; CHECK-NEXT:    stxvw4x 34, 0, 4
912 ; CHECK-NEXT:    lwzx 3, 4, 3
913 ; CHECK-NEXT:    blr
914 entry:
915   %vecext = extractelement <4 x i32> %vsi, i32 %i
916   ret i32 %vecext
919 ; Function Attrs: norecurse nounwind readnone
920 define zeroext i32 @getvelui(<4 x i32> %vui, i32 signext %i) {
921 ; CHECK-LABEL: getvelui:
922 ; CHECK:       # %bb.0: # %entry
923 ; CHECK-NEXT:    addi 4, 1, -16
924 ; CHECK-NEXT:    rlwinm 3, 3, 2, 28, 29
925 ; CHECK-NEXT:    stxvw4x 34, 0, 4
926 ; CHECK-NEXT:    lwzx 3, 4, 3
927 ; CHECK-NEXT:    blr
928 entry:
929   %vecext = extractelement <4 x i32> %vui, i32 %i
930   ret i32 %vecext
933 ; Function Attrs: norecurse nounwind readnone
934 define i64 @getsl0(<2 x i64> %vsl) {
935 ; CHECK-LABEL: getsl0:
936 ; CHECK:       # %bb.0: # %entry
937 ; CHECK-NEXT:    addi 3, 1, -16
938 ; CHECK-NEXT:    stxvw4x 34, 0, 3
939 ; CHECK-NEXT:    lwz 3, -16(1)
940 ; CHECK-NEXT:    lwz 4, -12(1)
941 ; CHECK-NEXT:    blr
942 entry:
943   %vecext = extractelement <2 x i64> %vsl, i32 0
944   ret i64 %vecext
947 ; Function Attrs: norecurse nounwind readnone
948 define i64 @getsl1(<2 x i64> %vsl) {
949 ; CHECK-LABEL: getsl1:
950 ; CHECK:       # %bb.0: # %entry
951 ; CHECK-NEXT:    addi 3, 1, -16
952 ; CHECK-NEXT:    stxvw4x 34, 0, 3
953 ; CHECK-NEXT:    lwz 3, -8(1)
954 ; CHECK-NEXT:    lwz 4, -4(1)
955 ; CHECK-NEXT:    blr
956 entry:
957   %vecext = extractelement <2 x i64> %vsl, i32 1
958   ret i64 %vecext
961 ; Function Attrs: norecurse nounwind readnone
962 define i64 @getul0(<2 x i64> %vul) {
963 ; CHECK-LABEL: getul0:
964 ; CHECK:       # %bb.0: # %entry
965 ; CHECK-NEXT:    addi 3, 1, -16
966 ; CHECK-NEXT:    stxvw4x 34, 0, 3
967 ; CHECK-NEXT:    lwz 3, -16(1)
968 ; CHECK-NEXT:    lwz 4, -12(1)
969 ; CHECK-NEXT:    blr
970 entry:
971   %vecext = extractelement <2 x i64> %vul, i32 0
972   ret i64 %vecext
975 ; Function Attrs: norecurse nounwind readnone
976 define i64 @getul1(<2 x i64> %vul) {
977 ; CHECK-LABEL: getul1:
978 ; CHECK:       # %bb.0: # %entry
979 ; CHECK-NEXT:    addi 3, 1, -16
980 ; CHECK-NEXT:    stxvw4x 34, 0, 3
981 ; CHECK-NEXT:    lwz 3, -8(1)
982 ; CHECK-NEXT:    lwz 4, -4(1)
983 ; CHECK-NEXT:    blr
984 entry:
985   %vecext = extractelement <2 x i64> %vul, i32 1
986   ret i64 %vecext
989 ; Function Attrs: norecurse nounwind readnone
990 define i64 @getvelsl(<2 x i64> %vsl, i32 signext %i) {
991 ; CHECK-LABEL: getvelsl:
992 ; CHECK:       # %bb.0: # %entry
993 ; CHECK-NEXT:    add 5, 3, 3
994 ; CHECK-NEXT:    addi 4, 1, -16
995 ; CHECK-NEXT:    rlwinm 3, 5, 2, 28, 29
996 ; CHECK-NEXT:    addi 5, 5, 1
997 ; CHECK-NEXT:    stxvw4x 34, 0, 4
998 ; CHECK-NEXT:    rlwinm 5, 5, 2, 28, 29
999 ; CHECK-NEXT:    lwzx 3, 4, 3
1000 ; CHECK-NEXT:    lwzx 4, 4, 5
1001 ; CHECK-NEXT:    blr
1002 entry:
1003   %vecext = extractelement <2 x i64> %vsl, i32 %i
1004   ret i64 %vecext
1007 ; Function Attrs: norecurse nounwind readnone
1008 define i64 @getvelul(<2 x i64> %vul, i32 signext %i) {
1009 ; CHECK-LABEL: getvelul:
1010 ; CHECK:       # %bb.0: # %entry
1011 ; CHECK-NEXT:    add 5, 3, 3
1012 ; CHECK-NEXT:    addi 4, 1, -16
1013 ; CHECK-NEXT:    rlwinm 3, 5, 2, 28, 29
1014 ; CHECK-NEXT:    addi 5, 5, 1
1015 ; CHECK-NEXT:    stxvw4x 34, 0, 4
1016 ; CHECK-NEXT:    rlwinm 5, 5, 2, 28, 29
1017 ; CHECK-NEXT:    lwzx 3, 4, 3
1018 ; CHECK-NEXT:    lwzx 4, 4, 5
1019 ; CHECK-NEXT:    blr
1020 entry:
1021   %vecext = extractelement <2 x i64> %vul, i32 %i
1022   ret i64 %vecext
1025 ; Function Attrs: norecurse nounwind readnone
1026 define float @getf0(<4 x float> %vf) {
1027 ; CHECK-LABEL: getf0:
1028 ; CHECK:       # %bb.0: # %entry
1029 ; CHECK-NEXT:    xscvspdpn 1, 34
1030 ; CHECK-NEXT:    blr
1031 entry:
1032   %vecext = extractelement <4 x float> %vf, i32 0
1033   ret float %vecext
1036 ; Function Attrs: norecurse nounwind readnone
1037 define float @getf1(<4 x float> %vf) {
1038 ; CHECK-LABEL: getf1:
1039 ; CHECK:       # %bb.0: # %entry
1040 ; CHECK-NEXT:    xxsldwi 0, 34, 34, 1
1041 ; CHECK-NEXT:    xscvspdpn 1, 0
1042 ; CHECK-NEXT:    blr
1043 entry:
1044   %vecext = extractelement <4 x float> %vf, i32 1
1045   ret float %vecext
1048 ; Function Attrs: norecurse nounwind readnone
1049 define float @getf2(<4 x float> %vf) {
1050 ; CHECK-LABEL: getf2:
1051 ; CHECK:       # %bb.0: # %entry
1052 ; CHECK-NEXT:    xxswapd 0, 34
1053 ; CHECK-NEXT:    xscvspdpn 1, 0
1054 ; CHECK-NEXT:    blr
1055 entry:
1056   %vecext = extractelement <4 x float> %vf, i32 2
1057   ret float %vecext
1060 ; Function Attrs: norecurse nounwind readnone
1061 define float @getf3(<4 x float> %vf) {
1062 ; CHECK-LABEL: getf3:
1063 ; CHECK:       # %bb.0: # %entry
1064 ; CHECK-NEXT:    xxsldwi 0, 34, 34, 3
1065 ; CHECK-NEXT:    xscvspdpn 1, 0
1066 ; CHECK-NEXT:    blr
1067 entry:
1068   %vecext = extractelement <4 x float> %vf, i32 3
1069   ret float %vecext
1072 ; Function Attrs: norecurse nounwind readnone
1073 define float @getvelf(<4 x float> %vf, i32 signext %i) {
1074 ; CHECK-LABEL: getvelf:
1075 ; CHECK:       # %bb.0: # %entry
1076 ; CHECK-NEXT:    slwi 3, 3, 2
1077 ; CHECK-NEXT:    lvsl 3, 0, 3
1078 ; CHECK-NEXT:    vperm 2, 2, 2, 3
1079 ; CHECK-NEXT:    xscvspdpn 1, 34
1080 ; CHECK-NEXT:    blr
1081 entry:
1082    %vecext = extractelement <4 x float> %vf, i32 %i
1083    ret float %vecext
1086 ; Function Attrs: norecurse nounwind readnone
1087 define double @getd0(<2 x double> %vd) {
1088 ; CHECK-LABEL: getd0:
1089 ; CHECK:       # %bb.0: # %entry
1090 ; CHECK-NEXT:    xxlor 1, 34, 34
1091 ; CHECK-NEXT:    blr
1092 entry:
1093   %vecext = extractelement <2 x double> %vd, i32 0
1094   ret double %vecext
1097 ; Function Attrs: norecurse nounwind readnone
1098 define double @getd1(<2 x double> %vd) {
1099 ; CHECK-LABEL: getd1:
1100 ; CHECK:       # %bb.0: # %entry
1101 ; CHECK-NEXT:    xxswapd 1, 34
1102 ; CHECK-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1103 ; CHECK-NEXT:    blr
1104 entry:
1105   %vecext = extractelement <2 x double> %vd, i32 1
1106   ret double %vecext
1109 ; Function Attrs: norecurse nounwind readnone
1110 define double @getveld(<2 x double> %vd, i32 signext %i) {
1111 ; CHECK-LABEL: getveld:
1112 ; CHECK:       # %bb.0: # %entry
1113 ; CHECK-NEXT:    andi. 3, 3, 1
1114 ; CHECK-NEXT:    slwi 3, 3, 3
1115 ; CHECK-NEXT:    lvsl 3, 0, 3
1116 ; CHECK-NEXT:    vperm 2, 2, 2, 3
1117 ; CHECK-NEXT:    xxlor 1, 34, 34
1118 ; CHECK-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1119 ; CHECK-NEXT:    blr
1120 entry:
1121   %vecext = extractelement <2 x double> %vd, i32 %i
1122   ret double %vecext