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