1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
3; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names \
4; RUN:   -ppc-vsr-nums-as-vr < %s | FileCheck %s
5; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
6; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names \
7; RUN:   -ppc-vsr-nums-as-vr < %s | FileCheck %s --check-prefix=CHECK-BE
8; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
9; RUN:   -mcpu=pwr9 -ppc-asm-full-reg-names \
10; RUN:   -ppc-vsr-nums-as-vr < %s | FileCheck %s --check-prefix=CHECK-P9
11
12; Byte indexed
13
14define <16 x i8> @testByte(<16 x i8> %a, i64 %b, i64 %idx) {
15; CHECK-LABEL: testByte:
16; CHECK:       # %bb.0: # %entry
17; CHECK-NEXT:    vinsbrx v2, r6, r5
18; CHECK-NEXT:    blr
19;
20; CHECK-BE-LABEL: testByte:
21; CHECK-BE:       # %bb.0: # %entry
22; CHECK-BE-NEXT:    vinsblx v2, r6, r5
23; CHECK-BE-NEXT:    blr
24;
25; CHECK-P9-LABEL: testByte:
26; CHECK-P9:       # %bb.0: # %entry
27; CHECK-P9-NEXT:    addi r4, r1, -16
28; CHECK-P9-NEXT:    clrldi r3, r6, 60
29; CHECK-P9-NEXT:    stxv v2, -16(r1)
30; CHECK-P9-NEXT:    stbx r5, r4, r3
31; CHECK-P9-NEXT:    lxv v2, -16(r1)
32; CHECK-P9-NEXT:    blr
33entry:
34  %conv = trunc i64 %b to i8
35  %vecins = insertelement <16 x i8> %a, i8 %conv, i64 %idx
36  ret <16 x i8> %vecins
37}
38
39; Halfword indexed
40
41define <8 x i16> @testHalf(<8 x i16> %a, i64 %b, i64 %idx) {
42; CHECK-LABEL: testHalf:
43; CHECK:       # %bb.0: # %entry
44; CHECK-NEXT:    slwi r3, r6, 1
45; CHECK-NEXT:    vinshrx v2, r3, r5
46; CHECK-NEXT:    blr
47;
48; CHECK-BE-LABEL: testHalf:
49; CHECK-BE:       # %bb.0: # %entry
50; CHECK-BE-NEXT:    slwi r3, r6, 1
51; CHECK-BE-NEXT:    vinshlx v2, r3, r5
52; CHECK-BE-NEXT:    blr
53;
54; CHECK-P9-LABEL: testHalf:
55; CHECK-P9:       # %bb.0: # %entry
56; CHECK-P9-NEXT:    addi r4, r1, -16
57; CHECK-P9-NEXT:    rlwinm r3, r6, 1, 28, 30
58; CHECK-P9-NEXT:    stxv v2, -16(r1)
59; CHECK-P9-NEXT:    sthx r5, r4, r3
60; CHECK-P9-NEXT:    lxv v2, -16(r1)
61; CHECK-P9-NEXT:    blr
62entry:
63  %conv = trunc i64 %b to i16
64  %vecins = insertelement <8 x i16> %a, i16 %conv, i64 %idx
65  ret <8 x i16> %vecins
66}
67
68; Word indexed
69
70define <4 x i32> @testWord(<4 x i32> %a, i64 %b, i64 %idx) {
71; CHECK-LABEL: testWord:
72; CHECK:       # %bb.0: # %entry
73; CHECK-NEXT:    slwi r3, r6, 2
74; CHECK-NEXT:    vinswrx v2, r3, r5
75; CHECK-NEXT:    blr
76;
77; CHECK-BE-LABEL: testWord:
78; CHECK-BE:       # %bb.0: # %entry
79; CHECK-BE-NEXT:    slwi r3, r6, 2
80; CHECK-BE-NEXT:    vinswlx v2, r3, r5
81; CHECK-BE-NEXT:    blr
82;
83; CHECK-P9-LABEL: testWord:
84; CHECK-P9:       # %bb.0: # %entry
85; CHECK-P9-NEXT:    addi r4, r1, -16
86; CHECK-P9-NEXT:    rlwinm r3, r6, 2, 28, 29
87; CHECK-P9-NEXT:    stxv v2, -16(r1)
88; CHECK-P9-NEXT:    stwx r5, r4, r3
89; CHECK-P9-NEXT:    lxv v2, -16(r1)
90; CHECK-P9-NEXT:    blr
91entry:
92  %conv = trunc i64 %b to i32
93  %vecins = insertelement <4 x i32> %a, i32 %conv, i64 %idx
94  ret <4 x i32> %vecins
95}
96
97; Word immediate
98
99define <4 x i32> @testWordImm(<4 x i32> %a, i64 %b) {
100; CHECK-LABEL: testWordImm:
101; CHECK:       # %bb.0: # %entry
102; CHECK-NEXT:    vinsw v2, r5, 8
103; CHECK-NEXT:    vinsw v2, r5, 0
104; CHECK-NEXT:    blr
105;
106; CHECK-BE-LABEL: testWordImm:
107; CHECK-BE:       # %bb.0: # %entry
108; CHECK-BE-NEXT:    vinsw v2, r5, 4
109; CHECK-BE-NEXT:    vinsw v2, r5, 12
110; CHECK-BE-NEXT:    blr
111;
112; CHECK-P9-LABEL: testWordImm:
113; CHECK-P9:       # %bb.0: # %entry
114; CHECK-P9-NEXT:    mtfprwz f0, r5
115; CHECK-P9-NEXT:    xxinsertw v2, vs0, 4
116; CHECK-P9-NEXT:    xxinsertw v2, vs0, 12
117; CHECK-P9-NEXT:    blr
118entry:
119  %conv = trunc i64 %b to i32
120  %vecins = insertelement <4 x i32> %a, i32 %conv, i32 1
121  %vecins2 = insertelement <4 x i32> %vecins, i32 %conv, i32 3
122  ret <4 x i32> %vecins2
123}
124
125; Doubleword indexed
126
127define <2 x i64> @testDoubleword(<2 x i64> %a, i64 %b, i64 %idx) {
128; CHECK-LABEL: testDoubleword:
129; CHECK:       # %bb.0: # %entry
130; CHECK-NEXT:    rlwinm r3, r6, 3, 0, 28
131; CHECK-NEXT:    vinsdrx v2, r3, r5
132; CHECK-NEXT:    blr
133;
134; CHECK-BE-LABEL: testDoubleword:
135; CHECK-BE:       # %bb.0: # %entry
136; CHECK-BE-NEXT:    rlwinm r3, r6, 3, 0, 28
137; CHECK-BE-NEXT:    vinsdlx v2, r3, r5
138; CHECK-BE-NEXT:    blr
139;
140; CHECK-P9-LABEL: testDoubleword:
141; CHECK-P9:       # %bb.0: # %entry
142; CHECK-P9-NEXT:    addi r4, r1, -16
143; CHECK-P9-NEXT:    rlwinm r3, r6, 3, 28, 28
144; CHECK-P9-NEXT:    stxv v2, -16(r1)
145; CHECK-P9-NEXT:    stdx r5, r4, r3
146; CHECK-P9-NEXT:    lxv v2, -16(r1)
147; CHECK-P9-NEXT:    blr
148entry:
149  %vecins = insertelement <2 x i64> %a, i64 %b, i64 %idx
150  ret <2 x i64> %vecins
151}
152
153; Doubleword immediate
154
155define <2 x i64> @testDoublewordImm(<2 x i64> %a, i64 %b) {
156; CHECK-LABEL: testDoublewordImm:
157; CHECK:       # %bb.0: # %entry
158; CHECK-NEXT:    vinsd v2, r5, 0
159; CHECK-NEXT:    blr
160;
161; CHECK-BE-LABEL: testDoublewordImm:
162; CHECK-BE:       # %bb.0: # %entry
163; CHECK-BE-NEXT:    vinsd v2, r5, 8
164; CHECK-BE-NEXT:    blr
165;
166; CHECK-P9-LABEL: testDoublewordImm:
167; CHECK-P9:       # %bb.0: # %entry
168; CHECK-P9-NEXT:    mtfprd f0, r5
169; CHECK-P9-NEXT:    xxmrghd v2, v2, vs0
170; CHECK-P9-NEXT:    blr
171entry:
172  %vecins = insertelement <2 x i64> %a, i64 %b, i32 1
173  ret <2 x i64> %vecins
174}
175
176define <2 x i64> @testDoublewordImm2(<2 x i64> %a, i64 %b) {
177; CHECK-LABEL: testDoublewordImm2:
178; CHECK:       # %bb.0: # %entry
179; CHECK-NEXT:    vinsd v2, r5, 8
180; CHECK-NEXT:    blr
181;
182; CHECK-BE-LABEL: testDoublewordImm2:
183; CHECK-BE:       # %bb.0: # %entry
184; CHECK-BE-NEXT:    vinsd v2, r5, 0
185; CHECK-BE-NEXT:    blr
186;
187; CHECK-P9-LABEL: testDoublewordImm2:
188; CHECK-P9:       # %bb.0: # %entry
189; CHECK-P9-NEXT:    mtfprd f0, r5
190; CHECK-P9-NEXT:    xxpermdi v2, vs0, v2, 1
191; CHECK-P9-NEXT:    blr
192entry:
193  %vecins = insertelement <2 x i64> %a, i64 %b, i32 0
194  ret <2 x i64> %vecins
195}
196
197; Float indexed
198
199define <4 x float> @testFloat1(<4 x float> %a, float %b, i32 zeroext %idx1) {
200; CHECK-LABEL: testFloat1:
201; CHECK:       # %bb.0: # %entry
202; CHECK-NEXT:    xscvdpspn vs0, f1
203; CHECK-NEXT:    extsw r3, r6
204; CHECK-NEXT:    slwi r3, r3, 2
205; CHECK-NEXT:    xxsldwi vs0, vs0, vs0, 3
206; CHECK-NEXT:    mffprwz r4, f0
207; CHECK-NEXT:    vinswrx v2, r3, r4
208; CHECK-NEXT:    blr
209;
210; CHECK-BE-LABEL: testFloat1:
211; CHECK-BE:       # %bb.0: # %entry
212; CHECK-BE-NEXT:    xscvdpspn vs0, f1
213; CHECK-BE-NEXT:    extsw r3, r6
214; CHECK-BE-NEXT:    slwi r3, r3, 2
215; CHECK-BE-NEXT:    xxsldwi vs0, vs0, vs0, 3
216; CHECK-BE-NEXT:    mffprwz r4, f0
217; CHECK-BE-NEXT:    vinswlx v2, r3, r4
218; CHECK-BE-NEXT:    blr
219;
220; CHECK-P9-LABEL: testFloat1:
221; CHECK-P9:       # %bb.0: # %entry
222; CHECK-P9-NEXT:    addi r4, r1, -16
223; CHECK-P9-NEXT:    rlwinm r3, r6, 2, 28, 29
224; CHECK-P9-NEXT:    stxv v2, -16(r1)
225; CHECK-P9-NEXT:    stfsx f1, r4, r3
226; CHECK-P9-NEXT:    lxv v2, -16(r1)
227; CHECK-P9-NEXT:    blr
228entry:
229  %vecins = insertelement <4 x float> %a, float %b, i32 %idx1
230  ret <4 x float> %vecins
231}
232
233define <4 x float> @testFloat2(<4 x float> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) {
234; CHECK-LABEL: testFloat2:
235; CHECK:       # %bb.0: # %entry
236; CHECK-NEXT:    lwz r3, 0(r5)
237; CHECK-NEXT:    extsw r4, r6
238; CHECK-NEXT:    slwi r4, r4, 2
239; CHECK-NEXT:    vinswrx v2, r4, r3
240; CHECK-NEXT:    lwz r3, 1(r5)
241; CHECK-NEXT:    extsw r4, r7
242; CHECK-NEXT:    slwi r4, r4, 2
243; CHECK-NEXT:    vinswrx v2, r4, r3
244; CHECK-NEXT:    blr
245;
246; CHECK-BE-LABEL: testFloat2:
247; CHECK-BE:       # %bb.0: # %entry
248; CHECK-BE-NEXT:    lwz r3, 0(r5)
249; CHECK-BE-NEXT:    extsw r4, r6
250; CHECK-BE-NEXT:    slwi r4, r4, 2
251; CHECK-BE-NEXT:    vinswlx v2, r4, r3
252; CHECK-BE-NEXT:    lwz r3, 1(r5)
253; CHECK-BE-NEXT:    extsw r4, r7
254; CHECK-BE-NEXT:    slwi r4, r4, 2
255; CHECK-BE-NEXT:    vinswlx v2, r4, r3
256; CHECK-BE-NEXT:    blr
257;
258; CHECK-P9-LABEL: testFloat2:
259; CHECK-P9:       # %bb.0: # %entry
260; CHECK-P9-NEXT:    lwz r3, 0(r5)
261; CHECK-P9-NEXT:    rlwinm r4, r6, 2, 28, 29
262; CHECK-P9-NEXT:    addi r6, r1, -32
263; CHECK-P9-NEXT:    stxv v2, -32(r1)
264; CHECK-P9-NEXT:    stwx r3, r6, r4
265; CHECK-P9-NEXT:    rlwinm r4, r7, 2, 28, 29
266; CHECK-P9-NEXT:    lxv vs0, -32(r1)
267; CHECK-P9-NEXT:    lwz r3, 1(r5)
268; CHECK-P9-NEXT:    addi r5, r1, -16
269; CHECK-P9-NEXT:    stxv vs0, -16(r1)
270; CHECK-P9-NEXT:    stwx r3, r5, r4
271; CHECK-P9-NEXT:    lxv v2, -16(r1)
272; CHECK-P9-NEXT:    blr
273entry:
274  %0 = bitcast i8* %b to float*
275  %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 1
276  %1 = bitcast i8* %add.ptr1 to float*
277  %2 = load float, float* %0, align 4
278  %vecins = insertelement <4 x float> %a, float %2, i32 %idx1
279  %3 = load float, float* %1, align 4
280  %vecins2 = insertelement <4 x float> %vecins, float %3, i32 %idx2
281  ret <4 x float> %vecins2
282}
283
284define <4 x float> @testFloat3(<4 x float> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) {
285; CHECK-LABEL: testFloat3:
286; CHECK:       # %bb.0: # %entry
287; CHECK-NEXT:    plwz r3, 65536(r5), 0
288; CHECK-NEXT:    extsw r4, r6
289; CHECK-NEXT:    slwi r4, r4, 2
290; CHECK-NEXT:    vinswrx v2, r4, r3
291; CHECK-NEXT:    li r3, 1
292; CHECK-NEXT:    extsw r4, r7
293; CHECK-NEXT:    rldic r3, r3, 36, 27
294; CHECK-NEXT:    slwi r4, r4, 2
295; CHECK-NEXT:    lwzx r3, r5, r3
296; CHECK-NEXT:    vinswrx v2, r4, r3
297; CHECK-NEXT:    blr
298;
299; CHECK-BE-LABEL: testFloat3:
300; CHECK-BE:       # %bb.0: # %entry
301; CHECK-BE-NEXT:    plwz r3, 65536(r5), 0
302; CHECK-BE-NEXT:    extsw r4, r6
303; CHECK-BE-NEXT:    slwi r4, r4, 2
304; CHECK-BE-NEXT:    vinswlx v2, r4, r3
305; CHECK-BE-NEXT:    li r3, 1
306; CHECK-BE-NEXT:    extsw r4, r7
307; CHECK-BE-NEXT:    rldic r3, r3, 36, 27
308; CHECK-BE-NEXT:    slwi r4, r4, 2
309; CHECK-BE-NEXT:    lwzx r3, r5, r3
310; CHECK-BE-NEXT:    vinswlx v2, r4, r3
311; CHECK-BE-NEXT:    blr
312;
313; CHECK-P9-LABEL: testFloat3:
314; CHECK-P9:       # %bb.0: # %entry
315; CHECK-P9-NEXT:    lis r3, 1
316; CHECK-P9-NEXT:    rlwinm r4, r6, 2, 28, 29
317; CHECK-P9-NEXT:    addi r6, r1, -32
318; CHECK-P9-NEXT:    lwzx r3, r5, r3
319; CHECK-P9-NEXT:    stxv v2, -32(r1)
320; CHECK-P9-NEXT:    stwx r3, r6, r4
321; CHECK-P9-NEXT:    li r3, 1
322; CHECK-P9-NEXT:    rlwinm r4, r7, 2, 28, 29
323; CHECK-P9-NEXT:    lxv vs0, -32(r1)
324; CHECK-P9-NEXT:    rldic r3, r3, 36, 27
325; CHECK-P9-NEXT:    lwzx r3, r5, r3
326; CHECK-P9-NEXT:    addi r5, r1, -16
327; CHECK-P9-NEXT:    stxv vs0, -16(r1)
328; CHECK-P9-NEXT:    stwx r3, r5, r4
329; CHECK-P9-NEXT:    lxv v2, -16(r1)
330; CHECK-P9-NEXT:    blr
331entry:
332  %add.ptr = getelementptr inbounds i8, i8* %b, i64 65536
333  %0 = bitcast i8* %add.ptr to float*
334  %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 68719476736
335  %1 = bitcast i8* %add.ptr1 to float*
336  %2 = load float, float* %0, align 4
337  %vecins = insertelement <4 x float> %a, float %2, i32 %idx1
338  %3 = load float, float* %1, align 4
339  %vecins2 = insertelement <4 x float> %vecins, float %3, i32 %idx2
340  ret <4 x float> %vecins2
341}
342
343; Float immediate
344
345define <4 x float> @testFloatImm1(<4 x float> %a, float %b) {
346; CHECK-LABEL: testFloatImm1:
347; CHECK:       # %bb.0: # %entry
348; CHECK-NEXT:    xscvdpspn vs0, f1
349; CHECK-NEXT:    xxsldwi vs0, vs0, vs0, 3
350; CHECK-NEXT:    xxinsertw v2, vs0, 12
351; CHECK-NEXT:    xxinsertw v2, vs0, 4
352; CHECK-NEXT:    blr
353;
354; CHECK-BE-LABEL: testFloatImm1:
355; CHECK-BE:       # %bb.0: # %entry
356; CHECK-BE-NEXT:    xscvdpspn vs0, f1
357; CHECK-BE-NEXT:    xxsldwi vs0, vs0, vs0, 3
358; CHECK-BE-NEXT:    xxinsertw v2, vs0, 0
359; CHECK-BE-NEXT:    xxinsertw v2, vs0, 8
360; CHECK-BE-NEXT:    blr
361;
362; CHECK-P9-LABEL: testFloatImm1:
363; CHECK-P9:       # %bb.0: # %entry
364; CHECK-P9-NEXT:    xscvdpspn vs0, f1
365; CHECK-P9-NEXT:    xxsldwi vs0, vs0, vs0, 3
366; CHECK-P9-NEXT:    xxinsertw v2, vs0, 0
367; CHECK-P9-NEXT:    xxinsertw v2, vs0, 8
368; CHECK-P9-NEXT:    blr
369entry:
370  %vecins = insertelement <4 x float> %a, float %b, i32 0
371  %vecins1 = insertelement <4 x float> %vecins, float %b, i32 2
372  ret <4 x float> %vecins1
373}
374
375define <4 x float> @testFloatImm2(<4 x float> %a, i32* %b) {
376; CHECK-LABEL: testFloatImm2:
377; CHECK:       # %bb.0: # %entry
378; CHECK-NEXT:    lwz r3, 0(r5)
379; CHECK-NEXT:    vinsw v2, r3, 12
380; CHECK-NEXT:    lwz r3, 4(r5)
381; CHECK-NEXT:    vinsw v2, r3, 4
382; CHECK-NEXT:    blr
383;
384; CHECK-BE-LABEL: testFloatImm2:
385; CHECK-BE:       # %bb.0: # %entry
386; CHECK-BE-NEXT:    lwz r3, 0(r5)
387; CHECK-BE-NEXT:    vinsw v2, r3, 0
388; CHECK-BE-NEXT:    lwz r3, 4(r5)
389; CHECK-BE-NEXT:    vinsw v2, r3, 8
390; CHECK-BE-NEXT:    blr
391;
392; CHECK-P9-LABEL: testFloatImm2:
393; CHECK-P9:       # %bb.0: # %entry
394; CHECK-P9-NEXT:    lfs f0, 0(r5)
395; CHECK-P9-NEXT:    xscvdpspn vs0, f0
396; CHECK-P9-NEXT:    xxsldwi vs0, vs0, vs0, 3
397; CHECK-P9-NEXT:    xxinsertw v2, vs0, 0
398; CHECK-P9-NEXT:    lfs f0, 4(r5)
399; CHECK-P9-NEXT:    xscvdpspn vs0, f0
400; CHECK-P9-NEXT:    xxsldwi vs0, vs0, vs0, 3
401; CHECK-P9-NEXT:    xxinsertw v2, vs0, 8
402; CHECK-P9-NEXT:    blr
403entry:
404  %0 = bitcast i32* %b to float*
405  %add.ptr1 = getelementptr inbounds i32, i32* %b, i64 1
406  %1 = bitcast i32* %add.ptr1 to float*
407  %2 = load float, float* %0, align 4
408  %vecins = insertelement <4 x float> %a, float %2, i32 0
409  %3 = load float, float* %1, align 4
410  %vecins2 = insertelement <4 x float> %vecins, float %3, i32 2
411  ret <4 x float> %vecins2
412}
413
414define <4 x float> @testFloatImm3(<4 x float> %a, i32* %b) {
415; CHECK-LABEL: testFloatImm3:
416; CHECK:       # %bb.0: # %entry
417; CHECK-NEXT:    plwz r3, 262144(r5), 0
418; CHECK-NEXT:    vinsw v2, r3, 12
419; CHECK-NEXT:    li r3, 1
420; CHECK-NEXT:    rldic r3, r3, 38, 25
421; CHECK-NEXT:    lwzx r3, r5, r3
422; CHECK-NEXT:    vinsw v2, r3, 4
423; CHECK-NEXT:    blr
424;
425; CHECK-BE-LABEL: testFloatImm3:
426; CHECK-BE:       # %bb.0: # %entry
427; CHECK-BE-NEXT:    plwz r3, 262144(r5), 0
428; CHECK-BE-NEXT:    vinsw v2, r3, 0
429; CHECK-BE-NEXT:    li r3, 1
430; CHECK-BE-NEXT:    rldic r3, r3, 38, 25
431; CHECK-BE-NEXT:    lwzx r3, r5, r3
432; CHECK-BE-NEXT:    vinsw v2, r3, 8
433; CHECK-BE-NEXT:    blr
434;
435; CHECK-P9-LABEL: testFloatImm3:
436; CHECK-P9:       # %bb.0: # %entry
437; CHECK-P9-NEXT:    lis r3, 4
438; CHECK-P9-NEXT:    lfsx f0, r5, r3
439; CHECK-P9-NEXT:    li r3, 1
440; CHECK-P9-NEXT:    rldic r3, r3, 38, 25
441; CHECK-P9-NEXT:    xscvdpspn vs0, f0
442; CHECK-P9-NEXT:    xxsldwi vs0, vs0, vs0, 3
443; CHECK-P9-NEXT:    xxinsertw v2, vs0, 0
444; CHECK-P9-NEXT:    lfsx f0, r5, r3
445; CHECK-P9-NEXT:    xscvdpspn vs0, f0
446; CHECK-P9-NEXT:    xxsldwi vs0, vs0, vs0, 3
447; CHECK-P9-NEXT:    xxinsertw v2, vs0, 8
448; CHECK-P9-NEXT:    blr
449entry:
450  %add.ptr = getelementptr inbounds i32, i32* %b, i64 65536
451  %0 = bitcast i32* %add.ptr to float*
452  %add.ptr1 = getelementptr inbounds i32, i32* %b, i64 68719476736
453  %1 = bitcast i32* %add.ptr1 to float*
454  %2 = load float, float* %0, align 4
455  %vecins = insertelement <4 x float> %a, float %2, i32 0
456  %3 = load float, float* %1, align 4
457  %vecins2 = insertelement <4 x float> %vecins, float %3, i32 2
458  ret <4 x float> %vecins2
459}
460
461; Double indexed
462
463define <2 x double> @testDouble1(<2 x double> %a, double %b, i32 zeroext %idx1) {
464; CHECK-LABEL: testDouble1:
465; CHECK:       # %bb.0: # %entry
466; CHECK-NEXT:    extsw r4, r6
467; CHECK-NEXT:    mffprd r3, f1
468; CHECK-NEXT:    rlwinm r4, r4, 3, 0, 28
469; CHECK-NEXT:    vinsdrx v2, r4, r3
470; CHECK-NEXT:    blr
471;
472; CHECK-BE-LABEL: testDouble1:
473; CHECK-BE:       # %bb.0: # %entry
474; CHECK-BE-NEXT:    extsw r4, r6
475; CHECK-BE-NEXT:    mffprd r3, f1
476; CHECK-BE-NEXT:    rlwinm r4, r4, 3, 0, 28
477; CHECK-BE-NEXT:    vinsdlx v2, r4, r3
478; CHECK-BE-NEXT:    blr
479;
480; CHECK-P9-LABEL: testDouble1:
481; CHECK-P9:       # %bb.0: # %entry
482; CHECK-P9-NEXT:    addi r4, r1, -16
483; CHECK-P9-NEXT:    rlwinm r3, r6, 3, 28, 28
484; CHECK-P9-NEXT:    stxv v2, -16(r1)
485; CHECK-P9-NEXT:    stfdx f1, r4, r3
486; CHECK-P9-NEXT:    lxv v2, -16(r1)
487; CHECK-P9-NEXT:    blr
488entry:
489  %vecins = insertelement <2 x double> %a, double %b, i32 %idx1
490  ret <2 x double> %vecins
491}
492
493define <2 x double> @testDouble2(<2 x double> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) {
494; CHECK-LABEL: testDouble2:
495; CHECK:       # %bb.0: # %entry
496; CHECK-NEXT:    ld r3, 0(r5)
497; CHECK-NEXT:    extsw r4, r6
498; CHECK-NEXT:    rlwinm r4, r4, 3, 0, 28
499; CHECK-NEXT:    vinsdrx v2, r4, r3
500; CHECK-NEXT:    pld r3, 1(r5), 0
501; CHECK-NEXT:    extsw r4, r7
502; CHECK-NEXT:    rlwinm r4, r4, 3, 0, 28
503; CHECK-NEXT:    vinsdrx v2, r4, r3
504; CHECK-NEXT:    blr
505;
506; CHECK-BE-LABEL: testDouble2:
507; CHECK-BE:       # %bb.0: # %entry
508; CHECK-BE-NEXT:    ld r3, 0(r5)
509; CHECK-BE-NEXT:    extsw r4, r6
510; CHECK-BE-NEXT:    rlwinm r4, r4, 3, 0, 28
511; CHECK-BE-NEXT:    vinsdlx v2, r4, r3
512; CHECK-BE-NEXT:    pld r3, 1(r5), 0
513; CHECK-BE-NEXT:    extsw r4, r7
514; CHECK-BE-NEXT:    rlwinm r4, r4, 3, 0, 28
515; CHECK-BE-NEXT:    vinsdlx v2, r4, r3
516; CHECK-BE-NEXT:    blr
517;
518; CHECK-P9-LABEL: testDouble2:
519; CHECK-P9:       # %bb.0: # %entry
520; CHECK-P9-NEXT:    ld r3, 0(r5)
521; CHECK-P9-NEXT:    rlwinm r4, r6, 3, 28, 28
522; CHECK-P9-NEXT:    addi r6, r1, -32
523; CHECK-P9-NEXT:    stxv v2, -32(r1)
524; CHECK-P9-NEXT:    stdx r3, r6, r4
525; CHECK-P9-NEXT:    li r3, 1
526; CHECK-P9-NEXT:    rlwinm r4, r7, 3, 28, 28
527; CHECK-P9-NEXT:    lxv vs0, -32(r1)
528; CHECK-P9-NEXT:    ldx r3, r5, r3
529; CHECK-P9-NEXT:    addi r5, r1, -16
530; CHECK-P9-NEXT:    stxv vs0, -16(r1)
531; CHECK-P9-NEXT:    stdx r3, r5, r4
532; CHECK-P9-NEXT:    lxv v2, -16(r1)
533; CHECK-P9-NEXT:    blr
534entry:
535  %0 = bitcast i8* %b to double*
536  %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 1
537  %1 = bitcast i8* %add.ptr1 to double*
538  %2 = load double, double* %0, align 8
539  %vecins = insertelement <2 x double> %a, double %2, i32 %idx1
540  %3 = load double, double* %1, align 8
541  %vecins2 = insertelement <2 x double> %vecins, double %3, i32 %idx2
542  ret <2 x double> %vecins2
543}
544
545define <2 x double> @testDouble3(<2 x double> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) {
546; CHECK-LABEL: testDouble3:
547; CHECK:       # %bb.0: # %entry
548; CHECK-NEXT:    pld r3, 65536(r5), 0
549; CHECK-NEXT:    extsw r4, r6
550; CHECK-NEXT:    rlwinm r4, r4, 3, 0, 28
551; CHECK-NEXT:    vinsdrx v2, r4, r3
552; CHECK-NEXT:    li r3, 1
553; CHECK-NEXT:    extsw r4, r7
554; CHECK-NEXT:    rldic r3, r3, 36, 27
555; CHECK-NEXT:    rlwinm r4, r4, 3, 0, 28
556; CHECK-NEXT:    ldx r3, r5, r3
557; CHECK-NEXT:    vinsdrx v2, r4, r3
558; CHECK-NEXT:    blr
559;
560; CHECK-BE-LABEL: testDouble3:
561; CHECK-BE:       # %bb.0: # %entry
562; CHECK-BE-NEXT:    pld r3, 65536(r5), 0
563; CHECK-BE-NEXT:    extsw r4, r6
564; CHECK-BE-NEXT:    rlwinm r4, r4, 3, 0, 28
565; CHECK-BE-NEXT:    vinsdlx v2, r4, r3
566; CHECK-BE-NEXT:    li r3, 1
567; CHECK-BE-NEXT:    extsw r4, r7
568; CHECK-BE-NEXT:    rldic r3, r3, 36, 27
569; CHECK-BE-NEXT:    rlwinm r4, r4, 3, 0, 28
570; CHECK-BE-NEXT:    ldx r3, r5, r3
571; CHECK-BE-NEXT:    vinsdlx v2, r4, r3
572; CHECK-BE-NEXT:    blr
573;
574; CHECK-P9-LABEL: testDouble3:
575; CHECK-P9:       # %bb.0: # %entry
576; CHECK-P9-NEXT:    lis r3, 1
577; CHECK-P9-NEXT:    rlwinm r4, r6, 3, 28, 28
578; CHECK-P9-NEXT:    addi r6, r1, -32
579; CHECK-P9-NEXT:    ldx r3, r5, r3
580; CHECK-P9-NEXT:    stxv v2, -32(r1)
581; CHECK-P9-NEXT:    stdx r3, r6, r4
582; CHECK-P9-NEXT:    li r3, 1
583; CHECK-P9-NEXT:    rlwinm r4, r7, 3, 28, 28
584; CHECK-P9-NEXT:    lxv vs0, -32(r1)
585; CHECK-P9-NEXT:    rldic r3, r3, 36, 27
586; CHECK-P9-NEXT:    ldx r3, r5, r3
587; CHECK-P9-NEXT:    addi r5, r1, -16
588; CHECK-P9-NEXT:    stxv vs0, -16(r1)
589; CHECK-P9-NEXT:    stdx r3, r5, r4
590; CHECK-P9-NEXT:    lxv v2, -16(r1)
591; CHECK-P9-NEXT:    blr
592entry:
593  %add.ptr = getelementptr inbounds i8, i8* %b, i64 65536
594  %0 = bitcast i8* %add.ptr to double*
595  %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 68719476736
596  %1 = bitcast i8* %add.ptr1 to double*
597  %2 = load double, double* %0, align 8
598  %vecins = insertelement <2 x double> %a, double %2, i32 %idx1
599  %3 = load double, double* %1, align 8
600  %vecins2 = insertelement <2 x double> %vecins, double %3, i32 %idx2
601  ret <2 x double> %vecins2
602}
603
604; Double immediate
605
606define <2 x double> @testDoubleImm1(<2 x double> %a, double %b) {
607; CHECK-LABEL: testDoubleImm1:
608; CHECK:       # %bb.0: # %entry
609; CHECK-NEXT:    # kill: def $f1 killed $f1 def $vsl1
610; CHECK-NEXT:    xxmrghd v2, v2, vs1
611; CHECK-NEXT:    blr
612;
613; CHECK-BE-LABEL: testDoubleImm1:
614; CHECK-BE:       # %bb.0: # %entry
615; CHECK-BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
616; CHECK-BE-NEXT:    xxpermdi v2, vs1, v2, 1
617; CHECK-BE-NEXT:    blr
618;
619; CHECK-P9-LABEL: testDoubleImm1:
620; CHECK-P9:       # %bb.0: # %entry
621; CHECK-P9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
622; CHECK-P9-NEXT:    xxpermdi v2, vs1, v2, 1
623; CHECK-P9-NEXT:    blr
624entry:
625  %vecins = insertelement <2 x double> %a, double %b, i32 0
626  ret <2 x double> %vecins
627}
628
629define <2 x double> @testDoubleImm2(<2 x double> %a, i32* %b) {
630; CHECK-LABEL: testDoubleImm2:
631; CHECK:       # %bb.0: # %entry
632; CHECK-NEXT:    lfd f0, 0(r5)
633; CHECK-NEXT:    xxmrghd v2, v2, vs0
634; CHECK-NEXT:    blr
635;
636; CHECK-BE-LABEL: testDoubleImm2:
637; CHECK-BE:       # %bb.0: # %entry
638; CHECK-BE-NEXT:    lfd f0, 0(r5)
639; CHECK-BE-NEXT:    xxpermdi v2, vs0, v2, 1
640; CHECK-BE-NEXT:    blr
641;
642; CHECK-P9-LABEL: testDoubleImm2:
643; CHECK-P9:       # %bb.0: # %entry
644; CHECK-P9-NEXT:    lfd f0, 0(r5)
645; CHECK-P9-NEXT:    xxpermdi v2, vs0, v2, 1
646; CHECK-P9-NEXT:    blr
647entry:
648  %0 = bitcast i32* %b to double*
649  %1 = load double, double* %0, align 8
650  %vecins = insertelement <2 x double> %a, double %1, i32 0
651  ret <2 x double> %vecins
652}
653
654define <2 x double> @testDoubleImm3(<2 x double> %a, i32* %b) {
655; CHECK-LABEL: testDoubleImm3:
656; CHECK:       # %bb.0: # %entry
657; CHECK-NEXT:    lfd f0, 4(r5)
658; CHECK-NEXT:    xxmrghd v2, v2, vs0
659; CHECK-NEXT:    blr
660;
661; CHECK-BE-LABEL: testDoubleImm3:
662; CHECK-BE:       # %bb.0: # %entry
663; CHECK-BE-NEXT:    lfd f0, 4(r5)
664; CHECK-BE-NEXT:    xxpermdi v2, vs0, v2, 1
665; CHECK-BE-NEXT:    blr
666;
667; CHECK-P9-LABEL: testDoubleImm3:
668; CHECK-P9:       # %bb.0: # %entry
669; CHECK-P9-NEXT:    lfd f0, 4(r5)
670; CHECK-P9-NEXT:    xxpermdi v2, vs0, v2, 1
671; CHECK-P9-NEXT:    blr
672entry:
673  %add.ptr = getelementptr inbounds i32, i32* %b, i64 1
674  %0 = bitcast i32* %add.ptr to double*
675  %1 = load double, double* %0, align 8
676  %vecins = insertelement <2 x double> %a, double %1, i32 0
677  ret <2 x double> %vecins
678}
679
680define <2 x double> @testDoubleImm4(<2 x double> %a, i32* %b) {
681; CHECK-LABEL: testDoubleImm4:
682; CHECK:       # %bb.0: # %entry
683; CHECK-NEXT:    lis r3, 4
684; CHECK-NEXT:    lfdx f0, r5, r3
685; CHECK-NEXT:    xxmrghd v2, v2, vs0
686; CHECK-NEXT:    blr
687;
688; CHECK-BE-LABEL: testDoubleImm4:
689; CHECK-BE:       # %bb.0: # %entry
690; CHECK-BE-NEXT:    lis r3, 4
691; CHECK-BE-NEXT:    lfdx f0, r5, r3
692; CHECK-BE-NEXT:    xxpermdi v2, vs0, v2, 1
693; CHECK-BE-NEXT:    blr
694;
695; CHECK-P9-LABEL: testDoubleImm4:
696; CHECK-P9:       # %bb.0: # %entry
697; CHECK-P9-NEXT:    lis r3, 4
698; CHECK-P9-NEXT:    lfdx f0, r5, r3
699; CHECK-P9-NEXT:    xxpermdi v2, vs0, v2, 1
700; CHECK-P9-NEXT:    blr
701entry:
702  %add.ptr = getelementptr inbounds i32, i32* %b, i64 65536
703  %0 = bitcast i32* %add.ptr to double*
704  %1 = load double, double* %0, align 8
705  %vecins = insertelement <2 x double> %a, double %1, i32 0
706  ret <2 x double> %vecins
707}
708
709define <2 x double> @testDoubleImm5(<2 x double> %a, i32* %b) {
710; CHECK-LABEL: testDoubleImm5:
711; CHECK:       # %bb.0: # %entry
712; CHECK-NEXT:    li r3, 1
713; CHECK-NEXT:    rldic r3, r3, 38, 25
714; CHECK-NEXT:    lfdx f0, r5, r3
715; CHECK-NEXT:    xxmrghd v2, v2, vs0
716; CHECK-NEXT:    blr
717;
718; CHECK-BE-LABEL: testDoubleImm5:
719; CHECK-BE:       # %bb.0: # %entry
720; CHECK-BE-NEXT:    li r3, 1
721; CHECK-BE-NEXT:    rldic r3, r3, 38, 25
722; CHECK-BE-NEXT:    lfdx f0, r5, r3
723; CHECK-BE-NEXT:    xxpermdi v2, vs0, v2, 1
724; CHECK-BE-NEXT:    blr
725;
726; CHECK-P9-LABEL: testDoubleImm5:
727; CHECK-P9:       # %bb.0: # %entry
728; CHECK-P9-NEXT:    li r3, 1
729; CHECK-P9-NEXT:    rldic r3, r3, 38, 25
730; CHECK-P9-NEXT:    lfdx f0, r5, r3
731; CHECK-P9-NEXT:    xxpermdi v2, vs0, v2, 1
732; CHECK-P9-NEXT:    blr
733entry:
734  %add.ptr = getelementptr inbounds i32, i32* %b, i64 68719476736
735  %0 = bitcast i32* %add.ptr to double*
736  %1 = load double, double* %0, align 8
737  %vecins = insertelement <2 x double> %a, double %1, i32 0
738  ret <2 x double> %vecins
739}
740
741