1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mcpu=pwr9 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \
3; RUN:    -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s --check-prefix=P9LE
4; RUN: llc -mcpu=pwr9 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \
5; RUN:    -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s --check-prefix=P9BE
6; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \
7; RUN:    -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s --check-prefix=P8LE
8; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \
9; RUN:    -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s --check-prefix=P8BE
10
11; Function Attrs: norecurse nounwind readonly
12define <4 x i32> @s2v_test1(i32* nocapture readonly %int32, <4 x i32> %vec)  {
13; P9LE-LABEL: s2v_test1:
14; P9LE:       # %bb.0: # %entry
15; P9LE-NEXT:    lwz r3, 0(r3)
16; P9LE-NEXT:    mtfprwz f0, r3
17; P9LE-NEXT:    xxinsertw v2, vs0, 12
18; P9LE-NEXT:    blr
19;
20; P9BE-LABEL: s2v_test1:
21; P9BE:       # %bb.0: # %entry
22; P9BE-NEXT:    lwz r3, 0(r3)
23; P9BE-NEXT:    mtfprwz f0, r3
24; P9BE-NEXT:    xxinsertw v2, vs0, 0
25; P9BE-NEXT:    blr
26;
27; P8LE-LABEL: s2v_test1:
28; P8LE:       # %bb.0: # %entry
29; P8LE-NEXT:    addis r4, r2, .LCPI0_0@toc@ha
30; P8LE-NEXT:    lxsiwzx v4, 0, r3
31; P8LE-NEXT:    addi r4, r4, .LCPI0_0@toc@l
32; P8LE-NEXT:    lvx v3, 0, r4
33; P8LE-NEXT:    vperm v2, v2, v4, v3
34; P8LE-NEXT:    blr
35;
36; P8BE-LABEL: s2v_test1:
37; P8BE:       # %bb.0: # %entry
38; P8BE-NEXT:    addis r4, r2, .LCPI0_0@toc@ha
39; P8BE-NEXT:    lxsiwzx v4, 0, r3
40; P8BE-NEXT:    addi r4, r4, .LCPI0_0@toc@l
41; P8BE-NEXT:    lxvw4x v3, 0, r4
42; P8BE-NEXT:    vperm v2, v4, v2, v3
43; P8BE-NEXT:    blr
44entry:
45  %0 = load i32, i32* %int32, align 4
46  %vecins = insertelement <4 x i32> %vec, i32 %0, i32 0
47  ret <4 x i32> %vecins
48}
49
50; Function Attrs: norecurse nounwind readonly
51define <4 x i32> @s2v_test2(i32* nocapture readonly %int32, <4 x i32> %vec)  {
52; P9LE-LABEL: s2v_test2:
53; P9LE:       # %bb.0: # %entry
54; P9LE-NEXT:    lwz r3, 4(r3)
55; P9LE-NEXT:    mtfprwz f0, r3
56; P9LE-NEXT:    xxinsertw v2, vs0, 12
57; P9LE-NEXT:    blr
58;
59; P9BE-LABEL: s2v_test2:
60; P9BE:       # %bb.0: # %entry
61; P9BE-NEXT:    lwz r3, 4(r3)
62; P9BE-NEXT:    mtfprwz f0, r3
63; P9BE-NEXT:    xxinsertw v2, vs0, 0
64; P9BE-NEXT:    blr
65;
66; P8LE-LABEL: s2v_test2:
67; P8LE:       # %bb.0: # %entry
68; P8LE-NEXT:    addis r4, r2, .LCPI1_0@toc@ha
69; P8LE-NEXT:    addi r3, r3, 4
70; P8LE-NEXT:    addi r4, r4, .LCPI1_0@toc@l
71; P8LE-NEXT:    lxsiwzx v4, 0, r3
72; P8LE-NEXT:    lvx v3, 0, r4
73; P8LE-NEXT:    vperm v2, v2, v4, v3
74; P8LE-NEXT:    blr
75;
76; P8BE-LABEL: s2v_test2:
77; P8BE:       # %bb.0: # %entry
78; P8BE-NEXT:    addis r4, r2, .LCPI1_0@toc@ha
79; P8BE-NEXT:    addi r3, r3, 4
80; P8BE-NEXT:    addi r4, r4, .LCPI1_0@toc@l
81; P8BE-NEXT:    lxsiwzx v4, 0, r3
82; P8BE-NEXT:    lxvw4x v3, 0, r4
83; P8BE-NEXT:    vperm v2, v4, v2, v3
84; P8BE-NEXT:    blr
85entry:
86  %arrayidx = getelementptr inbounds i32, i32* %int32, i64 1
87  %0 = load i32, i32* %arrayidx, align 4
88  %vecins = insertelement <4 x i32> %vec, i32 %0, i32 0
89  ret <4 x i32> %vecins
90}
91
92; Function Attrs: norecurse nounwind readonly
93define <4 x i32> @s2v_test3(i32* nocapture readonly %int32, <4 x i32> %vec, i32 signext %Idx)  {
94; P9LE-LABEL: s2v_test3:
95; P9LE:       # %bb.0: # %entry
96; P9LE-NEXT:    sldi r4, r7, 2
97; P9LE-NEXT:    lwzx r3, r3, r4
98; P9LE-NEXT:    mtfprwz f0, r3
99; P9LE-NEXT:    xxinsertw v2, vs0, 12
100; P9LE-NEXT:    blr
101;
102; P9BE-LABEL: s2v_test3:
103; P9BE:       # %bb.0: # %entry
104; P9BE-NEXT:    sldi r4, r7, 2
105; P9BE-NEXT:    lwzx r3, r3, r4
106; P9BE-NEXT:    mtfprwz f0, r3
107; P9BE-NEXT:    xxinsertw v2, vs0, 0
108; P9BE-NEXT:    blr
109;
110; P8LE-LABEL: s2v_test3:
111; P8LE:       # %bb.0: # %entry
112; P8LE-NEXT:    addis r4, r2, .LCPI2_0@toc@ha
113; P8LE-NEXT:    sldi r5, r7, 2
114; P8LE-NEXT:    addi r4, r4, .LCPI2_0@toc@l
115; P8LE-NEXT:    lxsiwzx v3, r3, r5
116; P8LE-NEXT:    lvx v4, 0, r4
117; P8LE-NEXT:    vperm v2, v2, v3, v4
118; P8LE-NEXT:    blr
119;
120; P8BE-LABEL: s2v_test3:
121; P8BE:       # %bb.0: # %entry
122; P8BE-NEXT:    addis r4, r2, .LCPI2_0@toc@ha
123; P8BE-NEXT:    sldi r5, r7, 2
124; P8BE-NEXT:    addi r4, r4, .LCPI2_0@toc@l
125; P8BE-NEXT:    lxsiwzx v3, r3, r5
126; P8BE-NEXT:    lxvw4x v4, 0, r4
127; P8BE-NEXT:    vperm v2, v3, v2, v4
128; P8BE-NEXT:    blr
129entry:
130  %idxprom = sext i32 %Idx to i64
131  %arrayidx = getelementptr inbounds i32, i32* %int32, i64 %idxprom
132  %0 = load i32, i32* %arrayidx, align 4
133  %vecins = insertelement <4 x i32> %vec, i32 %0, i32 0
134  ret <4 x i32> %vecins
135}
136
137; Function Attrs: norecurse nounwind readonly
138define <4 x i32> @s2v_test4(i32* nocapture readonly %int32, <4 x i32> %vec)  {
139; P9LE-LABEL: s2v_test4:
140; P9LE:       # %bb.0: # %entry
141; P9LE-NEXT:    lwz r3, 4(r3)
142; P9LE-NEXT:    mtfprwz f0, r3
143; P9LE-NEXT:    xxinsertw v2, vs0, 12
144; P9LE-NEXT:    blr
145;
146; P9BE-LABEL: s2v_test4:
147; P9BE:       # %bb.0: # %entry
148; P9BE-NEXT:    lwz r3, 4(r3)
149; P9BE-NEXT:    mtfprwz f0, r3
150; P9BE-NEXT:    xxinsertw v2, vs0, 0
151; P9BE-NEXT:    blr
152;
153; P8LE-LABEL: s2v_test4:
154; P8LE:       # %bb.0: # %entry
155; P8LE-NEXT:    addis r4, r2, .LCPI3_0@toc@ha
156; P8LE-NEXT:    addi r3, r3, 4
157; P8LE-NEXT:    addi r4, r4, .LCPI3_0@toc@l
158; P8LE-NEXT:    lxsiwzx v4, 0, r3
159; P8LE-NEXT:    lvx v3, 0, r4
160; P8LE-NEXT:    vperm v2, v2, v4, v3
161; P8LE-NEXT:    blr
162;
163; P8BE-LABEL: s2v_test4:
164; P8BE:       # %bb.0: # %entry
165; P8BE-NEXT:    addis r4, r2, .LCPI3_0@toc@ha
166; P8BE-NEXT:    addi r3, r3, 4
167; P8BE-NEXT:    addi r4, r4, .LCPI3_0@toc@l
168; P8BE-NEXT:    lxsiwzx v4, 0, r3
169; P8BE-NEXT:    lxvw4x v3, 0, r4
170; P8BE-NEXT:    vperm v2, v4, v2, v3
171; P8BE-NEXT:    blr
172entry:
173  %arrayidx = getelementptr inbounds i32, i32* %int32, i64 1
174  %0 = load i32, i32* %arrayidx, align 4
175  %vecins = insertelement <4 x i32> %vec, i32 %0, i32 0
176  ret <4 x i32> %vecins
177}
178
179; Function Attrs: norecurse nounwind readonly
180define <4 x i32> @s2v_test5(<4 x i32> %vec, i32* nocapture readonly %ptr1)  {
181; P9LE-LABEL: s2v_test5:
182; P9LE:       # %bb.0: # %entry
183; P9LE-NEXT:    lwz r3, 0(r5)
184; P9LE-NEXT:    mtfprwz f0, r3
185; P9LE-NEXT:    xxinsertw v2, vs0, 12
186; P9LE-NEXT:    blr
187;
188; P9BE-LABEL: s2v_test5:
189; P9BE:       # %bb.0: # %entry
190; P9BE-NEXT:    lwz r3, 0(r5)
191; P9BE-NEXT:    mtfprwz f0, r3
192; P9BE-NEXT:    xxinsertw v2, vs0, 0
193; P9BE-NEXT:    blr
194;
195; P8LE-LABEL: s2v_test5:
196; P8LE:       # %bb.0: # %entry
197; P8LE-NEXT:    addis r3, r2, .LCPI4_0@toc@ha
198; P8LE-NEXT:    lxsiwzx v4, 0, r5
199; P8LE-NEXT:    addi r3, r3, .LCPI4_0@toc@l
200; P8LE-NEXT:    lvx v3, 0, r3
201; P8LE-NEXT:    vperm v2, v2, v4, v3
202; P8LE-NEXT:    blr
203;
204; P8BE-LABEL: s2v_test5:
205; P8BE:       # %bb.0: # %entry
206; P8BE-NEXT:    addis r3, r2, .LCPI4_0@toc@ha
207; P8BE-NEXT:    lxsiwzx v4, 0, r5
208; P8BE-NEXT:    addi r3, r3, .LCPI4_0@toc@l
209; P8BE-NEXT:    lxvw4x v3, 0, r3
210; P8BE-NEXT:    vperm v2, v4, v2, v3
211; P8BE-NEXT:    blr
212entry:
213  %0 = load i32, i32* %ptr1, align 4
214  %vecins = insertelement <4 x i32> %vec, i32 %0, i32 0
215  ret <4 x i32> %vecins
216}
217
218; Function Attrs: norecurse nounwind readonly
219define <4 x float> @s2v_test_f1(float* nocapture readonly %f64, <4 x float> %vec)  {
220; P9LE-LABEL: s2v_test_f1:
221; P9LE:       # %bb.0: # %entry
222; P9LE-NEXT:    lwz r3, 0(r3)
223; P9LE-NEXT:    mtfprwz f0, r3
224; P9LE-NEXT:    xxinsertw v2, vs0, 12
225; P9LE-NEXT:    blr
226;
227; P9BE-LABEL: s2v_test_f1:
228; P9BE:       # %bb.0: # %entry
229; P9BE-NEXT:    lwz r3, 0(r3)
230; P9BE-NEXT:    mtfprwz f0, r3
231; P9BE-NEXT:    xxinsertw v2, vs0, 0
232; P9BE-NEXT:    blr
233;
234; P8LE-LABEL: s2v_test_f1:
235; P8LE:       # %bb.0: # %entry
236; P8LE-NEXT:    addis r4, r2, .LCPI5_0@toc@ha
237; P8LE-NEXT:    lxsiwzx v4, 0, r3
238; P8LE-NEXT:    addi r4, r4, .LCPI5_0@toc@l
239; P8LE-NEXT:    lvx v3, 0, r4
240; P8LE-NEXT:    vperm v2, v2, v4, v3
241; P8LE-NEXT:    blr
242;
243; P8BE-LABEL: s2v_test_f1:
244; P8BE:       # %bb.0: # %entry
245; P8BE-NEXT:    addis r4, r2, .LCPI5_0@toc@ha
246; P8BE-NEXT:    lxsiwzx v4, 0, r3
247; P8BE-NEXT:    addi r4, r4, .LCPI5_0@toc@l
248; P8BE-NEXT:    lxvw4x v3, 0, r4
249; P8BE-NEXT:    vperm v2, v4, v2, v3
250; P8BE-NEXT:    blr
251entry:
252  %0 = load float, float* %f64, align 4
253  %vecins = insertelement <4 x float> %vec, float %0, i32 0
254  ret <4 x float> %vecins
255}
256
257; Function Attrs: norecurse nounwind readonly
258define <2 x float> @s2v_test_f2(float* nocapture readonly %f64, <2 x float> %vec)  {
259; P9LE-LABEL: s2v_test_f2:
260; P9LE:       # %bb.0: # %entry
261; P9LE-NEXT:    addi r3, r3, 4
262; P9LE-NEXT:    xxmrglw vs1, v2, v2
263; P9LE-NEXT:    lfiwzx f0, 0, r3
264; P9LE-NEXT:    xxmrghw v2, vs1, vs0
265; P9LE-NEXT:    blr
266;
267; P9BE-LABEL: s2v_test_f2:
268; P9BE:       # %bb.0: # %entry
269; P9BE-NEXT:    addi r3, r3, 4
270; P9BE-NEXT:    lxsiwzx v3, 0, r3
271; P9BE-NEXT:    vmrgow v2, v3, v2
272; P9BE-NEXT:    blr
273;
274; P8LE-LABEL: s2v_test_f2:
275; P8LE:       # %bb.0: # %entry
276; P8LE-NEXT:    addi r3, r3, 4
277; P8LE-NEXT:    xxmrglw vs1, v2, v2
278; P8LE-NEXT:    lfiwzx f0, 0, r3
279; P8LE-NEXT:    xxmrghw v2, vs1, vs0
280; P8LE-NEXT:    blr
281;
282; P8BE-LABEL: s2v_test_f2:
283; P8BE:       # %bb.0: # %entry
284; P8BE-NEXT:    addi r3, r3, 4
285; P8BE-NEXT:    lxsiwzx v3, 0, r3
286; P8BE-NEXT:    vmrgow v2, v3, v2
287; P8BE-NEXT:    blr
288entry:
289  %arrayidx = getelementptr inbounds float, float* %f64, i64 1
290  %0 = load float, float* %arrayidx, align 8
291  %vecins = insertelement <2 x float> %vec, float %0, i32 0
292  ret <2 x float> %vecins
293}
294
295; Function Attrs: norecurse nounwind readonly
296define <2 x float> @s2v_test_f3(float* nocapture readonly %f64, <2 x float> %vec, i32 signext %Idx)  {
297; P9LE-LABEL: s2v_test_f3:
298; P9LE:       # %bb.0: # %entry
299; P9LE-NEXT:    sldi r4, r7, 2
300; P9LE-NEXT:    xxmrglw vs1, v2, v2
301; P9LE-NEXT:    lfiwzx f0, r3, r4
302; P9LE-NEXT:    xxmrghw v2, vs1, vs0
303; P9LE-NEXT:    blr
304;
305; P9BE-LABEL: s2v_test_f3:
306; P9BE:       # %bb.0: # %entry
307; P9BE-NEXT:    sldi r4, r7, 2
308; P9BE-NEXT:    lxsiwzx v3, r3, r4
309; P9BE-NEXT:    vmrgow v2, v3, v2
310; P9BE-NEXT:    blr
311;
312; P8LE-LABEL: s2v_test_f3:
313; P8LE:       # %bb.0: # %entry
314; P8LE-NEXT:    sldi r4, r7, 2
315; P8LE-NEXT:    xxmrglw vs1, v2, v2
316; P8LE-NEXT:    lfiwzx f0, r3, r4
317; P8LE-NEXT:    xxmrghw v2, vs1, vs0
318; P8LE-NEXT:    blr
319;
320; P8BE-LABEL: s2v_test_f3:
321; P8BE:       # %bb.0: # %entry
322; P8BE-NEXT:    sldi r4, r7, 2
323; P8BE-NEXT:    lxsiwzx v3, r3, r4
324; P8BE-NEXT:    vmrgow v2, v3, v2
325; P8BE-NEXT:    blr
326entry:
327  %idxprom = sext i32 %Idx to i64
328  %arrayidx = getelementptr inbounds float, float* %f64, i64 %idxprom
329  %0 = load float, float* %arrayidx, align 8
330  %vecins = insertelement <2 x float> %vec, float %0, i32 0
331  ret <2 x float> %vecins
332}
333
334; Function Attrs: norecurse nounwind readonly
335define <2 x float> @s2v_test_f4(float* nocapture readonly %f64, <2 x float> %vec)  {
336; P9LE-LABEL: s2v_test_f4:
337; P9LE:       # %bb.0: # %entry
338; P9LE-NEXT:    addi r3, r3, 4
339; P9LE-NEXT:    xxmrglw vs1, v2, v2
340; P9LE-NEXT:    lfiwzx f0, 0, r3
341; P9LE-NEXT:    xxmrghw v2, vs1, vs0
342; P9LE-NEXT:    blr
343;
344; P9BE-LABEL: s2v_test_f4:
345; P9BE:       # %bb.0: # %entry
346; P9BE-NEXT:    addi r3, r3, 4
347; P9BE-NEXT:    lxsiwzx v3, 0, r3
348; P9BE-NEXT:    vmrgow v2, v3, v2
349; P9BE-NEXT:    blr
350;
351; P8LE-LABEL: s2v_test_f4:
352; P8LE:       # %bb.0: # %entry
353; P8LE-NEXT:    addi r3, r3, 4
354; P8LE-NEXT:    xxmrglw vs1, v2, v2
355; P8LE-NEXT:    lfiwzx f0, 0, r3
356; P8LE-NEXT:    xxmrghw v2, vs1, vs0
357; P8LE-NEXT:    blr
358;
359; P8BE-LABEL: s2v_test_f4:
360; P8BE:       # %bb.0: # %entry
361; P8BE-NEXT:    addi r3, r3, 4
362; P8BE-NEXT:    lxsiwzx v3, 0, r3
363; P8BE-NEXT:    vmrgow v2, v3, v2
364; P8BE-NEXT:    blr
365entry:
366  %arrayidx = getelementptr inbounds float, float* %f64, i64 1
367  %0 = load float, float* %arrayidx, align 8
368  %vecins = insertelement <2 x float> %vec, float %0, i32 0
369  ret <2 x float> %vecins
370}
371
372; Function Attrs: norecurse nounwind readonly
373define <2 x float> @s2v_test_f5(<2 x float> %vec, float* nocapture readonly %ptr1)  {
374; P9LE-LABEL: s2v_test_f5:
375; P9LE:       # %bb.0: # %entry
376; P9LE-NEXT:    lfiwzx f0, 0, r5
377; P9LE-NEXT:    xxmrglw vs1, v2, v2
378; P9LE-NEXT:    xxmrghw v2, vs1, vs0
379; P9LE-NEXT:    blr
380;
381; P9BE-LABEL: s2v_test_f5:
382; P9BE:       # %bb.0: # %entry
383; P9BE-NEXT:    lxsiwzx v3, 0, r5
384; P9BE-NEXT:    vmrgow v2, v3, v2
385; P9BE-NEXT:    blr
386;
387; P8LE-LABEL: s2v_test_f5:
388; P8LE:       # %bb.0: # %entry
389; P8LE-NEXT:    lfiwzx f0, 0, r5
390; P8LE-NEXT:    xxmrglw vs1, v2, v2
391; P8LE-NEXT:    xxmrghw v2, vs1, vs0
392; P8LE-NEXT:    blr
393;
394; P8BE-LABEL: s2v_test_f5:
395; P8BE:       # %bb.0: # %entry
396; P8BE-NEXT:    lxsiwzx v3, 0, r5
397; P8BE-NEXT:    vmrgow v2, v3, v2
398; P8BE-NEXT:    blr
399entry:
400  %0 = load float, float* %ptr1, align 8
401  %vecins = insertelement <2 x float> %vec, float %0, i32 0
402  ret <2 x float> %vecins
403}
404
405