1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -ppc-vsr-nums-as-vr -mtriple=powerpc64-unknown-linux-gnu \
3; RUN:       -verify-machineinstrs -ppc-asm-full-reg-names -mcpu=pwr8 -relocation-model=pic \
4; RUN:       | FileCheck %s
5; RUN: llc < %s -ppc-vsr-nums-as-vr -mtriple=powerpc64le-unknown-linux-gnu \
6; RUN:       -verify-machineinstrs -ppc-asm-full-reg-names -mcpu=pwr8 -relocation-model=pic \
7; RUN:       | FileCheck %s -check-prefix=CHECK-LE
8; RUN: llc < %s -vec-extabi -mtriple=powerpc64-ibm-aix-xcoff \
9; RUN:       -verify-machineinstrs -mcpu=pwr8 \
10; RUN:       | FileCheck %s -check-prefix=CHECK-AIX
11
12; The build[csilf] functions simply test the scalar_to_vector handling with
13; direct moves. This corresponds to the "insertelement" instruction. Subsequent
14; to this, there will be a splat corresponding to the shufflevector.
15
16@d = common global double 0.000000e+00, align 8
17
18; Function Attrs: norecurse nounwind readnone
19define <16 x i8> @buildc(i8 zeroext %a) {
20; CHECK-LABEL: buildc:
21; CHECK:       # %bb.0: # %entry
22; CHECK-NEXT:    mtvsrwz v2, r3
23; CHECK-NEXT:    vspltb v2, v2, 7
24; CHECK-NEXT:    blr
25;
26; CHECK-LE-LABEL: buildc:
27; CHECK-LE:       # %bb.0: # %entry
28; CHECK-LE-NEXT:    mtvsrd v2, r3
29; CHECK-LE-NEXT:    vspltb v2, v2, 7
30; CHECK-LE-NEXT:    blr
31;
32; CHECK-AIX-LABEL: buildc:
33; CHECK-AIX:       # %bb.0: # %entry
34; CHECK-AIX-NEXT:    mtvsrwz 34, 3
35; CHECK-AIX-NEXT:    vspltb 2, 2, 7
36; CHECK-AIX-NEXT:    blr
37entry:
38  %splat.splatinsert = insertelement <16 x i8> undef, i8 %a, i32 0
39  %splat.splat = shufflevector <16 x i8> %splat.splatinsert, <16 x i8> undef, <16 x i32> zeroinitializer
40  ret <16 x i8> %splat.splat
41
42
43}
44
45; Function Attrs: norecurse nounwind readnone
46define <8 x i16> @builds(i16 zeroext %a) {
47; CHECK-LABEL: builds:
48; CHECK:       # %bb.0: # %entry
49; CHECK-NEXT:    mtvsrwz v2, r3
50; CHECK-NEXT:    vsplth v2, v2, 3
51; CHECK-NEXT:    blr
52;
53; CHECK-LE-LABEL: builds:
54; CHECK-LE:       # %bb.0: # %entry
55; CHECK-LE-NEXT:    mtvsrd v2, r3
56; CHECK-LE-NEXT:    vsplth v2, v2, 3
57; CHECK-LE-NEXT:    blr
58;
59; CHECK-AIX-LABEL: builds:
60; CHECK-AIX:       # %bb.0: # %entry
61; CHECK-AIX-NEXT:    mtvsrwz 34, 3
62; CHECK-AIX-NEXT:    vsplth 2, 2, 3
63; CHECK-AIX-NEXT:    blr
64entry:
65  %splat.splatinsert = insertelement <8 x i16> undef, i16 %a, i32 0
66  %splat.splat = shufflevector <8 x i16> %splat.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer
67  ret <8 x i16> %splat.splat
68
69
70}
71
72; Function Attrs: norecurse nounwind readnone
73define <4 x i32> @buildi(i32 zeroext %a) {
74; CHECK-LABEL: buildi:
75; CHECK:       # %bb.0: # %entry
76; CHECK-NEXT:    mtfprwz f0, r3
77; CHECK-NEXT:    xxspltw v2, vs0, 1
78; CHECK-NEXT:    blr
79;
80; CHECK-LE-LABEL: buildi:
81; CHECK-LE:       # %bb.0: # %entry
82; CHECK-LE-NEXT:    mtfprwz f0, r3
83; CHECK-LE-NEXT:    xxspltw v2, vs0, 1
84; CHECK-LE-NEXT:    blr
85;
86; CHECK-AIX-LABEL: buildi:
87; CHECK-AIX:       # %bb.0: # %entry
88; CHECK-AIX-NEXT:    mtfprwz 0, 3
89; CHECK-AIX-NEXT:    xxspltw 34, 0, 1
90; CHECK-AIX-NEXT:    blr
91entry:
92  %splat.splatinsert = insertelement <4 x i32> undef, i32 %a, i32 0
93  %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
94  ret <4 x i32> %splat.splat
95
96
97}
98
99; Function Attrs: norecurse nounwind readnone
100define <2 x i64> @buildl(i64 %a) {
101; CHECK-LABEL: buildl:
102; CHECK:       # %bb.0: # %entry
103; CHECK-NEXT:    mtfprd f0, r3
104; CHECK-NEXT:    xxspltd v2, vs0, 0
105; CHECK-NEXT:    blr
106;
107; CHECK-LE-LABEL: buildl:
108; CHECK-LE:       # %bb.0: # %entry
109; CHECK-LE-NEXT:    mtfprd f0, r3
110; CHECK-LE-NEXT:    xxspltd v2, vs0, 0
111; CHECK-LE-NEXT:    blr
112;
113; CHECK-AIX-LABEL: buildl:
114; CHECK-AIX:       # %bb.0: # %entry
115; CHECK-AIX-NEXT:    mtfprd 0, 3
116; CHECK-AIX-NEXT:    xxmrghd 34, 0, 0
117; CHECK-AIX-NEXT:    blr
118entry:
119  %splat.splatinsert = insertelement <2 x i64> undef, i64 %a, i32 0
120  %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
121  ret <2 x i64> %splat.splat
122
123
124}
125
126; Function Attrs: norecurse nounwind readnone
127define <4 x float> @buildf(float %a) {
128; CHECK-LABEL: buildf:
129; CHECK:       # %bb.0: # %entry
130; CHECK-NEXT:    xscvdpspn vs0, f1
131; CHECK-NEXT:    xxspltw v2, vs0, 0
132; CHECK-NEXT:    blr
133;
134; CHECK-LE-LABEL: buildf:
135; CHECK-LE:       # %bb.0: # %entry
136; CHECK-LE-NEXT:    xscvdpspn vs0, f1
137; CHECK-LE-NEXT:    xxspltw v2, vs0, 0
138; CHECK-LE-NEXT:    blr
139;
140; CHECK-AIX-LABEL: buildf:
141; CHECK-AIX:       # %bb.0: # %entry
142; CHECK-AIX-NEXT:    xscvdpspn 0, 1
143; CHECK-AIX-NEXT:    xxspltw 34, 0, 0
144; CHECK-AIX-NEXT:    blr
145entry:
146  %splat.splatinsert = insertelement <4 x float> undef, float %a, i32 0
147  %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer
148  ret <4 x float> %splat.splat
149
150
151}
152
153; The optimization to remove stack operations from PPCDAGToDAGISel::Select
154; should still trigger for v2f64, producing an lxvdsx.
155; Function Attrs: norecurse nounwind readonly
156define <2 x double> @buildd() {
157; CHECK-LABEL: buildd:
158; CHECK:       # %bb.0: # %entry
159; CHECK-NEXT:    addis r3, r2, .LC0@toc@ha
160; CHECK-NEXT:    ld r3, .LC0@toc@l(r3)
161; CHECK-NEXT:    lxvdsx v2, 0, r3
162; CHECK-NEXT:    blr
163;
164; CHECK-LE-LABEL: buildd:
165; CHECK-LE:       # %bb.0: # %entry
166; CHECK-LE-NEXT:    addis r3, r2, .LC0@toc@ha
167; CHECK-LE-NEXT:    ld r3, .LC0@toc@l(r3)
168; CHECK-LE-NEXT:    lxvdsx v2, 0, r3
169; CHECK-LE-NEXT:    blr
170;
171; CHECK-AIX-LABEL: buildd:
172; CHECK-AIX:       # %bb.0: # %entry
173; CHECK-AIX-NEXT:    ld 3, L..C0(2)
174; CHECK-AIX-NEXT:    lxvdsx 34, 0, 3
175; CHECK-AIX-NEXT:    blr
176entry:
177  %0 = load double, double* @d, align 8
178  %splat.splatinsert = insertelement <2 x double> undef, double %0, i32 0
179  %splat.splat = shufflevector <2 x double> %splat.splatinsert, <2 x double> undef, <2 x i32> zeroinitializer
180  ret <2 x double> %splat.splat
181
182
183}
184
185; Function Attrs: norecurse nounwind readnone
186define signext i8 @getsc0(<16 x i8> %vsc) {
187; CHECK-LABEL: getsc0:
188; CHECK:       # %bb.0: # %entry
189; CHECK-NEXT:    mfvsrd r3, v2
190; CHECK-NEXT:    rldicl r3, r3, 8, 56
191; CHECK-NEXT:    extsb r3, r3
192; CHECK-NEXT:    blr
193;
194; CHECK-LE-LABEL: getsc0:
195; CHECK-LE:       # %bb.0: # %entry
196; CHECK-LE-NEXT:    xxswapd vs0, v2
197; CHECK-LE-NEXT:    mffprd r3, f0
198; CHECK-LE-NEXT:    clrldi r3, r3, 56
199; CHECK-LE-NEXT:    extsb r3, r3
200; CHECK-LE-NEXT:    blr
201;
202; CHECK-AIX-LABEL: getsc0:
203; CHECK-AIX:       # %bb.0: # %entry
204; CHECK-AIX-NEXT:    mfvsrd 3, 34
205; CHECK-AIX-NEXT:    rldicl 3, 3, 8, 56
206; CHECK-AIX-NEXT:    extsb 3, 3
207; CHECK-AIX-NEXT:    blr
208entry:
209  %vecext = extractelement <16 x i8> %vsc, i32 0
210  ret i8 %vecext
211
212
213}
214
215; Function Attrs: norecurse nounwind readnone
216define signext i8 @getsc1(<16 x i8> %vsc) {
217; CHECK-LABEL: getsc1:
218; CHECK:       # %bb.0: # %entry
219; CHECK-NEXT:    mfvsrd r3, v2
220; CHECK-NEXT:    rldicl r3, r3, 16, 56
221; CHECK-NEXT:    extsb r3, r3
222; CHECK-NEXT:    blr
223;
224; CHECK-LE-LABEL: getsc1:
225; CHECK-LE:       # %bb.0: # %entry
226; CHECK-LE-NEXT:    xxswapd vs0, v2
227; CHECK-LE-NEXT:    mffprd r3, f0
228; CHECK-LE-NEXT:    rldicl r3, r3, 56, 56
229; CHECK-LE-NEXT:    extsb r3, r3
230; CHECK-LE-NEXT:    blr
231;
232; CHECK-AIX-LABEL: getsc1:
233; CHECK-AIX:       # %bb.0: # %entry
234; CHECK-AIX-NEXT:    mfvsrd 3, 34
235; CHECK-AIX-NEXT:    rldicl 3, 3, 16, 56
236; CHECK-AIX-NEXT:    extsb 3, 3
237; CHECK-AIX-NEXT:    blr
238entry:
239  %vecext = extractelement <16 x i8> %vsc, i32 1
240  ret i8 %vecext
241
242
243}
244
245; Function Attrs: norecurse nounwind readnone
246define signext i8 @getsc2(<16 x i8> %vsc) {
247; CHECK-LABEL: getsc2:
248; CHECK:       # %bb.0: # %entry
249; CHECK-NEXT:    mfvsrd r3, v2
250; CHECK-NEXT:    rldicl r3, r3, 24, 56
251; CHECK-NEXT:    extsb r3, r3
252; CHECK-NEXT:    blr
253;
254; CHECK-LE-LABEL: getsc2:
255; CHECK-LE:       # %bb.0: # %entry
256; CHECK-LE-NEXT:    xxswapd vs0, v2
257; CHECK-LE-NEXT:    mffprd r3, f0
258; CHECK-LE-NEXT:    rldicl r3, r3, 48, 56
259; CHECK-LE-NEXT:    extsb r3, r3
260; CHECK-LE-NEXT:    blr
261;
262; CHECK-AIX-LABEL: getsc2:
263; CHECK-AIX:       # %bb.0: # %entry
264; CHECK-AIX-NEXT:    mfvsrd 3, 34
265; CHECK-AIX-NEXT:    rldicl 3, 3, 24, 56
266; CHECK-AIX-NEXT:    extsb 3, 3
267; CHECK-AIX-NEXT:    blr
268entry:
269  %vecext = extractelement <16 x i8> %vsc, i32 2
270  ret i8 %vecext
271
272
273}
274
275; Function Attrs: norecurse nounwind readnone
276define signext i8 @getsc3(<16 x i8> %vsc) {
277; CHECK-LABEL: getsc3:
278; CHECK:       # %bb.0: # %entry
279; CHECK-NEXT:    mfvsrd r3, v2
280; CHECK-NEXT:    rldicl r3, r3, 32, 56
281; CHECK-NEXT:    extsb r3, r3
282; CHECK-NEXT:    blr
283;
284; CHECK-LE-LABEL: getsc3:
285; CHECK-LE:       # %bb.0: # %entry
286; CHECK-LE-NEXT:    xxswapd vs0, v2
287; CHECK-LE-NEXT:    mffprd r3, f0
288; CHECK-LE-NEXT:    rldicl r3, r3, 40, 56
289; CHECK-LE-NEXT:    extsb r3, r3
290; CHECK-LE-NEXT:    blr
291;
292; CHECK-AIX-LABEL: getsc3:
293; CHECK-AIX:       # %bb.0: # %entry
294; CHECK-AIX-NEXT:    mfvsrd 3, 34
295; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 56
296; CHECK-AIX-NEXT:    extsb 3, 3
297; CHECK-AIX-NEXT:    blr
298entry:
299  %vecext = extractelement <16 x i8> %vsc, i32 3
300  ret i8 %vecext
301
302
303}
304
305; Function Attrs: norecurse nounwind readnone
306define signext i8 @getsc4(<16 x i8> %vsc) {
307; CHECK-LABEL: getsc4:
308; CHECK:       # %bb.0: # %entry
309; CHECK-NEXT:    mfvsrd r3, v2
310; CHECK-NEXT:    rldicl r3, r3, 40, 56
311; CHECK-NEXT:    extsb r3, r3
312; CHECK-NEXT:    blr
313;
314; CHECK-LE-LABEL: getsc4:
315; CHECK-LE:       # %bb.0: # %entry
316; CHECK-LE-NEXT:    xxswapd vs0, v2
317; CHECK-LE-NEXT:    mffprd r3, f0
318; CHECK-LE-NEXT:    rldicl r3, r3, 32, 56
319; CHECK-LE-NEXT:    extsb r3, r3
320; CHECK-LE-NEXT:    blr
321;
322; CHECK-AIX-LABEL: getsc4:
323; CHECK-AIX:       # %bb.0: # %entry
324; CHECK-AIX-NEXT:    mfvsrd 3, 34
325; CHECK-AIX-NEXT:    rldicl 3, 3, 40, 56
326; CHECK-AIX-NEXT:    extsb 3, 3
327; CHECK-AIX-NEXT:    blr
328entry:
329  %vecext = extractelement <16 x i8> %vsc, i32 4
330  ret i8 %vecext
331
332
333}
334
335; Function Attrs: norecurse nounwind readnone
336define signext i8 @getsc5(<16 x i8> %vsc) {
337; CHECK-LABEL: getsc5:
338; CHECK:       # %bb.0: # %entry
339; CHECK-NEXT:    mfvsrd r3, v2
340; CHECK-NEXT:    rldicl r3, r3, 48, 56
341; CHECK-NEXT:    extsb r3, r3
342; CHECK-NEXT:    blr
343;
344; CHECK-LE-LABEL: getsc5:
345; CHECK-LE:       # %bb.0: # %entry
346; CHECK-LE-NEXT:    xxswapd vs0, v2
347; CHECK-LE-NEXT:    mffprd r3, f0
348; CHECK-LE-NEXT:    rldicl r3, r3, 24, 56
349; CHECK-LE-NEXT:    extsb r3, r3
350; CHECK-LE-NEXT:    blr
351;
352; CHECK-AIX-LABEL: getsc5:
353; CHECK-AIX:       # %bb.0: # %entry
354; CHECK-AIX-NEXT:    mfvsrd 3, 34
355; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 56
356; CHECK-AIX-NEXT:    extsb 3, 3
357; CHECK-AIX-NEXT:    blr
358entry:
359  %vecext = extractelement <16 x i8> %vsc, i32 5
360  ret i8 %vecext
361
362
363}
364
365; Function Attrs: norecurse nounwind readnone
366define signext i8 @getsc6(<16 x i8> %vsc) {
367; CHECK-LABEL: getsc6:
368; CHECK:       # %bb.0: # %entry
369; CHECK-NEXT:    mfvsrd r3, v2
370; CHECK-NEXT:    rldicl r3, r3, 56, 56
371; CHECK-NEXT:    extsb r3, r3
372; CHECK-NEXT:    blr
373;
374; CHECK-LE-LABEL: getsc6:
375; CHECK-LE:       # %bb.0: # %entry
376; CHECK-LE-NEXT:    xxswapd vs0, v2
377; CHECK-LE-NEXT:    mffprd r3, f0
378; CHECK-LE-NEXT:    rldicl r3, r3, 16, 56
379; CHECK-LE-NEXT:    extsb r3, r3
380; CHECK-LE-NEXT:    blr
381;
382; CHECK-AIX-LABEL: getsc6:
383; CHECK-AIX:       # %bb.0: # %entry
384; CHECK-AIX-NEXT:    mfvsrd 3, 34
385; CHECK-AIX-NEXT:    rldicl 3, 3, 56, 56
386; CHECK-AIX-NEXT:    extsb 3, 3
387; CHECK-AIX-NEXT:    blr
388entry:
389  %vecext = extractelement <16 x i8> %vsc, i32 6
390  ret i8 %vecext
391
392
393}
394
395; Function Attrs: norecurse nounwind readnone
396define signext i8 @getsc7(<16 x i8> %vsc) {
397; CHECK-LABEL: getsc7:
398; CHECK:       # %bb.0: # %entry
399; CHECK-NEXT:    mfvsrd r3, v2
400; CHECK-NEXT:    clrldi r3, r3, 56
401; CHECK-NEXT:    extsb r3, r3
402; CHECK-NEXT:    blr
403;
404; CHECK-LE-LABEL: getsc7:
405; CHECK-LE:       # %bb.0: # %entry
406; CHECK-LE-NEXT:    xxswapd vs0, v2
407; CHECK-LE-NEXT:    mffprd r3, f0
408; CHECK-LE-NEXT:    rldicl r3, r3, 8, 56
409; CHECK-LE-NEXT:    extsb r3, r3
410; CHECK-LE-NEXT:    blr
411;
412; CHECK-AIX-LABEL: getsc7:
413; CHECK-AIX:       # %bb.0: # %entry
414; CHECK-AIX-NEXT:    mfvsrd 3, 34
415; CHECK-AIX-NEXT:    clrldi 3, 3, 56
416; CHECK-AIX-NEXT:    extsb 3, 3
417; CHECK-AIX-NEXT:    blr
418entry:
419  %vecext = extractelement <16 x i8> %vsc, i32 7
420  ret i8 %vecext
421
422
423}
424
425; Function Attrs: norecurse nounwind readnone
426define signext i8 @getsc8(<16 x i8> %vsc) {
427; CHECK-LABEL: getsc8:
428; CHECK:       # %bb.0: # %entry
429; CHECK-NEXT:    xxswapd vs0, v2
430; CHECK-NEXT:    mffprd r3, f0
431; CHECK-NEXT:    rldicl r3, r3, 8, 56
432; CHECK-NEXT:    extsb r3, r3
433; CHECK-NEXT:    blr
434;
435; CHECK-LE-LABEL: getsc8:
436; CHECK-LE:       # %bb.0: # %entry
437; CHECK-LE-NEXT:    mfvsrd r3, v2
438; CHECK-LE-NEXT:    clrldi r3, r3, 56
439; CHECK-LE-NEXT:    extsb r3, r3
440; CHECK-LE-NEXT:    blr
441;
442; CHECK-AIX-LABEL: getsc8:
443; CHECK-AIX:       # %bb.0: # %entry
444; CHECK-AIX-NEXT:    xxswapd 0, 34
445; CHECK-AIX-NEXT:    mffprd 3, 0
446; CHECK-AIX-NEXT:    rldicl 3, 3, 8, 56
447; CHECK-AIX-NEXT:    extsb 3, 3
448; CHECK-AIX-NEXT:    blr
449entry:
450  %vecext = extractelement <16 x i8> %vsc, i32 8
451  ret i8 %vecext
452
453
454}
455
456; Function Attrs: norecurse nounwind readnone
457define signext i8 @getsc9(<16 x i8> %vsc) {
458; CHECK-LABEL: getsc9:
459; CHECK:       # %bb.0: # %entry
460; CHECK-NEXT:    xxswapd vs0, v2
461; CHECK-NEXT:    mffprd r3, f0
462; CHECK-NEXT:    rldicl r3, r3, 16, 56
463; CHECK-NEXT:    extsb r3, r3
464; CHECK-NEXT:    blr
465;
466; CHECK-LE-LABEL: getsc9:
467; CHECK-LE:       # %bb.0: # %entry
468; CHECK-LE-NEXT:    mfvsrd r3, v2
469; CHECK-LE-NEXT:    rldicl r3, r3, 56, 56
470; CHECK-LE-NEXT:    extsb r3, r3
471; CHECK-LE-NEXT:    blr
472;
473; CHECK-AIX-LABEL: getsc9:
474; CHECK-AIX:       # %bb.0: # %entry
475; CHECK-AIX-NEXT:    xxswapd 0, 34
476; CHECK-AIX-NEXT:    mffprd 3, 0
477; CHECK-AIX-NEXT:    rldicl 3, 3, 16, 56
478; CHECK-AIX-NEXT:    extsb 3, 3
479; CHECK-AIX-NEXT:    blr
480entry:
481  %vecext = extractelement <16 x i8> %vsc, i32 9
482  ret i8 %vecext
483
484
485}
486
487; Function Attrs: norecurse nounwind readnone
488define signext i8 @getsc10(<16 x i8> %vsc) {
489; CHECK-LABEL: getsc10:
490; CHECK:       # %bb.0: # %entry
491; CHECK-NEXT:    xxswapd vs0, v2
492; CHECK-NEXT:    mffprd r3, f0
493; CHECK-NEXT:    rldicl r3, r3, 24, 56
494; CHECK-NEXT:    extsb r3, r3
495; CHECK-NEXT:    blr
496;
497; CHECK-LE-LABEL: getsc10:
498; CHECK-LE:       # %bb.0: # %entry
499; CHECK-LE-NEXT:    mfvsrd r3, v2
500; CHECK-LE-NEXT:    rldicl r3, r3, 48, 56
501; CHECK-LE-NEXT:    extsb r3, r3
502; CHECK-LE-NEXT:    blr
503;
504; CHECK-AIX-LABEL: getsc10:
505; CHECK-AIX:       # %bb.0: # %entry
506; CHECK-AIX-NEXT:    xxswapd 0, 34
507; CHECK-AIX-NEXT:    mffprd 3, 0
508; CHECK-AIX-NEXT:    rldicl 3, 3, 24, 56
509; CHECK-AIX-NEXT:    extsb 3, 3
510; CHECK-AIX-NEXT:    blr
511entry:
512  %vecext = extractelement <16 x i8> %vsc, i32 10
513  ret i8 %vecext
514
515
516}
517
518; Function Attrs: norecurse nounwind readnone
519define signext i8 @getsc11(<16 x i8> %vsc) {
520; CHECK-LABEL: getsc11:
521; CHECK:       # %bb.0: # %entry
522; CHECK-NEXT:    xxswapd vs0, v2
523; CHECK-NEXT:    mffprd r3, f0
524; CHECK-NEXT:    rldicl r3, r3, 32, 56
525; CHECK-NEXT:    extsb r3, r3
526; CHECK-NEXT:    blr
527;
528; CHECK-LE-LABEL: getsc11:
529; CHECK-LE:       # %bb.0: # %entry
530; CHECK-LE-NEXT:    mfvsrd r3, v2
531; CHECK-LE-NEXT:    rldicl r3, r3, 40, 56
532; CHECK-LE-NEXT:    extsb r3, r3
533; CHECK-LE-NEXT:    blr
534;
535; CHECK-AIX-LABEL: getsc11:
536; CHECK-AIX:       # %bb.0: # %entry
537; CHECK-AIX-NEXT:    xxswapd 0, 34
538; CHECK-AIX-NEXT:    mffprd 3, 0
539; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 56
540; CHECK-AIX-NEXT:    extsb 3, 3
541; CHECK-AIX-NEXT:    blr
542entry:
543  %vecext = extractelement <16 x i8> %vsc, i32 11
544  ret i8 %vecext
545
546
547}
548
549; Function Attrs: norecurse nounwind readnone
550define signext i8 @getsc12(<16 x i8> %vsc) {
551; CHECK-LABEL: getsc12:
552; CHECK:       # %bb.0: # %entry
553; CHECK-NEXT:    xxswapd vs0, v2
554; CHECK-NEXT:    mffprd r3, f0
555; CHECK-NEXT:    rldicl r3, r3, 40, 56
556; CHECK-NEXT:    extsb r3, r3
557; CHECK-NEXT:    blr
558;
559; CHECK-LE-LABEL: getsc12:
560; CHECK-LE:       # %bb.0: # %entry
561; CHECK-LE-NEXT:    mfvsrd r3, v2
562; CHECK-LE-NEXT:    rldicl r3, r3, 32, 56
563; CHECK-LE-NEXT:    extsb r3, r3
564; CHECK-LE-NEXT:    blr
565;
566; CHECK-AIX-LABEL: getsc12:
567; CHECK-AIX:       # %bb.0: # %entry
568; CHECK-AIX-NEXT:    xxswapd 0, 34
569; CHECK-AIX-NEXT:    mffprd 3, 0
570; CHECK-AIX-NEXT:    rldicl 3, 3, 40, 56
571; CHECK-AIX-NEXT:    extsb 3, 3
572; CHECK-AIX-NEXT:    blr
573entry:
574  %vecext = extractelement <16 x i8> %vsc, i32 12
575  ret i8 %vecext
576
577
578}
579
580; Function Attrs: norecurse nounwind readnone
581define signext i8 @getsc13(<16 x i8> %vsc) {
582; CHECK-LABEL: getsc13:
583; CHECK:       # %bb.0: # %entry
584; CHECK-NEXT:    xxswapd vs0, v2
585; CHECK-NEXT:    mffprd r3, f0
586; CHECK-NEXT:    rldicl r3, r3, 48, 56
587; CHECK-NEXT:    extsb r3, r3
588; CHECK-NEXT:    blr
589;
590; CHECK-LE-LABEL: getsc13:
591; CHECK-LE:       # %bb.0: # %entry
592; CHECK-LE-NEXT:    mfvsrd r3, v2
593; CHECK-LE-NEXT:    rldicl r3, r3, 24, 56
594; CHECK-LE-NEXT:    extsb r3, r3
595; CHECK-LE-NEXT:    blr
596;
597; CHECK-AIX-LABEL: getsc13:
598; CHECK-AIX:       # %bb.0: # %entry
599; CHECK-AIX-NEXT:    xxswapd 0, 34
600; CHECK-AIX-NEXT:    mffprd 3, 0
601; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 56
602; CHECK-AIX-NEXT:    extsb 3, 3
603; CHECK-AIX-NEXT:    blr
604entry:
605  %vecext = extractelement <16 x i8> %vsc, i32 13
606  ret i8 %vecext
607
608
609}
610
611; Function Attrs: norecurse nounwind readnone
612define signext i8 @getsc14(<16 x i8> %vsc) {
613; CHECK-LABEL: getsc14:
614; CHECK:       # %bb.0: # %entry
615; CHECK-NEXT:    xxswapd vs0, v2
616; CHECK-NEXT:    mffprd r3, f0
617; CHECK-NEXT:    rldicl r3, r3, 56, 56
618; CHECK-NEXT:    extsb r3, r3
619; CHECK-NEXT:    blr
620;
621; CHECK-LE-LABEL: getsc14:
622; CHECK-LE:       # %bb.0: # %entry
623; CHECK-LE-NEXT:    mfvsrd r3, v2
624; CHECK-LE-NEXT:    rldicl r3, r3, 16, 56
625; CHECK-LE-NEXT:    extsb r3, r3
626; CHECK-LE-NEXT:    blr
627;
628; CHECK-AIX-LABEL: getsc14:
629; CHECK-AIX:       # %bb.0: # %entry
630; CHECK-AIX-NEXT:    xxswapd 0, 34
631; CHECK-AIX-NEXT:    mffprd 3, 0
632; CHECK-AIX-NEXT:    rldicl 3, 3, 56, 56
633; CHECK-AIX-NEXT:    extsb 3, 3
634; CHECK-AIX-NEXT:    blr
635entry:
636  %vecext = extractelement <16 x i8> %vsc, i32 14
637  ret i8 %vecext
638
639
640}
641
642; Function Attrs: norecurse nounwind readnone
643define signext i8 @getsc15(<16 x i8> %vsc) {
644; CHECK-LABEL: getsc15:
645; CHECK:       # %bb.0: # %entry
646; CHECK-NEXT:    xxswapd vs0, v2
647; CHECK-NEXT:    mffprd r3, f0
648; CHECK-NEXT:    clrldi r3, r3, 56
649; CHECK-NEXT:    extsb r3, r3
650; CHECK-NEXT:    blr
651;
652; CHECK-LE-LABEL: getsc15:
653; CHECK-LE:       # %bb.0: # %entry
654; CHECK-LE-NEXT:    mfvsrd r3, v2
655; CHECK-LE-NEXT:    rldicl r3, r3, 8, 56
656; CHECK-LE-NEXT:    extsb r3, r3
657; CHECK-LE-NEXT:    blr
658;
659; CHECK-AIX-LABEL: getsc15:
660; CHECK-AIX:       # %bb.0: # %entry
661; CHECK-AIX-NEXT:    xxswapd 0, 34
662; CHECK-AIX-NEXT:    mffprd 3, 0
663; CHECK-AIX-NEXT:    clrldi 3, 3, 56
664; CHECK-AIX-NEXT:    extsb 3, 3
665; CHECK-AIX-NEXT:    blr
666entry:
667  %vecext = extractelement <16 x i8> %vsc, i32 15
668  ret i8 %vecext
669
670
671}
672
673; Function Attrs: norecurse nounwind readnone
674define zeroext i8 @getuc0(<16 x i8> %vuc) {
675; CHECK-LABEL: getuc0:
676; CHECK:       # %bb.0: # %entry
677; CHECK-NEXT:    mfvsrd r3, v2
678; CHECK-NEXT:    rldicl r3, r3, 8, 56
679; CHECK-NEXT:    clrldi r3, r3, 56
680; CHECK-NEXT:    blr
681;
682; CHECK-LE-LABEL: getuc0:
683; CHECK-LE:       # %bb.0: # %entry
684; CHECK-LE-NEXT:    xxswapd vs0, v2
685; CHECK-LE-NEXT:    mffprd r3, f0
686; CHECK-LE-NEXT:    clrldi r3, r3, 56
687; CHECK-LE-NEXT:    clrldi r3, r3, 56
688; CHECK-LE-NEXT:    blr
689;
690; CHECK-AIX-LABEL: getuc0:
691; CHECK-AIX:       # %bb.0: # %entry
692; CHECK-AIX-NEXT:    mfvsrd 3, 34
693; CHECK-AIX-NEXT:    rldicl 3, 3, 8, 56
694; CHECK-AIX-NEXT:    clrldi 3, 3, 56
695; CHECK-AIX-NEXT:    blr
696entry:
697  %vecext = extractelement <16 x i8> %vuc, i32 0
698  ret i8 %vecext
699
700
701}
702
703; Function Attrs: norecurse nounwind readnone
704define zeroext i8 @getuc1(<16 x i8> %vuc) {
705; CHECK-LABEL: getuc1:
706; CHECK:       # %bb.0: # %entry
707; CHECK-NEXT:    mfvsrd r3, v2
708; CHECK-NEXT:    rldicl r3, r3, 16, 56
709; CHECK-NEXT:    clrldi r3, r3, 56
710; CHECK-NEXT:    blr
711;
712; CHECK-LE-LABEL: getuc1:
713; CHECK-LE:       # %bb.0: # %entry
714; CHECK-LE-NEXT:    xxswapd vs0, v2
715; CHECK-LE-NEXT:    mffprd r3, f0
716; CHECK-LE-NEXT:    rldicl r3, r3, 56, 56
717; CHECK-LE-NEXT:    clrldi r3, r3, 56
718; CHECK-LE-NEXT:    blr
719;
720; CHECK-AIX-LABEL: getuc1:
721; CHECK-AIX:       # %bb.0: # %entry
722; CHECK-AIX-NEXT:    mfvsrd 3, 34
723; CHECK-AIX-NEXT:    rldicl 3, 3, 16, 56
724; CHECK-AIX-NEXT:    clrldi 3, 3, 56
725; CHECK-AIX-NEXT:    blr
726entry:
727  %vecext = extractelement <16 x i8> %vuc, i32 1
728  ret i8 %vecext
729
730
731}
732
733; Function Attrs: norecurse nounwind readnone
734define zeroext i8 @getuc2(<16 x i8> %vuc) {
735; CHECK-LABEL: getuc2:
736; CHECK:       # %bb.0: # %entry
737; CHECK-NEXT:    mfvsrd r3, v2
738; CHECK-NEXT:    rldicl r3, r3, 24, 56
739; CHECK-NEXT:    clrldi r3, r3, 56
740; CHECK-NEXT:    blr
741;
742; CHECK-LE-LABEL: getuc2:
743; CHECK-LE:       # %bb.0: # %entry
744; CHECK-LE-NEXT:    xxswapd vs0, v2
745; CHECK-LE-NEXT:    mffprd r3, f0
746; CHECK-LE-NEXT:    rldicl r3, r3, 48, 56
747; CHECK-LE-NEXT:    clrldi r3, r3, 56
748; CHECK-LE-NEXT:    blr
749;
750; CHECK-AIX-LABEL: getuc2:
751; CHECK-AIX:       # %bb.0: # %entry
752; CHECK-AIX-NEXT:    mfvsrd 3, 34
753; CHECK-AIX-NEXT:    rldicl 3, 3, 24, 56
754; CHECK-AIX-NEXT:    clrldi 3, 3, 56
755; CHECK-AIX-NEXT:    blr
756entry:
757  %vecext = extractelement <16 x i8> %vuc, i32 2
758  ret i8 %vecext
759
760
761; CHECK-AIX mfvsrd 3, 34
762; CHECK-AIX rldicl 3, 3, 24, 56
763; CHECK-AIX clrldi 3, 3, 56
764}
765
766; Function Attrs: norecurse nounwind readnone
767define zeroext i8 @getuc3(<16 x i8> %vuc) {
768; CHECK-LABEL: getuc3:
769; CHECK:       # %bb.0: # %entry
770; CHECK-NEXT:    mfvsrd r3, v2
771; CHECK-NEXT:    rldicl r3, r3, 32, 56
772; CHECK-NEXT:    clrldi r3, r3, 56
773; CHECK-NEXT:    blr
774;
775; CHECK-LE-LABEL: getuc3:
776; CHECK-LE:       # %bb.0: # %entry
777; CHECK-LE-NEXT:    xxswapd vs0, v2
778; CHECK-LE-NEXT:    mffprd r3, f0
779; CHECK-LE-NEXT:    rldicl r3, r3, 40, 56
780; CHECK-LE-NEXT:    clrldi r3, r3, 56
781; CHECK-LE-NEXT:    blr
782;
783; CHECK-AIX-LABEL: getuc3:
784; CHECK-AIX:       # %bb.0: # %entry
785; CHECK-AIX-NEXT:    mfvsrd 3, 34
786; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 56
787; CHECK-AIX-NEXT:    clrldi 3, 3, 56
788; CHECK-AIX-NEXT:    blr
789entry:
790  %vecext = extractelement <16 x i8> %vuc, i32 3
791  ret i8 %vecext
792
793
794}
795
796; Function Attrs: norecurse nounwind readnone
797define zeroext i8 @getuc4(<16 x i8> %vuc) {
798; CHECK-LABEL: getuc4:
799; CHECK:       # %bb.0: # %entry
800; CHECK-NEXT:    mfvsrd r3, v2
801; CHECK-NEXT:    rldicl r3, r3, 40, 56
802; CHECK-NEXT:    clrldi r3, r3, 56
803; CHECK-NEXT:    blr
804;
805; CHECK-LE-LABEL: getuc4:
806; CHECK-LE:       # %bb.0: # %entry
807; CHECK-LE-NEXT:    xxswapd vs0, v2
808; CHECK-LE-NEXT:    mffprd r3, f0
809; CHECK-LE-NEXT:    rldicl r3, r3, 32, 56
810; CHECK-LE-NEXT:    clrldi r3, r3, 56
811; CHECK-LE-NEXT:    blr
812;
813; CHECK-AIX-LABEL: getuc4:
814; CHECK-AIX:       # %bb.0: # %entry
815; CHECK-AIX-NEXT:    mfvsrd 3, 34
816; CHECK-AIX-NEXT:    rldicl 3, 3, 40, 56
817; CHECK-AIX-NEXT:    clrldi 3, 3, 56
818; CHECK-AIX-NEXT:    blr
819entry:
820  %vecext = extractelement <16 x i8> %vuc, i32 4
821  ret i8 %vecext
822
823
824}
825
826; Function Attrs: norecurse nounwind readnone
827define zeroext i8 @getuc5(<16 x i8> %vuc) {
828; CHECK-LABEL: getuc5:
829; CHECK:       # %bb.0: # %entry
830; CHECK-NEXT:    mfvsrd r3, v2
831; CHECK-NEXT:    rldicl r3, r3, 48, 56
832; CHECK-NEXT:    clrldi r3, r3, 56
833; CHECK-NEXT:    blr
834;
835; CHECK-LE-LABEL: getuc5:
836; CHECK-LE:       # %bb.0: # %entry
837; CHECK-LE-NEXT:    xxswapd vs0, v2
838; CHECK-LE-NEXT:    mffprd r3, f0
839; CHECK-LE-NEXT:    rldicl r3, r3, 24, 56
840; CHECK-LE-NEXT:    clrldi r3, r3, 56
841; CHECK-LE-NEXT:    blr
842;
843; CHECK-AIX-LABEL: getuc5:
844; CHECK-AIX:       # %bb.0: # %entry
845; CHECK-AIX-NEXT:    mfvsrd 3, 34
846; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 56
847; CHECK-AIX-NEXT:    clrldi 3, 3, 56
848; CHECK-AIX-NEXT:    blr
849entry:
850  %vecext = extractelement <16 x i8> %vuc, i32 5
851  ret i8 %vecext
852
853
854}
855
856; Function Attrs: norecurse nounwind readnone
857define zeroext i8 @getuc6(<16 x i8> %vuc) {
858; CHECK-LABEL: getuc6:
859; CHECK:       # %bb.0: # %entry
860; CHECK-NEXT:    mfvsrd r3, v2
861; CHECK-NEXT:    rldicl r3, r3, 56, 56
862; CHECK-NEXT:    clrldi r3, r3, 56
863; CHECK-NEXT:    blr
864;
865; CHECK-LE-LABEL: getuc6:
866; CHECK-LE:       # %bb.0: # %entry
867; CHECK-LE-NEXT:    xxswapd vs0, v2
868; CHECK-LE-NEXT:    mffprd r3, f0
869; CHECK-LE-NEXT:    rldicl r3, r3, 16, 56
870; CHECK-LE-NEXT:    clrldi r3, r3, 56
871; CHECK-LE-NEXT:    blr
872;
873; CHECK-AIX-LABEL: getuc6:
874; CHECK-AIX:       # %bb.0: # %entry
875; CHECK-AIX-NEXT:    mfvsrd 3, 34
876; CHECK-AIX-NEXT:    rldicl 3, 3, 56, 56
877; CHECK-AIX-NEXT:    clrldi 3, 3, 56
878; CHECK-AIX-NEXT:    blr
879entry:
880  %vecext = extractelement <16 x i8> %vuc, i32 6
881  ret i8 %vecext
882
883
884}
885
886; Function Attrs: norecurse nounwind readnone
887define zeroext i8 @getuc7(<16 x i8> %vuc) {
888; CHECK-LABEL: getuc7:
889; CHECK:       # %bb.0: # %entry
890; CHECK-NEXT:    mfvsrd r3, v2
891; CHECK-NEXT:    clrldi r3, r3, 56
892; CHECK-NEXT:    clrldi r3, r3, 56
893; CHECK-NEXT:    blr
894;
895; CHECK-LE-LABEL: getuc7:
896; CHECK-LE:       # %bb.0: # %entry
897; CHECK-LE-NEXT:    xxswapd vs0, v2
898; CHECK-LE-NEXT:    mffprd r3, f0
899; CHECK-LE-NEXT:    rldicl r3, r3, 8, 56
900; CHECK-LE-NEXT:    clrldi r3, r3, 56
901; CHECK-LE-NEXT:    blr
902;
903; CHECK-AIX-LABEL: getuc7:
904; CHECK-AIX:       # %bb.0: # %entry
905; CHECK-AIX-NEXT:    mfvsrd 3, 34
906; CHECK-AIX-NEXT:    clrldi 3, 3, 56
907; CHECK-AIX-NEXT:    clrldi 3, 3, 56
908; CHECK-AIX-NEXT:    blr
909entry:
910  %vecext = extractelement <16 x i8> %vuc, i32 7
911  ret i8 %vecext
912
913
914}
915
916; Function Attrs: norecurse nounwind readnone
917define zeroext i8 @getuc8(<16 x i8> %vuc) {
918; CHECK-LABEL: getuc8:
919; CHECK:       # %bb.0: # %entry
920; CHECK-NEXT:    xxswapd vs0, v2
921; CHECK-NEXT:    mffprd r3, f0
922; CHECK-NEXT:    rldicl r3, r3, 8, 56
923; CHECK-NEXT:    clrldi r3, r3, 56
924; CHECK-NEXT:    blr
925;
926; CHECK-LE-LABEL: getuc8:
927; CHECK-LE:       # %bb.0: # %entry
928; CHECK-LE-NEXT:    mfvsrd r3, v2
929; CHECK-LE-NEXT:    clrldi r3, r3, 56
930; CHECK-LE-NEXT:    clrldi r3, r3, 56
931; CHECK-LE-NEXT:    blr
932;
933; CHECK-AIX-LABEL: getuc8:
934; CHECK-AIX:       # %bb.0: # %entry
935; CHECK-AIX-NEXT:    xxswapd 0, 34
936; CHECK-AIX-NEXT:    mffprd 3, 0
937; CHECK-AIX-NEXT:    rldicl 3, 3, 8, 56
938; CHECK-AIX-NEXT:    clrldi 3, 3, 56
939; CHECK-AIX-NEXT:    blr
940entry:
941  %vecext = extractelement <16 x i8> %vuc, i32 8
942  ret i8 %vecext
943
944
945}
946
947; Function Attrs: norecurse nounwind readnone
948define zeroext i8 @getuc9(<16 x i8> %vuc) {
949; CHECK-LABEL: getuc9:
950; CHECK:       # %bb.0: # %entry
951; CHECK-NEXT:    xxswapd vs0, v2
952; CHECK-NEXT:    mffprd r3, f0
953; CHECK-NEXT:    rldicl r3, r3, 16, 56
954; CHECK-NEXT:    clrldi r3, r3, 56
955; CHECK-NEXT:    blr
956;
957; CHECK-LE-LABEL: getuc9:
958; CHECK-LE:       # %bb.0: # %entry
959; CHECK-LE-NEXT:    mfvsrd r3, v2
960; CHECK-LE-NEXT:    rldicl r3, r3, 56, 56
961; CHECK-LE-NEXT:    clrldi r3, r3, 56
962; CHECK-LE-NEXT:    blr
963;
964; CHECK-AIX-LABEL: getuc9:
965; CHECK-AIX:       # %bb.0: # %entry
966; CHECK-AIX-NEXT:    xxswapd 0, 34
967; CHECK-AIX-NEXT:    mffprd 3, 0
968; CHECK-AIX-NEXT:    rldicl 3, 3, 16, 56
969; CHECK-AIX-NEXT:    clrldi 3, 3, 56
970; CHECK-AIX-NEXT:    blr
971entry:
972  %vecext = extractelement <16 x i8> %vuc, i32 9
973  ret i8 %vecext
974
975
976}
977
978; Function Attrs: norecurse nounwind readnone
979define zeroext i8 @getuc10(<16 x i8> %vuc) {
980; CHECK-LABEL: getuc10:
981; CHECK:       # %bb.0: # %entry
982; CHECK-NEXT:    xxswapd vs0, v2
983; CHECK-NEXT:    mffprd r3, f0
984; CHECK-NEXT:    rldicl r3, r3, 24, 56
985; CHECK-NEXT:    clrldi r3, r3, 56
986; CHECK-NEXT:    blr
987;
988; CHECK-LE-LABEL: getuc10:
989; CHECK-LE:       # %bb.0: # %entry
990; CHECK-LE-NEXT:    mfvsrd r3, v2
991; CHECK-LE-NEXT:    rldicl r3, r3, 48, 56
992; CHECK-LE-NEXT:    clrldi r3, r3, 56
993; CHECK-LE-NEXT:    blr
994;
995; CHECK-AIX-LABEL: getuc10:
996; CHECK-AIX:       # %bb.0: # %entry
997; CHECK-AIX-NEXT:    xxswapd 0, 34
998; CHECK-AIX-NEXT:    mffprd 3, 0
999; CHECK-AIX-NEXT:    rldicl 3, 3, 24, 56
1000; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1001; CHECK-AIX-NEXT:    blr
1002entry:
1003  %vecext = extractelement <16 x i8> %vuc, i32 10
1004  ret i8 %vecext
1005
1006
1007}
1008
1009; Function Attrs: norecurse nounwind readnone
1010define zeroext i8 @getuc11(<16 x i8> %vuc) {
1011; CHECK-LABEL: getuc11:
1012; CHECK:       # %bb.0: # %entry
1013; CHECK-NEXT:    xxswapd vs0, v2
1014; CHECK-NEXT:    mffprd r3, f0
1015; CHECK-NEXT:    rldicl r3, r3, 32, 56
1016; CHECK-NEXT:    clrldi r3, r3, 56
1017; CHECK-NEXT:    blr
1018;
1019; CHECK-LE-LABEL: getuc11:
1020; CHECK-LE:       # %bb.0: # %entry
1021; CHECK-LE-NEXT:    mfvsrd r3, v2
1022; CHECK-LE-NEXT:    rldicl r3, r3, 40, 56
1023; CHECK-LE-NEXT:    clrldi r3, r3, 56
1024; CHECK-LE-NEXT:    blr
1025;
1026; CHECK-AIX-LABEL: getuc11:
1027; CHECK-AIX:       # %bb.0: # %entry
1028; CHECK-AIX-NEXT:    xxswapd 0, 34
1029; CHECK-AIX-NEXT:    mffprd 3, 0
1030; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 56
1031; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1032; CHECK-AIX-NEXT:    blr
1033entry:
1034  %vecext = extractelement <16 x i8> %vuc, i32 11
1035  ret i8 %vecext
1036
1037
1038}
1039
1040; Function Attrs: norecurse nounwind readnone
1041define zeroext i8 @getuc12(<16 x i8> %vuc) {
1042; CHECK-LABEL: getuc12:
1043; CHECK:       # %bb.0: # %entry
1044; CHECK-NEXT:    xxswapd vs0, v2
1045; CHECK-NEXT:    mffprd r3, f0
1046; CHECK-NEXT:    rldicl r3, r3, 40, 56
1047; CHECK-NEXT:    clrldi r3, r3, 56
1048; CHECK-NEXT:    blr
1049;
1050; CHECK-LE-LABEL: getuc12:
1051; CHECK-LE:       # %bb.0: # %entry
1052; CHECK-LE-NEXT:    mfvsrd r3, v2
1053; CHECK-LE-NEXT:    rldicl r3, r3, 32, 56
1054; CHECK-LE-NEXT:    clrldi r3, r3, 56
1055; CHECK-LE-NEXT:    blr
1056;
1057; CHECK-AIX-LABEL: getuc12:
1058; CHECK-AIX:       # %bb.0: # %entry
1059; CHECK-AIX-NEXT:    xxswapd 0, 34
1060; CHECK-AIX-NEXT:    mffprd 3, 0
1061; CHECK-AIX-NEXT:    rldicl 3, 3, 40, 56
1062; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1063; CHECK-AIX-NEXT:    blr
1064entry:
1065  %vecext = extractelement <16 x i8> %vuc, i32 12
1066  ret i8 %vecext
1067
1068
1069}
1070
1071; Function Attrs: norecurse nounwind readnone
1072define zeroext i8 @getuc13(<16 x i8> %vuc) {
1073; CHECK-LABEL: getuc13:
1074; CHECK:       # %bb.0: # %entry
1075; CHECK-NEXT:    xxswapd vs0, v2
1076; CHECK-NEXT:    mffprd r3, f0
1077; CHECK-NEXT:    rldicl r3, r3, 48, 56
1078; CHECK-NEXT:    clrldi r3, r3, 56
1079; CHECK-NEXT:    blr
1080;
1081; CHECK-LE-LABEL: getuc13:
1082; CHECK-LE:       # %bb.0: # %entry
1083; CHECK-LE-NEXT:    mfvsrd r3, v2
1084; CHECK-LE-NEXT:    rldicl r3, r3, 24, 56
1085; CHECK-LE-NEXT:    clrldi r3, r3, 56
1086; CHECK-LE-NEXT:    blr
1087;
1088; CHECK-AIX-LABEL: getuc13:
1089; CHECK-AIX:       # %bb.0: # %entry
1090; CHECK-AIX-NEXT:    xxswapd 0, 34
1091; CHECK-AIX-NEXT:    mffprd 3, 0
1092; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 56
1093; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1094; CHECK-AIX-NEXT:    blr
1095entry:
1096  %vecext = extractelement <16 x i8> %vuc, i32 13
1097  ret i8 %vecext
1098
1099
1100}
1101
1102; Function Attrs: norecurse nounwind readnone
1103define zeroext i8 @getuc14(<16 x i8> %vuc) {
1104; CHECK-LABEL: getuc14:
1105; CHECK:       # %bb.0: # %entry
1106; CHECK-NEXT:    xxswapd vs0, v2
1107; CHECK-NEXT:    mffprd r3, f0
1108; CHECK-NEXT:    rldicl r3, r3, 56, 56
1109; CHECK-NEXT:    clrldi r3, r3, 56
1110; CHECK-NEXT:    blr
1111;
1112; CHECK-LE-LABEL: getuc14:
1113; CHECK-LE:       # %bb.0: # %entry
1114; CHECK-LE-NEXT:    mfvsrd r3, v2
1115; CHECK-LE-NEXT:    rldicl r3, r3, 16, 56
1116; CHECK-LE-NEXT:    clrldi r3, r3, 56
1117; CHECK-LE-NEXT:    blr
1118;
1119; CHECK-AIX-LABEL: getuc14:
1120; CHECK-AIX:       # %bb.0: # %entry
1121; CHECK-AIX-NEXT:    xxswapd 0, 34
1122; CHECK-AIX-NEXT:    mffprd 3, 0
1123; CHECK-AIX-NEXT:    rldicl 3, 3, 56, 56
1124; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1125; CHECK-AIX-NEXT:    blr
1126entry:
1127  %vecext = extractelement <16 x i8> %vuc, i32 14
1128  ret i8 %vecext
1129
1130
1131}
1132
1133; Function Attrs: norecurse nounwind readnone
1134define zeroext i8 @getuc15(<16 x i8> %vuc) {
1135; CHECK-LABEL: getuc15:
1136; CHECK:       # %bb.0: # %entry
1137; CHECK-NEXT:    xxswapd vs0, v2
1138; CHECK-NEXT:    mffprd r3, f0
1139; CHECK-NEXT:    clrldi r3, r3, 56
1140; CHECK-NEXT:    clrldi r3, r3, 56
1141; CHECK-NEXT:    blr
1142;
1143; CHECK-LE-LABEL: getuc15:
1144; CHECK-LE:       # %bb.0: # %entry
1145; CHECK-LE-NEXT:    mfvsrd r3, v2
1146; CHECK-LE-NEXT:    rldicl r3, r3, 8, 56
1147; CHECK-LE-NEXT:    clrldi r3, r3, 56
1148; CHECK-LE-NEXT:    blr
1149;
1150; CHECK-AIX-LABEL: getuc15:
1151; CHECK-AIX:       # %bb.0: # %entry
1152; CHECK-AIX-NEXT:    xxswapd 0, 34
1153; CHECK-AIX-NEXT:    mffprd 3, 0
1154; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1155; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1156; CHECK-AIX-NEXT:    blr
1157entry:
1158  %vecext = extractelement <16 x i8> %vuc, i32 15
1159  ret i8 %vecext
1160
1161
1162}
1163
1164; Function Attrs: norecurse nounwind readnone
1165define signext i8 @getvelsc(<16 x i8> %vsc, i32 signext %i) {
1166; CHECK-LABEL: getvelsc:
1167; CHECK:       # %bb.0: # %entry
1168; CHECK-NEXT:    andi. r4, r5, 8
1169; CHECK-NEXT:    li r3, 7
1170; CHECK-NEXT:    lvsl v3, 0, r4
1171; CHECK-NEXT:    andc r3, r3, r5
1172; CHECK-NEXT:    sldi r3, r3, 3
1173; CHECK-NEXT:    vperm v2, v2, v2, v3
1174; CHECK-NEXT:    mfvsrd r4, v2
1175; CHECK-NEXT:    srd r3, r4, r3
1176; CHECK-NEXT:    extsb r3, r3
1177; CHECK-NEXT:    blr
1178;
1179; CHECK-LE-LABEL: getvelsc:
1180; CHECK-LE:       # %bb.0: # %entry
1181; CHECK-LE-NEXT:    li r3, 8
1182; CHECK-LE-NEXT:    andc r3, r3, r5
1183; CHECK-LE-NEXT:    lvsl v3, 0, r3
1184; CHECK-LE-NEXT:    li r3, 7
1185; CHECK-LE-NEXT:    and r3, r3, r5
1186; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
1187; CHECK-LE-NEXT:    sldi r3, r3, 3
1188; CHECK-LE-NEXT:    mfvsrd r4, v2
1189; CHECK-LE-NEXT:    srd r3, r4, r3
1190; CHECK-LE-NEXT:    extsb r3, r3
1191; CHECK-LE-NEXT:    blr
1192;
1193; CHECK-AIX-LABEL: getvelsc:
1194; CHECK-AIX:       # %bb.0: # %entry
1195; CHECK-AIX-NEXT:    andi. 5, 3, 8
1196; CHECK-AIX-NEXT:    li 4, 7
1197; CHECK-AIX-NEXT:    lvsl 3, 0, 5
1198; CHECK-AIX-NEXT:    andc 3, 4, 3
1199; CHECK-AIX-NEXT:    sldi 3, 3, 3
1200; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
1201; CHECK-AIX-NEXT:    mfvsrd 4, 34
1202; CHECK-AIX-NEXT:    srd 3, 4, 3
1203; CHECK-AIX-NEXT:    extsb 3, 3
1204; CHECK-AIX-NEXT:    blr
1205
1206
1207entry:
1208  %vecext = extractelement <16 x i8> %vsc, i32 %i
1209  ret i8 %vecext
1210}
1211
1212; Function Attrs: norecurse nounwind readnone
1213define zeroext i8 @getveluc(<16 x i8> %vuc, i32 signext %i) {
1214; CHECK-LABEL: getveluc:
1215; CHECK:       # %bb.0: # %entry
1216; CHECK-NEXT:    andi. r4, r5, 8
1217; CHECK-NEXT:    li r3, 7
1218; CHECK-NEXT:    lvsl v3, 0, r4
1219; CHECK-NEXT:    andc r3, r3, r5
1220; CHECK-NEXT:    sldi r3, r3, 3
1221; CHECK-NEXT:    vperm v2, v2, v2, v3
1222; CHECK-NEXT:    mfvsrd r4, v2
1223; CHECK-NEXT:    srd r3, r4, r3
1224; CHECK-NEXT:    clrldi r3, r3, 56
1225; CHECK-NEXT:    blr
1226;
1227; CHECK-LE-LABEL: getveluc:
1228; CHECK-LE:       # %bb.0: # %entry
1229; CHECK-LE-NEXT:    li r3, 8
1230; CHECK-LE-NEXT:    andc r3, r3, r5
1231; CHECK-LE-NEXT:    lvsl v3, 0, r3
1232; CHECK-LE-NEXT:    li r3, 7
1233; CHECK-LE-NEXT:    and r3, r3, r5
1234; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
1235; CHECK-LE-NEXT:    sldi r3, r3, 3
1236; CHECK-LE-NEXT:    mfvsrd r4, v2
1237; CHECK-LE-NEXT:    srd r3, r4, r3
1238; CHECK-LE-NEXT:    clrldi r3, r3, 56
1239; CHECK-LE-NEXT:    blr
1240;
1241; CHECK-AIX-LABEL: getveluc:
1242; CHECK-AIX:       # %bb.0: # %entry
1243; CHECK-AIX-NEXT:    andi. 5, 3, 8
1244; CHECK-AIX-NEXT:    li 4, 7
1245; CHECK-AIX-NEXT:    lvsl 3, 0, 5
1246; CHECK-AIX-NEXT:    andc 3, 4, 3
1247; CHECK-AIX-NEXT:    sldi 3, 3, 3
1248; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
1249; CHECK-AIX-NEXT:    mfvsrd 4, 34
1250; CHECK-AIX-NEXT:    srd 3, 4, 3
1251; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1252; CHECK-AIX-NEXT:    blr
1253
1254
1255entry:
1256  %vecext = extractelement <16 x i8> %vuc, i32 %i
1257  ret i8 %vecext
1258}
1259
1260; Function Attrs: norecurse nounwind readnone
1261define signext i16 @getss0(<8 x i16> %vss) {
1262; CHECK-LABEL: getss0:
1263; CHECK:       # %bb.0: # %entry
1264; CHECK-NEXT:    mfvsrd r3, v2
1265; CHECK-NEXT:    rldicl r3, r3, 16, 48
1266; CHECK-NEXT:    extsh r3, r3
1267; CHECK-NEXT:    blr
1268;
1269; CHECK-LE-LABEL: getss0:
1270; CHECK-LE:       # %bb.0: # %entry
1271; CHECK-LE-NEXT:    xxswapd vs0, v2
1272; CHECK-LE-NEXT:    mffprd r3, f0
1273; CHECK-LE-NEXT:    clrldi r3, r3, 48
1274; CHECK-LE-NEXT:    extsh r3, r3
1275; CHECK-LE-NEXT:    blr
1276;
1277; CHECK-AIX-LABEL: getss0:
1278; CHECK-AIX:       # %bb.0: # %entry
1279; CHECK-AIX-NEXT:    mfvsrd 3, 34
1280; CHECK-AIX-NEXT:    rldicl 3, 3, 16, 48
1281; CHECK-AIX-NEXT:    extsh 3, 3
1282; CHECK-AIX-NEXT:    blr
1283entry:
1284  %vecext = extractelement <8 x i16> %vss, i32 0
1285  ret i16 %vecext
1286
1287
1288}
1289
1290; Function Attrs: norecurse nounwind readnone
1291define signext i16 @getss1(<8 x i16> %vss) {
1292; CHECK-LABEL: getss1:
1293; CHECK:       # %bb.0: # %entry
1294; CHECK-NEXT:    mfvsrd r3, v2
1295; CHECK-NEXT:    rldicl r3, r3, 32, 48
1296; CHECK-NEXT:    extsh r3, r3
1297; CHECK-NEXT:    blr
1298;
1299; CHECK-LE-LABEL: getss1:
1300; CHECK-LE:       # %bb.0: # %entry
1301; CHECK-LE-NEXT:    xxswapd vs0, v2
1302; CHECK-LE-NEXT:    mffprd r3, f0
1303; CHECK-LE-NEXT:    rldicl r3, r3, 48, 48
1304; CHECK-LE-NEXT:    extsh r3, r3
1305; CHECK-LE-NEXT:    blr
1306;
1307; CHECK-AIX-LABEL: getss1:
1308; CHECK-AIX:       # %bb.0: # %entry
1309; CHECK-AIX-NEXT:    mfvsrd 3, 34
1310; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 48
1311; CHECK-AIX-NEXT:    extsh 3, 3
1312; CHECK-AIX-NEXT:    blr
1313entry:
1314  %vecext = extractelement <8 x i16> %vss, i32 1
1315  ret i16 %vecext
1316
1317
1318}
1319
1320; Function Attrs: norecurse nounwind readnone
1321define signext i16 @getss2(<8 x i16> %vss) {
1322; CHECK-LABEL: getss2:
1323; CHECK:       # %bb.0: # %entry
1324; CHECK-NEXT:    mfvsrd r3, v2
1325; CHECK-NEXT:    rldicl r3, r3, 48, 48
1326; CHECK-NEXT:    extsh r3, r3
1327; CHECK-NEXT:    blr
1328;
1329; CHECK-LE-LABEL: getss2:
1330; CHECK-LE:       # %bb.0: # %entry
1331; CHECK-LE-NEXT:    xxswapd vs0, v2
1332; CHECK-LE-NEXT:    mffprd r3, f0
1333; CHECK-LE-NEXT:    rldicl r3, r3, 32, 48
1334; CHECK-LE-NEXT:    extsh r3, r3
1335; CHECK-LE-NEXT:    blr
1336;
1337; CHECK-AIX-LABEL: getss2:
1338; CHECK-AIX:       # %bb.0: # %entry
1339; CHECK-AIX-NEXT:    mfvsrd 3, 34
1340; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 48
1341; CHECK-AIX-NEXT:    extsh 3, 3
1342; CHECK-AIX-NEXT:    blr
1343entry:
1344  %vecext = extractelement <8 x i16> %vss, i32 2
1345  ret i16 %vecext
1346
1347
1348}
1349
1350; Function Attrs: norecurse nounwind readnone
1351define signext i16 @getss3(<8 x i16> %vss) {
1352; CHECK-LABEL: getss3:
1353; CHECK:       # %bb.0: # %entry
1354; CHECK-NEXT:    mfvsrd r3, v2
1355; CHECK-NEXT:    clrldi r3, r3, 48
1356; CHECK-NEXT:    extsh r3, r3
1357; CHECK-NEXT:    blr
1358;
1359; CHECK-LE-LABEL: getss3:
1360; CHECK-LE:       # %bb.0: # %entry
1361; CHECK-LE-NEXT:    xxswapd vs0, v2
1362; CHECK-LE-NEXT:    mffprd r3, f0
1363; CHECK-LE-NEXT:    rldicl r3, r3, 16, 48
1364; CHECK-LE-NEXT:    extsh r3, r3
1365; CHECK-LE-NEXT:    blr
1366;
1367; CHECK-AIX-LABEL: getss3:
1368; CHECK-AIX:       # %bb.0: # %entry
1369; CHECK-AIX-NEXT:    mfvsrd 3, 34
1370; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1371; CHECK-AIX-NEXT:    extsh 3, 3
1372; CHECK-AIX-NEXT:    blr
1373entry:
1374  %vecext = extractelement <8 x i16> %vss, i32 3
1375  ret i16 %vecext
1376
1377
1378}
1379
1380; Function Attrs: norecurse nounwind readnone
1381define signext i16 @getss4(<8 x i16> %vss) {
1382; CHECK-LABEL: getss4:
1383; CHECK:       # %bb.0: # %entry
1384; CHECK-NEXT:    xxswapd vs0, v2
1385; CHECK-NEXT:    mffprd r3, f0
1386; CHECK-NEXT:    rldicl r3, r3, 16, 48
1387; CHECK-NEXT:    extsh r3, r3
1388; CHECK-NEXT:    blr
1389;
1390; CHECK-LE-LABEL: getss4:
1391; CHECK-LE:       # %bb.0: # %entry
1392; CHECK-LE-NEXT:    mfvsrd r3, v2
1393; CHECK-LE-NEXT:    clrldi r3, r3, 48
1394; CHECK-LE-NEXT:    extsh r3, r3
1395; CHECK-LE-NEXT:    blr
1396;
1397; CHECK-AIX-LABEL: getss4:
1398; CHECK-AIX:       # %bb.0: # %entry
1399; CHECK-AIX-NEXT:    xxswapd 0, 34
1400; CHECK-AIX-NEXT:    mffprd 3, 0
1401; CHECK-AIX-NEXT:    rldicl 3, 3, 16, 48
1402; CHECK-AIX-NEXT:    extsh 3, 3
1403; CHECK-AIX-NEXT:    blr
1404entry:
1405  %vecext = extractelement <8 x i16> %vss, i32 4
1406  ret i16 %vecext
1407
1408
1409}
1410
1411; Function Attrs: norecurse nounwind readnone
1412define signext i16 @getss5(<8 x i16> %vss) {
1413; CHECK-LABEL: getss5:
1414; CHECK:       # %bb.0: # %entry
1415; CHECK-NEXT:    xxswapd vs0, v2
1416; CHECK-NEXT:    mffprd r3, f0
1417; CHECK-NEXT:    rldicl r3, r3, 32, 48
1418; CHECK-NEXT:    extsh r3, r3
1419; CHECK-NEXT:    blr
1420;
1421; CHECK-LE-LABEL: getss5:
1422; CHECK-LE:       # %bb.0: # %entry
1423; CHECK-LE-NEXT:    mfvsrd r3, v2
1424; CHECK-LE-NEXT:    rldicl r3, r3, 48, 48
1425; CHECK-LE-NEXT:    extsh r3, r3
1426; CHECK-LE-NEXT:    blr
1427;
1428; CHECK-AIX-LABEL: getss5:
1429; CHECK-AIX:       # %bb.0: # %entry
1430; CHECK-AIX-NEXT:    xxswapd 0, 34
1431; CHECK-AIX-NEXT:    mffprd 3, 0
1432; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 48
1433; CHECK-AIX-NEXT:    extsh 3, 3
1434; CHECK-AIX-NEXT:    blr
1435entry:
1436  %vecext = extractelement <8 x i16> %vss, i32 5
1437  ret i16 %vecext
1438
1439
1440}
1441
1442; Function Attrs: norecurse nounwind readnone
1443define signext i16 @getss6(<8 x i16> %vss) {
1444; CHECK-LABEL: getss6:
1445; CHECK:       # %bb.0: # %entry
1446; CHECK-NEXT:    xxswapd vs0, v2
1447; CHECK-NEXT:    mffprd r3, f0
1448; CHECK-NEXT:    rldicl r3, r3, 48, 48
1449; CHECK-NEXT:    extsh r3, r3
1450; CHECK-NEXT:    blr
1451;
1452; CHECK-LE-LABEL: getss6:
1453; CHECK-LE:       # %bb.0: # %entry
1454; CHECK-LE-NEXT:    mfvsrd r3, v2
1455; CHECK-LE-NEXT:    rldicl r3, r3, 32, 48
1456; CHECK-LE-NEXT:    extsh r3, r3
1457; CHECK-LE-NEXT:    blr
1458;
1459; CHECK-AIX-LABEL: getss6:
1460; CHECK-AIX:       # %bb.0: # %entry
1461; CHECK-AIX-NEXT:    xxswapd 0, 34
1462; CHECK-AIX-NEXT:    mffprd 3, 0
1463; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 48
1464; CHECK-AIX-NEXT:    extsh 3, 3
1465; CHECK-AIX-NEXT:    blr
1466entry:
1467  %vecext = extractelement <8 x i16> %vss, i32 6
1468  ret i16 %vecext
1469
1470
1471}
1472
1473; Function Attrs: norecurse nounwind readnone
1474define signext i16 @getss7(<8 x i16> %vss) {
1475; CHECK-LABEL: getss7:
1476; CHECK:       # %bb.0: # %entry
1477; CHECK-NEXT:    xxswapd vs0, v2
1478; CHECK-NEXT:    mffprd r3, f0
1479; CHECK-NEXT:    clrldi r3, r3, 48
1480; CHECK-NEXT:    extsh r3, r3
1481; CHECK-NEXT:    blr
1482;
1483; CHECK-LE-LABEL: getss7:
1484; CHECK-LE:       # %bb.0: # %entry
1485; CHECK-LE-NEXT:    mfvsrd r3, v2
1486; CHECK-LE-NEXT:    rldicl r3, r3, 16, 48
1487; CHECK-LE-NEXT:    extsh r3, r3
1488; CHECK-LE-NEXT:    blr
1489;
1490; CHECK-AIX-LABEL: getss7:
1491; CHECK-AIX:       # %bb.0: # %entry
1492; CHECK-AIX-NEXT:    xxswapd 0, 34
1493; CHECK-AIX-NEXT:    mffprd 3, 0
1494; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1495; CHECK-AIX-NEXT:    extsh 3, 3
1496; CHECK-AIX-NEXT:    blr
1497entry:
1498  %vecext = extractelement <8 x i16> %vss, i32 7
1499  ret i16 %vecext
1500
1501
1502}
1503
1504; Function Attrs: norecurse nounwind readnone
1505define zeroext i16 @getus0(<8 x i16> %vus) {
1506; CHECK-LABEL: getus0:
1507; CHECK:       # %bb.0: # %entry
1508; CHECK-NEXT:    mfvsrd r3, v2
1509; CHECK-NEXT:    rldicl r3, r3, 16, 48
1510; CHECK-NEXT:    clrldi r3, r3, 48
1511; CHECK-NEXT:    blr
1512;
1513; CHECK-LE-LABEL: getus0:
1514; CHECK-LE:       # %bb.0: # %entry
1515; CHECK-LE-NEXT:    xxswapd vs0, v2
1516; CHECK-LE-NEXT:    mffprd r3, f0
1517; CHECK-LE-NEXT:    clrldi r3, r3, 48
1518; CHECK-LE-NEXT:    clrldi r3, r3, 48
1519; CHECK-LE-NEXT:    blr
1520;
1521; CHECK-AIX-LABEL: getus0:
1522; CHECK-AIX:       # %bb.0: # %entry
1523; CHECK-AIX-NEXT:    mfvsrd 3, 34
1524; CHECK-AIX-NEXT:    rldicl 3, 3, 16, 48
1525; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1526; CHECK-AIX-NEXT:    blr
1527entry:
1528  %vecext = extractelement <8 x i16> %vus, i32 0
1529  ret i16 %vecext
1530
1531
1532}
1533
1534; Function Attrs: norecurse nounwind readnone
1535define zeroext i16 @getus1(<8 x i16> %vus) {
1536; CHECK-LABEL: getus1:
1537; CHECK:       # %bb.0: # %entry
1538; CHECK-NEXT:    mfvsrd r3, v2
1539; CHECK-NEXT:    rldicl r3, r3, 32, 48
1540; CHECK-NEXT:    clrldi r3, r3, 48
1541; CHECK-NEXT:    blr
1542;
1543; CHECK-LE-LABEL: getus1:
1544; CHECK-LE:       # %bb.0: # %entry
1545; CHECK-LE-NEXT:    xxswapd vs0, v2
1546; CHECK-LE-NEXT:    mffprd r3, f0
1547; CHECK-LE-NEXT:    rldicl r3, r3, 48, 48
1548; CHECK-LE-NEXT:    clrldi r3, r3, 48
1549; CHECK-LE-NEXT:    blr
1550;
1551; CHECK-AIX-LABEL: getus1:
1552; CHECK-AIX:       # %bb.0: # %entry
1553; CHECK-AIX-NEXT:    mfvsrd 3, 34
1554; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 48
1555; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1556; CHECK-AIX-NEXT:    blr
1557entry:
1558  %vecext = extractelement <8 x i16> %vus, i32 1
1559  ret i16 %vecext
1560
1561
1562}
1563
1564; Function Attrs: norecurse nounwind readnone
1565define zeroext i16 @getus2(<8 x i16> %vus) {
1566; CHECK-LABEL: getus2:
1567; CHECK:       # %bb.0: # %entry
1568; CHECK-NEXT:    mfvsrd r3, v2
1569; CHECK-NEXT:    rldicl r3, r3, 48, 48
1570; CHECK-NEXT:    clrldi r3, r3, 48
1571; CHECK-NEXT:    blr
1572;
1573; CHECK-LE-LABEL: getus2:
1574; CHECK-LE:       # %bb.0: # %entry
1575; CHECK-LE-NEXT:    xxswapd vs0, v2
1576; CHECK-LE-NEXT:    mffprd r3, f0
1577; CHECK-LE-NEXT:    rldicl r3, r3, 32, 48
1578; CHECK-LE-NEXT:    clrldi r3, r3, 48
1579; CHECK-LE-NEXT:    blr
1580;
1581; CHECK-AIX-LABEL: getus2:
1582; CHECK-AIX:       # %bb.0: # %entry
1583; CHECK-AIX-NEXT:    mfvsrd 3, 34
1584; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 48
1585; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1586; CHECK-AIX-NEXT:    blr
1587entry:
1588  %vecext = extractelement <8 x i16> %vus, i32 2
1589  ret i16 %vecext
1590
1591
1592}
1593
1594; Function Attrs: norecurse nounwind readnone
1595define zeroext i16 @getus3(<8 x i16> %vus) {
1596; CHECK-LABEL: getus3:
1597; CHECK:       # %bb.0: # %entry
1598; CHECK-NEXT:    mfvsrd r3, v2
1599; CHECK-NEXT:    clrldi r3, r3, 48
1600; CHECK-NEXT:    clrldi r3, r3, 48
1601; CHECK-NEXT:    blr
1602;
1603; CHECK-LE-LABEL: getus3:
1604; CHECK-LE:       # %bb.0: # %entry
1605; CHECK-LE-NEXT:    xxswapd vs0, v2
1606; CHECK-LE-NEXT:    mffprd r3, f0
1607; CHECK-LE-NEXT:    rldicl r3, r3, 16, 48
1608; CHECK-LE-NEXT:    clrldi r3, r3, 48
1609; CHECK-LE-NEXT:    blr
1610;
1611; CHECK-AIX-LABEL: getus3:
1612; CHECK-AIX:       # %bb.0: # %entry
1613; CHECK-AIX-NEXT:    mfvsrd 3, 34
1614; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1615; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1616; CHECK-AIX-NEXT:    blr
1617entry:
1618  %vecext = extractelement <8 x i16> %vus, i32 3
1619  ret i16 %vecext
1620
1621
1622}
1623
1624; Function Attrs: norecurse nounwind readnone
1625define zeroext i16 @getus4(<8 x i16> %vus) {
1626; CHECK-LABEL: getus4:
1627; CHECK:       # %bb.0: # %entry
1628; CHECK-NEXT:    xxswapd vs0, v2
1629; CHECK-NEXT:    mffprd r3, f0
1630; CHECK-NEXT:    rldicl r3, r3, 16, 48
1631; CHECK-NEXT:    clrldi r3, r3, 48
1632; CHECK-NEXT:    blr
1633;
1634; CHECK-LE-LABEL: getus4:
1635; CHECK-LE:       # %bb.0: # %entry
1636; CHECK-LE-NEXT:    mfvsrd r3, v2
1637; CHECK-LE-NEXT:    clrldi r3, r3, 48
1638; CHECK-LE-NEXT:    clrldi r3, r3, 48
1639; CHECK-LE-NEXT:    blr
1640;
1641; CHECK-AIX-LABEL: getus4:
1642; CHECK-AIX:       # %bb.0: # %entry
1643; CHECK-AIX-NEXT:    xxswapd 0, 34
1644; CHECK-AIX-NEXT:    mffprd 3, 0
1645; CHECK-AIX-NEXT:    rldicl 3, 3, 16, 48
1646; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1647; CHECK-AIX-NEXT:    blr
1648entry:
1649  %vecext = extractelement <8 x i16> %vus, i32 4
1650  ret i16 %vecext
1651
1652
1653}
1654
1655; Function Attrs: norecurse nounwind readnone
1656define zeroext i16 @getus5(<8 x i16> %vus) {
1657; CHECK-LABEL: getus5:
1658; CHECK:       # %bb.0: # %entry
1659; CHECK-NEXT:    xxswapd vs0, v2
1660; CHECK-NEXT:    mffprd r3, f0
1661; CHECK-NEXT:    rldicl r3, r3, 32, 48
1662; CHECK-NEXT:    clrldi r3, r3, 48
1663; CHECK-NEXT:    blr
1664;
1665; CHECK-LE-LABEL: getus5:
1666; CHECK-LE:       # %bb.0: # %entry
1667; CHECK-LE-NEXT:    mfvsrd r3, v2
1668; CHECK-LE-NEXT:    rldicl r3, r3, 48, 48
1669; CHECK-LE-NEXT:    clrldi r3, r3, 48
1670; CHECK-LE-NEXT:    blr
1671;
1672; CHECK-AIX-LABEL: getus5:
1673; CHECK-AIX:       # %bb.0: # %entry
1674; CHECK-AIX-NEXT:    xxswapd 0, 34
1675; CHECK-AIX-NEXT:    mffprd 3, 0
1676; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 48
1677; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1678; CHECK-AIX-NEXT:    blr
1679entry:
1680  %vecext = extractelement <8 x i16> %vus, i32 5
1681  ret i16 %vecext
1682
1683
1684}
1685
1686; Function Attrs: norecurse nounwind readnone
1687define zeroext i16 @getus6(<8 x i16> %vus) {
1688; CHECK-LABEL: getus6:
1689; CHECK:       # %bb.0: # %entry
1690; CHECK-NEXT:    xxswapd vs0, v2
1691; CHECK-NEXT:    mffprd r3, f0
1692; CHECK-NEXT:    rldicl r3, r3, 48, 48
1693; CHECK-NEXT:    clrldi r3, r3, 48
1694; CHECK-NEXT:    blr
1695;
1696; CHECK-LE-LABEL: getus6:
1697; CHECK-LE:       # %bb.0: # %entry
1698; CHECK-LE-NEXT:    mfvsrd r3, v2
1699; CHECK-LE-NEXT:    rldicl r3, r3, 32, 48
1700; CHECK-LE-NEXT:    clrldi r3, r3, 48
1701; CHECK-LE-NEXT:    blr
1702;
1703; CHECK-AIX-LABEL: getus6:
1704; CHECK-AIX:       # %bb.0: # %entry
1705; CHECK-AIX-NEXT:    xxswapd 0, 34
1706; CHECK-AIX-NEXT:    mffprd 3, 0
1707; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 48
1708; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1709; CHECK-AIX-NEXT:    blr
1710entry:
1711  %vecext = extractelement <8 x i16> %vus, i32 6
1712  ret i16 %vecext
1713
1714
1715}
1716
1717; Function Attrs: norecurse nounwind readnone
1718define zeroext i16 @getus7(<8 x i16> %vus) {
1719; CHECK-LABEL: getus7:
1720; CHECK:       # %bb.0: # %entry
1721; CHECK-NEXT:    xxswapd vs0, v2
1722; CHECK-NEXT:    mffprd r3, f0
1723; CHECK-NEXT:    clrldi r3, r3, 48
1724; CHECK-NEXT:    clrldi r3, r3, 48
1725; CHECK-NEXT:    blr
1726;
1727; CHECK-LE-LABEL: getus7:
1728; CHECK-LE:       # %bb.0: # %entry
1729; CHECK-LE-NEXT:    mfvsrd r3, v2
1730; CHECK-LE-NEXT:    rldicl r3, r3, 16, 48
1731; CHECK-LE-NEXT:    clrldi r3, r3, 48
1732; CHECK-LE-NEXT:    blr
1733;
1734; CHECK-AIX-LABEL: getus7:
1735; CHECK-AIX:       # %bb.0: # %entry
1736; CHECK-AIX-NEXT:    xxswapd 0, 34
1737; CHECK-AIX-NEXT:    mffprd 3, 0
1738; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1739; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1740; CHECK-AIX-NEXT:    blr
1741entry:
1742  %vecext = extractelement <8 x i16> %vus, i32 7
1743  ret i16 %vecext
1744
1745
1746}
1747
1748; Function Attrs: norecurse nounwind readnone
1749define signext i16 @getvelss(<8 x i16> %vss, i32 signext %i) {
1750; CHECK-LABEL: getvelss:
1751; CHECK:       # %bb.0: # %entry
1752; CHECK-NEXT:    andi. r4, r5, 4
1753; CHECK-NEXT:    li r3, 3
1754; CHECK-NEXT:    sldi r4, r4, 1
1755; CHECK-NEXT:    andc r3, r3, r5
1756; CHECK-NEXT:    lvsl v3, 0, r4
1757; CHECK-NEXT:    sldi r3, r3, 4
1758; CHECK-NEXT:    vperm v2, v2, v2, v3
1759; CHECK-NEXT:    mfvsrd r4, v2
1760; CHECK-NEXT:    srd r3, r4, r3
1761; CHECK-NEXT:    extsh r3, r3
1762; CHECK-NEXT:    blr
1763;
1764; CHECK-LE-LABEL: getvelss:
1765; CHECK-LE:       # %bb.0: # %entry
1766; CHECK-LE-NEXT:    li r3, 4
1767; CHECK-LE-NEXT:    andc r3, r3, r5
1768; CHECK-LE-NEXT:    sldi r3, r3, 1
1769; CHECK-LE-NEXT:    lvsl v3, 0, r3
1770; CHECK-LE-NEXT:    li r3, 3
1771; CHECK-LE-NEXT:    and r3, r3, r5
1772; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
1773; CHECK-LE-NEXT:    sldi r3, r3, 4
1774; CHECK-LE-NEXT:    mfvsrd r4, v2
1775; CHECK-LE-NEXT:    srd r3, r4, r3
1776; CHECK-LE-NEXT:    extsh r3, r3
1777; CHECK-LE-NEXT:    blr
1778;
1779; CHECK-AIX-LABEL: getvelss:
1780; CHECK-AIX:       # %bb.0: # %entry
1781; CHECK-AIX-NEXT:    andi. 5, 3, 4
1782; CHECK-AIX-NEXT:    li 4, 3
1783; CHECK-AIX-NEXT:    sldi 5, 5, 1
1784; CHECK-AIX-NEXT:    andc 3, 4, 3
1785; CHECK-AIX-NEXT:    lvsl 3, 0, 5
1786; CHECK-AIX-NEXT:    sldi 3, 3, 4
1787; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
1788; CHECK-AIX-NEXT:    mfvsrd 4, 34
1789; CHECK-AIX-NEXT:    srd 3, 4, 3
1790; CHECK-AIX-NEXT:    extsh 3, 3
1791; CHECK-AIX-NEXT:    blr
1792
1793
1794entry:
1795  %vecext = extractelement <8 x i16> %vss, i32 %i
1796  ret i16 %vecext
1797}
1798
1799; Function Attrs: norecurse nounwind readnone
1800define zeroext i16 @getvelus(<8 x i16> %vus, i32 signext %i) {
1801; CHECK-LABEL: getvelus:
1802; CHECK:       # %bb.0: # %entry
1803; CHECK-NEXT:    andi. r4, r5, 4
1804; CHECK-NEXT:    li r3, 3
1805; CHECK-NEXT:    sldi r4, r4, 1
1806; CHECK-NEXT:    andc r3, r3, r5
1807; CHECK-NEXT:    lvsl v3, 0, r4
1808; CHECK-NEXT:    sldi r3, r3, 4
1809; CHECK-NEXT:    vperm v2, v2, v2, v3
1810; CHECK-NEXT:    mfvsrd r4, v2
1811; CHECK-NEXT:    srd r3, r4, r3
1812; CHECK-NEXT:    clrldi r3, r3, 48
1813; CHECK-NEXT:    blr
1814;
1815; CHECK-LE-LABEL: getvelus:
1816; CHECK-LE:       # %bb.0: # %entry
1817; CHECK-LE-NEXT:    li r3, 4
1818; CHECK-LE-NEXT:    andc r3, r3, r5
1819; CHECK-LE-NEXT:    sldi r3, r3, 1
1820; CHECK-LE-NEXT:    lvsl v3, 0, r3
1821; CHECK-LE-NEXT:    li r3, 3
1822; CHECK-LE-NEXT:    and r3, r3, r5
1823; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
1824; CHECK-LE-NEXT:    sldi r3, r3, 4
1825; CHECK-LE-NEXT:    mfvsrd r4, v2
1826; CHECK-LE-NEXT:    srd r3, r4, r3
1827; CHECK-LE-NEXT:    clrldi r3, r3, 48
1828; CHECK-LE-NEXT:    blr
1829;
1830; CHECK-AIX-LABEL: getvelus:
1831; CHECK-AIX:       # %bb.0: # %entry
1832; CHECK-AIX-NEXT:    andi. 5, 3, 4
1833; CHECK-AIX-NEXT:    li 4, 3
1834; CHECK-AIX-NEXT:    sldi 5, 5, 1
1835; CHECK-AIX-NEXT:    andc 3, 4, 3
1836; CHECK-AIX-NEXT:    lvsl 3, 0, 5
1837; CHECK-AIX-NEXT:    sldi 3, 3, 4
1838; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
1839; CHECK-AIX-NEXT:    mfvsrd 4, 34
1840; CHECK-AIX-NEXT:    srd 3, 4, 3
1841; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1842; CHECK-AIX-NEXT:    blr
1843
1844
1845entry:
1846  %vecext = extractelement <8 x i16> %vus, i32 %i
1847  ret i16 %vecext
1848}
1849
1850; Function Attrs: norecurse nounwind readnone
1851define signext i32 @getsi0(<4 x i32> %vsi) {
1852; CHECK-LABEL: getsi0:
1853; CHECK:       # %bb.0: # %entry
1854; CHECK-NEXT:    xxsldwi vs0, v2, v2, 3
1855; CHECK-NEXT:    mffprwz r3, f0
1856; CHECK-NEXT:    extsw r3, r3
1857; CHECK-NEXT:    blr
1858;
1859; CHECK-LE-LABEL: getsi0:
1860; CHECK-LE:       # %bb.0: # %entry
1861; CHECK-LE-NEXT:    xxswapd vs0, v2
1862; CHECK-LE-NEXT:    mffprwz r3, f0
1863; CHECK-LE-NEXT:    extsw r3, r3
1864; CHECK-LE-NEXT:    blr
1865;
1866; CHECK-AIX-LABEL: getsi0:
1867; CHECK-AIX:       # %bb.0: # %entry
1868; CHECK-AIX-NEXT:    xxsldwi 0, 34, 34, 3
1869; CHECK-AIX-NEXT:    mffprwz 3, 0
1870; CHECK-AIX-NEXT:    extsw 3, 3
1871; CHECK-AIX-NEXT:    blr
1872entry:
1873  %vecext = extractelement <4 x i32> %vsi, i32 0
1874  ret i32 %vecext
1875
1876
1877}
1878
1879; Function Attrs: norecurse nounwind readnone
1880define signext i32 @getsi1(<4 x i32> %vsi) {
1881; CHECK-LABEL: getsi1:
1882; CHECK:       # %bb.0: # %entry
1883; CHECK-NEXT:    mfvsrwz r3, v2
1884; CHECK-NEXT:    extsw r3, r3
1885; CHECK-NEXT:    blr
1886;
1887; CHECK-LE-LABEL: getsi1:
1888; CHECK-LE:       # %bb.0: # %entry
1889; CHECK-LE-NEXT:    xxsldwi vs0, v2, v2, 1
1890; CHECK-LE-NEXT:    mffprwz r3, f0
1891; CHECK-LE-NEXT:    extsw r3, r3
1892; CHECK-LE-NEXT:    blr
1893;
1894; CHECK-AIX-LABEL: getsi1:
1895; CHECK-AIX:       # %bb.0: # %entry
1896; CHECK-AIX-NEXT:    mfvsrwz 3, 34
1897; CHECK-AIX-NEXT:    extsw 3, 3
1898; CHECK-AIX-NEXT:    blr
1899entry:
1900  %vecext = extractelement <4 x i32> %vsi, i32 1
1901  ret i32 %vecext
1902
1903
1904}
1905
1906; Function Attrs: norecurse nounwind readnone
1907define signext i32 @getsi2(<4 x i32> %vsi) {
1908; CHECK-LABEL: getsi2:
1909; CHECK:       # %bb.0: # %entry
1910; CHECK-NEXT:    xxsldwi vs0, v2, v2, 1
1911; CHECK-NEXT:    mffprwz r3, f0
1912; CHECK-NEXT:    extsw r3, r3
1913; CHECK-NEXT:    blr
1914;
1915; CHECK-LE-LABEL: getsi2:
1916; CHECK-LE:       # %bb.0: # %entry
1917; CHECK-LE-NEXT:    mfvsrwz r3, v2
1918; CHECK-LE-NEXT:    extsw r3, r3
1919; CHECK-LE-NEXT:    blr
1920;
1921; CHECK-AIX-LABEL: getsi2:
1922; CHECK-AIX:       # %bb.0: # %entry
1923; CHECK-AIX-NEXT:    xxsldwi 0, 34, 34, 1
1924; CHECK-AIX-NEXT:    mffprwz 3, 0
1925; CHECK-AIX-NEXT:    extsw 3, 3
1926; CHECK-AIX-NEXT:    blr
1927entry:
1928  %vecext = extractelement <4 x i32> %vsi, i32 2
1929  ret i32 %vecext
1930
1931
1932}
1933
1934; Function Attrs: norecurse nounwind readnone
1935define signext i32 @getsi3(<4 x i32> %vsi) {
1936; CHECK-LABEL: getsi3:
1937; CHECK:       # %bb.0: # %entry
1938; CHECK-NEXT:    xxswapd vs0, v2
1939; CHECK-NEXT:    mffprwz r3, f0
1940; CHECK-NEXT:    extsw r3, r3
1941; CHECK-NEXT:    blr
1942;
1943; CHECK-LE-LABEL: getsi3:
1944; CHECK-LE:       # %bb.0: # %entry
1945; CHECK-LE-NEXT:    xxsldwi vs0, v2, v2, 3
1946; CHECK-LE-NEXT:    mffprwz r3, f0
1947; CHECK-LE-NEXT:    extsw r3, r3
1948; CHECK-LE-NEXT:    blr
1949;
1950; CHECK-AIX-LABEL: getsi3:
1951; CHECK-AIX:       # %bb.0: # %entry
1952; CHECK-AIX-NEXT:    xxswapd 0, 34
1953; CHECK-AIX-NEXT:    mffprwz 3, 0
1954; CHECK-AIX-NEXT:    extsw 3, 3
1955; CHECK-AIX-NEXT:    blr
1956entry:
1957  %vecext = extractelement <4 x i32> %vsi, i32 3
1958  ret i32 %vecext
1959
1960
1961}
1962
1963; Function Attrs: norecurse nounwind readnone
1964define zeroext i32 @getui0(<4 x i32> %vui) {
1965; CHECK-LABEL: getui0:
1966; CHECK:       # %bb.0: # %entry
1967; CHECK-NEXT:    xxsldwi vs0, v2, v2, 3
1968; CHECK-NEXT:    mffprwz r3, f0
1969; CHECK-NEXT:    clrldi r3, r3, 32
1970; CHECK-NEXT:    blr
1971;
1972; CHECK-LE-LABEL: getui0:
1973; CHECK-LE:       # %bb.0: # %entry
1974; CHECK-LE-NEXT:    xxswapd vs0, v2
1975; CHECK-LE-NEXT:    mffprwz r3, f0
1976; CHECK-LE-NEXT:    clrldi r3, r3, 32
1977; CHECK-LE-NEXT:    blr
1978;
1979; CHECK-AIX-LABEL: getui0:
1980; CHECK-AIX:       # %bb.0: # %entry
1981; CHECK-AIX-NEXT:    xxsldwi 0, 34, 34, 3
1982; CHECK-AIX-NEXT:    mffprwz 3, 0
1983; CHECK-AIX-NEXT:    clrldi 3, 3, 32
1984; CHECK-AIX-NEXT:    blr
1985entry:
1986  %vecext = extractelement <4 x i32> %vui, i32 0
1987  ret i32 %vecext
1988
1989
1990}
1991
1992; Function Attrs: norecurse nounwind readnone
1993define zeroext i32 @getui1(<4 x i32> %vui) {
1994; CHECK-LABEL: getui1:
1995; CHECK:       # %bb.0: # %entry
1996; CHECK-NEXT:    mfvsrwz r3, v2
1997; CHECK-NEXT:    clrldi r3, r3, 32
1998; CHECK-NEXT:    blr
1999;
2000; CHECK-LE-LABEL: getui1:
2001; CHECK-LE:       # %bb.0: # %entry
2002; CHECK-LE-NEXT:    xxsldwi vs0, v2, v2, 1
2003; CHECK-LE-NEXT:    mffprwz r3, f0
2004; CHECK-LE-NEXT:    clrldi r3, r3, 32
2005; CHECK-LE-NEXT:    blr
2006;
2007; CHECK-AIX-LABEL: getui1:
2008; CHECK-AIX:       # %bb.0: # %entry
2009; CHECK-AIX-NEXT:    mfvsrwz 3, 34
2010; CHECK-AIX-NEXT:    clrldi 3, 3, 32
2011; CHECK-AIX-NEXT:    blr
2012entry:
2013  %vecext = extractelement <4 x i32> %vui, i32 1
2014  ret i32 %vecext
2015
2016
2017}
2018
2019; Function Attrs: norecurse nounwind readnone
2020define zeroext i32 @getui2(<4 x i32> %vui) {
2021; CHECK-LABEL: getui2:
2022; CHECK:       # %bb.0: # %entry
2023; CHECK-NEXT:    xxsldwi vs0, v2, v2, 1
2024; CHECK-NEXT:    mffprwz r3, f0
2025; CHECK-NEXT:    clrldi r3, r3, 32
2026; CHECK-NEXT:    blr
2027;
2028; CHECK-LE-LABEL: getui2:
2029; CHECK-LE:       # %bb.0: # %entry
2030; CHECK-LE-NEXT:    mfvsrwz r3, v2
2031; CHECK-LE-NEXT:    clrldi r3, r3, 32
2032; CHECK-LE-NEXT:    blr
2033;
2034; CHECK-AIX-LABEL: getui2:
2035; CHECK-AIX:       # %bb.0: # %entry
2036; CHECK-AIX-NEXT:    xxsldwi 0, 34, 34, 1
2037; CHECK-AIX-NEXT:    mffprwz 3, 0
2038; CHECK-AIX-NEXT:    clrldi 3, 3, 32
2039; CHECK-AIX-NEXT:    blr
2040entry:
2041  %vecext = extractelement <4 x i32> %vui, i32 2
2042  ret i32 %vecext
2043
2044
2045}
2046
2047; Function Attrs: norecurse nounwind readnone
2048define zeroext i32 @getui3(<4 x i32> %vui) {
2049; CHECK-LABEL: getui3:
2050; CHECK:       # %bb.0: # %entry
2051; CHECK-NEXT:    xxswapd vs0, v2
2052; CHECK-NEXT:    mffprwz r3, f0
2053; CHECK-NEXT:    clrldi r3, r3, 32
2054; CHECK-NEXT:    blr
2055;
2056; CHECK-LE-LABEL: getui3:
2057; CHECK-LE:       # %bb.0: # %entry
2058; CHECK-LE-NEXT:    xxsldwi vs0, v2, v2, 3
2059; CHECK-LE-NEXT:    mffprwz r3, f0
2060; CHECK-LE-NEXT:    clrldi r3, r3, 32
2061; CHECK-LE-NEXT:    blr
2062;
2063; CHECK-AIX-LABEL: getui3:
2064; CHECK-AIX:       # %bb.0: # %entry
2065; CHECK-AIX-NEXT:    xxswapd 0, 34
2066; CHECK-AIX-NEXT:    mffprwz 3, 0
2067; CHECK-AIX-NEXT:    clrldi 3, 3, 32
2068; CHECK-AIX-NEXT:    blr
2069entry:
2070  %vecext = extractelement <4 x i32> %vui, i32 3
2071  ret i32 %vecext
2072
2073
2074}
2075
2076; Function Attrs: norecurse nounwind readnone
2077define signext i32 @getvelsi(<4 x i32> %vsi, i32 signext %i) {
2078; CHECK-LABEL: getvelsi:
2079; CHECK:       # %bb.0: # %entry
2080; CHECK-NEXT:    andi. r4, r5, 2
2081; CHECK-NEXT:    li r3, 1
2082; CHECK-NEXT:    sldi r4, r4, 2
2083; CHECK-NEXT:    andc r3, r3, r5
2084; CHECK-NEXT:    lvsl v3, 0, r4
2085; CHECK-NEXT:    sldi r3, r3, 5
2086; CHECK-NEXT:    vperm v2, v2, v2, v3
2087; CHECK-NEXT:    mfvsrd r4, v2
2088; CHECK-NEXT:    srd r3, r4, r3
2089; CHECK-NEXT:    extsw r3, r3
2090; CHECK-NEXT:    blr
2091;
2092; CHECK-LE-LABEL: getvelsi:
2093; CHECK-LE:       # %bb.0: # %entry
2094; CHECK-LE-NEXT:    li r3, 2
2095; CHECK-LE-NEXT:    andc r3, r3, r5
2096; CHECK-LE-NEXT:    sldi r3, r3, 2
2097; CHECK-LE-NEXT:    lvsl v3, 0, r3
2098; CHECK-LE-NEXT:    li r3, 1
2099; CHECK-LE-NEXT:    and r3, r3, r5
2100; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2101; CHECK-LE-NEXT:    sldi r3, r3, 5
2102; CHECK-LE-NEXT:    mfvsrd r4, v2
2103; CHECK-LE-NEXT:    srd r3, r4, r3
2104; CHECK-LE-NEXT:    extsw r3, r3
2105; CHECK-LE-NEXT:    blr
2106;
2107; CHECK-AIX-LABEL: getvelsi:
2108; CHECK-AIX:       # %bb.0: # %entry
2109; CHECK-AIX-NEXT:    andi. 5, 3, 2
2110; CHECK-AIX-NEXT:    li 4, 1
2111; CHECK-AIX-NEXT:    sldi 5, 5, 2
2112; CHECK-AIX-NEXT:    andc 3, 4, 3
2113; CHECK-AIX-NEXT:    lvsl 3, 0, 5
2114; CHECK-AIX-NEXT:    sldi 3, 3, 5
2115; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
2116; CHECK-AIX-NEXT:    mfvsrd 4, 34
2117; CHECK-AIX-NEXT:    srd 3, 4, 3
2118; CHECK-AIX-NEXT:    extsw 3, 3
2119; CHECK-AIX-NEXT:    blr
2120entry:
2121  %vecext = extractelement <4 x i32> %vsi, i32 %i
2122  ret i32 %vecext
2123; FIXME: add check patterns when variable element extraction is implemented
2124}
2125
2126; Function Attrs: norecurse nounwind readnone
2127define zeroext i32 @getvelui(<4 x i32> %vui, i32 signext %i) {
2128; CHECK-LABEL: getvelui:
2129; CHECK:       # %bb.0: # %entry
2130; CHECK-NEXT:    andi. r4, r5, 2
2131; CHECK-NEXT:    li r3, 1
2132; CHECK-NEXT:    sldi r4, r4, 2
2133; CHECK-NEXT:    andc r3, r3, r5
2134; CHECK-NEXT:    lvsl v3, 0, r4
2135; CHECK-NEXT:    sldi r3, r3, 5
2136; CHECK-NEXT:    vperm v2, v2, v2, v3
2137; CHECK-NEXT:    mfvsrd r4, v2
2138; CHECK-NEXT:    srd r3, r4, r3
2139; CHECK-NEXT:    clrldi r3, r3, 32
2140; CHECK-NEXT:    blr
2141;
2142; CHECK-LE-LABEL: getvelui:
2143; CHECK-LE:       # %bb.0: # %entry
2144; CHECK-LE-NEXT:    li r3, 2
2145; CHECK-LE-NEXT:    andc r3, r3, r5
2146; CHECK-LE-NEXT:    sldi r3, r3, 2
2147; CHECK-LE-NEXT:    lvsl v3, 0, r3
2148; CHECK-LE-NEXT:    li r3, 1
2149; CHECK-LE-NEXT:    and r3, r3, r5
2150; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2151; CHECK-LE-NEXT:    sldi r3, r3, 5
2152; CHECK-LE-NEXT:    mfvsrd r4, v2
2153; CHECK-LE-NEXT:    srd r3, r4, r3
2154; CHECK-LE-NEXT:    clrldi r3, r3, 32
2155; CHECK-LE-NEXT:    blr
2156;
2157; CHECK-AIX-LABEL: getvelui:
2158; CHECK-AIX:       # %bb.0: # %entry
2159; CHECK-AIX-NEXT:    andi. 5, 3, 2
2160; CHECK-AIX-NEXT:    li 4, 1
2161; CHECK-AIX-NEXT:    sldi 5, 5, 2
2162; CHECK-AIX-NEXT:    andc 3, 4, 3
2163; CHECK-AIX-NEXT:    lvsl 3, 0, 5
2164; CHECK-AIX-NEXT:    sldi 3, 3, 5
2165; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
2166; CHECK-AIX-NEXT:    mfvsrd 4, 34
2167; CHECK-AIX-NEXT:    srd 3, 4, 3
2168; CHECK-AIX-NEXT:    clrldi 3, 3, 32
2169; CHECK-AIX-NEXT:    blr
2170entry:
2171  %vecext = extractelement <4 x i32> %vui, i32 %i
2172  ret i32 %vecext
2173; FIXME: add check patterns when variable element extraction is implemented
2174}
2175
2176; Function Attrs: norecurse nounwind readnone
2177define i64 @getsl0(<2 x i64> %vsl) {
2178; CHECK-LABEL: getsl0:
2179; CHECK:       # %bb.0: # %entry
2180; CHECK-NEXT:    mfvsrd r3, v2
2181; CHECK-NEXT:    blr
2182;
2183; CHECK-LE-LABEL: getsl0:
2184; CHECK-LE:       # %bb.0: # %entry
2185; CHECK-LE-NEXT:    xxswapd vs0, v2
2186; CHECK-LE-NEXT:    mffprd r3, f0
2187; CHECK-LE-NEXT:    blr
2188;
2189; CHECK-AIX-LABEL: getsl0:
2190; CHECK-AIX:       # %bb.0: # %entry
2191; CHECK-AIX-NEXT:    mfvsrd 3, 34
2192; CHECK-AIX-NEXT:    blr
2193entry:
2194  %vecext = extractelement <2 x i64> %vsl, i32 0
2195  ret i64 %vecext
2196
2197
2198}
2199
2200; Function Attrs: norecurse nounwind readnone
2201define i64 @getsl1(<2 x i64> %vsl) {
2202; CHECK-LABEL: getsl1:
2203; CHECK:       # %bb.0: # %entry
2204; CHECK-NEXT:    xxswapd vs0, v2
2205; CHECK-NEXT:    mffprd r3, f0
2206; CHECK-NEXT:    blr
2207;
2208; CHECK-LE-LABEL: getsl1:
2209; CHECK-LE:       # %bb.0: # %entry
2210; CHECK-LE-NEXT:    mfvsrd r3, v2
2211; CHECK-LE-NEXT:    blr
2212;
2213; CHECK-AIX-LABEL: getsl1:
2214; CHECK-AIX:       # %bb.0: # %entry
2215; CHECK-AIX-NEXT:    xxswapd 0, 34
2216; CHECK-AIX-NEXT:    mffprd 3, 0
2217; CHECK-AIX-NEXT:    blr
2218entry:
2219  %vecext = extractelement <2 x i64> %vsl, i32 1
2220  ret i64 %vecext
2221
2222
2223}
2224
2225; Function Attrs: norecurse nounwind readnone
2226define i64 @getul0(<2 x i64> %vul) {
2227; CHECK-LABEL: getul0:
2228; CHECK:       # %bb.0: # %entry
2229; CHECK-NEXT:    mfvsrd r3, v2
2230; CHECK-NEXT:    blr
2231;
2232; CHECK-LE-LABEL: getul0:
2233; CHECK-LE:       # %bb.0: # %entry
2234; CHECK-LE-NEXT:    xxswapd vs0, v2
2235; CHECK-LE-NEXT:    mffprd r3, f0
2236; CHECK-LE-NEXT:    blr
2237;
2238; CHECK-AIX-LABEL: getul0:
2239; CHECK-AIX:       # %bb.0: # %entry
2240; CHECK-AIX-NEXT:    mfvsrd 3, 34
2241; CHECK-AIX-NEXT:    blr
2242entry:
2243  %vecext = extractelement <2 x i64> %vul, i32 0
2244  ret i64 %vecext
2245
2246
2247}
2248
2249; Function Attrs: norecurse nounwind readnone
2250define i64 @getul1(<2 x i64> %vul) {
2251; CHECK-LABEL: getul1:
2252; CHECK:       # %bb.0: # %entry
2253; CHECK-NEXT:    xxswapd vs0, v2
2254; CHECK-NEXT:    mffprd r3, f0
2255; CHECK-NEXT:    blr
2256;
2257; CHECK-LE-LABEL: getul1:
2258; CHECK-LE:       # %bb.0: # %entry
2259; CHECK-LE-NEXT:    mfvsrd r3, v2
2260; CHECK-LE-NEXT:    blr
2261;
2262; CHECK-AIX-LABEL: getul1:
2263; CHECK-AIX:       # %bb.0: # %entry
2264; CHECK-AIX-NEXT:    xxswapd 0, 34
2265; CHECK-AIX-NEXT:    mffprd 3, 0
2266; CHECK-AIX-NEXT:    blr
2267entry:
2268  %vecext = extractelement <2 x i64> %vul, i32 1
2269  ret i64 %vecext
2270
2271
2272}
2273
2274; Function Attrs: norecurse nounwind readnone
2275define i64 @getvelsl(<2 x i64> %vsl, i32 signext %i) {
2276; CHECK-LABEL: getvelsl:
2277; CHECK:       # %bb.0: # %entry
2278; CHECK-NEXT:    andi. r3, r5, 1
2279; CHECK-NEXT:    sldi r3, r3, 3
2280; CHECK-NEXT:    lvsl v3, 0, r3
2281; CHECK-NEXT:    vperm v2, v2, v2, v3
2282; CHECK-NEXT:    mfvsrd r3, v2
2283; CHECK-NEXT:    blr
2284;
2285; CHECK-LE-LABEL: getvelsl:
2286; CHECK-LE:       # %bb.0: # %entry
2287; CHECK-LE-NEXT:    li r3, 1
2288; CHECK-LE-NEXT:    andc r3, r3, r5
2289; CHECK-LE-NEXT:    sldi r3, r3, 3
2290; CHECK-LE-NEXT:    lvsl v3, 0, r3
2291; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2292; CHECK-LE-NEXT:    mfvsrd r3, v2
2293; CHECK-LE-NEXT:    blr
2294;
2295; CHECK-AIX-LABEL: getvelsl:
2296; CHECK-AIX:       # %bb.0: # %entry
2297; CHECK-AIX-NEXT:    andi. 3, 3, 1
2298; CHECK-AIX-NEXT:    sldi 3, 3, 3
2299; CHECK-AIX-NEXT:    lvsl 3, 0, 3
2300; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
2301; CHECK-AIX-NEXT:    mfvsrd 3, 34
2302; CHECK-AIX-NEXT:    blr
2303entry:
2304  %vecext = extractelement <2 x i64> %vsl, i32 %i
2305  ret i64 %vecext
2306; FIXME: add check patterns when variable element extraction is implemented
2307}
2308
2309; Function Attrs: norecurse nounwind readnone
2310define i64 @getvelul(<2 x i64> %vul, i32 signext %i) {
2311; CHECK-LABEL: getvelul:
2312; CHECK:       # %bb.0: # %entry
2313; CHECK-NEXT:    andi. r3, r5, 1
2314; CHECK-NEXT:    sldi r3, r3, 3
2315; CHECK-NEXT:    lvsl v3, 0, r3
2316; CHECK-NEXT:    vperm v2, v2, v2, v3
2317; CHECK-NEXT:    mfvsrd r3, v2
2318; CHECK-NEXT:    blr
2319;
2320; CHECK-LE-LABEL: getvelul:
2321; CHECK-LE:       # %bb.0: # %entry
2322; CHECK-LE-NEXT:    li r3, 1
2323; CHECK-LE-NEXT:    andc r3, r3, r5
2324; CHECK-LE-NEXT:    sldi r3, r3, 3
2325; CHECK-LE-NEXT:    lvsl v3, 0, r3
2326; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2327; CHECK-LE-NEXT:    mfvsrd r3, v2
2328; CHECK-LE-NEXT:    blr
2329;
2330; CHECK-AIX-LABEL: getvelul:
2331; CHECK-AIX:       # %bb.0: # %entry
2332; CHECK-AIX-NEXT:    andi. 3, 3, 1
2333; CHECK-AIX-NEXT:    sldi 3, 3, 3
2334; CHECK-AIX-NEXT:    lvsl 3, 0, 3
2335; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
2336; CHECK-AIX-NEXT:    mfvsrd 3, 34
2337; CHECK-AIX-NEXT:    blr
2338entry:
2339  %vecext = extractelement <2 x i64> %vul, i32 %i
2340  ret i64 %vecext
2341; FIXME: add check patterns when variable element extraction is implemented
2342}
2343
2344; Function Attrs: norecurse nounwind readnone
2345define float @getf0(<4 x float> %vf) {
2346; CHECK-LABEL: getf0:
2347; CHECK:       # %bb.0: # %entry
2348; CHECK-NEXT:    xscvspdpn f1, v2
2349; CHECK-NEXT:    blr
2350;
2351; CHECK-LE-LABEL: getf0:
2352; CHECK-LE:       # %bb.0: # %entry
2353; CHECK-LE-NEXT:    xxsldwi vs0, v2, v2, 3
2354; CHECK-LE-NEXT:    xscvspdpn f1, vs0
2355; CHECK-LE-NEXT:    blr
2356;
2357; CHECK-AIX-LABEL: getf0:
2358; CHECK-AIX:       # %bb.0: # %entry
2359; CHECK-AIX-NEXT:    xscvspdpn 1, 34
2360; CHECK-AIX-NEXT:    blr
2361entry:
2362  %vecext = extractelement <4 x float> %vf, i32 0
2363  ret float %vecext
2364
2365
2366}
2367
2368; Function Attrs: norecurse nounwind readnone
2369define float @getf1(<4 x float> %vf) {
2370; CHECK-LABEL: getf1:
2371; CHECK:       # %bb.0: # %entry
2372; CHECK-NEXT:    xxsldwi vs0, v2, v2, 1
2373; CHECK-NEXT:    xscvspdpn f1, vs0
2374; CHECK-NEXT:    blr
2375;
2376; CHECK-LE-LABEL: getf1:
2377; CHECK-LE:       # %bb.0: # %entry
2378; CHECK-LE-NEXT:    xxswapd vs0, v2
2379; CHECK-LE-NEXT:    xscvspdpn f1, vs0
2380; CHECK-LE-NEXT:    blr
2381;
2382; CHECK-AIX-LABEL: getf1:
2383; CHECK-AIX:       # %bb.0: # %entry
2384; CHECK-AIX-NEXT:    xxsldwi 0, 34, 34, 1
2385; CHECK-AIX-NEXT:    xscvspdpn 1, 0
2386; CHECK-AIX-NEXT:    blr
2387entry:
2388  %vecext = extractelement <4 x float> %vf, i32 1
2389  ret float %vecext
2390
2391
2392}
2393
2394; Function Attrs: norecurse nounwind readnone
2395define float @getf2(<4 x float> %vf) {
2396; CHECK-LABEL: getf2:
2397; CHECK:       # %bb.0: # %entry
2398; CHECK-NEXT:    xxswapd vs0, v2
2399; CHECK-NEXT:    xscvspdpn f1, vs0
2400; CHECK-NEXT:    blr
2401;
2402; CHECK-LE-LABEL: getf2:
2403; CHECK-LE:       # %bb.0: # %entry
2404; CHECK-LE-NEXT:    xxsldwi vs0, v2, v2, 1
2405; CHECK-LE-NEXT:    xscvspdpn f1, vs0
2406; CHECK-LE-NEXT:    blr
2407;
2408; CHECK-AIX-LABEL: getf2:
2409; CHECK-AIX:       # %bb.0: # %entry
2410; CHECK-AIX-NEXT:    xxswapd 0, 34
2411; CHECK-AIX-NEXT:    xscvspdpn 1, 0
2412; CHECK-AIX-NEXT:    blr
2413entry:
2414  %vecext = extractelement <4 x float> %vf, i32 2
2415  ret float %vecext
2416
2417
2418}
2419
2420; Function Attrs: norecurse nounwind readnone
2421define float @getf3(<4 x float> %vf) {
2422; CHECK-LABEL: getf3:
2423; CHECK:       # %bb.0: # %entry
2424; CHECK-NEXT:    xxsldwi vs0, v2, v2, 3
2425; CHECK-NEXT:    xscvspdpn f1, vs0
2426; CHECK-NEXT:    blr
2427;
2428; CHECK-LE-LABEL: getf3:
2429; CHECK-LE:       # %bb.0: # %entry
2430; CHECK-LE-NEXT:    xscvspdpn f1, v2
2431; CHECK-LE-NEXT:    blr
2432;
2433; CHECK-AIX-LABEL: getf3:
2434; CHECK-AIX:       # %bb.0: # %entry
2435; CHECK-AIX-NEXT:    xxsldwi 0, 34, 34, 3
2436; CHECK-AIX-NEXT:    xscvspdpn 1, 0
2437; CHECK-AIX-NEXT:    blr
2438entry:
2439  %vecext = extractelement <4 x float> %vf, i32 3
2440  ret float %vecext
2441
2442
2443}
2444
2445; Function Attrs: norecurse nounwind readnone
2446define float @getvelf(<4 x float> %vf, i32 signext %i) {
2447; CHECK-LABEL: getvelf:
2448; CHECK:       # %bb.0: # %entry
2449; CHECK-NEXT:    sldi r3, r5, 2
2450; CHECK-NEXT:    lvsl v3, 0, r3
2451; CHECK-NEXT:    vperm v2, v2, v2, v3
2452; CHECK-NEXT:    xscvspdpn f1, v2
2453; CHECK-NEXT:    blr
2454;
2455; CHECK-LE-LABEL: getvelf:
2456; CHECK-LE:       # %bb.0: # %entry
2457; CHECK-LE-NEXT:    xori r3, r5, 3
2458; CHECK-LE-NEXT:    sldi r3, r3, 2
2459; CHECK-LE-NEXT:    lvsl v3, 0, r3
2460; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2461; CHECK-LE-NEXT:    xscvspdpn f1, v2
2462; CHECK-LE-NEXT:    blr
2463;
2464; CHECK-AIX-LABEL: getvelf:
2465; CHECK-AIX:       # %bb.0: # %entry
2466; CHECK-AIX-NEXT:    sldi 3, 3, 2
2467; CHECK-AIX-NEXT:    lvsl 3, 0, 3
2468; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
2469; CHECK-AIX-NEXT:    xscvspdpn 1, 34
2470; CHECK-AIX-NEXT:    blr
2471entry:
2472  %vecext = extractelement <4 x float> %vf, i32 %i
2473  ret float %vecext
2474; FIXME: add check patterns when variable element extraction is implemented
2475}
2476
2477; Function Attrs: norecurse nounwind readnone
2478define double @getd0(<2 x double> %vd) {
2479; CHECK-LABEL: getd0:
2480; CHECK:       # %bb.0: # %entry
2481; CHECK-NEXT:    xxlor f1, v2, v2
2482; CHECK-NEXT:    blr
2483;
2484; CHECK-LE-LABEL: getd0:
2485; CHECK-LE:       # %bb.0: # %entry
2486; CHECK-LE-NEXT:    xxswapd vs1, v2
2487; CHECK-LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2488; CHECK-LE-NEXT:    blr
2489;
2490; CHECK-AIX-LABEL: getd0:
2491; CHECK-AIX:       # %bb.0: # %entry
2492; CHECK-AIX-NEXT:    xxlor 1, 34, 34
2493; CHECK-AIX-NEXT:    blr
2494entry:
2495  %vecext = extractelement <2 x double> %vd, i32 0
2496  ret double %vecext
2497
2498
2499; CHECK-AIXT: xxlor 1, 34, 34
2500}
2501
2502; Function Attrs: norecurse nounwind readnone
2503define double @getd1(<2 x double> %vd) {
2504; CHECK-LABEL: getd1:
2505; CHECK:       # %bb.0: # %entry
2506; CHECK-NEXT:    xxswapd vs1, v2
2507; CHECK-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2508; CHECK-NEXT:    blr
2509;
2510; CHECK-LE-LABEL: getd1:
2511; CHECK-LE:       # %bb.0: # %entry
2512; CHECK-LE-NEXT:    xxlor f1, v2, v2
2513; CHECK-LE-NEXT:    blr
2514;
2515; CHECK-AIX-LABEL: getd1:
2516; CHECK-AIX:       # %bb.0: # %entry
2517; CHECK-AIX-NEXT:    xxswapd 1, 34
2518; CHECK-AIX-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2519; CHECK-AIX-NEXT:    blr
2520entry:
2521  %vecext = extractelement <2 x double> %vd, i32 1
2522  ret double %vecext
2523
2524
2525}
2526
2527; Function Attrs: norecurse nounwind readnone
2528define double @getveld(<2 x double> %vd, i32 signext %i) {
2529; CHECK-LABEL: getveld:
2530; CHECK:       # %bb.0: # %entry
2531; CHECK-NEXT:    andi. r3, r5, 1
2532; CHECK-NEXT:    sldi r3, r3, 3
2533; CHECK-NEXT:    lvsl v3, 0, r3
2534; CHECK-NEXT:    vperm v2, v2, v2, v3
2535; CHECK-NEXT:    xxlor vs1, v2, v2
2536; CHECK-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2537; CHECK-NEXT:    blr
2538;
2539; CHECK-LE-LABEL: getveld:
2540; CHECK-LE:       # %bb.0: # %entry
2541; CHECK-LE-NEXT:    li r3, 1
2542; CHECK-LE-NEXT:    andc r3, r3, r5
2543; CHECK-LE-NEXT:    sldi r3, r3, 3
2544; CHECK-LE-NEXT:    lvsl v3, 0, r3
2545; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2546; CHECK-LE-NEXT:    xxlor vs1, v2, v2
2547; CHECK-LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2548; CHECK-LE-NEXT:    blr
2549;
2550; CHECK-AIX-LABEL: getveld:
2551; CHECK-AIX:       # %bb.0: # %entry
2552; CHECK-AIX-NEXT:    andi. 3, 3, 1
2553; CHECK-AIX-NEXT:    sldi 3, 3, 3
2554; CHECK-AIX-NEXT:    lvsl 3, 0, 3
2555; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
2556; CHECK-AIX-NEXT:    xxlor 1, 34, 34
2557; CHECK-AIX-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2558; CHECK-AIX-NEXT:    blr
2559entry:
2560  %vecext = extractelement <2 x double> %vd, i32 %i
2561  ret double %vecext
2562; FIXME: add check patterns when variable element extraction is implemented
2563}
2564