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