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) # @d
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; Function Attrs: norecurse nounwind readnone
762define zeroext i8 @getuc3(<16 x i8> %vuc) {
763; CHECK-LABEL: getuc3:
764; CHECK:       # %bb.0: # %entry
765; CHECK-NEXT:    mfvsrd r3, v2
766; CHECK-NEXT:    rldicl r3, r3, 32, 56
767; CHECK-NEXT:    clrldi r3, r3, 56
768; CHECK-NEXT:    blr
769;
770; CHECK-LE-LABEL: getuc3:
771; CHECK-LE:       # %bb.0: # %entry
772; CHECK-LE-NEXT:    xxswapd vs0, v2
773; CHECK-LE-NEXT:    mffprd r3, f0
774; CHECK-LE-NEXT:    rldicl r3, r3, 40, 56
775; CHECK-LE-NEXT:    clrldi r3, r3, 56
776; CHECK-LE-NEXT:    blr
777;
778; CHECK-AIX-LABEL: getuc3:
779; CHECK-AIX:       # %bb.0: # %entry
780; CHECK-AIX-NEXT:    mfvsrd 3, 34
781; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 56
782; CHECK-AIX-NEXT:    clrldi 3, 3, 56
783; CHECK-AIX-NEXT:    blr
784entry:
785  %vecext = extractelement <16 x i8> %vuc, i32 3
786  ret i8 %vecext
787
788
789}
790
791; Function Attrs: norecurse nounwind readnone
792define zeroext i8 @getuc4(<16 x i8> %vuc) {
793; CHECK-LABEL: getuc4:
794; CHECK:       # %bb.0: # %entry
795; CHECK-NEXT:    mfvsrd r3, v2
796; CHECK-NEXT:    rldicl r3, r3, 40, 56
797; CHECK-NEXT:    clrldi r3, r3, 56
798; CHECK-NEXT:    blr
799;
800; CHECK-LE-LABEL: getuc4:
801; CHECK-LE:       # %bb.0: # %entry
802; CHECK-LE-NEXT:    xxswapd vs0, v2
803; CHECK-LE-NEXT:    mffprd r3, f0
804; CHECK-LE-NEXT:    rldicl r3, r3, 32, 56
805; CHECK-LE-NEXT:    clrldi r3, r3, 56
806; CHECK-LE-NEXT:    blr
807;
808; CHECK-AIX-LABEL: getuc4:
809; CHECK-AIX:       # %bb.0: # %entry
810; CHECK-AIX-NEXT:    mfvsrd 3, 34
811; CHECK-AIX-NEXT:    rldicl 3, 3, 40, 56
812; CHECK-AIX-NEXT:    clrldi 3, 3, 56
813; CHECK-AIX-NEXT:    blr
814entry:
815  %vecext = extractelement <16 x i8> %vuc, i32 4
816  ret i8 %vecext
817
818
819}
820
821; Function Attrs: norecurse nounwind readnone
822define zeroext i8 @getuc5(<16 x i8> %vuc) {
823; CHECK-LABEL: getuc5:
824; CHECK:       # %bb.0: # %entry
825; CHECK-NEXT:    mfvsrd r3, v2
826; CHECK-NEXT:    rldicl r3, r3, 48, 56
827; CHECK-NEXT:    clrldi r3, r3, 56
828; CHECK-NEXT:    blr
829;
830; CHECK-LE-LABEL: getuc5:
831; CHECK-LE:       # %bb.0: # %entry
832; CHECK-LE-NEXT:    xxswapd vs0, v2
833; CHECK-LE-NEXT:    mffprd r3, f0
834; CHECK-LE-NEXT:    rldicl r3, r3, 24, 56
835; CHECK-LE-NEXT:    clrldi r3, r3, 56
836; CHECK-LE-NEXT:    blr
837;
838; CHECK-AIX-LABEL: getuc5:
839; CHECK-AIX:       # %bb.0: # %entry
840; CHECK-AIX-NEXT:    mfvsrd 3, 34
841; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 56
842; CHECK-AIX-NEXT:    clrldi 3, 3, 56
843; CHECK-AIX-NEXT:    blr
844entry:
845  %vecext = extractelement <16 x i8> %vuc, i32 5
846  ret i8 %vecext
847
848
849}
850
851; Function Attrs: norecurse nounwind readnone
852define zeroext i8 @getuc6(<16 x i8> %vuc) {
853; CHECK-LABEL: getuc6:
854; CHECK:       # %bb.0: # %entry
855; CHECK-NEXT:    mfvsrd r3, v2
856; CHECK-NEXT:    rldicl r3, r3, 56, 56
857; CHECK-NEXT:    clrldi r3, r3, 56
858; CHECK-NEXT:    blr
859;
860; CHECK-LE-LABEL: getuc6:
861; CHECK-LE:       # %bb.0: # %entry
862; CHECK-LE-NEXT:    xxswapd vs0, v2
863; CHECK-LE-NEXT:    mffprd r3, f0
864; CHECK-LE-NEXT:    rldicl r3, r3, 16, 56
865; CHECK-LE-NEXT:    clrldi r3, r3, 56
866; CHECK-LE-NEXT:    blr
867;
868; CHECK-AIX-LABEL: getuc6:
869; CHECK-AIX:       # %bb.0: # %entry
870; CHECK-AIX-NEXT:    mfvsrd 3, 34
871; CHECK-AIX-NEXT:    rldicl 3, 3, 56, 56
872; CHECK-AIX-NEXT:    clrldi 3, 3, 56
873; CHECK-AIX-NEXT:    blr
874entry:
875  %vecext = extractelement <16 x i8> %vuc, i32 6
876  ret i8 %vecext
877
878
879}
880
881; Function Attrs: norecurse nounwind readnone
882define zeroext i8 @getuc7(<16 x i8> %vuc) {
883; CHECK-LABEL: getuc7:
884; CHECK:       # %bb.0: # %entry
885; CHECK-NEXT:    mfvsrd r3, v2
886; CHECK-NEXT:    clrldi r3, r3, 56
887; CHECK-NEXT:    clrldi r3, r3, 56
888; CHECK-NEXT:    blr
889;
890; CHECK-LE-LABEL: getuc7:
891; CHECK-LE:       # %bb.0: # %entry
892; CHECK-LE-NEXT:    xxswapd vs0, v2
893; CHECK-LE-NEXT:    mffprd r3, f0
894; CHECK-LE-NEXT:    rldicl r3, r3, 8, 56
895; CHECK-LE-NEXT:    clrldi r3, r3, 56
896; CHECK-LE-NEXT:    blr
897;
898; CHECK-AIX-LABEL: getuc7:
899; CHECK-AIX:       # %bb.0: # %entry
900; CHECK-AIX-NEXT:    mfvsrd 3, 34
901; CHECK-AIX-NEXT:    clrldi 3, 3, 56
902; CHECK-AIX-NEXT:    clrldi 3, 3, 56
903; CHECK-AIX-NEXT:    blr
904entry:
905  %vecext = extractelement <16 x i8> %vuc, i32 7
906  ret i8 %vecext
907
908
909}
910
911; Function Attrs: norecurse nounwind readnone
912define zeroext i8 @getuc8(<16 x i8> %vuc) {
913; CHECK-LABEL: getuc8:
914; CHECK:       # %bb.0: # %entry
915; CHECK-NEXT:    xxswapd vs0, v2
916; CHECK-NEXT:    mffprd r3, f0
917; CHECK-NEXT:    rldicl r3, r3, 8, 56
918; CHECK-NEXT:    clrldi r3, r3, 56
919; CHECK-NEXT:    blr
920;
921; CHECK-LE-LABEL: getuc8:
922; CHECK-LE:       # %bb.0: # %entry
923; CHECK-LE-NEXT:    mfvsrd r3, v2
924; CHECK-LE-NEXT:    clrldi r3, r3, 56
925; CHECK-LE-NEXT:    clrldi r3, r3, 56
926; CHECK-LE-NEXT:    blr
927;
928; CHECK-AIX-LABEL: getuc8:
929; CHECK-AIX:       # %bb.0: # %entry
930; CHECK-AIX-NEXT:    xxswapd 0, 34
931; CHECK-AIX-NEXT:    mffprd 3, 0
932; CHECK-AIX-NEXT:    rldicl 3, 3, 8, 56
933; CHECK-AIX-NEXT:    clrldi 3, 3, 56
934; CHECK-AIX-NEXT:    blr
935entry:
936  %vecext = extractelement <16 x i8> %vuc, i32 8
937  ret i8 %vecext
938
939
940}
941
942; Function Attrs: norecurse nounwind readnone
943define zeroext i8 @getuc9(<16 x i8> %vuc) {
944; CHECK-LABEL: getuc9:
945; CHECK:       # %bb.0: # %entry
946; CHECK-NEXT:    xxswapd vs0, v2
947; CHECK-NEXT:    mffprd r3, f0
948; CHECK-NEXT:    rldicl r3, r3, 16, 56
949; CHECK-NEXT:    clrldi r3, r3, 56
950; CHECK-NEXT:    blr
951;
952; CHECK-LE-LABEL: getuc9:
953; CHECK-LE:       # %bb.0: # %entry
954; CHECK-LE-NEXT:    mfvsrd r3, v2
955; CHECK-LE-NEXT:    rldicl r3, r3, 56, 56
956; CHECK-LE-NEXT:    clrldi r3, r3, 56
957; CHECK-LE-NEXT:    blr
958;
959; CHECK-AIX-LABEL: getuc9:
960; CHECK-AIX:       # %bb.0: # %entry
961; CHECK-AIX-NEXT:    xxswapd 0, 34
962; CHECK-AIX-NEXT:    mffprd 3, 0
963; CHECK-AIX-NEXT:    rldicl 3, 3, 16, 56
964; CHECK-AIX-NEXT:    clrldi 3, 3, 56
965; CHECK-AIX-NEXT:    blr
966entry:
967  %vecext = extractelement <16 x i8> %vuc, i32 9
968  ret i8 %vecext
969
970
971}
972
973; Function Attrs: norecurse nounwind readnone
974define zeroext i8 @getuc10(<16 x i8> %vuc) {
975; CHECK-LABEL: getuc10:
976; CHECK:       # %bb.0: # %entry
977; CHECK-NEXT:    xxswapd vs0, v2
978; CHECK-NEXT:    mffprd r3, f0
979; CHECK-NEXT:    rldicl r3, r3, 24, 56
980; CHECK-NEXT:    clrldi r3, r3, 56
981; CHECK-NEXT:    blr
982;
983; CHECK-LE-LABEL: getuc10:
984; CHECK-LE:       # %bb.0: # %entry
985; CHECK-LE-NEXT:    mfvsrd r3, v2
986; CHECK-LE-NEXT:    rldicl r3, r3, 48, 56
987; CHECK-LE-NEXT:    clrldi r3, r3, 56
988; CHECK-LE-NEXT:    blr
989;
990; CHECK-AIX-LABEL: getuc10:
991; CHECK-AIX:       # %bb.0: # %entry
992; CHECK-AIX-NEXT:    xxswapd 0, 34
993; CHECK-AIX-NEXT:    mffprd 3, 0
994; CHECK-AIX-NEXT:    rldicl 3, 3, 24, 56
995; CHECK-AIX-NEXT:    clrldi 3, 3, 56
996; CHECK-AIX-NEXT:    blr
997entry:
998  %vecext = extractelement <16 x i8> %vuc, i32 10
999  ret i8 %vecext
1000
1001
1002}
1003
1004; Function Attrs: norecurse nounwind readnone
1005define zeroext i8 @getuc11(<16 x i8> %vuc) {
1006; CHECK-LABEL: getuc11:
1007; CHECK:       # %bb.0: # %entry
1008; CHECK-NEXT:    xxswapd vs0, v2
1009; CHECK-NEXT:    mffprd r3, f0
1010; CHECK-NEXT:    rldicl r3, r3, 32, 56
1011; CHECK-NEXT:    clrldi r3, r3, 56
1012; CHECK-NEXT:    blr
1013;
1014; CHECK-LE-LABEL: getuc11:
1015; CHECK-LE:       # %bb.0: # %entry
1016; CHECK-LE-NEXT:    mfvsrd r3, v2
1017; CHECK-LE-NEXT:    rldicl r3, r3, 40, 56
1018; CHECK-LE-NEXT:    clrldi r3, r3, 56
1019; CHECK-LE-NEXT:    blr
1020;
1021; CHECK-AIX-LABEL: getuc11:
1022; CHECK-AIX:       # %bb.0: # %entry
1023; CHECK-AIX-NEXT:    xxswapd 0, 34
1024; CHECK-AIX-NEXT:    mffprd 3, 0
1025; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 56
1026; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1027; CHECK-AIX-NEXT:    blr
1028entry:
1029  %vecext = extractelement <16 x i8> %vuc, i32 11
1030  ret i8 %vecext
1031
1032
1033}
1034
1035; Function Attrs: norecurse nounwind readnone
1036define zeroext i8 @getuc12(<16 x i8> %vuc) {
1037; CHECK-LABEL: getuc12:
1038; CHECK:       # %bb.0: # %entry
1039; CHECK-NEXT:    xxswapd vs0, v2
1040; CHECK-NEXT:    mffprd r3, f0
1041; CHECK-NEXT:    rldicl r3, r3, 40, 56
1042; CHECK-NEXT:    clrldi r3, r3, 56
1043; CHECK-NEXT:    blr
1044;
1045; CHECK-LE-LABEL: getuc12:
1046; CHECK-LE:       # %bb.0: # %entry
1047; CHECK-LE-NEXT:    mfvsrd r3, v2
1048; CHECK-LE-NEXT:    rldicl r3, r3, 32, 56
1049; CHECK-LE-NEXT:    clrldi r3, r3, 56
1050; CHECK-LE-NEXT:    blr
1051;
1052; CHECK-AIX-LABEL: getuc12:
1053; CHECK-AIX:       # %bb.0: # %entry
1054; CHECK-AIX-NEXT:    xxswapd 0, 34
1055; CHECK-AIX-NEXT:    mffprd 3, 0
1056; CHECK-AIX-NEXT:    rldicl 3, 3, 40, 56
1057; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1058; CHECK-AIX-NEXT:    blr
1059entry:
1060  %vecext = extractelement <16 x i8> %vuc, i32 12
1061  ret i8 %vecext
1062
1063
1064}
1065
1066; Function Attrs: norecurse nounwind readnone
1067define zeroext i8 @getuc13(<16 x i8> %vuc) {
1068; CHECK-LABEL: getuc13:
1069; CHECK:       # %bb.0: # %entry
1070; CHECK-NEXT:    xxswapd vs0, v2
1071; CHECK-NEXT:    mffprd r3, f0
1072; CHECK-NEXT:    rldicl r3, r3, 48, 56
1073; CHECK-NEXT:    clrldi r3, r3, 56
1074; CHECK-NEXT:    blr
1075;
1076; CHECK-LE-LABEL: getuc13:
1077; CHECK-LE:       # %bb.0: # %entry
1078; CHECK-LE-NEXT:    mfvsrd r3, v2
1079; CHECK-LE-NEXT:    rldicl r3, r3, 24, 56
1080; CHECK-LE-NEXT:    clrldi r3, r3, 56
1081; CHECK-LE-NEXT:    blr
1082;
1083; CHECK-AIX-LABEL: getuc13:
1084; CHECK-AIX:       # %bb.0: # %entry
1085; CHECK-AIX-NEXT:    xxswapd 0, 34
1086; CHECK-AIX-NEXT:    mffprd 3, 0
1087; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 56
1088; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1089; CHECK-AIX-NEXT:    blr
1090entry:
1091  %vecext = extractelement <16 x i8> %vuc, i32 13
1092  ret i8 %vecext
1093
1094
1095}
1096
1097; Function Attrs: norecurse nounwind readnone
1098define zeroext i8 @getuc14(<16 x i8> %vuc) {
1099; CHECK-LABEL: getuc14:
1100; CHECK:       # %bb.0: # %entry
1101; CHECK-NEXT:    xxswapd vs0, v2
1102; CHECK-NEXT:    mffprd r3, f0
1103; CHECK-NEXT:    rldicl r3, r3, 56, 56
1104; CHECK-NEXT:    clrldi r3, r3, 56
1105; CHECK-NEXT:    blr
1106;
1107; CHECK-LE-LABEL: getuc14:
1108; CHECK-LE:       # %bb.0: # %entry
1109; CHECK-LE-NEXT:    mfvsrd r3, v2
1110; CHECK-LE-NEXT:    rldicl r3, r3, 16, 56
1111; CHECK-LE-NEXT:    clrldi r3, r3, 56
1112; CHECK-LE-NEXT:    blr
1113;
1114; CHECK-AIX-LABEL: getuc14:
1115; CHECK-AIX:       # %bb.0: # %entry
1116; CHECK-AIX-NEXT:    xxswapd 0, 34
1117; CHECK-AIX-NEXT:    mffprd 3, 0
1118; CHECK-AIX-NEXT:    rldicl 3, 3, 56, 56
1119; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1120; CHECK-AIX-NEXT:    blr
1121entry:
1122  %vecext = extractelement <16 x i8> %vuc, i32 14
1123  ret i8 %vecext
1124
1125
1126}
1127
1128; Function Attrs: norecurse nounwind readnone
1129define zeroext i8 @getuc15(<16 x i8> %vuc) {
1130; CHECK-LABEL: getuc15:
1131; CHECK:       # %bb.0: # %entry
1132; CHECK-NEXT:    xxswapd vs0, v2
1133; CHECK-NEXT:    mffprd r3, f0
1134; CHECK-NEXT:    clrldi r3, r3, 56
1135; CHECK-NEXT:    clrldi r3, r3, 56
1136; CHECK-NEXT:    blr
1137;
1138; CHECK-LE-LABEL: getuc15:
1139; CHECK-LE:       # %bb.0: # %entry
1140; CHECK-LE-NEXT:    mfvsrd r3, v2
1141; CHECK-LE-NEXT:    rldicl r3, r3, 8, 56
1142; CHECK-LE-NEXT:    clrldi r3, r3, 56
1143; CHECK-LE-NEXT:    blr
1144;
1145; CHECK-AIX-LABEL: getuc15:
1146; CHECK-AIX:       # %bb.0: # %entry
1147; CHECK-AIX-NEXT:    xxswapd 0, 34
1148; CHECK-AIX-NEXT:    mffprd 3, 0
1149; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1150; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1151; CHECK-AIX-NEXT:    blr
1152entry:
1153  %vecext = extractelement <16 x i8> %vuc, i32 15
1154  ret i8 %vecext
1155
1156
1157}
1158
1159; Function Attrs: norecurse nounwind readnone
1160define signext i8 @getvelsc(<16 x i8> %vsc, i32 signext %i) {
1161; CHECK-LABEL: getvelsc:
1162; CHECK:       # %bb.0: # %entry
1163; CHECK-NEXT:    andi. r4, r5, 8
1164; CHECK-NEXT:    li r3, 7
1165; CHECK-NEXT:    lvsl v3, 0, r4
1166; CHECK-NEXT:    andc r3, r3, r5
1167; CHECK-NEXT:    sldi r3, r3, 3
1168; CHECK-NEXT:    vperm v2, v2, v2, v3
1169; CHECK-NEXT:    mfvsrd r4, v2
1170; CHECK-NEXT:    srd r3, r4, r3
1171; CHECK-NEXT:    extsb r3, r3
1172; CHECK-NEXT:    blr
1173;
1174; CHECK-LE-LABEL: getvelsc:
1175; CHECK-LE:       # %bb.0: # %entry
1176; CHECK-LE-NEXT:    li r3, 8
1177; CHECK-LE-NEXT:    andc r3, r3, r5
1178; CHECK-LE-NEXT:    lvsl v3, 0, r3
1179; CHECK-LE-NEXT:    li r3, 7
1180; CHECK-LE-NEXT:    and r3, r3, r5
1181; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
1182; CHECK-LE-NEXT:    sldi r3, r3, 3
1183; CHECK-LE-NEXT:    mfvsrd r4, v2
1184; CHECK-LE-NEXT:    srd r3, r4, r3
1185; CHECK-LE-NEXT:    extsb r3, r3
1186; CHECK-LE-NEXT:    blr
1187;
1188; CHECK-AIX-LABEL: getvelsc:
1189; CHECK-AIX:       # %bb.0: # %entry
1190; CHECK-AIX-NEXT:    andi. 5, 3, 8
1191; CHECK-AIX-NEXT:    li 4, 7
1192; CHECK-AIX-NEXT:    lvsl 3, 0, 5
1193; CHECK-AIX-NEXT:    andc 3, 4, 3
1194; CHECK-AIX-NEXT:    sldi 3, 3, 3
1195; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
1196; CHECK-AIX-NEXT:    mfvsrd 4, 34
1197; CHECK-AIX-NEXT:    srd 3, 4, 3
1198; CHECK-AIX-NEXT:    extsb 3, 3
1199; CHECK-AIX-NEXT:    blr
1200
1201
1202entry:
1203  %vecext = extractelement <16 x i8> %vsc, i32 %i
1204  ret i8 %vecext
1205}
1206
1207; Function Attrs: norecurse nounwind readnone
1208define zeroext i8 @getveluc(<16 x i8> %vuc, i32 signext %i) {
1209; CHECK-LABEL: getveluc:
1210; CHECK:       # %bb.0: # %entry
1211; CHECK-NEXT:    andi. r4, r5, 8
1212; CHECK-NEXT:    li r3, 7
1213; CHECK-NEXT:    lvsl v3, 0, r4
1214; CHECK-NEXT:    andc r3, r3, r5
1215; CHECK-NEXT:    sldi r3, r3, 3
1216; CHECK-NEXT:    vperm v2, v2, v2, v3
1217; CHECK-NEXT:    mfvsrd r4, v2
1218; CHECK-NEXT:    srd r3, r4, r3
1219; CHECK-NEXT:    clrldi r3, r3, 56
1220; CHECK-NEXT:    blr
1221;
1222; CHECK-LE-LABEL: getveluc:
1223; CHECK-LE:       # %bb.0: # %entry
1224; CHECK-LE-NEXT:    li r3, 8
1225; CHECK-LE-NEXT:    andc r3, r3, r5
1226; CHECK-LE-NEXT:    lvsl v3, 0, r3
1227; CHECK-LE-NEXT:    li r3, 7
1228; CHECK-LE-NEXT:    and r3, r3, r5
1229; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
1230; CHECK-LE-NEXT:    sldi r3, r3, 3
1231; CHECK-LE-NEXT:    mfvsrd r4, v2
1232; CHECK-LE-NEXT:    srd r3, r4, r3
1233; CHECK-LE-NEXT:    clrldi r3, r3, 56
1234; CHECK-LE-NEXT:    blr
1235;
1236; CHECK-AIX-LABEL: getveluc:
1237; CHECK-AIX:       # %bb.0: # %entry
1238; CHECK-AIX-NEXT:    andi. 5, 3, 8
1239; CHECK-AIX-NEXT:    li 4, 7
1240; CHECK-AIX-NEXT:    lvsl 3, 0, 5
1241; CHECK-AIX-NEXT:    andc 3, 4, 3
1242; CHECK-AIX-NEXT:    sldi 3, 3, 3
1243; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
1244; CHECK-AIX-NEXT:    mfvsrd 4, 34
1245; CHECK-AIX-NEXT:    srd 3, 4, 3
1246; CHECK-AIX-NEXT:    clrldi 3, 3, 56
1247; CHECK-AIX-NEXT:    blr
1248
1249
1250entry:
1251  %vecext = extractelement <16 x i8> %vuc, i32 %i
1252  ret i8 %vecext
1253}
1254
1255; Function Attrs: norecurse nounwind readnone
1256define signext i16 @getss0(<8 x i16> %vss) {
1257; CHECK-LABEL: getss0:
1258; CHECK:       # %bb.0: # %entry
1259; CHECK-NEXT:    mfvsrd r3, v2
1260; CHECK-NEXT:    rldicl r3, r3, 16, 48
1261; CHECK-NEXT:    extsh r3, r3
1262; CHECK-NEXT:    blr
1263;
1264; CHECK-LE-LABEL: getss0:
1265; CHECK-LE:       # %bb.0: # %entry
1266; CHECK-LE-NEXT:    xxswapd vs0, v2
1267; CHECK-LE-NEXT:    mffprd r3, f0
1268; CHECK-LE-NEXT:    clrldi r3, r3, 48
1269; CHECK-LE-NEXT:    extsh r3, r3
1270; CHECK-LE-NEXT:    blr
1271;
1272; CHECK-AIX-LABEL: getss0:
1273; CHECK-AIX:       # %bb.0: # %entry
1274; CHECK-AIX-NEXT:    mfvsrd 3, 34
1275; CHECK-AIX-NEXT:    rldicl 3, 3, 16, 48
1276; CHECK-AIX-NEXT:    extsh 3, 3
1277; CHECK-AIX-NEXT:    blr
1278entry:
1279  %vecext = extractelement <8 x i16> %vss, i32 0
1280  ret i16 %vecext
1281
1282
1283}
1284
1285; Function Attrs: norecurse nounwind readnone
1286define signext i16 @getss1(<8 x i16> %vss) {
1287; CHECK-LABEL: getss1:
1288; CHECK:       # %bb.0: # %entry
1289; CHECK-NEXT:    mfvsrd r3, v2
1290; CHECK-NEXT:    rldicl r3, r3, 32, 48
1291; CHECK-NEXT:    extsh r3, r3
1292; CHECK-NEXT:    blr
1293;
1294; CHECK-LE-LABEL: getss1:
1295; CHECK-LE:       # %bb.0: # %entry
1296; CHECK-LE-NEXT:    xxswapd vs0, v2
1297; CHECK-LE-NEXT:    mffprd r3, f0
1298; CHECK-LE-NEXT:    rldicl r3, r3, 48, 48
1299; CHECK-LE-NEXT:    extsh r3, r3
1300; CHECK-LE-NEXT:    blr
1301;
1302; CHECK-AIX-LABEL: getss1:
1303; CHECK-AIX:       # %bb.0: # %entry
1304; CHECK-AIX-NEXT:    mfvsrd 3, 34
1305; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 48
1306; CHECK-AIX-NEXT:    extsh 3, 3
1307; CHECK-AIX-NEXT:    blr
1308entry:
1309  %vecext = extractelement <8 x i16> %vss, i32 1
1310  ret i16 %vecext
1311
1312
1313}
1314
1315; Function Attrs: norecurse nounwind readnone
1316define signext i16 @getss2(<8 x i16> %vss) {
1317; CHECK-LABEL: getss2:
1318; CHECK:       # %bb.0: # %entry
1319; CHECK-NEXT:    mfvsrd r3, v2
1320; CHECK-NEXT:    rldicl r3, r3, 48, 48
1321; CHECK-NEXT:    extsh r3, r3
1322; CHECK-NEXT:    blr
1323;
1324; CHECK-LE-LABEL: getss2:
1325; CHECK-LE:       # %bb.0: # %entry
1326; CHECK-LE-NEXT:    xxswapd vs0, v2
1327; CHECK-LE-NEXT:    mffprd r3, f0
1328; CHECK-LE-NEXT:    rldicl r3, r3, 32, 48
1329; CHECK-LE-NEXT:    extsh r3, r3
1330; CHECK-LE-NEXT:    blr
1331;
1332; CHECK-AIX-LABEL: getss2:
1333; CHECK-AIX:       # %bb.0: # %entry
1334; CHECK-AIX-NEXT:    mfvsrd 3, 34
1335; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 48
1336; CHECK-AIX-NEXT:    extsh 3, 3
1337; CHECK-AIX-NEXT:    blr
1338entry:
1339  %vecext = extractelement <8 x i16> %vss, i32 2
1340  ret i16 %vecext
1341
1342
1343}
1344
1345; Function Attrs: norecurse nounwind readnone
1346define signext i16 @getss3(<8 x i16> %vss) {
1347; CHECK-LABEL: getss3:
1348; CHECK:       # %bb.0: # %entry
1349; CHECK-NEXT:    mfvsrd r3, v2
1350; CHECK-NEXT:    clrldi r3, r3, 48
1351; CHECK-NEXT:    extsh r3, r3
1352; CHECK-NEXT:    blr
1353;
1354; CHECK-LE-LABEL: getss3:
1355; CHECK-LE:       # %bb.0: # %entry
1356; CHECK-LE-NEXT:    xxswapd vs0, v2
1357; CHECK-LE-NEXT:    mffprd r3, f0
1358; CHECK-LE-NEXT:    rldicl r3, r3, 16, 48
1359; CHECK-LE-NEXT:    extsh r3, r3
1360; CHECK-LE-NEXT:    blr
1361;
1362; CHECK-AIX-LABEL: getss3:
1363; CHECK-AIX:       # %bb.0: # %entry
1364; CHECK-AIX-NEXT:    mfvsrd 3, 34
1365; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1366; CHECK-AIX-NEXT:    extsh 3, 3
1367; CHECK-AIX-NEXT:    blr
1368entry:
1369  %vecext = extractelement <8 x i16> %vss, i32 3
1370  ret i16 %vecext
1371
1372
1373}
1374
1375; Function Attrs: norecurse nounwind readnone
1376define signext i16 @getss4(<8 x i16> %vss) {
1377; CHECK-LABEL: getss4:
1378; CHECK:       # %bb.0: # %entry
1379; CHECK-NEXT:    xxswapd vs0, v2
1380; CHECK-NEXT:    mffprd r3, f0
1381; CHECK-NEXT:    rldicl r3, r3, 16, 48
1382; CHECK-NEXT:    extsh r3, r3
1383; CHECK-NEXT:    blr
1384;
1385; CHECK-LE-LABEL: getss4:
1386; CHECK-LE:       # %bb.0: # %entry
1387; CHECK-LE-NEXT:    mfvsrd r3, v2
1388; CHECK-LE-NEXT:    clrldi r3, r3, 48
1389; CHECK-LE-NEXT:    extsh r3, r3
1390; CHECK-LE-NEXT:    blr
1391;
1392; CHECK-AIX-LABEL: getss4:
1393; CHECK-AIX:       # %bb.0: # %entry
1394; CHECK-AIX-NEXT:    xxswapd 0, 34
1395; CHECK-AIX-NEXT:    mffprd 3, 0
1396; CHECK-AIX-NEXT:    rldicl 3, 3, 16, 48
1397; CHECK-AIX-NEXT:    extsh 3, 3
1398; CHECK-AIX-NEXT:    blr
1399entry:
1400  %vecext = extractelement <8 x i16> %vss, i32 4
1401  ret i16 %vecext
1402
1403
1404}
1405
1406; Function Attrs: norecurse nounwind readnone
1407define signext i16 @getss5(<8 x i16> %vss) {
1408; CHECK-LABEL: getss5:
1409; CHECK:       # %bb.0: # %entry
1410; CHECK-NEXT:    xxswapd vs0, v2
1411; CHECK-NEXT:    mffprd r3, f0
1412; CHECK-NEXT:    rldicl r3, r3, 32, 48
1413; CHECK-NEXT:    extsh r3, r3
1414; CHECK-NEXT:    blr
1415;
1416; CHECK-LE-LABEL: getss5:
1417; CHECK-LE:       # %bb.0: # %entry
1418; CHECK-LE-NEXT:    mfvsrd r3, v2
1419; CHECK-LE-NEXT:    rldicl r3, r3, 48, 48
1420; CHECK-LE-NEXT:    extsh r3, r3
1421; CHECK-LE-NEXT:    blr
1422;
1423; CHECK-AIX-LABEL: getss5:
1424; CHECK-AIX:       # %bb.0: # %entry
1425; CHECK-AIX-NEXT:    xxswapd 0, 34
1426; CHECK-AIX-NEXT:    mffprd 3, 0
1427; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 48
1428; CHECK-AIX-NEXT:    extsh 3, 3
1429; CHECK-AIX-NEXT:    blr
1430entry:
1431  %vecext = extractelement <8 x i16> %vss, i32 5
1432  ret i16 %vecext
1433
1434
1435}
1436
1437; Function Attrs: norecurse nounwind readnone
1438define signext i16 @getss6(<8 x i16> %vss) {
1439; CHECK-LABEL: getss6:
1440; CHECK:       # %bb.0: # %entry
1441; CHECK-NEXT:    xxswapd vs0, v2
1442; CHECK-NEXT:    mffprd r3, f0
1443; CHECK-NEXT:    rldicl r3, r3, 48, 48
1444; CHECK-NEXT:    extsh r3, r3
1445; CHECK-NEXT:    blr
1446;
1447; CHECK-LE-LABEL: getss6:
1448; CHECK-LE:       # %bb.0: # %entry
1449; CHECK-LE-NEXT:    mfvsrd r3, v2
1450; CHECK-LE-NEXT:    rldicl r3, r3, 32, 48
1451; CHECK-LE-NEXT:    extsh r3, r3
1452; CHECK-LE-NEXT:    blr
1453;
1454; CHECK-AIX-LABEL: getss6:
1455; CHECK-AIX:       # %bb.0: # %entry
1456; CHECK-AIX-NEXT:    xxswapd 0, 34
1457; CHECK-AIX-NEXT:    mffprd 3, 0
1458; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 48
1459; CHECK-AIX-NEXT:    extsh 3, 3
1460; CHECK-AIX-NEXT:    blr
1461entry:
1462  %vecext = extractelement <8 x i16> %vss, i32 6
1463  ret i16 %vecext
1464
1465
1466}
1467
1468; Function Attrs: norecurse nounwind readnone
1469define signext i16 @getss7(<8 x i16> %vss) {
1470; CHECK-LABEL: getss7:
1471; CHECK:       # %bb.0: # %entry
1472; CHECK-NEXT:    xxswapd vs0, v2
1473; CHECK-NEXT:    mffprd r3, f0
1474; CHECK-NEXT:    clrldi r3, r3, 48
1475; CHECK-NEXT:    extsh r3, r3
1476; CHECK-NEXT:    blr
1477;
1478; CHECK-LE-LABEL: getss7:
1479; CHECK-LE:       # %bb.0: # %entry
1480; CHECK-LE-NEXT:    mfvsrd r3, v2
1481; CHECK-LE-NEXT:    rldicl r3, r3, 16, 48
1482; CHECK-LE-NEXT:    extsh r3, r3
1483; CHECK-LE-NEXT:    blr
1484;
1485; CHECK-AIX-LABEL: getss7:
1486; CHECK-AIX:       # %bb.0: # %entry
1487; CHECK-AIX-NEXT:    xxswapd 0, 34
1488; CHECK-AIX-NEXT:    mffprd 3, 0
1489; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1490; CHECK-AIX-NEXT:    extsh 3, 3
1491; CHECK-AIX-NEXT:    blr
1492entry:
1493  %vecext = extractelement <8 x i16> %vss, i32 7
1494  ret i16 %vecext
1495
1496
1497}
1498
1499; Function Attrs: norecurse nounwind readnone
1500define zeroext i16 @getus0(<8 x i16> %vus) {
1501; CHECK-LABEL: getus0:
1502; CHECK:       # %bb.0: # %entry
1503; CHECK-NEXT:    mfvsrd r3, v2
1504; CHECK-NEXT:    rldicl r3, r3, 16, 48
1505; CHECK-NEXT:    clrldi r3, r3, 48
1506; CHECK-NEXT:    blr
1507;
1508; CHECK-LE-LABEL: getus0:
1509; CHECK-LE:       # %bb.0: # %entry
1510; CHECK-LE-NEXT:    xxswapd vs0, v2
1511; CHECK-LE-NEXT:    mffprd r3, f0
1512; CHECK-LE-NEXT:    clrldi r3, r3, 48
1513; CHECK-LE-NEXT:    clrldi r3, r3, 48
1514; CHECK-LE-NEXT:    blr
1515;
1516; CHECK-AIX-LABEL: getus0:
1517; CHECK-AIX:       # %bb.0: # %entry
1518; CHECK-AIX-NEXT:    mfvsrd 3, 34
1519; CHECK-AIX-NEXT:    rldicl 3, 3, 16, 48
1520; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1521; CHECK-AIX-NEXT:    blr
1522entry:
1523  %vecext = extractelement <8 x i16> %vus, i32 0
1524  ret i16 %vecext
1525
1526
1527}
1528
1529; Function Attrs: norecurse nounwind readnone
1530define zeroext i16 @getus1(<8 x i16> %vus) {
1531; CHECK-LABEL: getus1:
1532; CHECK:       # %bb.0: # %entry
1533; CHECK-NEXT:    mfvsrd r3, v2
1534; CHECK-NEXT:    rldicl r3, r3, 32, 48
1535; CHECK-NEXT:    clrldi r3, r3, 48
1536; CHECK-NEXT:    blr
1537;
1538; CHECK-LE-LABEL: getus1:
1539; CHECK-LE:       # %bb.0: # %entry
1540; CHECK-LE-NEXT:    xxswapd vs0, v2
1541; CHECK-LE-NEXT:    mffprd r3, f0
1542; CHECK-LE-NEXT:    rldicl r3, r3, 48, 48
1543; CHECK-LE-NEXT:    clrldi r3, r3, 48
1544; CHECK-LE-NEXT:    blr
1545;
1546; CHECK-AIX-LABEL: getus1:
1547; CHECK-AIX:       # %bb.0: # %entry
1548; CHECK-AIX-NEXT:    mfvsrd 3, 34
1549; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 48
1550; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1551; CHECK-AIX-NEXT:    blr
1552entry:
1553  %vecext = extractelement <8 x i16> %vus, i32 1
1554  ret i16 %vecext
1555
1556
1557}
1558
1559; Function Attrs: norecurse nounwind readnone
1560define zeroext i16 @getus2(<8 x i16> %vus) {
1561; CHECK-LABEL: getus2:
1562; CHECK:       # %bb.0: # %entry
1563; CHECK-NEXT:    mfvsrd r3, v2
1564; CHECK-NEXT:    rldicl r3, r3, 48, 48
1565; CHECK-NEXT:    clrldi r3, r3, 48
1566; CHECK-NEXT:    blr
1567;
1568; CHECK-LE-LABEL: getus2:
1569; CHECK-LE:       # %bb.0: # %entry
1570; CHECK-LE-NEXT:    xxswapd vs0, v2
1571; CHECK-LE-NEXT:    mffprd r3, f0
1572; CHECK-LE-NEXT:    rldicl r3, r3, 32, 48
1573; CHECK-LE-NEXT:    clrldi r3, r3, 48
1574; CHECK-LE-NEXT:    blr
1575;
1576; CHECK-AIX-LABEL: getus2:
1577; CHECK-AIX:       # %bb.0: # %entry
1578; CHECK-AIX-NEXT:    mfvsrd 3, 34
1579; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 48
1580; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1581; CHECK-AIX-NEXT:    blr
1582entry:
1583  %vecext = extractelement <8 x i16> %vus, i32 2
1584  ret i16 %vecext
1585
1586
1587}
1588
1589; Function Attrs: norecurse nounwind readnone
1590define zeroext i16 @getus3(<8 x i16> %vus) {
1591; CHECK-LABEL: getus3:
1592; CHECK:       # %bb.0: # %entry
1593; CHECK-NEXT:    mfvsrd r3, v2
1594; CHECK-NEXT:    clrldi r3, r3, 48
1595; CHECK-NEXT:    clrldi r3, r3, 48
1596; CHECK-NEXT:    blr
1597;
1598; CHECK-LE-LABEL: getus3:
1599; CHECK-LE:       # %bb.0: # %entry
1600; CHECK-LE-NEXT:    xxswapd vs0, v2
1601; CHECK-LE-NEXT:    mffprd r3, f0
1602; CHECK-LE-NEXT:    rldicl r3, r3, 16, 48
1603; CHECK-LE-NEXT:    clrldi r3, r3, 48
1604; CHECK-LE-NEXT:    blr
1605;
1606; CHECK-AIX-LABEL: getus3:
1607; CHECK-AIX:       # %bb.0: # %entry
1608; CHECK-AIX-NEXT:    mfvsrd 3, 34
1609; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1610; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1611; CHECK-AIX-NEXT:    blr
1612entry:
1613  %vecext = extractelement <8 x i16> %vus, i32 3
1614  ret i16 %vecext
1615
1616
1617}
1618
1619; Function Attrs: norecurse nounwind readnone
1620define zeroext i16 @getus4(<8 x i16> %vus) {
1621; CHECK-LABEL: getus4:
1622; CHECK:       # %bb.0: # %entry
1623; CHECK-NEXT:    xxswapd vs0, v2
1624; CHECK-NEXT:    mffprd r3, f0
1625; CHECK-NEXT:    rldicl r3, r3, 16, 48
1626; CHECK-NEXT:    clrldi r3, r3, 48
1627; CHECK-NEXT:    blr
1628;
1629; CHECK-LE-LABEL: getus4:
1630; CHECK-LE:       # %bb.0: # %entry
1631; CHECK-LE-NEXT:    mfvsrd r3, v2
1632; CHECK-LE-NEXT:    clrldi r3, r3, 48
1633; CHECK-LE-NEXT:    clrldi r3, r3, 48
1634; CHECK-LE-NEXT:    blr
1635;
1636; CHECK-AIX-LABEL: getus4:
1637; CHECK-AIX:       # %bb.0: # %entry
1638; CHECK-AIX-NEXT:    xxswapd 0, 34
1639; CHECK-AIX-NEXT:    mffprd 3, 0
1640; CHECK-AIX-NEXT:    rldicl 3, 3, 16, 48
1641; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1642; CHECK-AIX-NEXT:    blr
1643entry:
1644  %vecext = extractelement <8 x i16> %vus, i32 4
1645  ret i16 %vecext
1646
1647
1648}
1649
1650; Function Attrs: norecurse nounwind readnone
1651define zeroext i16 @getus5(<8 x i16> %vus) {
1652; CHECK-LABEL: getus5:
1653; CHECK:       # %bb.0: # %entry
1654; CHECK-NEXT:    xxswapd vs0, v2
1655; CHECK-NEXT:    mffprd r3, f0
1656; CHECK-NEXT:    rldicl r3, r3, 32, 48
1657; CHECK-NEXT:    clrldi r3, r3, 48
1658; CHECK-NEXT:    blr
1659;
1660; CHECK-LE-LABEL: getus5:
1661; CHECK-LE:       # %bb.0: # %entry
1662; CHECK-LE-NEXT:    mfvsrd r3, v2
1663; CHECK-LE-NEXT:    rldicl r3, r3, 48, 48
1664; CHECK-LE-NEXT:    clrldi r3, r3, 48
1665; CHECK-LE-NEXT:    blr
1666;
1667; CHECK-AIX-LABEL: getus5:
1668; CHECK-AIX:       # %bb.0: # %entry
1669; CHECK-AIX-NEXT:    xxswapd 0, 34
1670; CHECK-AIX-NEXT:    mffprd 3, 0
1671; CHECK-AIX-NEXT:    rldicl 3, 3, 32, 48
1672; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1673; CHECK-AIX-NEXT:    blr
1674entry:
1675  %vecext = extractelement <8 x i16> %vus, i32 5
1676  ret i16 %vecext
1677
1678
1679}
1680
1681; Function Attrs: norecurse nounwind readnone
1682define zeroext i16 @getus6(<8 x i16> %vus) {
1683; CHECK-LABEL: getus6:
1684; CHECK:       # %bb.0: # %entry
1685; CHECK-NEXT:    xxswapd vs0, v2
1686; CHECK-NEXT:    mffprd r3, f0
1687; CHECK-NEXT:    rldicl r3, r3, 48, 48
1688; CHECK-NEXT:    clrldi r3, r3, 48
1689; CHECK-NEXT:    blr
1690;
1691; CHECK-LE-LABEL: getus6:
1692; CHECK-LE:       # %bb.0: # %entry
1693; CHECK-LE-NEXT:    mfvsrd r3, v2
1694; CHECK-LE-NEXT:    rldicl r3, r3, 32, 48
1695; CHECK-LE-NEXT:    clrldi r3, r3, 48
1696; CHECK-LE-NEXT:    blr
1697;
1698; CHECK-AIX-LABEL: getus6:
1699; CHECK-AIX:       # %bb.0: # %entry
1700; CHECK-AIX-NEXT:    xxswapd 0, 34
1701; CHECK-AIX-NEXT:    mffprd 3, 0
1702; CHECK-AIX-NEXT:    rldicl 3, 3, 48, 48
1703; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1704; CHECK-AIX-NEXT:    blr
1705entry:
1706  %vecext = extractelement <8 x i16> %vus, i32 6
1707  ret i16 %vecext
1708
1709
1710}
1711
1712; Function Attrs: norecurse nounwind readnone
1713define zeroext i16 @getus7(<8 x i16> %vus) {
1714; CHECK-LABEL: getus7:
1715; CHECK:       # %bb.0: # %entry
1716; CHECK-NEXT:    xxswapd vs0, v2
1717; CHECK-NEXT:    mffprd r3, f0
1718; CHECK-NEXT:    clrldi r3, r3, 48
1719; CHECK-NEXT:    clrldi r3, r3, 48
1720; CHECK-NEXT:    blr
1721;
1722; CHECK-LE-LABEL: getus7:
1723; CHECK-LE:       # %bb.0: # %entry
1724; CHECK-LE-NEXT:    mfvsrd r3, v2
1725; CHECK-LE-NEXT:    rldicl r3, r3, 16, 48
1726; CHECK-LE-NEXT:    clrldi r3, r3, 48
1727; CHECK-LE-NEXT:    blr
1728;
1729; CHECK-AIX-LABEL: getus7:
1730; CHECK-AIX:       # %bb.0: # %entry
1731; CHECK-AIX-NEXT:    xxswapd 0, 34
1732; CHECK-AIX-NEXT:    mffprd 3, 0
1733; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1734; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1735; CHECK-AIX-NEXT:    blr
1736entry:
1737  %vecext = extractelement <8 x i16> %vus, i32 7
1738  ret i16 %vecext
1739
1740
1741}
1742
1743; Function Attrs: norecurse nounwind readnone
1744define signext i16 @getvelss(<8 x i16> %vss, i32 signext %i) {
1745; CHECK-LABEL: getvelss:
1746; CHECK:       # %bb.0: # %entry
1747; CHECK-NEXT:    andi. r4, r5, 4
1748; CHECK-NEXT:    li r3, 3
1749; CHECK-NEXT:    sldi r4, r4, 1
1750; CHECK-NEXT:    andc r3, r3, r5
1751; CHECK-NEXT:    lvsl v3, 0, r4
1752; CHECK-NEXT:    sldi r3, r3, 4
1753; CHECK-NEXT:    vperm v2, v2, v2, v3
1754; CHECK-NEXT:    mfvsrd r4, v2
1755; CHECK-NEXT:    srd r3, r4, r3
1756; CHECK-NEXT:    extsh r3, r3
1757; CHECK-NEXT:    blr
1758;
1759; CHECK-LE-LABEL: getvelss:
1760; CHECK-LE:       # %bb.0: # %entry
1761; CHECK-LE-NEXT:    li r3, 4
1762; CHECK-LE-NEXT:    andc r3, r3, r5
1763; CHECK-LE-NEXT:    sldi r3, r3, 1
1764; CHECK-LE-NEXT:    lvsl v3, 0, r3
1765; CHECK-LE-NEXT:    li r3, 3
1766; CHECK-LE-NEXT:    and r3, r3, r5
1767; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
1768; CHECK-LE-NEXT:    sldi r3, r3, 4
1769; CHECK-LE-NEXT:    mfvsrd r4, v2
1770; CHECK-LE-NEXT:    srd r3, r4, r3
1771; CHECK-LE-NEXT:    extsh r3, r3
1772; CHECK-LE-NEXT:    blr
1773;
1774; CHECK-AIX-LABEL: getvelss:
1775; CHECK-AIX:       # %bb.0: # %entry
1776; CHECK-AIX-NEXT:    andi. 5, 3, 4
1777; CHECK-AIX-NEXT:    li 4, 3
1778; CHECK-AIX-NEXT:    sldi 5, 5, 1
1779; CHECK-AIX-NEXT:    andc 3, 4, 3
1780; CHECK-AIX-NEXT:    lvsl 3, 0, 5
1781; CHECK-AIX-NEXT:    sldi 3, 3, 4
1782; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
1783; CHECK-AIX-NEXT:    mfvsrd 4, 34
1784; CHECK-AIX-NEXT:    srd 3, 4, 3
1785; CHECK-AIX-NEXT:    extsh 3, 3
1786; CHECK-AIX-NEXT:    blr
1787
1788
1789entry:
1790  %vecext = extractelement <8 x i16> %vss, i32 %i
1791  ret i16 %vecext
1792}
1793
1794; Function Attrs: norecurse nounwind readnone
1795define zeroext i16 @getvelus(<8 x i16> %vus, i32 signext %i) {
1796; CHECK-LABEL: getvelus:
1797; CHECK:       # %bb.0: # %entry
1798; CHECK-NEXT:    andi. r4, r5, 4
1799; CHECK-NEXT:    li r3, 3
1800; CHECK-NEXT:    sldi r4, r4, 1
1801; CHECK-NEXT:    andc r3, r3, r5
1802; CHECK-NEXT:    lvsl v3, 0, r4
1803; CHECK-NEXT:    sldi r3, r3, 4
1804; CHECK-NEXT:    vperm v2, v2, v2, v3
1805; CHECK-NEXT:    mfvsrd r4, v2
1806; CHECK-NEXT:    srd r3, r4, r3
1807; CHECK-NEXT:    clrldi r3, r3, 48
1808; CHECK-NEXT:    blr
1809;
1810; CHECK-LE-LABEL: getvelus:
1811; CHECK-LE:       # %bb.0: # %entry
1812; CHECK-LE-NEXT:    li r3, 4
1813; CHECK-LE-NEXT:    andc r3, r3, r5
1814; CHECK-LE-NEXT:    sldi r3, r3, 1
1815; CHECK-LE-NEXT:    lvsl v3, 0, r3
1816; CHECK-LE-NEXT:    li r3, 3
1817; CHECK-LE-NEXT:    and r3, r3, r5
1818; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
1819; CHECK-LE-NEXT:    sldi r3, r3, 4
1820; CHECK-LE-NEXT:    mfvsrd r4, v2
1821; CHECK-LE-NEXT:    srd r3, r4, r3
1822; CHECK-LE-NEXT:    clrldi r3, r3, 48
1823; CHECK-LE-NEXT:    blr
1824;
1825; CHECK-AIX-LABEL: getvelus:
1826; CHECK-AIX:       # %bb.0: # %entry
1827; CHECK-AIX-NEXT:    andi. 5, 3, 4
1828; CHECK-AIX-NEXT:    li 4, 3
1829; CHECK-AIX-NEXT:    sldi 5, 5, 1
1830; CHECK-AIX-NEXT:    andc 3, 4, 3
1831; CHECK-AIX-NEXT:    lvsl 3, 0, 5
1832; CHECK-AIX-NEXT:    sldi 3, 3, 4
1833; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
1834; CHECK-AIX-NEXT:    mfvsrd 4, 34
1835; CHECK-AIX-NEXT:    srd 3, 4, 3
1836; CHECK-AIX-NEXT:    clrldi 3, 3, 48
1837; CHECK-AIX-NEXT:    blr
1838
1839
1840entry:
1841  %vecext = extractelement <8 x i16> %vus, i32 %i
1842  ret i16 %vecext
1843}
1844
1845; Function Attrs: norecurse nounwind readnone
1846define signext i32 @getsi0(<4 x i32> %vsi) {
1847; CHECK-LABEL: getsi0:
1848; CHECK:       # %bb.0: # %entry
1849; CHECK-NEXT:    xxsldwi vs0, v2, v2, 3
1850; CHECK-NEXT:    mffprwz r3, f0
1851; CHECK-NEXT:    extsw r3, r3
1852; CHECK-NEXT:    blr
1853;
1854; CHECK-LE-LABEL: getsi0:
1855; CHECK-LE:       # %bb.0: # %entry
1856; CHECK-LE-NEXT:    xxswapd vs0, v2
1857; CHECK-LE-NEXT:    mffprwz r3, f0
1858; CHECK-LE-NEXT:    extsw r3, r3
1859; CHECK-LE-NEXT:    blr
1860;
1861; CHECK-AIX-LABEL: getsi0:
1862; CHECK-AIX:       # %bb.0: # %entry
1863; CHECK-AIX-NEXT:    xxsldwi 0, 34, 34, 3
1864; CHECK-AIX-NEXT:    mffprwz 3, 0
1865; CHECK-AIX-NEXT:    extsw 3, 3
1866; CHECK-AIX-NEXT:    blr
1867entry:
1868  %vecext = extractelement <4 x i32> %vsi, i32 0
1869  ret i32 %vecext
1870
1871
1872}
1873
1874; Function Attrs: norecurse nounwind readnone
1875define signext i32 @getsi1(<4 x i32> %vsi) {
1876; CHECK-LABEL: getsi1:
1877; CHECK:       # %bb.0: # %entry
1878; CHECK-NEXT:    mfvsrwz r3, v2
1879; CHECK-NEXT:    extsw r3, r3
1880; CHECK-NEXT:    blr
1881;
1882; CHECK-LE-LABEL: getsi1:
1883; CHECK-LE:       # %bb.0: # %entry
1884; CHECK-LE-NEXT:    xxsldwi vs0, v2, v2, 1
1885; CHECK-LE-NEXT:    mffprwz r3, f0
1886; CHECK-LE-NEXT:    extsw r3, r3
1887; CHECK-LE-NEXT:    blr
1888;
1889; CHECK-AIX-LABEL: getsi1:
1890; CHECK-AIX:       # %bb.0: # %entry
1891; CHECK-AIX-NEXT:    mfvsrwz 3, 34
1892; CHECK-AIX-NEXT:    extsw 3, 3
1893; CHECK-AIX-NEXT:    blr
1894entry:
1895  %vecext = extractelement <4 x i32> %vsi, i32 1
1896  ret i32 %vecext
1897
1898
1899}
1900
1901; Function Attrs: norecurse nounwind readnone
1902define signext i32 @getsi2(<4 x i32> %vsi) {
1903; CHECK-LABEL: getsi2:
1904; CHECK:       # %bb.0: # %entry
1905; CHECK-NEXT:    xxsldwi vs0, v2, v2, 1
1906; CHECK-NEXT:    mffprwz r3, f0
1907; CHECK-NEXT:    extsw r3, r3
1908; CHECK-NEXT:    blr
1909;
1910; CHECK-LE-LABEL: getsi2:
1911; CHECK-LE:       # %bb.0: # %entry
1912; CHECK-LE-NEXT:    mfvsrwz r3, v2
1913; CHECK-LE-NEXT:    extsw r3, r3
1914; CHECK-LE-NEXT:    blr
1915;
1916; CHECK-AIX-LABEL: getsi2:
1917; CHECK-AIX:       # %bb.0: # %entry
1918; CHECK-AIX-NEXT:    xxsldwi 0, 34, 34, 1
1919; CHECK-AIX-NEXT:    mffprwz 3, 0
1920; CHECK-AIX-NEXT:    extsw 3, 3
1921; CHECK-AIX-NEXT:    blr
1922entry:
1923  %vecext = extractelement <4 x i32> %vsi, i32 2
1924  ret i32 %vecext
1925
1926
1927}
1928
1929; Function Attrs: norecurse nounwind readnone
1930define signext i32 @getsi3(<4 x i32> %vsi) {
1931; CHECK-LABEL: getsi3:
1932; CHECK:       # %bb.0: # %entry
1933; CHECK-NEXT:    xxswapd vs0, v2
1934; CHECK-NEXT:    mffprwz r3, f0
1935; CHECK-NEXT:    extsw r3, r3
1936; CHECK-NEXT:    blr
1937;
1938; CHECK-LE-LABEL: getsi3:
1939; CHECK-LE:       # %bb.0: # %entry
1940; CHECK-LE-NEXT:    xxsldwi vs0, v2, v2, 3
1941; CHECK-LE-NEXT:    mffprwz r3, f0
1942; CHECK-LE-NEXT:    extsw r3, r3
1943; CHECK-LE-NEXT:    blr
1944;
1945; CHECK-AIX-LABEL: getsi3:
1946; CHECK-AIX:       # %bb.0: # %entry
1947; CHECK-AIX-NEXT:    xxswapd 0, 34
1948; CHECK-AIX-NEXT:    mffprwz 3, 0
1949; CHECK-AIX-NEXT:    extsw 3, 3
1950; CHECK-AIX-NEXT:    blr
1951entry:
1952  %vecext = extractelement <4 x i32> %vsi, i32 3
1953  ret i32 %vecext
1954
1955
1956}
1957
1958; Function Attrs: norecurse nounwind readnone
1959define zeroext i32 @getui0(<4 x i32> %vui) {
1960; CHECK-LABEL: getui0:
1961; CHECK:       # %bb.0: # %entry
1962; CHECK-NEXT:    xxsldwi vs0, v2, v2, 3
1963; CHECK-NEXT:    mffprwz r3, f0
1964; CHECK-NEXT:    clrldi r3, r3, 32
1965; CHECK-NEXT:    blr
1966;
1967; CHECK-LE-LABEL: getui0:
1968; CHECK-LE:       # %bb.0: # %entry
1969; CHECK-LE-NEXT:    xxswapd vs0, v2
1970; CHECK-LE-NEXT:    mffprwz r3, f0
1971; CHECK-LE-NEXT:    clrldi r3, r3, 32
1972; CHECK-LE-NEXT:    blr
1973;
1974; CHECK-AIX-LABEL: getui0:
1975; CHECK-AIX:       # %bb.0: # %entry
1976; CHECK-AIX-NEXT:    xxsldwi 0, 34, 34, 3
1977; CHECK-AIX-NEXT:    mffprwz 3, 0
1978; CHECK-AIX-NEXT:    clrldi 3, 3, 32
1979; CHECK-AIX-NEXT:    blr
1980entry:
1981  %vecext = extractelement <4 x i32> %vui, i32 0
1982  ret i32 %vecext
1983
1984
1985}
1986
1987; Function Attrs: norecurse nounwind readnone
1988define zeroext i32 @getui1(<4 x i32> %vui) {
1989; CHECK-LABEL: getui1:
1990; CHECK:       # %bb.0: # %entry
1991; CHECK-NEXT:    mfvsrwz r3, v2
1992; CHECK-NEXT:    clrldi r3, r3, 32
1993; CHECK-NEXT:    blr
1994;
1995; CHECK-LE-LABEL: getui1:
1996; CHECK-LE:       # %bb.0: # %entry
1997; CHECK-LE-NEXT:    xxsldwi vs0, v2, v2, 1
1998; CHECK-LE-NEXT:    mffprwz r3, f0
1999; CHECK-LE-NEXT:    clrldi r3, r3, 32
2000; CHECK-LE-NEXT:    blr
2001;
2002; CHECK-AIX-LABEL: getui1:
2003; CHECK-AIX:       # %bb.0: # %entry
2004; CHECK-AIX-NEXT:    mfvsrwz 3, 34
2005; CHECK-AIX-NEXT:    clrldi 3, 3, 32
2006; CHECK-AIX-NEXT:    blr
2007entry:
2008  %vecext = extractelement <4 x i32> %vui, i32 1
2009  ret i32 %vecext
2010
2011
2012}
2013
2014; Function Attrs: norecurse nounwind readnone
2015define zeroext i32 @getui2(<4 x i32> %vui) {
2016; CHECK-LABEL: getui2:
2017; CHECK:       # %bb.0: # %entry
2018; CHECK-NEXT:    xxsldwi vs0, v2, v2, 1
2019; CHECK-NEXT:    mffprwz r3, f0
2020; CHECK-NEXT:    clrldi r3, r3, 32
2021; CHECK-NEXT:    blr
2022;
2023; CHECK-LE-LABEL: getui2:
2024; CHECK-LE:       # %bb.0: # %entry
2025; CHECK-LE-NEXT:    mfvsrwz r3, v2
2026; CHECK-LE-NEXT:    clrldi r3, r3, 32
2027; CHECK-LE-NEXT:    blr
2028;
2029; CHECK-AIX-LABEL: getui2:
2030; CHECK-AIX:       # %bb.0: # %entry
2031; CHECK-AIX-NEXT:    xxsldwi 0, 34, 34, 1
2032; CHECK-AIX-NEXT:    mffprwz 3, 0
2033; CHECK-AIX-NEXT:    clrldi 3, 3, 32
2034; CHECK-AIX-NEXT:    blr
2035entry:
2036  %vecext = extractelement <4 x i32> %vui, i32 2
2037  ret i32 %vecext
2038
2039
2040}
2041
2042; Function Attrs: norecurse nounwind readnone
2043define zeroext i32 @getui3(<4 x i32> %vui) {
2044; CHECK-LABEL: getui3:
2045; CHECK:       # %bb.0: # %entry
2046; CHECK-NEXT:    xxswapd vs0, v2
2047; CHECK-NEXT:    mffprwz r3, f0
2048; CHECK-NEXT:    clrldi r3, r3, 32
2049; CHECK-NEXT:    blr
2050;
2051; CHECK-LE-LABEL: getui3:
2052; CHECK-LE:       # %bb.0: # %entry
2053; CHECK-LE-NEXT:    xxsldwi vs0, v2, v2, 3
2054; CHECK-LE-NEXT:    mffprwz r3, f0
2055; CHECK-LE-NEXT:    clrldi r3, r3, 32
2056; CHECK-LE-NEXT:    blr
2057;
2058; CHECK-AIX-LABEL: getui3:
2059; CHECK-AIX:       # %bb.0: # %entry
2060; CHECK-AIX-NEXT:    xxswapd 0, 34
2061; CHECK-AIX-NEXT:    mffprwz 3, 0
2062; CHECK-AIX-NEXT:    clrldi 3, 3, 32
2063; CHECK-AIX-NEXT:    blr
2064entry:
2065  %vecext = extractelement <4 x i32> %vui, i32 3
2066  ret i32 %vecext
2067
2068
2069}
2070
2071; Function Attrs: norecurse nounwind readnone
2072define signext i32 @getvelsi(<4 x i32> %vsi, i32 signext %i) {
2073; CHECK-LABEL: getvelsi:
2074; CHECK:       # %bb.0: # %entry
2075; CHECK-NEXT:    andi. r4, r5, 2
2076; CHECK-NEXT:    li r3, 1
2077; CHECK-NEXT:    sldi r4, r4, 2
2078; CHECK-NEXT:    andc r3, r3, r5
2079; CHECK-NEXT:    lvsl v3, 0, r4
2080; CHECK-NEXT:    sldi r3, r3, 5
2081; CHECK-NEXT:    vperm v2, v2, v2, v3
2082; CHECK-NEXT:    mfvsrd r4, v2
2083; CHECK-NEXT:    srd r3, r4, r3
2084; CHECK-NEXT:    extsw r3, r3
2085; CHECK-NEXT:    blr
2086;
2087; CHECK-LE-LABEL: getvelsi:
2088; CHECK-LE:       # %bb.0: # %entry
2089; CHECK-LE-NEXT:    li r3, 2
2090; CHECK-LE-NEXT:    andc r3, r3, r5
2091; CHECK-LE-NEXT:    sldi r3, r3, 2
2092; CHECK-LE-NEXT:    lvsl v3, 0, r3
2093; CHECK-LE-NEXT:    li r3, 1
2094; CHECK-LE-NEXT:    and r3, r3, r5
2095; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2096; CHECK-LE-NEXT:    sldi r3, r3, 5
2097; CHECK-LE-NEXT:    mfvsrd r4, v2
2098; CHECK-LE-NEXT:    srd r3, r4, r3
2099; CHECK-LE-NEXT:    extsw r3, r3
2100; CHECK-LE-NEXT:    blr
2101;
2102; CHECK-AIX-LABEL: getvelsi:
2103; CHECK-AIX:       # %bb.0: # %entry
2104; CHECK-AIX-NEXT:    andi. 5, 3, 2
2105; CHECK-AIX-NEXT:    li 4, 1
2106; CHECK-AIX-NEXT:    sldi 5, 5, 2
2107; CHECK-AIX-NEXT:    andc 3, 4, 3
2108; CHECK-AIX-NEXT:    lvsl 3, 0, 5
2109; CHECK-AIX-NEXT:    sldi 3, 3, 5
2110; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
2111; CHECK-AIX-NEXT:    mfvsrd 4, 34
2112; CHECK-AIX-NEXT:    srd 3, 4, 3
2113; CHECK-AIX-NEXT:    extsw 3, 3
2114; CHECK-AIX-NEXT:    blr
2115entry:
2116  %vecext = extractelement <4 x i32> %vsi, i32 %i
2117  ret i32 %vecext
2118; FIXME: add check patterns when variable element extraction is implemented
2119}
2120
2121; Function Attrs: norecurse nounwind readnone
2122define zeroext i32 @getvelui(<4 x i32> %vui, i32 signext %i) {
2123; CHECK-LABEL: getvelui:
2124; CHECK:       # %bb.0: # %entry
2125; CHECK-NEXT:    andi. r4, r5, 2
2126; CHECK-NEXT:    li r3, 1
2127; CHECK-NEXT:    sldi r4, r4, 2
2128; CHECK-NEXT:    andc r3, r3, r5
2129; CHECK-NEXT:    lvsl v3, 0, r4
2130; CHECK-NEXT:    sldi r3, r3, 5
2131; CHECK-NEXT:    vperm v2, v2, v2, v3
2132; CHECK-NEXT:    mfvsrd r4, v2
2133; CHECK-NEXT:    srd r3, r4, r3
2134; CHECK-NEXT:    clrldi r3, r3, 32
2135; CHECK-NEXT:    blr
2136;
2137; CHECK-LE-LABEL: getvelui:
2138; CHECK-LE:       # %bb.0: # %entry
2139; CHECK-LE-NEXT:    li r3, 2
2140; CHECK-LE-NEXT:    andc r3, r3, r5
2141; CHECK-LE-NEXT:    sldi r3, r3, 2
2142; CHECK-LE-NEXT:    lvsl v3, 0, r3
2143; CHECK-LE-NEXT:    li r3, 1
2144; CHECK-LE-NEXT:    and r3, r3, r5
2145; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2146; CHECK-LE-NEXT:    sldi r3, r3, 5
2147; CHECK-LE-NEXT:    mfvsrd r4, v2
2148; CHECK-LE-NEXT:    srd r3, r4, r3
2149; CHECK-LE-NEXT:    clrldi r3, r3, 32
2150; CHECK-LE-NEXT:    blr
2151;
2152; CHECK-AIX-LABEL: getvelui:
2153; CHECK-AIX:       # %bb.0: # %entry
2154; CHECK-AIX-NEXT:    andi. 5, 3, 2
2155; CHECK-AIX-NEXT:    li 4, 1
2156; CHECK-AIX-NEXT:    sldi 5, 5, 2
2157; CHECK-AIX-NEXT:    andc 3, 4, 3
2158; CHECK-AIX-NEXT:    lvsl 3, 0, 5
2159; CHECK-AIX-NEXT:    sldi 3, 3, 5
2160; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
2161; CHECK-AIX-NEXT:    mfvsrd 4, 34
2162; CHECK-AIX-NEXT:    srd 3, 4, 3
2163; CHECK-AIX-NEXT:    clrldi 3, 3, 32
2164; CHECK-AIX-NEXT:    blr
2165entry:
2166  %vecext = extractelement <4 x i32> %vui, i32 %i
2167  ret i32 %vecext
2168; FIXME: add check patterns when variable element extraction is implemented
2169}
2170
2171; Function Attrs: norecurse nounwind readnone
2172define i64 @getsl0(<2 x i64> %vsl) {
2173; CHECK-LABEL: getsl0:
2174; CHECK:       # %bb.0: # %entry
2175; CHECK-NEXT:    mfvsrd r3, v2
2176; CHECK-NEXT:    blr
2177;
2178; CHECK-LE-LABEL: getsl0:
2179; CHECK-LE:       # %bb.0: # %entry
2180; CHECK-LE-NEXT:    xxswapd vs0, v2
2181; CHECK-LE-NEXT:    mffprd r3, f0
2182; CHECK-LE-NEXT:    blr
2183;
2184; CHECK-AIX-LABEL: getsl0:
2185; CHECK-AIX:       # %bb.0: # %entry
2186; CHECK-AIX-NEXT:    mfvsrd 3, 34
2187; CHECK-AIX-NEXT:    blr
2188entry:
2189  %vecext = extractelement <2 x i64> %vsl, i32 0
2190  ret i64 %vecext
2191
2192
2193}
2194
2195; Function Attrs: norecurse nounwind readnone
2196define i64 @getsl1(<2 x i64> %vsl) {
2197; CHECK-LABEL: getsl1:
2198; CHECK:       # %bb.0: # %entry
2199; CHECK-NEXT:    xxswapd vs0, v2
2200; CHECK-NEXT:    mffprd r3, f0
2201; CHECK-NEXT:    blr
2202;
2203; CHECK-LE-LABEL: getsl1:
2204; CHECK-LE:       # %bb.0: # %entry
2205; CHECK-LE-NEXT:    mfvsrd r3, v2
2206; CHECK-LE-NEXT:    blr
2207;
2208; CHECK-AIX-LABEL: getsl1:
2209; CHECK-AIX:       # %bb.0: # %entry
2210; CHECK-AIX-NEXT:    xxswapd 0, 34
2211; CHECK-AIX-NEXT:    mffprd 3, 0
2212; CHECK-AIX-NEXT:    blr
2213entry:
2214  %vecext = extractelement <2 x i64> %vsl, i32 1
2215  ret i64 %vecext
2216
2217
2218}
2219
2220; Function Attrs: norecurse nounwind readnone
2221define i64 @getul0(<2 x i64> %vul) {
2222; CHECK-LABEL: getul0:
2223; CHECK:       # %bb.0: # %entry
2224; CHECK-NEXT:    mfvsrd r3, v2
2225; CHECK-NEXT:    blr
2226;
2227; CHECK-LE-LABEL: getul0:
2228; CHECK-LE:       # %bb.0: # %entry
2229; CHECK-LE-NEXT:    xxswapd vs0, v2
2230; CHECK-LE-NEXT:    mffprd r3, f0
2231; CHECK-LE-NEXT:    blr
2232;
2233; CHECK-AIX-LABEL: getul0:
2234; CHECK-AIX:       # %bb.0: # %entry
2235; CHECK-AIX-NEXT:    mfvsrd 3, 34
2236; CHECK-AIX-NEXT:    blr
2237entry:
2238  %vecext = extractelement <2 x i64> %vul, i32 0
2239  ret i64 %vecext
2240
2241
2242}
2243
2244; Function Attrs: norecurse nounwind readnone
2245define i64 @getul1(<2 x i64> %vul) {
2246; CHECK-LABEL: getul1:
2247; CHECK:       # %bb.0: # %entry
2248; CHECK-NEXT:    xxswapd vs0, v2
2249; CHECK-NEXT:    mffprd r3, f0
2250; CHECK-NEXT:    blr
2251;
2252; CHECK-LE-LABEL: getul1:
2253; CHECK-LE:       # %bb.0: # %entry
2254; CHECK-LE-NEXT:    mfvsrd r3, v2
2255; CHECK-LE-NEXT:    blr
2256;
2257; CHECK-AIX-LABEL: getul1:
2258; CHECK-AIX:       # %bb.0: # %entry
2259; CHECK-AIX-NEXT:    xxswapd 0, 34
2260; CHECK-AIX-NEXT:    mffprd 3, 0
2261; CHECK-AIX-NEXT:    blr
2262entry:
2263  %vecext = extractelement <2 x i64> %vul, i32 1
2264  ret i64 %vecext
2265
2266
2267}
2268
2269; Function Attrs: norecurse nounwind readnone
2270define i64 @getvelsl(<2 x i64> %vsl, i32 signext %i) {
2271; CHECK-LABEL: getvelsl:
2272; CHECK:       # %bb.0: # %entry
2273; CHECK-NEXT:    andi. r3, r5, 1
2274; CHECK-NEXT:    sldi r3, r3, 3
2275; CHECK-NEXT:    lvsl v3, 0, r3
2276; CHECK-NEXT:    vperm v2, v2, v2, v3
2277; CHECK-NEXT:    mfvsrd r3, v2
2278; CHECK-NEXT:    blr
2279;
2280; CHECK-LE-LABEL: getvelsl:
2281; CHECK-LE:       # %bb.0: # %entry
2282; CHECK-LE-NEXT:    li r3, 1
2283; CHECK-LE-NEXT:    andc r3, r3, r5
2284; CHECK-LE-NEXT:    sldi r3, r3, 3
2285; CHECK-LE-NEXT:    lvsl v3, 0, r3
2286; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2287; CHECK-LE-NEXT:    mfvsrd r3, v2
2288; CHECK-LE-NEXT:    blr
2289;
2290; CHECK-AIX-LABEL: getvelsl:
2291; CHECK-AIX:       # %bb.0: # %entry
2292; CHECK-AIX-NEXT:    andi. 3, 3, 1
2293; CHECK-AIX-NEXT:    sldi 3, 3, 3
2294; CHECK-AIX-NEXT:    lvsl 3, 0, 3
2295; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
2296; CHECK-AIX-NEXT:    mfvsrd 3, 34
2297; CHECK-AIX-NEXT:    blr
2298entry:
2299  %vecext = extractelement <2 x i64> %vsl, i32 %i
2300  ret i64 %vecext
2301; FIXME: add check patterns when variable element extraction is implemented
2302}
2303
2304; Function Attrs: norecurse nounwind readnone
2305define i64 @getvelul(<2 x i64> %vul, i32 signext %i) {
2306; CHECK-LABEL: getvelul:
2307; CHECK:       # %bb.0: # %entry
2308; CHECK-NEXT:    andi. r3, r5, 1
2309; CHECK-NEXT:    sldi r3, r3, 3
2310; CHECK-NEXT:    lvsl v3, 0, r3
2311; CHECK-NEXT:    vperm v2, v2, v2, v3
2312; CHECK-NEXT:    mfvsrd r3, v2
2313; CHECK-NEXT:    blr
2314;
2315; CHECK-LE-LABEL: getvelul:
2316; CHECK-LE:       # %bb.0: # %entry
2317; CHECK-LE-NEXT:    li r3, 1
2318; CHECK-LE-NEXT:    andc r3, r3, r5
2319; CHECK-LE-NEXT:    sldi r3, r3, 3
2320; CHECK-LE-NEXT:    lvsl v3, 0, r3
2321; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2322; CHECK-LE-NEXT:    mfvsrd r3, v2
2323; CHECK-LE-NEXT:    blr
2324;
2325; CHECK-AIX-LABEL: getvelul:
2326; CHECK-AIX:       # %bb.0: # %entry
2327; CHECK-AIX-NEXT:    andi. 3, 3, 1
2328; CHECK-AIX-NEXT:    sldi 3, 3, 3
2329; CHECK-AIX-NEXT:    lvsl 3, 0, 3
2330; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
2331; CHECK-AIX-NEXT:    mfvsrd 3, 34
2332; CHECK-AIX-NEXT:    blr
2333entry:
2334  %vecext = extractelement <2 x i64> %vul, i32 %i
2335  ret i64 %vecext
2336; FIXME: add check patterns when variable element extraction is implemented
2337}
2338
2339; Function Attrs: norecurse nounwind readnone
2340define float @getf0(<4 x float> %vf) {
2341; CHECK-LABEL: getf0:
2342; CHECK:       # %bb.0: # %entry
2343; CHECK-NEXT:    xscvspdpn f1, v2
2344; CHECK-NEXT:    blr
2345;
2346; CHECK-LE-LABEL: getf0:
2347; CHECK-LE:       # %bb.0: # %entry
2348; CHECK-LE-NEXT:    xxsldwi vs0, v2, v2, 3
2349; CHECK-LE-NEXT:    xscvspdpn f1, vs0
2350; CHECK-LE-NEXT:    blr
2351;
2352; CHECK-AIX-LABEL: getf0:
2353; CHECK-AIX:       # %bb.0: # %entry
2354; CHECK-AIX-NEXT:    xscvspdpn 1, 34
2355; CHECK-AIX-NEXT:    blr
2356entry:
2357  %vecext = extractelement <4 x float> %vf, i32 0
2358  ret float %vecext
2359
2360
2361}
2362
2363; Function Attrs: norecurse nounwind readnone
2364define float @getf1(<4 x float> %vf) {
2365; CHECK-LABEL: getf1:
2366; CHECK:       # %bb.0: # %entry
2367; CHECK-NEXT:    xxsldwi vs0, v2, v2, 1
2368; CHECK-NEXT:    xscvspdpn f1, vs0
2369; CHECK-NEXT:    blr
2370;
2371; CHECK-LE-LABEL: getf1:
2372; CHECK-LE:       # %bb.0: # %entry
2373; CHECK-LE-NEXT:    xxswapd vs0, v2
2374; CHECK-LE-NEXT:    xscvspdpn f1, vs0
2375; CHECK-LE-NEXT:    blr
2376;
2377; CHECK-AIX-LABEL: getf1:
2378; CHECK-AIX:       # %bb.0: # %entry
2379; CHECK-AIX-NEXT:    xxsldwi 0, 34, 34, 1
2380; CHECK-AIX-NEXT:    xscvspdpn 1, 0
2381; CHECK-AIX-NEXT:    blr
2382entry:
2383  %vecext = extractelement <4 x float> %vf, i32 1
2384  ret float %vecext
2385
2386
2387}
2388
2389; Function Attrs: norecurse nounwind readnone
2390define float @getf2(<4 x float> %vf) {
2391; CHECK-LABEL: getf2:
2392; CHECK:       # %bb.0: # %entry
2393; CHECK-NEXT:    xxswapd vs0, v2
2394; CHECK-NEXT:    xscvspdpn f1, vs0
2395; CHECK-NEXT:    blr
2396;
2397; CHECK-LE-LABEL: getf2:
2398; CHECK-LE:       # %bb.0: # %entry
2399; CHECK-LE-NEXT:    xxsldwi vs0, v2, v2, 1
2400; CHECK-LE-NEXT:    xscvspdpn f1, vs0
2401; CHECK-LE-NEXT:    blr
2402;
2403; CHECK-AIX-LABEL: getf2:
2404; CHECK-AIX:       # %bb.0: # %entry
2405; CHECK-AIX-NEXT:    xxswapd 0, 34
2406; CHECK-AIX-NEXT:    xscvspdpn 1, 0
2407; CHECK-AIX-NEXT:    blr
2408entry:
2409  %vecext = extractelement <4 x float> %vf, i32 2
2410  ret float %vecext
2411
2412
2413}
2414
2415; Function Attrs: norecurse nounwind readnone
2416define float @getf3(<4 x float> %vf) {
2417; CHECK-LABEL: getf3:
2418; CHECK:       # %bb.0: # %entry
2419; CHECK-NEXT:    xxsldwi vs0, v2, v2, 3
2420; CHECK-NEXT:    xscvspdpn f1, vs0
2421; CHECK-NEXT:    blr
2422;
2423; CHECK-LE-LABEL: getf3:
2424; CHECK-LE:       # %bb.0: # %entry
2425; CHECK-LE-NEXT:    xscvspdpn f1, v2
2426; CHECK-LE-NEXT:    blr
2427;
2428; CHECK-AIX-LABEL: getf3:
2429; CHECK-AIX:       # %bb.0: # %entry
2430; CHECK-AIX-NEXT:    xxsldwi 0, 34, 34, 3
2431; CHECK-AIX-NEXT:    xscvspdpn 1, 0
2432; CHECK-AIX-NEXT:    blr
2433entry:
2434  %vecext = extractelement <4 x float> %vf, i32 3
2435  ret float %vecext
2436
2437
2438}
2439
2440; Function Attrs: norecurse nounwind readnone
2441define float @getvelf(<4 x float> %vf, i32 signext %i) {
2442; CHECK-LABEL: getvelf:
2443; CHECK:       # %bb.0: # %entry
2444; CHECK-NEXT:    sldi r3, r5, 2
2445; CHECK-NEXT:    lvsl v3, 0, r3
2446; CHECK-NEXT:    vperm v2, v2, v2, v3
2447; CHECK-NEXT:    xscvspdpn f1, v2
2448; CHECK-NEXT:    blr
2449;
2450; CHECK-LE-LABEL: getvelf:
2451; CHECK-LE:       # %bb.0: # %entry
2452; CHECK-LE-NEXT:    xori r3, r5, 3
2453; CHECK-LE-NEXT:    sldi r3, r3, 2
2454; CHECK-LE-NEXT:    lvsl v3, 0, r3
2455; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2456; CHECK-LE-NEXT:    xscvspdpn f1, v2
2457; CHECK-LE-NEXT:    blr
2458;
2459; CHECK-AIX-LABEL: getvelf:
2460; CHECK-AIX:       # %bb.0: # %entry
2461; CHECK-AIX-NEXT:    sldi 3, 3, 2
2462; CHECK-AIX-NEXT:    lvsl 3, 0, 3
2463; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
2464; CHECK-AIX-NEXT:    xscvspdpn 1, 34
2465; CHECK-AIX-NEXT:    blr
2466entry:
2467  %vecext = extractelement <4 x float> %vf, i32 %i
2468  ret float %vecext
2469; FIXME: add check patterns when variable element extraction is implemented
2470}
2471
2472; Function Attrs: norecurse nounwind readnone
2473define double @getd0(<2 x double> %vd) {
2474; CHECK-LABEL: getd0:
2475; CHECK:       # %bb.0: # %entry
2476; CHECK-NEXT:    xxlor f1, v2, v2
2477; CHECK-NEXT:    blr
2478;
2479; CHECK-LE-LABEL: getd0:
2480; CHECK-LE:       # %bb.0: # %entry
2481; CHECK-LE-NEXT:    xxswapd vs1, v2
2482; CHECK-LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2483; CHECK-LE-NEXT:    blr
2484;
2485; CHECK-AIX-LABEL: getd0:
2486; CHECK-AIX:       # %bb.0: # %entry
2487; CHECK-AIX-NEXT:    xxlor 1, 34, 34
2488; CHECK-AIX-NEXT:    blr
2489entry:
2490  %vecext = extractelement <2 x double> %vd, i32 0
2491  ret double %vecext
2492
2493
2494}
2495
2496; Function Attrs: norecurse nounwind readnone
2497define double @getd1(<2 x double> %vd) {
2498; CHECK-LABEL: getd1:
2499; CHECK:       # %bb.0: # %entry
2500; CHECK-NEXT:    xxswapd vs1, v2
2501; CHECK-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2502; CHECK-NEXT:    blr
2503;
2504; CHECK-LE-LABEL: getd1:
2505; CHECK-LE:       # %bb.0: # %entry
2506; CHECK-LE-NEXT:    xxlor f1, v2, v2
2507; CHECK-LE-NEXT:    blr
2508;
2509; CHECK-AIX-LABEL: getd1:
2510; CHECK-AIX:       # %bb.0: # %entry
2511; CHECK-AIX-NEXT:    xxswapd 1, 34
2512; CHECK-AIX-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2513; CHECK-AIX-NEXT:    blr
2514entry:
2515  %vecext = extractelement <2 x double> %vd, i32 1
2516  ret double %vecext
2517}
2518
2519; Function Attrs: norecurse nounwind readnone
2520define double @getveld(<2 x double> %vd, i32 signext %i) {
2521; CHECK-LABEL: getveld:
2522; CHECK:       # %bb.0: # %entry
2523; CHECK-NEXT:    andi. r3, r5, 1
2524; CHECK-NEXT:    sldi r3, r3, 3
2525; CHECK-NEXT:    lvsl v3, 0, r3
2526; CHECK-NEXT:    vperm v2, v2, v2, v3
2527; CHECK-NEXT:    xxlor vs1, v2, v2
2528; CHECK-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2529; CHECK-NEXT:    blr
2530;
2531; CHECK-LE-LABEL: getveld:
2532; CHECK-LE:       # %bb.0: # %entry
2533; CHECK-LE-NEXT:    li r3, 1
2534; CHECK-LE-NEXT:    andc r3, r3, r5
2535; CHECK-LE-NEXT:    sldi r3, r3, 3
2536; CHECK-LE-NEXT:    lvsl v3, 0, r3
2537; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2538; CHECK-LE-NEXT:    xxlor vs1, v2, v2
2539; CHECK-LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2540; CHECK-LE-NEXT:    blr
2541;
2542; CHECK-AIX-LABEL: getveld:
2543; CHECK-AIX:       # %bb.0: # %entry
2544; CHECK-AIX-NEXT:    andi. 3, 3, 1
2545; CHECK-AIX-NEXT:    sldi 3, 3, 3
2546; CHECK-AIX-NEXT:    lvsl 3, 0, 3
2547; CHECK-AIX-NEXT:    vperm 2, 2, 2, 3
2548; CHECK-AIX-NEXT:    xxlor 1, 34, 34
2549; CHECK-AIX-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2550; CHECK-AIX-NEXT:    blr
2551entry:
2552  %vecext = extractelement <2 x double> %vd, i32 %i
2553  ret double %vecext
2554; FIXME: add check patterns when variable element extraction is implemented
2555}
2556
2557; To check when LHS is i32 to vector and RHS is i64 to vector,
2558; the combination should be skipped properly.
2559define <2 x i64> @buildi2(i64 %arg, i32 %arg1) {
2560; CHECK-LABEL: buildi2:
2561; CHECK:       # %bb.0: # %entry
2562; CHECK-NEXT:    sldi r4, r4, 32
2563; CHECK-NEXT:    mtfprd f1, r3
2564; CHECK-NEXT:    mtfprd f0, r4
2565; CHECK-NEXT:    xxmrghd v2, vs0, vs1
2566; CHECK-NEXT:    blr
2567;
2568; CHECK-LE-LABEL: buildi2:
2569; CHECK-LE:       # %bb.0: # %entry
2570; CHECK-LE-NEXT:    mtfprd f0, r4
2571; CHECK-LE-NEXT:    mtfprd f1, r3
2572; CHECK-LE-NEXT:    xxswapd vs0, vs0
2573; CHECK-LE-NEXT:    xxswapd v2, vs1
2574; CHECK-LE-NEXT:    xxmrgld v2, v2, vs0
2575; CHECK-LE-NEXT:    blr
2576;
2577; CHECK-AIX-LABEL: buildi2:
2578; CHECK-AIX:       # %bb.0: # %entry
2579; CHECK-AIX-NEXT:    sldi 4, 4, 32
2580; CHECK-AIX-NEXT:    mtfprd 1, 3
2581; CHECK-AIX-NEXT:    mtfprd 0, 4
2582; CHECK-AIX-NEXT:    xxmrghd 34, 0, 1
2583; CHECK-AIX-NEXT:    blr
2584entry:
2585  %lhs.i32 = insertelement <4 x i32> undef, i32 %arg1, i32 0
2586  %rhs = insertelement <2 x i64> undef, i64 %arg, i32 0
2587  %lhs = bitcast <4 x i32> %lhs.i32 to <2 x i64>
2588  %shuffle = shufflevector <2 x i64> %lhs, <2 x i64> %rhs, <2 x i32> <i32 0, i32 2>
2589  ret <2 x i64> %shuffle
2590}
2591