1; RUN: llc -mcpu=pwr9 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \
2; RUN:		-mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s --check-prefix=P9LE
3; RUN: llc -mcpu=pwr9 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \
4; RUN:    -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s --check-prefix=P9BE
5; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \
6; RUN:    -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s --check-prefix=P8LE
7; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \
8; RUN:    -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s --check-prefix=P8BE
9
10
11; Function Attrs: norecurse nounwind readonly
12define <2 x i64> @s2v_test1(i64* nocapture readonly %int64, <2 x i64> %vec) {
13; P9LE-LABEL: s2v_test1:
14; P9LE:       # %bb.0: # %entry
15; P9LE-NEXT:    lfd f0, 0(r3)
16; P9LE-NEXT:    xxpermdi v3, f0, f0, 2
17; P9LE-NEXT:    xxpermdi v2, v2, v3, 1
18; P9LE-NEXT:    blr
19
20; P9BE-LABEL: s2v_test1:
21; P9BE:       # %bb.0: # %entry
22; P9BE-NEXT:    lfd f0, 0(r3)
23; P9BE-NEXT:    xxpermdi v2, vs0, v2, 1
24; P9BE-NEXT:    blr
25entry:
26  %0 = load i64, i64* %int64, align 8
27  %vecins = insertelement <2 x i64> %vec, i64 %0, i32 0
28  ret <2 x i64> %vecins
29}
30
31; Function Attrs: norecurse nounwind readonly
32define <2 x i64> @s2v_test2(i64* nocapture readonly %int64, <2 x i64> %vec)  {
33; P9LE-LABEL: s2v_test2:
34; P9LE:       # %bb.0: # %entry
35; P9LE-NEXT:    lfd f0, 8(r3)
36; P9LE-NEXT:    xxpermdi v3, f0, f0, 2
37; P9LE-NEXT:    xxpermdi v2, v2, v3, 1
38; P9LE-NEXT:    blr
39
40; P9BE-LABEL: s2v_test2:
41; P9BE:       # %bb.0: # %entry
42; P9BE-NEXT:    lfd f0, 8(r3)
43; P9BE-NEXT:    xxpermdi v2, vs0, v2, 1
44; P9BE-NEXT:    blr
45entry:
46  %arrayidx = getelementptr inbounds i64, i64* %int64, i64 1
47  %0 = load i64, i64* %arrayidx, align 8
48  %vecins = insertelement <2 x i64> %vec, i64 %0, i32 0
49  ret <2 x i64> %vecins
50}
51
52; Function Attrs: norecurse nounwind readonly
53define <2 x i64> @s2v_test3(i64* nocapture readonly %int64, <2 x i64> %vec, i32 signext %Idx)  {
54; P9LE-LABEL: s2v_test3:
55; P9LE:       # %bb.0: # %entry
56; P9LE-NEXT:    sldi r4, r7, 3
57; P9LE-NEXT:    lfdx f0, r3, r4
58; P9LE-NEXT:    xxpermdi v3, f0, f0, 2
59; P9LE-NEXT:    xxpermdi v2, v2, v3, 1
60; P9LE-NEXT:    blr
61
62; P9BE-LABEL: s2v_test3
63; P9BE:       # %bb.0: # %entry
64; P9BE-NEXT:    sldi r4, r7, 3
65; P9BE-NEXT:    lfdx f0, r3, r4
66; P9BE-NEXT:    xxpermdi v2, vs0, v2, 1
67; P9BE-NEXT:    blr
68entry:
69  %idxprom = sext i32 %Idx to i64
70  %arrayidx = getelementptr inbounds i64, i64* %int64, i64 %idxprom
71  %0 = load i64, i64* %arrayidx, align 8
72  %vecins = insertelement <2 x i64> %vec, i64 %0, i32 0
73  ret <2 x i64> %vecins
74}
75
76; Function Attrs: norecurse nounwind readonly
77define <2 x i64> @s2v_test4(i64* nocapture readonly %int64, <2 x i64> %vec)  {
78; P9LE-LABEL: s2v_test4:
79; P9LE:       # %bb.0: # %entry
80; P9LE-NEXT:    lfd f0, 8(r3)
81; P9LE-NEXT:    xxpermdi v3, f0, f0, 2
82; P9LE-NEXT:    xxpermdi v2, v2, v3, 1
83; P9LE-NEXT:    blr
84
85; P9BE-LABEL: s2v_test4:
86; P9BE:       # %bb.0: # %entry
87; P9BE-NEXT:    lfd f0, 8(r3)
88; P9BE-NEXT:    xxpermdi v2, vs0, v2, 1
89; P9BE-NEXT:    blr
90entry:
91  %arrayidx = getelementptr inbounds i64, i64* %int64, i64 1
92  %0 = load i64, i64* %arrayidx, align 8
93  %vecins = insertelement <2 x i64> %vec, i64 %0, i32 0
94  ret <2 x i64> %vecins
95}
96
97; Function Attrs: norecurse nounwind readonly
98define <2 x i64> @s2v_test5(<2 x i64> %vec, i64* nocapture readonly %ptr1)  {
99; P9LE-LABEL: s2v_test5:
100; P9LE:       # %bb.0: # %entry
101; P9LE-NEXT:    lfd f0, 0(r5)
102; P9LE-NEXT:    xxpermdi v3, f0, f0, 2
103; P9LE-NEXT:    xxpermdi v2, v2, v3, 1
104; P9LE-NEXT:    blr
105
106; P9BE-LABEL: s2v_test5:
107; P9BE:       # %bb.0: # %entry
108; P9BE-NEXT:    lfd f0, 0(r5)
109; P9BE-NEXT:    xxpermdi v2, vs0, v2, 1
110; P9BE-NEXT:    blr
111entry:
112  %0 = load i64, i64* %ptr1, align 8
113  %vecins = insertelement <2 x i64> %vec, i64 %0, i32 0
114  ret <2 x i64> %vecins
115}
116
117; Function Attrs: norecurse nounwind readonly
118define <2 x double> @s2v_test_f1(double* nocapture readonly %f64, <2 x double> %vec)  {
119; P9LE-LABEL: s2v_test_f1:
120; P9LE:       # %bb.0: # %entry
121; P9LE-NEXT:    lfd f0, 0(r3)
122; P9LE-NEXT:    xxpermdi vs0, f0, f0, 2
123; P9LE-NEXT:    xxpermdi v2, v2, vs0, 1
124; P9LE-NEXT:    blr
125
126; P9BE-LABEL: s2v_test_f1:
127; P9BE:       # %bb.0: # %entry
128; P9BE-NEXT:    lfd f0, 0(r3)
129; P9BE-NEXT:    xxpermdi v2, vs0, v2, 1
130; P9BE-NEXT:    blr
131
132; P8LE-LABEL: s2v_test_f1:
133; P8LE:       # %bb.0: # %entry
134; P8LE-NEXT:    lfdx f0, 0, r3
135; P8LE-NEXT:    xxspltd vs0, vs0, 0
136; P8LE-NEXT:    xxpermdi v2, v2, vs0, 1
137; P8LE-NEXT:    blr
138
139; P8BE-LABEL: s2v_test_f1:
140; P8BE:       # %bb.0: # %entry
141; P8BE-NEXT:    lfdx f0, 0, r3
142; P8BE-NEXT:    xxpermdi v2, vs0, v2, 1
143; P8BE-NEXT:    blr
144entry:
145  %0 = load double, double* %f64, align 8
146  %vecins = insertelement <2 x double> %vec, double %0, i32 0
147  ret <2 x double> %vecins
148}
149
150; Function Attrs: norecurse nounwind readonly
151define <2 x double> @s2v_test_f2(double* nocapture readonly %f64, <2 x double> %vec)  {
152; P9LE-LABEL: s2v_test_f2:
153; P9LE:       # %bb.0: # %entry
154; P9LE-NEXT:    lfd f0, 8(r3)
155; P9LE-NEXT:    xxpermdi vs0, f0, f0, 2
156; P9LE-NEXT:    xxpermdi v2, v2, vs0, 1
157; P9LE-NEXT:    blr
158
159; P9BE-LABEL: s2v_test_f2:
160; P9BE:       # %bb.0: # %entry
161; P9BE-NEXT:    lfd f0, 8(r3)
162; P9BE-NEXT:    xxpermdi v2, vs0, v2, 1
163; P9BE-NEXT:    blr
164
165; P8LE-LABEL: s2v_test_f2:
166; P8LE:       # %bb.0: # %entry
167; P8LE-NEXT:    lfd f0, 8(r3)
168; P8LE-NEXT:    xxspltd vs0, vs0, 0
169; P8LE-NEXT:    xxpermdi v2, v2, vs0, 1
170; P8LE-NEXT:    blr
171
172; P8BE-LABEL: s2v_test_f2:
173; P8BE:       # %bb.0: # %entry
174; P8BE-NEXT:    lfd f0, 8(r3)
175; P8BE-NEXT:    xxpermdi v2, vs0, v2, 1
176; P8BE-NEXT:    blr
177entry:
178  %arrayidx = getelementptr inbounds double, double* %f64, i64 1
179  %0 = load double, double* %arrayidx, align 8
180  %vecins = insertelement <2 x double> %vec, double %0, i32 0
181  ret <2 x double> %vecins
182}
183
184; Function Attrs: norecurse nounwind readonly
185define <2 x double> @s2v_test_f3(double* nocapture readonly %f64, <2 x double> %vec, i32 signext %Idx)  {
186; P9LE-LABEL: s2v_test_f3:
187; P9LE:       # %bb.0: # %entry
188; P9LE-NEXT:    sldi r4, r7, 3
189; P9LE-NEXT:    lfdx f0, r3, r4
190; P9LE-NEXT:    xxpermdi vs0, f0, f0, 2
191; P9LE-NEXT:    xxpermdi v2, v2, vs0, 1
192; P9LE-NEXT:    blr
193
194; P9BE-LABEL: s2v_test_f3:
195; P9BE:       # %bb.0: # %entry
196; P9BE-NEXT:    sldi r4, r7, 3
197; P9BE-NEXT:    lfdx f0, r3, r4
198; P9BE-NEXT:    xxpermdi v2, vs0, v2, 1
199; P9BE-NEXT:    blr
200
201; P8LE-LABEL: s2v_test_f3:
202; P8LE:       # %bb.0: # %entry
203; P8LE-NEXT:    sldi r4, r7, 3
204; P8LE-NEXT:    lfdx f0, r3, r4
205; P8LE-NEXT:    xxspltd vs0, vs0, 0
206; P8LE-NEXT:    xxpermdi v2, v2, vs0, 1
207; P8LE-NEXT:    blr
208
209; P8BE-LABEL: s2v_test_f3:
210; P8BE:       # %bb.0: # %entry
211; P8BE-NEXT:    sldi r4, r7, 3
212; P8BE-NEXT:    lfdx f0, r3, r4
213; P8BE-NEXT:    xxpermdi v2, vs0, v2, 1
214; P8BE-NEXT:    blr
215entry:
216  %idxprom = sext i32 %Idx to i64
217  %arrayidx = getelementptr inbounds double, double* %f64, i64 %idxprom
218  %0 = load double, double* %arrayidx, align 8
219  %vecins = insertelement <2 x double> %vec, double %0, i32 0
220  ret <2 x double> %vecins
221}
222
223; Function Attrs: norecurse nounwind readonly
224define <2 x double> @s2v_test_f4(double* nocapture readonly %f64, <2 x double> %vec)  {
225; P9LE-LABEL: s2v_test_f4:
226; P9LE:       # %bb.0: # %entry
227; P9LE-NEXT:    lfd f0, 8(r3)
228; P9LE-NEXT:    xxpermdi vs0, f0, f0, 2
229; P9LE-NEXT:    xxpermdi v2, v2, vs0, 1
230; P9LE-NEXT:    blr
231
232; P9BE-LABEL: s2v_test_f4:
233; P9BE:       # %bb.0: # %entry
234; P9BE-NEXT:    lfd f0, 8(r3)
235; P9BE-NEXT:    xxpermdi v2, vs0, v2, 1
236; P9BE-NEXT:    blr
237
238; P8LE-LABEL: s2v_test_f4:
239; P8LE:       # %bb.0: # %entry
240; P8LE-NEXT:    lfd f0, 8(r3)
241; P8LE-NEXT:    xxspltd vs0, vs0, 0
242; P8LE-NEXT:    xxpermdi v2, v2, vs0, 1
243; P8LE-NEXT:    blr
244
245; P8BE-LABEL: s2v_test_f4:
246; P8BE:       # %bb.0: # %entry
247; P8BE-NEXT:    lfd f0, 8(r3)
248; P8BE-NEXT:    xxpermdi v2, vs0, v2, 1
249; P8BE-NEXT:    blr
250entry:
251  %arrayidx = getelementptr inbounds double, double* %f64, i64 1
252  %0 = load double, double* %arrayidx, align 8
253  %vecins = insertelement <2 x double> %vec, double %0, i32 0
254  ret <2 x double> %vecins
255}
256
257; Function Attrs: norecurse nounwind readonly
258define <2 x double> @s2v_test_f5(<2 x double> %vec, double* nocapture readonly %ptr1)  {
259; P9LE-LABEL: s2v_test_f5:
260; P9LE:       # %bb.0: # %entry
261; P9LE-NEXT:    lfd f0, 0(r5)
262; P9LE-NEXT:    xxpermdi vs0, f0, f0, 2
263; P9LE-NEXT:    xxpermdi v2, v2, vs0, 1
264; P9LE-NEXT:    blr
265
266; P9BE-LABEL: s2v_test_f5:
267; P9BE:       # %bb.0: # %entry
268; P9BE-NEXT:    lfd f0, 0(r5)
269; P9BE-NEXT:    xxpermdi v2, vs0, v2, 1
270; P9BE-NEXT:    blr
271
272; P8LE-LABEL: s2v_test_f5:
273; P8LE:       # %bb.0: # %entry
274; P8LE-NEXT:    lfdx f0, 0, r5
275; P8LE-NEXT:    xxspltd vs0, vs0, 0
276; P8LE-NEXT:    xxpermdi v2, v2, vs0, 1
277; P8LE-NEXT:    blr
278
279; P8BE-LABEL: s2v_test_f5:
280; P8BE:       # %bb.0: # %entry
281; P8BE-NEXT:    lfdx f0, 0, r5
282; P8BE-NEXT:    xxpermdi v2, vs0, v2, 1
283; P8BE-NEXT:    blr
284entry:
285  %0 = load double, double* %ptr1, align 8
286  %vecins = insertelement <2 x double> %vec, double %0, i32 0
287  ret <2 x double> %vecins
288}
289
290