[PowerPC] Eliminate compares - add i32 sext/zext handling for SETULT/SETUGT
[llvm-core.git] / test / CodeGen / PowerPC / p8-scalar_vector_conversions.ll
blobf399b2584d0b112881dc84b57d7ea0232845bdc7
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: norecurse nounwind readnone
11 define <16 x i8> @buildc(i8 zeroext %a) {
12 entry:
13   %splat.splatinsert = insertelement <16 x i8> undef, i8 %a, i32 0
14   %splat.splat = shufflevector <16 x i8> %splat.splatinsert, <16 x i8> undef, <16 x i32> zeroinitializer
15   ret <16 x i8> %splat.splat
16 ; CHECK: sldi [[REG1:[0-9]+]], 3, 56
17 ; CHECK: mtvsrd {{[0-9]+}}, [[REG1]]
18 ; CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
19 ; CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
22 ; Function Attrs: norecurse nounwind readnone
23 define <8 x i16> @builds(i16 zeroext %a) {
24 entry:
25   %splat.splatinsert = insertelement <8 x i16> undef, i16 %a, i32 0
26   %splat.splat = shufflevector <8 x i16> %splat.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer
27   ret <8 x i16> %splat.splat
28 ; CHECK: sldi [[REG1:[0-9]+]], 3, 48
29 ; CHECK: mtvsrd {{[0-9]+}}, [[REG1]]
30 ; CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
31 ; CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
34 ; Function Attrs: norecurse nounwind readnone
35 define <4 x i32> @buildi(i32 zeroext %a) {
36 entry:
37   %splat.splatinsert = insertelement <4 x i32> undef, i32 %a, i32 0
38   %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
39   ret <4 x i32> %splat.splat
40 ; CHECK: mtvsrwz [[REG1:[0-9]+]], 3
41 ; CHECK: xxspltw 34, [[REG1]]
42 ; CHECK-LE: mtvsrwz [[REG1:[0-9]+]], 3
43 ; CHECK-LE: xxspltw 34, [[REG1]]
46 ; Function Attrs: norecurse nounwind readnone
47 define <2 x i64> @buildl(i64 %a) {
48 entry:
49   %splat.splatinsert = insertelement <2 x i64> undef, i64 %a, i32 0
50   %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
51   ret <2 x i64> %splat.splat
52 ; CHECK: mtvsrd {{[0-9]+}}, 3
53 ; CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
54 ; CHECK-LE: xxspltd 34, [[REG1]], 0
57 ; Function Attrs: norecurse nounwind readnone
58 define <4 x float> @buildf(float %a) {
59 entry:
60   %splat.splatinsert = insertelement <4 x float> undef, float %a, i32 0
61   %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer
62   ret <4 x float> %splat.splat
63 ; CHECK: xscvdpspn [[REG1:[0-9]+]], 1
64 ; CHECK: xxspltw 34, [[REG1]]
65 ; CHECK-LE: xscvdpspn [[REG1:[0-9]+]], 1
66 ; CHECK-LE: xxspltw 34, [[REG1]]
69 ; The optimization to remove stack operations from PPCDAGToDAGISel::Select
70 ; should still trigger for v2f64, producing an lxvdsx.
71 ; Function Attrs: norecurse nounwind readonly
72 define <2 x double> @buildd() {
73 entry:
74   %0 = load double, double* @d, align 8
75   %splat.splatinsert = insertelement <2 x double> undef, double %0, i32 0
76   %splat.splat = shufflevector <2 x double> %splat.splatinsert, <2 x double> undef, <2 x i32> zeroinitializer
77   ret <2 x double> %splat.splat
78 ; CHECK: ld [[REG1:[0-9]+]], .LC0@toc@l
79 ; CHECK: lxvdsx 34, 0, [[REG1]]
80 ; CHECK-LE: ld [[REG1:[0-9]+]], .LC0@toc@l
81 ; CHECK-LE: lxvdsx 34, 0, [[REG1]]
84 ; Function Attrs: norecurse nounwind readnone
85 define signext i8 @getsc0(<16 x i8> %vsc) {
86 entry:
87   %vecext = extractelement <16 x i8> %vsc, i32 0
88   ret i8 %vecext
89 ; CHECK-LABEL: @getsc0
90 ; CHECK: mfvsrd 3, 34
91 ; CHECK: rldicl 3, 3, 8, 56
92 ; CHECK: extsb 3, 3
93 ; CHECK-LE-LABEL: @getsc0
94 ; CHECK-LE: mfvsrd 3,
95 ; CHECK-LE: clrldi 3, 3, 56
96 ; CHECK-LE: extsb 3, 3
99 ; Function Attrs: norecurse nounwind readnone
100 define signext i8 @getsc1(<16 x i8> %vsc) {
101 entry:
102   %vecext = extractelement <16 x i8> %vsc, i32 1
103   ret i8 %vecext
104 ; CHECK-LABEL: @getsc1
105 ; CHECK: mfvsrd 3, 34
106 ; CHECK: rldicl 3, 3, 16, 56
107 ; CHECK: extsb 3, 3
108 ; CHECK-LE-LABEL: @getsc1
109 ; CHECK-LE: mfvsrd 3,
110 ; CHECK-LE: rldicl 3, 3, 56, 56
111 ; CHECK-LE: extsb 3, 3
114 ; Function Attrs: norecurse nounwind readnone
115 define signext i8 @getsc2(<16 x i8> %vsc) {
116 entry:
117   %vecext = extractelement <16 x i8> %vsc, i32 2
118   ret i8 %vecext
119 ; CHECK-LABEL: @getsc2
120 ; CHECK: mfvsrd 3, 34
121 ; CHECK: rldicl 3, 3, 24, 56
122 ; CHECK: extsb 3, 3
123 ; CHECK-LE-LABEL: @getsc2
124 ; CHECK-LE: mfvsrd 3,
125 ; CHECK-LE: rldicl 3, 3, 48, 56
126 ; CHECK-LE: extsb 3, 3
129 ; Function Attrs: norecurse nounwind readnone
130 define signext i8 @getsc3(<16 x i8> %vsc) {
131 entry:
132   %vecext = extractelement <16 x i8> %vsc, i32 3
133   ret i8 %vecext
134 ; CHECK-LABEL: @getsc3
135 ; CHECK: mfvsrd 3, 34
136 ; CHECK: rldicl 3, 3, 32, 56
137 ; CHECK: extsb 3, 3
138 ; CHECK-LE-LABEL: @getsc3
139 ; CHECK-LE: mfvsrd 3,
140 ; CHECK-LE: rldicl 3, 3, 40, 56
141 ; CHECK-LE: extsb 3, 3
144 ; Function Attrs: norecurse nounwind readnone
145 define signext i8 @getsc4(<16 x i8> %vsc) {
146 entry:
147   %vecext = extractelement <16 x i8> %vsc, i32 4
148   ret i8 %vecext
149 ; CHECK-LABEL: @getsc4
150 ; CHECK: mfvsrd 3, 34
151 ; CHECK: rldicl 3, 3, 40, 56
152 ; CHECK: extsb 3, 3
153 ; CHECK-LE-LABEL: @getsc4
154 ; CHECK-LE: mfvsrd 3,
155 ; CHECK-LE: rldicl 3, 3, 32, 56
156 ; CHECK-LE: extsb 3, 3
159 ; Function Attrs: norecurse nounwind readnone
160 define signext i8 @getsc5(<16 x i8> %vsc) {
161 entry:
162   %vecext = extractelement <16 x i8> %vsc, i32 5
163   ret i8 %vecext
164 ; CHECK-LABEL: @getsc5
165 ; CHECK: mfvsrd 3, 34
166 ; CHECK: rldicl 3, 3, 48, 56
167 ; CHECK: extsb 3, 3
168 ; CHECK-LE-LABEL: @getsc5
169 ; CHECK-LE: mfvsrd 3,
170 ; CHECK-LE: rldicl 3, 3, 24, 56
171 ; CHECK-LE: extsb 3, 3
174 ; Function Attrs: norecurse nounwind readnone
175 define signext i8 @getsc6(<16 x i8> %vsc) {
176 entry:
177   %vecext = extractelement <16 x i8> %vsc, i32 6
178   ret i8 %vecext
179 ; CHECK-LABEL: @getsc6
180 ; CHECK: mfvsrd 3, 34
181 ; CHECK: rldicl 3, 3, 56, 56
182 ; CHECK: extsb 3, 3
183 ; CHECK-LE-LABEL: @getsc6
184 ; CHECK-LE: mfvsrd 3,
185 ; CHECK-LE: rldicl 3, 3, 16, 56
186 ; CHECK-LE: extsb 3, 3
189 ; Function Attrs: norecurse nounwind readnone
190 define signext i8 @getsc7(<16 x i8> %vsc) {
191 entry:
192   %vecext = extractelement <16 x i8> %vsc, i32 7
193   ret i8 %vecext
194 ; CHECK-LABEL: @getsc7
195 ; CHECK: mfvsrd 3, 34
196 ; CHECK: clrldi 3, 3, 56
197 ; CHECK: extsb 3, 3
198 ; CHECK-LE-LABEL: @getsc7
199 ; CHECK-LE: mfvsrd 3,
200 ; CHECK-LE: rldicl 3, 3, 8, 56
201 ; CHECK-LE: extsb 3, 3
204 ; Function Attrs: norecurse nounwind readnone
205 define signext i8 @getsc8(<16 x i8> %vsc) {
206 entry:
207   %vecext = extractelement <16 x i8> %vsc, i32 8
208   ret i8 %vecext
209 ; CHECK-LABEL: @getsc8
210 ; CHECK: mfvsrd 3,
211 ; CHECK: rldicl 3, 3, 8, 56
212 ; CHECK: extsb 3, 3
213 ; CHECK-LE-LABEL: @getsc8
214 ; CHECK-LE: mfvsrd 3, 34
215 ; CHECK-LE: clrldi 3, 3, 56
216 ; CHECK-LE: extsb 3, 3
219 ; Function Attrs: norecurse nounwind readnone
220 define signext i8 @getsc9(<16 x i8> %vsc) {
221 entry:
222   %vecext = extractelement <16 x i8> %vsc, i32 9
223   ret i8 %vecext
224 ; CHECK-LABEL: @getsc9
225 ; CHECK: mfvsrd 3,
226 ; CHECK: rldicl 3, 3, 16, 56
227 ; CHECK: extsb 3, 3
228 ; CHECK-LE-LABEL: @getsc9
229 ; CHECK-LE: mfvsrd 3, 34
230 ; CHECK-LE: rldicl 3, 3, 56, 56
231 ; CHECK-LE: extsb 3, 3
234 ; Function Attrs: norecurse nounwind readnone
235 define signext i8 @getsc10(<16 x i8> %vsc) {
236 entry:
237   %vecext = extractelement <16 x i8> %vsc, i32 10
238   ret i8 %vecext
239 ; CHECK-LABEL: @getsc10
240 ; CHECK: mfvsrd 3,
241 ; CHECK: rldicl 3, 3, 24, 56
242 ; CHECK: extsb 3, 3
243 ; CHECK-LE-LABEL: @getsc10
244 ; CHECK-LE: mfvsrd 3, 34
245 ; CHECK-LE: rldicl 3, 3, 48, 56
246 ; CHECK-LE: extsb 3, 3
249 ; Function Attrs: norecurse nounwind readnone
250 define signext i8 @getsc11(<16 x i8> %vsc) {
251 entry:
252   %vecext = extractelement <16 x i8> %vsc, i32 11
253   ret i8 %vecext
254 ; CHECK-LABEL: @getsc11
255 ; CHECK: mfvsrd 3,
256 ; CHECK: rldicl 3, 3, 32, 56
257 ; CHECK: extsb 3, 3
258 ; CHECK-LE-LABEL: @getsc11
259 ; CHECK-LE: mfvsrd 3, 34
260 ; CHECK-LE: rldicl 3, 3, 40, 56
261 ; CHECK-LE: extsb 3, 3
264 ; Function Attrs: norecurse nounwind readnone
265 define signext i8 @getsc12(<16 x i8> %vsc) {
266 entry:
267   %vecext = extractelement <16 x i8> %vsc, i32 12
268   ret i8 %vecext
269 ; CHECK-LABEL: @getsc12
270 ; CHECK: mfvsrd 3,
271 ; CHECK: rldicl 3, 3, 40, 56
272 ; CHECK: extsb 3, 3
273 ; CHECK-LE-LABEL: @getsc12
274 ; CHECK-LE: mfvsrd 3, 34
275 ; CHECK-LE: rldicl 3, 3, 32, 56
276 ; CHECK-LE: extsb 3, 3
279 ; Function Attrs: norecurse nounwind readnone
280 define signext i8 @getsc13(<16 x i8> %vsc) {
281 entry:
282   %vecext = extractelement <16 x i8> %vsc, i32 13
283   ret i8 %vecext
284 ; CHECK-LABEL: @getsc13
285 ; CHECK: mfvsrd 3,
286 ; CHECK: rldicl 3, 3, 48, 56
287 ; CHECK: extsb 3, 3
288 ; CHECK-LE-LABEL: @getsc13
289 ; CHECK-LE: mfvsrd 3, 34
290 ; CHECK-LE: rldicl 3, 3, 24, 56
291 ; CHECK-LE: extsb 3, 3
294 ; Function Attrs: norecurse nounwind readnone
295 define signext i8 @getsc14(<16 x i8> %vsc) {
296 entry:
297   %vecext = extractelement <16 x i8> %vsc, i32 14
298   ret i8 %vecext
299 ; CHECK-LABEL: @getsc14
300 ; CHECK: mfvsrd 3,
301 ; CHECK: rldicl 3, 3, 56, 56
302 ; CHECK: extsb 3, 3
303 ; CHECK-LE-LABEL: @getsc14
304 ; CHECK-LE: mfvsrd 3, 34
305 ; CHECK-LE: rldicl 3, 3, 16, 56
306 ; CHECK-LE: extsb 3, 3
309 ; Function Attrs: norecurse nounwind readnone
310 define signext i8 @getsc15(<16 x i8> %vsc) {
311 entry:
312   %vecext = extractelement <16 x i8> %vsc, i32 15
313   ret i8 %vecext
314 ; CHECK-LABEL: @getsc15
315 ; CHECK: mfvsrd 3,
316 ; CHECK: extsb 3, 3
317 ; CHECK-LE-LABEL: @getsc15
318 ; CHECK-LE: mfvsrd 3, 34
319 ; CHECK-LE: rldicl 3, 3, 8, 56
320 ; CHECK-LE: extsb 3, 3
323 ; Function Attrs: norecurse nounwind readnone
324 define zeroext i8 @getuc0(<16 x i8> %vuc) {
325 entry:
326   %vecext = extractelement <16 x i8> %vuc, i32 0
327   ret i8 %vecext
328 ; CHECK-LABEL: @getuc0
329 ; CHECK: mfvsrd 3, 34
330 ; CHECK: rldicl 3, 3, 8, 56
331 ; CHECK: clrldi   3, 3, 56
332 ; CHECK-LE-LABEL: @getuc0
333 ; CHECK-LE: mfvsrd 3,
334 ; CHECK-LE: clrldi   3, 3, 56
337 ; Function Attrs: norecurse nounwind readnone
338 define zeroext i8 @getuc1(<16 x i8> %vuc) {
339 entry:
340   %vecext = extractelement <16 x i8> %vuc, i32 1
341   ret i8 %vecext
342 ; CHECK-LABEL: @getuc1
343 ; CHECK: mfvsrd 3, 34
344 ; CHECK: rldicl 3, 3, 16, 56
345 ; CHECK: clrldi   3, 3, 56
346 ; CHECK-LE-LABEL: @getuc1
347 ; CHECK-LE: mfvsrd 3,
348 ; CHECK-LE: rldicl 3, 3, 56, 56
349 ; CHECK-LE: clrldi   3, 3, 56
352 ; Function Attrs: norecurse nounwind readnone
353 define zeroext i8 @getuc2(<16 x i8> %vuc) {
354 entry:
355   %vecext = extractelement <16 x i8> %vuc, i32 2
356   ret i8 %vecext
357 ; CHECK-LABEL: @getuc2
358 ; CHECK: mfvsrd 3, 34
359 ; CHECK: rldicl 3, 3, 24, 56
360 ; CHECK: clrldi   3, 3, 56
361 ; CHECK-LE-LABEL: @getuc2
362 ; CHECK-LE: mfvsrd 3,
363 ; CHECK-LE: rldicl 3, 3, 48, 56
364 ; CHECK-LE: clrldi   3, 3, 56
367 ; Function Attrs: norecurse nounwind readnone
368 define zeroext i8 @getuc3(<16 x i8> %vuc) {
369 entry:
370   %vecext = extractelement <16 x i8> %vuc, i32 3
371   ret i8 %vecext
372 ; CHECK-LABEL: @getuc3
373 ; CHECK: mfvsrd 3, 34
374 ; CHECK: rldicl 3, 3, 32, 56
375 ; CHECK: clrldi   3, 3, 56
376 ; CHECK-LE-LABEL: @getuc3
377 ; CHECK-LE: mfvsrd 3,
378 ; CHECK-LE: rldicl 3, 3, 40, 56
379 ; CHECK-LE: clrldi   3, 3, 56
382 ; Function Attrs: norecurse nounwind readnone
383 define zeroext i8 @getuc4(<16 x i8> %vuc) {
384 entry:
385   %vecext = extractelement <16 x i8> %vuc, i32 4
386   ret i8 %vecext
387 ; CHECK-LABEL: @getuc4
388 ; CHECK: mfvsrd 3, 34
389 ; CHECK: rldicl 3, 3, 40, 56
390 ; CHECK: clrldi   3, 3, 56
391 ; CHECK-LE-LABEL: @getuc4
392 ; CHECK-LE: mfvsrd 3,
393 ; CHECK-LE: rldicl 3, 3, 32, 56
394 ; CHECK-LE: clrldi   3, 3, 56
397 ; Function Attrs: norecurse nounwind readnone
398 define zeroext i8 @getuc5(<16 x i8> %vuc) {
399 entry:
400   %vecext = extractelement <16 x i8> %vuc, i32 5
401   ret i8 %vecext
402 ; CHECK-LABEL: @getuc5
403 ; CHECK: mfvsrd 3, 34
404 ; CHECK: rldicl 3, 3, 48, 56
405 ; CHECK: clrldi   3, 3, 56
406 ; CHECK-LE-LABEL: @getuc5
407 ; CHECK-LE: mfvsrd 3,
408 ; CHECK-LE: rldicl 3, 3, 24, 56
409 ; CHECK-LE: clrldi   3, 3, 56
412 ; Function Attrs: norecurse nounwind readnone
413 define zeroext i8 @getuc6(<16 x i8> %vuc) {
414 entry:
415   %vecext = extractelement <16 x i8> %vuc, i32 6
416   ret i8 %vecext
417 ; CHECK-LABEL: @getuc6
418 ; CHECK: mfvsrd 3, 34
419 ; CHECK: rldicl 3, 3, 56, 56
420 ; CHECK: clrldi   3, 3, 56
421 ; CHECK-LE-LABEL: @getuc6
422 ; CHECK-LE: mfvsrd 3,
423 ; CHECK-LE: rldicl 3, 3, 16, 56
424 ; CHECK-LE: clrldi   3, 3, 56
427 ; Function Attrs: norecurse nounwind readnone
428 define zeroext i8 @getuc7(<16 x i8> %vuc) {
429 entry:
430   %vecext = extractelement <16 x i8> %vuc, i32 7
431   ret i8 %vecext
432 ; CHECK-LABEL: @getuc7
433 ; CHECK: mfvsrd 3, 34
434 ; CHECK: clrldi   3, 3, 56
435 ; CHECK-LE-LABEL: @getuc7
436 ; CHECK-LE: mfvsrd 3,
437 ; CHECK-LE: rldicl 3, 3, 8, 56
438 ; CHECK-LE: clrldi   3, 3, 56
441 ; Function Attrs: norecurse nounwind readnone
442 define zeroext i8 @getuc8(<16 x i8> %vuc) {
443 entry:
444   %vecext = extractelement <16 x i8> %vuc, i32 8
445   ret i8 %vecext
446 ; CHECK-LABEL: @getuc8
447 ; CHECK: mfvsrd 3,
448 ; CHECK: rldicl 3, 3, 8, 56
449 ; CHECK: clrldi   3, 3, 56
450 ; CHECK-LE-LABEL: @getuc8
451 ; CHECK-LE: mfvsrd 3, 34
452 ; CHECK-LE: clrldi   3, 3, 56
455 ; Function Attrs: norecurse nounwind readnone
456 define zeroext i8 @getuc9(<16 x i8> %vuc) {
457 entry:
458   %vecext = extractelement <16 x i8> %vuc, i32 9
459   ret i8 %vecext
460 ; CHECK-LABEL: @getuc9
461 ; CHECK: mfvsrd 3,
462 ; CHECK: rldicl 3, 3, 16, 56
463 ; CHECK: clrldi   3, 3, 56
464 ; CHECK-LE-LABEL: @getuc9
465 ; CHECK-LE: mfvsrd 3, 34
466 ; CHECK-LE: rldicl 3, 3, 56, 56
467 ; CHECK-LE: clrldi   3, 3, 56
470 ; Function Attrs: norecurse nounwind readnone
471 define zeroext i8 @getuc10(<16 x i8> %vuc) {
472 entry:
473   %vecext = extractelement <16 x i8> %vuc, i32 10
474   ret i8 %vecext
475 ; CHECK-LABEL: @getuc10
476 ; CHECK: mfvsrd 3,
477 ; CHECK: rldicl 3, 3, 24, 56
478 ; CHECK: clrldi   3, 3, 56
479 ; CHECK-LE-LABEL: @getuc10
480 ; CHECK-LE: mfvsrd 3, 34
481 ; CHECK-LE: rldicl 3, 3, 48, 56
482 ; CHECK-LE: clrldi   3, 3, 56
485 ; Function Attrs: norecurse nounwind readnone
486 define zeroext i8 @getuc11(<16 x i8> %vuc) {
487 entry:
488   %vecext = extractelement <16 x i8> %vuc, i32 11
489   ret i8 %vecext
490 ; CHECK-LABEL: @getuc11
491 ; CHECK: mfvsrd 3,
492 ; CHECK: rldicl 3, 3, 32, 56
493 ; CHECK: clrldi   3, 3, 56
494 ; CHECK-LE-LABEL: @getuc11
495 ; CHECK-LE: mfvsrd 3, 34
496 ; CHECK-LE: rldicl 3, 3, 40, 56
497 ; CHECK-LE: clrldi   3, 3, 56
500 ; Function Attrs: norecurse nounwind readnone
501 define zeroext i8 @getuc12(<16 x i8> %vuc) {
502 entry:
503   %vecext = extractelement <16 x i8> %vuc, i32 12
504   ret i8 %vecext
505 ; CHECK-LABEL: @getuc12
506 ; CHECK: mfvsrd 3,
507 ; CHECK: rldicl 3, 3, 40, 56
508 ; CHECK: clrldi   3, 3, 56
509 ; CHECK-LE-LABEL: @getuc12
510 ; CHECK-LE: mfvsrd 3, 34
511 ; CHECK-LE: rldicl 3, 3, 32, 56
512 ; CHECK-LE: clrldi   3, 3, 56
515 ; Function Attrs: norecurse nounwind readnone
516 define zeroext i8 @getuc13(<16 x i8> %vuc) {
517 entry:
518   %vecext = extractelement <16 x i8> %vuc, i32 13
519   ret i8 %vecext
520 ; CHECK-LABEL: @getuc13
521 ; CHECK: mfvsrd 3,
522 ; CHECK: rldicl 3, 3, 48, 56
523 ; CHECK: clrldi   3, 3, 56
524 ; CHECK-LE-LABEL: @getuc13
525 ; CHECK-LE: mfvsrd 3, 34
526 ; CHECK-LE: rldicl 3, 3, 24, 56
527 ; CHECK-LE: clrldi   3, 3, 56
530 ; Function Attrs: norecurse nounwind readnone
531 define zeroext i8 @getuc14(<16 x i8> %vuc) {
532 entry:
533   %vecext = extractelement <16 x i8> %vuc, i32 14
534   ret i8 %vecext
535 ; CHECK-LABEL: @getuc14
536 ; CHECK: mfvsrd 3,
537 ; CHECK: rldicl 3, 3, 56, 56
538 ; CHECK: clrldi   3, 3, 56
539 ; CHECK-LE-LABEL: @getuc14
540 ; CHECK-LE: mfvsrd 3, 34
541 ; CHECK-LE: rldicl 3, 3, 16, 56
542 ; CHECK-LE: clrldi   3, 3, 56
545 ; Function Attrs: norecurse nounwind readnone
546 define zeroext i8 @getuc15(<16 x i8> %vuc) {
547 entry:
548   %vecext = extractelement <16 x i8> %vuc, i32 15
549   ret i8 %vecext
550 ; CHECK-LABEL: @getuc15
551 ; CHECK: mfvsrd 3,
552 ; CHECK: clrldi   3, 3, 56
553 ; CHECK-LE-LABEL: @getuc15
554 ; CHECK-LE: mfvsrd 3, 34
555 ; CHECK-LE: rldicl 3, 3, 8, 56
556 ; CHECK-LE: clrldi   3, 3, 56
559 ; Function Attrs: norecurse nounwind readnone
560 define signext i8 @getvelsc(<16 x i8> %vsc, i32 signext %i) {
561 entry:
562   %vecext = extractelement <16 x i8> %vsc, i32 %i
563   ret i8 %vecext
564 ; CHECK-LABEL: @getvelsc
565 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 8
566 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[ANDI]]
567 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
568 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
569 ; CHECK-DAG: li [[IMM7:[0-9]+]], 7
570 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM7]]
571 ; CHECK-DAG: sldi [[SHL:[0-9]+]], [[ANDC]], 3
572 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
573 ; CHECK-DAG: extsb 3, 3
574 ; CHECK-LE-LABEL: @getvelsc
575 ; CHECK-DAG-LE: li [[IMM8:[0-9]+]], 8
576 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM8]]
577 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[ANDC]]
578 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
579 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
580 ; CHECK-DAG-LE: li [[IMM7:[0-9]+]], 7
581 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM7]]
582 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 3
583 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
584 ; CHECK-DAG-LE: extsb 3, 3
587 ; Function Attrs: norecurse nounwind readnone
588 define zeroext i8 @getveluc(<16 x i8> %vuc, i32 signext %i) {
589 entry:
590   %vecext = extractelement <16 x i8> %vuc, i32 %i
591   ret i8 %vecext
592 ; CHECK-LABEL: @getveluc
593 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 8
594 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[ANDI]]
595 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
596 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
597 ; CHECK-DAG: li [[IMM7:[0-9]+]], 7
598 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM7]]
599 ; CHECK-DAG: sldi [[SHL:[0-9]+]], [[ANDC]], 3
600 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
601 ; CHECK-DAG: clrldi   3, 3, 56
602 ; CHECK-LE-LABEL: @getveluc
603 ; CHECK-DAG-LE: li [[IMM8:[0-9]+]], 8
604 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM8]]
605 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[ANDC]]
606 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
607 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
608 ; CHECK-DAG-LE: li [[IMM7:[0-9]+]], 7
609 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM7]]
610 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 3
611 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
612 ; CHECK-DAG-LE: clrldi   3, 3, 56
615 ; Function Attrs: norecurse nounwind readnone
616 define signext i16 @getss0(<8 x i16> %vss) {
617 entry:
618   %vecext = extractelement <8 x i16> %vss, i32 0
619   ret i16 %vecext
620 ; CHECK-LABEL: @getss0
621 ; CHECK: mfvsrd 3, 34
622 ; CHECK: rldicl 3, 3, 16, 48
623 ; CHECK: extsh 3, 3
624 ; CHECK-LE-LABEL: @getss0
625 ; CHECK-LE: mfvsrd 3,
626 ; CHECK-LE: clrldi 3, 3, 48
627 ; CHECK-LE: extsh 3, 3
630 ; Function Attrs: norecurse nounwind readnone
631 define signext i16 @getss1(<8 x i16> %vss) {
632 entry:
633   %vecext = extractelement <8 x i16> %vss, i32 1
634   ret i16 %vecext
635 ; CHECK-LABEL: @getss1
636 ; CHECK: mfvsrd 3, 34
637 ; CHECK: rldicl 3, 3, 32, 48
638 ; CHECK: extsh 3, 3
639 ; CHECK-LE-LABEL: @getss1
640 ; CHECK-LE: mfvsrd 3,
641 ; CHECK-LE: rldicl 3, 3, 48, 48
642 ; CHECK-LE: extsh 3, 3
645 ; Function Attrs: norecurse nounwind readnone
646 define signext i16 @getss2(<8 x i16> %vss) {
647 entry:
648   %vecext = extractelement <8 x i16> %vss, i32 2
649   ret i16 %vecext
650 ; CHECK-LABEL: @getss2
651 ; CHECK: mfvsrd 3, 34
652 ; CHECK: rldicl 3, 3, 48, 48
653 ; CHECK: extsh 3, 3
654 ; CHECK-LE-LABEL: @getss2
655 ; CHECK-LE: mfvsrd 3,
656 ; CHECK-LE: rldicl 3, 3, 32, 48
657 ; CHECK-LE: extsh 3, 3
660 ; Function Attrs: norecurse nounwind readnone
661 define signext i16 @getss3(<8 x i16> %vss) {
662 entry:
663   %vecext = extractelement <8 x i16> %vss, i32 3
664   ret i16 %vecext
665 ; CHECK-LABEL: @getss3
666 ; CHECK: mfvsrd 3, 34
667 ; CHECK: clrldi 3, 3, 48
668 ; CHECK: extsh 3, 3
669 ; CHECK-LE-LABEL: @getss3
670 ; CHECK-LE: mfvsrd 3,
671 ; CHECK-LE: rldicl 3, 3, 16, 48
672 ; CHECK-LE: extsh 3, 3
675 ; Function Attrs: norecurse nounwind readnone
676 define signext i16 @getss4(<8 x i16> %vss) {
677 entry:
678   %vecext = extractelement <8 x i16> %vss, i32 4
679   ret i16 %vecext
680 ; CHECK-LABEL: @getss4
681 ; CHECK: mfvsrd 3,
682 ; CHECK: rldicl 3, 3, 16, 48
683 ; CHECK: extsh 3, 3
684 ; CHECK-LE-LABEL: @getss4
685 ; CHECK-LE: mfvsrd 3, 34
686 ; CHECK-LE: clrldi 3, 3, 48
687 ; CHECK-LE: extsh 3, 3
690 ; Function Attrs: norecurse nounwind readnone
691 define signext i16 @getss5(<8 x i16> %vss) {
692 entry:
693   %vecext = extractelement <8 x i16> %vss, i32 5
694   ret i16 %vecext
695 ; CHECK-LABEL: @getss5
696 ; CHECK: mfvsrd 3,
697 ; CHECK: rldicl 3, 3, 32, 48
698 ; CHECK: extsh 3, 3
699 ; CHECK-LE-LABEL: @getss5
700 ; CHECK-LE: mfvsrd 3, 34
701 ; CHECK-LE: rldicl 3, 3, 48, 48
702 ; CHECK-LE: extsh 3, 3
705 ; Function Attrs: norecurse nounwind readnone
706 define signext i16 @getss6(<8 x i16> %vss) {
707 entry:
708   %vecext = extractelement <8 x i16> %vss, i32 6
709   ret i16 %vecext
710 ; CHECK-LABEL: @getss6
711 ; CHECK: mfvsrd 3,
712 ; CHECK: rldicl 3, 3, 48, 48
713 ; CHECK: extsh 3, 3
714 ; CHECK-LE-LABEL: @getss6
715 ; CHECK-LE: mfvsrd 3, 34
716 ; CHECK-LE: rldicl 3, 3, 32, 48
717 ; CHECK-LE: extsh 3, 3
720 ; Function Attrs: norecurse nounwind readnone
721 define signext i16 @getss7(<8 x i16> %vss) {
722 entry:
723   %vecext = extractelement <8 x i16> %vss, i32 7
724   ret i16 %vecext
725 ; CHECK-LABEL: @getss7
726 ; CHECK: mfvsrd 3,
727 ; CHECK: extsh 3, 3
728 ; CHECK-LE-LABEL: @getss7
729 ; CHECK-LE: mfvsrd 3, 34
730 ; CHECK-LE: rldicl 3, 3, 16, 48
731 ; CHECK-LE: extsh 3, 3
734 ; Function Attrs: norecurse nounwind readnone
735 define zeroext i16 @getus0(<8 x i16> %vus) {
736 entry:
737   %vecext = extractelement <8 x i16> %vus, i32 0
738   ret i16 %vecext
739 ; CHECK-LABEL: @getus0
740 ; CHECK: mfvsrd 3, 34
741 ; CHECK: rldicl 3, 3, 16, 48
742 ; CHECK: clrldi   3, 3, 48
743 ; CHECK-LE-LABEL: @getus0
744 ; CHECK-LE: mfvsrd 3,
745 ; CHECK-LE: clrldi   3, 3, 48
748 ; Function Attrs: norecurse nounwind readnone
749 define zeroext i16 @getus1(<8 x i16> %vus) {
750 entry:
751   %vecext = extractelement <8 x i16> %vus, i32 1
752   ret i16 %vecext
753 ; CHECK-LABEL: @getus1
754 ; CHECK: mfvsrd 3, 34
755 ; CHECK: rldicl 3, 3, 32, 48
756 ; CHECK: clrldi   3, 3, 48
757 ; CHECK-LE-LABEL: @getus1
758 ; CHECK-LE: mfvsrd 3,
759 ; CHECK-LE: rldicl 3, 3, 48, 48
760 ; CHECK-LE: clrldi   3, 3, 48
763 ; Function Attrs: norecurse nounwind readnone
764 define zeroext i16 @getus2(<8 x i16> %vus) {
765 entry:
766   %vecext = extractelement <8 x i16> %vus, i32 2
767   ret i16 %vecext
768 ; CHECK-LABEL: @getus2
769 ; CHECK: mfvsrd 3, 34
770 ; CHECK: rldicl 3, 3, 48, 48
771 ; CHECK: clrldi   3, 3, 48
772 ; CHECK-LE-LABEL: @getus2
773 ; CHECK-LE: mfvsrd 3,
774 ; CHECK-LE: rldicl 3, 3, 32, 48
775 ; CHECK-LE: clrldi   3, 3, 48
778 ; Function Attrs: norecurse nounwind readnone
779 define zeroext i16 @getus3(<8 x i16> %vus) {
780 entry:
781   %vecext = extractelement <8 x i16> %vus, i32 3
782   ret i16 %vecext
783 ; CHECK-LABEL: @getus3
784 ; CHECK: mfvsrd 3, 34
785 ; CHECK: clrldi   3, 3, 48
786 ; CHECK-LE-LABEL: @getus3
787 ; CHECK-LE: mfvsrd 3,
788 ; CHECK-LE: rldicl 3, 3, 16, 48
789 ; CHECK-LE: clrldi   3, 3, 48
792 ; Function Attrs: norecurse nounwind readnone
793 define zeroext i16 @getus4(<8 x i16> %vus) {
794 entry:
795   %vecext = extractelement <8 x i16> %vus, i32 4
796   ret i16 %vecext
797 ; CHECK-LABEL: @getus4
798 ; CHECK: mfvsrd 3,
799 ; CHECK: rldicl 3, 3, 16, 48
800 ; CHECK: clrldi   3, 3, 48
801 ; CHECK-LE-LABEL: @getus4
802 ; CHECK-LE: mfvsrd 3, 34
803 ; CHECK-LE: clrldi   3, 3, 48
806 ; Function Attrs: norecurse nounwind readnone
807 define zeroext i16 @getus5(<8 x i16> %vus) {
808 entry:
809   %vecext = extractelement <8 x i16> %vus, i32 5
810   ret i16 %vecext
811 ; CHECK-LABEL: @getus5
812 ; CHECK: mfvsrd 3,
813 ; CHECK: rldicl 3, 3, 32, 48
814 ; CHECK: clrldi   3, 3, 48
815 ; CHECK-LE-LABEL: @getus5
816 ; CHECK-LE: mfvsrd 3, 34
817 ; CHECK-LE: rldicl 3, 3, 48, 48
818 ; CHECK-LE: clrldi   3, 3, 48
821 ; Function Attrs: norecurse nounwind readnone
822 define zeroext i16 @getus6(<8 x i16> %vus) {
823 entry:
824   %vecext = extractelement <8 x i16> %vus, i32 6
825   ret i16 %vecext
826 ; CHECK-LABEL: @getus6
827 ; CHECK: mfvsrd 3,
828 ; CHECK: rldicl 3, 3, 48, 48
829 ; CHECK: clrldi   3, 3, 48
830 ; CHECK-LE-LABEL: @getus6
831 ; CHECK-LE: mfvsrd 3, 34
832 ; CHECK-LE: rldicl 3, 3, 32, 48
833 ; CHECK-LE: clrldi   3, 3, 48
836 ; Function Attrs: norecurse nounwind readnone
837 define zeroext i16 @getus7(<8 x i16> %vus) {
838 entry:
839   %vecext = extractelement <8 x i16> %vus, i32 7
840   ret i16 %vecext
841 ; CHECK-LABEL: @getus7
842 ; CHECK: mfvsrd 3,
843 ; CHECK: clrldi   3, 3, 48
844 ; CHECK-LE-LABEL: @getus7
845 ; CHECK-LE: mfvsrd 3, 34
846 ; CHECK-LE: rldicl 3, 3, 16, 48
847 ; CHECK-LE: clrldi   3, 3, 48
850 ; Function Attrs: norecurse nounwind readnone
851 define signext i16 @getvelss(<8 x i16> %vss, i32 signext %i) {
852 entry:
853   %vecext = extractelement <8 x i16> %vss, i32 %i
854   ret i16 %vecext
855 ; CHECK-LABEL: @getvelss
856 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 4
857 ; CHECK-DAG: sldi [[MUL2:[0-9]+]], [[ANDI]], 1
858 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
859 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
860 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
861 ; CHECK-DAG: li [[IMM3:[0-9]+]], 3
862 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM3]]
863 ; CHECK-DAG: sldi [[SHL:[0-9]+]], [[ANDC]], 4
864 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
865 ; CHECK-DAG: extsh 3, 3
866 ; CHECK-LE-LABEL: @getvelss
867 ; CHECK-DAG-LE: li [[IMM4:[0-9]+]], 4
868 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM4]]
869 ; CHECK-DAG-LE: sldi [[MUL2:[0-9]+]], [[ANDC]], 1
870 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
871 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
872 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
873 ; CHECK-DAG-LE: li [[IMM3:[0-9]+]], 3
874 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM3]]
875 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 4
876 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
877 ; CHECK-DAG-LE: extsh 3, 3
880 ; Function Attrs: norecurse nounwind readnone
881 define zeroext i16 @getvelus(<8 x i16> %vus, i32 signext %i) {
882 entry:
883   %vecext = extractelement <8 x i16> %vus, i32 %i
884   ret i16 %vecext
885 ; CHECK-LABEL: @getvelus
886 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 4
887 ; CHECK-DAG: sldi [[MUL2:[0-9]+]], [[ANDI]], 1
888 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
889 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
890 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
891 ; CHECK-DAG: li [[IMM3:[0-9]+]], 3
892 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM3]]
893 ; CHECK-DAG: sldi [[SHL:[0-9]+]], [[ANDC]], 4
894 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
895 ; CHECK-DAG: clrldi   3, 3, 48
896 ; CHECK-LE-LABEL: @getvelus
897 ; CHECK-DAG-LE: li [[IMM4:[0-9]+]], 4
898 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM4]]
899 ; CHECK-DAG-LE: sldi [[MUL2:[0-9]+]], [[ANDC]], 1
900 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
901 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
902 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
903 ; CHECK-DAG-LE: li [[IMM3:[0-9]+]], 3
904 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM3]]
905 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 4
906 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
907 ; CHECK-DAG-LE: clrldi   3, 3, 48
910 ; Function Attrs: norecurse nounwind readnone
911 define signext i32 @getsi0(<4 x i32> %vsi) {
912 entry:
913   %vecext = extractelement <4 x i32> %vsi, i32 0
914   ret i32 %vecext
915 ; CHECK-LABEL: @getsi0
916 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
917 ; CHECK: mfvsrwz 3, [[SHL]]
918 ; CHECK: extsw 3, 3
919 ; CHECK-LE-LABEL: @getsi0
920 ; CHECK-LE: xxswapd [[SHL:[0-9]+]], 34
921 ; CHECK-LE: mfvsrwz 3, [[SHL]]
922 ; CHECK-LE: extsw 3, 3
925 ; Function Attrs: norecurse nounwind readnone
926 define signext i32 @getsi1(<4 x i32> %vsi) {
927 entry:
928   %vecext = extractelement <4 x i32> %vsi, i32 1
929   ret i32 %vecext
930 ; CHECK-LABEL: @getsi1
931 ; CHECK: mfvsrwz 3, 34
932 ; CHECK: extsw 3, 3
933 ; CHECK-LE-LABEL: @getsi1
934 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
935 ; CHECK-LE: mfvsrwz 3, [[SHL]]
936 ; CHECK-LE: extsw 3, 3
939 ; Function Attrs: norecurse nounwind readnone
940 define signext i32 @getsi2(<4 x i32> %vsi) {
941 entry:
942   %vecext = extractelement <4 x i32> %vsi, i32 2
943   ret i32 %vecext
944 ; CHECK-LABEL: @getsi2
945 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
946 ; CHECK: mfvsrwz 3, [[SHL]]
947 ; CHECK: extsw 3, 3
948 ; CHECK-LE-LABEL: @getsi2
949 ; CHECK-LE: mfvsrwz 3, 34
950 ; CHECK-LE: extsw 3, 3
953 ; Function Attrs: norecurse nounwind readnone
954 define signext i32 @getsi3(<4 x i32> %vsi) {
955 entry:
956   %vecext = extractelement <4 x i32> %vsi, i32 3
957   ret i32 %vecext
958 ; CHECK-LABEL: @getsi3
959 ; CHECK: xxswapd [[SHL:[0-9]+]], 34
960 ; CHECK: mfvsrwz 3, [[SHL]]
961 ; CHECK: extsw 3, 3
962 ; CHECK-LE-LABEL: @getsi3
963 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
964 ; CHECK-LE: mfvsrwz 3, [[SHL]]
965 ; CHECK-LE: extsw 3, 3
968 ; Function Attrs: norecurse nounwind readnone
969 define zeroext i32 @getui0(<4 x i32> %vui) {
970 entry:
971   %vecext = extractelement <4 x i32> %vui, i32 0
972   ret i32 %vecext
973 ; CHECK-LABEL: @getui0
974 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
975 ; CHECK: mfvsrwz 3, [[SHL]]
976 ; CHECK: clrldi   3, 3, 32
977 ; CHECK-LE-LABEL: @getui0
978 ; CHECK-LE: xxswapd [[SHL:[0-9]+]], 34
979 ; CHECK-LE: mfvsrwz 3, [[SHL]]
980 ; CHECK-LE: clrldi   3, 3, 32
983 ; Function Attrs: norecurse nounwind readnone
984 define zeroext i32 @getui1(<4 x i32> %vui) {
985 entry:
986   %vecext = extractelement <4 x i32> %vui, i32 1
987   ret i32 %vecext
988 ; CHECK-LABEL: @getui1
989 ; CHECK: mfvsrwz 3, 34
990 ; CHECK: clrldi   3, 3, 32
991 ; CHECK-LE-LABEL: @getui1
992 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
993 ; CHECK-LE: mfvsrwz 3, [[SHL]]
994 ; CHECK-LE: clrldi   3, 3, 32
997 ; Function Attrs: norecurse nounwind readnone
998 define zeroext i32 @getui2(<4 x i32> %vui) {
999 entry:
1000   %vecext = extractelement <4 x i32> %vui, i32 2
1001   ret i32 %vecext
1002 ; CHECK-LABEL: @getui2
1003 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1004 ; CHECK: mfvsrwz 3, [[SHL]]
1005 ; CHECK: clrldi   3, 3, 32
1006 ; CHECK-LE-LABEL: @getui2
1007 ; CHECK-LE: mfvsrwz 3, 34
1008 ; CHECK-LE: clrldi   3, 3, 32
1011 ; Function Attrs: norecurse nounwind readnone
1012 define zeroext i32 @getui3(<4 x i32> %vui) {
1013 entry:
1014   %vecext = extractelement <4 x i32> %vui, i32 3
1015   ret i32 %vecext
1016 ; CHECK-LABEL: @getui3
1017 ; CHECK: xxswapd [[SHL:[0-9]+]], 34
1018 ; CHECK: mfvsrwz 3, [[SHL]]
1019 ; CHECK: clrldi   3, 3, 32
1020 ; CHECK-LE-LABEL: @getui3
1021 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1022 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1023 ; CHECK-LE: clrldi   3, 3, 32
1026 ; Function Attrs: norecurse nounwind readnone
1027 define signext i32 @getvelsi(<4 x i32> %vsi, i32 signext %i) {
1028 entry:
1029   %vecext = extractelement <4 x i32> %vsi, i32 %i
1030   ret i32 %vecext
1031 ; CHECK-LABEL: @getvelsi
1032 ; CHECK-LE-LABEL: @getvelsi
1033 ; FIXME: add check patterns when variable element extraction is implemented
1036 ; Function Attrs: norecurse nounwind readnone
1037 define zeroext i32 @getvelui(<4 x i32> %vui, i32 signext %i) {
1038 entry:
1039   %vecext = extractelement <4 x i32> %vui, i32 %i
1040   ret i32 %vecext
1041 ; CHECK-LABEL: @getvelui
1042 ; CHECK-LE-LABEL: @getvelui
1043 ; FIXME: add check patterns when variable element extraction is implemented
1046 ; Function Attrs: norecurse nounwind readnone
1047 define i64 @getsl0(<2 x i64> %vsl) {
1048 entry:
1049   %vecext = extractelement <2 x i64> %vsl, i32 0
1050   ret i64 %vecext
1051 ; CHECK-LABEL: @getsl0
1052 ; CHECK: mfvsrd 3, 34
1053 ; CHECK-LE-LABEL: @getsl0
1054 ; CHECK-LE: xxswapd  [[SWP:[0-9]+]], 34
1055 ; CHECK-LE: mfvsrd 3, [[SWP]]
1058 ; Function Attrs: norecurse nounwind readnone
1059 define i64 @getsl1(<2 x i64> %vsl) {
1060 entry:
1061   %vecext = extractelement <2 x i64> %vsl, i32 1
1062   ret i64 %vecext
1063 ; CHECK-LABEL: @getsl1
1064 ; CHECK: xxswapd  [[SWP:[0-9]+]], 34
1065 ; CHECK: mfvsrd 3, [[SWP]]
1066 ; CHECK-LE-LABEL: @getsl1
1067 ; CHECK-LE: mfvsrd 3, 34
1070 ; Function Attrs: norecurse nounwind readnone
1071 define i64 @getul0(<2 x i64> %vul) {
1072 entry:
1073   %vecext = extractelement <2 x i64> %vul, i32 0
1074   ret i64 %vecext
1075 ; CHECK-LABEL: @getul0
1076 ; CHECK: mfvsrd 3, 34
1077 ; CHECK-LE-LABEL: @getul0
1078 ; CHECK-LE: xxswapd  [[SWP:[0-9]+]], 34
1079 ; CHECK-LE: mfvsrd 3, [[SWP]]
1082 ; Function Attrs: norecurse nounwind readnone
1083 define i64 @getul1(<2 x i64> %vul) {
1084 entry:
1085   %vecext = extractelement <2 x i64> %vul, i32 1
1086   ret i64 %vecext
1087 ; CHECK-LABEL: @getul1
1088 ; CHECK: xxswapd  [[SWP:[0-9]+]], 34
1089 ; CHECK: mfvsrd 3, [[SWP]]
1090 ; CHECK-LE-LABEL: @getul1
1091 ; CHECK-LE: mfvsrd 3, 34
1094 ; Function Attrs: norecurse nounwind readnone
1095 define i64 @getvelsl(<2 x i64> %vsl, i32 signext %i) {
1096 entry:
1097   %vecext = extractelement <2 x i64> %vsl, i32 %i
1098   ret i64 %vecext
1099 ; CHECK-LABEL: @getvelsl
1100 ; CHECK-LE-LABEL: @getvelsl
1101 ; FIXME: add check patterns when variable element extraction is implemented
1104 ; Function Attrs: norecurse nounwind readnone
1105 define i64 @getvelul(<2 x i64> %vul, i32 signext %i) {
1106 entry:
1107   %vecext = extractelement <2 x i64> %vul, i32 %i
1108   ret i64 %vecext
1109 ; CHECK-LABEL: @getvelul
1110 ; CHECK-LE-LABEL: @getvelul
1111 ; FIXME: add check patterns when variable element extraction is implemented
1114 ; Function Attrs: norecurse nounwind readnone
1115 define float @getf0(<4 x float> %vf) {
1116 entry:
1117   %vecext = extractelement <4 x float> %vf, i32 0
1118   ret float %vecext
1119 ; CHECK-LABEL: @getf0
1120 ; CHECK: xscvspdpn 1, 34
1121 ; CHECK-LE-LABEL: @getf0
1122 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1123 ; CHECK-LE: xscvspdpn 1, [[SHL]]
1126 ; Function Attrs: norecurse nounwind readnone
1127 define float @getf1(<4 x float> %vf) {
1128 entry:
1129   %vecext = extractelement <4 x float> %vf, i32 1
1130   ret float %vecext
1131 ; CHECK-LABEL: @getf1
1132 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1133 ; CHECK: xscvspdpn 1, [[SHL]]
1134 ; CHECK-LE-LABEL: @getf1
1135 ; CHECK-LE: xxswapd [[SHL:[0-9]+]], 34
1136 ; CHECK-LE: xscvspdpn 1, [[SHL]]
1139 ; Function Attrs: norecurse nounwind readnone
1140 define float @getf2(<4 x float> %vf) {
1141 entry:
1142   %vecext = extractelement <4 x float> %vf, i32 2
1143   ret float %vecext
1144 ; CHECK-LABEL: @getf2
1145 ; CHECK: xxswapd [[SHL:[0-9]+]], 34
1146 ; CHECK: xscvspdpn 1, [[SHL]]
1147 ; CHECK-LE-LABEL: @getf2
1148 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1149 ; CHECK-LE: xscvspdpn 1, [[SHL]]
1152 ; Function Attrs: norecurse nounwind readnone
1153 define float @getf3(<4 x float> %vf) {
1154 entry:
1155   %vecext = extractelement <4 x float> %vf, i32 3
1156   ret float %vecext
1157 ; CHECK-LABEL: @getf3
1158 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1159 ; CHECK: xscvspdpn 1, [[SHL]]
1160 ; CHECK-LE-LABEL: @getf3
1161 ; CHECK-LE: xscvspdpn 1, 34
1164 ; Function Attrs: norecurse nounwind readnone
1165 define float @getvelf(<4 x float> %vf, i32 signext %i) {
1166 entry:
1167   %vecext = extractelement <4 x float> %vf, i32 %i
1168   ret float %vecext
1169 ; CHECK-LABEL: @getvelf
1170 ; CHECK-LE-LABEL: @getvelf
1171 ; FIXME: add check patterns when variable element extraction is implemented
1174 ; Function Attrs: norecurse nounwind readnone
1175 define double @getd0(<2 x double> %vd) {
1176 entry:
1177   %vecext = extractelement <2 x double> %vd, i32 0
1178   ret double %vecext
1179 ; CHECK-LABEL: @getd0
1180 ; CHECK: xxlor 1, 34, 34
1181 ; CHECK-LE-LABEL: @getd0
1182 ; CHECK-LE: xxswapd  1, 34
1185 ; Function Attrs: norecurse nounwind readnone
1186 define double @getd1(<2 x double> %vd) {
1187 entry:
1188   %vecext = extractelement <2 x double> %vd, i32 1
1189   ret double %vecext
1190 ; CHECK-LABEL: @getd1
1191 ; CHECK: xxswapd  1, 34
1192 ; CHECK-LE-LABEL: @getd1
1193 ; CHECK-LE: xxlor 1, 34, 34
1196 ; Function Attrs: norecurse nounwind readnone
1197 define double @getveld(<2 x double> %vd, i32 signext %i) {
1198 entry:
1199   %vecext = extractelement <2 x double> %vd, i32 %i
1200   ret double %vecext
1201 ; CHECK-LABEL: @getveld
1202 ; CHECK-LE-LABEL: @getveld
1203 ; FIXME: add check patterns when variable element extraction is implemented