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