Vector element extraction without stack operations on Power 8
[oota-llvm.git] / test / CodeGen / PowerPC / p8-scalar_vector_conversions.ll
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
3
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.
7
8 ; Function Attrs: nounwind
9 define <16 x i8> @buildc(i8 zeroext %a) {
10 entry:
11   %a.addr = alloca i8, align 1
12   store i8 %a, i8* %a.addr, align 1
13   %0 = load i8, i8* %a.addr, align 1
14   %splat.splatinsert = insertelement <16 x i8> undef, i8 %0, i32 0
15   %splat.splat = shufflevector <16 x i8> %splat.splatinsert, <16 x i8> undef, <16 x i32> zeroinitializer
16   ret <16 x i8> %splat.splat
17 ; CHECK: sldi [[REG1:[0-9]+]], 3, 56
18 ; CHECK: mtvsrd {{[0-9]+}}, [[REG1]]
19 ; CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
20 ; CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
21 }
22
23 ; Function Attrs: nounwind
24 define <8 x i16> @builds(i16 zeroext %a) {
25 entry:
26   %a.addr = alloca i16, align 2
27   store i16 %a, i16* %a.addr, align 2
28   %0 = load i16, i16* %a.addr, align 2
29   %splat.splatinsert = insertelement <8 x i16> undef, i16 %0, i32 0
30   %splat.splat = shufflevector <8 x i16> %splat.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer
31   ret <8 x i16> %splat.splat
32 ; CHECK: sldi [[REG1:[0-9]+]], 3, 48
33 ; CHECK: mtvsrd {{[0-9]+}}, [[REG1]]
34 ; CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
35 ; CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
36 }
37
38 ; Function Attrs: nounwind
39 define <4 x i32> @buildi(i32 zeroext %a) {
40 entry:
41   %a.addr = alloca i32, align 4
42   store i32 %a, i32* %a.addr, align 4
43   %0 = load i32, i32* %a.addr, align 4
44   %splat.splatinsert = insertelement <4 x i32> undef, i32 %0, i32 0
45   %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
46   ret <4 x i32> %splat.splat
47 ; CHECK: sldi [[REG1:[0-9]+]], 3, 32
48 ; CHECK: mtvsrd {{[0-9]+}}, [[REG1]]
49 ; CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
50 ; CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
51 }
52
53 ; Function Attrs: nounwind
54 define <2 x i64> @buildl(i64 %a) {
55 entry:
56   %a.addr = alloca i64, align 8
57   store i64 %a, i64* %a.addr, align 8
58   %0 = load i64, i64* %a.addr, align 8
59   %splat.splatinsert = insertelement <2 x i64> undef, i64 %0, i32 0
60   %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
61   ret <2 x i64> %splat.splat
62 ; FIXME-CHECK: mtvsrd {{[0-9]+}}, 3
63 ; FIXME-CHECK-LE: mtvsrd [[REG1:[0-9]+]], 3
64 ; FIXME-CHECK-LE: xxswapd {{[0-9]+}}, [[REG1]]
65 }
66
67 ; Function Attrs: nounwind
68 define <4 x float> @buildf(float %a) {
69 entry:
70   %a.addr = alloca float, align 4
71   store float %a, float* %a.addr, align 4
72   %0 = load float, float* %a.addr, align 4
73   %splat.splatinsert = insertelement <4 x float> undef, float %0, i32 0
74   %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer
75   ret <4 x float> %splat.splat
76 ; CHECK: xscvdpspn {{[0-9]+}}, 1
77 ; CHECK-LE: xscvdpspn [[REG1:[0-9]+]], 1
78 ; CHECK-LE: xxsldwi {{[0-9]+}}, [[REG1]], [[REG1]], 1
79 }
80
81 ; Function Attrs: nounwind
82 define signext i8 @getsc0(<16 x i8> %vsc) {
83 entry:
84   %vsc.addr = alloca <16 x i8>, align 16
85   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
86   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
87   %vecext = extractelement <16 x i8> %0, i32 0
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
97 }
98
99 ; Function Attrs: nounwind
100 define signext i8 @getsc1(<16 x i8> %vsc) {
101 entry:
102   %vsc.addr = alloca <16 x i8>, align 16
103   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
104   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
105   %vecext = extractelement <16 x i8> %0, i32 1
106   ret i8 %vecext
107 ; CHECK-LABEL: @getsc1
108 ; CHECK: mfvsrd 3, 34
109 ; CHECK: rldicl 3, 3, 16, 56
110 ; CHECK: extsb 3, 3
111 ; CHECK-LE-LABEL: @getsc1
112 ; CHECK-LE: mfvsrd 3,
113 ; CHECK-LE: rldicl 3, 3, 56, 56
114 ; CHECK-LE: extsb 3, 3
115 }
116
117 ; Function Attrs: nounwind
118 define signext i8 @getsc2(<16 x i8> %vsc) {
119 entry:
120   %vsc.addr = alloca <16 x i8>, align 16
121   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
122   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
123   %vecext = extractelement <16 x i8> %0, i32 2
124   ret i8 %vecext
125 ; CHECK-LABEL: @getsc2
126 ; CHECK: mfvsrd 3, 34
127 ; CHECK: rldicl 3, 3, 24, 56
128 ; CHECK: extsb 3, 3
129 ; CHECK-LE-LABEL: @getsc2
130 ; CHECK-LE: mfvsrd 3,
131 ; CHECK-LE: rldicl 3, 3, 48, 56
132 ; CHECK-LE: extsb 3, 3
133 }
134
135 ; Function Attrs: nounwind
136 define signext i8 @getsc3(<16 x i8> %vsc) {
137 entry:
138   %vsc.addr = alloca <16 x i8>, align 16
139   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
140   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
141   %vecext = extractelement <16 x i8> %0, i32 3
142   ret i8 %vecext
143 ; CHECK-LABEL: @getsc3
144 ; CHECK: mfvsrd 3, 34
145 ; CHECK: rldicl 3, 3, 32, 56
146 ; CHECK: extsb 3, 3
147 ; CHECK-LE-LABEL: @getsc3
148 ; CHECK-LE: mfvsrd 3,
149 ; CHECK-LE: rldicl 3, 3, 40, 56
150 ; CHECK-LE: extsb 3, 3
151 }
152
153 ; Function Attrs: nounwind
154 define signext i8 @getsc4(<16 x i8> %vsc) {
155 entry:
156   %vsc.addr = alloca <16 x i8>, align 16
157   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
158   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
159   %vecext = extractelement <16 x i8> %0, i32 4
160   ret i8 %vecext
161 ; CHECK-LABEL: @getsc4
162 ; CHECK: mfvsrd 3, 34
163 ; CHECK: rldicl 3, 3, 40, 56
164 ; CHECK: extsb 3, 3
165 ; CHECK-LE-LABEL: @getsc4
166 ; CHECK-LE: mfvsrd 3,
167 ; CHECK-LE: rldicl 3, 3, 32, 56
168 ; CHECK-LE: extsb 3, 3
169 }
170
171 ; Function Attrs: nounwind
172 define signext i8 @getsc5(<16 x i8> %vsc) {
173 entry:
174   %vsc.addr = alloca <16 x i8>, align 16
175   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
176   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
177   %vecext = extractelement <16 x i8> %0, i32 5
178   ret i8 %vecext
179 ; CHECK-LABEL: @getsc5
180 ; CHECK: mfvsrd 3, 34
181 ; CHECK: rldicl 3, 3, 48, 56
182 ; CHECK: extsb 3, 3
183 ; CHECK-LE-LABEL: @getsc5
184 ; CHECK-LE: mfvsrd 3,
185 ; CHECK-LE: rldicl 3, 3, 24, 56
186 ; CHECK-LE: extsb 3, 3
187 }
188
189 ; Function Attrs: nounwind
190 define signext i8 @getsc6(<16 x i8> %vsc) {
191 entry:
192   %vsc.addr = alloca <16 x i8>, align 16
193   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
194   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
195   %vecext = extractelement <16 x i8> %0, i32 6
196   ret i8 %vecext
197 ; CHECK-LABEL: @getsc6
198 ; CHECK: mfvsrd 3, 34
199 ; CHECK: rldicl 3, 3, 56, 56
200 ; CHECK: extsb 3, 3
201 ; CHECK-LE-LABEL: @getsc6
202 ; CHECK-LE: mfvsrd 3,
203 ; CHECK-LE: rldicl 3, 3, 16, 56
204 ; CHECK-LE: extsb 3, 3
205 }
206
207 ; Function Attrs: nounwind
208 define signext i8 @getsc7(<16 x i8> %vsc) {
209 entry:
210   %vsc.addr = alloca <16 x i8>, align 16
211   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
212   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
213   %vecext = extractelement <16 x i8> %0, i32 7
214   ret i8 %vecext
215 ; CHECK-LABEL: @getsc7
216 ; CHECK: mfvsrd 3, 34
217 ; CHECK: clrldi 3, 3, 56
218 ; CHECK: extsb 3, 3
219 ; CHECK-LE-LABEL: @getsc7
220 ; CHECK-LE: mfvsrd 3,
221 ; CHECK-LE: rldicl 3, 3, 8, 56
222 ; CHECK-LE: extsb 3, 3
223 }
224
225 ; Function Attrs: nounwind
226 define signext i8 @getsc8(<16 x i8> %vsc) {
227 entry:
228   %vsc.addr = alloca <16 x i8>, align 16
229   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
230   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
231   %vecext = extractelement <16 x i8> %0, i32 8
232   ret i8 %vecext
233 ; CHECK-LABEL: @getsc8
234 ; CHECK: mfvsrd 3,
235 ; CHECK: rldicl 3, 3, 8, 56
236 ; CHECK: extsb 3, 3
237 ; CHECK-LE-LABEL: @getsc8
238 ; CHECK-LE: mfvsrd 3, 34
239 ; CHECK-LE: clrldi 3, 3, 56
240 ; CHECK-LE: extsb 3, 3
241 }
242
243 ; Function Attrs: nounwind
244 define signext i8 @getsc9(<16 x i8> %vsc) {
245 entry:
246   %vsc.addr = alloca <16 x i8>, align 16
247   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
248   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
249   %vecext = extractelement <16 x i8> %0, i32 9
250   ret i8 %vecext
251 ; CHECK-LABEL: @getsc9
252 ; CHECK: mfvsrd 3,
253 ; CHECK: rldicl 3, 3, 16, 56
254 ; CHECK: extsb 3, 3
255 ; CHECK-LE-LABEL: @getsc9
256 ; CHECK-LE: mfvsrd 3, 34
257 ; CHECK-LE: rldicl 3, 3, 56, 56
258 ; CHECK-LE: extsb 3, 3
259 }
260
261 ; Function Attrs: nounwind
262 define signext i8 @getsc10(<16 x i8> %vsc) {
263 entry:
264   %vsc.addr = alloca <16 x i8>, align 16
265   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
266   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
267   %vecext = extractelement <16 x i8> %0, i32 10
268   ret i8 %vecext
269 ; CHECK-LABEL: @getsc10
270 ; CHECK: mfvsrd 3,
271 ; CHECK: rldicl 3, 3, 24, 56
272 ; CHECK: extsb 3, 3
273 ; CHECK-LE-LABEL: @getsc10
274 ; CHECK-LE: mfvsrd 3, 34
275 ; CHECK-LE: rldicl 3, 3, 48, 56
276 ; CHECK-LE: extsb 3, 3
277 }
278
279 ; Function Attrs: nounwind
280 define signext i8 @getsc11(<16 x i8> %vsc) {
281 entry:
282   %vsc.addr = alloca <16 x i8>, align 16
283   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
284   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
285   %vecext = extractelement <16 x i8> %0, i32 11
286   ret i8 %vecext
287 ; CHECK-LABEL: @getsc11
288 ; CHECK: mfvsrd 3,
289 ; CHECK: rldicl 3, 3, 32, 56
290 ; CHECK: extsb 3, 3
291 ; CHECK-LE-LABEL: @getsc11
292 ; CHECK-LE: mfvsrd 3, 34
293 ; CHECK-LE: rldicl 3, 3, 40, 56
294 ; CHECK-LE: extsb 3, 3
295 }
296
297 ; Function Attrs: nounwind
298 define signext i8 @getsc12(<16 x i8> %vsc) {
299 entry:
300   %vsc.addr = alloca <16 x i8>, align 16
301   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
302   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
303   %vecext = extractelement <16 x i8> %0, i32 12
304   ret i8 %vecext
305 ; CHECK-LABEL: @getsc12
306 ; CHECK: mfvsrd 3,
307 ; CHECK: rldicl 3, 3, 40, 56
308 ; CHECK: extsb 3, 3
309 ; CHECK-LE-LABEL: @getsc12
310 ; CHECK-LE: mfvsrd 3, 34
311 ; CHECK-LE: rldicl 3, 3, 32, 56
312 ; CHECK-LE: extsb 3, 3
313 }
314
315 ; Function Attrs: nounwind
316 define signext i8 @getsc13(<16 x i8> %vsc) {
317 entry:
318   %vsc.addr = alloca <16 x i8>, align 16
319   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
320   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
321   %vecext = extractelement <16 x i8> %0, i32 13
322   ret i8 %vecext
323 ; CHECK-LABEL: @getsc13
324 ; CHECK: mfvsrd 3,
325 ; CHECK: rldicl 3, 3, 48, 56
326 ; CHECK: extsb 3, 3
327 ; CHECK-LE-LABEL: @getsc13
328 ; CHECK-LE: mfvsrd 3, 34
329 ; CHECK-LE: rldicl 3, 3, 24, 56
330 ; CHECK-LE: extsb 3, 3
331 }
332
333 ; Function Attrs: nounwind
334 define signext i8 @getsc14(<16 x i8> %vsc) {
335 entry:
336   %vsc.addr = alloca <16 x i8>, align 16
337   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
338   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
339   %vecext = extractelement <16 x i8> %0, i32 14
340   ret i8 %vecext
341 ; CHECK-LABEL: @getsc14
342 ; CHECK: mfvsrd 3,
343 ; CHECK: rldicl 3, 3, 56, 56
344 ; CHECK: extsb 3, 3
345 ; CHECK-LE-LABEL: @getsc14
346 ; CHECK-LE: mfvsrd 3, 34
347 ; CHECK-LE: rldicl 3, 3, 16, 56
348 ; CHECK-LE: extsb 3, 3
349 }
350
351 ; Function Attrs: nounwind
352 define signext i8 @getsc15(<16 x i8> %vsc) {
353 entry:
354   %vsc.addr = alloca <16 x i8>, align 16
355   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
356   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
357   %vecext = extractelement <16 x i8> %0, i32 15
358   ret i8 %vecext
359 ; CHECK-LABEL: @getsc15
360 ; CHECK: mfvsrd 3,
361 ; CHECK: extsb 3, 3
362 ; CHECK-LE-LABEL: @getsc15
363 ; CHECK-LE: mfvsrd 3, 34
364 ; CHECK-LE: rldicl 3, 3, 8, 56
365 ; CHECK-LE: extsb 3, 3
366 }
367
368 ; Function Attrs: nounwind
369 define zeroext i8 @getuc0(<16 x i8> %vuc) {
370 entry:
371   %vuc.addr = alloca <16 x i8>, align 16
372   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
373   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
374   %vecext = extractelement <16 x i8> %0, i32 0
375   ret i8 %vecext
376 ; CHECK-LABEL: @getuc0
377 ; CHECK: mfvsrd 3, 34
378 ; CHECK: rldicl 3, 3, 8, 56
379 ; CHECK: clrldi   3, 3, 56
380 ; CHECK-LE-LABEL: @getuc0
381 ; CHECK-LE: mfvsrd 3,
382 ; CHECK-LE: clrldi   3, 3, 56
383 }
384
385 ; Function Attrs: nounwind
386 define zeroext i8 @getuc1(<16 x i8> %vuc) {
387 entry:
388   %vuc.addr = alloca <16 x i8>, align 16
389   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
390   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
391   %vecext = extractelement <16 x i8> %0, i32 1
392   ret i8 %vecext
393 ; CHECK-LABEL: @getuc1
394 ; CHECK: mfvsrd 3, 34
395 ; CHECK: rldicl 3, 3, 16, 56
396 ; CHECK: clrldi   3, 3, 56
397 ; CHECK-LE-LABEL: @getuc1
398 ; CHECK-LE: mfvsrd 3,
399 ; CHECK-LE: rldicl 3, 3, 56, 56
400 ; CHECK-LE: clrldi   3, 3, 56
401 }
402
403 ; Function Attrs: nounwind
404 define zeroext i8 @getuc2(<16 x i8> %vuc) {
405 entry:
406   %vuc.addr = alloca <16 x i8>, align 16
407   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
408   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
409   %vecext = extractelement <16 x i8> %0, i32 2
410   ret i8 %vecext
411 ; CHECK-LABEL: @getuc2
412 ; CHECK: mfvsrd 3, 34
413 ; CHECK: rldicl 3, 3, 24, 56
414 ; CHECK: clrldi   3, 3, 56
415 ; CHECK-LE-LABEL: @getuc2
416 ; CHECK-LE: mfvsrd 3,
417 ; CHECK-LE: rldicl 3, 3, 48, 56
418 ; CHECK-LE: clrldi   3, 3, 56
419 }
420
421 ; Function Attrs: nounwind
422 define zeroext i8 @getuc3(<16 x i8> %vuc) {
423 entry:
424   %vuc.addr = alloca <16 x i8>, align 16
425   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
426   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
427   %vecext = extractelement <16 x i8> %0, i32 3
428   ret i8 %vecext
429 ; CHECK-LABEL: @getuc3
430 ; CHECK: mfvsrd 3, 34
431 ; CHECK: rldicl 3, 3, 32, 56
432 ; CHECK: clrldi   3, 3, 56
433 ; CHECK-LE-LABEL: @getuc3
434 ; CHECK-LE: mfvsrd 3,
435 ; CHECK-LE: rldicl 3, 3, 40, 56
436 ; CHECK-LE: clrldi   3, 3, 56
437 }
438
439 ; Function Attrs: nounwind
440 define zeroext i8 @getuc4(<16 x i8> %vuc) {
441 entry:
442   %vuc.addr = alloca <16 x i8>, align 16
443   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
444   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
445   %vecext = extractelement <16 x i8> %0, i32 4
446   ret i8 %vecext
447 ; CHECK-LABEL: @getuc4
448 ; CHECK: mfvsrd 3, 34
449 ; CHECK: rldicl 3, 3, 40, 56
450 ; CHECK: clrldi   3, 3, 56
451 ; CHECK-LE-LABEL: @getuc4
452 ; CHECK-LE: mfvsrd 3,
453 ; CHECK-LE: rldicl 3, 3, 32, 56
454 ; CHECK-LE: clrldi   3, 3, 56
455 }
456
457 ; Function Attrs: nounwind
458 define zeroext i8 @getuc5(<16 x i8> %vuc) {
459 entry:
460   %vuc.addr = alloca <16 x i8>, align 16
461   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
462   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
463   %vecext = extractelement <16 x i8> %0, i32 5
464   ret i8 %vecext
465 ; CHECK-LABEL: @getuc5
466 ; CHECK: mfvsrd 3, 34
467 ; CHECK: rldicl 3, 3, 48, 56
468 ; CHECK: clrldi   3, 3, 56
469 ; CHECK-LE-LABEL: @getuc5
470 ; CHECK-LE: mfvsrd 3,
471 ; CHECK-LE: rldicl 3, 3, 24, 56
472 ; CHECK-LE: clrldi   3, 3, 56
473 }
474
475 ; Function Attrs: nounwind
476 define zeroext i8 @getuc6(<16 x i8> %vuc) {
477 entry:
478   %vuc.addr = alloca <16 x i8>, align 16
479   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
480   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
481   %vecext = extractelement <16 x i8> %0, i32 6
482   ret i8 %vecext
483 ; CHECK-LABEL: @getuc6
484 ; CHECK: mfvsrd 3, 34
485 ; CHECK: rldicl 3, 3, 56, 56
486 ; CHECK: clrldi   3, 3, 56
487 ; CHECK-LE-LABEL: @getuc6
488 ; CHECK-LE: mfvsrd 3,
489 ; CHECK-LE: rldicl 3, 3, 16, 56
490 ; CHECK-LE: clrldi   3, 3, 56
491 }
492
493 ; Function Attrs: nounwind
494 define zeroext i8 @getuc7(<16 x i8> %vuc) {
495 entry:
496   %vuc.addr = alloca <16 x i8>, align 16
497   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
498   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
499   %vecext = extractelement <16 x i8> %0, i32 7
500   ret i8 %vecext
501 ; CHECK-LABEL: @getuc7
502 ; CHECK: mfvsrd 3, 34
503 ; CHECK: clrldi   3, 3, 56
504 ; CHECK-LE-LABEL: @getuc7
505 ; CHECK-LE: mfvsrd 3,
506 ; CHECK-LE: rldicl 3, 3, 8, 56
507 ; CHECK-LE: clrldi   3, 3, 56
508 }
509
510 ; Function Attrs: nounwind
511 define zeroext i8 @getuc8(<16 x i8> %vuc) {
512 entry:
513   %vuc.addr = alloca <16 x i8>, align 16
514   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
515   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
516   %vecext = extractelement <16 x i8> %0, i32 8
517   ret i8 %vecext
518 ; CHECK-LABEL: @getuc8
519 ; CHECK: mfvsrd 3,
520 ; CHECK: rldicl 3, 3, 8, 56
521 ; CHECK: clrldi   3, 3, 56
522 ; CHECK-LE-LABEL: @getuc8
523 ; CHECK-LE: mfvsrd 3, 34
524 ; CHECK-LE: clrldi   3, 3, 56
525 }
526
527 ; Function Attrs: nounwind
528 define zeroext i8 @getuc9(<16 x i8> %vuc) {
529 entry:
530   %vuc.addr = alloca <16 x i8>, align 16
531   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
532   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
533   %vecext = extractelement <16 x i8> %0, i32 9
534   ret i8 %vecext
535 ; CHECK-LABEL: @getuc9
536 ; CHECK: mfvsrd 3,
537 ; CHECK: rldicl 3, 3, 16, 56
538 ; CHECK: clrldi   3, 3, 56
539 ; CHECK-LE-LABEL: @getuc9
540 ; CHECK-LE: mfvsrd 3, 34
541 ; CHECK-LE: rldicl 3, 3, 56, 56
542 ; CHECK-LE: clrldi   3, 3, 56
543 }
544
545 ; Function Attrs: nounwind
546 define zeroext i8 @getuc10(<16 x i8> %vuc) {
547 entry:
548   %vuc.addr = alloca <16 x i8>, align 16
549   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
550   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
551   %vecext = extractelement <16 x i8> %0, i32 10
552   ret i8 %vecext
553 ; CHECK-LABEL: @getuc10
554 ; CHECK: mfvsrd 3,
555 ; CHECK: rldicl 3, 3, 24, 56
556 ; CHECK: clrldi   3, 3, 56
557 ; CHECK-LE-LABEL: @getuc10
558 ; CHECK-LE: mfvsrd 3, 34
559 ; CHECK-LE: rldicl 3, 3, 48, 56
560 ; CHECK-LE: clrldi   3, 3, 56
561 }
562
563 ; Function Attrs: nounwind
564 define zeroext i8 @getuc11(<16 x i8> %vuc) {
565 entry:
566   %vuc.addr = alloca <16 x i8>, align 16
567   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
568   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
569   %vecext = extractelement <16 x i8> %0, i32 11
570   ret i8 %vecext
571 ; CHECK-LABEL: @getuc11
572 ; CHECK: mfvsrd 3,
573 ; CHECK: rldicl 3, 3, 32, 56
574 ; CHECK: clrldi   3, 3, 56
575 ; CHECK-LE-LABEL: @getuc11
576 ; CHECK-LE: mfvsrd 3, 34
577 ; CHECK-LE: rldicl 3, 3, 40, 56
578 ; CHECK-LE: clrldi   3, 3, 56
579 }
580
581 ; Function Attrs: nounwind
582 define zeroext i8 @getuc12(<16 x i8> %vuc) {
583 entry:
584   %vuc.addr = alloca <16 x i8>, align 16
585   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
586   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
587   %vecext = extractelement <16 x i8> %0, i32 12
588   ret i8 %vecext
589 ; CHECK-LABEL: @getuc12
590 ; CHECK: mfvsrd 3,
591 ; CHECK: rldicl 3, 3, 40, 56
592 ; CHECK: clrldi   3, 3, 56
593 ; CHECK-LE-LABEL: @getuc12
594 ; CHECK-LE: mfvsrd 3, 34
595 ; CHECK-LE: rldicl 3, 3, 32, 56
596 ; CHECK-LE: clrldi   3, 3, 56
597 }
598
599 ; Function Attrs: nounwind
600 define zeroext i8 @getuc13(<16 x i8> %vuc) {
601 entry:
602   %vuc.addr = alloca <16 x i8>, align 16
603   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
604   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
605   %vecext = extractelement <16 x i8> %0, i32 13
606   ret i8 %vecext
607 ; CHECK-LABEL: @getuc13
608 ; CHECK: mfvsrd 3,
609 ; CHECK: rldicl 3, 3, 48, 56
610 ; CHECK: clrldi   3, 3, 56
611 ; CHECK-LE-LABEL: @getuc13
612 ; CHECK-LE: mfvsrd 3, 34
613 ; CHECK-LE: rldicl 3, 3, 24, 56
614 ; CHECK-LE: clrldi   3, 3, 56
615 }
616
617 ; Function Attrs: nounwind
618 define zeroext i8 @getuc14(<16 x i8> %vuc) {
619 entry:
620   %vuc.addr = alloca <16 x i8>, align 16
621   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
622   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
623   %vecext = extractelement <16 x i8> %0, i32 14
624   ret i8 %vecext
625 ; CHECK-LABEL: @getuc14
626 ; CHECK: mfvsrd 3,
627 ; CHECK: rldicl 3, 3, 56, 56
628 ; CHECK: clrldi   3, 3, 56
629 ; CHECK-LE-LABEL: @getuc14
630 ; CHECK-LE: mfvsrd 3, 34
631 ; CHECK-LE: rldicl 3, 3, 16, 56
632 ; CHECK-LE: clrldi   3, 3, 56
633 }
634
635 ; Function Attrs: nounwind
636 define zeroext i8 @getuc15(<16 x i8> %vuc) {
637 entry:
638   %vuc.addr = alloca <16 x i8>, align 16
639   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
640   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
641   %vecext = extractelement <16 x i8> %0, i32 15
642   ret i8 %vecext
643 ; CHECK-LABEL: @getuc15
644 ; CHECK: mfvsrd 3,
645 ; CHECK: clrldi   3, 3, 56
646 ; CHECK-LE-LABEL: @getuc15
647 ; CHECK-LE: mfvsrd 3, 34
648 ; CHECK-LE: rldicl 3, 3, 8, 56
649 ; CHECK-LE: clrldi   3, 3, 56
650 }
651
652 ; Function Attrs: nounwind
653 define signext i8 @getvelsc(<16 x i8> %vsc, i32 signext %i) {
654 entry:
655   %vsc.addr = alloca <16 x i8>, align 16
656   %i.addr = alloca i32, align 4
657   store <16 x i8> %vsc, <16 x i8>* %vsc.addr, align 16
658   store i32 %i, i32* %i.addr, align 4
659   %0 = load <16 x i8>, <16 x i8>* %vsc.addr, align 16
660   %1 = load i32, i32* %i.addr, align 4
661   %vecext = extractelement <16 x i8> %0, i32 %1
662   ret i8 %vecext
663 ; CHECK-LABEL: @getvelsc
664 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 8
665 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[ANDI]]
666 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
667 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
668 ; CHECK-DAG: li [[IMM7:[0-9]+]], 7
669 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM7]]
670 ; CHECK-DAG: sldi [[SHL:[0-9]+]], [[ANDC]], 3
671 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
672 ; CHECK-DAG: extsb 3, 3
673 ; CHECK-LE-LABEL: @getvelsc
674 ; CHECK-DAG-LE: li [[IMM8:[0-9]+]], 8
675 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM8]]
676 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[ANDC]]
677 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
678 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
679 ; CHECK-DAG-LE: li [[IMM7:[0-9]+]], 7
680 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM7]]
681 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 3
682 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
683 ; CHECK-DAG-LE: extsb 3, 3
684 }
685
686 ; Function Attrs: nounwind
687 define zeroext i8 @getveluc(<16 x i8> %vuc, i32 signext %i) {
688 entry:
689   %vuc.addr = alloca <16 x i8>, align 16
690   %i.addr = alloca i32, align 4
691   store <16 x i8> %vuc, <16 x i8>* %vuc.addr, align 16
692   store i32 %i, i32* %i.addr, align 4
693   %0 = load <16 x i8>, <16 x i8>* %vuc.addr, align 16
694   %1 = load i32, i32* %i.addr, align 4
695   %vecext = extractelement <16 x i8> %0, i32 %1
696   ret i8 %vecext
697 ; CHECK-LABEL: @getveluc
698 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 8
699 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[ANDI]]
700 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
701 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
702 ; CHECK-DAG: li [[IMM7:[0-9]+]], 7
703 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM7]]
704 ; CHECK-DAG: sldi [[SHL:[0-9]+]], [[ANDC]], 3
705 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
706 ; CHECK-DAG: clrldi   3, 3, 56
707 ; CHECK-LE-LABEL: @getveluc
708 ; CHECK-DAG-LE: li [[IMM8:[0-9]+]], 8
709 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM8]]
710 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[ANDC]]
711 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
712 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
713 ; CHECK-DAG-LE: li [[IMM7:[0-9]+]], 7
714 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM7]]
715 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 3
716 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
717 ; CHECK-DAG-LE: clrldi   3, 3, 56
718 }
719
720 ; Function Attrs: nounwind
721 define signext i16 @getss0(<8 x i16> %vss) {
722 entry:
723   %vss.addr = alloca <8 x i16>, align 16
724   store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
725   %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
726   %vecext = extractelement <8 x i16> %0, i32 0
727   ret i16 %vecext
728 ; CHECK-LABEL: @getss0
729 ; CHECK: mfvsrd 3, 34
730 ; CHECK: rldicl 3, 3, 16, 48
731 ; CHECK: extsh 3, 3
732 ; CHECK-LE-LABEL: @getss0
733 ; CHECK-LE: mfvsrd 3,
734 ; CHECK-LE: clrldi 3, 3, 48
735 ; CHECK-LE: extsh 3, 3
736 }
737
738 ; Function Attrs: nounwind
739 define signext i16 @getss1(<8 x i16> %vss) {
740 entry:
741   %vss.addr = alloca <8 x i16>, align 16
742   store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
743   %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
744   %vecext = extractelement <8 x i16> %0, i32 1
745   ret i16 %vecext
746 ; CHECK-LABEL: @getss1
747 ; CHECK: mfvsrd 3, 34
748 ; CHECK: rldicl 3, 3, 32, 48
749 ; CHECK: extsh 3, 3
750 ; CHECK-LE-LABEL: @getss1
751 ; CHECK-LE: mfvsrd 3,
752 ; CHECK-LE: rldicl 3, 3, 48, 48
753 ; CHECK-LE: extsh 3, 3
754 }
755
756 ; Function Attrs: nounwind
757 define signext i16 @getss2(<8 x i16> %vss) {
758 entry:
759   %vss.addr = alloca <8 x i16>, align 16
760   store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
761   %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
762   %vecext = extractelement <8 x i16> %0, i32 2
763   ret i16 %vecext
764 ; CHECK-LABEL: @getss2
765 ; CHECK: mfvsrd 3, 34
766 ; CHECK: rldicl 3, 3, 48, 48
767 ; CHECK: extsh 3, 3
768 ; CHECK-LE-LABEL: @getss2
769 ; CHECK-LE: mfvsrd 3,
770 ; CHECK-LE: rldicl 3, 3, 32, 48
771 ; CHECK-LE: extsh 3, 3
772 }
773
774 ; Function Attrs: nounwind
775 define signext i16 @getss3(<8 x i16> %vss) {
776 entry:
777   %vss.addr = alloca <8 x i16>, align 16
778   store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
779   %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
780   %vecext = extractelement <8 x i16> %0, i32 3
781   ret i16 %vecext
782 ; CHECK-LABEL: @getss3
783 ; CHECK: mfvsrd 3, 34
784 ; CHECK: clrldi 3, 3, 48
785 ; CHECK: extsh 3, 3
786 ; CHECK-LE-LABEL: @getss3
787 ; CHECK-LE: mfvsrd 3,
788 ; CHECK-LE: rldicl 3, 3, 16, 48
789 ; CHECK-LE: extsh 3, 3
790 }
791
792 ; Function Attrs: nounwind
793 define signext i16 @getss4(<8 x i16> %vss) {
794 entry:
795   %vss.addr = alloca <8 x i16>, align 16
796   store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
797   %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
798   %vecext = extractelement <8 x i16> %0, i32 4
799   ret i16 %vecext
800 ; CHECK-LABEL: @getss4
801 ; CHECK: mfvsrd 3,
802 ; CHECK: rldicl 3, 3, 16, 48
803 ; CHECK: extsh 3, 3
804 ; CHECK-LE-LABEL: @getss4
805 ; CHECK-LE: mfvsrd 3, 34
806 ; CHECK-LE: clrldi 3, 3, 48
807 ; CHECK-LE: extsh 3, 3
808 }
809
810 ; Function Attrs: nounwind
811 define signext i16 @getss5(<8 x i16> %vss) {
812 entry:
813   %vss.addr = alloca <8 x i16>, align 16
814   store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
815   %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
816   %vecext = extractelement <8 x i16> %0, i32 5
817   ret i16 %vecext
818 ; CHECK-LABEL: @getss5
819 ; CHECK: mfvsrd 3,
820 ; CHECK: rldicl 3, 3, 32, 48
821 ; CHECK: extsh 3, 3
822 ; CHECK-LE-LABEL: @getss5
823 ; CHECK-LE: mfvsrd 3, 34
824 ; CHECK-LE: rldicl 3, 3, 48, 48
825 ; CHECK-LE: extsh 3, 3
826 }
827
828 ; Function Attrs: nounwind
829 define signext i16 @getss6(<8 x i16> %vss) {
830 entry:
831   %vss.addr = alloca <8 x i16>, align 16
832   store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
833   %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
834   %vecext = extractelement <8 x i16> %0, i32 6
835   ret i16 %vecext
836 ; CHECK-LABEL: @getss6
837 ; CHECK: mfvsrd 3,
838 ; CHECK: rldicl 3, 3, 48, 48
839 ; CHECK: extsh 3, 3
840 ; CHECK-LE-LABEL: @getss6
841 ; CHECK-LE: mfvsrd 3, 34
842 ; CHECK-LE: rldicl 3, 3, 32, 48
843 ; CHECK-LE: extsh 3, 3
844 }
845
846 ; Function Attrs: nounwind
847 define signext i16 @getss7(<8 x i16> %vss) {
848 entry:
849   %vss.addr = alloca <8 x i16>, align 16
850   store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
851   %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
852   %vecext = extractelement <8 x i16> %0, i32 7
853   ret i16 %vecext
854 ; CHECK-LABEL: @getss7
855 ; CHECK: mfvsrd 3,
856 ; CHECK: extsh 3, 3
857 ; CHECK-LE-LABEL: @getss7
858 ; CHECK-LE: mfvsrd 3, 34
859 ; CHECK-LE: rldicl 3, 3, 16, 48
860 ; CHECK-LE: extsh 3, 3
861 }
862
863 ; Function Attrs: nounwind
864 define zeroext i16 @getus0(<8 x i16> %vus) {
865 entry:
866   %vus.addr = alloca <8 x i16>, align 16
867   store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
868   %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
869   %vecext = extractelement <8 x i16> %0, i32 0
870   ret i16 %vecext
871 ; CHECK-LABEL: @getus0
872 ; CHECK: mfvsrd 3, 34
873 ; CHECK: rldicl 3, 3, 16, 48
874 ; CHECK: clrldi   3, 3, 48
875 ; CHECK-LE-LABEL: @getus0
876 ; CHECK-LE: mfvsrd 3,
877 ; CHECK-LE: clrldi   3, 3, 48
878 }
879
880 ; Function Attrs: nounwind
881 define zeroext i16 @getus1(<8 x i16> %vus) {
882 entry:
883   %vus.addr = alloca <8 x i16>, align 16
884   store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
885   %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
886   %vecext = extractelement <8 x i16> %0, i32 1
887   ret i16 %vecext
888 ; CHECK-LABEL: @getus1
889 ; CHECK: mfvsrd 3, 34
890 ; CHECK: rldicl 3, 3, 32, 48
891 ; CHECK: clrldi   3, 3, 48
892 ; CHECK-LE-LABEL: @getus1
893 ; CHECK-LE: mfvsrd 3,
894 ; CHECK-LE: rldicl 3, 3, 48, 48
895 ; CHECK-LE: clrldi   3, 3, 48
896 }
897
898 ; Function Attrs: nounwind
899 define zeroext i16 @getus2(<8 x i16> %vus) {
900 entry:
901   %vus.addr = alloca <8 x i16>, align 16
902   store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
903   %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
904   %vecext = extractelement <8 x i16> %0, i32 2
905   ret i16 %vecext
906 ; CHECK-LABEL: @getus2
907 ; CHECK: mfvsrd 3, 34
908 ; CHECK: rldicl 3, 3, 48, 48
909 ; CHECK: clrldi   3, 3, 48
910 ; CHECK-LE-LABEL: @getus2
911 ; CHECK-LE: mfvsrd 3,
912 ; CHECK-LE: rldicl 3, 3, 32, 48
913 ; CHECK-LE: clrldi   3, 3, 48
914 }
915
916 ; Function Attrs: nounwind
917 define zeroext i16 @getus3(<8 x i16> %vus) {
918 entry:
919   %vus.addr = alloca <8 x i16>, align 16
920   store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
921   %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
922   %vecext = extractelement <8 x i16> %0, i32 3
923   ret i16 %vecext
924 ; CHECK-LABEL: @getus3
925 ; CHECK: mfvsrd 3, 34
926 ; CHECK: clrldi   3, 3, 48
927 ; CHECK-LE-LABEL: @getus3
928 ; CHECK-LE: mfvsrd 3,
929 ; CHECK-LE: rldicl 3, 3, 16, 48
930 ; CHECK-LE: clrldi   3, 3, 48
931 }
932
933 ; Function Attrs: nounwind
934 define zeroext i16 @getus4(<8 x i16> %vus) {
935 entry:
936   %vus.addr = alloca <8 x i16>, align 16
937   store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
938   %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
939   %vecext = extractelement <8 x i16> %0, i32 4
940   ret i16 %vecext
941 ; CHECK-LABEL: @getus4
942 ; CHECK: mfvsrd 3,
943 ; CHECK: rldicl 3, 3, 16, 48
944 ; CHECK: clrldi   3, 3, 48
945 ; CHECK-LE-LABEL: @getus4
946 ; CHECK-LE: mfvsrd 3, 34
947 ; CHECK-LE: clrldi   3, 3, 48
948 }
949
950 ; Function Attrs: nounwind
951 define zeroext i16 @getus5(<8 x i16> %vus) {
952 entry:
953   %vus.addr = alloca <8 x i16>, align 16
954   store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
955   %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
956   %vecext = extractelement <8 x i16> %0, i32 5
957   ret i16 %vecext
958 ; CHECK-LABEL: @getus5
959 ; CHECK: mfvsrd 3,
960 ; CHECK: rldicl 3, 3, 32, 48
961 ; CHECK: clrldi   3, 3, 48
962 ; CHECK-LE-LABEL: @getus5
963 ; CHECK-LE: mfvsrd 3, 34
964 ; CHECK-LE: rldicl 3, 3, 48, 48
965 ; CHECK-LE: clrldi   3, 3, 48
966 }
967
968 ; Function Attrs: nounwind
969 define zeroext i16 @getus6(<8 x i16> %vus) {
970 entry:
971   %vus.addr = alloca <8 x i16>, align 16
972   store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
973   %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
974   %vecext = extractelement <8 x i16> %0, i32 6
975   ret i16 %vecext
976 ; CHECK-LABEL: @getus6
977 ; CHECK: mfvsrd 3,
978 ; CHECK: rldicl 3, 3, 48, 48
979 ; CHECK: clrldi   3, 3, 48
980 ; CHECK-LE-LABEL: @getus6
981 ; CHECK-LE: mfvsrd 3, 34
982 ; CHECK-LE: rldicl 3, 3, 32, 48
983 ; CHECK-LE: clrldi   3, 3, 48
984 }
985
986 ; Function Attrs: nounwind
987 define zeroext i16 @getus7(<8 x i16> %vus) {
988 entry:
989   %vus.addr = alloca <8 x i16>, align 16
990   store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
991   %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
992   %vecext = extractelement <8 x i16> %0, i32 7
993   ret i16 %vecext
994 ; CHECK-LABEL: @getus7
995 ; CHECK: mfvsrd 3,
996 ; CHECK: clrldi   3, 3, 48
997 ; CHECK-LE-LABEL: @getus7
998 ; CHECK-LE: mfvsrd 3, 34
999 ; CHECK-LE: rldicl 3, 3, 16, 48
1000 ; CHECK-LE: clrldi   3, 3, 48
1001 }
1002
1003 ; Function Attrs: nounwind
1004 define signext i16 @getvelss(<8 x i16> %vss, i32 signext %i) {
1005 entry:
1006   %vss.addr = alloca <8 x i16>, align 16
1007   %i.addr = alloca i32, align 4
1008   store <8 x i16> %vss, <8 x i16>* %vss.addr, align 16
1009   store i32 %i, i32* %i.addr, align 4
1010   %0 = load <8 x i16>, <8 x i16>* %vss.addr, align 16
1011   %1 = load i32, i32* %i.addr, align 4
1012   %vecext = extractelement <8 x i16> %0, i32 %1
1013   ret i16 %vecext
1014 ; CHECK-LABEL: @getvelss
1015 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 4
1016 ; CHECK-DAG: sldi [[MUL2:[0-9]+]], [[ANDI]], 1
1017 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
1018 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
1019 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
1020 ; CHECK-DAG: li [[IMM3:[0-9]+]], 3
1021 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM3]]
1022 ; CHECK-DAG: rldicr [[SHL:[0-9]+]], [[ANDC]], 4, 60
1023 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
1024 ; CHECK-DAG: extsh 3, 3
1025 ; CHECK-LE-LABEL: @getvelss
1026 ; CHECK-DAG-LE: li [[IMM4:[0-9]+]], 4
1027 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM4]]
1028 ; CHECK-DAG-LE: sldi [[MUL2:[0-9]+]], [[ANDC]], 1
1029 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
1030 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
1031 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
1032 ; CHECK-DAG-LE: li [[IMM3:[0-9]+]], 3
1033 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM3]]
1034 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 4
1035 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
1036 ; CHECK-DAG-LE: extsh 3, 3
1037 }
1038
1039 ; Function Attrs: nounwind
1040 define zeroext i16 @getvelus(<8 x i16> %vus, i32 signext %i) {
1041 entry:
1042   %vus.addr = alloca <8 x i16>, align 16
1043   %i.addr = alloca i32, align 4
1044   store <8 x i16> %vus, <8 x i16>* %vus.addr, align 16
1045   store i32 %i, i32* %i.addr, align 4
1046   %0 = load <8 x i16>, <8 x i16>* %vus.addr, align 16
1047   %1 = load i32, i32* %i.addr, align 4
1048   %vecext = extractelement <8 x i16> %0, i32 %1
1049   ret i16 %vecext
1050 ; CHECK-LABEL: @getvelus
1051 ; CHECK-DAG: andi. [[ANDI:[0-9]+]], {{[0-9]+}}, 4
1052 ; CHECK-DAG: sldi [[MUL2:[0-9]+]], [[ANDI]], 1
1053 ; CHECK-DAG: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
1054 ; CHECK-DAG: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
1055 ; CHECK-DAG: mfvsrd [[MOV:[0-9]+]],
1056 ; CHECK-DAG: li [[IMM3:[0-9]+]], 3
1057 ; CHECK-DAG: andc [[ANDC:[0-9]+]], [[IMM3]]
1058 ; CHECK-DAG: rldicr [[SHL:[0-9]+]], [[ANDC]], 4, 60
1059 ; CHECK-DAG: srd 3, [[MOV]], [[SHL]]
1060 ; CHECK-DAG: clrldi   3, 3, 48
1061 ; CHECK-LE-LABEL: @getvelus
1062 ; CHECK-DAG-LE: li [[IMM4:[0-9]+]], 4
1063 ; CHECK-DAG-LE: andc [[ANDC:[0-9]+]], [[IMM4]]
1064 ; CHECK-DAG-LE: sldi [[MUL2:[0-9]+]], [[ANDC]], 1
1065 ; CHECK-DAG-LE: lvsl [[SHMSK:[0-9]+]], 0, [[MUL2]]
1066 ; CHECK-DAG-LE: vperm [[PERMD:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, [[SHMSK]]
1067 ; CHECK-DAG-LE: mfvsrd [[MOV:[0-9]+]],
1068 ; CHECK-DAG-LE: li [[IMM3:[0-9]+]], 3
1069 ; CHECK-DAG-LE: and [[AND:[0-9]+]], [[IMM3]]
1070 ; CHECK-DAG-LE: sldi [[SHL:[0-9]+]], [[AND]], 4
1071 ; CHECK-DAG-LE: srd 3, [[MOV]], [[SHL]]
1072 ; CHECK-DAG-LE: clrldi   3, 3, 48
1073 }
1074
1075 ; Function Attrs: nounwind
1076 define signext i32 @getsi0(<4 x i32> %vsi) {
1077 entry:
1078   %vsi.addr = alloca <4 x i32>, align 16
1079   store <4 x i32> %vsi, <4 x i32>* %vsi.addr, align 16
1080   %0 = load <4 x i32>, <4 x i32>* %vsi.addr, align 16
1081   %vecext = extractelement <4 x i32> %0, i32 0
1082   ret i32 %vecext
1083 ; CHECK-LABEL: @getsi0
1084 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1085 ; CHECK: mfvsrwz 3, [[SHL]]
1086 ; CHECK: extsw 3, 3
1087 ; CHECK-LE-LABEL: @getsi0
1088 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1089 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1090 ; CHECK-LE: extsw 3, 3
1091 }
1092
1093 ; Function Attrs: nounwind
1094 define signext i32 @getsi1(<4 x i32> %vsi) {
1095 entry:
1096   %vsi.addr = alloca <4 x i32>, align 16
1097   store <4 x i32> %vsi, <4 x i32>* %vsi.addr, align 16
1098   %0 = load <4 x i32>, <4 x i32>* %vsi.addr, align 16
1099   %vecext = extractelement <4 x i32> %0, i32 1
1100   ret i32 %vecext
1101 ; CHECK-LABEL: @getsi1
1102 ; CHECK: mfvsrwz 3, 34
1103 ; CHECK: extsw 3, 3
1104 ; CHECK-LE-LABEL: @getsi1
1105 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1106 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1107 ; CHECK-LE: extsw 3, 3
1108 }
1109
1110 ; Function Attrs: nounwind
1111 define signext i32 @getsi2(<4 x i32> %vsi) {
1112 entry:
1113   %vsi.addr = alloca <4 x i32>, align 16
1114   store <4 x i32> %vsi, <4 x i32>* %vsi.addr, align 16
1115   %0 = load <4 x i32>, <4 x i32>* %vsi.addr, align 16
1116   %vecext = extractelement <4 x i32> %0, i32 2
1117   ret i32 %vecext
1118 ; CHECK-LABEL: @getsi2
1119 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1120 ; CHECK: mfvsrwz 3, [[SHL]]
1121 ; CHECK: extsw 3, 3
1122 ; CHECK-LE-LABEL: @getsi2
1123 ; CHECK-LE: mfvsrwz 3, 34
1124 ; CHECK-LE: extsw 3, 3
1125 }
1126
1127 ; Function Attrs: nounwind
1128 define signext i32 @getsi3(<4 x i32> %vsi) {
1129 entry:
1130   %vsi.addr = alloca <4 x i32>, align 16
1131   store <4 x i32> %vsi, <4 x i32>* %vsi.addr, align 16
1132   %0 = load <4 x i32>, <4 x i32>* %vsi.addr, align 16
1133   %vecext = extractelement <4 x i32> %0, i32 3
1134   ret i32 %vecext
1135 ; CHECK-LABEL: @getsi3
1136 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1137 ; CHECK: mfvsrwz 3, [[SHL]]
1138 ; CHECK: extsw 3, 3
1139 ; CHECK-LE-LABEL: @getsi3
1140 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1141 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1142 ; CHECK-LE: extsw 3, 3
1143 }
1144
1145 ; Function Attrs: nounwind
1146 define zeroext i32 @getui0(<4 x i32> %vui) {
1147 entry:
1148   %vui.addr = alloca <4 x i32>, align 16
1149   store <4 x i32> %vui, <4 x i32>* %vui.addr, align 16
1150   %0 = load <4 x i32>, <4 x i32>* %vui.addr, align 16
1151   %vecext = extractelement <4 x i32> %0, i32 0
1152   ret i32 %vecext
1153 ; CHECK-LABEL: @getui0
1154 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1155 ; CHECK: mfvsrwz 3, [[SHL]]
1156 ; CHECK: clrldi   3, 3, 32
1157 ; CHECK-LE-LABEL: @getui0
1158 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1159 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1160 ; CHECK-LE: clrldi   3, 3, 32
1161 }
1162
1163 ; Function Attrs: nounwind
1164 define zeroext i32 @getui1(<4 x i32> %vui) {
1165 entry:
1166   %vui.addr = alloca <4 x i32>, align 16
1167   store <4 x i32> %vui, <4 x i32>* %vui.addr, align 16
1168   %0 = load <4 x i32>, <4 x i32>* %vui.addr, align 16
1169   %vecext = extractelement <4 x i32> %0, i32 1
1170   ret i32 %vecext
1171 ; CHECK-LABEL: @getui1
1172 ; CHECK: mfvsrwz 3, 34
1173 ; CHECK: clrldi   3, 3, 32
1174 ; CHECK-LE-LABEL: @getui1
1175 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1176 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1177 ; CHECK-LE: clrldi   3, 3, 32
1178 }
1179
1180 ; Function Attrs: nounwind
1181 define zeroext i32 @getui2(<4 x i32> %vui) {
1182 entry:
1183   %vui.addr = alloca <4 x i32>, align 16
1184   store <4 x i32> %vui, <4 x i32>* %vui.addr, align 16
1185   %0 = load <4 x i32>, <4 x i32>* %vui.addr, align 16
1186   %vecext = extractelement <4 x i32> %0, i32 2
1187   ret i32 %vecext
1188 ; CHECK-LABEL: @getui2
1189 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1190 ; CHECK: mfvsrwz 3, [[SHL]]
1191 ; CHECK: clrldi   3, 3, 32
1192 ; CHECK-LE-LABEL: @getui2
1193 ; CHECK-LE: mfvsrwz 3, 34
1194 ; CHECK-LE: clrldi   3, 3, 32
1195 }
1196
1197 ; Function Attrs: nounwind
1198 define zeroext i32 @getui3(<4 x i32> %vui) {
1199 entry:
1200   %vui.addr = alloca <4 x i32>, align 16
1201   store <4 x i32> %vui, <4 x i32>* %vui.addr, align 16
1202   %0 = load <4 x i32>, <4 x i32>* %vui.addr, align 16
1203   %vecext = extractelement <4 x i32> %0, i32 3
1204   ret i32 %vecext
1205 ; CHECK-LABEL: @getui3
1206 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1207 ; CHECK: mfvsrwz 3, [[SHL]]
1208 ; CHECK: clrldi   3, 3, 32
1209 ; CHECK-LE-LABEL: @getui3
1210 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1211 ; CHECK-LE: mfvsrwz 3, [[SHL]]
1212 ; CHECK-LE: clrldi   3, 3, 32
1213 }
1214
1215 ; Function Attrs: nounwind
1216 define signext i32 @getvelsi(<4 x i32> %vsi, i32 signext %i) {
1217 entry:
1218   %vsi.addr = alloca <4 x i32>, align 16
1219   %i.addr = alloca i32, align 4
1220   store <4 x i32> %vsi, <4 x i32>* %vsi.addr, align 16
1221   store i32 %i, i32* %i.addr, align 4
1222   %0 = load <4 x i32>, <4 x i32>* %vsi.addr, align 16
1223   %1 = load i32, i32* %i.addr, align 4
1224   %vecext = extractelement <4 x i32> %0, i32 %1
1225   ret i32 %vecext
1226 ; CHECK-LABEL: @getvelsi
1227 ; CHECK-LE-LABEL: @getvelsi
1228 ; FIXME: add check patterns when variable element extraction is implemented
1229 }
1230
1231 ; Function Attrs: nounwind
1232 define zeroext i32 @getvelui(<4 x i32> %vui, i32 signext %i) {
1233 entry:
1234   %vui.addr = alloca <4 x i32>, align 16
1235   %i.addr = alloca i32, align 4
1236   store <4 x i32> %vui, <4 x i32>* %vui.addr, align 16
1237   store i32 %i, i32* %i.addr, align 4
1238   %0 = load <4 x i32>, <4 x i32>* %vui.addr, align 16
1239   %1 = load i32, i32* %i.addr, align 4
1240   %vecext = extractelement <4 x i32> %0, i32 %1
1241   ret i32 %vecext
1242 ; CHECK-LABEL: @getvelui
1243 ; CHECK-LE-LABEL: @getvelui
1244 ; FIXME: add check patterns when variable element extraction is implemented
1245 }
1246
1247 ; Function Attrs: nounwind
1248 define i64 @getsl0(<2 x i64> %vsl) {
1249 entry:
1250   %vsl.addr = alloca <2 x i64>, align 16
1251   store <2 x i64> %vsl, <2 x i64>* %vsl.addr, align 16
1252   %0 = load <2 x i64>, <2 x i64>* %vsl.addr, align 16
1253   %vecext = extractelement <2 x i64> %0, i32 0
1254   ret i64 %vecext
1255 ; CHECK-LABEL: @getsl0
1256 ; CHECK: mfvsrd 3, 34
1257 ; CHECK-LE-LABEL: @getsl0
1258 ; CHECK-LE: xxswapd  [[SWP:[0-9]+]], 34
1259 ; CHECK-LE: mfvsrd 3, [[SWP]]
1260 }
1261
1262 ; Function Attrs: nounwind
1263 define i64 @getsl1(<2 x i64> %vsl) {
1264 entry:
1265   %vsl.addr = alloca <2 x i64>, align 16
1266   store <2 x i64> %vsl, <2 x i64>* %vsl.addr, align 16
1267   %0 = load <2 x i64>, <2 x i64>* %vsl.addr, align 16
1268   %vecext = extractelement <2 x i64> %0, i32 1
1269   ret i64 %vecext
1270 ; CHECK-LABEL: @getsl1
1271 ; CHECK: xxswapd  [[SWP:[0-9]+]], 34
1272 ; CHECK: mfvsrd 3, [[SWP]]
1273 ; CHECK-LE-LABEL: @getsl1
1274 ; CHECK-LE: mfvsrd 3, 34
1275 }
1276
1277 ; Function Attrs: nounwind
1278 define i64 @getul0(<2 x i64> %vul) {
1279 entry:
1280   %vul.addr = alloca <2 x i64>, align 16
1281   store <2 x i64> %vul, <2 x i64>* %vul.addr, align 16
1282   %0 = load <2 x i64>, <2 x i64>* %vul.addr, align 16
1283   %vecext = extractelement <2 x i64> %0, i32 0
1284   ret i64 %vecext
1285 ; CHECK-LABEL: @getul0
1286 ; CHECK: mfvsrd 3, 34
1287 ; CHECK-LE-LABEL: @getul0
1288 ; CHECK-LE: xxswapd  [[SWP:[0-9]+]], 34
1289 ; CHECK-LE: mfvsrd 3, [[SWP]]
1290 }
1291
1292 ; Function Attrs: nounwind
1293 define i64 @getul1(<2 x i64> %vul) {
1294 entry:
1295   %vul.addr = alloca <2 x i64>, align 16
1296   store <2 x i64> %vul, <2 x i64>* %vul.addr, align 16
1297   %0 = load <2 x i64>, <2 x i64>* %vul.addr, align 16
1298   %vecext = extractelement <2 x i64> %0, i32 1
1299   ret i64 %vecext
1300 ; CHECK-LABEL: @getul1
1301 ; CHECK: xxswapd  [[SWP:[0-9]+]], 34
1302 ; CHECK: mfvsrd 3, [[SWP]]
1303 ; CHECK-LE-LABEL: @getul1
1304 ; CHECK-LE: mfvsrd 3, 34
1305 }
1306
1307 ; Function Attrs: nounwind
1308 define i64 @getvelsl(<2 x i64> %vsl, i32 signext %i) {
1309 entry:
1310   %vsl.addr = alloca <2 x i64>, align 16
1311   %i.addr = alloca i32, align 4
1312   store <2 x i64> %vsl, <2 x i64>* %vsl.addr, align 16
1313   store i32 %i, i32* %i.addr, align 4
1314   %0 = load <2 x i64>, <2 x i64>* %vsl.addr, align 16
1315   %1 = load i32, i32* %i.addr, align 4
1316   %vecext = extractelement <2 x i64> %0, i32 %1
1317   ret i64 %vecext
1318 ; CHECK-LABEL: @getvelsl
1319 ; CHECK-LE-LABEL: @getvelsl
1320 ; FIXME: add check patterns when variable element extraction is implemented
1321 }
1322
1323 ; Function Attrs: nounwind
1324 define i64 @getvelul(<2 x i64> %vul, i32 signext %i) {
1325 entry:
1326   %vul.addr = alloca <2 x i64>, align 16
1327   %i.addr = alloca i32, align 4
1328   store <2 x i64> %vul, <2 x i64>* %vul.addr, align 16
1329   store i32 %i, i32* %i.addr, align 4
1330   %0 = load <2 x i64>, <2 x i64>* %vul.addr, align 16
1331   %1 = load i32, i32* %i.addr, align 4
1332   %vecext = extractelement <2 x i64> %0, i32 %1
1333   ret i64 %vecext
1334 ; CHECK-LABEL: @getvelul
1335 ; CHECK-LE-LABEL: @getvelul
1336 ; FIXME: add check patterns when variable element extraction is implemented
1337 }
1338
1339 ; Function Attrs: nounwind
1340 define float @getf0(<4 x float> %vf) {
1341 entry:
1342   %vf.addr = alloca <4 x float>, align 16
1343   store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1344   %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1345   %vecext = extractelement <4 x float> %0, i32 0
1346   ret float %vecext
1347 ; CHECK-LABEL: @getf0
1348 ; CHECK: xscvspdpn 1, 34
1349 ; CHECK-LE-LABEL: @getf0
1350 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1351 ; CHECK-LE: xscvspdpn 1, [[SHL]]
1352 }
1353
1354 ; Function Attrs: nounwind
1355 define float @getf1(<4 x float> %vf) {
1356 entry:
1357   %vf.addr = alloca <4 x float>, align 16
1358   store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1359   %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1360   %vecext = extractelement <4 x float> %0, i32 1
1361   ret float %vecext
1362 ; CHECK-LABEL: @getf1
1363 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1364 ; CHECK: xscvspdpn 1, [[SHL]]
1365 ; CHECK-LE-LABEL: @getf1
1366 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1367 ; CHECK-LE: xscvspdpn 1, [[SHL]]
1368 }
1369
1370 ; Function Attrs: nounwind
1371 define float @getf2(<4 x float> %vf) {
1372 entry:
1373   %vf.addr = alloca <4 x float>, align 16
1374   store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1375   %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1376   %vecext = extractelement <4 x float> %0, i32 2
1377   ret float %vecext
1378 ; CHECK-LABEL: @getf2
1379 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 2
1380 ; CHECK: xscvspdpn 1, [[SHL]]
1381 ; CHECK-LE-LABEL: @getf2
1382 ; CHECK-LE: xxsldwi [[SHL:[0-9]+]], 34, 34, 1
1383 ; CHECK-LE: xscvspdpn 1, [[SHL]]
1384 }
1385
1386 ; Function Attrs: nounwind
1387 define float @getf3(<4 x float> %vf) {
1388 entry:
1389   %vf.addr = alloca <4 x float>, align 16
1390   store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1391   %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1392   %vecext = extractelement <4 x float> %0, i32 3
1393   ret float %vecext
1394 ; CHECK-LABEL: @getf3
1395 ; CHECK: xxsldwi [[SHL:[0-9]+]], 34, 34, 3
1396 ; CHECK: xscvspdpn 1, [[SHL]]
1397 ; CHECK-LE-LABEL: @getf3
1398 ; CHECK-LE: xscvspdpn 1, 34
1399 }
1400
1401 ; Function Attrs: nounwind
1402 define float @getvelf(<4 x float> %vf, i32 signext %i) {
1403 entry:
1404   %vf.addr = alloca <4 x float>, align 16
1405   %i.addr = alloca i32, align 4
1406   store <4 x float> %vf, <4 x float>* %vf.addr, align 16
1407   store i32 %i, i32* %i.addr, align 4
1408   %0 = load <4 x float>, <4 x float>* %vf.addr, align 16
1409   %1 = load i32, i32* %i.addr, align 4
1410   %vecext = extractelement <4 x float> %0, i32 %1
1411   ret float %vecext
1412 ; CHECK-LABEL: @getvelf
1413 ; CHECK-LE-LABEL: @getvelf
1414 ; FIXME: add check patterns when variable element extraction is implemented
1415 }
1416
1417 ; Function Attrs: nounwind
1418 define double @getd0(<2 x double> %vd) {
1419 entry:
1420   %vd.addr = alloca <2 x double>, align 16
1421   store <2 x double> %vd, <2 x double>* %vd.addr, align 16
1422   %0 = load <2 x double>, <2 x double>* %vd.addr, align 16
1423   %vecext = extractelement <2 x double> %0, i32 0
1424   ret double %vecext
1425 ; CHECK-LABEL: @getd0
1426 ; CHECK: xxlor 1, 34, 34
1427 ; CHECK-LE-LABEL: @getd0
1428 ; CHECK-LE: xxswapd  1, 34
1429 }
1430
1431 ; Function Attrs: nounwind
1432 define double @getd1(<2 x double> %vd) {
1433 entry:
1434   %vd.addr = alloca <2 x double>, align 16
1435   store <2 x double> %vd, <2 x double>* %vd.addr, align 16
1436   %0 = load <2 x double>, <2 x double>* %vd.addr, align 16
1437   %vecext = extractelement <2 x double> %0, i32 1
1438   ret double %vecext
1439 ; CHECK-LABEL: @getd1
1440 ; CHECK: xxswapd  1, 34
1441 ; CHECK-LE-LABEL: @getd1
1442 ; CHECK-LE: xxlor 1, 34, 34
1443 }
1444
1445 ; Function Attrs: nounwind
1446 define double @getveld(<2 x double> %vd, i32 signext %i) {
1447 entry:
1448   %vd.addr = alloca <2 x double>, align 16
1449   %i.addr = alloca i32, align 4
1450   store <2 x double> %vd, <2 x double>* %vd.addr, align 16
1451   store i32 %i, i32* %i.addr, align 4
1452   %0 = load <2 x double>, <2 x double>* %vd.addr, align 16
1453   %1 = load i32, i32* %i.addr, align 4
1454   %vecext = extractelement <2 x double> %0, i32 %1
1455   ret double %vecext
1456 ; CHECK-LABEL: @getveld
1457 ; CHECK-LE-LABEL: @getveld
1458 ; FIXME: add check patterns when variable element extraction is implemented
1459 }