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 -ppc-vsr-nums-as-vr \
4; RUN:   < %s | FileCheck %s --check-prefixes=CHECK,CHECK-P10
5; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
6; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
7; RUN:   < %s | FileCheck %s --check-prefixes=CHECK,CHECK-P10
8; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
9; RUN:   -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
10; RUN:   < %s | FileCheck %s --check-prefixes=CHECK,CHECK-P9
11; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
12; RUN:   -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
13; RUN:   < %s | FileCheck %s --check-prefixes=CHECK,CHECK-P9
14; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
15; RUN:   -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
16; RUN:   < %s | FileCheck %s --check-prefixes=CHECK-P8-LE
17; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
18; RUN:   -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
19; RUN:   < %s | FileCheck %s --check-prefixes=CHECK-P8-BE
20
21; Function Attrs: norecurse nounwind readonly uwtable willreturn
22define dso_local <16 x i8> @ld_0_vector(i64 %ptr) {
23; CHECK-LABEL: ld_0_vector:
24; CHECK:       # %bb.0: # %entry
25; CHECK-NEXT:    lxv v2, 0(r3)
26; CHECK-NEXT:    blr
27;
28; CHECK-P8-LE-LABEL: ld_0_vector:
29; CHECK-P8-LE:       # %bb.0: # %entry
30; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
31; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
32; CHECK-P8-LE-NEXT:    blr
33;
34; CHECK-P8-BE-LABEL: ld_0_vector:
35; CHECK-P8-BE:       # %bb.0: # %entry
36; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
37; CHECK-P8-BE-NEXT:    blr
38entry:
39  %0 = inttoptr i64 %ptr to <16 x i8>*
40  %1 = load <16 x i8>, <16 x i8>* %0, align 16
41  ret <16 x i8> %1
42}
43
44; Function Attrs: norecurse nounwind readonly uwtable willreturn
45define dso_local <16 x i8> @ld_unalign16_vector(i8* nocapture readonly %ptr) {
46; CHECK-P10-LABEL: ld_unalign16_vector:
47; CHECK-P10:       # %bb.0: # %entry
48; CHECK-P10-NEXT:    plxv v2, 1(r3), 0
49; CHECK-P10-NEXT:    blr
50;
51; CHECK-P9-LABEL: ld_unalign16_vector:
52; CHECK-P9:       # %bb.0: # %entry
53; CHECK-P9-NEXT:    li r4, 1
54; CHECK-P9-NEXT:    lxvx v2, r3, r4
55; CHECK-P9-NEXT:    blr
56;
57; CHECK-P8-LE-LABEL: ld_unalign16_vector:
58; CHECK-P8-LE:       # %bb.0: # %entry
59; CHECK-P8-LE-NEXT:    addi r3, r3, 1
60; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
61; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
62; CHECK-P8-LE-NEXT:    blr
63;
64; CHECK-P8-BE-LABEL: ld_unalign16_vector:
65; CHECK-P8-BE:       # %bb.0: # %entry
66; CHECK-P8-BE-NEXT:    addi r3, r3, 1
67; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
68; CHECK-P8-BE-NEXT:    blr
69entry:
70  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1
71  %0 = bitcast i8* %add.ptr to <16 x i8>*
72  %1 = load <16 x i8>, <16 x i8>* %0, align 16
73  ret <16 x i8> %1
74}
75
76; Function Attrs: norecurse nounwind readonly uwtable willreturn
77define dso_local <16 x i8> @ld_align16_vector(i8* nocapture readonly %ptr) {
78; CHECK-P10-LABEL: ld_align16_vector:
79; CHECK-P10:       # %bb.0: # %entry
80; CHECK-P10-NEXT:    plxv v2, 8(r3), 0
81; CHECK-P10-NEXT:    blr
82;
83; CHECK-P9-LABEL: ld_align16_vector:
84; CHECK-P9:       # %bb.0: # %entry
85; CHECK-P9-NEXT:    li r4, 8
86; CHECK-P9-NEXT:    lxvx v2, r3, r4
87; CHECK-P9-NEXT:    blr
88;
89; CHECK-P8-LE-LABEL: ld_align16_vector:
90; CHECK-P8-LE:       # %bb.0: # %entry
91; CHECK-P8-LE-NEXT:    addi r3, r3, 8
92; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
93; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
94; CHECK-P8-LE-NEXT:    blr
95;
96; CHECK-P8-BE-LABEL: ld_align16_vector:
97; CHECK-P8-BE:       # %bb.0: # %entry
98; CHECK-P8-BE-NEXT:    addi r3, r3, 8
99; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
100; CHECK-P8-BE-NEXT:    blr
101entry:
102  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
103  %0 = bitcast i8* %add.ptr to <16 x i8>*
104  %1 = load <16 x i8>, <16 x i8>* %0, align 16
105  ret <16 x i8> %1
106}
107
108; Function Attrs: norecurse nounwind readonly uwtable willreturn
109define dso_local <16 x i8> @ld_unalign32_vector(i8* nocapture readonly %ptr) {
110; CHECK-P10-LABEL: ld_unalign32_vector:
111; CHECK-P10:       # %bb.0: # %entry
112; CHECK-P10-NEXT:    plxv v2, 99999(r3), 0
113; CHECK-P10-NEXT:    blr
114;
115; CHECK-P9-LABEL: ld_unalign32_vector:
116; CHECK-P9:       # %bb.0: # %entry
117; CHECK-P9-NEXT:    lis r4, 1
118; CHECK-P9-NEXT:    ori r4, r4, 34463
119; CHECK-P9-NEXT:    lxvx v2, r3, r4
120; CHECK-P9-NEXT:    blr
121;
122; CHECK-P8-LE-LABEL: ld_unalign32_vector:
123; CHECK-P8-LE:       # %bb.0: # %entry
124; CHECK-P8-LE-NEXT:    lis r4, 1
125; CHECK-P8-LE-NEXT:    ori r4, r4, 34463
126; CHECK-P8-LE-NEXT:    lxvd2x vs0, r3, r4
127; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
128; CHECK-P8-LE-NEXT:    blr
129;
130; CHECK-P8-BE-LABEL: ld_unalign32_vector:
131; CHECK-P8-BE:       # %bb.0: # %entry
132; CHECK-P8-BE-NEXT:    lis r4, 1
133; CHECK-P8-BE-NEXT:    ori r4, r4, 34463
134; CHECK-P8-BE-NEXT:    lxvw4x v2, r3, r4
135; CHECK-P8-BE-NEXT:    blr
136entry:
137  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999
138  %0 = bitcast i8* %add.ptr to <16 x i8>*
139  %1 = load <16 x i8>, <16 x i8>* %0, align 16
140  ret <16 x i8> %1
141}
142
143; Function Attrs: norecurse nounwind readonly uwtable willreturn
144define dso_local <16 x i8> @ld_align32_vector(i8* nocapture readonly %ptr) {
145; CHECK-P10-LABEL: ld_align32_vector:
146; CHECK-P10:       # %bb.0: # %entry
147; CHECK-P10-NEXT:    plxv v2, 99999000(r3), 0
148; CHECK-P10-NEXT:    blr
149;
150; CHECK-P9-LABEL: ld_align32_vector:
151; CHECK-P9:       # %bb.0: # %entry
152; CHECK-P9-NEXT:    lis r4, 1525
153; CHECK-P9-NEXT:    ori r4, r4, 56600
154; CHECK-P9-NEXT:    lxvx v2, r3, r4
155; CHECK-P9-NEXT:    blr
156;
157; CHECK-P8-LE-LABEL: ld_align32_vector:
158; CHECK-P8-LE:       # %bb.0: # %entry
159; CHECK-P8-LE-NEXT:    lis r4, 1525
160; CHECK-P8-LE-NEXT:    ori r4, r4, 56600
161; CHECK-P8-LE-NEXT:    lxvd2x vs0, r3, r4
162; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
163; CHECK-P8-LE-NEXT:    blr
164;
165; CHECK-P8-BE-LABEL: ld_align32_vector:
166; CHECK-P8-BE:       # %bb.0: # %entry
167; CHECK-P8-BE-NEXT:    lis r4, 1525
168; CHECK-P8-BE-NEXT:    ori r4, r4, 56600
169; CHECK-P8-BE-NEXT:    lxvw4x v2, r3, r4
170; CHECK-P8-BE-NEXT:    blr
171entry:
172  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
173  %0 = bitcast i8* %add.ptr to <16 x i8>*
174  %1 = load <16 x i8>, <16 x i8>* %0, align 16
175  ret <16 x i8> %1
176}
177
178; Function Attrs: norecurse nounwind readonly uwtable willreturn
179define dso_local <16 x i8> @ld_unalign64_vector(i8* nocapture readonly %ptr) {
180; CHECK-P10-LABEL: ld_unalign64_vector:
181; CHECK-P10:       # %bb.0: # %entry
182; CHECK-P10-NEXT:    pli r4, 232
183; CHECK-P10-NEXT:    pli r5, 3567587329
184; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
185; CHECK-P10-NEXT:    lxvx v2, r3, r5
186; CHECK-P10-NEXT:    blr
187;
188; CHECK-P9-LABEL: ld_unalign64_vector:
189; CHECK-P9:       # %bb.0: # %entry
190; CHECK-P9-NEXT:    li r4, 29
191; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
192; CHECK-P9-NEXT:    oris r4, r4, 54437
193; CHECK-P9-NEXT:    ori r4, r4, 4097
194; CHECK-P9-NEXT:    lxvx v2, r3, r4
195; CHECK-P9-NEXT:    blr
196;
197; CHECK-P8-LE-LABEL: ld_unalign64_vector:
198; CHECK-P8-LE:       # %bb.0: # %entry
199; CHECK-P8-LE-NEXT:    li r4, 29
200; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
201; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
202; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
203; CHECK-P8-LE-NEXT:    lxvd2x vs0, r3, r4
204; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
205; CHECK-P8-LE-NEXT:    blr
206;
207; CHECK-P8-BE-LABEL: ld_unalign64_vector:
208; CHECK-P8-BE:       # %bb.0: # %entry
209; CHECK-P8-BE-NEXT:    li r4, 29
210; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
211; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
212; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
213; CHECK-P8-BE-NEXT:    lxvw4x v2, r3, r4
214; CHECK-P8-BE-NEXT:    blr
215entry:
216  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000001
217  %0 = bitcast i8* %add.ptr to <16 x i8>*
218  %1 = load <16 x i8>, <16 x i8>* %0, align 16
219  ret <16 x i8> %1
220}
221
222; Function Attrs: norecurse nounwind readonly uwtable willreturn
223define dso_local <16 x i8> @ld_align64_vector(i8* nocapture readonly %ptr) {
224; CHECK-P10-LABEL: ld_align64_vector:
225; CHECK-P10:       # %bb.0: # %entry
226; CHECK-P10-NEXT:    pli r4, 244140625
227; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
228; CHECK-P10-NEXT:    lxvx v2, r3, r4
229; CHECK-P10-NEXT:    blr
230;
231; CHECK-P9-LABEL: ld_align64_vector:
232; CHECK-P9:       # %bb.0: # %entry
233; CHECK-P9-NEXT:    lis r4, 3725
234; CHECK-P9-NEXT:    ori r4, r4, 19025
235; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
236; CHECK-P9-NEXT:    lxvx v2, r3, r4
237; CHECK-P9-NEXT:    blr
238;
239; CHECK-P8-LE-LABEL: ld_align64_vector:
240; CHECK-P8-LE:       # %bb.0: # %entry
241; CHECK-P8-LE-NEXT:    lis r4, 3725
242; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
243; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
244; CHECK-P8-LE-NEXT:    lxvd2x vs0, r3, r4
245; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
246; CHECK-P8-LE-NEXT:    blr
247;
248; CHECK-P8-BE-LABEL: ld_align64_vector:
249; CHECK-P8-BE:       # %bb.0: # %entry
250; CHECK-P8-BE-NEXT:    lis r4, 3725
251; CHECK-P8-BE-NEXT:    ori r4, r4, 19025
252; CHECK-P8-BE-NEXT:    rldic r4, r4, 12, 24
253; CHECK-P8-BE-NEXT:    lxvw4x v2, r3, r4
254; CHECK-P8-BE-NEXT:    blr
255entry:
256  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
257  %0 = bitcast i8* %add.ptr to <16 x i8>*
258  %1 = load <16 x i8>, <16 x i8>* %0, align 16
259  ret <16 x i8> %1
260}
261
262; Function Attrs: norecurse nounwind readonly uwtable willreturn
263define dso_local <16 x i8> @ld_reg_vector(i8* nocapture readonly %ptr, i64 %off) {
264; CHECK-LABEL: ld_reg_vector:
265; CHECK:       # %bb.0: # %entry
266; CHECK-NEXT:    lxvx v2, r3, r4
267; CHECK-NEXT:    blr
268;
269; CHECK-P8-LE-LABEL: ld_reg_vector:
270; CHECK-P8-LE:       # %bb.0: # %entry
271; CHECK-P8-LE-NEXT:    lxvd2x vs0, r3, r4
272; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
273; CHECK-P8-LE-NEXT:    blr
274;
275; CHECK-P8-BE-LABEL: ld_reg_vector:
276; CHECK-P8-BE:       # %bb.0: # %entry
277; CHECK-P8-BE-NEXT:    lxvw4x v2, r3, r4
278; CHECK-P8-BE-NEXT:    blr
279entry:
280  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
281  %0 = bitcast i8* %add.ptr to <16 x i8>*
282  %1 = load <16 x i8>, <16 x i8>* %0, align 16
283  ret <16 x i8> %1
284}
285
286; Function Attrs: norecurse nounwind readonly uwtable willreturn
287define dso_local <16 x i8> @ld_or_vector(i64 %ptr, i8 zeroext %off) {
288; CHECK-LABEL: ld_or_vector:
289; CHECK:       # %bb.0: # %entry
290; CHECK-NEXT:    or r3, r4, r3
291; CHECK-NEXT:    lxv v2, 0(r3)
292; CHECK-NEXT:    blr
293;
294; CHECK-P8-LE-LABEL: ld_or_vector:
295; CHECK-P8-LE:       # %bb.0: # %entry
296; CHECK-P8-LE-NEXT:    or r3, r4, r3
297; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
298; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
299; CHECK-P8-LE-NEXT:    blr
300;
301; CHECK-P8-BE-LABEL: ld_or_vector:
302; CHECK-P8-BE:       # %bb.0: # %entry
303; CHECK-P8-BE-NEXT:    or r3, r4, r3
304; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
305; CHECK-P8-BE-NEXT:    blr
306entry:
307  %conv = zext i8 %off to i64
308  %or = or i64 %conv, %ptr
309  %0 = inttoptr i64 %or to <16 x i8>*
310  %1 = load <16 x i8>, <16 x i8>* %0, align 16
311  ret <16 x i8> %1
312}
313
314; Function Attrs: norecurse nounwind readonly uwtable willreturn
315define dso_local <16 x i8> @ld_or2_vector(i64 %ptr, i8 zeroext %off) {
316; CHECK-LABEL: ld_or2_vector:
317; CHECK:       # %bb.0: # %entry
318; CHECK-NEXT:    rldicr r3, r3, 0, 51
319; CHECK-NEXT:    lxvx v2, r3, r4
320; CHECK-NEXT:    blr
321;
322; CHECK-P8-LE-LABEL: ld_or2_vector:
323; CHECK-P8-LE:       # %bb.0: # %entry
324; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 51
325; CHECK-P8-LE-NEXT:    lxvd2x vs0, r3, r4
326; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
327; CHECK-P8-LE-NEXT:    blr
328;
329; CHECK-P8-BE-LABEL: ld_or2_vector:
330; CHECK-P8-BE:       # %bb.0: # %entry
331; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 51
332; CHECK-P8-BE-NEXT:    lxvw4x v2, r3, r4
333; CHECK-P8-BE-NEXT:    blr
334entry:
335  %and = and i64 %ptr, -4096
336  %conv = zext i8 %off to i64
337  %or = or i64 %and, %conv
338  %0 = inttoptr i64 %or to <16 x i8>*
339  %1 = load <16 x i8>, <16 x i8>* %0, align 16
340  ret <16 x i8> %1
341}
342
343; Function Attrs: norecurse nounwind readonly uwtable willreturn
344define dso_local <16 x i8> @ld_not_disjoint16_vector(i64 %ptr) {
345; CHECK-LABEL: ld_not_disjoint16_vector:
346; CHECK:       # %bb.0: # %entry
347; CHECK-NEXT:    ori r3, r3, 6
348; CHECK-NEXT:    lxv v2, 0(r3)
349; CHECK-NEXT:    blr
350;
351; CHECK-P8-LE-LABEL: ld_not_disjoint16_vector:
352; CHECK-P8-LE:       # %bb.0: # %entry
353; CHECK-P8-LE-NEXT:    ori r3, r3, 6
354; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
355; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
356; CHECK-P8-LE-NEXT:    blr
357;
358; CHECK-P8-BE-LABEL: ld_not_disjoint16_vector:
359; CHECK-P8-BE:       # %bb.0: # %entry
360; CHECK-P8-BE-NEXT:    ori r3, r3, 6
361; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
362; CHECK-P8-BE-NEXT:    blr
363entry:
364  %or = or i64 %ptr, 6
365  %0 = inttoptr i64 %or to <16 x i8>*
366  %1 = load <16 x i8>, <16 x i8>* %0, align 16
367  ret <16 x i8> %1
368}
369
370; Function Attrs: norecurse nounwind readonly uwtable willreturn
371define dso_local <16 x i8> @ld_disjoint_unalign16_vector(i64 %ptr) {
372; CHECK-P10-LABEL: ld_disjoint_unalign16_vector:
373; CHECK-P10:       # %bb.0: # %entry
374; CHECK-P10-NEXT:    rldicr r3, r3, 0, 51
375; CHECK-P10-NEXT:    plxv v2, 6(r3), 0
376; CHECK-P10-NEXT:    blr
377;
378; CHECK-P9-LABEL: ld_disjoint_unalign16_vector:
379; CHECK-P9:       # %bb.0: # %entry
380; CHECK-P9-NEXT:    rldicr r3, r3, 0, 51
381; CHECK-P9-NEXT:    li r4, 6
382; CHECK-P9-NEXT:    lxvx v2, r3, r4
383; CHECK-P9-NEXT:    blr
384;
385; CHECK-P8-LE-LABEL: ld_disjoint_unalign16_vector:
386; CHECK-P8-LE:       # %bb.0: # %entry
387; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 51
388; CHECK-P8-LE-NEXT:    ori r3, r3, 6
389; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
390; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
391; CHECK-P8-LE-NEXT:    blr
392;
393; CHECK-P8-BE-LABEL: ld_disjoint_unalign16_vector:
394; CHECK-P8-BE:       # %bb.0: # %entry
395; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 51
396; CHECK-P8-BE-NEXT:    ori r3, r3, 6
397; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
398; CHECK-P8-BE-NEXT:    blr
399entry:
400  %and = and i64 %ptr, -4096
401  %or = or i64 %and, 6
402  %0 = inttoptr i64 %or to <16 x i8>*
403  %1 = load <16 x i8>, <16 x i8>* %0, align 16
404  ret <16 x i8> %1
405}
406
407; Function Attrs: norecurse nounwind readonly uwtable willreturn
408define dso_local <16 x i8> @ld_disjoint_align16_vector(i64 %ptr) {
409; CHECK-P10-LABEL: ld_disjoint_align16_vector:
410; CHECK-P10:       # %bb.0: # %entry
411; CHECK-P10-NEXT:    rldicr r3, r3, 0, 51
412; CHECK-P10-NEXT:    plxv v2, 24(r3), 0
413; CHECK-P10-NEXT:    blr
414;
415; CHECK-P9-LABEL: ld_disjoint_align16_vector:
416; CHECK-P9:       # %bb.0: # %entry
417; CHECK-P9-NEXT:    rldicr r3, r3, 0, 51
418; CHECK-P9-NEXT:    li r4, 24
419; CHECK-P9-NEXT:    lxvx v2, r3, r4
420; CHECK-P9-NEXT:    blr
421;
422; CHECK-P8-LE-LABEL: ld_disjoint_align16_vector:
423; CHECK-P8-LE:       # %bb.0: # %entry
424; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 51
425; CHECK-P8-LE-NEXT:    ori r3, r3, 24
426; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
427; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
428; CHECK-P8-LE-NEXT:    blr
429;
430; CHECK-P8-BE-LABEL: ld_disjoint_align16_vector:
431; CHECK-P8-BE:       # %bb.0: # %entry
432; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 51
433; CHECK-P8-BE-NEXT:    ori r3, r3, 24
434; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
435; CHECK-P8-BE-NEXT:    blr
436entry:
437  %and = and i64 %ptr, -4096
438  %or = or i64 %and, 24
439  %0 = inttoptr i64 %or to <16 x i8>*
440  %1 = load <16 x i8>, <16 x i8>* %0, align 16
441  ret <16 x i8> %1
442}
443
444; Function Attrs: norecurse nounwind readonly uwtable willreturn
445define dso_local <16 x i8> @ld_not_disjoint32_vector(i64 %ptr) {
446; CHECK-LABEL: ld_not_disjoint32_vector:
447; CHECK:       # %bb.0: # %entry
448; CHECK-NEXT:    ori r3, r3, 34463
449; CHECK-NEXT:    oris r3, r3, 1
450; CHECK-NEXT:    lxv v2, 0(r3)
451; CHECK-NEXT:    blr
452;
453; CHECK-P8-LE-LABEL: ld_not_disjoint32_vector:
454; CHECK-P8-LE:       # %bb.0: # %entry
455; CHECK-P8-LE-NEXT:    ori r3, r3, 34463
456; CHECK-P8-LE-NEXT:    oris r3, r3, 1
457; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
458; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
459; CHECK-P8-LE-NEXT:    blr
460;
461; CHECK-P8-BE-LABEL: ld_not_disjoint32_vector:
462; CHECK-P8-BE:       # %bb.0: # %entry
463; CHECK-P8-BE-NEXT:    ori r3, r3, 34463
464; CHECK-P8-BE-NEXT:    oris r3, r3, 1
465; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
466; CHECK-P8-BE-NEXT:    blr
467entry:
468  %or = or i64 %ptr, 99999
469  %0 = inttoptr i64 %or to <16 x i8>*
470  %1 = load <16 x i8>, <16 x i8>* %0, align 16
471  ret <16 x i8> %1
472}
473
474; Function Attrs: norecurse nounwind readonly uwtable willreturn
475define dso_local <16 x i8> @ld_disjoint_unalign32_vector(i64 %ptr) {
476; CHECK-P10-LABEL: ld_disjoint_unalign32_vector:
477; CHECK-P10:       # %bb.0: # %entry
478; CHECK-P10-NEXT:    rldicr r3, r3, 0, 43
479; CHECK-P10-NEXT:    plxv v2, 99999(r3), 0
480; CHECK-P10-NEXT:    blr
481;
482; CHECK-P9-LABEL: ld_disjoint_unalign32_vector:
483; CHECK-P9:       # %bb.0: # %entry
484; CHECK-P9-NEXT:    lis r4, 1
485; CHECK-P9-NEXT:    rldicr r3, r3, 0, 43
486; CHECK-P9-NEXT:    ori r4, r4, 34463
487; CHECK-P9-NEXT:    lxvx v2, r3, r4
488; CHECK-P9-NEXT:    blr
489;
490; CHECK-P8-LE-LABEL: ld_disjoint_unalign32_vector:
491; CHECK-P8-LE:       # %bb.0: # %entry
492; CHECK-P8-LE-NEXT:    lis r4, 1
493; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 43
494; CHECK-P8-LE-NEXT:    ori r4, r4, 34463
495; CHECK-P8-LE-NEXT:    lxvd2x vs0, r3, r4
496; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
497; CHECK-P8-LE-NEXT:    blr
498;
499; CHECK-P8-BE-LABEL: ld_disjoint_unalign32_vector:
500; CHECK-P8-BE:       # %bb.0: # %entry
501; CHECK-P8-BE-NEXT:    lis r4, 1
502; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 43
503; CHECK-P8-BE-NEXT:    ori r4, r4, 34463
504; CHECK-P8-BE-NEXT:    lxvw4x v2, r3, r4
505; CHECK-P8-BE-NEXT:    blr
506entry:
507  %and = and i64 %ptr, -1048576
508  %or = or i64 %and, 99999
509  %0 = inttoptr i64 %or to <16 x i8>*
510  %1 = load <16 x i8>, <16 x i8>* %0, align 16
511  ret <16 x i8> %1
512}
513
514; Function Attrs: norecurse nounwind readonly uwtable willreturn
515define dso_local <16 x i8> @ld_disjoint_align32_vector(i64 %ptr) {
516; CHECK-P10-LABEL: ld_disjoint_align32_vector:
517; CHECK-P10:       # %bb.0: # %entry
518; CHECK-P10-NEXT:    lis r4, -15264
519; CHECK-P10-NEXT:    and r3, r3, r4
520; CHECK-P10-NEXT:    plxv v2, 999990000(r3), 0
521; CHECK-P10-NEXT:    blr
522;
523; CHECK-P9-LABEL: ld_disjoint_align32_vector:
524; CHECK-P9:       # %bb.0: # %entry
525; CHECK-P9-NEXT:    lis r4, -15264
526; CHECK-P9-NEXT:    and r3, r3, r4
527; CHECK-P9-NEXT:    lis r4, 15258
528; CHECK-P9-NEXT:    ori r4, r4, 41712
529; CHECK-P9-NEXT:    lxvx v2, r3, r4
530; CHECK-P9-NEXT:    blr
531;
532; CHECK-P8-LE-LABEL: ld_disjoint_align32_vector:
533; CHECK-P8-LE:       # %bb.0: # %entry
534; CHECK-P8-LE-NEXT:    lis r4, -15264
535; CHECK-P8-LE-NEXT:    lis r5, 15258
536; CHECK-P8-LE-NEXT:    and r3, r3, r4
537; CHECK-P8-LE-NEXT:    ori r4, r5, 41712
538; CHECK-P8-LE-NEXT:    lxvd2x vs0, r3, r4
539; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
540; CHECK-P8-LE-NEXT:    blr
541;
542; CHECK-P8-BE-LABEL: ld_disjoint_align32_vector:
543; CHECK-P8-BE:       # %bb.0: # %entry
544; CHECK-P8-BE-NEXT:    lis r4, -15264
545; CHECK-P8-BE-NEXT:    lis r5, 15258
546; CHECK-P8-BE-NEXT:    and r3, r3, r4
547; CHECK-P8-BE-NEXT:    ori r4, r5, 41712
548; CHECK-P8-BE-NEXT:    lxvw4x v2, r3, r4
549; CHECK-P8-BE-NEXT:    blr
550entry:
551  %and = and i64 %ptr, -1000341504
552  %or = or i64 %and, 999990000
553  %0 = inttoptr i64 %or to <16 x i8>*
554  %1 = load <16 x i8>, <16 x i8>* %0, align 16
555  ret <16 x i8> %1
556}
557
558; Function Attrs: norecurse nounwind readonly uwtable willreturn
559define dso_local <16 x i8> @ld_not_disjoint64_vector(i64 %ptr) {
560; CHECK-P10-LABEL: ld_not_disjoint64_vector:
561; CHECK-P10:       # %bb.0: # %entry
562; CHECK-P10-NEXT:    pli r4, 232
563; CHECK-P10-NEXT:    pli r5, 3567587329
564; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
565; CHECK-P10-NEXT:    or r3, r3, r5
566; CHECK-P10-NEXT:    lxv v2, 0(r3)
567; CHECK-P10-NEXT:    blr
568;
569; CHECK-P9-LABEL: ld_not_disjoint64_vector:
570; CHECK-P9:       # %bb.0: # %entry
571; CHECK-P9-NEXT:    li r4, 29
572; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
573; CHECK-P9-NEXT:    oris r4, r4, 54437
574; CHECK-P9-NEXT:    ori r4, r4, 4097
575; CHECK-P9-NEXT:    or r3, r3, r4
576; CHECK-P9-NEXT:    lxv v2, 0(r3)
577; CHECK-P9-NEXT:    blr
578;
579; CHECK-P8-LE-LABEL: ld_not_disjoint64_vector:
580; CHECK-P8-LE:       # %bb.0: # %entry
581; CHECK-P8-LE-NEXT:    li r4, 29
582; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
583; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
584; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
585; CHECK-P8-LE-NEXT:    or r3, r3, r4
586; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
587; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
588; CHECK-P8-LE-NEXT:    blr
589;
590; CHECK-P8-BE-LABEL: ld_not_disjoint64_vector:
591; CHECK-P8-BE:       # %bb.0: # %entry
592; CHECK-P8-BE-NEXT:    li r4, 29
593; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
594; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
595; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
596; CHECK-P8-BE-NEXT:    or r3, r3, r4
597; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
598; CHECK-P8-BE-NEXT:    blr
599entry:
600  %or = or i64 %ptr, 1000000000001
601  %0 = inttoptr i64 %or to <16 x i8>*
602  %1 = load <16 x i8>, <16 x i8>* %0, align 16
603  ret <16 x i8> %1
604}
605
606; Function Attrs: norecurse nounwind readonly uwtable willreturn
607define dso_local <16 x i8> @ld_disjoint_unalign64_vector(i64 %ptr) {
608; CHECK-P10-LABEL: ld_disjoint_unalign64_vector:
609; CHECK-P10:       # %bb.0: # %entry
610; CHECK-P10-NEXT:    pli r4, 232
611; CHECK-P10-NEXT:    pli r5, 3567587329
612; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
613; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
614; CHECK-P10-NEXT:    lxvx v2, r3, r5
615; CHECK-P10-NEXT:    blr
616;
617; CHECK-P9-LABEL: ld_disjoint_unalign64_vector:
618; CHECK-P9:       # %bb.0: # %entry
619; CHECK-P9-NEXT:    li r4, 29
620; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
621; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
622; CHECK-P9-NEXT:    oris r4, r4, 54437
623; CHECK-P9-NEXT:    ori r4, r4, 4097
624; CHECK-P9-NEXT:    lxvx v2, r3, r4
625; CHECK-P9-NEXT:    blr
626;
627; CHECK-P8-LE-LABEL: ld_disjoint_unalign64_vector:
628; CHECK-P8-LE:       # %bb.0: # %entry
629; CHECK-P8-LE-NEXT:    li r4, 29
630; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
631; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
632; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
633; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
634; CHECK-P8-LE-NEXT:    lxvd2x vs0, r3, r4
635; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
636; CHECK-P8-LE-NEXT:    blr
637;
638; CHECK-P8-BE-LABEL: ld_disjoint_unalign64_vector:
639; CHECK-P8-BE:       # %bb.0: # %entry
640; CHECK-P8-BE-NEXT:    li r4, 29
641; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
642; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
643; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
644; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
645; CHECK-P8-BE-NEXT:    lxvw4x v2, r3, r4
646; CHECK-P8-BE-NEXT:    blr
647entry:
648  %and = and i64 %ptr, -1099511627776
649  %or = or i64 %and, 1000000000001
650  %0 = inttoptr i64 %or to <16 x i8>*
651  %1 = load <16 x i8>, <16 x i8>* %0, align 16
652  ret <16 x i8> %1
653}
654
655; Function Attrs: norecurse nounwind readonly uwtable willreturn
656define dso_local <16 x i8> @ld_disjoint_align64_vector(i64 %ptr) {
657; CHECK-P10-LABEL: ld_disjoint_align64_vector:
658; CHECK-P10:       # %bb.0: # %entry
659; CHECK-P10-NEXT:    pli r4, 244140625
660; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
661; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
662; CHECK-P10-NEXT:    lxvx v2, r3, r4
663; CHECK-P10-NEXT:    blr
664;
665; CHECK-P9-LABEL: ld_disjoint_align64_vector:
666; CHECK-P9:       # %bb.0: # %entry
667; CHECK-P9-NEXT:    lis r4, 3725
668; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
669; CHECK-P9-NEXT:    ori r4, r4, 19025
670; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
671; CHECK-P9-NEXT:    lxvx v2, r3, r4
672; CHECK-P9-NEXT:    blr
673;
674; CHECK-P8-LE-LABEL: ld_disjoint_align64_vector:
675; CHECK-P8-LE:       # %bb.0: # %entry
676; CHECK-P8-LE-NEXT:    lis r4, 3725
677; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
678; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
679; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
680; CHECK-P8-LE-NEXT:    lxvd2x vs0, r3, r4
681; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
682; CHECK-P8-LE-NEXT:    blr
683;
684; CHECK-P8-BE-LABEL: ld_disjoint_align64_vector:
685; CHECK-P8-BE:       # %bb.0: # %entry
686; CHECK-P8-BE-NEXT:    lis r4, 3725
687; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
688; CHECK-P8-BE-NEXT:    ori r4, r4, 19025
689; CHECK-P8-BE-NEXT:    rldic r4, r4, 12, 24
690; CHECK-P8-BE-NEXT:    lxvw4x v2, r3, r4
691; CHECK-P8-BE-NEXT:    blr
692entry:
693  %and = and i64 %ptr, -1099511627776
694  %or = or i64 %and, 1000000000000
695  %0 = inttoptr i64 %or to <16 x i8>*
696  %1 = load <16 x i8>, <16 x i8>* %0, align 4096
697  ret <16 x i8> %1
698}
699
700; Function Attrs: norecurse nounwind readonly uwtable willreturn
701define dso_local <16 x i8> @ld_cst_unalign16_vector() {
702; CHECK-LABEL: ld_cst_unalign16_vector:
703; CHECK:       # %bb.0: # %entry
704; CHECK-NEXT:    li r3, 255
705; CHECK-NEXT:    lxv v2, 0(r3)
706; CHECK-NEXT:    blr
707;
708; CHECK-P8-LE-LABEL: ld_cst_unalign16_vector:
709; CHECK-P8-LE:       # %bb.0: # %entry
710; CHECK-P8-LE-NEXT:    li r3, 255
711; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
712; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
713; CHECK-P8-LE-NEXT:    blr
714;
715; CHECK-P8-BE-LABEL: ld_cst_unalign16_vector:
716; CHECK-P8-BE:       # %bb.0: # %entry
717; CHECK-P8-BE-NEXT:    li r3, 255
718; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
719; CHECK-P8-BE-NEXT:    blr
720entry:
721  %0 = load <16 x i8>, <16 x i8>* inttoptr (i64 255 to <16 x i8>*), align 16
722  ret <16 x i8> %0
723}
724
725; Function Attrs: norecurse nounwind readonly uwtable willreturn
726define dso_local <16 x i8> @ld_cst_align16_vector() {
727; CHECK-LABEL: ld_cst_align16_vector:
728; CHECK:       # %bb.0: # %entry
729; CHECK-NEXT:    lxv v2, 4080(0)
730; CHECK-NEXT:    blr
731;
732; CHECK-P8-LE-LABEL: ld_cst_align16_vector:
733; CHECK-P8-LE:       # %bb.0: # %entry
734; CHECK-P8-LE-NEXT:    li r3, 4080
735; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
736; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
737; CHECK-P8-LE-NEXT:    blr
738;
739; CHECK-P8-BE-LABEL: ld_cst_align16_vector:
740; CHECK-P8-BE:       # %bb.0: # %entry
741; CHECK-P8-BE-NEXT:    li r3, 4080
742; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
743; CHECK-P8-BE-NEXT:    blr
744entry:
745  %0 = load <16 x i8>, <16 x i8>* inttoptr (i64 4080 to <16 x i8>*), align 16
746  ret <16 x i8> %0
747}
748
749; Function Attrs: norecurse nounwind readonly uwtable willreturn
750define dso_local <16 x i8> @ld_cst_unalign32_vector() {
751; CHECK-P10-LABEL: ld_cst_unalign32_vector:
752; CHECK-P10:       # %bb.0: # %entry
753; CHECK-P10-NEXT:    pli r3, 99999
754; CHECK-P10-NEXT:    lxv v2, 0(r3)
755; CHECK-P10-NEXT:    blr
756;
757; CHECK-P9-LABEL: ld_cst_unalign32_vector:
758; CHECK-P9:       # %bb.0: # %entry
759; CHECK-P9-NEXT:    lis r3, 1
760; CHECK-P9-NEXT:    ori r3, r3, 34463
761; CHECK-P9-NEXT:    lxv v2, 0(r3)
762; CHECK-P9-NEXT:    blr
763;
764; CHECK-P8-LE-LABEL: ld_cst_unalign32_vector:
765; CHECK-P8-LE:       # %bb.0: # %entry
766; CHECK-P8-LE-NEXT:    lis r3, 1
767; CHECK-P8-LE-NEXT:    ori r3, r3, 34463
768; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
769; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
770; CHECK-P8-LE-NEXT:    blr
771;
772; CHECK-P8-BE-LABEL: ld_cst_unalign32_vector:
773; CHECK-P8-BE:       # %bb.0: # %entry
774; CHECK-P8-BE-NEXT:    lis r3, 1
775; CHECK-P8-BE-NEXT:    ori r3, r3, 34463
776; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
777; CHECK-P8-BE-NEXT:    blr
778entry:
779  %0 = load <16 x i8>, <16 x i8>* inttoptr (i64 99999 to <16 x i8>*), align 16
780  ret <16 x i8> %0
781}
782
783; Function Attrs: norecurse nounwind readonly uwtable willreturn
784define dso_local <16 x i8> @ld_cst_align32_vector() {
785; CHECK-P10-LABEL: ld_cst_align32_vector:
786; CHECK-P10:       # %bb.0: # %entry
787; CHECK-P10-NEXT:    pli r3, 9999900
788; CHECK-P10-NEXT:    lxv v2, 0(r3)
789; CHECK-P10-NEXT:    blr
790;
791; CHECK-P9-LABEL: ld_cst_align32_vector:
792; CHECK-P9:       # %bb.0: # %entry
793; CHECK-P9-NEXT:    lis r3, 152
794; CHECK-P9-NEXT:    ori r3, r3, 38428
795; CHECK-P9-NEXT:    lxv v2, 0(r3)
796; CHECK-P9-NEXT:    blr
797;
798; CHECK-P8-LE-LABEL: ld_cst_align32_vector:
799; CHECK-P8-LE:       # %bb.0: # %entry
800; CHECK-P8-LE-NEXT:    lis r3, 152
801; CHECK-P8-LE-NEXT:    ori r3, r3, 38428
802; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
803; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
804; CHECK-P8-LE-NEXT:    blr
805;
806; CHECK-P8-BE-LABEL: ld_cst_align32_vector:
807; CHECK-P8-BE:       # %bb.0: # %entry
808; CHECK-P8-BE-NEXT:    lis r3, 152
809; CHECK-P8-BE-NEXT:    ori r3, r3, 38428
810; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
811; CHECK-P8-BE-NEXT:    blr
812entry:
813  %0 = load <16 x i8>, <16 x i8>* inttoptr (i64 9999900 to <16 x i8>*), align 16
814  ret <16 x i8> %0
815}
816
817; Function Attrs: norecurse nounwind readonly uwtable willreturn
818define dso_local <16 x i8> @ld_cst_unalign64_vector() {
819; CHECK-P10-LABEL: ld_cst_unalign64_vector:
820; CHECK-P10:       # %bb.0: # %entry
821; CHECK-P10-NEXT:    pli r3, 232
822; CHECK-P10-NEXT:    pli r4, 3567587329
823; CHECK-P10-NEXT:    rldimi r4, r3, 32, 0
824; CHECK-P10-NEXT:    lxv v2, 0(r4)
825; CHECK-P10-NEXT:    blr
826;
827; CHECK-P9-LABEL: ld_cst_unalign64_vector:
828; CHECK-P9:       # %bb.0: # %entry
829; CHECK-P9-NEXT:    li r3, 29
830; CHECK-P9-NEXT:    rldic r3, r3, 35, 24
831; CHECK-P9-NEXT:    oris r3, r3, 54437
832; CHECK-P9-NEXT:    ori r3, r3, 4097
833; CHECK-P9-NEXT:    lxv v2, 0(r3)
834; CHECK-P9-NEXT:    blr
835;
836; CHECK-P8-LE-LABEL: ld_cst_unalign64_vector:
837; CHECK-P8-LE:       # %bb.0: # %entry
838; CHECK-P8-LE-NEXT:    li r3, 29
839; CHECK-P8-LE-NEXT:    rldic r3, r3, 35, 24
840; CHECK-P8-LE-NEXT:    oris r3, r3, 54437
841; CHECK-P8-LE-NEXT:    ori r3, r3, 4097
842; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
843; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
844; CHECK-P8-LE-NEXT:    blr
845;
846; CHECK-P8-BE-LABEL: ld_cst_unalign64_vector:
847; CHECK-P8-BE:       # %bb.0: # %entry
848; CHECK-P8-BE-NEXT:    li r3, 29
849; CHECK-P8-BE-NEXT:    rldic r3, r3, 35, 24
850; CHECK-P8-BE-NEXT:    oris r3, r3, 54437
851; CHECK-P8-BE-NEXT:    ori r3, r3, 4097
852; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
853; CHECK-P8-BE-NEXT:    blr
854entry:
855  %0 = load <16 x i8>, <16 x i8>* inttoptr (i64 1000000000001 to <16 x i8>*), align 16
856  ret <16 x i8> %0
857}
858
859; Function Attrs: norecurse nounwind readonly uwtable willreturn
860define dso_local <16 x i8> @ld_cst_align64_vector() {
861; CHECK-P10-LABEL: ld_cst_align64_vector:
862; CHECK-P10:       # %bb.0: # %entry
863; CHECK-P10-NEXT:    pli r3, 244140625
864; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
865; CHECK-P10-NEXT:    lxv v2, 0(r3)
866; CHECK-P10-NEXT:    blr
867;
868; CHECK-P9-LABEL: ld_cst_align64_vector:
869; CHECK-P9:       # %bb.0: # %entry
870; CHECK-P9-NEXT:    lis r3, 3725
871; CHECK-P9-NEXT:    ori r3, r3, 19025
872; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
873; CHECK-P9-NEXT:    lxv v2, 0(r3)
874; CHECK-P9-NEXT:    blr
875;
876; CHECK-P8-LE-LABEL: ld_cst_align64_vector:
877; CHECK-P8-LE:       # %bb.0: # %entry
878; CHECK-P8-LE-NEXT:    lis r3, 3725
879; CHECK-P8-LE-NEXT:    ori r3, r3, 19025
880; CHECK-P8-LE-NEXT:    rldic r3, r3, 12, 24
881; CHECK-P8-LE-NEXT:    lxvd2x vs0, 0, r3
882; CHECK-P8-LE-NEXT:    xxswapd v2, vs0
883; CHECK-P8-LE-NEXT:    blr
884;
885; CHECK-P8-BE-LABEL: ld_cst_align64_vector:
886; CHECK-P8-BE:       # %bb.0: # %entry
887; CHECK-P8-BE-NEXT:    lis r3, 3725
888; CHECK-P8-BE-NEXT:    ori r3, r3, 19025
889; CHECK-P8-BE-NEXT:    rldic r3, r3, 12, 24
890; CHECK-P8-BE-NEXT:    lxvw4x v2, 0, r3
891; CHECK-P8-BE-NEXT:    blr
892entry:
893  %0 = load <16 x i8>, <16 x i8>* inttoptr (i64 1000000000000 to <16 x i8>*), align 4096
894  ret <16 x i8> %0
895}
896
897; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
898define dso_local void @st_0_vector(i64 %ptr, <16 x i8> %str) {
899; CHECK-LABEL: st_0_vector:
900; CHECK:       # %bb.0: # %entry
901; CHECK-NEXT:    stxv v2, 0(r3)
902; CHECK-NEXT:    blr
903;
904; CHECK-P8-LE-LABEL: st_0_vector:
905; CHECK-P8-LE:       # %bb.0: # %entry
906; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
907; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
908; CHECK-P8-LE-NEXT:    blr
909;
910; CHECK-P8-BE-LABEL: st_0_vector:
911; CHECK-P8-BE:       # %bb.0: # %entry
912; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
913; CHECK-P8-BE-NEXT:    blr
914entry:
915  %0 = inttoptr i64 %ptr to <16 x i8>*
916  store <16 x i8> %str, <16 x i8>* %0, align 16
917  ret void
918}
919
920; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
921define dso_local void @st_unalign16_vector(i8* nocapture %ptr, <16 x i8> %str) {
922; CHECK-P10-LABEL: st_unalign16_vector:
923; CHECK-P10:       # %bb.0: # %entry
924; CHECK-P10-NEXT:    pstxv v2, 1(r3), 0
925; CHECK-P10-NEXT:    blr
926;
927; CHECK-P9-LABEL: st_unalign16_vector:
928; CHECK-P9:       # %bb.0: # %entry
929; CHECK-P9-NEXT:    li r4, 1
930; CHECK-P9-NEXT:    stxvx v2, r3, r4
931; CHECK-P9-NEXT:    blr
932;
933; CHECK-P8-LE-LABEL: st_unalign16_vector:
934; CHECK-P8-LE:       # %bb.0: # %entry
935; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
936; CHECK-P8-LE-NEXT:    addi r3, r3, 1
937; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
938; CHECK-P8-LE-NEXT:    blr
939;
940; CHECK-P8-BE-LABEL: st_unalign16_vector:
941; CHECK-P8-BE:       # %bb.0: # %entry
942; CHECK-P8-BE-NEXT:    addi r3, r3, 1
943; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
944; CHECK-P8-BE-NEXT:    blr
945entry:
946  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1
947  %0 = bitcast i8* %add.ptr to <16 x i8>*
948  store <16 x i8> %str, <16 x i8>* %0, align 16
949  ret void
950}
951
952; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
953define dso_local void @st_align16_vector(i8* nocapture %ptr, <16 x i8> %str) {
954; CHECK-P10-LABEL: st_align16_vector:
955; CHECK-P10:       # %bb.0: # %entry
956; CHECK-P10-NEXT:    pstxv v2, 8(r3), 0
957; CHECK-P10-NEXT:    blr
958;
959; CHECK-P9-LABEL: st_align16_vector:
960; CHECK-P9:       # %bb.0: # %entry
961; CHECK-P9-NEXT:    li r4, 8
962; CHECK-P9-NEXT:    stxvx v2, r3, r4
963; CHECK-P9-NEXT:    blr
964;
965; CHECK-P8-LE-LABEL: st_align16_vector:
966; CHECK-P8-LE:       # %bb.0: # %entry
967; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
968; CHECK-P8-LE-NEXT:    addi r3, r3, 8
969; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
970; CHECK-P8-LE-NEXT:    blr
971;
972; CHECK-P8-BE-LABEL: st_align16_vector:
973; CHECK-P8-BE:       # %bb.0: # %entry
974; CHECK-P8-BE-NEXT:    addi r3, r3, 8
975; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
976; CHECK-P8-BE-NEXT:    blr
977entry:
978  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
979  %0 = bitcast i8* %add.ptr to <16 x i8>*
980  store <16 x i8> %str, <16 x i8>* %0, align 16
981  ret void
982}
983
984; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
985define dso_local void @st_unalign32_vector(i8* nocapture %ptr, <16 x i8> %str) {
986; CHECK-P10-LABEL: st_unalign32_vector:
987; CHECK-P10:       # %bb.0: # %entry
988; CHECK-P10-NEXT:    pstxv v2, 99999(r3), 0
989; CHECK-P10-NEXT:    blr
990;
991; CHECK-P9-LABEL: st_unalign32_vector:
992; CHECK-P9:       # %bb.0: # %entry
993; CHECK-P9-NEXT:    lis r4, 1
994; CHECK-P9-NEXT:    ori r4, r4, 34463
995; CHECK-P9-NEXT:    stxvx v2, r3, r4
996; CHECK-P9-NEXT:    blr
997;
998; CHECK-P8-LE-LABEL: st_unalign32_vector:
999; CHECK-P8-LE:       # %bb.0: # %entry
1000; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1001; CHECK-P8-LE-NEXT:    lis r4, 1
1002; CHECK-P8-LE-NEXT:    ori r4, r4, 34463
1003; CHECK-P8-LE-NEXT:    stxvd2x vs0, r3, r4
1004; CHECK-P8-LE-NEXT:    blr
1005;
1006; CHECK-P8-BE-LABEL: st_unalign32_vector:
1007; CHECK-P8-BE:       # %bb.0: # %entry
1008; CHECK-P8-BE-NEXT:    lis r4, 1
1009; CHECK-P8-BE-NEXT:    ori r4, r4, 34463
1010; CHECK-P8-BE-NEXT:    stxvw4x v2, r3, r4
1011; CHECK-P8-BE-NEXT:    blr
1012entry:
1013  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999
1014  %0 = bitcast i8* %add.ptr to <16 x i8>*
1015  store <16 x i8> %str, <16 x i8>* %0, align 16
1016  ret void
1017}
1018
1019; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1020define dso_local void @st_align32_vector(i8* nocapture %ptr, <16 x i8> %str) {
1021; CHECK-P10-LABEL: st_align32_vector:
1022; CHECK-P10:       # %bb.0: # %entry
1023; CHECK-P10-NEXT:    pstxv v2, 99999000(r3), 0
1024; CHECK-P10-NEXT:    blr
1025;
1026; CHECK-P9-LABEL: st_align32_vector:
1027; CHECK-P9:       # %bb.0: # %entry
1028; CHECK-P9-NEXT:    lis r4, 1525
1029; CHECK-P9-NEXT:    ori r4, r4, 56600
1030; CHECK-P9-NEXT:    stxvx v2, r3, r4
1031; CHECK-P9-NEXT:    blr
1032;
1033; CHECK-P8-LE-LABEL: st_align32_vector:
1034; CHECK-P8-LE:       # %bb.0: # %entry
1035; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1036; CHECK-P8-LE-NEXT:    lis r4, 1525
1037; CHECK-P8-LE-NEXT:    ori r4, r4, 56600
1038; CHECK-P8-LE-NEXT:    stxvd2x vs0, r3, r4
1039; CHECK-P8-LE-NEXT:    blr
1040;
1041; CHECK-P8-BE-LABEL: st_align32_vector:
1042; CHECK-P8-BE:       # %bb.0: # %entry
1043; CHECK-P8-BE-NEXT:    lis r4, 1525
1044; CHECK-P8-BE-NEXT:    ori r4, r4, 56600
1045; CHECK-P8-BE-NEXT:    stxvw4x v2, r3, r4
1046; CHECK-P8-BE-NEXT:    blr
1047entry:
1048  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
1049  %0 = bitcast i8* %add.ptr to <16 x i8>*
1050  store <16 x i8> %str, <16 x i8>* %0, align 16
1051  ret void
1052}
1053
1054; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1055define dso_local void @st_unalign64_vector(i8* nocapture %ptr, <16 x i8> %str) {
1056; CHECK-P10-LABEL: st_unalign64_vector:
1057; CHECK-P10:       # %bb.0: # %entry
1058; CHECK-P10-NEXT:    pli r4, 232
1059; CHECK-P10-NEXT:    pli r5, 3567587329
1060; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1061; CHECK-P10-NEXT:    stxvx v2, r3, r5
1062; CHECK-P10-NEXT:    blr
1063;
1064; CHECK-P9-LABEL: st_unalign64_vector:
1065; CHECK-P9:       # %bb.0: # %entry
1066; CHECK-P9-NEXT:    li r4, 29
1067; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
1068; CHECK-P9-NEXT:    oris r4, r4, 54437
1069; CHECK-P9-NEXT:    ori r4, r4, 4097
1070; CHECK-P9-NEXT:    stxvx v2, r3, r4
1071; CHECK-P9-NEXT:    blr
1072;
1073; CHECK-P8-LE-LABEL: st_unalign64_vector:
1074; CHECK-P8-LE:       # %bb.0: # %entry
1075; CHECK-P8-LE-NEXT:    li r4, 29
1076; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1077; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
1078; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
1079; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
1080; CHECK-P8-LE-NEXT:    stxvd2x vs0, r3, r4
1081; CHECK-P8-LE-NEXT:    blr
1082;
1083; CHECK-P8-BE-LABEL: st_unalign64_vector:
1084; CHECK-P8-BE:       # %bb.0: # %entry
1085; CHECK-P8-BE-NEXT:    li r4, 29
1086; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
1087; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
1088; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
1089; CHECK-P8-BE-NEXT:    stxvw4x v2, r3, r4
1090; CHECK-P8-BE-NEXT:    blr
1091entry:
1092  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000001
1093  %0 = bitcast i8* %add.ptr to <16 x i8>*
1094  store <16 x i8> %str, <16 x i8>* %0, align 16
1095  ret void
1096}
1097
1098; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1099define dso_local void @st_align64_vector(i8* nocapture %ptr, <16 x i8> %str) {
1100; CHECK-P10-LABEL: st_align64_vector:
1101; CHECK-P10:       # %bb.0: # %entry
1102; CHECK-P10-NEXT:    pli r4, 244140625
1103; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1104; CHECK-P10-NEXT:    stxvx v2, r3, r4
1105; CHECK-P10-NEXT:    blr
1106;
1107; CHECK-P9-LABEL: st_align64_vector:
1108; CHECK-P9:       # %bb.0: # %entry
1109; CHECK-P9-NEXT:    lis r4, 3725
1110; CHECK-P9-NEXT:    ori r4, r4, 19025
1111; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
1112; CHECK-P9-NEXT:    stxvx v2, r3, r4
1113; CHECK-P9-NEXT:    blr
1114;
1115; CHECK-P8-LE-LABEL: st_align64_vector:
1116; CHECK-P8-LE:       # %bb.0: # %entry
1117; CHECK-P8-LE-NEXT:    lis r4, 3725
1118; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1119; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
1120; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
1121; CHECK-P8-LE-NEXT:    stxvd2x vs0, r3, r4
1122; CHECK-P8-LE-NEXT:    blr
1123;
1124; CHECK-P8-BE-LABEL: st_align64_vector:
1125; CHECK-P8-BE:       # %bb.0: # %entry
1126; CHECK-P8-BE-NEXT:    lis r4, 3725
1127; CHECK-P8-BE-NEXT:    ori r4, r4, 19025
1128; CHECK-P8-BE-NEXT:    rldic r4, r4, 12, 24
1129; CHECK-P8-BE-NEXT:    stxvw4x v2, r3, r4
1130; CHECK-P8-BE-NEXT:    blr
1131entry:
1132  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
1133  %0 = bitcast i8* %add.ptr to <16 x i8>*
1134  store <16 x i8> %str, <16 x i8>* %0, align 16
1135  ret void
1136}
1137
1138; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1139define dso_local void @st_reg_vector(i8* nocapture %ptr, i64 %off, <16 x i8> %str) {
1140; CHECK-LABEL: st_reg_vector:
1141; CHECK:       # %bb.0: # %entry
1142; CHECK-NEXT:    stxvx v2, r3, r4
1143; CHECK-NEXT:    blr
1144;
1145; CHECK-P8-LE-LABEL: st_reg_vector:
1146; CHECK-P8-LE:       # %bb.0: # %entry
1147; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1148; CHECK-P8-LE-NEXT:    stxvd2x vs0, r3, r4
1149; CHECK-P8-LE-NEXT:    blr
1150;
1151; CHECK-P8-BE-LABEL: st_reg_vector:
1152; CHECK-P8-BE:       # %bb.0: # %entry
1153; CHECK-P8-BE-NEXT:    stxvw4x v2, r3, r4
1154; CHECK-P8-BE-NEXT:    blr
1155entry:
1156  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
1157  %0 = bitcast i8* %add.ptr to <16 x i8>*
1158  store <16 x i8> %str, <16 x i8>* %0, align 16
1159  ret void
1160}
1161
1162; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1163define dso_local void @st_or1_vector(i64 %ptr, i8 zeroext %off, <16 x i8> %str) {
1164; CHECK-LABEL: st_or1_vector:
1165; CHECK:       # %bb.0: # %entry
1166; CHECK-NEXT:    or r3, r4, r3
1167; CHECK-NEXT:    stxv v2, 0(r3)
1168; CHECK-NEXT:    blr
1169;
1170; CHECK-P8-LE-LABEL: st_or1_vector:
1171; CHECK-P8-LE:       # %bb.0: # %entry
1172; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1173; CHECK-P8-LE-NEXT:    or r3, r4, r3
1174; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
1175; CHECK-P8-LE-NEXT:    blr
1176;
1177; CHECK-P8-BE-LABEL: st_or1_vector:
1178; CHECK-P8-BE:       # %bb.0: # %entry
1179; CHECK-P8-BE-NEXT:    or r3, r4, r3
1180; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
1181; CHECK-P8-BE-NEXT:    blr
1182entry:
1183  %conv = zext i8 %off to i64
1184  %or = or i64 %conv, %ptr
1185  %0 = inttoptr i64 %or to <16 x i8>*
1186  store <16 x i8> %str, <16 x i8>* %0, align 16
1187  ret void
1188}
1189
1190; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1191define dso_local void @st_or2_vector(i64 %ptr, i8 zeroext %off, <16 x i8> %str) {
1192; CHECK-LABEL: st_or2_vector:
1193; CHECK:       # %bb.0: # %entry
1194; CHECK-NEXT:    rldicr r3, r3, 0, 51
1195; CHECK-NEXT:    stxvx v2, r3, r4
1196; CHECK-NEXT:    blr
1197;
1198; CHECK-P8-LE-LABEL: st_or2_vector:
1199; CHECK-P8-LE:       # %bb.0: # %entry
1200; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1201; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 51
1202; CHECK-P8-LE-NEXT:    stxvd2x vs0, r3, r4
1203; CHECK-P8-LE-NEXT:    blr
1204;
1205; CHECK-P8-BE-LABEL: st_or2_vector:
1206; CHECK-P8-BE:       # %bb.0: # %entry
1207; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 51
1208; CHECK-P8-BE-NEXT:    stxvw4x v2, r3, r4
1209; CHECK-P8-BE-NEXT:    blr
1210entry:
1211  %and = and i64 %ptr, -4096
1212  %conv = zext i8 %off to i64
1213  %or = or i64 %and, %conv
1214  %0 = inttoptr i64 %or to <16 x i8>*
1215  store <16 x i8> %str, <16 x i8>* %0, align 16
1216  ret void
1217}
1218
1219; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1220define dso_local void @st_not_disjoint16_vector(i64 %ptr, <16 x i8> %str) {
1221; CHECK-LABEL: st_not_disjoint16_vector:
1222; CHECK:       # %bb.0: # %entry
1223; CHECK-NEXT:    ori r3, r3, 6
1224; CHECK-NEXT:    stxv v2, 0(r3)
1225; CHECK-NEXT:    blr
1226;
1227; CHECK-P8-LE-LABEL: st_not_disjoint16_vector:
1228; CHECK-P8-LE:       # %bb.0: # %entry
1229; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1230; CHECK-P8-LE-NEXT:    ori r3, r3, 6
1231; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
1232; CHECK-P8-LE-NEXT:    blr
1233;
1234; CHECK-P8-BE-LABEL: st_not_disjoint16_vector:
1235; CHECK-P8-BE:       # %bb.0: # %entry
1236; CHECK-P8-BE-NEXT:    ori r3, r3, 6
1237; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
1238; CHECK-P8-BE-NEXT:    blr
1239entry:
1240  %or = or i64 %ptr, 6
1241  %0 = inttoptr i64 %or to <16 x i8>*
1242  store <16 x i8> %str, <16 x i8>* %0, align 16
1243  ret void
1244}
1245
1246; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1247define dso_local void @st_disjoint_unalign16_vector(i64 %ptr, <16 x i8> %str) {
1248; CHECK-P10-LABEL: st_disjoint_unalign16_vector:
1249; CHECK-P10:       # %bb.0: # %entry
1250; CHECK-P10-NEXT:    rldicr r3, r3, 0, 51
1251; CHECK-P10-NEXT:    pstxv v2, 6(r3), 0
1252; CHECK-P10-NEXT:    blr
1253;
1254; CHECK-P9-LABEL: st_disjoint_unalign16_vector:
1255; CHECK-P9:       # %bb.0: # %entry
1256; CHECK-P9-NEXT:    rldicr r3, r3, 0, 51
1257; CHECK-P9-NEXT:    li r4, 6
1258; CHECK-P9-NEXT:    stxvx v2, r3, r4
1259; CHECK-P9-NEXT:    blr
1260;
1261; CHECK-P8-LE-LABEL: st_disjoint_unalign16_vector:
1262; CHECK-P8-LE:       # %bb.0: # %entry
1263; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1264; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 51
1265; CHECK-P8-LE-NEXT:    ori r3, r3, 6
1266; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
1267; CHECK-P8-LE-NEXT:    blr
1268;
1269; CHECK-P8-BE-LABEL: st_disjoint_unalign16_vector:
1270; CHECK-P8-BE:       # %bb.0: # %entry
1271; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 51
1272; CHECK-P8-BE-NEXT:    ori r3, r3, 6
1273; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
1274; CHECK-P8-BE-NEXT:    blr
1275entry:
1276  %and = and i64 %ptr, -4096
1277  %or = or i64 %and, 6
1278  %0 = inttoptr i64 %or to <16 x i8>*
1279  store <16 x i8> %str, <16 x i8>* %0, align 16
1280  ret void
1281}
1282
1283; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1284define dso_local void @st_disjoint_align16_vector(i64 %ptr, <16 x i8> %str) {
1285; CHECK-P10-LABEL: st_disjoint_align16_vector:
1286; CHECK-P10:       # %bb.0: # %entry
1287; CHECK-P10-NEXT:    rldicr r3, r3, 0, 51
1288; CHECK-P10-NEXT:    pstxv v2, 24(r3), 0
1289; CHECK-P10-NEXT:    blr
1290;
1291; CHECK-P9-LABEL: st_disjoint_align16_vector:
1292; CHECK-P9:       # %bb.0: # %entry
1293; CHECK-P9-NEXT:    rldicr r3, r3, 0, 51
1294; CHECK-P9-NEXT:    li r4, 24
1295; CHECK-P9-NEXT:    stxvx v2, r3, r4
1296; CHECK-P9-NEXT:    blr
1297;
1298; CHECK-P8-LE-LABEL: st_disjoint_align16_vector:
1299; CHECK-P8-LE:       # %bb.0: # %entry
1300; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1301; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 51
1302; CHECK-P8-LE-NEXT:    ori r3, r3, 24
1303; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
1304; CHECK-P8-LE-NEXT:    blr
1305;
1306; CHECK-P8-BE-LABEL: st_disjoint_align16_vector:
1307; CHECK-P8-BE:       # %bb.0: # %entry
1308; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 51
1309; CHECK-P8-BE-NEXT:    ori r3, r3, 24
1310; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
1311; CHECK-P8-BE-NEXT:    blr
1312entry:
1313  %and = and i64 %ptr, -4096
1314  %or = or i64 %and, 24
1315  %0 = inttoptr i64 %or to <16 x i8>*
1316  store <16 x i8> %str, <16 x i8>* %0, align 16
1317  ret void
1318}
1319
1320; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1321define dso_local void @st_not_disjoint32_vector(i64 %ptr, <16 x i8> %str) {
1322; CHECK-LABEL: st_not_disjoint32_vector:
1323; CHECK:       # %bb.0: # %entry
1324; CHECK-NEXT:    ori r3, r3, 34463
1325; CHECK-NEXT:    oris r3, r3, 1
1326; CHECK-NEXT:    stxv v2, 0(r3)
1327; CHECK-NEXT:    blr
1328;
1329; CHECK-P8-LE-LABEL: st_not_disjoint32_vector:
1330; CHECK-P8-LE:       # %bb.0: # %entry
1331; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1332; CHECK-P8-LE-NEXT:    ori r3, r3, 34463
1333; CHECK-P8-LE-NEXT:    oris r3, r3, 1
1334; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
1335; CHECK-P8-LE-NEXT:    blr
1336;
1337; CHECK-P8-BE-LABEL: st_not_disjoint32_vector:
1338; CHECK-P8-BE:       # %bb.0: # %entry
1339; CHECK-P8-BE-NEXT:    ori r3, r3, 34463
1340; CHECK-P8-BE-NEXT:    oris r3, r3, 1
1341; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
1342; CHECK-P8-BE-NEXT:    blr
1343entry:
1344  %or = or i64 %ptr, 99999
1345  %0 = inttoptr i64 %or to <16 x i8>*
1346  store <16 x i8> %str, <16 x i8>* %0, align 16
1347  ret void
1348}
1349
1350; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1351define dso_local void @st_disjoint_unalign32_vector(i64 %ptr, <16 x i8> %str) {
1352; CHECK-P10-LABEL: st_disjoint_unalign32_vector:
1353; CHECK-P10:       # %bb.0: # %entry
1354; CHECK-P10-NEXT:    rldicr r3, r3, 0, 43
1355; CHECK-P10-NEXT:    pstxv v2, 99999(r3), 0
1356; CHECK-P10-NEXT:    blr
1357;
1358; CHECK-P9-LABEL: st_disjoint_unalign32_vector:
1359; CHECK-P9:       # %bb.0: # %entry
1360; CHECK-P9-NEXT:    lis r4, 1
1361; CHECK-P9-NEXT:    rldicr r3, r3, 0, 43
1362; CHECK-P9-NEXT:    ori r4, r4, 34463
1363; CHECK-P9-NEXT:    stxvx v2, r3, r4
1364; CHECK-P9-NEXT:    blr
1365;
1366; CHECK-P8-LE-LABEL: st_disjoint_unalign32_vector:
1367; CHECK-P8-LE:       # %bb.0: # %entry
1368; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1369; CHECK-P8-LE-NEXT:    lis r4, 1
1370; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 43
1371; CHECK-P8-LE-NEXT:    ori r4, r4, 34463
1372; CHECK-P8-LE-NEXT:    stxvd2x vs0, r3, r4
1373; CHECK-P8-LE-NEXT:    blr
1374;
1375; CHECK-P8-BE-LABEL: st_disjoint_unalign32_vector:
1376; CHECK-P8-BE:       # %bb.0: # %entry
1377; CHECK-P8-BE-NEXT:    lis r4, 1
1378; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 43
1379; CHECK-P8-BE-NEXT:    ori r4, r4, 34463
1380; CHECK-P8-BE-NEXT:    stxvw4x v2, r3, r4
1381; CHECK-P8-BE-NEXT:    blr
1382entry:
1383  %and = and i64 %ptr, -1048576
1384  %or = or i64 %and, 99999
1385  %0 = inttoptr i64 %or to <16 x i8>*
1386  store <16 x i8> %str, <16 x i8>* %0, align 16
1387  ret void
1388}
1389
1390; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1391define dso_local void @st_disjoint_align32_vector(i64 %ptr, <16 x i8> %str) {
1392; CHECK-P10-LABEL: st_disjoint_align32_vector:
1393; CHECK-P10:       # %bb.0: # %entry
1394; CHECK-P10-NEXT:    lis r4, -15264
1395; CHECK-P10-NEXT:    and r3, r3, r4
1396; CHECK-P10-NEXT:    pstxv v2, 999990000(r3), 0
1397; CHECK-P10-NEXT:    blr
1398;
1399; CHECK-P9-LABEL: st_disjoint_align32_vector:
1400; CHECK-P9:       # %bb.0: # %entry
1401; CHECK-P9-NEXT:    lis r4, -15264
1402; CHECK-P9-NEXT:    and r3, r3, r4
1403; CHECK-P9-NEXT:    lis r4, 15258
1404; CHECK-P9-NEXT:    ori r4, r4, 41712
1405; CHECK-P9-NEXT:    stxvx v2, r3, r4
1406; CHECK-P9-NEXT:    blr
1407;
1408; CHECK-P8-LE-LABEL: st_disjoint_align32_vector:
1409; CHECK-P8-LE:       # %bb.0: # %entry
1410; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1411; CHECK-P8-LE-NEXT:    lis r4, -15264
1412; CHECK-P8-LE-NEXT:    lis r5, 15258
1413; CHECK-P8-LE-NEXT:    and r3, r3, r4
1414; CHECK-P8-LE-NEXT:    ori r4, r5, 41712
1415; CHECK-P8-LE-NEXT:    stxvd2x vs0, r3, r4
1416; CHECK-P8-LE-NEXT:    blr
1417;
1418; CHECK-P8-BE-LABEL: st_disjoint_align32_vector:
1419; CHECK-P8-BE:       # %bb.0: # %entry
1420; CHECK-P8-BE-NEXT:    lis r4, -15264
1421; CHECK-P8-BE-NEXT:    lis r5, 15258
1422; CHECK-P8-BE-NEXT:    and r3, r3, r4
1423; CHECK-P8-BE-NEXT:    ori r4, r5, 41712
1424; CHECK-P8-BE-NEXT:    stxvw4x v2, r3, r4
1425; CHECK-P8-BE-NEXT:    blr
1426entry:
1427  %and = and i64 %ptr, -1000341504
1428  %or = or i64 %and, 999990000
1429  %0 = inttoptr i64 %or to <16 x i8>*
1430  store <16 x i8> %str, <16 x i8>* %0, align 16
1431  ret void
1432}
1433
1434; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1435define dso_local void @st_not_disjoint64_vector(i64 %ptr, <16 x i8> %str) {
1436; CHECK-P10-LABEL: st_not_disjoint64_vector:
1437; CHECK-P10:       # %bb.0: # %entry
1438; CHECK-P10-NEXT:    pli r4, 232
1439; CHECK-P10-NEXT:    pli r5, 3567587329
1440; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1441; CHECK-P10-NEXT:    or r3, r3, r5
1442; CHECK-P10-NEXT:    stxv v2, 0(r3)
1443; CHECK-P10-NEXT:    blr
1444;
1445; CHECK-P9-LABEL: st_not_disjoint64_vector:
1446; CHECK-P9:       # %bb.0: # %entry
1447; CHECK-P9-NEXT:    li r4, 29
1448; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
1449; CHECK-P9-NEXT:    oris r4, r4, 54437
1450; CHECK-P9-NEXT:    ori r4, r4, 4097
1451; CHECK-P9-NEXT:    or r3, r3, r4
1452; CHECK-P9-NEXT:    stxv v2, 0(r3)
1453; CHECK-P9-NEXT:    blr
1454;
1455; CHECK-P8-LE-LABEL: st_not_disjoint64_vector:
1456; CHECK-P8-LE:       # %bb.0: # %entry
1457; CHECK-P8-LE-NEXT:    li r4, 29
1458; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1459; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
1460; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
1461; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
1462; CHECK-P8-LE-NEXT:    or r3, r3, r4
1463; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
1464; CHECK-P8-LE-NEXT:    blr
1465;
1466; CHECK-P8-BE-LABEL: st_not_disjoint64_vector:
1467; CHECK-P8-BE:       # %bb.0: # %entry
1468; CHECK-P8-BE-NEXT:    li r4, 29
1469; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
1470; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
1471; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
1472; CHECK-P8-BE-NEXT:    or r3, r3, r4
1473; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
1474; CHECK-P8-BE-NEXT:    blr
1475entry:
1476  %or = or i64 %ptr, 1000000000001
1477  %0 = inttoptr i64 %or to <16 x i8>*
1478  store <16 x i8> %str, <16 x i8>* %0, align 16
1479  ret void
1480}
1481
1482; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1483define dso_local void @st_disjoint_unalign64_vector(i64 %ptr, <16 x i8> %str) {
1484; CHECK-P10-LABEL: st_disjoint_unalign64_vector:
1485; CHECK-P10:       # %bb.0: # %entry
1486; CHECK-P10-NEXT:    pli r4, 232
1487; CHECK-P10-NEXT:    pli r5, 3567587329
1488; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1489; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1490; CHECK-P10-NEXT:    stxvx v2, r3, r5
1491; CHECK-P10-NEXT:    blr
1492;
1493; CHECK-P9-LABEL: st_disjoint_unalign64_vector:
1494; CHECK-P9:       # %bb.0: # %entry
1495; CHECK-P9-NEXT:    li r4, 29
1496; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
1497; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
1498; CHECK-P9-NEXT:    oris r4, r4, 54437
1499; CHECK-P9-NEXT:    ori r4, r4, 4097
1500; CHECK-P9-NEXT:    stxvx v2, r3, r4
1501; CHECK-P9-NEXT:    blr
1502;
1503; CHECK-P8-LE-LABEL: st_disjoint_unalign64_vector:
1504; CHECK-P8-LE:       # %bb.0: # %entry
1505; CHECK-P8-LE-NEXT:    li r4, 29
1506; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1507; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
1508; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
1509; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
1510; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
1511; CHECK-P8-LE-NEXT:    stxvd2x vs0, r3, r4
1512; CHECK-P8-LE-NEXT:    blr
1513;
1514; CHECK-P8-BE-LABEL: st_disjoint_unalign64_vector:
1515; CHECK-P8-BE:       # %bb.0: # %entry
1516; CHECK-P8-BE-NEXT:    li r4, 29
1517; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
1518; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
1519; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
1520; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
1521; CHECK-P8-BE-NEXT:    stxvw4x v2, r3, r4
1522; CHECK-P8-BE-NEXT:    blr
1523entry:
1524  %and = and i64 %ptr, -1099511627776
1525  %or = or i64 %and, 1000000000001
1526  %0 = inttoptr i64 %or to <16 x i8>*
1527  store <16 x i8> %str, <16 x i8>* %0, align 16
1528  ret void
1529}
1530
1531; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1532define dso_local void @st_disjoint_align64_vector(i64 %ptr, <16 x i8> %str) {
1533; CHECK-P10-LABEL: st_disjoint_align64_vector:
1534; CHECK-P10:       # %bb.0: # %entry
1535; CHECK-P10-NEXT:    pli r4, 244140625
1536; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1537; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1538; CHECK-P10-NEXT:    stxvx v2, r3, r4
1539; CHECK-P10-NEXT:    blr
1540;
1541; CHECK-P9-LABEL: st_disjoint_align64_vector:
1542; CHECK-P9:       # %bb.0: # %entry
1543; CHECK-P9-NEXT:    lis r4, 3725
1544; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
1545; CHECK-P9-NEXT:    ori r4, r4, 19025
1546; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
1547; CHECK-P9-NEXT:    stxvx v2, r3, r4
1548; CHECK-P9-NEXT:    blr
1549;
1550; CHECK-P8-LE-LABEL: st_disjoint_align64_vector:
1551; CHECK-P8-LE:       # %bb.0: # %entry
1552; CHECK-P8-LE-NEXT:    lis r4, 3725
1553; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1554; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
1555; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
1556; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
1557; CHECK-P8-LE-NEXT:    stxvd2x vs0, r3, r4
1558; CHECK-P8-LE-NEXT:    blr
1559;
1560; CHECK-P8-BE-LABEL: st_disjoint_align64_vector:
1561; CHECK-P8-BE:       # %bb.0: # %entry
1562; CHECK-P8-BE-NEXT:    lis r4, 3725
1563; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
1564; CHECK-P8-BE-NEXT:    ori r4, r4, 19025
1565; CHECK-P8-BE-NEXT:    rldic r4, r4, 12, 24
1566; CHECK-P8-BE-NEXT:    stxvw4x v2, r3, r4
1567; CHECK-P8-BE-NEXT:    blr
1568entry:
1569  %and = and i64 %ptr, -1099511627776
1570  %or = or i64 %and, 1000000000000
1571  %0 = inttoptr i64 %or to <16 x i8>*
1572  store <16 x i8> %str, <16 x i8>* %0, align 4096
1573  ret void
1574}
1575
1576; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1577define dso_local void @st_cst_unalign16_vector(<16 x i8> %str) {
1578; CHECK-LABEL: st_cst_unalign16_vector:
1579; CHECK:       # %bb.0: # %entry
1580; CHECK-NEXT:    li r3, 255
1581; CHECK-NEXT:    stxv v2, 0(r3)
1582; CHECK-NEXT:    blr
1583;
1584; CHECK-P8-LE-LABEL: st_cst_unalign16_vector:
1585; CHECK-P8-LE:       # %bb.0: # %entry
1586; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1587; CHECK-P8-LE-NEXT:    li r3, 255
1588; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
1589; CHECK-P8-LE-NEXT:    blr
1590;
1591; CHECK-P8-BE-LABEL: st_cst_unalign16_vector:
1592; CHECK-P8-BE:       # %bb.0: # %entry
1593; CHECK-P8-BE-NEXT:    li r3, 255
1594; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
1595; CHECK-P8-BE-NEXT:    blr
1596entry:
1597  store <16 x i8> %str, <16 x i8>* inttoptr (i64 255 to <16 x i8>*), align 16
1598  ret void
1599}
1600
1601; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1602define dso_local void @st_cst_align16_vector(<16 x i8> %str) {
1603; CHECK-LABEL: st_cst_align16_vector:
1604; CHECK:       # %bb.0: # %entry
1605; CHECK-NEXT:    stxv v2, 4080(0)
1606; CHECK-NEXT:    blr
1607;
1608; CHECK-P8-LE-LABEL: st_cst_align16_vector:
1609; CHECK-P8-LE:       # %bb.0: # %entry
1610; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1611; CHECK-P8-LE-NEXT:    li r3, 4080
1612; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
1613; CHECK-P8-LE-NEXT:    blr
1614;
1615; CHECK-P8-BE-LABEL: st_cst_align16_vector:
1616; CHECK-P8-BE:       # %bb.0: # %entry
1617; CHECK-P8-BE-NEXT:    li r3, 4080
1618; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
1619; CHECK-P8-BE-NEXT:    blr
1620entry:
1621  store <16 x i8> %str, <16 x i8>* inttoptr (i64 4080 to <16 x i8>*), align 16
1622  ret void
1623}
1624
1625; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1626define dso_local void @st_cst_unalign32_vector(<16 x i8> %str) {
1627; CHECK-P10-LABEL: st_cst_unalign32_vector:
1628; CHECK-P10:       # %bb.0: # %entry
1629; CHECK-P10-NEXT:    pli r3, 99999
1630; CHECK-P10-NEXT:    stxv v2, 0(r3)
1631; CHECK-P10-NEXT:    blr
1632;
1633; CHECK-P9-LABEL: st_cst_unalign32_vector:
1634; CHECK-P9:       # %bb.0: # %entry
1635; CHECK-P9-NEXT:    lis r3, 1
1636; CHECK-P9-NEXT:    ori r3, r3, 34463
1637; CHECK-P9-NEXT:    stxv v2, 0(r3)
1638; CHECK-P9-NEXT:    blr
1639;
1640; CHECK-P8-LE-LABEL: st_cst_unalign32_vector:
1641; CHECK-P8-LE:       # %bb.0: # %entry
1642; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1643; CHECK-P8-LE-NEXT:    lis r3, 1
1644; CHECK-P8-LE-NEXT:    ori r3, r3, 34463
1645; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
1646; CHECK-P8-LE-NEXT:    blr
1647;
1648; CHECK-P8-BE-LABEL: st_cst_unalign32_vector:
1649; CHECK-P8-BE:       # %bb.0: # %entry
1650; CHECK-P8-BE-NEXT:    lis r3, 1
1651; CHECK-P8-BE-NEXT:    ori r3, r3, 34463
1652; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
1653; CHECK-P8-BE-NEXT:    blr
1654entry:
1655  store <16 x i8> %str, <16 x i8>* inttoptr (i64 99999 to <16 x i8>*), align 16
1656  ret void
1657}
1658
1659; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1660define dso_local void @st_cst_align32_vector(<16 x i8> %str) {
1661; CHECK-P10-LABEL: st_cst_align32_vector:
1662; CHECK-P10:       # %bb.0: # %entry
1663; CHECK-P10-NEXT:    pli r3, 9999900
1664; CHECK-P10-NEXT:    stxv v2, 0(r3)
1665; CHECK-P10-NEXT:    blr
1666;
1667; CHECK-P9-LABEL: st_cst_align32_vector:
1668; CHECK-P9:       # %bb.0: # %entry
1669; CHECK-P9-NEXT:    lis r3, 152
1670; CHECK-P9-NEXT:    ori r3, r3, 38428
1671; CHECK-P9-NEXT:    stxv v2, 0(r3)
1672; CHECK-P9-NEXT:    blr
1673;
1674; CHECK-P8-LE-LABEL: st_cst_align32_vector:
1675; CHECK-P8-LE:       # %bb.0: # %entry
1676; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1677; CHECK-P8-LE-NEXT:    lis r3, 152
1678; CHECK-P8-LE-NEXT:    ori r3, r3, 38428
1679; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
1680; CHECK-P8-LE-NEXT:    blr
1681;
1682; CHECK-P8-BE-LABEL: st_cst_align32_vector:
1683; CHECK-P8-BE:       # %bb.0: # %entry
1684; CHECK-P8-BE-NEXT:    lis r3, 152
1685; CHECK-P8-BE-NEXT:    ori r3, r3, 38428
1686; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
1687; CHECK-P8-BE-NEXT:    blr
1688entry:
1689  store <16 x i8> %str, <16 x i8>* inttoptr (i64 9999900 to <16 x i8>*), align 16
1690  ret void
1691}
1692
1693; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1694define dso_local void @st_cst_unalign64_vector(<16 x i8> %str) {
1695; CHECK-P10-LABEL: st_cst_unalign64_vector:
1696; CHECK-P10:       # %bb.0: # %entry
1697; CHECK-P10-NEXT:    pli r3, 232
1698; CHECK-P10-NEXT:    pli r4, 3567587329
1699; CHECK-P10-NEXT:    rldimi r4, r3, 32, 0
1700; CHECK-P10-NEXT:    stxv v2, 0(r4)
1701; CHECK-P10-NEXT:    blr
1702;
1703; CHECK-P9-LABEL: st_cst_unalign64_vector:
1704; CHECK-P9:       # %bb.0: # %entry
1705; CHECK-P9-NEXT:    li r3, 29
1706; CHECK-P9-NEXT:    rldic r3, r3, 35, 24
1707; CHECK-P9-NEXT:    oris r3, r3, 54437
1708; CHECK-P9-NEXT:    ori r3, r3, 4097
1709; CHECK-P9-NEXT:    stxv v2, 0(r3)
1710; CHECK-P9-NEXT:    blr
1711;
1712; CHECK-P8-LE-LABEL: st_cst_unalign64_vector:
1713; CHECK-P8-LE:       # %bb.0: # %entry
1714; CHECK-P8-LE-NEXT:    li r3, 29
1715; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1716; CHECK-P8-LE-NEXT:    rldic r3, r3, 35, 24
1717; CHECK-P8-LE-NEXT:    oris r3, r3, 54437
1718; CHECK-P8-LE-NEXT:    ori r3, r3, 4097
1719; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
1720; CHECK-P8-LE-NEXT:    blr
1721;
1722; CHECK-P8-BE-LABEL: st_cst_unalign64_vector:
1723; CHECK-P8-BE:       # %bb.0: # %entry
1724; CHECK-P8-BE-NEXT:    li r3, 29
1725; CHECK-P8-BE-NEXT:    rldic r3, r3, 35, 24
1726; CHECK-P8-BE-NEXT:    oris r3, r3, 54437
1727; CHECK-P8-BE-NEXT:    ori r3, r3, 4097
1728; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
1729; CHECK-P8-BE-NEXT:    blr
1730entry:
1731  store <16 x i8> %str, <16 x i8>* inttoptr (i64 1000000000001 to <16 x i8>*), align 16
1732  ret void
1733}
1734
1735; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
1736define dso_local void @st_cst_align64_vector(<16 x i8> %str) {
1737; CHECK-P10-LABEL: st_cst_align64_vector:
1738; CHECK-P10:       # %bb.0: # %entry
1739; CHECK-P10-NEXT:    pli r3, 244140625
1740; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
1741; CHECK-P10-NEXT:    stxv v2, 0(r3)
1742; CHECK-P10-NEXT:    blr
1743;
1744; CHECK-P9-LABEL: st_cst_align64_vector:
1745; CHECK-P9:       # %bb.0: # %entry
1746; CHECK-P9-NEXT:    lis r3, 3725
1747; CHECK-P9-NEXT:    ori r3, r3, 19025
1748; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
1749; CHECK-P9-NEXT:    stxv v2, 0(r3)
1750; CHECK-P9-NEXT:    blr
1751;
1752; CHECK-P8-LE-LABEL: st_cst_align64_vector:
1753; CHECK-P8-LE:       # %bb.0: # %entry
1754; CHECK-P8-LE-NEXT:    lis r3, 3725
1755; CHECK-P8-LE-NEXT:    xxswapd vs0, v2
1756; CHECK-P8-LE-NEXT:    ori r3, r3, 19025
1757; CHECK-P8-LE-NEXT:    rldic r3, r3, 12, 24
1758; CHECK-P8-LE-NEXT:    stxvd2x vs0, 0, r3
1759; CHECK-P8-LE-NEXT:    blr
1760;
1761; CHECK-P8-BE-LABEL: st_cst_align64_vector:
1762; CHECK-P8-BE:       # %bb.0: # %entry
1763; CHECK-P8-BE-NEXT:    lis r3, 3725
1764; CHECK-P8-BE-NEXT:    ori r3, r3, 19025
1765; CHECK-P8-BE-NEXT:    rldic r3, r3, 12, 24
1766; CHECK-P8-BE-NEXT:    stxvw4x v2, 0, r3
1767; CHECK-P8-BE-NEXT:    blr
1768entry:
1769  store <16 x i8> %str, <16 x i8>* inttoptr (i64 1000000000000 to <16 x i8>*), align 4096
1770  ret void
1771}
1772