xref: /llvm-project/llvm/test/CodeGen/PowerPC/f128_ldst.ll (revision 427fb35192f1f7bb694a5910b05abc5925a798b2)
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,CHECK-P10-LE
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,CHECK-P10-BE
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-PREP10
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-PREP10
14
15@GlobLd128 = dso_local local_unnamed_addr global [20 x fp128] zeroinitializer, align 16
16@GlobSt128 = dso_local local_unnamed_addr global [20 x fp128] zeroinitializer, align 16
17
18; Function Attrs: norecurse nounwind readonly willreturn
19define dso_local fp128 @ld_0___float128___float128(i64 %ptr) {
20; CHECK-LABEL: ld_0___float128___float128:
21; CHECK:       # %bb.0: # %entry
22; CHECK-NEXT:    lxv v2, 0(r3)
23; CHECK-NEXT:    blr
24entry:
25  %0 = inttoptr i64 %ptr to ptr
26  %1 = load fp128, ptr %0, align 16
27  ret fp128 %1
28}
29
30; Function Attrs: norecurse nounwind readonly willreturn
31define dso_local fp128 @ld_unalign16___float128___float128(ptr nocapture readonly %ptr) {
32; CHECK-P10-LABEL: ld_unalign16___float128___float128:
33; CHECK-P10:       # %bb.0: # %entry
34; CHECK-P10-NEXT:    plxv v2, 1(r3), 0
35; CHECK-P10-NEXT:    blr
36;
37; CHECK-PREP10-LABEL: ld_unalign16___float128___float128:
38; CHECK-PREP10:       # %bb.0: # %entry
39; CHECK-PREP10-NEXT:    li r4, 1
40; CHECK-PREP10-NEXT:    lxvx v2, r3, r4
41; CHECK-PREP10-NEXT:    blr
42entry:
43  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1
44  %0 = load fp128, ptr %add.ptr, align 16
45  ret fp128 %0
46}
47
48; Function Attrs: norecurse nounwind readonly willreturn
49define dso_local fp128 @ld_align16___float128___float128(ptr nocapture readonly %ptr) {
50; CHECK-P10-LABEL: ld_align16___float128___float128:
51; CHECK-P10:       # %bb.0: # %entry
52; CHECK-P10-NEXT:    plxv v2, 8(r3), 0
53; CHECK-P10-NEXT:    blr
54;
55; CHECK-PREP10-LABEL: ld_align16___float128___float128:
56; CHECK-PREP10:       # %bb.0: # %entry
57; CHECK-PREP10-NEXT:    li r4, 8
58; CHECK-PREP10-NEXT:    lxvx v2, r3, r4
59; CHECK-PREP10-NEXT:    blr
60entry:
61  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
62  %0 = load fp128, ptr %add.ptr, align 16
63  ret fp128 %0
64}
65
66; Function Attrs: norecurse nounwind readonly willreturn
67define dso_local fp128 @ld_unalign32___float128___float128(ptr nocapture readonly %ptr) {
68; CHECK-P10-LABEL: ld_unalign32___float128___float128:
69; CHECK-P10:       # %bb.0: # %entry
70; CHECK-P10-NEXT:    plxv v2, 99999(r3), 0
71; CHECK-P10-NEXT:    blr
72;
73; CHECK-PREP10-LABEL: ld_unalign32___float128___float128:
74; CHECK-PREP10:       # %bb.0: # %entry
75; CHECK-PREP10-NEXT:    lis r4, 1
76; CHECK-PREP10-NEXT:    ori r4, r4, 34463
77; CHECK-PREP10-NEXT:    lxvx v2, r3, r4
78; CHECK-PREP10-NEXT:    blr
79entry:
80  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999
81  %0 = load fp128, ptr %add.ptr, align 16
82  ret fp128 %0
83}
84
85; Function Attrs: norecurse nounwind readonly willreturn
86define dso_local fp128 @ld_align32___float128___float128(ptr nocapture readonly %ptr) {
87; CHECK-P10-LABEL: ld_align32___float128___float128:
88; CHECK-P10:       # %bb.0: # %entry
89; CHECK-P10-NEXT:    plxv v2, 99999000(r3), 0
90; CHECK-P10-NEXT:    blr
91;
92; CHECK-PREP10-LABEL: ld_align32___float128___float128:
93; CHECK-PREP10:       # %bb.0: # %entry
94; CHECK-PREP10-NEXT:    lis r4, 1525
95; CHECK-PREP10-NEXT:    ori r4, r4, 56600
96; CHECK-PREP10-NEXT:    lxvx v2, r3, r4
97; CHECK-PREP10-NEXT:    blr
98entry:
99  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
100  %0 = load fp128, ptr %add.ptr, align 16
101  ret fp128 %0
102}
103
104; Function Attrs: norecurse nounwind readonly willreturn
105define dso_local fp128 @ld_unalign64___float128___float128(ptr nocapture readonly %ptr) {
106; CHECK-P10-LABEL: ld_unalign64___float128___float128:
107; CHECK-P10:       # %bb.0: # %entry
108; CHECK-P10-NEXT:    pli r4, 232
109; CHECK-P10-NEXT:    pli r5, 3567587329
110; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
111; CHECK-P10-NEXT:    lxvx v2, r3, r5
112; CHECK-P10-NEXT:    blr
113;
114; CHECK-PREP10-LABEL: ld_unalign64___float128___float128:
115; CHECK-PREP10:       # %bb.0: # %entry
116; CHECK-PREP10-NEXT:    li r4, 29
117; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
118; CHECK-PREP10-NEXT:    oris r4, r4, 54437
119; CHECK-PREP10-NEXT:    ori r4, r4, 4097
120; CHECK-PREP10-NEXT:    lxvx v2, r3, r4
121; CHECK-PREP10-NEXT:    blr
122entry:
123  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000001
124  %0 = load fp128, ptr %add.ptr, align 16
125  ret fp128 %0
126}
127
128; Function Attrs: norecurse nounwind readonly willreturn
129define dso_local fp128 @ld_align64___float128___float128(ptr nocapture readonly %ptr) {
130; CHECK-P10-LABEL: ld_align64___float128___float128:
131; CHECK-P10:       # %bb.0: # %entry
132; CHECK-P10-NEXT:    pli r4, 244140625
133; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
134; CHECK-P10-NEXT:    lxvx v2, r3, r4
135; CHECK-P10-NEXT:    blr
136;
137; CHECK-PREP10-LABEL: ld_align64___float128___float128:
138; CHECK-PREP10:       # %bb.0: # %entry
139; CHECK-PREP10-NEXT:    lis r4, 3725
140; CHECK-PREP10-NEXT:    ori r4, r4, 19025
141; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
142; CHECK-PREP10-NEXT:    lxvx v2, r3, r4
143; CHECK-PREP10-NEXT:    blr
144entry:
145  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
146  %0 = load fp128, ptr %add.ptr, align 16
147  ret fp128 %0
148}
149
150; Function Attrs: norecurse nounwind readonly willreturn
151define dso_local fp128 @ld_reg___float128___float128(ptr nocapture readonly %ptr, i64 %off) {
152; CHECK-LABEL: ld_reg___float128___float128:
153; CHECK:       # %bb.0: # %entry
154; CHECK-NEXT:    lxvx v2, r3, r4
155; CHECK-NEXT:    blr
156entry:
157  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
158  %0 = load fp128, ptr %add.ptr, align 16
159  ret fp128 %0
160}
161
162; Function Attrs: norecurse nounwind readonly willreturn
163define dso_local fp128 @ld_or___float128___float128(i64 %ptr, i8 zeroext %off) {
164; CHECK-LABEL: ld_or___float128___float128:
165; CHECK:       # %bb.0: # %entry
166; CHECK-NEXT:    or r3, r4, r3
167; CHECK-NEXT:    lxv v2, 0(r3)
168; CHECK-NEXT:    blr
169entry:
170  %conv = zext i8 %off to i64
171  %or = or i64 %conv, %ptr
172  %0 = inttoptr i64 %or to ptr
173  %1 = load fp128, ptr %0, align 16
174  ret fp128 %1
175}
176
177; Function Attrs: norecurse nounwind readonly willreturn
178define dso_local fp128 @ld_or2___float128___float128(i64 %ptr, i8 zeroext %off) {
179; CHECK-LABEL: ld_or2___float128___float128:
180; CHECK:       # %bb.0: # %entry
181; CHECK-NEXT:    rldicr r3, r3, 0, 51
182; CHECK-NEXT:    lxvx v2, r3, r4
183; CHECK-NEXT:    blr
184entry:
185  %and = and i64 %ptr, -4096
186  %conv = zext i8 %off to i64
187  %or = or i64 %and, %conv
188  %0 = inttoptr i64 %or to ptr
189  %1 = load fp128, ptr %0, align 16
190  ret fp128 %1
191}
192
193; Function Attrs: norecurse nounwind readonly willreturn
194define dso_local fp128 @ld_not_disjoint16___float128___float128(i64 %ptr) {
195; CHECK-LABEL: ld_not_disjoint16___float128___float128:
196; CHECK:       # %bb.0: # %entry
197; CHECK-NEXT:    ori r3, r3, 6
198; CHECK-NEXT:    lxv v2, 0(r3)
199; CHECK-NEXT:    blr
200entry:
201  %or = or i64 %ptr, 6
202  %0 = inttoptr i64 %or to ptr
203  %1 = load fp128, ptr %0, align 16
204  ret fp128 %1
205}
206
207; Function Attrs: norecurse nounwind readonly willreturn
208define dso_local fp128 @ld_disjoint_unalign16___float128___float128(i64 %ptr) {
209; CHECK-P10-LABEL: ld_disjoint_unalign16___float128___float128:
210; CHECK-P10:       # %bb.0: # %entry
211; CHECK-P10-NEXT:    rldicr r3, r3, 0, 51
212; CHECK-P10-NEXT:    plxv v2, 6(r3), 0
213; CHECK-P10-NEXT:    blr
214;
215; CHECK-PREP10-LABEL: ld_disjoint_unalign16___float128___float128:
216; CHECK-PREP10:       # %bb.0: # %entry
217; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 51
218; CHECK-PREP10-NEXT:    li r4, 6
219; CHECK-PREP10-NEXT:    lxvx v2, r3, r4
220; CHECK-PREP10-NEXT:    blr
221entry:
222  %and = and i64 %ptr, -4096
223  %or = or i64 %and, 6
224  %0 = inttoptr i64 %or to ptr
225  %1 = load fp128, ptr %0, align 16
226  ret fp128 %1
227}
228
229; Function Attrs: norecurse nounwind readonly willreturn
230define dso_local fp128 @ld_disjoint_align16___float128___float128(i64 %ptr) {
231; CHECK-P10-LABEL: ld_disjoint_align16___float128___float128:
232; CHECK-P10:       # %bb.0: # %entry
233; CHECK-P10-NEXT:    rldicr r3, r3, 0, 51
234; CHECK-P10-NEXT:    plxv v2, 24(r3), 0
235; CHECK-P10-NEXT:    blr
236;
237; CHECK-PREP10-LABEL: ld_disjoint_align16___float128___float128:
238; CHECK-PREP10:       # %bb.0: # %entry
239; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 51
240; CHECK-PREP10-NEXT:    li r4, 24
241; CHECK-PREP10-NEXT:    lxvx v2, r3, r4
242; CHECK-PREP10-NEXT:    blr
243entry:
244  %and = and i64 %ptr, -4096
245  %or = or i64 %and, 24
246  %0 = inttoptr i64 %or to ptr
247  %1 = load fp128, ptr %0, align 16
248  ret fp128 %1
249}
250
251; Function Attrs: norecurse nounwind readonly willreturn
252define dso_local fp128 @ld_not_disjoint32___float128___float128(i64 %ptr) {
253; CHECK-LABEL: ld_not_disjoint32___float128___float128:
254; CHECK:       # %bb.0: # %entry
255; CHECK-NEXT:    ori r3, r3, 34463
256; CHECK-NEXT:    oris r3, r3, 1
257; CHECK-NEXT:    lxv v2, 0(r3)
258; CHECK-NEXT:    blr
259entry:
260  %or = or i64 %ptr, 99999
261  %0 = inttoptr i64 %or to ptr
262  %1 = load fp128, ptr %0, align 16
263  ret fp128 %1
264}
265
266; Function Attrs: norecurse nounwind readonly willreturn
267define dso_local fp128 @ld_disjoint_unalign32___float128___float128(i64 %ptr) {
268; CHECK-P10-LABEL: ld_disjoint_unalign32___float128___float128:
269; CHECK-P10:       # %bb.0: # %entry
270; CHECK-P10-NEXT:    rldicr r3, r3, 0, 43
271; CHECK-P10-NEXT:    plxv v2, 99999(r3), 0
272; CHECK-P10-NEXT:    blr
273;
274; CHECK-PREP10-LABEL: ld_disjoint_unalign32___float128___float128:
275; CHECK-PREP10:       # %bb.0: # %entry
276; CHECK-PREP10-NEXT:    lis r4, 1
277; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 43
278; CHECK-PREP10-NEXT:    ori r4, r4, 34463
279; CHECK-PREP10-NEXT:    lxvx v2, r3, r4
280; CHECK-PREP10-NEXT:    blr
281entry:
282  %and = and i64 %ptr, -1048576
283  %or = or i64 %and, 99999
284  %0 = inttoptr i64 %or to ptr
285  %1 = load fp128, ptr %0, align 16
286  ret fp128 %1
287}
288
289; Function Attrs: norecurse nounwind readonly willreturn
290define dso_local fp128 @ld_disjoint_align32___float128___float128(i64 %ptr) {
291; CHECK-P10-LABEL: ld_disjoint_align32___float128___float128:
292; CHECK-P10:       # %bb.0: # %entry
293; CHECK-P10-NEXT:    lis r4, -15264
294; CHECK-P10-NEXT:    and r3, r3, r4
295; CHECK-P10-NEXT:    plxv v2, 999990000(r3), 0
296; CHECK-P10-NEXT:    blr
297;
298; CHECK-PREP10-LABEL: ld_disjoint_align32___float128___float128:
299; CHECK-PREP10:       # %bb.0: # %entry
300; CHECK-PREP10-NEXT:    lis r4, -15264
301; CHECK-PREP10-NEXT:    and r3, r3, r4
302; CHECK-PREP10-NEXT:    lis r4, 15258
303; CHECK-PREP10-NEXT:    ori r4, r4, 41712
304; CHECK-PREP10-NEXT:    lxvx v2, r3, r4
305; CHECK-PREP10-NEXT:    blr
306entry:
307  %and = and i64 %ptr, -1000341504
308  %or = or i64 %and, 999990000
309  %0 = inttoptr i64 %or to ptr
310  %1 = load fp128, ptr %0, align 16
311  ret fp128 %1
312}
313
314; Function Attrs: norecurse nounwind readonly willreturn
315define dso_local fp128 @ld_not_disjoint64___float128___float128(i64 %ptr) {
316; CHECK-P10-LABEL: ld_not_disjoint64___float128___float128:
317; CHECK-P10:       # %bb.0: # %entry
318; CHECK-P10-NEXT:    pli r4, 232
319; CHECK-P10-NEXT:    pli r5, 3567587329
320; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
321; CHECK-P10-NEXT:    or r3, r3, r5
322; CHECK-P10-NEXT:    lxv v2, 0(r3)
323; CHECK-P10-NEXT:    blr
324;
325; CHECK-PREP10-LABEL: ld_not_disjoint64___float128___float128:
326; CHECK-PREP10:       # %bb.0: # %entry
327; CHECK-PREP10-NEXT:    li r4, 29
328; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
329; CHECK-PREP10-NEXT:    oris r4, r4, 54437
330; CHECK-PREP10-NEXT:    ori r4, r4, 4097
331; CHECK-PREP10-NEXT:    or r3, r3, r4
332; CHECK-PREP10-NEXT:    lxv v2, 0(r3)
333; CHECK-PREP10-NEXT:    blr
334entry:
335  %or = or i64 %ptr, 1000000000001
336  %0 = inttoptr i64 %or to ptr
337  %1 = load fp128, ptr %0, align 16
338  ret fp128 %1
339}
340
341; Function Attrs: norecurse nounwind readonly willreturn
342define dso_local fp128 @ld_disjoint_unalign64___float128___float128(i64 %ptr) {
343; CHECK-P10-LABEL: ld_disjoint_unalign64___float128___float128:
344; CHECK-P10:       # %bb.0: # %entry
345; CHECK-P10-NEXT:    pli r4, 232
346; CHECK-P10-NEXT:    pli r5, 3567587329
347; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
348; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
349; CHECK-P10-NEXT:    lxvx v2, r3, r5
350; CHECK-P10-NEXT:    blr
351;
352; CHECK-PREP10-LABEL: ld_disjoint_unalign64___float128___float128:
353; CHECK-PREP10:       # %bb.0: # %entry
354; CHECK-PREP10-NEXT:    li r4, 29
355; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
356; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
357; CHECK-PREP10-NEXT:    oris r4, r4, 54437
358; CHECK-PREP10-NEXT:    ori r4, r4, 4097
359; CHECK-PREP10-NEXT:    lxvx v2, r3, r4
360; CHECK-PREP10-NEXT:    blr
361entry:
362  %and = and i64 %ptr, -1099511627776
363  %or = or i64 %and, 1000000000001
364  %0 = inttoptr i64 %or to ptr
365  %1 = load fp128, ptr %0, align 16
366  ret fp128 %1
367}
368
369; Function Attrs: norecurse nounwind readonly willreturn
370define dso_local fp128 @ld_disjoint_align64___float128___float128(i64 %ptr) {
371; CHECK-P10-LABEL: ld_disjoint_align64___float128___float128:
372; CHECK-P10:       # %bb.0: # %entry
373; CHECK-P10-NEXT:    pli r4, 244140625
374; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
375; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
376; CHECK-P10-NEXT:    lxvx v2, r3, r4
377; CHECK-P10-NEXT:    blr
378;
379; CHECK-PREP10-LABEL: ld_disjoint_align64___float128___float128:
380; CHECK-PREP10:       # %bb.0: # %entry
381; CHECK-PREP10-NEXT:    lis r4, 3725
382; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
383; CHECK-PREP10-NEXT:    ori r4, r4, 19025
384; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
385; CHECK-PREP10-NEXT:    lxvx v2, r3, r4
386; CHECK-PREP10-NEXT:    blr
387entry:
388  %and = and i64 %ptr, -1099511627776
389  %or = or i64 %and, 1000000000000
390  %0 = inttoptr i64 %or to ptr
391  %1 = load fp128, ptr %0, align 4096
392  ret fp128 %1
393}
394
395; Function Attrs: norecurse nounwind readonly willreturn
396define dso_local fp128 @ld_cst_unalign16___float128___float128() {
397; CHECK-LABEL: ld_cst_unalign16___float128___float128:
398; CHECK:       # %bb.0: # %entry
399; CHECK-NEXT:    li r3, 255
400; CHECK-NEXT:    lxv v2, 0(r3)
401; CHECK-NEXT:    blr
402entry:
403  %0 = load fp128, ptr inttoptr (i64 255 to ptr), align 16
404  ret fp128 %0
405}
406
407; Function Attrs: norecurse nounwind readonly willreturn
408define dso_local fp128 @ld_cst_align16___float128___float128() {
409; CHECK-LABEL: ld_cst_align16___float128___float128:
410; CHECK:       # %bb.0: # %entry
411; CHECK-NEXT:    lxv v2, 4080(0)
412; CHECK-NEXT:    blr
413entry:
414  %0 = load fp128, ptr inttoptr (i64 4080 to ptr), align 16
415  ret fp128 %0
416}
417
418; Function Attrs: norecurse nounwind readonly willreturn
419define dso_local fp128 @ld_cst_unalign32___float128___float128() {
420; CHECK-P10-LABEL: ld_cst_unalign32___float128___float128:
421; CHECK-P10:       # %bb.0: # %entry
422; CHECK-P10-NEXT:    pli r3, 99999
423; CHECK-P10-NEXT:    lxv v2, 0(r3)
424; CHECK-P10-NEXT:    blr
425;
426; CHECK-PREP10-LABEL: ld_cst_unalign32___float128___float128:
427; CHECK-PREP10:       # %bb.0: # %entry
428; CHECK-PREP10-NEXT:    lis r3, 1
429; CHECK-PREP10-NEXT:    ori r3, r3, 34463
430; CHECK-PREP10-NEXT:    lxv v2, 0(r3)
431; CHECK-PREP10-NEXT:    blr
432entry:
433  %0 = load fp128, ptr inttoptr (i64 99999 to ptr), align 16
434  ret fp128 %0
435}
436
437; Function Attrs: norecurse nounwind readonly willreturn
438define dso_local fp128 @ld_cst_align32___float128___float128() {
439; CHECK-P10-LABEL: ld_cst_align32___float128___float128:
440; CHECK-P10:       # %bb.0: # %entry
441; CHECK-P10-NEXT:    pli r3, 9999900
442; CHECK-P10-NEXT:    lxv v2, 0(r3)
443; CHECK-P10-NEXT:    blr
444;
445; CHECK-PREP10-LABEL: ld_cst_align32___float128___float128:
446; CHECK-PREP10:       # %bb.0: # %entry
447; CHECK-PREP10-NEXT:    lis r3, 152
448; CHECK-PREP10-NEXT:    ori r3, r3, 38428
449; CHECK-PREP10-NEXT:    lxv v2, 0(r3)
450; CHECK-PREP10-NEXT:    blr
451entry:
452  %0 = load fp128, ptr inttoptr (i64 9999900 to ptr), align 16
453  ret fp128 %0
454}
455
456; Function Attrs: norecurse nounwind readonly willreturn
457define dso_local fp128 @ld_cst_unalign64___float128___float128() {
458; CHECK-P10-LABEL: ld_cst_unalign64___float128___float128:
459; CHECK-P10:       # %bb.0: # %entry
460; CHECK-P10-NEXT:    pli r3, 232
461; CHECK-P10-NEXT:    pli r4, 3567587329
462; CHECK-P10-NEXT:    rldimi r4, r3, 32, 0
463; CHECK-P10-NEXT:    lxv v2, 0(r4)
464; CHECK-P10-NEXT:    blr
465;
466; CHECK-PREP10-LABEL: ld_cst_unalign64___float128___float128:
467; CHECK-PREP10:       # %bb.0: # %entry
468; CHECK-PREP10-NEXT:    li r3, 29
469; CHECK-PREP10-NEXT:    rldic r3, r3, 35, 24
470; CHECK-PREP10-NEXT:    oris r3, r3, 54437
471; CHECK-PREP10-NEXT:    ori r3, r3, 4097
472; CHECK-PREP10-NEXT:    lxv v2, 0(r3)
473; CHECK-PREP10-NEXT:    blr
474entry:
475  %0 = load fp128, ptr inttoptr (i64 1000000000001 to ptr), align 16
476  ret fp128 %0
477}
478
479; Function Attrs: norecurse nounwind readonly willreturn
480define dso_local fp128 @ld_cst_align64___float128___float128() {
481; CHECK-P10-LABEL: ld_cst_align64___float128___float128:
482; CHECK-P10:       # %bb.0: # %entry
483; CHECK-P10-NEXT:    pli r3, 244140625
484; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
485; CHECK-P10-NEXT:    lxv v2, 0(r3)
486; CHECK-P10-NEXT:    blr
487;
488; CHECK-PREP10-LABEL: ld_cst_align64___float128___float128:
489; CHECK-PREP10:       # %bb.0: # %entry
490; CHECK-PREP10-NEXT:    lis r3, 3725
491; CHECK-PREP10-NEXT:    ori r3, r3, 19025
492; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
493; CHECK-PREP10-NEXT:    lxv v2, 0(r3)
494; CHECK-PREP10-NEXT:    blr
495entry:
496  %0 = load fp128, ptr inttoptr (i64 1000000000000 to ptr), align 4096
497  ret fp128 %0
498}
499
500; Function Attrs: nofree norecurse nounwind willreturn writeonly
501define dso_local void @st_0___float128___float128(i64 %ptr, fp128 %str) {
502; CHECK-LABEL: st_0___float128___float128:
503; CHECK:       # %bb.0: # %entry
504; CHECK-NEXT:    stxv v2, 0(r3)
505; CHECK-NEXT:    blr
506entry:
507  %0 = inttoptr i64 %ptr to ptr
508  store fp128 %str, ptr %0, align 16
509  ret void
510}
511
512; Function Attrs: nofree norecurse nounwind willreturn writeonly
513define dso_local void @st_unalign16___float128___float128(ptr nocapture %ptr, fp128 %str) {
514; CHECK-P10-LABEL: st_unalign16___float128___float128:
515; CHECK-P10:       # %bb.0: # %entry
516; CHECK-P10-NEXT:    pstxv v2, 1(r3), 0
517; CHECK-P10-NEXT:    blr
518;
519; CHECK-PREP10-LABEL: st_unalign16___float128___float128:
520; CHECK-PREP10:       # %bb.0: # %entry
521; CHECK-PREP10-NEXT:    li r4, 1
522; CHECK-PREP10-NEXT:    stxvx v2, r3, r4
523; CHECK-PREP10-NEXT:    blr
524entry:
525  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1
526  store fp128 %str, ptr %add.ptr, align 16
527  ret void
528}
529
530; Function Attrs: nofree norecurse nounwind willreturn writeonly
531define dso_local void @st_align16___float128___float128(ptr nocapture %ptr, fp128 %str) {
532; CHECK-P10-LABEL: st_align16___float128___float128:
533; CHECK-P10:       # %bb.0: # %entry
534; CHECK-P10-NEXT:    pstxv v2, 8(r3), 0
535; CHECK-P10-NEXT:    blr
536;
537; CHECK-PREP10-LABEL: st_align16___float128___float128:
538; CHECK-PREP10:       # %bb.0: # %entry
539; CHECK-PREP10-NEXT:    li r4, 8
540; CHECK-PREP10-NEXT:    stxvx v2, r3, r4
541; CHECK-PREP10-NEXT:    blr
542entry:
543  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
544  store fp128 %str, ptr %add.ptr, align 16
545  ret void
546}
547
548; Function Attrs: nofree norecurse nounwind willreturn writeonly
549define dso_local void @st_unalign32___float128___float128(ptr nocapture %ptr, fp128 %str) {
550; CHECK-P10-LABEL: st_unalign32___float128___float128:
551; CHECK-P10:       # %bb.0: # %entry
552; CHECK-P10-NEXT:    pstxv v2, 99999(r3), 0
553; CHECK-P10-NEXT:    blr
554;
555; CHECK-PREP10-LABEL: st_unalign32___float128___float128:
556; CHECK-PREP10:       # %bb.0: # %entry
557; CHECK-PREP10-NEXT:    lis r4, 1
558; CHECK-PREP10-NEXT:    ori r4, r4, 34463
559; CHECK-PREP10-NEXT:    stxvx v2, r3, r4
560; CHECK-PREP10-NEXT:    blr
561entry:
562  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999
563  store fp128 %str, ptr %add.ptr, align 16
564  ret void
565}
566
567; Function Attrs: nofree norecurse nounwind willreturn writeonly
568define dso_local void @st_align32___float128___float128(ptr nocapture %ptr, fp128 %str) {
569; CHECK-P10-LABEL: st_align32___float128___float128:
570; CHECK-P10:       # %bb.0: # %entry
571; CHECK-P10-NEXT:    pstxv v2, 99999000(r3), 0
572; CHECK-P10-NEXT:    blr
573;
574; CHECK-PREP10-LABEL: st_align32___float128___float128:
575; CHECK-PREP10:       # %bb.0: # %entry
576; CHECK-PREP10-NEXT:    lis r4, 1525
577; CHECK-PREP10-NEXT:    ori r4, r4, 56600
578; CHECK-PREP10-NEXT:    stxvx v2, r3, r4
579; CHECK-PREP10-NEXT:    blr
580entry:
581  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
582  store fp128 %str, ptr %add.ptr, align 16
583  ret void
584}
585
586; Function Attrs: nofree norecurse nounwind willreturn writeonly
587define dso_local void @st_unalign64___float128___float128(ptr nocapture %ptr, fp128 %str) {
588; CHECK-P10-LABEL: st_unalign64___float128___float128:
589; CHECK-P10:       # %bb.0: # %entry
590; CHECK-P10-NEXT:    pli r4, 232
591; CHECK-P10-NEXT:    pli r5, 3567587329
592; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
593; CHECK-P10-NEXT:    stxvx v2, r3, r5
594; CHECK-P10-NEXT:    blr
595;
596; CHECK-PREP10-LABEL: st_unalign64___float128___float128:
597; CHECK-PREP10:       # %bb.0: # %entry
598; CHECK-PREP10-NEXT:    li r4, 29
599; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
600; CHECK-PREP10-NEXT:    oris r4, r4, 54437
601; CHECK-PREP10-NEXT:    ori r4, r4, 4097
602; CHECK-PREP10-NEXT:    stxvx v2, r3, r4
603; CHECK-PREP10-NEXT:    blr
604entry:
605  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000001
606  store fp128 %str, ptr %add.ptr, align 16
607  ret void
608}
609
610; Function Attrs: nofree norecurse nounwind willreturn writeonly
611define dso_local void @st_align64___float128___float128(ptr nocapture %ptr, fp128 %str) {
612; CHECK-P10-LABEL: st_align64___float128___float128:
613; CHECK-P10:       # %bb.0: # %entry
614; CHECK-P10-NEXT:    pli r4, 244140625
615; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
616; CHECK-P10-NEXT:    stxvx v2, r3, r4
617; CHECK-P10-NEXT:    blr
618;
619; CHECK-PREP10-LABEL: st_align64___float128___float128:
620; CHECK-PREP10:       # %bb.0: # %entry
621; CHECK-PREP10-NEXT:    lis r4, 3725
622; CHECK-PREP10-NEXT:    ori r4, r4, 19025
623; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
624; CHECK-PREP10-NEXT:    stxvx v2, r3, r4
625; CHECK-PREP10-NEXT:    blr
626entry:
627  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
628  store fp128 %str, ptr %add.ptr, align 16
629  ret void
630}
631
632; Function Attrs: nofree norecurse nounwind willreturn writeonly
633define dso_local void @st_reg___float128___float128(ptr nocapture %ptr, i64 %off, fp128 %str) {
634; CHECK-LABEL: st_reg___float128___float128:
635; CHECK:       # %bb.0: # %entry
636; CHECK-NEXT:    stxvx v2, r3, r4
637; CHECK-NEXT:    blr
638entry:
639  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
640  store fp128 %str, ptr %add.ptr, align 16
641  ret void
642}
643
644; Function Attrs: nofree norecurse nounwind willreturn writeonly
645define dso_local void @st_or1___float128___float128(i64 %ptr, i8 zeroext %off, fp128 %str) {
646; CHECK-LABEL: st_or1___float128___float128:
647; CHECK:       # %bb.0: # %entry
648; CHECK-NEXT:    or r3, r4, r3
649; CHECK-NEXT:    stxv v2, 0(r3)
650; CHECK-NEXT:    blr
651entry:
652  %conv = zext i8 %off to i64
653  %or = or i64 %conv, %ptr
654  %0 = inttoptr i64 %or to ptr
655  store fp128 %str, ptr %0, align 16
656  ret void
657}
658
659; Function Attrs: nofree norecurse nounwind willreturn writeonly
660define dso_local void @st_or2___float128___float128(i64 %ptr, i8 zeroext %off, fp128 %str) {
661; CHECK-LABEL: st_or2___float128___float128:
662; CHECK:       # %bb.0: # %entry
663; CHECK-NEXT:    rldicr r3, r3, 0, 51
664; CHECK-NEXT:    stxvx v2, r3, r4
665; CHECK-NEXT:    blr
666entry:
667  %and = and i64 %ptr, -4096
668  %conv = zext i8 %off to i64
669  %or = or i64 %and, %conv
670  %0 = inttoptr i64 %or to ptr
671  store fp128 %str, ptr %0, align 16
672  ret void
673}
674
675; Function Attrs: nofree norecurse nounwind willreturn writeonly
676define dso_local void @st_not_disjoint16___float128___float128(i64 %ptr, fp128 %str) {
677; CHECK-LABEL: st_not_disjoint16___float128___float128:
678; CHECK:       # %bb.0: # %entry
679; CHECK-NEXT:    ori r3, r3, 6
680; CHECK-NEXT:    stxv v2, 0(r3)
681; CHECK-NEXT:    blr
682entry:
683  %or = or i64 %ptr, 6
684  %0 = inttoptr i64 %or to ptr
685  store fp128 %str, ptr %0, align 16
686  ret void
687}
688
689; Function Attrs: nofree norecurse nounwind willreturn writeonly
690define dso_local void @st_disjoint_unalign16___float128___float128(i64 %ptr, fp128 %str) {
691; CHECK-P10-LABEL: st_disjoint_unalign16___float128___float128:
692; CHECK-P10:       # %bb.0: # %entry
693; CHECK-P10-NEXT:    rldicr r3, r3, 0, 51
694; CHECK-P10-NEXT:    pstxv v2, 6(r3), 0
695; CHECK-P10-NEXT:    blr
696;
697; CHECK-PREP10-LABEL: st_disjoint_unalign16___float128___float128:
698; CHECK-PREP10:       # %bb.0: # %entry
699; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 51
700; CHECK-PREP10-NEXT:    li r4, 6
701; CHECK-PREP10-NEXT:    stxvx v2, r3, r4
702; CHECK-PREP10-NEXT:    blr
703entry:
704  %and = and i64 %ptr, -4096
705  %or = or i64 %and, 6
706  %0 = inttoptr i64 %or to ptr
707  store fp128 %str, ptr %0, align 16
708  ret void
709}
710
711; Function Attrs: nofree norecurse nounwind willreturn writeonly
712define dso_local void @st_disjoint_align16___float128___float128(i64 %ptr, fp128 %str) {
713; CHECK-P10-LABEL: st_disjoint_align16___float128___float128:
714; CHECK-P10:       # %bb.0: # %entry
715; CHECK-P10-NEXT:    rldicr r3, r3, 0, 51
716; CHECK-P10-NEXT:    pstxv v2, 24(r3), 0
717; CHECK-P10-NEXT:    blr
718;
719; CHECK-PREP10-LABEL: st_disjoint_align16___float128___float128:
720; CHECK-PREP10:       # %bb.0: # %entry
721; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 51
722; CHECK-PREP10-NEXT:    li r4, 24
723; CHECK-PREP10-NEXT:    stxvx v2, r3, r4
724; CHECK-PREP10-NEXT:    blr
725entry:
726  %and = and i64 %ptr, -4096
727  %or = or i64 %and, 24
728  %0 = inttoptr i64 %or to ptr
729  store fp128 %str, ptr %0, align 16
730  ret void
731}
732
733; Function Attrs: nofree norecurse nounwind willreturn writeonly
734define dso_local void @st_not_disjoint32___float128___float128(i64 %ptr, fp128 %str) {
735; CHECK-LABEL: st_not_disjoint32___float128___float128:
736; CHECK:       # %bb.0: # %entry
737; CHECK-NEXT:    ori r3, r3, 34463
738; CHECK-NEXT:    oris r3, r3, 1
739; CHECK-NEXT:    stxv v2, 0(r3)
740; CHECK-NEXT:    blr
741entry:
742  %or = or i64 %ptr, 99999
743  %0 = inttoptr i64 %or to ptr
744  store fp128 %str, ptr %0, align 16
745  ret void
746}
747
748; Function Attrs: nofree norecurse nounwind willreturn writeonly
749define dso_local void @st_disjoint_unalign32___float128___float128(i64 %ptr, fp128 %str) {
750; CHECK-P10-LABEL: st_disjoint_unalign32___float128___float128:
751; CHECK-P10:       # %bb.0: # %entry
752; CHECK-P10-NEXT:    rldicr r3, r3, 0, 43
753; CHECK-P10-NEXT:    pstxv v2, 99999(r3), 0
754; CHECK-P10-NEXT:    blr
755;
756; CHECK-PREP10-LABEL: st_disjoint_unalign32___float128___float128:
757; CHECK-PREP10:       # %bb.0: # %entry
758; CHECK-PREP10-NEXT:    lis r4, 1
759; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 43
760; CHECK-PREP10-NEXT:    ori r4, r4, 34463
761; CHECK-PREP10-NEXT:    stxvx v2, r3, r4
762; CHECK-PREP10-NEXT:    blr
763entry:
764  %and = and i64 %ptr, -1048576
765  %or = or i64 %and, 99999
766  %0 = inttoptr i64 %or to ptr
767  store fp128 %str, ptr %0, align 16
768  ret void
769}
770
771; Function Attrs: nofree norecurse nounwind willreturn writeonly
772define dso_local void @st_disjoint_align32___float128___float128(i64 %ptr, fp128 %str) {
773; CHECK-P10-LABEL: st_disjoint_align32___float128___float128:
774; CHECK-P10:       # %bb.0: # %entry
775; CHECK-P10-NEXT:    lis r4, -15264
776; CHECK-P10-NEXT:    and r3, r3, r4
777; CHECK-P10-NEXT:    pstxv v2, 999990000(r3), 0
778; CHECK-P10-NEXT:    blr
779;
780; CHECK-PREP10-LABEL: st_disjoint_align32___float128___float128:
781; CHECK-PREP10:       # %bb.0: # %entry
782; CHECK-PREP10-NEXT:    lis r4, -15264
783; CHECK-PREP10-NEXT:    and r3, r3, r4
784; CHECK-PREP10-NEXT:    lis r4, 15258
785; CHECK-PREP10-NEXT:    ori r4, r4, 41712
786; CHECK-PREP10-NEXT:    stxvx v2, r3, r4
787; CHECK-PREP10-NEXT:    blr
788entry:
789  %and = and i64 %ptr, -1000341504
790  %or = or i64 %and, 999990000
791  %0 = inttoptr i64 %or to ptr
792  store fp128 %str, ptr %0, align 16
793  ret void
794}
795
796; Function Attrs: nofree norecurse nounwind willreturn writeonly
797define dso_local void @st_not_disjoint64___float128___float128(i64 %ptr, fp128 %str) {
798; CHECK-P10-LABEL: st_not_disjoint64___float128___float128:
799; CHECK-P10:       # %bb.0: # %entry
800; CHECK-P10-NEXT:    pli r4, 232
801; CHECK-P10-NEXT:    pli r5, 3567587329
802; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
803; CHECK-P10-NEXT:    or r3, r3, r5
804; CHECK-P10-NEXT:    stxv v2, 0(r3)
805; CHECK-P10-NEXT:    blr
806;
807; CHECK-PREP10-LABEL: st_not_disjoint64___float128___float128:
808; CHECK-PREP10:       # %bb.0: # %entry
809; CHECK-PREP10-NEXT:    li r4, 29
810; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
811; CHECK-PREP10-NEXT:    oris r4, r4, 54437
812; CHECK-PREP10-NEXT:    ori r4, r4, 4097
813; CHECK-PREP10-NEXT:    or r3, r3, r4
814; CHECK-PREP10-NEXT:    stxv v2, 0(r3)
815; CHECK-PREP10-NEXT:    blr
816entry:
817  %or = or i64 %ptr, 1000000000001
818  %0 = inttoptr i64 %or to ptr
819  store fp128 %str, ptr %0, align 16
820  ret void
821}
822
823; Function Attrs: nofree norecurse nounwind willreturn writeonly
824define dso_local void @st_disjoint_unalign64___float128___float128(i64 %ptr, fp128 %str) {
825; CHECK-P10-LABEL: st_disjoint_unalign64___float128___float128:
826; CHECK-P10:       # %bb.0: # %entry
827; CHECK-P10-NEXT:    pli r4, 232
828; CHECK-P10-NEXT:    pli r5, 3567587329
829; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
830; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
831; CHECK-P10-NEXT:    stxvx v2, r3, r5
832; CHECK-P10-NEXT:    blr
833;
834; CHECK-PREP10-LABEL: st_disjoint_unalign64___float128___float128:
835; CHECK-PREP10:       # %bb.0: # %entry
836; CHECK-PREP10-NEXT:    li r4, 29
837; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
838; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
839; CHECK-PREP10-NEXT:    oris r4, r4, 54437
840; CHECK-PREP10-NEXT:    ori r4, r4, 4097
841; CHECK-PREP10-NEXT:    stxvx v2, r3, r4
842; CHECK-PREP10-NEXT:    blr
843entry:
844  %and = and i64 %ptr, -1099511627776
845  %or = or i64 %and, 1000000000001
846  %0 = inttoptr i64 %or to ptr
847  store fp128 %str, ptr %0, align 16
848  ret void
849}
850
851; Function Attrs: nofree norecurse nounwind willreturn writeonly
852define dso_local void @st_disjoint_align64___float128___float128(i64 %ptr, fp128 %str) {
853; CHECK-P10-LABEL: st_disjoint_align64___float128___float128:
854; CHECK-P10:       # %bb.0: # %entry
855; CHECK-P10-NEXT:    pli r4, 244140625
856; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
857; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
858; CHECK-P10-NEXT:    stxvx v2, r3, r4
859; CHECK-P10-NEXT:    blr
860;
861; CHECK-PREP10-LABEL: st_disjoint_align64___float128___float128:
862; CHECK-PREP10:       # %bb.0: # %entry
863; CHECK-PREP10-NEXT:    lis r4, 3725
864; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
865; CHECK-PREP10-NEXT:    ori r4, r4, 19025
866; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
867; CHECK-PREP10-NEXT:    stxvx v2, r3, r4
868; CHECK-PREP10-NEXT:    blr
869entry:
870  %and = and i64 %ptr, -1099511627776
871  %or = or i64 %and, 1000000000000
872  %0 = inttoptr i64 %or to ptr
873  store fp128 %str, ptr %0, align 4096
874  ret void
875}
876
877; Function Attrs: nofree norecurse nounwind willreturn writeonly
878define dso_local void @st_cst_unalign16___float128___float128(fp128 %str) {
879; CHECK-LABEL: st_cst_unalign16___float128___float128:
880; CHECK:       # %bb.0: # %entry
881; CHECK-NEXT:    li r3, 255
882; CHECK-NEXT:    stxv v2, 0(r3)
883; CHECK-NEXT:    blr
884entry:
885  store fp128 %str, ptr inttoptr (i64 255 to ptr), align 16
886  ret void
887}
888
889; Function Attrs: nofree norecurse nounwind willreturn writeonly
890define dso_local void @st_cst_align16___float128___float128(fp128 %str) {
891; CHECK-LABEL: st_cst_align16___float128___float128:
892; CHECK:       # %bb.0: # %entry
893; CHECK-NEXT:    stxv v2, 4080(0)
894; CHECK-NEXT:    blr
895entry:
896  store fp128 %str, ptr inttoptr (i64 4080 to ptr), align 16
897  ret void
898}
899
900; Function Attrs: nofree norecurse nounwind willreturn writeonly
901define dso_local void @st_cst_unalign32___float128___float128(fp128 %str) {
902; CHECK-P10-LABEL: st_cst_unalign32___float128___float128:
903; CHECK-P10:       # %bb.0: # %entry
904; CHECK-P10-NEXT:    pli r3, 99999
905; CHECK-P10-NEXT:    stxv v2, 0(r3)
906; CHECK-P10-NEXT:    blr
907;
908; CHECK-PREP10-LABEL: st_cst_unalign32___float128___float128:
909; CHECK-PREP10:       # %bb.0: # %entry
910; CHECK-PREP10-NEXT:    lis r3, 1
911; CHECK-PREP10-NEXT:    ori r3, r3, 34463
912; CHECK-PREP10-NEXT:    stxv v2, 0(r3)
913; CHECK-PREP10-NEXT:    blr
914entry:
915  store fp128 %str, ptr inttoptr (i64 99999 to ptr), align 16
916  ret void
917}
918
919; Function Attrs: nofree norecurse nounwind willreturn writeonly
920define dso_local void @st_cst_align32___float128___float128(fp128 %str) {
921; CHECK-P10-LABEL: st_cst_align32___float128___float128:
922; CHECK-P10:       # %bb.0: # %entry
923; CHECK-P10-NEXT:    pli r3, 9999900
924; CHECK-P10-NEXT:    stxv v2, 0(r3)
925; CHECK-P10-NEXT:    blr
926;
927; CHECK-PREP10-LABEL: st_cst_align32___float128___float128:
928; CHECK-PREP10:       # %bb.0: # %entry
929; CHECK-PREP10-NEXT:    lis r3, 152
930; CHECK-PREP10-NEXT:    ori r3, r3, 38428
931; CHECK-PREP10-NEXT:    stxv v2, 0(r3)
932; CHECK-PREP10-NEXT:    blr
933entry:
934  store fp128 %str, ptr inttoptr (i64 9999900 to ptr), align 16
935  ret void
936}
937
938; Function Attrs: nofree norecurse nounwind willreturn writeonly
939define dso_local void @st_cst_unalign64___float128___float128(fp128 %str) {
940; CHECK-P10-LABEL: st_cst_unalign64___float128___float128:
941; CHECK-P10:       # %bb.0: # %entry
942; CHECK-P10-NEXT:    pli r3, 232
943; CHECK-P10-NEXT:    pli r4, 3567587329
944; CHECK-P10-NEXT:    rldimi r4, r3, 32, 0
945; CHECK-P10-NEXT:    stxv v2, 0(r4)
946; CHECK-P10-NEXT:    blr
947;
948; CHECK-PREP10-LABEL: st_cst_unalign64___float128___float128:
949; CHECK-PREP10:       # %bb.0: # %entry
950; CHECK-PREP10-NEXT:    li r3, 29
951; CHECK-PREP10-NEXT:    rldic r3, r3, 35, 24
952; CHECK-PREP10-NEXT:    oris r3, r3, 54437
953; CHECK-PREP10-NEXT:    ori r3, r3, 4097
954; CHECK-PREP10-NEXT:    stxv v2, 0(r3)
955; CHECK-PREP10-NEXT:    blr
956entry:
957  store fp128 %str, ptr inttoptr (i64 1000000000001 to ptr), align 16
958  ret void
959}
960
961; Function Attrs: nofree norecurse nounwind willreturn writeonly
962define dso_local void @st_cst_align64___float128___float128(fp128 %str) {
963; CHECK-P10-LABEL: st_cst_align64___float128___float128:
964; CHECK-P10:       # %bb.0: # %entry
965; CHECK-P10-NEXT:    pli r3, 244140625
966; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
967; CHECK-P10-NEXT:    stxv v2, 0(r3)
968; CHECK-P10-NEXT:    blr
969;
970; CHECK-PREP10-LABEL: st_cst_align64___float128___float128:
971; CHECK-PREP10:       # %bb.0: # %entry
972; CHECK-PREP10-NEXT:    lis r3, 3725
973; CHECK-PREP10-NEXT:    ori r3, r3, 19025
974; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
975; CHECK-PREP10-NEXT:    stxv v2, 0(r3)
976; CHECK-PREP10-NEXT:    blr
977entry:
978  store fp128 %str, ptr inttoptr (i64 1000000000000 to ptr), align 4096
979  ret void
980}
981
982; Function Attrs: nofree norecurse nounwind willreturn
983define dso_local void @testGlob128PtrPlus0() {
984; CHECK-P10-LE-LABEL: testGlob128PtrPlus0:
985; CHECK-P10-LE:       # %bb.0: # %entry
986; CHECK-P10-LE-NEXT:    plxv vs0, GlobLd128@PCREL(0), 1
987; CHECK-P10-LE-NEXT:    pstxv vs0, GlobSt128@PCREL(0), 1
988; CHECK-P10-LE-NEXT:    blr
989;
990; CHECK-P10-BE-LABEL: testGlob128PtrPlus0:
991; CHECK-P10-BE:       # %bb.0: # %entry
992; CHECK-P10-BE-NEXT:    addis r3, r2, GlobLd128@toc@ha
993; CHECK-P10-BE-NEXT:    addi r3, r3, GlobLd128@toc@l
994; CHECK-P10-BE-NEXT:    lxv vs0, 0(r3)
995; CHECK-P10-BE-NEXT:    addis r3, r2, GlobSt128@toc@ha
996; CHECK-P10-BE-NEXT:    addi r3, r3, GlobSt128@toc@l
997; CHECK-P10-BE-NEXT:    stxv vs0, 0(r3)
998; CHECK-P10-BE-NEXT:    blr
999;
1000; CHECK-PREP10-LABEL: testGlob128PtrPlus0:
1001; CHECK-PREP10:       # %bb.0: # %entry
1002; CHECK-PREP10-NEXT:    addis r3, r2, GlobLd128@toc@ha
1003; CHECK-PREP10-NEXT:    addi r3, r3, GlobLd128@toc@l
1004; CHECK-PREP10-NEXT:    lxv vs0, 0(r3)
1005; CHECK-PREP10-NEXT:    addis r3, r2, GlobSt128@toc@ha
1006; CHECK-PREP10-NEXT:    addi r3, r3, GlobSt128@toc@l
1007; CHECK-PREP10-NEXT:    stxv vs0, 0(r3)
1008; CHECK-PREP10-NEXT:    blr
1009entry:
1010  %0 = load fp128, ptr @GlobLd128, align 16
1011  store fp128 %0, ptr @GlobSt128, align 16
1012  ret void
1013}
1014
1015; Function Attrs: nofree norecurse nounwind willreturn
1016define dso_local void @testGlob128PtrPlus3() {
1017; CHECK-P10-LE-LABEL: testGlob128PtrPlus3:
1018; CHECK-P10-LE:       # %bb.0: # %entry
1019; CHECK-P10-LE-NEXT:    plxv vs0, GlobLd128@PCREL+3(0), 1
1020; CHECK-P10-LE-NEXT:    pstxv vs0, GlobSt128@PCREL+3(0), 1
1021; CHECK-P10-LE-NEXT:    blr
1022;
1023; CHECK-P10-BE-LABEL: testGlob128PtrPlus3:
1024; CHECK-P10-BE:       # %bb.0: # %entry
1025; CHECK-P10-BE-NEXT:    addis r3, r2, GlobLd128@toc@ha
1026; CHECK-P10-BE-NEXT:    addi r3, r3, GlobLd128@toc@l
1027; CHECK-P10-BE-NEXT:    plxv vs0, 3(r3), 0
1028; CHECK-P10-BE-NEXT:    addis r3, r2, GlobSt128@toc@ha
1029; CHECK-P10-BE-NEXT:    addi r3, r3, GlobSt128@toc@l
1030; CHECK-P10-BE-NEXT:    pstxv vs0, 3(r3), 0
1031; CHECK-P10-BE-NEXT:    blr
1032;
1033; CHECK-PREP10-LABEL: testGlob128PtrPlus3:
1034; CHECK-PREP10:       # %bb.0: # %entry
1035; CHECK-PREP10-NEXT:    addis r3, r2, GlobLd128@toc@ha
1036; CHECK-PREP10-NEXT:    li r4, 3
1037; CHECK-PREP10-NEXT:    addi r3, r3, GlobLd128@toc@l
1038; CHECK-PREP10-NEXT:    lxvx vs0, r3, r4
1039; CHECK-PREP10-NEXT:    addis r3, r2, GlobSt128@toc@ha
1040; CHECK-PREP10-NEXT:    addi r3, r3, GlobSt128@toc@l
1041; CHECK-PREP10-NEXT:    stxvx vs0, r3, r4
1042; CHECK-PREP10-NEXT:    blr
1043entry:
1044  %0 = load fp128, ptr getelementptr inbounds (i8, ptr @GlobLd128, i64 3), align 16
1045  store fp128 %0, ptr getelementptr inbounds (i8, ptr @GlobSt128, i64 3), align 16
1046  ret void
1047}
1048
1049; Function Attrs: nofree norecurse nounwind willreturn
1050define dso_local void @testGlob128PtrPlus4() {
1051; CHECK-P10-LE-LABEL: testGlob128PtrPlus4:
1052; CHECK-P10-LE:       # %bb.0: # %entry
1053; CHECK-P10-LE-NEXT:    plxv vs0, GlobLd128@PCREL+4(0), 1
1054; CHECK-P10-LE-NEXT:    pstxv vs0, GlobSt128@PCREL+4(0), 1
1055; CHECK-P10-LE-NEXT:    blr
1056;
1057; CHECK-P10-BE-LABEL: testGlob128PtrPlus4:
1058; CHECK-P10-BE:       # %bb.0: # %entry
1059; CHECK-P10-BE-NEXT:    addis r3, r2, GlobLd128@toc@ha
1060; CHECK-P10-BE-NEXT:    addi r3, r3, GlobLd128@toc@l
1061; CHECK-P10-BE-NEXT:    plxv vs0, 4(r3), 0
1062; CHECK-P10-BE-NEXT:    addis r3, r2, GlobSt128@toc@ha
1063; CHECK-P10-BE-NEXT:    addi r3, r3, GlobSt128@toc@l
1064; CHECK-P10-BE-NEXT:    pstxv vs0, 4(r3), 0
1065; CHECK-P10-BE-NEXT:    blr
1066;
1067; CHECK-PREP10-LABEL: testGlob128PtrPlus4:
1068; CHECK-PREP10:       # %bb.0: # %entry
1069; CHECK-PREP10-NEXT:    addis r3, r2, GlobLd128@toc@ha
1070; CHECK-PREP10-NEXT:    li r4, 4
1071; CHECK-PREP10-NEXT:    addi r3, r3, GlobLd128@toc@l
1072; CHECK-PREP10-NEXT:    lxvx vs0, r3, r4
1073; CHECK-PREP10-NEXT:    addis r3, r2, GlobSt128@toc@ha
1074; CHECK-PREP10-NEXT:    addi r3, r3, GlobSt128@toc@l
1075; CHECK-PREP10-NEXT:    stxvx vs0, r3, r4
1076; CHECK-PREP10-NEXT:    blr
1077entry:
1078  %0 = load fp128, ptr getelementptr inbounds (i8, ptr @GlobLd128, i64 4), align 16
1079  store fp128 %0, ptr getelementptr inbounds (i8, ptr @GlobSt128, i64 4), align 16
1080  ret void
1081}
1082
1083; Function Attrs: nofree norecurse nounwind willreturn
1084define dso_local void @testGlob128PtrPlus16() {
1085; CHECK-P10-LE-LABEL: testGlob128PtrPlus16:
1086; CHECK-P10-LE:       # %bb.0: # %entry
1087; CHECK-P10-LE-NEXT:    plxv vs0, GlobLd128@PCREL+16(0), 1
1088; CHECK-P10-LE-NEXT:    pstxv vs0, GlobSt128@PCREL+16(0), 1
1089; CHECK-P10-LE-NEXT:    blr
1090;
1091; CHECK-P10-BE-LABEL: testGlob128PtrPlus16:
1092; CHECK-P10-BE:       # %bb.0: # %entry
1093; CHECK-P10-BE-NEXT:    addis r3, r2, GlobLd128@toc@ha
1094; CHECK-P10-BE-NEXT:    addi r3, r3, GlobLd128@toc@l
1095; CHECK-P10-BE-NEXT:    lxv vs0, 16(r3)
1096; CHECK-P10-BE-NEXT:    addis r3, r2, GlobSt128@toc@ha
1097; CHECK-P10-BE-NEXT:    addi r3, r3, GlobSt128@toc@l
1098; CHECK-P10-BE-NEXT:    stxv vs0, 16(r3)
1099; CHECK-P10-BE-NEXT:    blr
1100;
1101; CHECK-PREP10-LABEL: testGlob128PtrPlus16:
1102; CHECK-PREP10:       # %bb.0: # %entry
1103; CHECK-PREP10-NEXT:    addis r3, r2, GlobLd128@toc@ha
1104; CHECK-PREP10-NEXT:    addi r3, r3, GlobLd128@toc@l
1105; CHECK-PREP10-NEXT:    lxv vs0, 16(r3)
1106; CHECK-PREP10-NEXT:    addis r3, r2, GlobSt128@toc@ha
1107; CHECK-PREP10-NEXT:    addi r3, r3, GlobSt128@toc@l
1108; CHECK-PREP10-NEXT:    stxv vs0, 16(r3)
1109; CHECK-PREP10-NEXT:    blr
1110entry:
1111  %0 = load fp128, ptr getelementptr inbounds ([20 x fp128], ptr @GlobLd128, i64 0, i64 1), align 16
1112  store fp128 %0, ptr getelementptr inbounds ([20 x fp128], ptr @GlobSt128, i64 0, i64 1), align 16
1113  ret void
1114}
1115
1116; Function Attrs: nofree norecurse nounwind willreturn
1117define dso_local void @testGlob128PtrPlusVar(i64 %Idx) {
1118; CHECK-P10-LE-LABEL: testGlob128PtrPlusVar:
1119; CHECK-P10-LE:       # %bb.0: # %entry
1120; CHECK-P10-LE-NEXT:    sldi r3, r3, 4
1121; CHECK-P10-LE-NEXT:    paddi r4, 0, GlobLd128@PCREL, 1
1122; CHECK-P10-LE-NEXT:    lxvx vs0, r4, r3
1123; CHECK-P10-LE-NEXT:    paddi r4, 0, GlobSt128@PCREL, 1
1124; CHECK-P10-LE-NEXT:    stxvx vs0, r4, r3
1125; CHECK-P10-LE-NEXT:    blr
1126;
1127; CHECK-P10-BE-LABEL: testGlob128PtrPlusVar:
1128; CHECK-P10-BE:       # %bb.0: # %entry
1129; CHECK-P10-BE-NEXT:    addis r4, r2, GlobLd128@toc@ha
1130; CHECK-P10-BE-NEXT:    sldi r3, r3, 4
1131; CHECK-P10-BE-NEXT:    addi r4, r4, GlobLd128@toc@l
1132; CHECK-P10-BE-NEXT:    lxvx vs0, r4, r3
1133; CHECK-P10-BE-NEXT:    addis r4, r2, GlobSt128@toc@ha
1134; CHECK-P10-BE-NEXT:    addi r4, r4, GlobSt128@toc@l
1135; CHECK-P10-BE-NEXT:    stxvx vs0, r4, r3
1136; CHECK-P10-BE-NEXT:    blr
1137;
1138; CHECK-PREP10-LABEL: testGlob128PtrPlusVar:
1139; CHECK-PREP10:       # %bb.0: # %entry
1140; CHECK-PREP10-NEXT:    addis r4, r2, GlobLd128@toc@ha
1141; CHECK-PREP10-NEXT:    sldi r3, r3, 4
1142; CHECK-PREP10-NEXT:    addi r4, r4, GlobLd128@toc@l
1143; CHECK-PREP10-NEXT:    lxvx vs0, r4, r3
1144; CHECK-PREP10-NEXT:    addis r4, r2, GlobSt128@toc@ha
1145; CHECK-PREP10-NEXT:    addi r4, r4, GlobSt128@toc@l
1146; CHECK-PREP10-NEXT:    stxvx vs0, r4, r3
1147; CHECK-PREP10-NEXT:    blr
1148entry:
1149  %arrayidx = getelementptr inbounds [20 x fp128], ptr @GlobLd128, i64 0, i64 %Idx
1150  %0 = load fp128, ptr %arrayidx, align 16
1151  %arrayidx1 = getelementptr inbounds [20 x fp128], ptr @GlobSt128, i64 0, i64 %Idx
1152  store fp128 %0, ptr %arrayidx1, align 16
1153  ret void
1154}
1155
1156