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