1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mtriple=powerpc64-ibm-aix-xcoff -vec-extabi -mcpu=pwr9 < %s | FileCheck %s -check-prefix=CHECK-64
3; RUN: llc -verify-machineinstrs -mtriple=powerpc-ibm-aix-xcoff -vec-extabi -mcpu=pwr9 < %s | FileCheck %s -check-prefix=CHECK-32
4; RUN: llc -verify-machineinstrs -mtriple=powerpc64-ibm-aix-xcoff -vec-extabi -mcpu=pwr10 < %s | FileCheck %s -check-prefix=CHECK-64-P10
5; RUN: llc -verify-machineinstrs -mtriple=powerpc-ibm-aix-xcoff -vec-extabi -mcpu=pwr10 < %s | FileCheck %s -check-prefix=CHECK-32-P10
6
7; Byte indexed
8
9define <16 x i8> @testByte(<16 x i8> %a, i64 %b, i64 %idx) {
10; CHECK-64-LABEL: testByte:
11; CHECK-64:       # %bb.0: # %entry
12; CHECK-64-NEXT:    addi 5, 1, -16
13; CHECK-64-NEXT:    clrldi 4, 4, 60
14; CHECK-64-NEXT:    stxv 34, -16(1)
15; CHECK-64-NEXT:    stbx 3, 5, 4
16; CHECK-64-NEXT:    lxv 34, -16(1)
17; CHECK-64-NEXT:    blr
18;
19; CHECK-32-LABEL: testByte:
20; CHECK-32:       # %bb.0: # %entry
21; CHECK-32-NEXT:    addi 5, 1, -16
22; CHECK-32-NEXT:    clrlwi 3, 6, 28
23; CHECK-32-NEXT:    stxv 34, -16(1)
24; CHECK-32-NEXT:    stbx 4, 5, 3
25; CHECK-32-NEXT:    lxv 34, -16(1)
26; CHECK-32-NEXT:    blr
27;
28; CHECK-64-P10-LABEL: testByte:
29; CHECK-64-P10:       # %bb.0: # %entry
30; CHECK-64-P10-NEXT:    vinsblx 2, 4, 3
31; CHECK-64-P10-NEXT:    blr
32;
33; CHECK-32-P10-LABEL: testByte:
34; CHECK-32-P10:       # %bb.0: # %entry
35; CHECK-32-P10-NEXT:    vinsblx 2, 6, 4
36; CHECK-32-P10-NEXT:    blr
37entry:
38  %conv = trunc i64 %b to i8
39  %vecins = insertelement <16 x i8> %a, i8 %conv, i64 %idx
40  ret <16 x i8> %vecins
41}
42
43; Halfword indexed
44
45define <8 x i16> @testHalf(<8 x i16> %a, i64 %b, i64 %idx) {
46; CHECK-64-LABEL: testHalf:
47; CHECK-64:       # %bb.0: # %entry
48; CHECK-64-NEXT:    addi 5, 1, -16
49; CHECK-64-NEXT:    rlwinm 4, 4, 1, 28, 30
50; CHECK-64-NEXT:    stxv 34, -16(1)
51; CHECK-64-NEXT:    sthx 3, 5, 4
52; CHECK-64-NEXT:    lxv 34, -16(1)
53; CHECK-64-NEXT:    blr
54;
55; CHECK-32-LABEL: testHalf:
56; CHECK-32:       # %bb.0: # %entry
57; CHECK-32-NEXT:    addi 5, 1, -16
58; CHECK-32-NEXT:    rlwinm 3, 6, 1, 28, 30
59; CHECK-32-NEXT:    stxv 34, -16(1)
60; CHECK-32-NEXT:    sthx 4, 5, 3
61; CHECK-32-NEXT:    lxv 34, -16(1)
62; CHECK-32-NEXT:    blr
63;
64; CHECK-64-P10-LABEL: testHalf:
65; CHECK-64-P10:       # %bb.0: # %entry
66; CHECK-64-P10-NEXT:    slwi 4, 4, 1
67; CHECK-64-P10-NEXT:    vinshlx 2, 4, 3
68; CHECK-64-P10-NEXT:    blr
69;
70; CHECK-32-P10-LABEL: testHalf:
71; CHECK-32-P10:       # %bb.0: # %entry
72; CHECK-32-P10-NEXT:    slwi 3, 6, 1
73; CHECK-32-P10-NEXT:    vinshlx 2, 3, 4
74; CHECK-32-P10-NEXT:    blr
75entry:
76  %conv = trunc i64 %b to i16
77  %vecins = insertelement <8 x i16> %a, i16 %conv, i64 %idx
78  ret <8 x i16> %vecins
79}
80
81; Word indexed
82
83define <4 x i32> @testWord(<4 x i32> %a, i64 %b, i64 %idx) {
84; CHECK-64-LABEL: testWord:
85; CHECK-64:       # %bb.0: # %entry
86; CHECK-64-NEXT:    addi 5, 1, -16
87; CHECK-64-NEXT:    rlwinm 4, 4, 2, 28, 29
88; CHECK-64-NEXT:    stxv 34, -16(1)
89; CHECK-64-NEXT:    stwx 3, 5, 4
90; CHECK-64-NEXT:    lxv 34, -16(1)
91; CHECK-64-NEXT:    blr
92;
93; CHECK-32-LABEL: testWord:
94; CHECK-32:       # %bb.0: # %entry
95; CHECK-32-NEXT:    addi 5, 1, -16
96; CHECK-32-NEXT:    rlwinm 3, 6, 2, 28, 29
97; CHECK-32-NEXT:    stxv 34, -16(1)
98; CHECK-32-NEXT:    stwx 4, 5, 3
99; CHECK-32-NEXT:    lxv 34, -16(1)
100; CHECK-32-NEXT:    blr
101;
102; CHECK-64-P10-LABEL: testWord:
103; CHECK-64-P10:       # %bb.0: # %entry
104; CHECK-64-P10-NEXT:    slwi 4, 4, 2
105; CHECK-64-P10-NEXT:    vinswlx 2, 4, 3
106; CHECK-64-P10-NEXT:    blr
107;
108; CHECK-32-P10-LABEL: testWord:
109; CHECK-32-P10:       # %bb.0: # %entry
110; CHECK-32-P10-NEXT:    slwi 3, 6, 2
111; CHECK-32-P10-NEXT:    vinswlx 2, 3, 4
112; CHECK-32-P10-NEXT:    blr
113entry:
114  %conv = trunc i64 %b to i32
115  %vecins = insertelement <4 x i32> %a, i32 %conv, i64 %idx
116  ret <4 x i32> %vecins
117}
118
119; Word immediate
120
121define <4 x i32> @testWordImm(<4 x i32> %a, i64 %b) {
122; CHECK-64-LABEL: testWordImm:
123; CHECK-64:       # %bb.0: # %entry
124; CHECK-64-NEXT:    mtfprwz 0, 3
125; CHECK-64-NEXT:    xxinsertw 34, 0, 4
126; CHECK-64-NEXT:    xxinsertw 34, 0, 12
127; CHECK-64-NEXT:    blr
128;
129; CHECK-32-LABEL: testWordImm:
130; CHECK-32:       # %bb.0: # %entry
131; CHECK-32-NEXT:    mtfprwz 0, 4
132; CHECK-32-NEXT:    xxinsertw 34, 0, 4
133; CHECK-32-NEXT:    xxinsertw 34, 0, 12
134; CHECK-32-NEXT:    blr
135;
136; CHECK-64-P10-LABEL: testWordImm:
137; CHECK-64-P10:       # %bb.0: # %entry
138; CHECK-64-P10-NEXT:    vinsw 2, 3, 4
139; CHECK-64-P10-NEXT:    vinsw 2, 3, 12
140; CHECK-64-P10-NEXT:    blr
141;
142; CHECK-32-P10-LABEL: testWordImm:
143; CHECK-32-P10:       # %bb.0: # %entry
144; CHECK-32-P10-NEXT:    vinsw 2, 4, 4
145; CHECK-32-P10-NEXT:    vinsw 2, 4, 12
146; CHECK-32-P10-NEXT:    blr
147entry:
148  %conv = trunc i64 %b to i32
149  %vecins = insertelement <4 x i32> %a, i32 %conv, i32 1
150  %vecins2 = insertelement <4 x i32> %vecins, i32 %conv, i32 3
151  ret <4 x i32> %vecins2
152}
153
154; Doubleword indexed
155
156define <2 x i64> @testDoubleword(<2 x i64> %a, i64 %b, i64 %idx) {
157; CHECK-64-LABEL: testDoubleword:
158; CHECK-64:       # %bb.0: # %entry
159; CHECK-64-NEXT:    addi 5, 1, -16
160; CHECK-64-NEXT:    rlwinm 4, 4, 3, 28, 28
161; CHECK-64-NEXT:    stxv 34, -16(1)
162; CHECK-64-NEXT:    stdx 3, 5, 4
163; CHECK-64-NEXT:    lxv 34, -16(1)
164; CHECK-64-NEXT:    blr
165;
166; CHECK-32-LABEL: testDoubleword:
167; CHECK-32:       # %bb.0: # %entry
168; CHECK-32-NEXT:    add 5, 6, 6
169; CHECK-32-NEXT:    addi 7, 1, -32
170; CHECK-32-NEXT:    stxv 34, -32(1)
171; CHECK-32-NEXT:    rlwinm 6, 5, 2, 28, 29
172; CHECK-32-NEXT:    stwx 3, 7, 6
173; CHECK-32-NEXT:    addi 3, 5, 1
174; CHECK-32-NEXT:    addi 5, 1, -16
175; CHECK-32-NEXT:    lxv 0, -32(1)
176; CHECK-32-NEXT:    rlwinm 3, 3, 2, 28, 29
177; CHECK-32-NEXT:    stxv 0, -16(1)
178; CHECK-32-NEXT:    stwx 4, 5, 3
179; CHECK-32-NEXT:    lxv 34, -16(1)
180; CHECK-32-NEXT:    blr
181;
182; CHECK-64-P10-LABEL: testDoubleword:
183; CHECK-64-P10:       # %bb.0: # %entry
184; CHECK-64-P10-NEXT:    rlwinm 4, 4, 3, 0, 28
185; CHECK-64-P10-NEXT:    vinsdlx 2, 4, 3
186; CHECK-64-P10-NEXT:    blr
187;
188; CHECK-32-P10-LABEL: testDoubleword:
189; CHECK-32-P10:       # %bb.0: # %entry
190; CHECK-32-P10-NEXT:    add 5, 6, 6
191; CHECK-32-P10-NEXT:    slwi 6, 5, 2
192; CHECK-32-P10-NEXT:    vinswlx 2, 6, 3
193; CHECK-32-P10-NEXT:    addi 3, 5, 1
194; CHECK-32-P10-NEXT:    slwi 3, 3, 2
195; CHECK-32-P10-NEXT:    vinswlx 2, 3, 4
196; CHECK-32-P10-NEXT:    blr
197entry:
198  %vecins = insertelement <2 x i64> %a, i64 %b, i64 %idx
199  ret <2 x i64> %vecins
200}
201
202; Doubleword immediate
203
204define <2 x i64> @testDoublewordImm(<2 x i64> %a, i64 %b) {
205; CHECK-64-LABEL: testDoublewordImm:
206; CHECK-64:       # %bb.0: # %entry
207; CHECK-64-NEXT:    mtfprd 0, 3
208; CHECK-64-NEXT:    xxmrghd 34, 34, 0
209; CHECK-64-NEXT:    blr
210;
211; CHECK-32-LABEL: testDoublewordImm:
212; CHECK-32:       # %bb.0: # %entry
213; CHECK-32-NEXT:    mtfprwz 0, 3
214; CHECK-32-NEXT:    xxinsertw 34, 0, 8
215; CHECK-32-NEXT:    mtfprwz 0, 4
216; CHECK-32-NEXT:    xxinsertw 34, 0, 12
217; CHECK-32-NEXT:    blr
218;
219; CHECK-64-P10-LABEL: testDoublewordImm:
220; CHECK-64-P10:       # %bb.0: # %entry
221; CHECK-64-P10-NEXT:    vinsd 2, 3, 8
222; CHECK-64-P10-NEXT:    blr
223;
224; CHECK-32-P10-LABEL: testDoublewordImm:
225; CHECK-32-P10:       # %bb.0: # %entry
226; CHECK-32-P10-NEXT:    vinsw 2, 3, 8
227; CHECK-32-P10-NEXT:    vinsw 2, 4, 12
228; CHECK-32-P10-NEXT:    blr
229entry:
230  %vecins = insertelement <2 x i64> %a, i64 %b, i32 1
231  ret <2 x i64> %vecins
232}
233
234define <2 x i64> @testDoublewordImm2(<2 x i64> %a, i64 %b) {
235; CHECK-64-LABEL: testDoublewordImm2:
236; CHECK-64:       # %bb.0: # %entry
237; CHECK-64-NEXT:    mtfprd 0, 3
238; CHECK-64-NEXT:    xxpermdi 34, 0, 34, 1
239; CHECK-64-NEXT:    blr
240;
241; CHECK-32-LABEL: testDoublewordImm2:
242; CHECK-32:       # %bb.0: # %entry
243; CHECK-32-NEXT:    mtfprwz 0, 3
244; CHECK-32-NEXT:    xxinsertw 34, 0, 0
245; CHECK-32-NEXT:    mtfprwz 0, 4
246; CHECK-32-NEXT:    xxinsertw 34, 0, 4
247; CHECK-32-NEXT:    blr
248;
249; CHECK-64-P10-LABEL: testDoublewordImm2:
250; CHECK-64-P10:       # %bb.0: # %entry
251; CHECK-64-P10-NEXT:    vinsd 2, 3, 0
252; CHECK-64-P10-NEXT:    blr
253;
254; CHECK-32-P10-LABEL: testDoublewordImm2:
255; CHECK-32-P10:       # %bb.0: # %entry
256; CHECK-32-P10-NEXT:    vinsw 2, 3, 0
257; CHECK-32-P10-NEXT:    vinsw 2, 4, 4
258; CHECK-32-P10-NEXT:    blr
259entry:
260  %vecins = insertelement <2 x i64> %a, i64 %b, i32 0
261  ret <2 x i64> %vecins
262}
263
264; Float indexed
265
266define <4 x float> @testFloat1(<4 x float> %a, float %b, i32 zeroext %idx1) {
267; CHECK-64-LABEL: testFloat1:
268; CHECK-64:       # %bb.0: # %entry
269; CHECK-64-DAG:     rlwinm 3, 4, 2, 28, 29
270; CHECK-64-DAG:     addi 4, 1, -16
271; CHECK-64-NEXT:    stxv 34, -16(1)
272; CHECK-64-NEXT:    stfsx 1, 4, 3
273; CHECK-64-NEXT:    lxv 34, -16(1)
274; CHECK-64-NEXT:    blr
275;
276; CHECK-32-LABEL: testFloat1:
277; CHECK-32:       # %bb.0: # %entry
278; CHECK-32-NEXT:    rlwinm 3, 4, 2, 28, 29
279; CHECK-32-NEXT:    addi 4, 1, -16
280; CHECK-32-NEXT:    stxv 34, -16(1)
281; CHECK-32-NEXT:    stfsx 1, 4, 3
282; CHECK-32-NEXT:    lxv 34, -16(1)
283; CHECK-32-NEXT:    blr
284;
285; CHECK-64-P10-LABEL: testFloat1:
286; CHECK-64-P10:       # %bb.0: # %entry
287; CHECK-64-P10-NEXT:    xscvdpspn 35, 1
288; CHECK-64-P10-NEXT:    extsw 3, 4
289; CHECK-64-P10-NEXT:    slwi 3, 3, 2
290; CHECK-64-P10-NEXT:    vinswvlx 2, 3, 3
291; CHECK-64-P10-NEXT:    blr
292;
293; CHECK-32-P10-LABEL: testFloat1:
294; CHECK-32-P10:       # %bb.0: # %entry
295; CHECK-32-P10-NEXT:    xscvdpspn 35, 1
296; CHECK-32-P10-NEXT:    slwi 3, 4, 2
297; CHECK-32-P10-NEXT:    vinswvlx 2, 3, 3
298; CHECK-32-P10-NEXT:    blr
299entry:
300  %vecins = insertelement <4 x float> %a, float %b, i32 %idx1
301  ret <4 x float> %vecins
302}
303
304define <4 x float> @testFloat2(<4 x float> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) {
305; CHECK-64-LABEL: testFloat2:
306; CHECK-64:       # %bb.0: # %entry
307; CHECK-64-NEXT:    lwz 6, 0(3)
308; CHECK-64-DAG:     rlwinm 4, 4, 2, 28, 29
309; CHECK-64-DAG:     addi 7, 1, -32
310; CHECK-64-NEXT:    stxv 34, -32(1)
311; CHECK-64-NEXT:    stwx 6, 7, 4
312; CHECK-64-NEXT:    rlwinm 4, 5, 2, 28, 29
313; CHECK-64-NEXT:    addi 5, 1, -16
314; CHECK-64-NEXT:    lxv 0, -32(1)
315; CHECK-64-NEXT:    lwz 3, 1(3)
316; CHECK-64-NEXT:    stxv 0, -16(1)
317; CHECK-64-NEXT:    stwx 3, 5, 4
318; CHECK-64-NEXT:    lxv 34, -16(1)
319; CHECK-64-NEXT:    blr
320;
321; CHECK-32-LABEL: testFloat2:
322; CHECK-32:       # %bb.0: # %entry
323; CHECK-32-NEXT:    lwz 6, 0(3)
324; CHECK-32-NEXT:    addi 7, 1, -32
325; CHECK-32-NEXT:    rlwinm 4, 4, 2, 28, 29
326; CHECK-32-NEXT:    stxv 34, -32(1)
327; CHECK-32-NEXT:    rlwinm 5, 5, 2, 28, 29
328; CHECK-32-NEXT:    stwx 6, 7, 4
329; CHECK-32-NEXT:    addi 4, 1, -16
330; CHECK-32-NEXT:    lxv 0, -32(1)
331; CHECK-32-NEXT:    lwz 3, 1(3)
332; CHECK-32-NEXT:    stxv 0, -16(1)
333; CHECK-32-NEXT:    stwx 3, 4, 5
334; CHECK-32-NEXT:    lxv 34, -16(1)
335; CHECK-32-NEXT:    blr
336;
337; CHECK-64-P10-LABEL: testFloat2:
338; CHECK-64-P10:       # %bb.0: # %entry
339; CHECK-64-P10-NEXT:    lwz 6, 0(3)
340; CHECK-64-P10-NEXT:    extsw 4, 4
341; CHECK-64-P10-NEXT:    lwz 3, 1(3)
342; CHECK-64-P10-NEXT:    slwi 4, 4, 2
343; CHECK-64-P10-NEXT:    vinswlx 2, 4, 6
344; CHECK-64-P10-NEXT:    extsw 4, 5
345; CHECK-64-P10-NEXT:    slwi 4, 4, 2
346; CHECK-64-P10-NEXT:    vinswlx 2, 4, 3
347; CHECK-64-P10-NEXT:    blr
348;
349; CHECK-32-P10-LABEL: testFloat2:
350; CHECK-32-P10:       # %bb.0: # %entry
351; CHECK-32-P10-NEXT:    lwz 6, 0(3)
352; CHECK-32-P10-NEXT:    lwz 3, 1(3)
353; CHECK-32-P10-NEXT:    slwi 4, 4, 2
354; CHECK-32-P10-NEXT:    vinswlx 2, 4, 6
355; CHECK-32-P10-NEXT:    slwi 4, 5, 2
356; CHECK-32-P10-NEXT:    vinswlx 2, 4, 3
357; CHECK-32-P10-NEXT:    blr
358entry:
359  %0 = bitcast i8* %b to float*
360  %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 1
361  %1 = bitcast i8* %add.ptr1 to float*
362  %2 = load float, float* %0, align 4
363  %vecins = insertelement <4 x float> %a, float %2, i32 %idx1
364  %3 = load float, float* %1, align 4
365  %vecins2 = insertelement <4 x float> %vecins, float %3, i32 %idx2
366  ret <4 x float> %vecins2
367}
368
369define <4 x float> @testFloat3(<4 x float> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) {
370; CHECK-64-LABEL: testFloat3:
371; CHECK-64:       # %bb.0: # %entry
372; CHECK-64-NEXT:    lis 6, 1
373; CHECK-64-DAG:         rlwinm 4, 4, 2, 28, 29
374; CHECK-64-DAG:    addi 7, 1, -32
375; CHECK-64-NEXT:    lwzx 6, 3, 6
376; CHECK-64-NEXT:    stxv 34, -32(1)
377; CHECK-64-NEXT:    stwx 6, 7, 4
378; CHECK-64-NEXT:    li 4, 1
379; CHECK-64-NEXT:    lxv 0, -32(1)
380; CHECK-64-NEXT:    rldic 4, 4, 36, 27
381; CHECK-64-NEXT:    lwzx 3, 3, 4
382; CHECK-64-NEXT:    rlwinm 4, 5, 2, 28, 29
383; CHECK-64-NEXT:    addi 5, 1, -16
384; CHECK-64-NEXT:    stxv 0, -16(1)
385; CHECK-64-NEXT:    stwx 3, 5, 4
386; CHECK-64-NEXT:    lxv 34, -16(1)
387; CHECK-64-NEXT:    blr
388;
389; CHECK-32-LABEL: testFloat3:
390; CHECK-32:       # %bb.0: # %entry
391; CHECK-32-NEXT:    lis 6, 1
392; CHECK-32-NEXT:    addi 7, 1, -32
393; CHECK-32-NEXT:    rlwinm 4, 4, 2, 28, 29
394; CHECK-32-NEXT:    rlwinm 5, 5, 2, 28, 29
395; CHECK-32-NEXT:    lwzx 6, 3, 6
396; CHECK-32-NEXT:    stxv 34, -32(1)
397; CHECK-32-NEXT:    stwx 6, 7, 4
398; CHECK-32-NEXT:    addi 4, 1, -16
399; CHECK-32-NEXT:    lxv 0, -32(1)
400; CHECK-32-NEXT:    lwz 3, 0(3)
401; CHECK-32-NEXT:    stxv 0, -16(1)
402; CHECK-32-NEXT:    stwx 3, 4, 5
403; CHECK-32-NEXT:    lxv 34, -16(1)
404; CHECK-32-NEXT:    blr
405;
406; CHECK-64-P10-LABEL: testFloat3:
407; CHECK-64-P10:       # %bb.0: # %entry
408; CHECK-64-P10-NEXT:    plwz 6, 65536(3), 0
409; CHECK-64-P10-NEXT:    extsw 4, 4
410; CHECK-64-P10-NEXT:    slwi 4, 4, 2
411; CHECK-64-P10-NEXT:    vinswlx 2, 4, 6
412; CHECK-64-P10-NEXT:    li 4, 1
413; CHECK-64-P10-NEXT:    rldic 4, 4, 36, 27
414; CHECK-64-P10-NEXT:    lwzx 3, 3, 4
415; CHECK-64-P10-NEXT:    extsw 4, 5
416; CHECK-64-P10-NEXT:    slwi 4, 4, 2
417; CHECK-64-P10-NEXT:    vinswlx 2, 4, 3
418; CHECK-64-P10-NEXT:    blr
419;
420; CHECK-32-P10-LABEL: testFloat3:
421; CHECK-32-P10:       # %bb.0: # %entry
422; CHECK-32-P10-NEXT:    lis 6, 1
423; CHECK-32-P10-NEXT:    slwi 4, 4, 2
424; CHECK-32-P10-NEXT:    lwzx 6, 3, 6
425; CHECK-32-P10-NEXT:    lwz 3, 0(3)
426; CHECK-32-P10-NEXT:    vinswlx 2, 4, 6
427; CHECK-32-P10-NEXT:    slwi 4, 5, 2
428; CHECK-32-P10-NEXT:    vinswlx 2, 4, 3
429; CHECK-32-P10-NEXT:    blr
430entry:
431  %add.ptr = getelementptr inbounds i8, i8* %b, i64 65536
432  %0 = bitcast i8* %add.ptr to float*
433  %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 68719476736
434  %1 = bitcast i8* %add.ptr1 to float*
435  %2 = load float, float* %0, align 4
436  %vecins = insertelement <4 x float> %a, float %2, i32 %idx1
437  %3 = load float, float* %1, align 4
438  %vecins2 = insertelement <4 x float> %vecins, float %3, i32 %idx2
439  ret <4 x float> %vecins2
440}
441
442; Float immediate
443
444define <4 x float> @testFloatImm1(<4 x float> %a, float %b) {
445; CHECK-64-LABEL: testFloatImm1:
446; CHECK-64:       # %bb.0: # %entry
447; CHECK-64-NEXT:    xscvdpspn 0, 1
448; CHECK-64-NEXT:    xxinsertw 34, 0, 0
449; CHECK-64-NEXT:    xxinsertw 34, 0, 8
450; CHECK-64-NEXT:    blr
451;
452; CHECK-32-LABEL: testFloatImm1:
453; CHECK-32:       # %bb.0: # %entry
454; CHECK-32-NEXT:    xscvdpspn 0, 1
455; CHECK-32-NEXT:    xxinsertw 34, 0, 0
456; CHECK-32-NEXT:    xxinsertw 34, 0, 8
457; CHECK-32-NEXT:    blr
458;
459; CHECK-64-P10-LABEL: testFloatImm1:
460; CHECK-64-P10:       # %bb.0: # %entry
461; CHECK-64-P10-NEXT:    xscvdpspn 0, 1
462; CHECK-64-P10-NEXT:    xxinsertw 34, 0, 0
463; CHECK-64-P10-NEXT:    xxinsertw 34, 0, 8
464; CHECK-64-P10-NEXT:    blr
465;
466; CHECK-32-P10-LABEL: testFloatImm1:
467; CHECK-32-P10:       # %bb.0: # %entry
468; CHECK-32-P10-NEXT:    xscvdpspn 0, 1
469; CHECK-32-P10-NEXT:    xxinsertw 34, 0, 0
470; CHECK-32-P10-NEXT:    xxinsertw 34, 0, 8
471; CHECK-32-P10-NEXT:    blr
472entry:
473  %vecins = insertelement <4 x float> %a, float %b, i32 0
474  %vecins1 = insertelement <4 x float> %vecins, float %b, i32 2
475  ret <4 x float> %vecins1
476}
477
478define <4 x float> @testFloatImm2(<4 x float> %a, i32* %b) {
479; CHECK-64-LABEL: testFloatImm2:
480; CHECK-64:       # %bb.0: # %entry
481; CHECK-64-NEXT:    lfs 0, 0(3)
482; CHECK-64-NEXT:    xscvdpspn 0, 0
483; CHECK-64-NEXT:    xxinsertw 34, 0, 0
484; CHECK-64-NEXT:    lfs 0, 4(3)
485; CHECK-64-NEXT:    xscvdpspn 0, 0
486; CHECK-64-NEXT:    xxinsertw 34, 0, 8
487; CHECK-64-NEXT:    blr
488;
489; CHECK-32-LABEL: testFloatImm2:
490; CHECK-32:       # %bb.0: # %entry
491; CHECK-32-NEXT:    lfs 0, 0(3)
492; CHECK-32-NEXT:    xscvdpspn 0, 0
493; CHECK-32-NEXT:    xxinsertw 34, 0, 0
494; CHECK-32-NEXT:    lfs 0, 4(3)
495; CHECK-32-NEXT:    xscvdpspn 0, 0
496; CHECK-32-NEXT:    xxinsertw 34, 0, 8
497; CHECK-32-NEXT:    blr
498;
499; CHECK-64-P10-LABEL: testFloatImm2:
500; CHECK-64-P10:       # %bb.0: # %entry
501; CHECK-64-P10-NEXT:    lwz 4, 0(3)
502; CHECK-64-P10-NEXT:    lwz 3, 4(3)
503; CHECK-64-P10-NEXT:    vinsw 2, 4, 0
504; CHECK-64-P10-NEXT:    vinsw 2, 3, 8
505; CHECK-64-P10-NEXT:    blr
506;
507; CHECK-32-P10-LABEL: testFloatImm2:
508; CHECK-32-P10:       # %bb.0: # %entry
509; CHECK-32-P10-NEXT:    lwz 4, 0(3)
510; CHECK-32-P10-NEXT:    lwz 3, 4(3)
511; CHECK-32-P10-NEXT:    vinsw 2, 4, 0
512; CHECK-32-P10-NEXT:    vinsw 2, 3, 8
513; CHECK-32-P10-NEXT:    blr
514entry:
515  %0 = bitcast i32* %b to float*
516  %add.ptr1 = getelementptr inbounds i32, i32* %b, i64 1
517  %1 = bitcast i32* %add.ptr1 to float*
518  %2 = load float, float* %0, align 4
519  %vecins = insertelement <4 x float> %a, float %2, i32 0
520  %3 = load float, float* %1, align 4
521  %vecins2 = insertelement <4 x float> %vecins, float %3, i32 2
522  ret <4 x float> %vecins2
523}
524
525define <4 x float> @testFloatImm3(<4 x float> %a, i32* %b) {
526; CHECK-64-LABEL: testFloatImm3:
527; CHECK-64:       # %bb.0: # %entry
528; CHECK-64-NEXT:    lis 4, 4
529; CHECK-64-NEXT:    lfsx 0, 3, 4
530; CHECK-64-NEXT:    li 4, 1
531; CHECK-64-NEXT:    rldic 4, 4, 38, 25
532; CHECK-64-NEXT:    xscvdpspn 0, 0
533; CHECK-64-NEXT:    xxinsertw 34, 0, 0
534; CHECK-64-NEXT:    lfsx 0, 3, 4
535; CHECK-64-NEXT:    xscvdpspn 0, 0
536; CHECK-64-NEXT:    xxinsertw 34, 0, 8
537; CHECK-64-NEXT:    blr
538;
539; CHECK-32-LABEL: testFloatImm3:
540; CHECK-32:       # %bb.0: # %entry
541; CHECK-32-NEXT:    lis 4, 4
542; CHECK-32-NEXT:    lfsx 0, 3, 4
543; CHECK-32-NEXT:    xscvdpspn 0, 0
544; CHECK-32-NEXT:    xxinsertw 34, 0, 0
545; CHECK-32-NEXT:    lfs 0, 0(3)
546; CHECK-32-NEXT:    xscvdpspn 0, 0
547; CHECK-32-NEXT:    xxinsertw 34, 0, 8
548; CHECK-32-NEXT:    blr
549;
550; CHECK-64-P10-LABEL: testFloatImm3:
551; CHECK-64-P10:       # %bb.0: # %entry
552; CHECK-64-P10-NEXT:    plwz 4, 262144(3), 0
553; CHECK-64-P10-NEXT:    vinsw 2, 4, 0
554; CHECK-64-P10-NEXT:    li 4, 1
555; CHECK-64-P10-NEXT:    rldic 4, 4, 38, 25
556; CHECK-64-P10-NEXT:    lwzx 3, 3, 4
557; CHECK-64-P10-NEXT:    vinsw 2, 3, 8
558; CHECK-64-P10-NEXT:    blr
559;
560; CHECK-32-P10-LABEL: testFloatImm3:
561; CHECK-32-P10:       # %bb.0: # %entry
562; CHECK-32-P10-NEXT:    lis 4, 4
563; CHECK-32-P10-NEXT:    lwzx 4, 3, 4
564; CHECK-32-P10-NEXT:    lwz 3, 0(3)
565; CHECK-32-P10-NEXT:    vinsw 2, 4, 0
566; CHECK-32-P10-NEXT:    vinsw 2, 3, 8
567; CHECK-32-P10-NEXT:    blr
568entry:
569  %add.ptr = getelementptr inbounds i32, i32* %b, i64 65536
570  %0 = bitcast i32* %add.ptr to float*
571  %add.ptr1 = getelementptr inbounds i32, i32* %b, i64 68719476736
572  %1 = bitcast i32* %add.ptr1 to float*
573  %2 = load float, float* %0, align 4
574  %vecins = insertelement <4 x float> %a, float %2, i32 0
575  %3 = load float, float* %1, align 4
576  %vecins2 = insertelement <4 x float> %vecins, float %3, i32 2
577  ret <4 x float> %vecins2
578}
579
580; Double indexed
581
582define <2 x double> @testDouble1(<2 x double> %a, double %b, i32 zeroext %idx1) {
583; CHECK-64-LABEL: testDouble1:
584; CHECK-64:       # %bb.0: # %entry
585; CHECK-64:         rlwinm 3, 4, 3, 28, 28
586; CHECK-64-NEXT:    addi 4, 1, -16
587; CHECK-64-NEXT:    stxv 34, -16(1)
588; CHECK-64-NEXT:    stfdx 1, 4, 3
589; CHECK-64-NEXT:    lxv 34, -16(1)
590; CHECK-64-NEXT:    blr
591;
592; CHECK-32-LABEL: testDouble1:
593; CHECK-32:       # %bb.0: # %entry
594; CHECK-32-NEXT:    addi 4, 1, -16
595; CHECK-32-NEXT:    rlwinm 3, 5, 3, 28, 28
596; CHECK-32-NEXT:    stxv 34, -16(1)
597; CHECK-32-NEXT:    stfdx 1, 4, 3
598; CHECK-32-NEXT:    lxv 34, -16(1)
599; CHECK-32-NEXT:    blr
600;
601; CHECK-64-P10-LABEL: testDouble1:
602; CHECK-64-P10:       # %bb.0: # %entry
603; CHECK-64-P10-NEXT:    extsw 4, 4
604; CHECK-64-P10-NEXT:    mffprd 3, 1
605; CHECK-64-P10-NEXT:    rlwinm 4, 4, 3, 0, 28
606; CHECK-64-P10-NEXT:    vinsdlx 2, 4, 3
607; CHECK-64-P10-NEXT:    blr
608;
609; CHECK-32-P10-LABEL: testDouble1:
610; CHECK-32-P10:       # %bb.0: # %entry
611; CHECK-32-P10-DAG:     addi 4, 1, -16
612; CHECK-32-P10-DAG:     rlwinm 3, 5, 3, 28, 28
613; CHECK-32-P10-NEXT:    stxv 34, -16(1)
614; CHECK-32-P10-NEXT:    stfdx 1, 4, 3
615; CHECK-32-P10-NEXT:    lxv 34, -16(1)
616; CHECK-32-P10-NEXT:    blr
617entry:
618  %vecins = insertelement <2 x double> %a, double %b, i32 %idx1
619  ret <2 x double> %vecins
620}
621
622define <2 x double> @testDouble2(<2 x double> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) {
623; CHECK-64-LABEL: testDouble2:
624; CHECK-64:       # %bb.0: # %entry
625; CHECK-64-NEXT:    ld 6, 0(3)
626; CHECK-64-DAG:         rlwinm 4, 4, 3, 28, 28
627; CHECK-64-DAG:    addi 7, 1, -32
628; CHECK-64-NEXT:    stxv 34, -32(1)
629; CHECK-64-NEXT:    stdx 6, 7, 4
630; CHECK-64-NEXT:    li 4, 1
631; CHECK-64-NEXT:    lxv 0, -32(1)
632; CHECK-64-NEXT:    ldx 3, 3, 4
633; CHECK-64-NEXT:    rlwinm 4, 5, 3, 28, 28
634; CHECK-64-NEXT:    addi 5, 1, -16
635; CHECK-64-NEXT:    stxv 0, -16(1)
636; CHECK-64-NEXT:    stdx 3, 5, 4
637; CHECK-64-NEXT:    lxv 34, -16(1)
638; CHECK-64-NEXT:    blr
639;
640; CHECK-32-LABEL: testDouble2:
641; CHECK-32:       # %bb.0: # %entry
642; CHECK-32-NEXT:    lfd 0, 0(3)
643; CHECK-32-NEXT:    addi 6, 1, -32
644; CHECK-32-NEXT:    rlwinm 4, 4, 3, 28, 28
645; CHECK-32-NEXT:    stxv 34, -32(1)
646; CHECK-32-NEXT:    rlwinm 5, 5, 3, 28, 28
647; CHECK-32-NEXT:    stfdx 0, 6, 4
648; CHECK-32-NEXT:    lxv 0, -32(1)
649; CHECK-32-NEXT:    lfd 1, 1(3)
650; CHECK-32-NEXT:    addi 3, 1, -16
651; CHECK-32-NEXT:    stxv 0, -16(1)
652; CHECK-32-NEXT:    stfdx 1, 3, 5
653; CHECK-32-NEXT:    lxv 34, -16(1)
654; CHECK-32-NEXT:    blr
655;
656; CHECK-64-P10-LABEL: testDouble2:
657; CHECK-64-P10:       # %bb.0: # %entry
658; CHECK-64-P10-NEXT:    ld 6, 0(3)
659; CHECK-64-P10-NEXT:    extsw 4, 4
660; CHECK-64-P10-NEXT:    pld 3, 1(3), 0
661; CHECK-64-P10-NEXT:    rlwinm 4, 4, 3, 0, 28
662; CHECK-64-P10-NEXT:    vinsdlx 2, 4, 6
663; CHECK-64-P10-NEXT:    extsw 4, 5
664; CHECK-64-P10-NEXT:    rlwinm 4, 4, 3, 0, 28
665; CHECK-64-P10-NEXT:    vinsdlx 2, 4, 3
666; CHECK-64-P10-NEXT:    blr
667;
668; CHECK-32-P10-LABEL: testDouble2:
669; CHECK-32-P10:       # %bb.0: # %entry
670; CHECK-32-P10-NEXT:    lfd 0, 0(3)
671; CHECK-32-P10-DAG:     addi 6, 1, -32
672; CHECK-32-P10-DAG:     rlwinm 4, 4, 3, 28, 28
673; CHECK-32-P10-NEXT:    stxv 34, -32(1)
674; CHECK-32-P10-NEXT:    rlwinm 5, 5, 3, 28, 28
675; CHECK-32-P10-NEXT:    stfdx 0, 6, 4
676; CHECK-32-P10-NEXT:    lxv 0, -32(1)
677; CHECK-32-P10-NEXT:    plfd 1, 1(3), 0
678; CHECK-32-P10-NEXT:    addi 3, 1, -16
679; CHECK-32-P10-NEXT:    stxv 0, -16(1)
680; CHECK-32-P10-NEXT:    stfdx 1, 3, 5
681; CHECK-32-P10-NEXT:    lxv 34, -16(1)
682; CHECK-32-P10-NEXT:    blr
683entry:
684  %0 = bitcast i8* %b to double*
685  %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 1
686  %1 = bitcast i8* %add.ptr1 to double*
687  %2 = load double, double* %0, align 8
688  %vecins = insertelement <2 x double> %a, double %2, i32 %idx1
689  %3 = load double, double* %1, align 8
690  %vecins2 = insertelement <2 x double> %vecins, double %3, i32 %idx2
691  ret <2 x double> %vecins2
692}
693
694define <2 x double> @testDouble3(<2 x double> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) {
695; CHECK-64-LABEL: testDouble3:
696; CHECK-64:       # %bb.0: # %entry
697; CHECK-64-NEXT:    lis 6, 1
698; CHECK-64-DAG:     rlwinm 4, 4, 3, 28, 28
699; CHECK-64-DAG:     addi 7, 1, -32
700; CHECK-64-NEXT:    ldx 6, 3, 6
701; CHECK-64-NEXT:    stxv 34, -32(1)
702; CHECK-64-NEXT:    stdx 6, 7, 4
703; CHECK-64-NEXT:    li 4, 1
704; CHECK-64-NEXT:    lxv 0, -32(1)
705; CHECK-64-NEXT:    rldic 4, 4, 36, 27
706; CHECK-64-NEXT:    ldx 3, 3, 4
707; CHECK-64-NEXT:    rlwinm 4, 5, 3, 28, 28
708; CHECK-64-NEXT:    addi 5, 1, -16
709; CHECK-64-NEXT:    stxv 0, -16(1)
710; CHECK-64-NEXT:    stdx 3, 5, 4
711; CHECK-64-NEXT:    lxv 34, -16(1)
712; CHECK-64-NEXT:    blr
713;
714; CHECK-32-LABEL: testDouble3:
715; CHECK-32:       # %bb.0: # %entry
716; CHECK-32-NEXT:    lis 6, 1
717; CHECK-32-NEXT:    rlwinm 4, 4, 3, 28, 28
718; CHECK-32-NEXT:    rlwinm 5, 5, 3, 28, 28
719; CHECK-32-NEXT:    lfdx 0, 3, 6
720; CHECK-32-NEXT:    addi 6, 1, -32
721; CHECK-32-NEXT:    stxv 34, -32(1)
722; CHECK-32-NEXT:    stfdx 0, 6, 4
723; CHECK-32-NEXT:    lxv 0, -32(1)
724; CHECK-32-NEXT:    lfd 1, 0(3)
725; CHECK-32-NEXT:    addi 3, 1, -16
726; CHECK-32-NEXT:    stxv 0, -16(1)
727; CHECK-32-NEXT:    stfdx 1, 3, 5
728; CHECK-32-NEXT:    lxv 34, -16(1)
729; CHECK-32-NEXT:    blr
730;
731; CHECK-64-P10-LABEL: testDouble3:
732; CHECK-64-P10:       # %bb.0: # %entry
733; CHECK-64-P10-NEXT:    pld 6, 65536(3), 0
734; CHECK-64-P10-NEXT:    extsw 4, 4
735; CHECK-64-P10-NEXT:    rlwinm 4, 4, 3, 0, 28
736; CHECK-64-P10-NEXT:    vinsdlx 2, 4, 6
737; CHECK-64-P10-NEXT:    li 4, 1
738; CHECK-64-P10-NEXT:    rldic 4, 4, 36, 27
739; CHECK-64-P10-NEXT:    ldx 3, 3, 4
740; CHECK-64-P10-NEXT:    extsw 4, 5
741; CHECK-64-P10-NEXT:    rlwinm 4, 4, 3, 0, 28
742; CHECK-64-P10-NEXT:    vinsdlx 2, 4, 3
743; CHECK-64-P10-NEXT:    blr
744;
745; CHECK-32-P10-LABEL: testDouble3:
746; CHECK-32-P10:       # %bb.0: # %entry
747; CHECK-32-P10-NEXT:    plfd 0, 65536(3), 0
748; CHECK-32-P10-DAG:     addi 6, 1, -32
749; CHECK-32-P10-DAG:     rlwinm 4, 4, 3, 28, 28
750; CHECK-32-P10-NEXT:    stxv 34, -32(1)
751; CHECK-32-P10-NEXT:    rlwinm 5, 5, 3, 28, 28
752; CHECK-32-P10-NEXT:    stfdx 0, 6, 4
753; CHECK-32-P10-NEXT:    lxv 0, -32(1)
754; CHECK-32-P10-NEXT:    lfd 1, 0(3)
755; CHECK-32-P10-NEXT:    addi 3, 1, -16
756; CHECK-32-P10-NEXT:    stxv 0, -16(1)
757; CHECK-32-P10-NEXT:    stfdx 1, 3, 5
758; CHECK-32-P10-NEXT:    lxv 34, -16(1)
759; CHECK-32-P10-NEXT:    blr
760entry:
761  %add.ptr = getelementptr inbounds i8, i8* %b, i64 65536
762  %0 = bitcast i8* %add.ptr to double*
763  %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 68719476736
764  %1 = bitcast i8* %add.ptr1 to double*
765  %2 = load double, double* %0, align 8
766  %vecins = insertelement <2 x double> %a, double %2, i32 %idx1
767  %3 = load double, double* %1, align 8
768  %vecins2 = insertelement <2 x double> %vecins, double %3, i32 %idx2
769  ret <2 x double> %vecins2
770}
771
772; Double immediate
773
774define <2 x double> @testDoubleImm1(<2 x double> %a, double %b) {
775; CHECK-64-LABEL: testDoubleImm1:
776; CHECK-64:       # %bb.0: # %entry
777; CHECK-64-NEXT:    # kill: def $f1 killed $f1 def $vsl1
778; CHECK-64-NEXT:    xxpermdi 34, 1, 34, 1
779; CHECK-64-NEXT:    blr
780;
781; CHECK-32-LABEL: testDoubleImm1:
782; CHECK-32:       # %bb.0: # %entry
783; CHECK-32-NEXT:    # kill: def $f1 killed $f1 def $vsl1
784; CHECK-32-NEXT:    xxpermdi 34, 1, 34, 1
785; CHECK-32-NEXT:    blr
786;
787; CHECK-64-P10-LABEL: testDoubleImm1:
788; CHECK-64-P10:       # %bb.0: # %entry
789; CHECK-64-P10-NEXT:    # kill: def $f1 killed $f1 def $vsl1
790; CHECK-64-P10-NEXT:    xxpermdi 34, 1, 34, 1
791; CHECK-64-P10-NEXT:    blr
792;
793; CHECK-32-P10-LABEL: testDoubleImm1:
794; CHECK-32-P10:       # %bb.0: # %entry
795; CHECK-32-P10-NEXT:    # kill: def $f1 killed $f1 def $vsl1
796; CHECK-32-P10-NEXT:    xxpermdi 34, 1, 34, 1
797; CHECK-32-P10-NEXT:    blr
798entry:
799  %vecins = insertelement <2 x double> %a, double %b, i32 0
800  ret <2 x double> %vecins
801}
802
803define <2 x double> @testDoubleImm2(<2 x double> %a, i32* %b) {
804; CHECK-64-LABEL: testDoubleImm2:
805; CHECK-64:       # %bb.0: # %entry
806; CHECK-64-NEXT:    lfd 0, 0(3)
807; CHECK-64-NEXT:    xxpermdi 34, 0, 34, 1
808; CHECK-64-NEXT:    blr
809;
810; CHECK-32-LABEL: testDoubleImm2:
811; CHECK-32:       # %bb.0: # %entry
812; CHECK-32-NEXT:    lfd 0, 0(3)
813; CHECK-32-NEXT:    xxpermdi 34, 0, 34, 1
814; CHECK-32-NEXT:    blr
815;
816; CHECK-64-P10-LABEL: testDoubleImm2:
817; CHECK-64-P10:       # %bb.0: # %entry
818; CHECK-64-P10-NEXT:    lfd 0, 0(3)
819; CHECK-64-P10-NEXT:    xxpermdi 34, 0, 34, 1
820; CHECK-64-P10-NEXT:    blr
821;
822; CHECK-32-P10-LABEL: testDoubleImm2:
823; CHECK-32-P10:       # %bb.0: # %entry
824; CHECK-32-P10-NEXT:    lfd 0, 0(3)
825; CHECK-32-P10-NEXT:    xxpermdi 34, 0, 34, 1
826; CHECK-32-P10-NEXT:    blr
827entry:
828  %0 = bitcast i32* %b to double*
829  %1 = load double, double* %0, align 8
830  %vecins = insertelement <2 x double> %a, double %1, i32 0
831  ret <2 x double> %vecins
832}
833
834define <2 x double> @testDoubleImm3(<2 x double> %a, i32* %b) {
835; CHECK-64-LABEL: testDoubleImm3:
836; CHECK-64:       # %bb.0: # %entry
837; CHECK-64-NEXT:    lfd 0, 4(3)
838; CHECK-64-NEXT:    xxpermdi 34, 0, 34, 1
839; CHECK-64-NEXT:    blr
840;
841; CHECK-32-LABEL: testDoubleImm3:
842; CHECK-32:       # %bb.0: # %entry
843; CHECK-32-NEXT:    lfd 0, 4(3)
844; CHECK-32-NEXT:    xxpermdi 34, 0, 34, 1
845; CHECK-32-NEXT:    blr
846;
847; CHECK-64-P10-LABEL: testDoubleImm3:
848; CHECK-64-P10:       # %bb.0: # %entry
849; CHECK-64-P10-NEXT:    lfd 0, 4(3)
850; CHECK-64-P10-NEXT:    xxpermdi 34, 0, 34, 1
851; CHECK-64-P10-NEXT:    blr
852;
853; CHECK-32-P10-LABEL: testDoubleImm3:
854; CHECK-32-P10:       # %bb.0: # %entry
855; CHECK-32-P10-NEXT:    lfd 0, 4(3)
856; CHECK-32-P10-NEXT:    xxpermdi 34, 0, 34, 1
857; CHECK-32-P10-NEXT:    blr
858entry:
859  %add.ptr = getelementptr inbounds i32, i32* %b, i64 1
860  %0 = bitcast i32* %add.ptr to double*
861  %1 = load double, double* %0, align 8
862  %vecins = insertelement <2 x double> %a, double %1, i32 0
863  ret <2 x double> %vecins
864}
865
866define <2 x double> @testDoubleImm4(<2 x double> %a, i32* %b) {
867; CHECK-64-LABEL: testDoubleImm4:
868; CHECK-64:       # %bb.0: # %entry
869; CHECK-64-NEXT:    lis 4, 4
870; CHECK-64-NEXT:    lfdx 0, 3, 4
871; CHECK-64-NEXT:    xxpermdi 34, 0, 34, 1
872; CHECK-64-NEXT:    blr
873;
874; CHECK-32-LABEL: testDoubleImm4:
875; CHECK-32:       # %bb.0: # %entry
876; CHECK-32-NEXT:    lis 4, 4
877; CHECK-32-NEXT:    lfdx 0, 3, 4
878; CHECK-32-NEXT:    xxpermdi 34, 0, 34, 1
879; CHECK-32-NEXT:    blr
880;
881; CHECK-64-P10-LABEL: testDoubleImm4:
882; CHECK-64-P10:       # %bb.0: # %entry
883; CHECK-64-P10-NEXT:    plfd 0, 262144(3), 0
884; CHECK-64-P10-NEXT:    xxpermdi 34, 0, 34, 1
885; CHECK-64-P10-NEXT:    blr
886;
887; CHECK-32-P10-LABEL: testDoubleImm4:
888; CHECK-32-P10:       # %bb.0: # %entry
889; CHECK-32-P10-NEXT:    plfd 0, 262144(3), 0
890; CHECK-32-P10-NEXT:    xxpermdi 34, 0, 34, 1
891; CHECK-32-P10-NEXT:    blr
892entry:
893  %add.ptr = getelementptr inbounds i32, i32* %b, i64 65536
894  %0 = bitcast i32* %add.ptr to double*
895  %1 = load double, double* %0, align 8
896  %vecins = insertelement <2 x double> %a, double %1, i32 0
897  ret <2 x double> %vecins
898}
899
900define <2 x double> @testDoubleImm5(<2 x double> %a, i32* %b) {
901; CHECK-64-LABEL: testDoubleImm5:
902; CHECK-64:       # %bb.0: # %entry
903; CHECK-64-NEXT:    li 4, 1
904; CHECK-64-NEXT:    rldic 4, 4, 38, 25
905; CHECK-64-NEXT:    lfdx 0, 3, 4
906; CHECK-64-NEXT:    xxpermdi 34, 0, 34, 1
907; CHECK-64-NEXT:    blr
908;
909; CHECK-32-LABEL: testDoubleImm5:
910; CHECK-32:       # %bb.0: # %entry
911; CHECK-32-NEXT:    lfd 0, 0(3)
912; CHECK-32-NEXT:    xxpermdi 34, 0, 34, 1
913; CHECK-32-NEXT:    blr
914;
915; CHECK-64-P10-LABEL: testDoubleImm5:
916; CHECK-64-P10:       # %bb.0: # %entry
917; CHECK-64-P10-NEXT:    li 4, 1
918; CHECK-64-P10-NEXT:    rldic 4, 4, 38, 25
919; CHECK-64-P10-NEXT:    lfdx 0, 3, 4
920; CHECK-64-P10-NEXT:    xxpermdi 34, 0, 34, 1
921; CHECK-64-P10-NEXT:    blr
922;
923; CHECK-32-P10-LABEL: testDoubleImm5:
924; CHECK-32-P10:       # %bb.0: # %entry
925; CHECK-32-P10-NEXT:    lfd 0, 0(3)
926; CHECK-32-P10-NEXT:    xxpermdi 34, 0, 34, 1
927; CHECK-32-P10-NEXT:    blr
928entry:
929  %add.ptr = getelementptr inbounds i32, i32* %b, i64 68719476736
930  %0 = bitcast i32* %add.ptr to double*
931  %1 = load double, double* %0, align 8
932  %vecins = insertelement <2 x double> %a, double %1, i32 0
933  ret <2 x double> %vecins
934}
935
936