xref: /llvm-project/llvm/test/CodeGen/PowerPC/atomics-i64-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 -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-PREP10,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-PREP10,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,CHECK-PREP10,CHECK-P8
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,CHECK-PREP10,CHECK-P8
20
21; Function Attrs: nofree norecurse nounwind uwtable willreturn
22define dso_local i64 @ld_0_int64_t_uint8_t(i64 %ptr) {
23; CHECK-LABEL: ld_0_int64_t_uint8_t:
24; CHECK:       # %bb.0: # %entry
25; CHECK-NEXT:    lbz r3, 0(r3)
26; CHECK-NEXT:    blr
27entry:
28  %0 = inttoptr i64 %ptr to ptr
29  %1 = load atomic i8, ptr %0 monotonic, align 1
30  %conv = zext i8 %1 to i64
31  ret i64 %conv
32}
33
34; Function Attrs: nofree norecurse nounwind uwtable willreturn
35define dso_local i64 @ld_align16_int64_t_uint8_t(ptr nocapture readonly %ptr) {
36; CHECK-LABEL: ld_align16_int64_t_uint8_t:
37; CHECK:       # %bb.0: # %entry
38; CHECK-NEXT:    lbz r3, 8(r3)
39; CHECK-NEXT:    blr
40entry:
41  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
42  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
43  %conv = zext i8 %0 to i64
44  ret i64 %conv
45}
46
47; Function Attrs: nofree norecurse nounwind uwtable willreturn
48define dso_local i64 @ld_align32_int64_t_uint8_t(ptr nocapture readonly %ptr) {
49; CHECK-P10-LABEL: ld_align32_int64_t_uint8_t:
50; CHECK-P10:       # %bb.0: # %entry
51; CHECK-P10-NEXT:    plbz r3, 99999000(r3), 0
52; CHECK-P10-NEXT:    clrldi r3, r3, 32
53; CHECK-P10-NEXT:    blr
54;
55; CHECK-PREP10-LABEL: ld_align32_int64_t_uint8_t:
56; CHECK-PREP10:       # %bb.0: # %entry
57; CHECK-PREP10-NEXT:    lis r4, 1525
58; CHECK-PREP10-NEXT:    ori r4, r4, 56600
59; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
60; CHECK-PREP10-NEXT:    blr
61entry:
62  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
63  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
64  %conv = zext i8 %0 to i64
65  ret i64 %conv
66}
67
68; Function Attrs: nofree norecurse nounwind uwtable willreturn
69define dso_local i64 @ld_align64_int64_t_uint8_t(ptr nocapture readonly %ptr) {
70; CHECK-P10-LABEL: ld_align64_int64_t_uint8_t:
71; CHECK-P10:       # %bb.0: # %entry
72; CHECK-P10-NEXT:    pli r4, 244140625
73; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
74; CHECK-P10-NEXT:    lbzx r3, r3, r4
75; CHECK-P10-NEXT:    blr
76;
77; CHECK-PREP10-LABEL: ld_align64_int64_t_uint8_t:
78; CHECK-PREP10:       # %bb.0: # %entry
79; CHECK-PREP10-NEXT:    lis r4, 3725
80; CHECK-PREP10-NEXT:    ori r4, r4, 19025
81; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
82; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
83; CHECK-PREP10-NEXT:    blr
84entry:
85  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
86  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
87  %conv = zext i8 %0 to i64
88  ret i64 %conv
89}
90
91; Function Attrs: nofree norecurse nounwind uwtable willreturn
92define dso_local i64 @ld_reg_int64_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) {
93; CHECK-LABEL: ld_reg_int64_t_uint8_t:
94; CHECK:       # %bb.0: # %entry
95; CHECK-NEXT:    lbzx r3, r3, r4
96; CHECK-NEXT:    blr
97entry:
98  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
99  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
100  %conv = zext i8 %0 to i64
101  ret i64 %conv
102}
103
104; Function Attrs: nofree norecurse nounwind uwtable willreturn
105define dso_local i64 @ld_or_int64_t_uint8_t(i64 %ptr, i8 zeroext %off) {
106; CHECK-LABEL: ld_or_int64_t_uint8_t:
107; CHECK:       # %bb.0: # %entry
108; CHECK-NEXT:    or r3, r4, r3
109; CHECK-NEXT:    lbz r3, 0(r3)
110; CHECK-NEXT:    blr
111entry:
112  %conv = zext i8 %off to i64
113  %or = or i64 %conv, %ptr
114  %0 = inttoptr i64 %or to ptr
115  %1 = load atomic i8, ptr %0 monotonic, align 1
116  %conv1 = zext i8 %1 to i64
117  ret i64 %conv1
118}
119
120; Function Attrs: nofree norecurse nounwind uwtable willreturn
121define dso_local i64 @ld_not_disjoint16_int64_t_uint8_t(i64 %ptr) {
122; CHECK-LABEL: ld_not_disjoint16_int64_t_uint8_t:
123; CHECK:       # %bb.0: # %entry
124; CHECK-NEXT:    ori r3, r3, 6
125; CHECK-NEXT:    lbz r3, 0(r3)
126; CHECK-NEXT:    blr
127entry:
128  %or = or i64 %ptr, 6
129  %0 = inttoptr i64 %or to ptr
130  %1 = load atomic i8, ptr %0 monotonic, align 1
131  %conv = zext i8 %1 to i64
132  ret i64 %conv
133}
134
135; Function Attrs: nofree norecurse nounwind uwtable willreturn
136define dso_local i64 @ld_disjoint_align16_int64_t_uint8_t(i64 %ptr) {
137; CHECK-LABEL: ld_disjoint_align16_int64_t_uint8_t:
138; CHECK:       # %bb.0: # %entry
139; CHECK-NEXT:    rldicr r3, r3, 0, 51
140; CHECK-NEXT:    lbz r3, 24(r3)
141; CHECK-NEXT:    blr
142entry:
143  %and = and i64 %ptr, -4096
144  %or = or i64 %and, 24
145  %0 = inttoptr i64 %or to ptr
146  %1 = load atomic i8, ptr %0 monotonic, align 8
147  %conv = zext i8 %1 to i64
148  ret i64 %conv
149}
150
151; Function Attrs: nofree norecurse nounwind uwtable willreturn
152define dso_local i64 @ld_not_disjoint32_int64_t_uint8_t(i64 %ptr) {
153; CHECK-LABEL: ld_not_disjoint32_int64_t_uint8_t:
154; CHECK:       # %bb.0: # %entry
155; CHECK-NEXT:    ori r3, r3, 34463
156; CHECK-NEXT:    oris r3, r3, 1
157; CHECK-NEXT:    lbz r3, 0(r3)
158; CHECK-NEXT:    blr
159entry:
160  %or = or i64 %ptr, 99999
161  %0 = inttoptr i64 %or to ptr
162  %1 = load atomic i8, ptr %0 monotonic, align 1
163  %conv = zext i8 %1 to i64
164  ret i64 %conv
165}
166
167; Function Attrs: nofree norecurse nounwind uwtable willreturn
168define dso_local i64 @ld_disjoint_align32_int64_t_uint8_t(i64 %ptr) {
169; CHECK-P10-LABEL: ld_disjoint_align32_int64_t_uint8_t:
170; CHECK-P10:       # %bb.0: # %entry
171; CHECK-P10-NEXT:    lis r4, -15264
172; CHECK-P10-NEXT:    and r3, r3, r4
173; CHECK-P10-NEXT:    plbz r3, 999990000(r3), 0
174; CHECK-P10-NEXT:    clrldi r3, r3, 32
175; CHECK-P10-NEXT:    blr
176;
177; CHECK-PREP10-LABEL: ld_disjoint_align32_int64_t_uint8_t:
178; CHECK-PREP10:       # %bb.0: # %entry
179; CHECK-PREP10-NEXT:    lis r4, -15264
180; CHECK-PREP10-NEXT:    and r3, r3, r4
181; CHECK-PREP10-NEXT:    lis r4, 15258
182; CHECK-PREP10-NEXT:    ori r4, r4, 41712
183; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
184; CHECK-PREP10-NEXT:    blr
185entry:
186  %and = and i64 %ptr, -1000341504
187  %or = or i64 %and, 999990000
188  %0 = inttoptr i64 %or to ptr
189  %1 = load atomic i8, ptr %0 monotonic, align 16
190  %conv = zext i8 %1 to i64
191  ret i64 %conv
192}
193
194; Function Attrs: nofree norecurse nounwind uwtable willreturn
195define dso_local i64 @ld_not_disjoint64_int64_t_uint8_t(i64 %ptr) {
196; CHECK-P10-LABEL: ld_not_disjoint64_int64_t_uint8_t:
197; CHECK-P10:       # %bb.0: # %entry
198; CHECK-P10-NEXT:    pli r4, 232
199; CHECK-P10-NEXT:    pli r5, 3567587329
200; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
201; CHECK-P10-NEXT:    or r3, r3, r5
202; CHECK-P10-NEXT:    lbz r3, 0(r3)
203; CHECK-P10-NEXT:    blr
204;
205; CHECK-PREP10-LABEL: ld_not_disjoint64_int64_t_uint8_t:
206; CHECK-PREP10:       # %bb.0: # %entry
207; CHECK-PREP10-NEXT:    li r4, 29
208; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
209; CHECK-PREP10-NEXT:    oris r4, r4, 54437
210; CHECK-PREP10-NEXT:    ori r4, r4, 4097
211; CHECK-PREP10-NEXT:    or r3, r3, r4
212; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
213; CHECK-PREP10-NEXT:    blr
214entry:
215  %or = or i64 %ptr, 1000000000001
216  %0 = inttoptr i64 %or to ptr
217  %1 = load atomic i8, ptr %0 monotonic, align 1
218  %conv = zext i8 %1 to i64
219  ret i64 %conv
220}
221
222; Function Attrs: nofree norecurse nounwind uwtable willreturn
223define dso_local i64 @ld_disjoint_align64_int64_t_uint8_t(i64 %ptr) {
224; CHECK-P10-LABEL: ld_disjoint_align64_int64_t_uint8_t:
225; CHECK-P10:       # %bb.0: # %entry
226; CHECK-P10-NEXT:    pli r4, 244140625
227; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
228; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
229; CHECK-P10-NEXT:    lbzx r3, r3, r4
230; CHECK-P10-NEXT:    blr
231;
232; CHECK-PREP10-LABEL: ld_disjoint_align64_int64_t_uint8_t:
233; CHECK-PREP10:       # %bb.0: # %entry
234; CHECK-PREP10-NEXT:    lis r4, 3725
235; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
236; CHECK-PREP10-NEXT:    ori r4, r4, 19025
237; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
238; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
239; CHECK-PREP10-NEXT:    blr
240entry:
241  %and = and i64 %ptr, -1099511627776
242  %or = or i64 %and, 1000000000000
243  %0 = inttoptr i64 %or to ptr
244  %1 = load atomic i8, ptr %0 monotonic, align 4096
245  %conv = zext i8 %1 to i64
246  ret i64 %conv
247}
248
249; Function Attrs: nofree norecurse nounwind uwtable willreturn
250define dso_local i64 @ld_cst_align16_int64_t_uint8_t() {
251; CHECK-LABEL: ld_cst_align16_int64_t_uint8_t:
252; CHECK:       # %bb.0: # %entry
253; CHECK-NEXT:    lbz r3, 4080(0)
254; CHECK-NEXT:    blr
255entry:
256  %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
257  %conv = zext i8 %0 to i64
258  ret i64 %conv
259}
260
261; Function Attrs: nofree norecurse nounwind uwtable willreturn
262define dso_local i64 @ld_cst_align32_int64_t_uint8_t() {
263; CHECK-LABEL: ld_cst_align32_int64_t_uint8_t:
264; CHECK:       # %bb.0: # %entry
265; CHECK-NEXT:    lis r3, 153
266; CHECK-NEXT:    lbz r3, -27108(r3)
267; CHECK-NEXT:    blr
268entry:
269  %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
270  %conv = zext i8 %0 to i64
271  ret i64 %conv
272}
273
274; Function Attrs: nofree norecurse nounwind uwtable willreturn
275define dso_local i64 @ld_cst_align64_int64_t_uint8_t() {
276; CHECK-P10-LABEL: ld_cst_align64_int64_t_uint8_t:
277; CHECK-P10:       # %bb.0: # %entry
278; CHECK-P10-NEXT:    pli r3, 244140625
279; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
280; CHECK-P10-NEXT:    lbz r3, 0(r3)
281; CHECK-P10-NEXT:    blr
282;
283; CHECK-PREP10-LABEL: ld_cst_align64_int64_t_uint8_t:
284; CHECK-PREP10:       # %bb.0: # %entry
285; CHECK-PREP10-NEXT:    lis r3, 3725
286; CHECK-PREP10-NEXT:    ori r3, r3, 19025
287; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
288; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
289; CHECK-PREP10-NEXT:    blr
290entry:
291  %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
292  %conv = zext i8 %0 to i64
293  ret i64 %conv
294}
295
296; Function Attrs: nofree norecurse nounwind uwtable willreturn
297define dso_local i64 @ld_0_int64_t_int8_t(i64 %ptr) {
298; CHECK-LABEL: ld_0_int64_t_int8_t:
299; CHECK:       # %bb.0: # %entry
300; CHECK-NEXT:    lbz r3, 0(r3)
301; CHECK-NEXT:    extsb r3, r3
302; CHECK-NEXT:    blr
303entry:
304  %0 = inttoptr i64 %ptr to ptr
305  %1 = load atomic i8, ptr %0 monotonic, align 1
306  %conv = sext i8 %1 to i64
307  ret i64 %conv
308}
309
310; Function Attrs: nofree norecurse nounwind uwtable willreturn
311define dso_local i64 @ld_align16_int64_t_int8_t(ptr nocapture readonly %ptr) {
312; CHECK-LABEL: ld_align16_int64_t_int8_t:
313; CHECK:       # %bb.0: # %entry
314; CHECK-NEXT:    lbz r3, 8(r3)
315; CHECK-NEXT:    extsb r3, r3
316; CHECK-NEXT:    blr
317entry:
318  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
319  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
320  %conv = sext i8 %0 to i64
321  ret i64 %conv
322}
323
324; Function Attrs: nofree norecurse nounwind uwtable willreturn
325define dso_local i64 @ld_align32_int64_t_int8_t(ptr nocapture readonly %ptr) {
326; CHECK-P10-LABEL: ld_align32_int64_t_int8_t:
327; CHECK-P10:       # %bb.0: # %entry
328; CHECK-P10-NEXT:    plbz r3, 99999000(r3), 0
329; CHECK-P10-NEXT:    extsb r3, r3
330; CHECK-P10-NEXT:    blr
331;
332; CHECK-PREP10-LABEL: ld_align32_int64_t_int8_t:
333; CHECK-PREP10:       # %bb.0: # %entry
334; CHECK-PREP10-NEXT:    lis r4, 1525
335; CHECK-PREP10-NEXT:    ori r4, r4, 56600
336; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
337; CHECK-PREP10-NEXT:    extsb r3, r3
338; CHECK-PREP10-NEXT:    blr
339entry:
340  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
341  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
342  %conv = sext i8 %0 to i64
343  ret i64 %conv
344}
345
346; Function Attrs: nofree norecurse nounwind uwtable willreturn
347define dso_local i64 @ld_align64_int64_t_int8_t(ptr nocapture readonly %ptr) {
348; CHECK-P10-LABEL: ld_align64_int64_t_int8_t:
349; CHECK-P10:       # %bb.0: # %entry
350; CHECK-P10-NEXT:    pli r4, 244140625
351; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
352; CHECK-P10-NEXT:    lbzx r3, r3, r4
353; CHECK-P10-NEXT:    extsb r3, r3
354; CHECK-P10-NEXT:    blr
355;
356; CHECK-PREP10-LABEL: ld_align64_int64_t_int8_t:
357; CHECK-PREP10:       # %bb.0: # %entry
358; CHECK-PREP10-NEXT:    lis r4, 3725
359; CHECK-PREP10-NEXT:    ori r4, r4, 19025
360; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
361; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
362; CHECK-PREP10-NEXT:    extsb r3, r3
363; CHECK-PREP10-NEXT:    blr
364entry:
365  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
366  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
367  %conv = sext i8 %0 to i64
368  ret i64 %conv
369}
370
371; Function Attrs: nofree norecurse nounwind uwtable willreturn
372define dso_local i64 @ld_reg_int64_t_int8_t(ptr nocapture readonly %ptr, i64 %off) {
373; CHECK-LABEL: ld_reg_int64_t_int8_t:
374; CHECK:       # %bb.0: # %entry
375; CHECK-NEXT:    lbzx r3, r3, r4
376; CHECK-NEXT:    extsb r3, r3
377; CHECK-NEXT:    blr
378entry:
379  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
380  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
381  %conv = sext i8 %0 to i64
382  ret i64 %conv
383}
384
385; Function Attrs: nofree norecurse nounwind uwtable willreturn
386define dso_local i64 @ld_or_int64_t_int8_t(i64 %ptr, i8 zeroext %off) {
387; CHECK-LABEL: ld_or_int64_t_int8_t:
388; CHECK:       # %bb.0: # %entry
389; CHECK-NEXT:    or r3, r4, r3
390; CHECK-NEXT:    lbz r3, 0(r3)
391; CHECK-NEXT:    extsb r3, r3
392; CHECK-NEXT:    blr
393entry:
394  %conv = zext i8 %off to i64
395  %or = or i64 %conv, %ptr
396  %0 = inttoptr i64 %or to ptr
397  %1 = load atomic i8, ptr %0 monotonic, align 1
398  %conv1 = sext i8 %1 to i64
399  ret i64 %conv1
400}
401
402; Function Attrs: nofree norecurse nounwind uwtable willreturn
403define dso_local i64 @ld_not_disjoint16_int64_t_int8_t(i64 %ptr) {
404; CHECK-LABEL: ld_not_disjoint16_int64_t_int8_t:
405; CHECK:       # %bb.0: # %entry
406; CHECK-NEXT:    ori r3, r3, 6
407; CHECK-NEXT:    lbz r3, 0(r3)
408; CHECK-NEXT:    extsb r3, r3
409; CHECK-NEXT:    blr
410entry:
411  %or = or i64 %ptr, 6
412  %0 = inttoptr i64 %or to ptr
413  %1 = load atomic i8, ptr %0 monotonic, align 1
414  %conv = sext i8 %1 to i64
415  ret i64 %conv
416}
417
418; Function Attrs: nofree norecurse nounwind uwtable willreturn
419define dso_local i64 @ld_disjoint_align16_int64_t_int8_t(i64 %ptr) {
420; CHECK-LABEL: ld_disjoint_align16_int64_t_int8_t:
421; CHECK:       # %bb.0: # %entry
422; CHECK-NEXT:    rldicr r3, r3, 0, 51
423; CHECK-NEXT:    lbz r3, 24(r3)
424; CHECK-NEXT:    extsb r3, r3
425; CHECK-NEXT:    blr
426entry:
427  %and = and i64 %ptr, -4096
428  %or = or i64 %and, 24
429  %0 = inttoptr i64 %or to ptr
430  %1 = load atomic i8, ptr %0 monotonic, align 8
431  %conv = sext i8 %1 to i64
432  ret i64 %conv
433}
434
435; Function Attrs: nofree norecurse nounwind uwtable willreturn
436define dso_local i64 @ld_not_disjoint32_int64_t_int8_t(i64 %ptr) {
437; CHECK-LABEL: ld_not_disjoint32_int64_t_int8_t:
438; CHECK:       # %bb.0: # %entry
439; CHECK-NEXT:    ori r3, r3, 34463
440; CHECK-NEXT:    oris r3, r3, 1
441; CHECK-NEXT:    lbz r3, 0(r3)
442; CHECK-NEXT:    extsb r3, r3
443; CHECK-NEXT:    blr
444entry:
445  %or = or i64 %ptr, 99999
446  %0 = inttoptr i64 %or to ptr
447  %1 = load atomic i8, ptr %0 monotonic, align 1
448  %conv = sext i8 %1 to i64
449  ret i64 %conv
450}
451
452; Function Attrs: nofree norecurse nounwind uwtable willreturn
453define dso_local i64 @ld_disjoint_align32_int64_t_int8_t(i64 %ptr) {
454; CHECK-P10-LABEL: ld_disjoint_align32_int64_t_int8_t:
455; CHECK-P10:       # %bb.0: # %entry
456; CHECK-P10-NEXT:    lis r4, -15264
457; CHECK-P10-NEXT:    and r3, r3, r4
458; CHECK-P10-NEXT:    plbz r3, 999990000(r3), 0
459; CHECK-P10-NEXT:    extsb r3, r3
460; CHECK-P10-NEXT:    blr
461;
462; CHECK-PREP10-LABEL: ld_disjoint_align32_int64_t_int8_t:
463; CHECK-PREP10:       # %bb.0: # %entry
464; CHECK-PREP10-NEXT:    lis r4, -15264
465; CHECK-PREP10-NEXT:    and r3, r3, r4
466; CHECK-PREP10-NEXT:    lis r4, 15258
467; CHECK-PREP10-NEXT:    ori r4, r4, 41712
468; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
469; CHECK-PREP10-NEXT:    extsb r3, r3
470; CHECK-PREP10-NEXT:    blr
471entry:
472  %and = and i64 %ptr, -1000341504
473  %or = or i64 %and, 999990000
474  %0 = inttoptr i64 %or to ptr
475  %1 = load atomic i8, ptr %0 monotonic, align 16
476  %conv = sext i8 %1 to i64
477  ret i64 %conv
478}
479
480; Function Attrs: nofree norecurse nounwind uwtable willreturn
481define dso_local i64 @ld_not_disjoint64_int64_t_int8_t(i64 %ptr) {
482; CHECK-P10-LABEL: ld_not_disjoint64_int64_t_int8_t:
483; CHECK-P10:       # %bb.0: # %entry
484; CHECK-P10-NEXT:    pli r4, 232
485; CHECK-P10-NEXT:    pli r5, 3567587329
486; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
487; CHECK-P10-NEXT:    or r3, r3, r5
488; CHECK-P10-NEXT:    lbz r3, 0(r3)
489; CHECK-P10-NEXT:    extsb r3, r3
490; CHECK-P10-NEXT:    blr
491;
492; CHECK-PREP10-LABEL: ld_not_disjoint64_int64_t_int8_t:
493; CHECK-PREP10:       # %bb.0: # %entry
494; CHECK-PREP10-NEXT:    li r4, 29
495; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
496; CHECK-PREP10-NEXT:    oris r4, r4, 54437
497; CHECK-PREP10-NEXT:    ori r4, r4, 4097
498; CHECK-PREP10-NEXT:    or r3, r3, r4
499; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
500; CHECK-PREP10-NEXT:    extsb r3, r3
501; CHECK-PREP10-NEXT:    blr
502entry:
503  %or = or i64 %ptr, 1000000000001
504  %0 = inttoptr i64 %or to ptr
505  %1 = load atomic i8, ptr %0 monotonic, align 1
506  %conv = sext i8 %1 to i64
507  ret i64 %conv
508}
509
510; Function Attrs: nofree norecurse nounwind uwtable willreturn
511define dso_local i64 @ld_disjoint_align64_int64_t_int8_t(i64 %ptr) {
512; CHECK-P10-LABEL: ld_disjoint_align64_int64_t_int8_t:
513; CHECK-P10:       # %bb.0: # %entry
514; CHECK-P10-NEXT:    pli r4, 244140625
515; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
516; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
517; CHECK-P10-NEXT:    lbzx r3, r3, r4
518; CHECK-P10-NEXT:    extsb r3, r3
519; CHECK-P10-NEXT:    blr
520;
521; CHECK-PREP10-LABEL: ld_disjoint_align64_int64_t_int8_t:
522; CHECK-PREP10:       # %bb.0: # %entry
523; CHECK-PREP10-NEXT:    lis r4, 3725
524; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
525; CHECK-PREP10-NEXT:    ori r4, r4, 19025
526; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
527; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
528; CHECK-PREP10-NEXT:    extsb r3, r3
529; CHECK-PREP10-NEXT:    blr
530entry:
531  %and = and i64 %ptr, -1099511627776
532  %or = or i64 %and, 1000000000000
533  %0 = inttoptr i64 %or to ptr
534  %1 = load atomic i8, ptr %0 monotonic, align 4096
535  %conv = sext i8 %1 to i64
536  ret i64 %conv
537}
538
539; Function Attrs: nofree norecurse nounwind uwtable willreturn
540define dso_local i64 @ld_cst_align16_int64_t_int8_t() {
541; CHECK-LABEL: ld_cst_align16_int64_t_int8_t:
542; CHECK:       # %bb.0: # %entry
543; CHECK-NEXT:    lbz r3, 4080(0)
544; CHECK-NEXT:    extsb r3, r3
545; CHECK-NEXT:    blr
546entry:
547  %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
548  %conv = sext i8 %0 to i64
549  ret i64 %conv
550}
551
552; Function Attrs: nofree norecurse nounwind uwtable willreturn
553define dso_local i64 @ld_cst_align32_int64_t_int8_t() {
554; CHECK-LABEL: ld_cst_align32_int64_t_int8_t:
555; CHECK:       # %bb.0: # %entry
556; CHECK-NEXT:    lis r3, 153
557; CHECK-NEXT:    lbz r3, -27108(r3)
558; CHECK-NEXT:    extsb r3, r3
559; CHECK-NEXT:    blr
560entry:
561  %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
562  %conv = sext i8 %0 to i64
563  ret i64 %conv
564}
565
566; Function Attrs: nofree norecurse nounwind uwtable willreturn
567define dso_local i64 @ld_cst_align64_int64_t_int8_t() {
568; CHECK-P10-LABEL: ld_cst_align64_int64_t_int8_t:
569; CHECK-P10:       # %bb.0: # %entry
570; CHECK-P10-NEXT:    pli r3, 244140625
571; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
572; CHECK-P10-NEXT:    lbz r3, 0(r3)
573; CHECK-P10-NEXT:    extsb r3, r3
574; CHECK-P10-NEXT:    blr
575;
576; CHECK-PREP10-LABEL: ld_cst_align64_int64_t_int8_t:
577; CHECK-PREP10:       # %bb.0: # %entry
578; CHECK-PREP10-NEXT:    lis r3, 3725
579; CHECK-PREP10-NEXT:    ori r3, r3, 19025
580; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
581; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
582; CHECK-PREP10-NEXT:    extsb r3, r3
583; CHECK-PREP10-NEXT:    blr
584entry:
585  %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
586  %conv = sext i8 %0 to i64
587  ret i64 %conv
588}
589
590; Function Attrs: nofree norecurse nounwind uwtable willreturn
591define dso_local i64 @ld_0_int64_t_uint16_t(i64 %ptr) {
592; CHECK-LABEL: ld_0_int64_t_uint16_t:
593; CHECK:       # %bb.0: # %entry
594; CHECK-NEXT:    lhz r3, 0(r3)
595; CHECK-NEXT:    blr
596entry:
597  %0 = inttoptr i64 %ptr to ptr
598  %1 = load atomic i16, ptr %0 monotonic, align 2
599  %conv = zext i16 %1 to i64
600  ret i64 %conv
601}
602
603; Function Attrs: nofree norecurse nounwind uwtable willreturn
604define dso_local i64 @ld_align16_int64_t_uint16_t(ptr nocapture readonly %ptr) {
605; CHECK-LABEL: ld_align16_int64_t_uint16_t:
606; CHECK:       # %bb.0: # %entry
607; CHECK-NEXT:    lhz r3, 8(r3)
608; CHECK-NEXT:    blr
609entry:
610  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
611  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
612  %conv = zext i16 %0 to i64
613  ret i64 %conv
614}
615
616; Function Attrs: nofree norecurse nounwind uwtable willreturn
617define dso_local i64 @ld_align32_int64_t_uint16_t(ptr nocapture readonly %ptr) {
618; CHECK-P10-LABEL: ld_align32_int64_t_uint16_t:
619; CHECK-P10:       # %bb.0: # %entry
620; CHECK-P10-NEXT:    plhz r3, 99999000(r3), 0
621; CHECK-P10-NEXT:    clrldi r3, r3, 32
622; CHECK-P10-NEXT:    blr
623;
624; CHECK-PREP10-LABEL: ld_align32_int64_t_uint16_t:
625; CHECK-PREP10:       # %bb.0: # %entry
626; CHECK-PREP10-NEXT:    lis r4, 1525
627; CHECK-PREP10-NEXT:    ori r4, r4, 56600
628; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
629; CHECK-PREP10-NEXT:    blr
630entry:
631  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
632  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
633  %conv = zext i16 %0 to i64
634  ret i64 %conv
635}
636
637; Function Attrs: nofree norecurse nounwind uwtable willreturn
638define dso_local i64 @ld_align64_int64_t_uint16_t(ptr nocapture readonly %ptr) {
639; CHECK-P10-LABEL: ld_align64_int64_t_uint16_t:
640; CHECK-P10:       # %bb.0: # %entry
641; CHECK-P10-NEXT:    pli r4, 244140625
642; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
643; CHECK-P10-NEXT:    lhzx r3, r3, r4
644; CHECK-P10-NEXT:    blr
645;
646; CHECK-PREP10-LABEL: ld_align64_int64_t_uint16_t:
647; CHECK-PREP10:       # %bb.0: # %entry
648; CHECK-PREP10-NEXT:    lis r4, 3725
649; CHECK-PREP10-NEXT:    ori r4, r4, 19025
650; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
651; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
652; CHECK-PREP10-NEXT:    blr
653entry:
654  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
655  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
656  %conv = zext i16 %0 to i64
657  ret i64 %conv
658}
659
660; Function Attrs: nofree norecurse nounwind uwtable willreturn
661define dso_local i64 @ld_reg_int64_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) {
662; CHECK-LABEL: ld_reg_int64_t_uint16_t:
663; CHECK:       # %bb.0: # %entry
664; CHECK-NEXT:    lhzx r3, r3, r4
665; CHECK-NEXT:    blr
666entry:
667  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
668  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
669  %conv = zext i16 %0 to i64
670  ret i64 %conv
671}
672
673; Function Attrs: nofree norecurse nounwind uwtable willreturn
674define dso_local i64 @ld_or_int64_t_uint16_t(i64 %ptr, i8 zeroext %off) {
675; CHECK-LABEL: ld_or_int64_t_uint16_t:
676; CHECK:       # %bb.0: # %entry
677; CHECK-NEXT:    or r3, r4, r3
678; CHECK-NEXT:    lhz r3, 0(r3)
679; CHECK-NEXT:    blr
680entry:
681  %conv = zext i8 %off to i64
682  %or = or i64 %conv, %ptr
683  %0 = inttoptr i64 %or to ptr
684  %1 = load atomic i16, ptr %0 monotonic, align 2
685  %conv1 = zext i16 %1 to i64
686  ret i64 %conv1
687}
688
689; Function Attrs: nofree norecurse nounwind uwtable willreturn
690define dso_local i64 @ld_not_disjoint16_int64_t_uint16_t(i64 %ptr) {
691; CHECK-LABEL: ld_not_disjoint16_int64_t_uint16_t:
692; CHECK:       # %bb.0: # %entry
693; CHECK-NEXT:    ori r3, r3, 6
694; CHECK-NEXT:    lhz r3, 0(r3)
695; CHECK-NEXT:    blr
696entry:
697  %or = or i64 %ptr, 6
698  %0 = inttoptr i64 %or to ptr
699  %1 = load atomic i16, ptr %0 monotonic, align 2
700  %conv = zext i16 %1 to i64
701  ret i64 %conv
702}
703
704; Function Attrs: nofree norecurse nounwind uwtable willreturn
705define dso_local i64 @ld_disjoint_align16_int64_t_uint16_t(i64 %ptr) {
706; CHECK-LABEL: ld_disjoint_align16_int64_t_uint16_t:
707; CHECK:       # %bb.0: # %entry
708; CHECK-NEXT:    rldicr r3, r3, 0, 51
709; CHECK-NEXT:    lhz r3, 24(r3)
710; CHECK-NEXT:    blr
711entry:
712  %and = and i64 %ptr, -4096
713  %or = or i64 %and, 24
714  %0 = inttoptr i64 %or to ptr
715  %1 = load atomic i16, ptr %0 monotonic, align 8
716  %conv = zext i16 %1 to i64
717  ret i64 %conv
718}
719
720; Function Attrs: nofree norecurse nounwind uwtable willreturn
721define dso_local i64 @ld_not_disjoint32_int64_t_uint16_t(i64 %ptr) {
722; CHECK-LABEL: ld_not_disjoint32_int64_t_uint16_t:
723; CHECK:       # %bb.0: # %entry
724; CHECK-NEXT:    ori r3, r3, 34463
725; CHECK-NEXT:    oris r3, r3, 1
726; CHECK-NEXT:    lhz r3, 0(r3)
727; CHECK-NEXT:    blr
728entry:
729  %or = or i64 %ptr, 99999
730  %0 = inttoptr i64 %or to ptr
731  %1 = load atomic i16, ptr %0 monotonic, align 2
732  %conv = zext i16 %1 to i64
733  ret i64 %conv
734}
735
736; Function Attrs: nofree norecurse nounwind uwtable willreturn
737define dso_local i64 @ld_disjoint_align32_int64_t_uint16_t(i64 %ptr) {
738; CHECK-P10-LABEL: ld_disjoint_align32_int64_t_uint16_t:
739; CHECK-P10:       # %bb.0: # %entry
740; CHECK-P10-NEXT:    lis r4, -15264
741; CHECK-P10-NEXT:    and r3, r3, r4
742; CHECK-P10-NEXT:    plhz r3, 999990000(r3), 0
743; CHECK-P10-NEXT:    clrldi r3, r3, 32
744; CHECK-P10-NEXT:    blr
745;
746; CHECK-PREP10-LABEL: ld_disjoint_align32_int64_t_uint16_t:
747; CHECK-PREP10:       # %bb.0: # %entry
748; CHECK-PREP10-NEXT:    lis r4, -15264
749; CHECK-PREP10-NEXT:    and r3, r3, r4
750; CHECK-PREP10-NEXT:    lis r4, 15258
751; CHECK-PREP10-NEXT:    ori r4, r4, 41712
752; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
753; CHECK-PREP10-NEXT:    blr
754entry:
755  %and = and i64 %ptr, -1000341504
756  %or = or i64 %and, 999990000
757  %0 = inttoptr i64 %or to ptr
758  %1 = load atomic i16, ptr %0 monotonic, align 16
759  %conv = zext i16 %1 to i64
760  ret i64 %conv
761}
762
763; Function Attrs: nofree norecurse nounwind uwtable willreturn
764define dso_local i64 @ld_not_disjoint64_int64_t_uint16_t(i64 %ptr) {
765; CHECK-P10-LABEL: ld_not_disjoint64_int64_t_uint16_t:
766; CHECK-P10:       # %bb.0: # %entry
767; CHECK-P10-NEXT:    pli r4, 232
768; CHECK-P10-NEXT:    pli r5, 3567587329
769; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
770; CHECK-P10-NEXT:    or r3, r3, r5
771; CHECK-P10-NEXT:    lhz r3, 0(r3)
772; CHECK-P10-NEXT:    blr
773;
774; CHECK-PREP10-LABEL: ld_not_disjoint64_int64_t_uint16_t:
775; CHECK-PREP10:       # %bb.0: # %entry
776; CHECK-PREP10-NEXT:    li r4, 29
777; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
778; CHECK-PREP10-NEXT:    oris r4, r4, 54437
779; CHECK-PREP10-NEXT:    ori r4, r4, 4097
780; CHECK-PREP10-NEXT:    or r3, r3, r4
781; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
782; CHECK-PREP10-NEXT:    blr
783entry:
784  %or = or i64 %ptr, 1000000000001
785  %0 = inttoptr i64 %or to ptr
786  %1 = load atomic i16, ptr %0 monotonic, align 2
787  %conv = zext i16 %1 to i64
788  ret i64 %conv
789}
790
791; Function Attrs: nofree norecurse nounwind uwtable willreturn
792define dso_local i64 @ld_disjoint_align64_int64_t_uint16_t(i64 %ptr) {
793; CHECK-P10-LABEL: ld_disjoint_align64_int64_t_uint16_t:
794; CHECK-P10:       # %bb.0: # %entry
795; CHECK-P10-NEXT:    pli r4, 244140625
796; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
797; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
798; CHECK-P10-NEXT:    lhzx r3, r3, r4
799; CHECK-P10-NEXT:    blr
800;
801; CHECK-PREP10-LABEL: ld_disjoint_align64_int64_t_uint16_t:
802; CHECK-PREP10:       # %bb.0: # %entry
803; CHECK-PREP10-NEXT:    lis r4, 3725
804; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
805; CHECK-PREP10-NEXT:    ori r4, r4, 19025
806; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
807; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
808; CHECK-PREP10-NEXT:    blr
809entry:
810  %and = and i64 %ptr, -1099511627776
811  %or = or i64 %and, 1000000000000
812  %0 = inttoptr i64 %or to ptr
813  %1 = load atomic i16, ptr %0 monotonic, align 4096
814  %conv = zext i16 %1 to i64
815  ret i64 %conv
816}
817
818; Function Attrs: nofree norecurse nounwind uwtable willreturn
819define dso_local i64 @ld_cst_align16_int64_t_uint16_t() {
820; CHECK-LABEL: ld_cst_align16_int64_t_uint16_t:
821; CHECK:       # %bb.0: # %entry
822; CHECK-NEXT:    lhz r3, 4080(0)
823; CHECK-NEXT:    blr
824entry:
825  %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
826  %conv = zext i16 %0 to i64
827  ret i64 %conv
828}
829
830; Function Attrs: nofree norecurse nounwind uwtable willreturn
831define dso_local i64 @ld_cst_align32_int64_t_uint16_t() {
832; CHECK-LABEL: ld_cst_align32_int64_t_uint16_t:
833; CHECK:       # %bb.0: # %entry
834; CHECK-NEXT:    lis r3, 153
835; CHECK-NEXT:    lhz r3, -27108(r3)
836; CHECK-NEXT:    blr
837entry:
838  %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
839  %conv = zext i16 %0 to i64
840  ret i64 %conv
841}
842
843; Function Attrs: nofree norecurse nounwind uwtable willreturn
844define dso_local i64 @ld_cst_align64_int64_t_uint16_t() {
845; CHECK-P10-LABEL: ld_cst_align64_int64_t_uint16_t:
846; CHECK-P10:       # %bb.0: # %entry
847; CHECK-P10-NEXT:    pli r3, 244140625
848; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
849; CHECK-P10-NEXT:    lhz r3, 0(r3)
850; CHECK-P10-NEXT:    blr
851;
852; CHECK-PREP10-LABEL: ld_cst_align64_int64_t_uint16_t:
853; CHECK-PREP10:       # %bb.0: # %entry
854; CHECK-PREP10-NEXT:    lis r3, 3725
855; CHECK-PREP10-NEXT:    ori r3, r3, 19025
856; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
857; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
858; CHECK-PREP10-NEXT:    blr
859entry:
860  %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
861  %conv = zext i16 %0 to i64
862  ret i64 %conv
863}
864
865; Function Attrs: nofree norecurse nounwind uwtable willreturn
866define dso_local i64 @ld_0_int64_t_int16_t(i64 %ptr) {
867; CHECK-LABEL: ld_0_int64_t_int16_t:
868; CHECK:       # %bb.0: # %entry
869; CHECK-NEXT:    lhz r3, 0(r3)
870; CHECK-NEXT:    extsh r3, r3
871; CHECK-NEXT:    blr
872entry:
873  %0 = inttoptr i64 %ptr to ptr
874  %1 = load atomic i16, ptr %0 monotonic, align 2
875  %conv = sext i16 %1 to i64
876  ret i64 %conv
877}
878
879; Function Attrs: nofree norecurse nounwind uwtable willreturn
880define dso_local i64 @ld_align16_int64_t_int16_t(ptr nocapture readonly %ptr) {
881; CHECK-LABEL: ld_align16_int64_t_int16_t:
882; CHECK:       # %bb.0: # %entry
883; CHECK-NEXT:    lhz r3, 8(r3)
884; CHECK-NEXT:    extsh r3, r3
885; CHECK-NEXT:    blr
886entry:
887  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
888  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
889  %conv = sext i16 %0 to i64
890  ret i64 %conv
891}
892
893; Function Attrs: nofree norecurse nounwind uwtable willreturn
894define dso_local i64 @ld_align32_int64_t_int16_t(ptr nocapture readonly %ptr) {
895; CHECK-P10-LABEL: ld_align32_int64_t_int16_t:
896; CHECK-P10:       # %bb.0: # %entry
897; CHECK-P10-NEXT:    plhz r3, 99999000(r3), 0
898; CHECK-P10-NEXT:    extsh r3, r3
899; CHECK-P10-NEXT:    blr
900;
901; CHECK-PREP10-LABEL: ld_align32_int64_t_int16_t:
902; CHECK-PREP10:       # %bb.0: # %entry
903; CHECK-PREP10-NEXT:    lis r4, 1525
904; CHECK-PREP10-NEXT:    ori r4, r4, 56600
905; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
906; CHECK-PREP10-NEXT:    extsh r3, r3
907; CHECK-PREP10-NEXT:    blr
908entry:
909  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
910  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
911  %conv = sext i16 %0 to i64
912  ret i64 %conv
913}
914
915; Function Attrs: nofree norecurse nounwind uwtable willreturn
916define dso_local i64 @ld_align64_int64_t_int16_t(ptr nocapture readonly %ptr) {
917; CHECK-P10-LABEL: ld_align64_int64_t_int16_t:
918; CHECK-P10:       # %bb.0: # %entry
919; CHECK-P10-NEXT:    pli r4, 244140625
920; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
921; CHECK-P10-NEXT:    lhzx r3, r3, r4
922; CHECK-P10-NEXT:    extsh r3, r3
923; CHECK-P10-NEXT:    blr
924;
925; CHECK-PREP10-LABEL: ld_align64_int64_t_int16_t:
926; CHECK-PREP10:       # %bb.0: # %entry
927; CHECK-PREP10-NEXT:    lis r4, 3725
928; CHECK-PREP10-NEXT:    ori r4, r4, 19025
929; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
930; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
931; CHECK-PREP10-NEXT:    extsh r3, r3
932; CHECK-PREP10-NEXT:    blr
933entry:
934  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
935  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
936  %conv = sext i16 %0 to i64
937  ret i64 %conv
938}
939
940; Function Attrs: nofree norecurse nounwind uwtable willreturn
941define dso_local i64 @ld_reg_int64_t_int16_t(ptr nocapture readonly %ptr, i64 %off) {
942; CHECK-LABEL: ld_reg_int64_t_int16_t:
943; CHECK:       # %bb.0: # %entry
944; CHECK-NEXT:    lhzx r3, r3, r4
945; CHECK-NEXT:    extsh r3, r3
946; CHECK-NEXT:    blr
947entry:
948  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
949  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
950  %conv = sext i16 %0 to i64
951  ret i64 %conv
952}
953
954; Function Attrs: nofree norecurse nounwind uwtable willreturn
955define dso_local i64 @ld_or_int64_t_int16_t(i64 %ptr, i8 zeroext %off) {
956; CHECK-LABEL: ld_or_int64_t_int16_t:
957; CHECK:       # %bb.0: # %entry
958; CHECK-NEXT:    or r3, r4, r3
959; CHECK-NEXT:    lhz r3, 0(r3)
960; CHECK-NEXT:    extsh r3, r3
961; CHECK-NEXT:    blr
962entry:
963  %conv = zext i8 %off to i64
964  %or = or i64 %conv, %ptr
965  %0 = inttoptr i64 %or to ptr
966  %1 = load atomic i16, ptr %0 monotonic, align 2
967  %conv1 = sext i16 %1 to i64
968  ret i64 %conv1
969}
970
971; Function Attrs: nofree norecurse nounwind uwtable willreturn
972define dso_local i64 @ld_not_disjoint16_int64_t_int16_t(i64 %ptr) {
973; CHECK-LABEL: ld_not_disjoint16_int64_t_int16_t:
974; CHECK:       # %bb.0: # %entry
975; CHECK-NEXT:    ori r3, r3, 6
976; CHECK-NEXT:    lhz r3, 0(r3)
977; CHECK-NEXT:    extsh r3, r3
978; CHECK-NEXT:    blr
979entry:
980  %or = or i64 %ptr, 6
981  %0 = inttoptr i64 %or to ptr
982  %1 = load atomic i16, ptr %0 monotonic, align 2
983  %conv = sext i16 %1 to i64
984  ret i64 %conv
985}
986
987; Function Attrs: nofree norecurse nounwind uwtable willreturn
988define dso_local i64 @ld_disjoint_align16_int64_t_int16_t(i64 %ptr) {
989; CHECK-LABEL: ld_disjoint_align16_int64_t_int16_t:
990; CHECK:       # %bb.0: # %entry
991; CHECK-NEXT:    rldicr r3, r3, 0, 51
992; CHECK-NEXT:    lhz r3, 24(r3)
993; CHECK-NEXT:    extsh r3, r3
994; CHECK-NEXT:    blr
995entry:
996  %and = and i64 %ptr, -4096
997  %or = or i64 %and, 24
998  %0 = inttoptr i64 %or to ptr
999  %1 = load atomic i16, ptr %0 monotonic, align 8
1000  %conv = sext i16 %1 to i64
1001  ret i64 %conv
1002}
1003
1004; Function Attrs: nofree norecurse nounwind uwtable willreturn
1005define dso_local i64 @ld_not_disjoint32_int64_t_int16_t(i64 %ptr) {
1006; CHECK-LABEL: ld_not_disjoint32_int64_t_int16_t:
1007; CHECK:       # %bb.0: # %entry
1008; CHECK-NEXT:    ori r3, r3, 34463
1009; CHECK-NEXT:    oris r3, r3, 1
1010; CHECK-NEXT:    lhz r3, 0(r3)
1011; CHECK-NEXT:    extsh r3, r3
1012; CHECK-NEXT:    blr
1013entry:
1014  %or = or i64 %ptr, 99999
1015  %0 = inttoptr i64 %or to ptr
1016  %1 = load atomic i16, ptr %0 monotonic, align 2
1017  %conv = sext i16 %1 to i64
1018  ret i64 %conv
1019}
1020
1021; Function Attrs: nofree norecurse nounwind uwtable willreturn
1022define dso_local i64 @ld_disjoint_align32_int64_t_int16_t(i64 %ptr) {
1023; CHECK-P10-LABEL: ld_disjoint_align32_int64_t_int16_t:
1024; CHECK-P10:       # %bb.0: # %entry
1025; CHECK-P10-NEXT:    lis r4, -15264
1026; CHECK-P10-NEXT:    and r3, r3, r4
1027; CHECK-P10-NEXT:    plhz r3, 999990000(r3), 0
1028; CHECK-P10-NEXT:    extsh r3, r3
1029; CHECK-P10-NEXT:    blr
1030;
1031; CHECK-PREP10-LABEL: ld_disjoint_align32_int64_t_int16_t:
1032; CHECK-PREP10:       # %bb.0: # %entry
1033; CHECK-PREP10-NEXT:    lis r4, -15264
1034; CHECK-PREP10-NEXT:    and r3, r3, r4
1035; CHECK-PREP10-NEXT:    lis r4, 15258
1036; CHECK-PREP10-NEXT:    ori r4, r4, 41712
1037; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
1038; CHECK-PREP10-NEXT:    extsh r3, r3
1039; CHECK-PREP10-NEXT:    blr
1040entry:
1041  %and = and i64 %ptr, -1000341504
1042  %or = or i64 %and, 999990000
1043  %0 = inttoptr i64 %or to ptr
1044  %1 = load atomic i16, ptr %0 monotonic, align 16
1045  %conv = sext i16 %1 to i64
1046  ret i64 %conv
1047}
1048
1049; Function Attrs: nofree norecurse nounwind uwtable willreturn
1050define dso_local i64 @ld_not_disjoint64_int64_t_int16_t(i64 %ptr) {
1051; CHECK-P10-LABEL: ld_not_disjoint64_int64_t_int16_t:
1052; CHECK-P10:       # %bb.0: # %entry
1053; CHECK-P10-NEXT:    pli r4, 232
1054; CHECK-P10-NEXT:    pli r5, 3567587329
1055; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1056; CHECK-P10-NEXT:    or r3, r3, r5
1057; CHECK-P10-NEXT:    lhz r3, 0(r3)
1058; CHECK-P10-NEXT:    extsh r3, r3
1059; CHECK-P10-NEXT:    blr
1060;
1061; CHECK-PREP10-LABEL: ld_not_disjoint64_int64_t_int16_t:
1062; CHECK-PREP10:       # %bb.0: # %entry
1063; CHECK-PREP10-NEXT:    li r4, 29
1064; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
1065; CHECK-PREP10-NEXT:    oris r4, r4, 54437
1066; CHECK-PREP10-NEXT:    ori r4, r4, 4097
1067; CHECK-PREP10-NEXT:    or r3, r3, r4
1068; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
1069; CHECK-PREP10-NEXT:    extsh r3, r3
1070; CHECK-PREP10-NEXT:    blr
1071entry:
1072  %or = or i64 %ptr, 1000000000001
1073  %0 = inttoptr i64 %or to ptr
1074  %1 = load atomic i16, ptr %0 monotonic, align 2
1075  %conv = sext i16 %1 to i64
1076  ret i64 %conv
1077}
1078
1079; Function Attrs: nofree norecurse nounwind uwtable willreturn
1080define dso_local i64 @ld_disjoint_align64_int64_t_int16_t(i64 %ptr) {
1081; CHECK-P10-LABEL: ld_disjoint_align64_int64_t_int16_t:
1082; CHECK-P10:       # %bb.0: # %entry
1083; CHECK-P10-NEXT:    pli r4, 244140625
1084; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1085; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1086; CHECK-P10-NEXT:    lhzx r3, r3, r4
1087; CHECK-P10-NEXT:    extsh r3, r3
1088; CHECK-P10-NEXT:    blr
1089;
1090; CHECK-PREP10-LABEL: ld_disjoint_align64_int64_t_int16_t:
1091; CHECK-PREP10:       # %bb.0: # %entry
1092; CHECK-PREP10-NEXT:    lis r4, 3725
1093; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
1094; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1095; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1096; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
1097; CHECK-PREP10-NEXT:    extsh r3, r3
1098; CHECK-PREP10-NEXT:    blr
1099entry:
1100  %and = and i64 %ptr, -1099511627776
1101  %or = or i64 %and, 1000000000000
1102  %0 = inttoptr i64 %or to ptr
1103  %1 = load atomic i16, ptr %0 monotonic, align 4096
1104  %conv = sext i16 %1 to i64
1105  ret i64 %conv
1106}
1107
1108; Function Attrs: nofree norecurse nounwind uwtable willreturn
1109define dso_local i64 @ld_cst_align16_int64_t_int16_t() {
1110; CHECK-LABEL: ld_cst_align16_int64_t_int16_t:
1111; CHECK:       # %bb.0: # %entry
1112; CHECK-NEXT:    lhz r3, 4080(0)
1113; CHECK-NEXT:    extsh r3, r3
1114; CHECK-NEXT:    blr
1115entry:
1116  %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
1117  %conv = sext i16 %0 to i64
1118  ret i64 %conv
1119}
1120
1121; Function Attrs: nofree norecurse nounwind uwtable willreturn
1122define dso_local i64 @ld_cst_align32_int64_t_int16_t() {
1123; CHECK-LABEL: ld_cst_align32_int64_t_int16_t:
1124; CHECK:       # %bb.0: # %entry
1125; CHECK-NEXT:    lis r3, 153
1126; CHECK-NEXT:    lhz r3, -27108(r3)
1127; CHECK-NEXT:    extsh r3, r3
1128; CHECK-NEXT:    blr
1129entry:
1130  %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
1131  %conv = sext i16 %0 to i64
1132  ret i64 %conv
1133}
1134
1135; Function Attrs: nofree norecurse nounwind uwtable willreturn
1136define dso_local i64 @ld_cst_align64_int64_t_int16_t() {
1137; CHECK-P10-LABEL: ld_cst_align64_int64_t_int16_t:
1138; CHECK-P10:       # %bb.0: # %entry
1139; CHECK-P10-NEXT:    pli r3, 244140625
1140; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
1141; CHECK-P10-NEXT:    lhz r3, 0(r3)
1142; CHECK-P10-NEXT:    extsh r3, r3
1143; CHECK-P10-NEXT:    blr
1144;
1145; CHECK-PREP10-LABEL: ld_cst_align64_int64_t_int16_t:
1146; CHECK-PREP10:       # %bb.0: # %entry
1147; CHECK-PREP10-NEXT:    lis r3, 3725
1148; CHECK-PREP10-NEXT:    ori r3, r3, 19025
1149; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
1150; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
1151; CHECK-PREP10-NEXT:    extsh r3, r3
1152; CHECK-PREP10-NEXT:    blr
1153entry:
1154  %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
1155  %conv = sext i16 %0 to i64
1156  ret i64 %conv
1157}
1158
1159; Function Attrs: nofree norecurse nounwind uwtable willreturn
1160define dso_local i64 @ld_0_int64_t_uint32_t(i64 %ptr) {
1161; CHECK-LABEL: ld_0_int64_t_uint32_t:
1162; CHECK:       # %bb.0: # %entry
1163; CHECK-NEXT:    lwz r3, 0(r3)
1164; CHECK-NEXT:    blr
1165entry:
1166  %0 = inttoptr i64 %ptr to ptr
1167  %1 = load atomic i32, ptr %0 monotonic, align 4
1168  %conv = zext i32 %1 to i64
1169  ret i64 %conv
1170}
1171
1172; Function Attrs: nofree norecurse nounwind uwtable willreturn
1173define dso_local i64 @ld_align16_int64_t_uint32_t(ptr nocapture readonly %ptr) {
1174; CHECK-LABEL: ld_align16_int64_t_uint32_t:
1175; CHECK:       # %bb.0: # %entry
1176; CHECK-NEXT:    lwz r3, 8(r3)
1177; CHECK-NEXT:    blr
1178entry:
1179  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
1180  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1181  %conv = zext i32 %0 to i64
1182  ret i64 %conv
1183}
1184
1185; Function Attrs: nofree norecurse nounwind uwtable willreturn
1186define dso_local i64 @ld_align32_int64_t_uint32_t(ptr nocapture readonly %ptr) {
1187; CHECK-P10-LABEL: ld_align32_int64_t_uint32_t:
1188; CHECK-P10:       # %bb.0: # %entry
1189; CHECK-P10-NEXT:    plwz r3, 99999000(r3), 0
1190; CHECK-P10-NEXT:    clrldi r3, r3, 32
1191; CHECK-P10-NEXT:    blr
1192;
1193; CHECK-PREP10-LABEL: ld_align32_int64_t_uint32_t:
1194; CHECK-PREP10:       # %bb.0: # %entry
1195; CHECK-PREP10-NEXT:    lis r4, 1525
1196; CHECK-PREP10-NEXT:    ori r4, r4, 56600
1197; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
1198; CHECK-PREP10-NEXT:    blr
1199entry:
1200  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
1201  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1202  %conv = zext i32 %0 to i64
1203  ret i64 %conv
1204}
1205
1206; Function Attrs: nofree norecurse nounwind uwtable willreturn
1207define dso_local i64 @ld_align64_int64_t_uint32_t(ptr nocapture readonly %ptr) {
1208; CHECK-P10-LABEL: ld_align64_int64_t_uint32_t:
1209; CHECK-P10:       # %bb.0: # %entry
1210; CHECK-P10-NEXT:    pli r4, 244140625
1211; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1212; CHECK-P10-NEXT:    lwzx r3, r3, r4
1213; CHECK-P10-NEXT:    blr
1214;
1215; CHECK-PREP10-LABEL: ld_align64_int64_t_uint32_t:
1216; CHECK-PREP10:       # %bb.0: # %entry
1217; CHECK-PREP10-NEXT:    lis r4, 3725
1218; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1219; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1220; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
1221; CHECK-PREP10-NEXT:    blr
1222entry:
1223  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
1224  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1225  %conv = zext i32 %0 to i64
1226  ret i64 %conv
1227}
1228
1229; Function Attrs: nofree norecurse nounwind uwtable willreturn
1230define dso_local i64 @ld_reg_int64_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) {
1231; CHECK-LABEL: ld_reg_int64_t_uint32_t:
1232; CHECK:       # %bb.0: # %entry
1233; CHECK-NEXT:    lwzx r3, r3, r4
1234; CHECK-NEXT:    blr
1235entry:
1236  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
1237  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1238  %conv = zext i32 %0 to i64
1239  ret i64 %conv
1240}
1241
1242; Function Attrs: nofree norecurse nounwind uwtable willreturn
1243define dso_local i64 @ld_or_int64_t_uint32_t(i64 %ptr, i8 zeroext %off) {
1244; CHECK-LABEL: ld_or_int64_t_uint32_t:
1245; CHECK:       # %bb.0: # %entry
1246; CHECK-NEXT:    or r3, r4, r3
1247; CHECK-NEXT:    lwz r3, 0(r3)
1248; CHECK-NEXT:    blr
1249entry:
1250  %conv = zext i8 %off to i64
1251  %or = or i64 %conv, %ptr
1252  %0 = inttoptr i64 %or to ptr
1253  %1 = load atomic i32, ptr %0 monotonic, align 4
1254  %conv1 = zext i32 %1 to i64
1255  ret i64 %conv1
1256}
1257
1258; Function Attrs: nofree norecurse nounwind uwtable willreturn
1259define dso_local i64 @ld_not_disjoint16_int64_t_uint32_t(i64 %ptr) {
1260; CHECK-LABEL: ld_not_disjoint16_int64_t_uint32_t:
1261; CHECK:       # %bb.0: # %entry
1262; CHECK-NEXT:    ori r3, r3, 6
1263; CHECK-NEXT:    lwz r3, 0(r3)
1264; CHECK-NEXT:    blr
1265entry:
1266  %or = or i64 %ptr, 6
1267  %0 = inttoptr i64 %or to ptr
1268  %1 = load atomic i32, ptr %0 monotonic, align 4
1269  %conv = zext i32 %1 to i64
1270  ret i64 %conv
1271}
1272
1273; Function Attrs: nofree norecurse nounwind uwtable willreturn
1274define dso_local i64 @ld_disjoint_align16_int64_t_uint32_t(i64 %ptr) {
1275; CHECK-LABEL: ld_disjoint_align16_int64_t_uint32_t:
1276; CHECK:       # %bb.0: # %entry
1277; CHECK-NEXT:    rldicr r3, r3, 0, 51
1278; CHECK-NEXT:    lwz r3, 24(r3)
1279; CHECK-NEXT:    blr
1280entry:
1281  %and = and i64 %ptr, -4096
1282  %or = or i64 %and, 24
1283  %0 = inttoptr i64 %or to ptr
1284  %1 = load atomic i32, ptr %0 monotonic, align 8
1285  %conv = zext i32 %1 to i64
1286  ret i64 %conv
1287}
1288
1289; Function Attrs: nofree norecurse nounwind uwtable willreturn
1290define dso_local i64 @ld_not_disjoint32_int64_t_uint32_t(i64 %ptr) {
1291; CHECK-LABEL: ld_not_disjoint32_int64_t_uint32_t:
1292; CHECK:       # %bb.0: # %entry
1293; CHECK-NEXT:    ori r3, r3, 34463
1294; CHECK-NEXT:    oris r3, r3, 1
1295; CHECK-NEXT:    lwz r3, 0(r3)
1296; CHECK-NEXT:    blr
1297entry:
1298  %or = or i64 %ptr, 99999
1299  %0 = inttoptr i64 %or to ptr
1300  %1 = load atomic i32, ptr %0 monotonic, align 4
1301  %conv = zext i32 %1 to i64
1302  ret i64 %conv
1303}
1304
1305; Function Attrs: nofree norecurse nounwind uwtable willreturn
1306define dso_local i64 @ld_disjoint_align32_int64_t_uint32_t(i64 %ptr) {
1307; CHECK-P10-LABEL: ld_disjoint_align32_int64_t_uint32_t:
1308; CHECK-P10:       # %bb.0: # %entry
1309; CHECK-P10-NEXT:    lis r4, -15264
1310; CHECK-P10-NEXT:    and r3, r3, r4
1311; CHECK-P10-NEXT:    plwz r3, 999990000(r3), 0
1312; CHECK-P10-NEXT:    clrldi r3, r3, 32
1313; CHECK-P10-NEXT:    blr
1314;
1315; CHECK-PREP10-LABEL: ld_disjoint_align32_int64_t_uint32_t:
1316; CHECK-PREP10:       # %bb.0: # %entry
1317; CHECK-PREP10-NEXT:    lis r4, -15264
1318; CHECK-PREP10-NEXT:    and r3, r3, r4
1319; CHECK-PREP10-NEXT:    lis r4, 15258
1320; CHECK-PREP10-NEXT:    ori r4, r4, 41712
1321; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
1322; CHECK-PREP10-NEXT:    blr
1323entry:
1324  %and = and i64 %ptr, -1000341504
1325  %or = or i64 %and, 999990000
1326  %0 = inttoptr i64 %or to ptr
1327  %1 = load atomic i32, ptr %0 monotonic, align 16
1328  %conv = zext i32 %1 to i64
1329  ret i64 %conv
1330}
1331
1332; Function Attrs: nofree norecurse nounwind uwtable willreturn
1333define dso_local i64 @ld_not_disjoint64_int64_t_uint32_t(i64 %ptr) {
1334; CHECK-P10-LABEL: ld_not_disjoint64_int64_t_uint32_t:
1335; CHECK-P10:       # %bb.0: # %entry
1336; CHECK-P10-NEXT:    pli r4, 232
1337; CHECK-P10-NEXT:    pli r5, 3567587329
1338; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1339; CHECK-P10-NEXT:    or r3, r3, r5
1340; CHECK-P10-NEXT:    lwz r3, 0(r3)
1341; CHECK-P10-NEXT:    blr
1342;
1343; CHECK-PREP10-LABEL: ld_not_disjoint64_int64_t_uint32_t:
1344; CHECK-PREP10:       # %bb.0: # %entry
1345; CHECK-PREP10-NEXT:    li r4, 29
1346; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
1347; CHECK-PREP10-NEXT:    oris r4, r4, 54437
1348; CHECK-PREP10-NEXT:    ori r4, r4, 4097
1349; CHECK-PREP10-NEXT:    or r3, r3, r4
1350; CHECK-PREP10-NEXT:    lwz r3, 0(r3)
1351; CHECK-PREP10-NEXT:    blr
1352entry:
1353  %or = or i64 %ptr, 1000000000001
1354  %0 = inttoptr i64 %or to ptr
1355  %1 = load atomic i32, ptr %0 monotonic, align 4
1356  %conv = zext i32 %1 to i64
1357  ret i64 %conv
1358}
1359
1360; Function Attrs: nofree norecurse nounwind uwtable willreturn
1361define dso_local i64 @ld_disjoint_align64_int64_t_uint32_t(i64 %ptr) {
1362; CHECK-P10-LABEL: ld_disjoint_align64_int64_t_uint32_t:
1363; CHECK-P10:       # %bb.0: # %entry
1364; CHECK-P10-NEXT:    pli r4, 244140625
1365; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1366; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1367; CHECK-P10-NEXT:    lwzx r3, r3, r4
1368; CHECK-P10-NEXT:    blr
1369;
1370; CHECK-PREP10-LABEL: ld_disjoint_align64_int64_t_uint32_t:
1371; CHECK-PREP10:       # %bb.0: # %entry
1372; CHECK-PREP10-NEXT:    lis r4, 3725
1373; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
1374; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1375; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1376; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
1377; CHECK-PREP10-NEXT:    blr
1378entry:
1379  %and = and i64 %ptr, -1099511627776
1380  %or = or i64 %and, 1000000000000
1381  %0 = inttoptr i64 %or to ptr
1382  %1 = load atomic i32, ptr %0 monotonic, align 4096
1383  %conv = zext i32 %1 to i64
1384  ret i64 %conv
1385}
1386
1387; Function Attrs: nofree norecurse nounwind uwtable willreturn
1388define dso_local i64 @ld_cst_align16_int64_t_uint32_t() {
1389; CHECK-LABEL: ld_cst_align16_int64_t_uint32_t:
1390; CHECK:       # %bb.0: # %entry
1391; CHECK-NEXT:    lwz r3, 4080(0)
1392; CHECK-NEXT:    blr
1393entry:
1394  %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
1395  %conv = zext i32 %0 to i64
1396  ret i64 %conv
1397}
1398
1399; Function Attrs: nofree norecurse nounwind uwtable willreturn
1400define dso_local i64 @ld_cst_align32_int64_t_uint32_t() {
1401; CHECK-LABEL: ld_cst_align32_int64_t_uint32_t:
1402; CHECK:       # %bb.0: # %entry
1403; CHECK-NEXT:    lis r3, 153
1404; CHECK-NEXT:    lwz r3, -27108(r3)
1405; CHECK-NEXT:    blr
1406entry:
1407  %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
1408  %conv = zext i32 %0 to i64
1409  ret i64 %conv
1410}
1411
1412; Function Attrs: nofree norecurse nounwind uwtable willreturn
1413define dso_local i64 @ld_cst_align64_int64_t_uint32_t() {
1414; CHECK-P10-LABEL: ld_cst_align64_int64_t_uint32_t:
1415; CHECK-P10:       # %bb.0: # %entry
1416; CHECK-P10-NEXT:    pli r3, 244140625
1417; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
1418; CHECK-P10-NEXT:    lwz r3, 0(r3)
1419; CHECK-P10-NEXT:    blr
1420;
1421; CHECK-PREP10-LABEL: ld_cst_align64_int64_t_uint32_t:
1422; CHECK-PREP10:       # %bb.0: # %entry
1423; CHECK-PREP10-NEXT:    lis r3, 3725
1424; CHECK-PREP10-NEXT:    ori r3, r3, 19025
1425; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
1426; CHECK-PREP10-NEXT:    lwz r3, 0(r3)
1427; CHECK-PREP10-NEXT:    blr
1428entry:
1429  %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
1430  %conv = zext i32 %0 to i64
1431  ret i64 %conv
1432}
1433
1434; Function Attrs: nofree norecurse nounwind uwtable willreturn
1435define dso_local i64 @ld_0_int64_t_int32_t(i64 %ptr) {
1436; CHECK-LABEL: ld_0_int64_t_int32_t:
1437; CHECK:       # %bb.0: # %entry
1438; CHECK-NEXT:    lwa r3, 0(r3)
1439; CHECK-NEXT:    blr
1440entry:
1441  %0 = inttoptr i64 %ptr to ptr
1442  %1 = load atomic i32, ptr %0 monotonic, align 4
1443  %conv = sext i32 %1 to i64
1444  ret i64 %conv
1445}
1446
1447; Function Attrs: nofree norecurse nounwind uwtable willreturn
1448define dso_local i64 @ld_align16_int64_t_int32_t(ptr nocapture readonly %ptr) {
1449; CHECK-LABEL: ld_align16_int64_t_int32_t:
1450; CHECK:       # %bb.0: # %entry
1451; CHECK-NEXT:    lwa r3, 8(r3)
1452; CHECK-NEXT:    blr
1453entry:
1454  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
1455  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1456  %conv = sext i32 %0 to i64
1457  ret i64 %conv
1458}
1459
1460; Function Attrs: nofree norecurse nounwind uwtable willreturn
1461define dso_local i64 @ld_align32_int64_t_int32_t(ptr nocapture readonly %ptr) {
1462; CHECK-P10-LABEL: ld_align32_int64_t_int32_t:
1463; CHECK-P10:       # %bb.0: # %entry
1464; CHECK-P10-NEXT:    plwz r3, 99999000(r3), 0
1465; CHECK-P10-NEXT:    extsw r3, r3
1466; CHECK-P10-NEXT:    blr
1467;
1468; CHECK-PREP10-LABEL: ld_align32_int64_t_int32_t:
1469; CHECK-PREP10:       # %bb.0: # %entry
1470; CHECK-PREP10-NEXT:    lis r4, 1525
1471; CHECK-PREP10-NEXT:    ori r4, r4, 56600
1472; CHECK-PREP10-NEXT:    lwax r3, r3, r4
1473; CHECK-PREP10-NEXT:    blr
1474entry:
1475  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
1476  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1477  %conv = sext i32 %0 to i64
1478  ret i64 %conv
1479}
1480
1481; Function Attrs: nofree norecurse nounwind uwtable willreturn
1482define dso_local i64 @ld_align64_int64_t_int32_t(ptr nocapture readonly %ptr) {
1483; CHECK-P10-LABEL: ld_align64_int64_t_int32_t:
1484; CHECK-P10:       # %bb.0: # %entry
1485; CHECK-P10-NEXT:    pli r4, 244140625
1486; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1487; CHECK-P10-NEXT:    lwax r3, r3, r4
1488; CHECK-P10-NEXT:    blr
1489;
1490; CHECK-PREP10-LABEL: ld_align64_int64_t_int32_t:
1491; CHECK-PREP10:       # %bb.0: # %entry
1492; CHECK-PREP10-NEXT:    lis r4, 3725
1493; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1494; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1495; CHECK-PREP10-NEXT:    lwax r3, r3, r4
1496; CHECK-PREP10-NEXT:    blr
1497entry:
1498  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
1499  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1500  %conv = sext i32 %0 to i64
1501  ret i64 %conv
1502}
1503
1504; Function Attrs: nofree norecurse nounwind uwtable willreturn
1505define dso_local i64 @ld_reg_int64_t_int32_t(ptr nocapture readonly %ptr, i64 %off) {
1506; CHECK-LABEL: ld_reg_int64_t_int32_t:
1507; CHECK:       # %bb.0: # %entry
1508; CHECK-NEXT:    lwax r3, r3, r4
1509; CHECK-NEXT:    blr
1510entry:
1511  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
1512  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1513  %conv = sext i32 %0 to i64
1514  ret i64 %conv
1515}
1516
1517; Function Attrs: nofree norecurse nounwind uwtable willreturn
1518define dso_local i64 @ld_or_int64_t_int32_t(i64 %ptr, i8 zeroext %off) {
1519; CHECK-LABEL: ld_or_int64_t_int32_t:
1520; CHECK:       # %bb.0: # %entry
1521; CHECK-NEXT:    or r3, r4, r3
1522; CHECK-NEXT:    lwa r3, 0(r3)
1523; CHECK-NEXT:    blr
1524entry:
1525  %conv = zext i8 %off to i64
1526  %or = or i64 %conv, %ptr
1527  %0 = inttoptr i64 %or to ptr
1528  %1 = load atomic i32, ptr %0 monotonic, align 4
1529  %conv1 = sext i32 %1 to i64
1530  ret i64 %conv1
1531}
1532
1533; Function Attrs: nofree norecurse nounwind uwtable willreturn
1534define dso_local i64 @ld_not_disjoint16_int64_t_int32_t(i64 %ptr) {
1535; CHECK-LABEL: ld_not_disjoint16_int64_t_int32_t:
1536; CHECK:       # %bb.0: # %entry
1537; CHECK-NEXT:    ori r3, r3, 6
1538; CHECK-NEXT:    lwa r3, 0(r3)
1539; CHECK-NEXT:    blr
1540entry:
1541  %or = or i64 %ptr, 6
1542  %0 = inttoptr i64 %or to ptr
1543  %1 = load atomic i32, ptr %0 monotonic, align 4
1544  %conv = sext i32 %1 to i64
1545  ret i64 %conv
1546}
1547
1548; Function Attrs: nofree norecurse nounwind uwtable willreturn
1549define dso_local i64 @ld_disjoint_align16_int64_t_int32_t(i64 %ptr) {
1550; CHECK-LABEL: ld_disjoint_align16_int64_t_int32_t:
1551; CHECK:       # %bb.0: # %entry
1552; CHECK-NEXT:    rldicr r3, r3, 0, 51
1553; CHECK-NEXT:    lwa r3, 24(r3)
1554; CHECK-NEXT:    blr
1555entry:
1556  %and = and i64 %ptr, -4096
1557  %or = or i64 %and, 24
1558  %0 = inttoptr i64 %or to ptr
1559  %1 = load atomic i32, ptr %0 monotonic, align 8
1560  %conv = sext i32 %1 to i64
1561  ret i64 %conv
1562}
1563
1564; Function Attrs: nofree norecurse nounwind uwtable willreturn
1565define dso_local i64 @ld_not_disjoint32_int64_t_int32_t(i64 %ptr) {
1566; CHECK-LABEL: ld_not_disjoint32_int64_t_int32_t:
1567; CHECK:       # %bb.0: # %entry
1568; CHECK-NEXT:    ori r3, r3, 34463
1569; CHECK-NEXT:    oris r3, r3, 1
1570; CHECK-NEXT:    lwa r3, 0(r3)
1571; CHECK-NEXT:    blr
1572entry:
1573  %or = or i64 %ptr, 99999
1574  %0 = inttoptr i64 %or to ptr
1575  %1 = load atomic i32, ptr %0 monotonic, align 4
1576  %conv = sext i32 %1 to i64
1577  ret i64 %conv
1578}
1579
1580; Function Attrs: nofree norecurse nounwind uwtable willreturn
1581define dso_local i64 @ld_disjoint_align32_int64_t_int32_t(i64 %ptr) {
1582; CHECK-P10-LABEL: ld_disjoint_align32_int64_t_int32_t:
1583; CHECK-P10:       # %bb.0: # %entry
1584; CHECK-P10-NEXT:    lis r4, -15264
1585; CHECK-P10-NEXT:    and r3, r3, r4
1586; CHECK-P10-NEXT:    plwz r3, 999990000(r3), 0
1587; CHECK-P10-NEXT:    extsw r3, r3
1588; CHECK-P10-NEXT:    blr
1589;
1590; CHECK-PREP10-LABEL: ld_disjoint_align32_int64_t_int32_t:
1591; CHECK-PREP10:       # %bb.0: # %entry
1592; CHECK-PREP10-NEXT:    lis r4, -15264
1593; CHECK-PREP10-NEXT:    and r3, r3, r4
1594; CHECK-PREP10-NEXT:    lis r4, 15258
1595; CHECK-PREP10-NEXT:    ori r4, r4, 41712
1596; CHECK-PREP10-NEXT:    lwax r3, r3, r4
1597; CHECK-PREP10-NEXT:    blr
1598entry:
1599  %and = and i64 %ptr, -1000341504
1600  %or = or i64 %and, 999990000
1601  %0 = inttoptr i64 %or to ptr
1602  %1 = load atomic i32, ptr %0 monotonic, align 16
1603  %conv = sext i32 %1 to i64
1604  ret i64 %conv
1605}
1606
1607; Function Attrs: nofree norecurse nounwind uwtable willreturn
1608define dso_local i64 @ld_not_disjoint64_int64_t_int32_t(i64 %ptr) {
1609; CHECK-P10-LABEL: ld_not_disjoint64_int64_t_int32_t:
1610; CHECK-P10:       # %bb.0: # %entry
1611; CHECK-P10-NEXT:    pli r4, 232
1612; CHECK-P10-NEXT:    pli r5, 3567587329
1613; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1614; CHECK-P10-NEXT:    or r3, r3, r5
1615; CHECK-P10-NEXT:    lwa r3, 0(r3)
1616; CHECK-P10-NEXT:    blr
1617;
1618; CHECK-PREP10-LABEL: ld_not_disjoint64_int64_t_int32_t:
1619; CHECK-PREP10:       # %bb.0: # %entry
1620; CHECK-PREP10-NEXT:    li r4, 29
1621; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
1622; CHECK-PREP10-NEXT:    oris r4, r4, 54437
1623; CHECK-PREP10-NEXT:    ori r4, r4, 4097
1624; CHECK-PREP10-NEXT:    or r3, r3, r4
1625; CHECK-PREP10-NEXT:    lwa r3, 0(r3)
1626; CHECK-PREP10-NEXT:    blr
1627entry:
1628  %or = or i64 %ptr, 1000000000001
1629  %0 = inttoptr i64 %or to ptr
1630  %1 = load atomic i32, ptr %0 monotonic, align 4
1631  %conv = sext i32 %1 to i64
1632  ret i64 %conv
1633}
1634
1635; Function Attrs: nofree norecurse nounwind uwtable willreturn
1636define dso_local i64 @ld_disjoint_align64_int64_t_int32_t(i64 %ptr) {
1637; CHECK-P10-LABEL: ld_disjoint_align64_int64_t_int32_t:
1638; CHECK-P10:       # %bb.0: # %entry
1639; CHECK-P10-NEXT:    pli r4, 244140625
1640; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1641; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1642; CHECK-P10-NEXT:    lwax r3, r3, r4
1643; CHECK-P10-NEXT:    blr
1644;
1645; CHECK-PREP10-LABEL: ld_disjoint_align64_int64_t_int32_t:
1646; CHECK-PREP10:       # %bb.0: # %entry
1647; CHECK-PREP10-NEXT:    lis r4, 3725
1648; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
1649; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1650; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1651; CHECK-PREP10-NEXT:    lwax r3, r3, r4
1652; CHECK-PREP10-NEXT:    blr
1653entry:
1654  %and = and i64 %ptr, -1099511627776
1655  %or = or i64 %and, 1000000000000
1656  %0 = inttoptr i64 %or to ptr
1657  %1 = load atomic i32, ptr %0 monotonic, align 4096
1658  %conv = sext i32 %1 to i64
1659  ret i64 %conv
1660}
1661
1662; Function Attrs: nofree norecurse nounwind uwtable willreturn
1663define dso_local i64 @ld_cst_align16_int64_t_int32_t() {
1664; CHECK-LABEL: ld_cst_align16_int64_t_int32_t:
1665; CHECK:       # %bb.0: # %entry
1666; CHECK-NEXT:    lwa r3, 4080(0)
1667; CHECK-NEXT:    blr
1668entry:
1669  %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
1670  %conv = sext i32 %0 to i64
1671  ret i64 %conv
1672}
1673
1674; Function Attrs: nofree norecurse nounwind uwtable willreturn
1675define dso_local i64 @ld_cst_align32_int64_t_int32_t() {
1676; CHECK-LABEL: ld_cst_align32_int64_t_int32_t:
1677; CHECK:       # %bb.0: # %entry
1678; CHECK-NEXT:    lis r3, 153
1679; CHECK-NEXT:    lwa r3, -27108(r3)
1680; CHECK-NEXT:    blr
1681entry:
1682  %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
1683  %conv = sext i32 %0 to i64
1684  ret i64 %conv
1685}
1686
1687; Function Attrs: nofree norecurse nounwind uwtable willreturn
1688define dso_local i64 @ld_cst_align64_int64_t_int32_t() {
1689; CHECK-P10-LABEL: ld_cst_align64_int64_t_int32_t:
1690; CHECK-P10:       # %bb.0: # %entry
1691; CHECK-P10-NEXT:    pli r3, 244140625
1692; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
1693; CHECK-P10-NEXT:    lwa r3, 0(r3)
1694; CHECK-P10-NEXT:    blr
1695;
1696; CHECK-PREP10-LABEL: ld_cst_align64_int64_t_int32_t:
1697; CHECK-PREP10:       # %bb.0: # %entry
1698; CHECK-PREP10-NEXT:    lis r3, 3725
1699; CHECK-PREP10-NEXT:    ori r3, r3, 19025
1700; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
1701; CHECK-PREP10-NEXT:    lwa r3, 0(r3)
1702; CHECK-PREP10-NEXT:    blr
1703entry:
1704  %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
1705  %conv = sext i32 %0 to i64
1706  ret i64 %conv
1707}
1708
1709; Function Attrs: nofree norecurse nounwind uwtable willreturn
1710define dso_local i64 @ld_0_int64_t_uint64_t(i64 %ptr) {
1711; CHECK-LABEL: ld_0_int64_t_uint64_t:
1712; CHECK:       # %bb.0: # %entry
1713; CHECK-NEXT:    ld r3, 0(r3)
1714; CHECK-NEXT:    blr
1715entry:
1716  %0 = inttoptr i64 %ptr to ptr
1717  %1 = load atomic i64, ptr %0 monotonic, align 8
1718  ret i64 %1
1719}
1720
1721; Function Attrs: nofree norecurse nounwind uwtable willreturn
1722define dso_local i64 @ld_align16_int64_t_uint64_t(ptr nocapture readonly %ptr) {
1723; CHECK-LABEL: ld_align16_int64_t_uint64_t:
1724; CHECK:       # %bb.0: # %entry
1725; CHECK-NEXT:    ld r3, 8(r3)
1726; CHECK-NEXT:    blr
1727entry:
1728  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
1729  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
1730  ret i64 %0
1731}
1732
1733; Function Attrs: nofree norecurse nounwind uwtable willreturn
1734define dso_local i64 @ld_align32_int64_t_uint64_t(ptr nocapture readonly %ptr) {
1735; CHECK-P10-LABEL: ld_align32_int64_t_uint64_t:
1736; CHECK-P10:       # %bb.0: # %entry
1737; CHECK-P10-NEXT:    pld r3, 99999000(r3), 0
1738; CHECK-P10-NEXT:    blr
1739;
1740; CHECK-PREP10-LABEL: ld_align32_int64_t_uint64_t:
1741; CHECK-PREP10:       # %bb.0: # %entry
1742; CHECK-PREP10-NEXT:    lis r4, 1525
1743; CHECK-PREP10-NEXT:    ori r4, r4, 56600
1744; CHECK-PREP10-NEXT:    ldx r3, r3, r4
1745; CHECK-PREP10-NEXT:    blr
1746entry:
1747  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
1748  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
1749  ret i64 %0
1750}
1751
1752; Function Attrs: nofree norecurse nounwind uwtable willreturn
1753define dso_local i64 @ld_align64_int64_t_uint64_t(ptr nocapture readonly %ptr) {
1754; CHECK-P10-LABEL: ld_align64_int64_t_uint64_t:
1755; CHECK-P10:       # %bb.0: # %entry
1756; CHECK-P10-NEXT:    pli r4, 244140625
1757; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1758; CHECK-P10-NEXT:    ldx r3, r3, r4
1759; CHECK-P10-NEXT:    blr
1760;
1761; CHECK-PREP10-LABEL: ld_align64_int64_t_uint64_t:
1762; CHECK-PREP10:       # %bb.0: # %entry
1763; CHECK-PREP10-NEXT:    lis r4, 3725
1764; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1765; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1766; CHECK-PREP10-NEXT:    ldx r3, r3, r4
1767; CHECK-PREP10-NEXT:    blr
1768entry:
1769  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
1770  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
1771  ret i64 %0
1772}
1773
1774; Function Attrs: nofree norecurse nounwind uwtable willreturn
1775define dso_local i64 @ld_reg_int64_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) {
1776; CHECK-LABEL: ld_reg_int64_t_uint64_t:
1777; CHECK:       # %bb.0: # %entry
1778; CHECK-NEXT:    ldx r3, r3, r4
1779; CHECK-NEXT:    blr
1780entry:
1781  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
1782  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
1783  ret i64 %0
1784}
1785
1786; Function Attrs: nofree norecurse nounwind uwtable willreturn
1787define dso_local i64 @ld_or_int64_t_uint64_t(i64 %ptr, i8 zeroext %off) {
1788; CHECK-LABEL: ld_or_int64_t_uint64_t:
1789; CHECK:       # %bb.0: # %entry
1790; CHECK-NEXT:    or r3, r4, r3
1791; CHECK-NEXT:    ld r3, 0(r3)
1792; CHECK-NEXT:    blr
1793entry:
1794  %conv = zext i8 %off to i64
1795  %or = or i64 %conv, %ptr
1796  %0 = inttoptr i64 %or to ptr
1797  %1 = load atomic i64, ptr %0 monotonic, align 8
1798  ret i64 %1
1799}
1800
1801; Function Attrs: nofree norecurse nounwind uwtable willreturn
1802define dso_local i64 @ld_not_disjoint16_int64_t_uint64_t(i64 %ptr) {
1803; CHECK-LABEL: ld_not_disjoint16_int64_t_uint64_t:
1804; CHECK:       # %bb.0: # %entry
1805; CHECK-NEXT:    ori r3, r3, 6
1806; CHECK-NEXT:    ld r3, 0(r3)
1807; CHECK-NEXT:    blr
1808entry:
1809  %or = or i64 %ptr, 6
1810  %0 = inttoptr i64 %or to ptr
1811  %1 = load atomic i64, ptr %0 monotonic, align 8
1812  ret i64 %1
1813}
1814
1815; Function Attrs: nofree norecurse nounwind uwtable willreturn
1816define dso_local i64 @ld_disjoint_align16_int64_t_uint64_t(i64 %ptr) {
1817; CHECK-LABEL: ld_disjoint_align16_int64_t_uint64_t:
1818; CHECK:       # %bb.0: # %entry
1819; CHECK-NEXT:    rldicr r3, r3, 0, 51
1820; CHECK-NEXT:    ld r3, 24(r3)
1821; CHECK-NEXT:    blr
1822entry:
1823  %and = and i64 %ptr, -4096
1824  %or = or i64 %and, 24
1825  %0 = inttoptr i64 %or to ptr
1826  %1 = load atomic i64, ptr %0 monotonic, align 8
1827  ret i64 %1
1828}
1829
1830; Function Attrs: nofree norecurse nounwind uwtable willreturn
1831define dso_local i64 @ld_not_disjoint32_int64_t_uint64_t(i64 %ptr) {
1832; CHECK-LABEL: ld_not_disjoint32_int64_t_uint64_t:
1833; CHECK:       # %bb.0: # %entry
1834; CHECK-NEXT:    ori r3, r3, 34463
1835; CHECK-NEXT:    oris r3, r3, 1
1836; CHECK-NEXT:    ld r3, 0(r3)
1837; CHECK-NEXT:    blr
1838entry:
1839  %or = or i64 %ptr, 99999
1840  %0 = inttoptr i64 %or to ptr
1841  %1 = load atomic i64, ptr %0 monotonic, align 8
1842  ret i64 %1
1843}
1844
1845; Function Attrs: nofree norecurse nounwind uwtable willreturn
1846define dso_local i64 @ld_disjoint_align32_int64_t_uint64_t(i64 %ptr) {
1847; CHECK-P10-LABEL: ld_disjoint_align32_int64_t_uint64_t:
1848; CHECK-P10:       # %bb.0: # %entry
1849; CHECK-P10-NEXT:    lis r4, -15264
1850; CHECK-P10-NEXT:    and r3, r3, r4
1851; CHECK-P10-NEXT:    pld r3, 999990000(r3), 0
1852; CHECK-P10-NEXT:    blr
1853;
1854; CHECK-PREP10-LABEL: ld_disjoint_align32_int64_t_uint64_t:
1855; CHECK-PREP10:       # %bb.0: # %entry
1856; CHECK-PREP10-NEXT:    lis r4, -15264
1857; CHECK-PREP10-NEXT:    and r3, r3, r4
1858; CHECK-PREP10-NEXT:    lis r4, 15258
1859; CHECK-PREP10-NEXT:    ori r4, r4, 41712
1860; CHECK-PREP10-NEXT:    ldx r3, r3, r4
1861; CHECK-PREP10-NEXT:    blr
1862entry:
1863  %and = and i64 %ptr, -1000341504
1864  %or = or i64 %and, 999990000
1865  %0 = inttoptr i64 %or to ptr
1866  %1 = load atomic i64, ptr %0 monotonic, align 16
1867  ret i64 %1
1868}
1869
1870; Function Attrs: nofree norecurse nounwind uwtable willreturn
1871define dso_local i64 @ld_not_disjoint64_int64_t_uint64_t(i64 %ptr) {
1872; CHECK-P10-LABEL: ld_not_disjoint64_int64_t_uint64_t:
1873; CHECK-P10:       # %bb.0: # %entry
1874; CHECK-P10-NEXT:    pli r4, 232
1875; CHECK-P10-NEXT:    pli r5, 3567587329
1876; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1877; CHECK-P10-NEXT:    or r3, r3, r5
1878; CHECK-P10-NEXT:    ld r3, 0(r3)
1879; CHECK-P10-NEXT:    blr
1880;
1881; CHECK-PREP10-LABEL: ld_not_disjoint64_int64_t_uint64_t:
1882; CHECK-PREP10:       # %bb.0: # %entry
1883; CHECK-PREP10-NEXT:    li r4, 29
1884; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
1885; CHECK-PREP10-NEXT:    oris r4, r4, 54437
1886; CHECK-PREP10-NEXT:    ori r4, r4, 4097
1887; CHECK-PREP10-NEXT:    or r3, r3, r4
1888; CHECK-PREP10-NEXT:    ld r3, 0(r3)
1889; CHECK-PREP10-NEXT:    blr
1890entry:
1891  %or = or i64 %ptr, 1000000000001
1892  %0 = inttoptr i64 %or to ptr
1893  %1 = load atomic i64, ptr %0 monotonic, align 8
1894  ret i64 %1
1895}
1896
1897; Function Attrs: nofree norecurse nounwind uwtable willreturn
1898define dso_local i64 @ld_disjoint_align64_int64_t_uint64_t(i64 %ptr) {
1899; CHECK-P10-LABEL: ld_disjoint_align64_int64_t_uint64_t:
1900; CHECK-P10:       # %bb.0: # %entry
1901; CHECK-P10-NEXT:    pli r4, 244140625
1902; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1903; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1904; CHECK-P10-NEXT:    ldx r3, r3, r4
1905; CHECK-P10-NEXT:    blr
1906;
1907; CHECK-PREP10-LABEL: ld_disjoint_align64_int64_t_uint64_t:
1908; CHECK-PREP10:       # %bb.0: # %entry
1909; CHECK-PREP10-NEXT:    lis r4, 3725
1910; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
1911; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1912; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1913; CHECK-PREP10-NEXT:    ldx r3, r3, r4
1914; CHECK-PREP10-NEXT:    blr
1915entry:
1916  %and = and i64 %ptr, -1099511627776
1917  %or = or i64 %and, 1000000000000
1918  %0 = inttoptr i64 %or to ptr
1919  %1 = load atomic i64, ptr %0 monotonic, align 4096
1920  ret i64 %1
1921}
1922
1923; Function Attrs: nofree norecurse nounwind uwtable willreturn
1924define dso_local i64 @ld_cst_align16_int64_t_uint64_t() {
1925; CHECK-LABEL: ld_cst_align16_int64_t_uint64_t:
1926; CHECK:       # %bb.0: # %entry
1927; CHECK-NEXT:    ld r3, 4080(0)
1928; CHECK-NEXT:    blr
1929entry:
1930  %0 = load atomic i64, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
1931  ret i64 %0
1932}
1933
1934; Function Attrs: nofree norecurse nounwind uwtable willreturn
1935define dso_local i64 @ld_cst_align32_int64_t_uint64_t() {
1936; CHECK-LABEL: ld_cst_align32_int64_t_uint64_t:
1937; CHECK:       # %bb.0: # %entry
1938; CHECK-NEXT:    lis r3, 153
1939; CHECK-NEXT:    ld r3, -27108(r3)
1940; CHECK-NEXT:    blr
1941entry:
1942  %0 = load atomic i64, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8
1943  ret i64 %0
1944}
1945
1946; Function Attrs: nofree norecurse nounwind uwtable willreturn
1947define dso_local i64 @ld_cst_align64_int64_t_uint64_t() {
1948; CHECK-P10-LABEL: ld_cst_align64_int64_t_uint64_t:
1949; CHECK-P10:       # %bb.0: # %entry
1950; CHECK-P10-NEXT:    pli r3, 244140625
1951; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
1952; CHECK-P10-NEXT:    ld r3, 0(r3)
1953; CHECK-P10-NEXT:    blr
1954;
1955; CHECK-PREP10-LABEL: ld_cst_align64_int64_t_uint64_t:
1956; CHECK-PREP10:       # %bb.0: # %entry
1957; CHECK-PREP10-NEXT:    lis r3, 3725
1958; CHECK-PREP10-NEXT:    ori r3, r3, 19025
1959; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
1960; CHECK-PREP10-NEXT:    ld r3, 0(r3)
1961; CHECK-PREP10-NEXT:    blr
1962entry:
1963  %0 = load atomic i64, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
1964  ret i64 %0
1965}
1966
1967; Function Attrs: nofree norecurse nounwind uwtable willreturn
1968define dso_local i64 @ld_0_uint64_t_uint8_t(i64 %ptr) {
1969; CHECK-LABEL: ld_0_uint64_t_uint8_t:
1970; CHECK:       # %bb.0: # %entry
1971; CHECK-NEXT:    lbz r3, 0(r3)
1972; CHECK-NEXT:    blr
1973entry:
1974  %0 = inttoptr i64 %ptr to ptr
1975  %1 = load atomic i8, ptr %0 monotonic, align 1
1976  %conv = zext i8 %1 to i64
1977  ret i64 %conv
1978}
1979
1980; Function Attrs: nofree norecurse nounwind uwtable willreturn
1981define dso_local i64 @ld_align16_uint64_t_uint8_t(ptr nocapture readonly %ptr) {
1982; CHECK-LABEL: ld_align16_uint64_t_uint8_t:
1983; CHECK:       # %bb.0: # %entry
1984; CHECK-NEXT:    lbz r3, 8(r3)
1985; CHECK-NEXT:    blr
1986entry:
1987  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
1988  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
1989  %conv = zext i8 %0 to i64
1990  ret i64 %conv
1991}
1992
1993; Function Attrs: nofree norecurse nounwind uwtable willreturn
1994define dso_local i64 @ld_align32_uint64_t_uint8_t(ptr nocapture readonly %ptr) {
1995; CHECK-P10-LABEL: ld_align32_uint64_t_uint8_t:
1996; CHECK-P10:       # %bb.0: # %entry
1997; CHECK-P10-NEXT:    plbz r3, 99999000(r3), 0
1998; CHECK-P10-NEXT:    clrldi r3, r3, 32
1999; CHECK-P10-NEXT:    blr
2000;
2001; CHECK-PREP10-LABEL: ld_align32_uint64_t_uint8_t:
2002; CHECK-PREP10:       # %bb.0: # %entry
2003; CHECK-PREP10-NEXT:    lis r4, 1525
2004; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2005; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2006; CHECK-PREP10-NEXT:    blr
2007entry:
2008  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2009  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
2010  %conv = zext i8 %0 to i64
2011  ret i64 %conv
2012}
2013
2014; Function Attrs: nofree norecurse nounwind uwtable willreturn
2015define dso_local i64 @ld_align64_uint64_t_uint8_t(ptr nocapture readonly %ptr) {
2016; CHECK-P10-LABEL: ld_align64_uint64_t_uint8_t:
2017; CHECK-P10:       # %bb.0: # %entry
2018; CHECK-P10-NEXT:    pli r4, 244140625
2019; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2020; CHECK-P10-NEXT:    lbzx r3, r3, r4
2021; CHECK-P10-NEXT:    blr
2022;
2023; CHECK-PREP10-LABEL: ld_align64_uint64_t_uint8_t:
2024; CHECK-PREP10:       # %bb.0: # %entry
2025; CHECK-PREP10-NEXT:    lis r4, 3725
2026; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2027; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2028; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2029; CHECK-PREP10-NEXT:    blr
2030entry:
2031  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2032  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
2033  %conv = zext i8 %0 to i64
2034  ret i64 %conv
2035}
2036
2037; Function Attrs: nofree norecurse nounwind uwtable willreturn
2038define dso_local i64 @ld_reg_uint64_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) {
2039; CHECK-LABEL: ld_reg_uint64_t_uint8_t:
2040; CHECK:       # %bb.0: # %entry
2041; CHECK-NEXT:    lbzx r3, r3, r4
2042; CHECK-NEXT:    blr
2043entry:
2044  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2045  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
2046  %conv = zext i8 %0 to i64
2047  ret i64 %conv
2048}
2049
2050; Function Attrs: nofree norecurse nounwind uwtable willreturn
2051define dso_local i64 @ld_or_uint64_t_uint8_t(i64 %ptr, i8 zeroext %off) {
2052; CHECK-LABEL: ld_or_uint64_t_uint8_t:
2053; CHECK:       # %bb.0: # %entry
2054; CHECK-NEXT:    or r3, r4, r3
2055; CHECK-NEXT:    lbz r3, 0(r3)
2056; CHECK-NEXT:    blr
2057entry:
2058  %conv = zext i8 %off to i64
2059  %or = or i64 %conv, %ptr
2060  %0 = inttoptr i64 %or to ptr
2061  %1 = load atomic i8, ptr %0 monotonic, align 1
2062  %conv1 = zext i8 %1 to i64
2063  ret i64 %conv1
2064}
2065
2066; Function Attrs: nofree norecurse nounwind uwtable willreturn
2067define dso_local i64 @ld_not_disjoint16_uint64_t_uint8_t(i64 %ptr) {
2068; CHECK-LABEL: ld_not_disjoint16_uint64_t_uint8_t:
2069; CHECK:       # %bb.0: # %entry
2070; CHECK-NEXT:    ori r3, r3, 6
2071; CHECK-NEXT:    lbz r3, 0(r3)
2072; CHECK-NEXT:    blr
2073entry:
2074  %or = or i64 %ptr, 6
2075  %0 = inttoptr i64 %or to ptr
2076  %1 = load atomic i8, ptr %0 monotonic, align 1
2077  %conv = zext i8 %1 to i64
2078  ret i64 %conv
2079}
2080
2081; Function Attrs: nofree norecurse nounwind uwtable willreturn
2082define dso_local i64 @ld_disjoint_align16_uint64_t_uint8_t(i64 %ptr) {
2083; CHECK-LABEL: ld_disjoint_align16_uint64_t_uint8_t:
2084; CHECK:       # %bb.0: # %entry
2085; CHECK-NEXT:    rldicr r3, r3, 0, 51
2086; CHECK-NEXT:    lbz r3, 24(r3)
2087; CHECK-NEXT:    blr
2088entry:
2089  %and = and i64 %ptr, -4096
2090  %or = or i64 %and, 24
2091  %0 = inttoptr i64 %or to ptr
2092  %1 = load atomic i8, ptr %0 monotonic, align 8
2093  %conv = zext i8 %1 to i64
2094  ret i64 %conv
2095}
2096
2097; Function Attrs: nofree norecurse nounwind uwtable willreturn
2098define dso_local i64 @ld_not_disjoint32_uint64_t_uint8_t(i64 %ptr) {
2099; CHECK-LABEL: ld_not_disjoint32_uint64_t_uint8_t:
2100; CHECK:       # %bb.0: # %entry
2101; CHECK-NEXT:    ori r3, r3, 34463
2102; CHECK-NEXT:    oris r3, r3, 1
2103; CHECK-NEXT:    lbz r3, 0(r3)
2104; CHECK-NEXT:    blr
2105entry:
2106  %or = or i64 %ptr, 99999
2107  %0 = inttoptr i64 %or to ptr
2108  %1 = load atomic i8, ptr %0 monotonic, align 1
2109  %conv = zext i8 %1 to i64
2110  ret i64 %conv
2111}
2112
2113; Function Attrs: nofree norecurse nounwind uwtable willreturn
2114define dso_local i64 @ld_disjoint_align32_uint64_t_uint8_t(i64 %ptr) {
2115; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_uint8_t:
2116; CHECK-P10:       # %bb.0: # %entry
2117; CHECK-P10-NEXT:    lis r4, -15264
2118; CHECK-P10-NEXT:    and r3, r3, r4
2119; CHECK-P10-NEXT:    plbz r3, 999990000(r3), 0
2120; CHECK-P10-NEXT:    clrldi r3, r3, 32
2121; CHECK-P10-NEXT:    blr
2122;
2123; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_uint8_t:
2124; CHECK-PREP10:       # %bb.0: # %entry
2125; CHECK-PREP10-NEXT:    lis r4, -15264
2126; CHECK-PREP10-NEXT:    and r3, r3, r4
2127; CHECK-PREP10-NEXT:    lis r4, 15258
2128; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2129; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2130; CHECK-PREP10-NEXT:    blr
2131entry:
2132  %and = and i64 %ptr, -1000341504
2133  %or = or i64 %and, 999990000
2134  %0 = inttoptr i64 %or to ptr
2135  %1 = load atomic i8, ptr %0 monotonic, align 16
2136  %conv = zext i8 %1 to i64
2137  ret i64 %conv
2138}
2139
2140; Function Attrs: nofree norecurse nounwind uwtable willreturn
2141define dso_local i64 @ld_not_disjoint64_uint64_t_uint8_t(i64 %ptr) {
2142; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_uint8_t:
2143; CHECK-P10:       # %bb.0: # %entry
2144; CHECK-P10-NEXT:    pli r4, 232
2145; CHECK-P10-NEXT:    pli r5, 3567587329
2146; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2147; CHECK-P10-NEXT:    or r3, r3, r5
2148; CHECK-P10-NEXT:    lbz r3, 0(r3)
2149; CHECK-P10-NEXT:    blr
2150;
2151; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_uint8_t:
2152; CHECK-PREP10:       # %bb.0: # %entry
2153; CHECK-PREP10-NEXT:    li r4, 29
2154; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2155; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2156; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2157; CHECK-PREP10-NEXT:    or r3, r3, r4
2158; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
2159; CHECK-PREP10-NEXT:    blr
2160entry:
2161  %or = or i64 %ptr, 1000000000001
2162  %0 = inttoptr i64 %or to ptr
2163  %1 = load atomic i8, ptr %0 monotonic, align 1
2164  %conv = zext i8 %1 to i64
2165  ret i64 %conv
2166}
2167
2168; Function Attrs: nofree norecurse nounwind uwtable willreturn
2169define dso_local i64 @ld_disjoint_align64_uint64_t_uint8_t(i64 %ptr) {
2170; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_uint8_t:
2171; CHECK-P10:       # %bb.0: # %entry
2172; CHECK-P10-NEXT:    pli r4, 244140625
2173; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2174; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2175; CHECK-P10-NEXT:    lbzx r3, r3, r4
2176; CHECK-P10-NEXT:    blr
2177;
2178; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_uint8_t:
2179; CHECK-PREP10:       # %bb.0: # %entry
2180; CHECK-PREP10-NEXT:    lis r4, 3725
2181; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2182; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2183; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2184; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2185; CHECK-PREP10-NEXT:    blr
2186entry:
2187  %and = and i64 %ptr, -1099511627776
2188  %or = or i64 %and, 1000000000000
2189  %0 = inttoptr i64 %or to ptr
2190  %1 = load atomic i8, ptr %0 monotonic, align 4096
2191  %conv = zext i8 %1 to i64
2192  ret i64 %conv
2193}
2194
2195; Function Attrs: nofree norecurse nounwind uwtable willreturn
2196define dso_local i64 @ld_cst_align16_uint64_t_uint8_t() {
2197; CHECK-LABEL: ld_cst_align16_uint64_t_uint8_t:
2198; CHECK:       # %bb.0: # %entry
2199; CHECK-NEXT:    lbz r3, 4080(0)
2200; CHECK-NEXT:    blr
2201entry:
2202  %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
2203  %conv = zext i8 %0 to i64
2204  ret i64 %conv
2205}
2206
2207; Function Attrs: nofree norecurse nounwind uwtable willreturn
2208define dso_local i64 @ld_cst_align32_uint64_t_uint8_t() {
2209; CHECK-LABEL: ld_cst_align32_uint64_t_uint8_t:
2210; CHECK:       # %bb.0: # %entry
2211; CHECK-NEXT:    lis r3, 153
2212; CHECK-NEXT:    lbz r3, -27108(r3)
2213; CHECK-NEXT:    blr
2214entry:
2215  %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
2216  %conv = zext i8 %0 to i64
2217  ret i64 %conv
2218}
2219
2220; Function Attrs: nofree norecurse nounwind uwtable willreturn
2221define dso_local i64 @ld_cst_align64_uint64_t_uint8_t() {
2222; CHECK-P10-LABEL: ld_cst_align64_uint64_t_uint8_t:
2223; CHECK-P10:       # %bb.0: # %entry
2224; CHECK-P10-NEXT:    pli r3, 244140625
2225; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2226; CHECK-P10-NEXT:    lbz r3, 0(r3)
2227; CHECK-P10-NEXT:    blr
2228;
2229; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_uint8_t:
2230; CHECK-PREP10:       # %bb.0: # %entry
2231; CHECK-PREP10-NEXT:    lis r3, 3725
2232; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2233; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2234; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
2235; CHECK-PREP10-NEXT:    blr
2236entry:
2237  %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
2238  %conv = zext i8 %0 to i64
2239  ret i64 %conv
2240}
2241
2242; Function Attrs: nofree norecurse nounwind uwtable willreturn
2243define dso_local i64 @ld_0_uint64_t_int8_t(i64 %ptr) {
2244; CHECK-LABEL: ld_0_uint64_t_int8_t:
2245; CHECK:       # %bb.0: # %entry
2246; CHECK-NEXT:    lbz r3, 0(r3)
2247; CHECK-NEXT:    extsb r3, r3
2248; CHECK-NEXT:    blr
2249entry:
2250  %0 = inttoptr i64 %ptr to ptr
2251  %1 = load atomic i8, ptr %0 monotonic, align 1
2252  %conv = sext i8 %1 to i64
2253  ret i64 %conv
2254}
2255
2256; Function Attrs: nofree norecurse nounwind uwtable willreturn
2257define dso_local i64 @ld_align16_uint64_t_int8_t(ptr nocapture readonly %ptr) {
2258; CHECK-LABEL: ld_align16_uint64_t_int8_t:
2259; CHECK:       # %bb.0: # %entry
2260; CHECK-NEXT:    lbz r3, 8(r3)
2261; CHECK-NEXT:    extsb r3, r3
2262; CHECK-NEXT:    blr
2263entry:
2264  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2265  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
2266  %conv = sext i8 %0 to i64
2267  ret i64 %conv
2268}
2269
2270; Function Attrs: nofree norecurse nounwind uwtable willreturn
2271define dso_local i64 @ld_align32_uint64_t_int8_t(ptr nocapture readonly %ptr) {
2272; CHECK-P10-LABEL: ld_align32_uint64_t_int8_t:
2273; CHECK-P10:       # %bb.0: # %entry
2274; CHECK-P10-NEXT:    plbz r3, 99999000(r3), 0
2275; CHECK-P10-NEXT:    extsb r3, r3
2276; CHECK-P10-NEXT:    blr
2277;
2278; CHECK-PREP10-LABEL: ld_align32_uint64_t_int8_t:
2279; CHECK-PREP10:       # %bb.0: # %entry
2280; CHECK-PREP10-NEXT:    lis r4, 1525
2281; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2282; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2283; CHECK-PREP10-NEXT:    extsb r3, r3
2284; CHECK-PREP10-NEXT:    blr
2285entry:
2286  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2287  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
2288  %conv = sext i8 %0 to i64
2289  ret i64 %conv
2290}
2291
2292; Function Attrs: nofree norecurse nounwind uwtable willreturn
2293define dso_local i64 @ld_align64_uint64_t_int8_t(ptr nocapture readonly %ptr) {
2294; CHECK-P10-LABEL: ld_align64_uint64_t_int8_t:
2295; CHECK-P10:       # %bb.0: # %entry
2296; CHECK-P10-NEXT:    pli r4, 244140625
2297; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2298; CHECK-P10-NEXT:    lbzx r3, r3, r4
2299; CHECK-P10-NEXT:    extsb r3, r3
2300; CHECK-P10-NEXT:    blr
2301;
2302; CHECK-PREP10-LABEL: ld_align64_uint64_t_int8_t:
2303; CHECK-PREP10:       # %bb.0: # %entry
2304; CHECK-PREP10-NEXT:    lis r4, 3725
2305; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2306; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2307; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2308; CHECK-PREP10-NEXT:    extsb r3, r3
2309; CHECK-PREP10-NEXT:    blr
2310entry:
2311  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2312  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
2313  %conv = sext i8 %0 to i64
2314  ret i64 %conv
2315}
2316
2317; Function Attrs: nofree norecurse nounwind uwtable willreturn
2318define dso_local i64 @ld_reg_uint64_t_int8_t(ptr nocapture readonly %ptr, i64 %off) {
2319; CHECK-LABEL: ld_reg_uint64_t_int8_t:
2320; CHECK:       # %bb.0: # %entry
2321; CHECK-NEXT:    lbzx r3, r3, r4
2322; CHECK-NEXT:    extsb r3, r3
2323; CHECK-NEXT:    blr
2324entry:
2325  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2326  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
2327  %conv = sext i8 %0 to i64
2328  ret i64 %conv
2329}
2330
2331; Function Attrs: nofree norecurse nounwind uwtable willreturn
2332define dso_local i64 @ld_or_uint64_t_int8_t(i64 %ptr, i8 zeroext %off) {
2333; CHECK-LABEL: ld_or_uint64_t_int8_t:
2334; CHECK:       # %bb.0: # %entry
2335; CHECK-NEXT:    or r3, r4, r3
2336; CHECK-NEXT:    lbz r3, 0(r3)
2337; CHECK-NEXT:    extsb r3, r3
2338; CHECK-NEXT:    blr
2339entry:
2340  %conv = zext i8 %off to i64
2341  %or = or i64 %conv, %ptr
2342  %0 = inttoptr i64 %or to ptr
2343  %1 = load atomic i8, ptr %0 monotonic, align 1
2344  %conv1 = sext i8 %1 to i64
2345  ret i64 %conv1
2346}
2347
2348; Function Attrs: nofree norecurse nounwind uwtable willreturn
2349define dso_local i64 @ld_not_disjoint16_uint64_t_int8_t(i64 %ptr) {
2350; CHECK-LABEL: ld_not_disjoint16_uint64_t_int8_t:
2351; CHECK:       # %bb.0: # %entry
2352; CHECK-NEXT:    ori r3, r3, 6
2353; CHECK-NEXT:    lbz r3, 0(r3)
2354; CHECK-NEXT:    extsb r3, r3
2355; CHECK-NEXT:    blr
2356entry:
2357  %or = or i64 %ptr, 6
2358  %0 = inttoptr i64 %or to ptr
2359  %1 = load atomic i8, ptr %0 monotonic, align 1
2360  %conv = sext i8 %1 to i64
2361  ret i64 %conv
2362}
2363
2364; Function Attrs: nofree norecurse nounwind uwtable willreturn
2365define dso_local i64 @ld_disjoint_align16_uint64_t_int8_t(i64 %ptr) {
2366; CHECK-LABEL: ld_disjoint_align16_uint64_t_int8_t:
2367; CHECK:       # %bb.0: # %entry
2368; CHECK-NEXT:    rldicr r3, r3, 0, 51
2369; CHECK-NEXT:    lbz r3, 24(r3)
2370; CHECK-NEXT:    extsb r3, r3
2371; CHECK-NEXT:    blr
2372entry:
2373  %and = and i64 %ptr, -4096
2374  %or = or i64 %and, 24
2375  %0 = inttoptr i64 %or to ptr
2376  %1 = load atomic i8, ptr %0 monotonic, align 8
2377  %conv = sext i8 %1 to i64
2378  ret i64 %conv
2379}
2380
2381; Function Attrs: nofree norecurse nounwind uwtable willreturn
2382define dso_local i64 @ld_not_disjoint32_uint64_t_int8_t(i64 %ptr) {
2383; CHECK-LABEL: ld_not_disjoint32_uint64_t_int8_t:
2384; CHECK:       # %bb.0: # %entry
2385; CHECK-NEXT:    ori r3, r3, 34463
2386; CHECK-NEXT:    oris r3, r3, 1
2387; CHECK-NEXT:    lbz r3, 0(r3)
2388; CHECK-NEXT:    extsb r3, r3
2389; CHECK-NEXT:    blr
2390entry:
2391  %or = or i64 %ptr, 99999
2392  %0 = inttoptr i64 %or to ptr
2393  %1 = load atomic i8, ptr %0 monotonic, align 1
2394  %conv = sext i8 %1 to i64
2395  ret i64 %conv
2396}
2397
2398; Function Attrs: nofree norecurse nounwind uwtable willreturn
2399define dso_local i64 @ld_disjoint_align32_uint64_t_int8_t(i64 %ptr) {
2400; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_int8_t:
2401; CHECK-P10:       # %bb.0: # %entry
2402; CHECK-P10-NEXT:    lis r4, -15264
2403; CHECK-P10-NEXT:    and r3, r3, r4
2404; CHECK-P10-NEXT:    plbz r3, 999990000(r3), 0
2405; CHECK-P10-NEXT:    extsb r3, r3
2406; CHECK-P10-NEXT:    blr
2407;
2408; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_int8_t:
2409; CHECK-PREP10:       # %bb.0: # %entry
2410; CHECK-PREP10-NEXT:    lis r4, -15264
2411; CHECK-PREP10-NEXT:    and r3, r3, r4
2412; CHECK-PREP10-NEXT:    lis r4, 15258
2413; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2414; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2415; CHECK-PREP10-NEXT:    extsb r3, r3
2416; CHECK-PREP10-NEXT:    blr
2417entry:
2418  %and = and i64 %ptr, -1000341504
2419  %or = or i64 %and, 999990000
2420  %0 = inttoptr i64 %or to ptr
2421  %1 = load atomic i8, ptr %0 monotonic, align 16
2422  %conv = sext i8 %1 to i64
2423  ret i64 %conv
2424}
2425
2426; Function Attrs: nofree norecurse nounwind uwtable willreturn
2427define dso_local i64 @ld_not_disjoint64_uint64_t_int8_t(i64 %ptr) {
2428; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_int8_t:
2429; CHECK-P10:       # %bb.0: # %entry
2430; CHECK-P10-NEXT:    pli r4, 232
2431; CHECK-P10-NEXT:    pli r5, 3567587329
2432; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2433; CHECK-P10-NEXT:    or r3, r3, r5
2434; CHECK-P10-NEXT:    lbz r3, 0(r3)
2435; CHECK-P10-NEXT:    extsb r3, r3
2436; CHECK-P10-NEXT:    blr
2437;
2438; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_int8_t:
2439; CHECK-PREP10:       # %bb.0: # %entry
2440; CHECK-PREP10-NEXT:    li r4, 29
2441; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2442; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2443; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2444; CHECK-PREP10-NEXT:    or r3, r3, r4
2445; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
2446; CHECK-PREP10-NEXT:    extsb r3, r3
2447; CHECK-PREP10-NEXT:    blr
2448entry:
2449  %or = or i64 %ptr, 1000000000001
2450  %0 = inttoptr i64 %or to ptr
2451  %1 = load atomic i8, ptr %0 monotonic, align 1
2452  %conv = sext i8 %1 to i64
2453  ret i64 %conv
2454}
2455
2456; Function Attrs: nofree norecurse nounwind uwtable willreturn
2457define dso_local i64 @ld_disjoint_align64_uint64_t_int8_t(i64 %ptr) {
2458; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_int8_t:
2459; CHECK-P10:       # %bb.0: # %entry
2460; CHECK-P10-NEXT:    pli r4, 244140625
2461; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2462; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2463; CHECK-P10-NEXT:    lbzx r3, r3, r4
2464; CHECK-P10-NEXT:    extsb r3, r3
2465; CHECK-P10-NEXT:    blr
2466;
2467; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_int8_t:
2468; CHECK-PREP10:       # %bb.0: # %entry
2469; CHECK-PREP10-NEXT:    lis r4, 3725
2470; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2471; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2472; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2473; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2474; CHECK-PREP10-NEXT:    extsb r3, r3
2475; CHECK-PREP10-NEXT:    blr
2476entry:
2477  %and = and i64 %ptr, -1099511627776
2478  %or = or i64 %and, 1000000000000
2479  %0 = inttoptr i64 %or to ptr
2480  %1 = load atomic i8, ptr %0 monotonic, align 4096
2481  %conv = sext i8 %1 to i64
2482  ret i64 %conv
2483}
2484
2485; Function Attrs: nofree norecurse nounwind uwtable willreturn
2486define dso_local i64 @ld_cst_align16_uint64_t_int8_t() {
2487; CHECK-LABEL: ld_cst_align16_uint64_t_int8_t:
2488; CHECK:       # %bb.0: # %entry
2489; CHECK-NEXT:    lbz r3, 4080(0)
2490; CHECK-NEXT:    extsb r3, r3
2491; CHECK-NEXT:    blr
2492entry:
2493  %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
2494  %conv = sext i8 %0 to i64
2495  ret i64 %conv
2496}
2497
2498; Function Attrs: nofree norecurse nounwind uwtable willreturn
2499define dso_local i64 @ld_cst_align32_uint64_t_int8_t() {
2500; CHECK-LABEL: ld_cst_align32_uint64_t_int8_t:
2501; CHECK:       # %bb.0: # %entry
2502; CHECK-NEXT:    lis r3, 153
2503; CHECK-NEXT:    lbz r3, -27108(r3)
2504; CHECK-NEXT:    extsb r3, r3
2505; CHECK-NEXT:    blr
2506entry:
2507  %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
2508  %conv = sext i8 %0 to i64
2509  ret i64 %conv
2510}
2511
2512; Function Attrs: nofree norecurse nounwind uwtable willreturn
2513define dso_local i64 @ld_cst_align64_uint64_t_int8_t() {
2514; CHECK-P10-LABEL: ld_cst_align64_uint64_t_int8_t:
2515; CHECK-P10:       # %bb.0: # %entry
2516; CHECK-P10-NEXT:    pli r3, 244140625
2517; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2518; CHECK-P10-NEXT:    lbz r3, 0(r3)
2519; CHECK-P10-NEXT:    extsb r3, r3
2520; CHECK-P10-NEXT:    blr
2521;
2522; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_int8_t:
2523; CHECK-PREP10:       # %bb.0: # %entry
2524; CHECK-PREP10-NEXT:    lis r3, 3725
2525; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2526; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2527; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
2528; CHECK-PREP10-NEXT:    extsb r3, r3
2529; CHECK-PREP10-NEXT:    blr
2530entry:
2531  %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
2532  %conv = sext i8 %0 to i64
2533  ret i64 %conv
2534}
2535
2536; Function Attrs: nofree norecurse nounwind uwtable willreturn
2537define dso_local i64 @ld_0_uint64_t_uint16_t(i64 %ptr) {
2538; CHECK-LABEL: ld_0_uint64_t_uint16_t:
2539; CHECK:       # %bb.0: # %entry
2540; CHECK-NEXT:    lhz r3, 0(r3)
2541; CHECK-NEXT:    blr
2542entry:
2543  %0 = inttoptr i64 %ptr to ptr
2544  %1 = load atomic i16, ptr %0 monotonic, align 2
2545  %conv = zext i16 %1 to i64
2546  ret i64 %conv
2547}
2548
2549; Function Attrs: nofree norecurse nounwind uwtable willreturn
2550define dso_local i64 @ld_align16_uint64_t_uint16_t(ptr nocapture readonly %ptr) {
2551; CHECK-LABEL: ld_align16_uint64_t_uint16_t:
2552; CHECK:       # %bb.0: # %entry
2553; CHECK-NEXT:    lhz r3, 8(r3)
2554; CHECK-NEXT:    blr
2555entry:
2556  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2557  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2558  %conv = zext i16 %0 to i64
2559  ret i64 %conv
2560}
2561
2562; Function Attrs: nofree norecurse nounwind uwtable willreturn
2563define dso_local i64 @ld_align32_uint64_t_uint16_t(ptr nocapture readonly %ptr) {
2564; CHECK-P10-LABEL: ld_align32_uint64_t_uint16_t:
2565; CHECK-P10:       # %bb.0: # %entry
2566; CHECK-P10-NEXT:    plhz r3, 99999000(r3), 0
2567; CHECK-P10-NEXT:    clrldi r3, r3, 32
2568; CHECK-P10-NEXT:    blr
2569;
2570; CHECK-PREP10-LABEL: ld_align32_uint64_t_uint16_t:
2571; CHECK-PREP10:       # %bb.0: # %entry
2572; CHECK-PREP10-NEXT:    lis r4, 1525
2573; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2574; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
2575; CHECK-PREP10-NEXT:    blr
2576entry:
2577  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2578  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2579  %conv = zext i16 %0 to i64
2580  ret i64 %conv
2581}
2582
2583; Function Attrs: nofree norecurse nounwind uwtable willreturn
2584define dso_local i64 @ld_align64_uint64_t_uint16_t(ptr nocapture readonly %ptr) {
2585; CHECK-P10-LABEL: ld_align64_uint64_t_uint16_t:
2586; CHECK-P10:       # %bb.0: # %entry
2587; CHECK-P10-NEXT:    pli r4, 244140625
2588; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2589; CHECK-P10-NEXT:    lhzx r3, r3, r4
2590; CHECK-P10-NEXT:    blr
2591;
2592; CHECK-PREP10-LABEL: ld_align64_uint64_t_uint16_t:
2593; CHECK-PREP10:       # %bb.0: # %entry
2594; CHECK-PREP10-NEXT:    lis r4, 3725
2595; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2596; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2597; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
2598; CHECK-PREP10-NEXT:    blr
2599entry:
2600  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2601  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2602  %conv = zext i16 %0 to i64
2603  ret i64 %conv
2604}
2605
2606; Function Attrs: nofree norecurse nounwind uwtable willreturn
2607define dso_local i64 @ld_reg_uint64_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) {
2608; CHECK-LABEL: ld_reg_uint64_t_uint16_t:
2609; CHECK:       # %bb.0: # %entry
2610; CHECK-NEXT:    lhzx r3, r3, r4
2611; CHECK-NEXT:    blr
2612entry:
2613  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2614  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2615  %conv = zext i16 %0 to i64
2616  ret i64 %conv
2617}
2618
2619; Function Attrs: nofree norecurse nounwind uwtable willreturn
2620define dso_local i64 @ld_or_uint64_t_uint16_t(i64 %ptr, i8 zeroext %off) {
2621; CHECK-LABEL: ld_or_uint64_t_uint16_t:
2622; CHECK:       # %bb.0: # %entry
2623; CHECK-NEXT:    or r3, r4, r3
2624; CHECK-NEXT:    lhz r3, 0(r3)
2625; CHECK-NEXT:    blr
2626entry:
2627  %conv = zext i8 %off to i64
2628  %or = or i64 %conv, %ptr
2629  %0 = inttoptr i64 %or to ptr
2630  %1 = load atomic i16, ptr %0 monotonic, align 2
2631  %conv1 = zext i16 %1 to i64
2632  ret i64 %conv1
2633}
2634
2635; Function Attrs: nofree norecurse nounwind uwtable willreturn
2636define dso_local i64 @ld_not_disjoint16_uint64_t_uint16_t(i64 %ptr) {
2637; CHECK-LABEL: ld_not_disjoint16_uint64_t_uint16_t:
2638; CHECK:       # %bb.0: # %entry
2639; CHECK-NEXT:    ori r3, r3, 6
2640; CHECK-NEXT:    lhz r3, 0(r3)
2641; CHECK-NEXT:    blr
2642entry:
2643  %or = or i64 %ptr, 6
2644  %0 = inttoptr i64 %or to ptr
2645  %1 = load atomic i16, ptr %0 monotonic, align 2
2646  %conv = zext i16 %1 to i64
2647  ret i64 %conv
2648}
2649
2650; Function Attrs: nofree norecurse nounwind uwtable willreturn
2651define dso_local i64 @ld_disjoint_align16_uint64_t_uint16_t(i64 %ptr) {
2652; CHECK-LABEL: ld_disjoint_align16_uint64_t_uint16_t:
2653; CHECK:       # %bb.0: # %entry
2654; CHECK-NEXT:    rldicr r3, r3, 0, 51
2655; CHECK-NEXT:    lhz r3, 24(r3)
2656; CHECK-NEXT:    blr
2657entry:
2658  %and = and i64 %ptr, -4096
2659  %or = or i64 %and, 24
2660  %0 = inttoptr i64 %or to ptr
2661  %1 = load atomic i16, ptr %0 monotonic, align 8
2662  %conv = zext i16 %1 to i64
2663  ret i64 %conv
2664}
2665
2666; Function Attrs: nofree norecurse nounwind uwtable willreturn
2667define dso_local i64 @ld_not_disjoint32_uint64_t_uint16_t(i64 %ptr) {
2668; CHECK-LABEL: ld_not_disjoint32_uint64_t_uint16_t:
2669; CHECK:       # %bb.0: # %entry
2670; CHECK-NEXT:    ori r3, r3, 34463
2671; CHECK-NEXT:    oris r3, r3, 1
2672; CHECK-NEXT:    lhz r3, 0(r3)
2673; CHECK-NEXT:    blr
2674entry:
2675  %or = or i64 %ptr, 99999
2676  %0 = inttoptr i64 %or to ptr
2677  %1 = load atomic i16, ptr %0 monotonic, align 2
2678  %conv = zext i16 %1 to i64
2679  ret i64 %conv
2680}
2681
2682; Function Attrs: nofree norecurse nounwind uwtable willreturn
2683define dso_local i64 @ld_disjoint_align32_uint64_t_uint16_t(i64 %ptr) {
2684; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_uint16_t:
2685; CHECK-P10:       # %bb.0: # %entry
2686; CHECK-P10-NEXT:    lis r4, -15264
2687; CHECK-P10-NEXT:    and r3, r3, r4
2688; CHECK-P10-NEXT:    plhz r3, 999990000(r3), 0
2689; CHECK-P10-NEXT:    clrldi r3, r3, 32
2690; CHECK-P10-NEXT:    blr
2691;
2692; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_uint16_t:
2693; CHECK-PREP10:       # %bb.0: # %entry
2694; CHECK-PREP10-NEXT:    lis r4, -15264
2695; CHECK-PREP10-NEXT:    and r3, r3, r4
2696; CHECK-PREP10-NEXT:    lis r4, 15258
2697; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2698; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
2699; CHECK-PREP10-NEXT:    blr
2700entry:
2701  %and = and i64 %ptr, -1000341504
2702  %or = or i64 %and, 999990000
2703  %0 = inttoptr i64 %or to ptr
2704  %1 = load atomic i16, ptr %0 monotonic, align 16
2705  %conv = zext i16 %1 to i64
2706  ret i64 %conv
2707}
2708
2709; Function Attrs: nofree norecurse nounwind uwtable willreturn
2710define dso_local i64 @ld_not_disjoint64_uint64_t_uint16_t(i64 %ptr) {
2711; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_uint16_t:
2712; CHECK-P10:       # %bb.0: # %entry
2713; CHECK-P10-NEXT:    pli r4, 232
2714; CHECK-P10-NEXT:    pli r5, 3567587329
2715; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2716; CHECK-P10-NEXT:    or r3, r3, r5
2717; CHECK-P10-NEXT:    lhz r3, 0(r3)
2718; CHECK-P10-NEXT:    blr
2719;
2720; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_uint16_t:
2721; CHECK-PREP10:       # %bb.0: # %entry
2722; CHECK-PREP10-NEXT:    li r4, 29
2723; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2724; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2725; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2726; CHECK-PREP10-NEXT:    or r3, r3, r4
2727; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
2728; CHECK-PREP10-NEXT:    blr
2729entry:
2730  %or = or i64 %ptr, 1000000000001
2731  %0 = inttoptr i64 %or to ptr
2732  %1 = load atomic i16, ptr %0 monotonic, align 2
2733  %conv = zext i16 %1 to i64
2734  ret i64 %conv
2735}
2736
2737; Function Attrs: nofree norecurse nounwind uwtable willreturn
2738define dso_local i64 @ld_disjoint_align64_uint64_t_uint16_t(i64 %ptr) {
2739; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_uint16_t:
2740; CHECK-P10:       # %bb.0: # %entry
2741; CHECK-P10-NEXT:    pli r4, 244140625
2742; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2743; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2744; CHECK-P10-NEXT:    lhzx r3, r3, r4
2745; CHECK-P10-NEXT:    blr
2746;
2747; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_uint16_t:
2748; CHECK-PREP10:       # %bb.0: # %entry
2749; CHECK-PREP10-NEXT:    lis r4, 3725
2750; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2751; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2752; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2753; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
2754; CHECK-PREP10-NEXT:    blr
2755entry:
2756  %and = and i64 %ptr, -1099511627776
2757  %or = or i64 %and, 1000000000000
2758  %0 = inttoptr i64 %or to ptr
2759  %1 = load atomic i16, ptr %0 monotonic, align 4096
2760  %conv = zext i16 %1 to i64
2761  ret i64 %conv
2762}
2763
2764; Function Attrs: nofree norecurse nounwind uwtable willreturn
2765define dso_local i64 @ld_cst_align16_uint64_t_uint16_t() {
2766; CHECK-LABEL: ld_cst_align16_uint64_t_uint16_t:
2767; CHECK:       # %bb.0: # %entry
2768; CHECK-NEXT:    lhz r3, 4080(0)
2769; CHECK-NEXT:    blr
2770entry:
2771  %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
2772  %conv = zext i16 %0 to i64
2773  ret i64 %conv
2774}
2775
2776; Function Attrs: nofree norecurse nounwind uwtable willreturn
2777define dso_local i64 @ld_cst_align32_uint64_t_uint16_t() {
2778; CHECK-LABEL: ld_cst_align32_uint64_t_uint16_t:
2779; CHECK:       # %bb.0: # %entry
2780; CHECK-NEXT:    lis r3, 153
2781; CHECK-NEXT:    lhz r3, -27108(r3)
2782; CHECK-NEXT:    blr
2783entry:
2784  %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
2785  %conv = zext i16 %0 to i64
2786  ret i64 %conv
2787}
2788
2789; Function Attrs: nofree norecurse nounwind uwtable willreturn
2790define dso_local i64 @ld_cst_align64_uint64_t_uint16_t() {
2791; CHECK-P10-LABEL: ld_cst_align64_uint64_t_uint16_t:
2792; CHECK-P10:       # %bb.0: # %entry
2793; CHECK-P10-NEXT:    pli r3, 244140625
2794; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2795; CHECK-P10-NEXT:    lhz r3, 0(r3)
2796; CHECK-P10-NEXT:    blr
2797;
2798; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_uint16_t:
2799; CHECK-PREP10:       # %bb.0: # %entry
2800; CHECK-PREP10-NEXT:    lis r3, 3725
2801; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2802; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2803; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
2804; CHECK-PREP10-NEXT:    blr
2805entry:
2806  %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
2807  %conv = zext i16 %0 to i64
2808  ret i64 %conv
2809}
2810
2811; Function Attrs: nofree norecurse nounwind uwtable willreturn
2812define dso_local i64 @ld_0_uint64_t_int16_t(i64 %ptr) {
2813; CHECK-LABEL: ld_0_uint64_t_int16_t:
2814; CHECK:       # %bb.0: # %entry
2815; CHECK-NEXT:    lhz r3, 0(r3)
2816; CHECK-NEXT:    extsh r3, r3
2817; CHECK-NEXT:    blr
2818entry:
2819  %0 = inttoptr i64 %ptr to ptr
2820  %1 = load atomic i16, ptr %0 monotonic, align 2
2821  %conv = sext i16 %1 to i64
2822  ret i64 %conv
2823}
2824
2825; Function Attrs: nofree norecurse nounwind uwtable willreturn
2826define dso_local i64 @ld_align16_uint64_t_int16_t(ptr nocapture readonly %ptr) {
2827; CHECK-LABEL: ld_align16_uint64_t_int16_t:
2828; CHECK:       # %bb.0: # %entry
2829; CHECK-NEXT:    lhz r3, 8(r3)
2830; CHECK-NEXT:    extsh r3, r3
2831; CHECK-NEXT:    blr
2832entry:
2833  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2834  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2835  %conv = sext i16 %0 to i64
2836  ret i64 %conv
2837}
2838
2839; Function Attrs: nofree norecurse nounwind uwtable willreturn
2840define dso_local i64 @ld_align32_uint64_t_int16_t(ptr nocapture readonly %ptr) {
2841; CHECK-P10-LABEL: ld_align32_uint64_t_int16_t:
2842; CHECK-P10:       # %bb.0: # %entry
2843; CHECK-P10-NEXT:    plhz r3, 99999000(r3), 0
2844; CHECK-P10-NEXT:    extsh r3, r3
2845; CHECK-P10-NEXT:    blr
2846;
2847; CHECK-PREP10-LABEL: ld_align32_uint64_t_int16_t:
2848; CHECK-PREP10:       # %bb.0: # %entry
2849; CHECK-PREP10-NEXT:    lis r4, 1525
2850; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2851; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
2852; CHECK-PREP10-NEXT:    extsh r3, r3
2853; CHECK-PREP10-NEXT:    blr
2854entry:
2855  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2856  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2857  %conv = sext i16 %0 to i64
2858  ret i64 %conv
2859}
2860
2861; Function Attrs: nofree norecurse nounwind uwtable willreturn
2862define dso_local i64 @ld_align64_uint64_t_int16_t(ptr nocapture readonly %ptr) {
2863; CHECK-P10-LABEL: ld_align64_uint64_t_int16_t:
2864; CHECK-P10:       # %bb.0: # %entry
2865; CHECK-P10-NEXT:    pli r4, 244140625
2866; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2867; CHECK-P10-NEXT:    lhzx r3, r3, r4
2868; CHECK-P10-NEXT:    extsh r3, r3
2869; CHECK-P10-NEXT:    blr
2870;
2871; CHECK-PREP10-LABEL: ld_align64_uint64_t_int16_t:
2872; CHECK-PREP10:       # %bb.0: # %entry
2873; CHECK-PREP10-NEXT:    lis r4, 3725
2874; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2875; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2876; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
2877; CHECK-PREP10-NEXT:    extsh r3, r3
2878; CHECK-PREP10-NEXT:    blr
2879entry:
2880  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2881  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2882  %conv = sext i16 %0 to i64
2883  ret i64 %conv
2884}
2885
2886; Function Attrs: nofree norecurse nounwind uwtable willreturn
2887define dso_local i64 @ld_reg_uint64_t_int16_t(ptr nocapture readonly %ptr, i64 %off) {
2888; CHECK-LABEL: ld_reg_uint64_t_int16_t:
2889; CHECK:       # %bb.0: # %entry
2890; CHECK-NEXT:    lhzx r3, r3, r4
2891; CHECK-NEXT:    extsh r3, r3
2892; CHECK-NEXT:    blr
2893entry:
2894  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2895  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2896  %conv = sext i16 %0 to i64
2897  ret i64 %conv
2898}
2899
2900; Function Attrs: nofree norecurse nounwind uwtable willreturn
2901define dso_local i64 @ld_or_uint64_t_int16_t(i64 %ptr, i8 zeroext %off) {
2902; CHECK-LABEL: ld_or_uint64_t_int16_t:
2903; CHECK:       # %bb.0: # %entry
2904; CHECK-NEXT:    or r3, r4, r3
2905; CHECK-NEXT:    lhz r3, 0(r3)
2906; CHECK-NEXT:    extsh r3, r3
2907; CHECK-NEXT:    blr
2908entry:
2909  %conv = zext i8 %off to i64
2910  %or = or i64 %conv, %ptr
2911  %0 = inttoptr i64 %or to ptr
2912  %1 = load atomic i16, ptr %0 monotonic, align 2
2913  %conv1 = sext i16 %1 to i64
2914  ret i64 %conv1
2915}
2916
2917; Function Attrs: nofree norecurse nounwind uwtable willreturn
2918define dso_local i64 @ld_not_disjoint16_uint64_t_int16_t(i64 %ptr) {
2919; CHECK-LABEL: ld_not_disjoint16_uint64_t_int16_t:
2920; CHECK:       # %bb.0: # %entry
2921; CHECK-NEXT:    ori r3, r3, 6
2922; CHECK-NEXT:    lhz r3, 0(r3)
2923; CHECK-NEXT:    extsh r3, r3
2924; CHECK-NEXT:    blr
2925entry:
2926  %or = or i64 %ptr, 6
2927  %0 = inttoptr i64 %or to ptr
2928  %1 = load atomic i16, ptr %0 monotonic, align 2
2929  %conv = sext i16 %1 to i64
2930  ret i64 %conv
2931}
2932
2933; Function Attrs: nofree norecurse nounwind uwtable willreturn
2934define dso_local i64 @ld_disjoint_align16_uint64_t_int16_t(i64 %ptr) {
2935; CHECK-LABEL: ld_disjoint_align16_uint64_t_int16_t:
2936; CHECK:       # %bb.0: # %entry
2937; CHECK-NEXT:    rldicr r3, r3, 0, 51
2938; CHECK-NEXT:    lhz r3, 24(r3)
2939; CHECK-NEXT:    extsh r3, r3
2940; CHECK-NEXT:    blr
2941entry:
2942  %and = and i64 %ptr, -4096
2943  %or = or i64 %and, 24
2944  %0 = inttoptr i64 %or to ptr
2945  %1 = load atomic i16, ptr %0 monotonic, align 8
2946  %conv = sext i16 %1 to i64
2947  ret i64 %conv
2948}
2949
2950; Function Attrs: nofree norecurse nounwind uwtable willreturn
2951define dso_local i64 @ld_not_disjoint32_uint64_t_int16_t(i64 %ptr) {
2952; CHECK-LABEL: ld_not_disjoint32_uint64_t_int16_t:
2953; CHECK:       # %bb.0: # %entry
2954; CHECK-NEXT:    ori r3, r3, 34463
2955; CHECK-NEXT:    oris r3, r3, 1
2956; CHECK-NEXT:    lhz r3, 0(r3)
2957; CHECK-NEXT:    extsh r3, r3
2958; CHECK-NEXT:    blr
2959entry:
2960  %or = or i64 %ptr, 99999
2961  %0 = inttoptr i64 %or to ptr
2962  %1 = load atomic i16, ptr %0 monotonic, align 2
2963  %conv = sext i16 %1 to i64
2964  ret i64 %conv
2965}
2966
2967; Function Attrs: nofree norecurse nounwind uwtable willreturn
2968define dso_local i64 @ld_disjoint_align32_uint64_t_int16_t(i64 %ptr) {
2969; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_int16_t:
2970; CHECK-P10:       # %bb.0: # %entry
2971; CHECK-P10-NEXT:    lis r4, -15264
2972; CHECK-P10-NEXT:    and r3, r3, r4
2973; CHECK-P10-NEXT:    plhz r3, 999990000(r3), 0
2974; CHECK-P10-NEXT:    extsh r3, r3
2975; CHECK-P10-NEXT:    blr
2976;
2977; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_int16_t:
2978; CHECK-PREP10:       # %bb.0: # %entry
2979; CHECK-PREP10-NEXT:    lis r4, -15264
2980; CHECK-PREP10-NEXT:    and r3, r3, r4
2981; CHECK-PREP10-NEXT:    lis r4, 15258
2982; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2983; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
2984; CHECK-PREP10-NEXT:    extsh r3, r3
2985; CHECK-PREP10-NEXT:    blr
2986entry:
2987  %and = and i64 %ptr, -1000341504
2988  %or = or i64 %and, 999990000
2989  %0 = inttoptr i64 %or to ptr
2990  %1 = load atomic i16, ptr %0 monotonic, align 16
2991  %conv = sext i16 %1 to i64
2992  ret i64 %conv
2993}
2994
2995; Function Attrs: nofree norecurse nounwind uwtable willreturn
2996define dso_local i64 @ld_not_disjoint64_uint64_t_int16_t(i64 %ptr) {
2997; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_int16_t:
2998; CHECK-P10:       # %bb.0: # %entry
2999; CHECK-P10-NEXT:    pli r4, 232
3000; CHECK-P10-NEXT:    pli r5, 3567587329
3001; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
3002; CHECK-P10-NEXT:    or r3, r3, r5
3003; CHECK-P10-NEXT:    lhz r3, 0(r3)
3004; CHECK-P10-NEXT:    extsh r3, r3
3005; CHECK-P10-NEXT:    blr
3006;
3007; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_int16_t:
3008; CHECK-PREP10:       # %bb.0: # %entry
3009; CHECK-PREP10-NEXT:    li r4, 29
3010; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
3011; CHECK-PREP10-NEXT:    oris r4, r4, 54437
3012; CHECK-PREP10-NEXT:    ori r4, r4, 4097
3013; CHECK-PREP10-NEXT:    or r3, r3, r4
3014; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
3015; CHECK-PREP10-NEXT:    extsh r3, r3
3016; CHECK-PREP10-NEXT:    blr
3017entry:
3018  %or = or i64 %ptr, 1000000000001
3019  %0 = inttoptr i64 %or to ptr
3020  %1 = load atomic i16, ptr %0 monotonic, align 2
3021  %conv = sext i16 %1 to i64
3022  ret i64 %conv
3023}
3024
3025; Function Attrs: nofree norecurse nounwind uwtable willreturn
3026define dso_local i64 @ld_disjoint_align64_uint64_t_int16_t(i64 %ptr) {
3027; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_int16_t:
3028; CHECK-P10:       # %bb.0: # %entry
3029; CHECK-P10-NEXT:    pli r4, 244140625
3030; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3031; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3032; CHECK-P10-NEXT:    lhzx r3, r3, r4
3033; CHECK-P10-NEXT:    extsh r3, r3
3034; CHECK-P10-NEXT:    blr
3035;
3036; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_int16_t:
3037; CHECK-PREP10:       # %bb.0: # %entry
3038; CHECK-PREP10-NEXT:    lis r4, 3725
3039; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3040; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3041; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3042; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
3043; CHECK-PREP10-NEXT:    extsh r3, r3
3044; CHECK-PREP10-NEXT:    blr
3045entry:
3046  %and = and i64 %ptr, -1099511627776
3047  %or = or i64 %and, 1000000000000
3048  %0 = inttoptr i64 %or to ptr
3049  %1 = load atomic i16, ptr %0 monotonic, align 4096
3050  %conv = sext i16 %1 to i64
3051  ret i64 %conv
3052}
3053
3054; Function Attrs: nofree norecurse nounwind uwtable willreturn
3055define dso_local i64 @ld_cst_align16_uint64_t_int16_t() {
3056; CHECK-LABEL: ld_cst_align16_uint64_t_int16_t:
3057; CHECK:       # %bb.0: # %entry
3058; CHECK-NEXT:    lhz r3, 4080(0)
3059; CHECK-NEXT:    extsh r3, r3
3060; CHECK-NEXT:    blr
3061entry:
3062  %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
3063  %conv = sext i16 %0 to i64
3064  ret i64 %conv
3065}
3066
3067; Function Attrs: nofree norecurse nounwind uwtable willreturn
3068define dso_local i64 @ld_cst_align32_uint64_t_int16_t() {
3069; CHECK-LABEL: ld_cst_align32_uint64_t_int16_t:
3070; CHECK:       # %bb.0: # %entry
3071; CHECK-NEXT:    lis r3, 153
3072; CHECK-NEXT:    lhz r3, -27108(r3)
3073; CHECK-NEXT:    extsh r3, r3
3074; CHECK-NEXT:    blr
3075entry:
3076  %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
3077  %conv = sext i16 %0 to i64
3078  ret i64 %conv
3079}
3080
3081; Function Attrs: nofree norecurse nounwind uwtable willreturn
3082define dso_local i64 @ld_cst_align64_uint64_t_int16_t() {
3083; CHECK-P10-LABEL: ld_cst_align64_uint64_t_int16_t:
3084; CHECK-P10:       # %bb.0: # %entry
3085; CHECK-P10-NEXT:    pli r3, 244140625
3086; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
3087; CHECK-P10-NEXT:    lhz r3, 0(r3)
3088; CHECK-P10-NEXT:    extsh r3, r3
3089; CHECK-P10-NEXT:    blr
3090;
3091; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_int16_t:
3092; CHECK-PREP10:       # %bb.0: # %entry
3093; CHECK-PREP10-NEXT:    lis r3, 3725
3094; CHECK-PREP10-NEXT:    ori r3, r3, 19025
3095; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
3096; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
3097; CHECK-PREP10-NEXT:    extsh r3, r3
3098; CHECK-PREP10-NEXT:    blr
3099entry:
3100  %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
3101  %conv = sext i16 %0 to i64
3102  ret i64 %conv
3103}
3104
3105; Function Attrs: nofree norecurse nounwind uwtable willreturn
3106define dso_local i64 @ld_0_uint64_t_uint32_t(i64 %ptr) {
3107; CHECK-LABEL: ld_0_uint64_t_uint32_t:
3108; CHECK:       # %bb.0: # %entry
3109; CHECK-NEXT:    lwz r3, 0(r3)
3110; CHECK-NEXT:    blr
3111entry:
3112  %0 = inttoptr i64 %ptr to ptr
3113  %1 = load atomic i32, ptr %0 monotonic, align 4
3114  %conv = zext i32 %1 to i64
3115  ret i64 %conv
3116}
3117
3118; Function Attrs: nofree norecurse nounwind uwtable willreturn
3119define dso_local i64 @ld_align16_uint64_t_uint32_t(ptr nocapture readonly %ptr) {
3120; CHECK-LABEL: ld_align16_uint64_t_uint32_t:
3121; CHECK:       # %bb.0: # %entry
3122; CHECK-NEXT:    lwz r3, 8(r3)
3123; CHECK-NEXT:    blr
3124entry:
3125  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3126  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
3127  %conv = zext i32 %0 to i64
3128  ret i64 %conv
3129}
3130
3131; Function Attrs: nofree norecurse nounwind uwtable willreturn
3132define dso_local i64 @ld_align32_uint64_t_uint32_t(ptr nocapture readonly %ptr) {
3133; CHECK-P10-LABEL: ld_align32_uint64_t_uint32_t:
3134; CHECK-P10:       # %bb.0: # %entry
3135; CHECK-P10-NEXT:    plwz r3, 99999000(r3), 0
3136; CHECK-P10-NEXT:    clrldi r3, r3, 32
3137; CHECK-P10-NEXT:    blr
3138;
3139; CHECK-PREP10-LABEL: ld_align32_uint64_t_uint32_t:
3140; CHECK-PREP10:       # %bb.0: # %entry
3141; CHECK-PREP10-NEXT:    lis r4, 1525
3142; CHECK-PREP10-NEXT:    ori r4, r4, 56600
3143; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
3144; CHECK-PREP10-NEXT:    blr
3145entry:
3146  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3147  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
3148  %conv = zext i32 %0 to i64
3149  ret i64 %conv
3150}
3151
3152; Function Attrs: nofree norecurse nounwind uwtable willreturn
3153define dso_local i64 @ld_align64_uint64_t_uint32_t(ptr nocapture readonly %ptr) {
3154; CHECK-P10-LABEL: ld_align64_uint64_t_uint32_t:
3155; CHECK-P10:       # %bb.0: # %entry
3156; CHECK-P10-NEXT:    pli r4, 244140625
3157; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3158; CHECK-P10-NEXT:    lwzx r3, r3, r4
3159; CHECK-P10-NEXT:    blr
3160;
3161; CHECK-PREP10-LABEL: ld_align64_uint64_t_uint32_t:
3162; CHECK-PREP10:       # %bb.0: # %entry
3163; CHECK-PREP10-NEXT:    lis r4, 3725
3164; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3165; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3166; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
3167; CHECK-PREP10-NEXT:    blr
3168entry:
3169  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3170  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
3171  %conv = zext i32 %0 to i64
3172  ret i64 %conv
3173}
3174
3175; Function Attrs: nofree norecurse nounwind uwtable willreturn
3176define dso_local i64 @ld_reg_uint64_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) {
3177; CHECK-LABEL: ld_reg_uint64_t_uint32_t:
3178; CHECK:       # %bb.0: # %entry
3179; CHECK-NEXT:    lwzx r3, r3, r4
3180; CHECK-NEXT:    blr
3181entry:
3182  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3183  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
3184  %conv = zext i32 %0 to i64
3185  ret i64 %conv
3186}
3187
3188; Function Attrs: nofree norecurse nounwind uwtable willreturn
3189define dso_local i64 @ld_or_uint64_t_uint32_t(i64 %ptr, i8 zeroext %off) {
3190; CHECK-LABEL: ld_or_uint64_t_uint32_t:
3191; CHECK:       # %bb.0: # %entry
3192; CHECK-NEXT:    or r3, r4, r3
3193; CHECK-NEXT:    lwz r3, 0(r3)
3194; CHECK-NEXT:    blr
3195entry:
3196  %conv = zext i8 %off to i64
3197  %or = or i64 %conv, %ptr
3198  %0 = inttoptr i64 %or to ptr
3199  %1 = load atomic i32, ptr %0 monotonic, align 4
3200  %conv1 = zext i32 %1 to i64
3201  ret i64 %conv1
3202}
3203
3204; Function Attrs: nofree norecurse nounwind uwtable willreturn
3205define dso_local i64 @ld_not_disjoint16_uint64_t_uint32_t(i64 %ptr) {
3206; CHECK-LABEL: ld_not_disjoint16_uint64_t_uint32_t:
3207; CHECK:       # %bb.0: # %entry
3208; CHECK-NEXT:    ori r3, r3, 6
3209; CHECK-NEXT:    lwz r3, 0(r3)
3210; CHECK-NEXT:    blr
3211entry:
3212  %or = or i64 %ptr, 6
3213  %0 = inttoptr i64 %or to ptr
3214  %1 = load atomic i32, ptr %0 monotonic, align 4
3215  %conv = zext i32 %1 to i64
3216  ret i64 %conv
3217}
3218
3219; Function Attrs: nofree norecurse nounwind uwtable willreturn
3220define dso_local i64 @ld_disjoint_align16_uint64_t_uint32_t(i64 %ptr) {
3221; CHECK-LABEL: ld_disjoint_align16_uint64_t_uint32_t:
3222; CHECK:       # %bb.0: # %entry
3223; CHECK-NEXT:    rldicr r3, r3, 0, 51
3224; CHECK-NEXT:    lwz r3, 24(r3)
3225; CHECK-NEXT:    blr
3226entry:
3227  %and = and i64 %ptr, -4096
3228  %or = or i64 %and, 24
3229  %0 = inttoptr i64 %or to ptr
3230  %1 = load atomic i32, ptr %0 monotonic, align 8
3231  %conv = zext i32 %1 to i64
3232  ret i64 %conv
3233}
3234
3235; Function Attrs: nofree norecurse nounwind uwtable willreturn
3236define dso_local i64 @ld_not_disjoint32_uint64_t_uint32_t(i64 %ptr) {
3237; CHECK-LABEL: ld_not_disjoint32_uint64_t_uint32_t:
3238; CHECK:       # %bb.0: # %entry
3239; CHECK-NEXT:    ori r3, r3, 34463
3240; CHECK-NEXT:    oris r3, r3, 1
3241; CHECK-NEXT:    lwz r3, 0(r3)
3242; CHECK-NEXT:    blr
3243entry:
3244  %or = or i64 %ptr, 99999
3245  %0 = inttoptr i64 %or to ptr
3246  %1 = load atomic i32, ptr %0 monotonic, align 4
3247  %conv = zext i32 %1 to i64
3248  ret i64 %conv
3249}
3250
3251; Function Attrs: nofree norecurse nounwind uwtable willreturn
3252define dso_local i64 @ld_disjoint_align32_uint64_t_uint32_t(i64 %ptr) {
3253; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_uint32_t:
3254; CHECK-P10:       # %bb.0: # %entry
3255; CHECK-P10-NEXT:    lis r4, -15264
3256; CHECK-P10-NEXT:    and r3, r3, r4
3257; CHECK-P10-NEXT:    plwz r3, 999990000(r3), 0
3258; CHECK-P10-NEXT:    clrldi r3, r3, 32
3259; CHECK-P10-NEXT:    blr
3260;
3261; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_uint32_t:
3262; CHECK-PREP10:       # %bb.0: # %entry
3263; CHECK-PREP10-NEXT:    lis r4, -15264
3264; CHECK-PREP10-NEXT:    and r3, r3, r4
3265; CHECK-PREP10-NEXT:    lis r4, 15258
3266; CHECK-PREP10-NEXT:    ori r4, r4, 41712
3267; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
3268; CHECK-PREP10-NEXT:    blr
3269entry:
3270  %and = and i64 %ptr, -1000341504
3271  %or = or i64 %and, 999990000
3272  %0 = inttoptr i64 %or to ptr
3273  %1 = load atomic i32, ptr %0 monotonic, align 16
3274  %conv = zext i32 %1 to i64
3275  ret i64 %conv
3276}
3277
3278; Function Attrs: nofree norecurse nounwind uwtable willreturn
3279define dso_local i64 @ld_not_disjoint64_uint64_t_uint32_t(i64 %ptr) {
3280; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_uint32_t:
3281; CHECK-P10:       # %bb.0: # %entry
3282; CHECK-P10-NEXT:    pli r4, 232
3283; CHECK-P10-NEXT:    pli r5, 3567587329
3284; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
3285; CHECK-P10-NEXT:    or r3, r3, r5
3286; CHECK-P10-NEXT:    lwz r3, 0(r3)
3287; CHECK-P10-NEXT:    blr
3288;
3289; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_uint32_t:
3290; CHECK-PREP10:       # %bb.0: # %entry
3291; CHECK-PREP10-NEXT:    li r4, 29
3292; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
3293; CHECK-PREP10-NEXT:    oris r4, r4, 54437
3294; CHECK-PREP10-NEXT:    ori r4, r4, 4097
3295; CHECK-PREP10-NEXT:    or r3, r3, r4
3296; CHECK-PREP10-NEXT:    lwz r3, 0(r3)
3297; CHECK-PREP10-NEXT:    blr
3298entry:
3299  %or = or i64 %ptr, 1000000000001
3300  %0 = inttoptr i64 %or to ptr
3301  %1 = load atomic i32, ptr %0 monotonic, align 4
3302  %conv = zext i32 %1 to i64
3303  ret i64 %conv
3304}
3305
3306; Function Attrs: nofree norecurse nounwind uwtable willreturn
3307define dso_local i64 @ld_disjoint_align64_uint64_t_uint32_t(i64 %ptr) {
3308; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_uint32_t:
3309; CHECK-P10:       # %bb.0: # %entry
3310; CHECK-P10-NEXT:    pli r4, 244140625
3311; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3312; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3313; CHECK-P10-NEXT:    lwzx r3, r3, r4
3314; CHECK-P10-NEXT:    blr
3315;
3316; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_uint32_t:
3317; CHECK-PREP10:       # %bb.0: # %entry
3318; CHECK-PREP10-NEXT:    lis r4, 3725
3319; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3320; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3321; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3322; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
3323; CHECK-PREP10-NEXT:    blr
3324entry:
3325  %and = and i64 %ptr, -1099511627776
3326  %or = or i64 %and, 1000000000000
3327  %0 = inttoptr i64 %or to ptr
3328  %1 = load atomic i32, ptr %0 monotonic, align 4096
3329  %conv = zext i32 %1 to i64
3330  ret i64 %conv
3331}
3332
3333; Function Attrs: nofree norecurse nounwind uwtable willreturn
3334define dso_local i64 @ld_cst_align16_uint64_t_uint32_t() {
3335; CHECK-LABEL: ld_cst_align16_uint64_t_uint32_t:
3336; CHECK:       # %bb.0: # %entry
3337; CHECK-NEXT:    lwz r3, 4080(0)
3338; CHECK-NEXT:    blr
3339entry:
3340  %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
3341  %conv = zext i32 %0 to i64
3342  ret i64 %conv
3343}
3344
3345; Function Attrs: nofree norecurse nounwind uwtable willreturn
3346define dso_local i64 @ld_cst_align32_uint64_t_uint32_t() {
3347; CHECK-LABEL: ld_cst_align32_uint64_t_uint32_t:
3348; CHECK:       # %bb.0: # %entry
3349; CHECK-NEXT:    lis r3, 153
3350; CHECK-NEXT:    lwz r3, -27108(r3)
3351; CHECK-NEXT:    blr
3352entry:
3353  %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
3354  %conv = zext i32 %0 to i64
3355  ret i64 %conv
3356}
3357
3358; Function Attrs: nofree norecurse nounwind uwtable willreturn
3359define dso_local i64 @ld_cst_align64_uint64_t_uint32_t() {
3360; CHECK-P10-LABEL: ld_cst_align64_uint64_t_uint32_t:
3361; CHECK-P10:       # %bb.0: # %entry
3362; CHECK-P10-NEXT:    pli r3, 244140625
3363; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
3364; CHECK-P10-NEXT:    lwz r3, 0(r3)
3365; CHECK-P10-NEXT:    blr
3366;
3367; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_uint32_t:
3368; CHECK-PREP10:       # %bb.0: # %entry
3369; CHECK-PREP10-NEXT:    lis r3, 3725
3370; CHECK-PREP10-NEXT:    ori r3, r3, 19025
3371; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
3372; CHECK-PREP10-NEXT:    lwz r3, 0(r3)
3373; CHECK-PREP10-NEXT:    blr
3374entry:
3375  %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
3376  %conv = zext i32 %0 to i64
3377  ret i64 %conv
3378}
3379
3380; Function Attrs: nofree norecurse nounwind uwtable willreturn
3381define dso_local i64 @ld_0_uint64_t_int32_t(i64 %ptr) {
3382; CHECK-LABEL: ld_0_uint64_t_int32_t:
3383; CHECK:       # %bb.0: # %entry
3384; CHECK-NEXT:    lwa r3, 0(r3)
3385; CHECK-NEXT:    blr
3386entry:
3387  %0 = inttoptr i64 %ptr to ptr
3388  %1 = load atomic i32, ptr %0 monotonic, align 4
3389  %conv = sext i32 %1 to i64
3390  ret i64 %conv
3391}
3392
3393; Function Attrs: nofree norecurse nounwind uwtable willreturn
3394define dso_local i64 @ld_align16_uint64_t_int32_t(ptr nocapture readonly %ptr) {
3395; CHECK-LABEL: ld_align16_uint64_t_int32_t:
3396; CHECK:       # %bb.0: # %entry
3397; CHECK-NEXT:    lwa r3, 8(r3)
3398; CHECK-NEXT:    blr
3399entry:
3400  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3401  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
3402  %conv = sext i32 %0 to i64
3403  ret i64 %conv
3404}
3405
3406; Function Attrs: nofree norecurse nounwind uwtable willreturn
3407define dso_local i64 @ld_align32_uint64_t_int32_t(ptr nocapture readonly %ptr) {
3408; CHECK-P10-LABEL: ld_align32_uint64_t_int32_t:
3409; CHECK-P10:       # %bb.0: # %entry
3410; CHECK-P10-NEXT:    plwz r3, 99999000(r3), 0
3411; CHECK-P10-NEXT:    extsw r3, r3
3412; CHECK-P10-NEXT:    blr
3413;
3414; CHECK-PREP10-LABEL: ld_align32_uint64_t_int32_t:
3415; CHECK-PREP10:       # %bb.0: # %entry
3416; CHECK-PREP10-NEXT:    lis r4, 1525
3417; CHECK-PREP10-NEXT:    ori r4, r4, 56600
3418; CHECK-PREP10-NEXT:    lwax r3, r3, r4
3419; CHECK-PREP10-NEXT:    blr
3420entry:
3421  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3422  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
3423  %conv = sext i32 %0 to i64
3424  ret i64 %conv
3425}
3426
3427; Function Attrs: nofree norecurse nounwind uwtable willreturn
3428define dso_local i64 @ld_align64_uint64_t_int32_t(ptr nocapture readonly %ptr) {
3429; CHECK-P10-LABEL: ld_align64_uint64_t_int32_t:
3430; CHECK-P10:       # %bb.0: # %entry
3431; CHECK-P10-NEXT:    pli r4, 244140625
3432; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3433; CHECK-P10-NEXT:    lwax r3, r3, r4
3434; CHECK-P10-NEXT:    blr
3435;
3436; CHECK-PREP10-LABEL: ld_align64_uint64_t_int32_t:
3437; CHECK-PREP10:       # %bb.0: # %entry
3438; CHECK-PREP10-NEXT:    lis r4, 3725
3439; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3440; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3441; CHECK-PREP10-NEXT:    lwax r3, r3, r4
3442; CHECK-PREP10-NEXT:    blr
3443entry:
3444  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3445  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
3446  %conv = sext i32 %0 to i64
3447  ret i64 %conv
3448}
3449
3450; Function Attrs: nofree norecurse nounwind uwtable willreturn
3451define dso_local i64 @ld_reg_uint64_t_int32_t(ptr nocapture readonly %ptr, i64 %off) {
3452; CHECK-LABEL: ld_reg_uint64_t_int32_t:
3453; CHECK:       # %bb.0: # %entry
3454; CHECK-NEXT:    lwax r3, r3, r4
3455; CHECK-NEXT:    blr
3456entry:
3457  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3458  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
3459  %conv = sext i32 %0 to i64
3460  ret i64 %conv
3461}
3462
3463; Function Attrs: nofree norecurse nounwind uwtable willreturn
3464define dso_local i64 @ld_or_uint64_t_int32_t(i64 %ptr, i8 zeroext %off) {
3465; CHECK-LABEL: ld_or_uint64_t_int32_t:
3466; CHECK:       # %bb.0: # %entry
3467; CHECK-NEXT:    or r3, r4, r3
3468; CHECK-NEXT:    lwa r3, 0(r3)
3469; CHECK-NEXT:    blr
3470entry:
3471  %conv = zext i8 %off to i64
3472  %or = or i64 %conv, %ptr
3473  %0 = inttoptr i64 %or to ptr
3474  %1 = load atomic i32, ptr %0 monotonic, align 4
3475  %conv1 = sext i32 %1 to i64
3476  ret i64 %conv1
3477}
3478
3479; Function Attrs: nofree norecurse nounwind uwtable willreturn
3480define dso_local i64 @ld_not_disjoint16_uint64_t_int32_t(i64 %ptr) {
3481; CHECK-LABEL: ld_not_disjoint16_uint64_t_int32_t:
3482; CHECK:       # %bb.0: # %entry
3483; CHECK-NEXT:    ori r3, r3, 6
3484; CHECK-NEXT:    lwa r3, 0(r3)
3485; CHECK-NEXT:    blr
3486entry:
3487  %or = or i64 %ptr, 6
3488  %0 = inttoptr i64 %or to ptr
3489  %1 = load atomic i32, ptr %0 monotonic, align 4
3490  %conv = sext i32 %1 to i64
3491  ret i64 %conv
3492}
3493
3494; Function Attrs: nofree norecurse nounwind uwtable willreturn
3495define dso_local i64 @ld_disjoint_align16_uint64_t_int32_t(i64 %ptr) {
3496; CHECK-LABEL: ld_disjoint_align16_uint64_t_int32_t:
3497; CHECK:       # %bb.0: # %entry
3498; CHECK-NEXT:    rldicr r3, r3, 0, 51
3499; CHECK-NEXT:    lwa r3, 24(r3)
3500; CHECK-NEXT:    blr
3501entry:
3502  %and = and i64 %ptr, -4096
3503  %or = or i64 %and, 24
3504  %0 = inttoptr i64 %or to ptr
3505  %1 = load atomic i32, ptr %0 monotonic, align 8
3506  %conv = sext i32 %1 to i64
3507  ret i64 %conv
3508}
3509
3510; Function Attrs: nofree norecurse nounwind uwtable willreturn
3511define dso_local i64 @ld_not_disjoint32_uint64_t_int32_t(i64 %ptr) {
3512; CHECK-LABEL: ld_not_disjoint32_uint64_t_int32_t:
3513; CHECK:       # %bb.0: # %entry
3514; CHECK-NEXT:    ori r3, r3, 34463
3515; CHECK-NEXT:    oris r3, r3, 1
3516; CHECK-NEXT:    lwa r3, 0(r3)
3517; CHECK-NEXT:    blr
3518entry:
3519  %or = or i64 %ptr, 99999
3520  %0 = inttoptr i64 %or to ptr
3521  %1 = load atomic i32, ptr %0 monotonic, align 4
3522  %conv = sext i32 %1 to i64
3523  ret i64 %conv
3524}
3525
3526; Function Attrs: nofree norecurse nounwind uwtable willreturn
3527define dso_local i64 @ld_disjoint_align32_uint64_t_int32_t(i64 %ptr) {
3528; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_int32_t:
3529; CHECK-P10:       # %bb.0: # %entry
3530; CHECK-P10-NEXT:    lis r4, -15264
3531; CHECK-P10-NEXT:    and r3, r3, r4
3532; CHECK-P10-NEXT:    plwz r3, 999990000(r3), 0
3533; CHECK-P10-NEXT:    extsw r3, r3
3534; CHECK-P10-NEXT:    blr
3535;
3536; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_int32_t:
3537; CHECK-PREP10:       # %bb.0: # %entry
3538; CHECK-PREP10-NEXT:    lis r4, -15264
3539; CHECK-PREP10-NEXT:    and r3, r3, r4
3540; CHECK-PREP10-NEXT:    lis r4, 15258
3541; CHECK-PREP10-NEXT:    ori r4, r4, 41712
3542; CHECK-PREP10-NEXT:    lwax r3, r3, r4
3543; CHECK-PREP10-NEXT:    blr
3544entry:
3545  %and = and i64 %ptr, -1000341504
3546  %or = or i64 %and, 999990000
3547  %0 = inttoptr i64 %or to ptr
3548  %1 = load atomic i32, ptr %0 monotonic, align 16
3549  %conv = sext i32 %1 to i64
3550  ret i64 %conv
3551}
3552
3553; Function Attrs: nofree norecurse nounwind uwtable willreturn
3554define dso_local i64 @ld_not_disjoint64_uint64_t_int32_t(i64 %ptr) {
3555; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_int32_t:
3556; CHECK-P10:       # %bb.0: # %entry
3557; CHECK-P10-NEXT:    pli r4, 232
3558; CHECK-P10-NEXT:    pli r5, 3567587329
3559; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
3560; CHECK-P10-NEXT:    or r3, r3, r5
3561; CHECK-P10-NEXT:    lwa r3, 0(r3)
3562; CHECK-P10-NEXT:    blr
3563;
3564; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_int32_t:
3565; CHECK-PREP10:       # %bb.0: # %entry
3566; CHECK-PREP10-NEXT:    li r4, 29
3567; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
3568; CHECK-PREP10-NEXT:    oris r4, r4, 54437
3569; CHECK-PREP10-NEXT:    ori r4, r4, 4097
3570; CHECK-PREP10-NEXT:    or r3, r3, r4
3571; CHECK-PREP10-NEXT:    lwa r3, 0(r3)
3572; CHECK-PREP10-NEXT:    blr
3573entry:
3574  %or = or i64 %ptr, 1000000000001
3575  %0 = inttoptr i64 %or to ptr
3576  %1 = load atomic i32, ptr %0 monotonic, align 4
3577  %conv = sext i32 %1 to i64
3578  ret i64 %conv
3579}
3580
3581; Function Attrs: nofree norecurse nounwind uwtable willreturn
3582define dso_local i64 @ld_disjoint_align64_uint64_t_int32_t(i64 %ptr) {
3583; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_int32_t:
3584; CHECK-P10:       # %bb.0: # %entry
3585; CHECK-P10-NEXT:    pli r4, 244140625
3586; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3587; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3588; CHECK-P10-NEXT:    lwax r3, r3, r4
3589; CHECK-P10-NEXT:    blr
3590;
3591; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_int32_t:
3592; CHECK-PREP10:       # %bb.0: # %entry
3593; CHECK-PREP10-NEXT:    lis r4, 3725
3594; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3595; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3596; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3597; CHECK-PREP10-NEXT:    lwax r3, r3, r4
3598; CHECK-PREP10-NEXT:    blr
3599entry:
3600  %and = and i64 %ptr, -1099511627776
3601  %or = or i64 %and, 1000000000000
3602  %0 = inttoptr i64 %or to ptr
3603  %1 = load atomic i32, ptr %0 monotonic, align 4096
3604  %conv = sext i32 %1 to i64
3605  ret i64 %conv
3606}
3607
3608; Function Attrs: nofree norecurse nounwind uwtable willreturn
3609define dso_local i64 @ld_cst_align16_uint64_t_int32_t() {
3610; CHECK-LABEL: ld_cst_align16_uint64_t_int32_t:
3611; CHECK:       # %bb.0: # %entry
3612; CHECK-NEXT:    lwa r3, 4080(0)
3613; CHECK-NEXT:    blr
3614entry:
3615  %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
3616  %conv = sext i32 %0 to i64
3617  ret i64 %conv
3618}
3619
3620; Function Attrs: nofree norecurse nounwind uwtable willreturn
3621define dso_local i64 @ld_cst_align32_uint64_t_int32_t() {
3622; CHECK-LABEL: ld_cst_align32_uint64_t_int32_t:
3623; CHECK:       # %bb.0: # %entry
3624; CHECK-NEXT:    lis r3, 153
3625; CHECK-NEXT:    lwa r3, -27108(r3)
3626; CHECK-NEXT:    blr
3627entry:
3628  %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
3629  %conv = sext i32 %0 to i64
3630  ret i64 %conv
3631}
3632
3633; Function Attrs: nofree norecurse nounwind uwtable willreturn
3634define dso_local i64 @ld_cst_align64_uint64_t_int32_t() {
3635; CHECK-P10-LABEL: ld_cst_align64_uint64_t_int32_t:
3636; CHECK-P10:       # %bb.0: # %entry
3637; CHECK-P10-NEXT:    pli r3, 244140625
3638; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
3639; CHECK-P10-NEXT:    lwa r3, 0(r3)
3640; CHECK-P10-NEXT:    blr
3641;
3642; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_int32_t:
3643; CHECK-PREP10:       # %bb.0: # %entry
3644; CHECK-PREP10-NEXT:    lis r3, 3725
3645; CHECK-PREP10-NEXT:    ori r3, r3, 19025
3646; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
3647; CHECK-PREP10-NEXT:    lwa r3, 0(r3)
3648; CHECK-PREP10-NEXT:    blr
3649entry:
3650  %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
3651  %conv = sext i32 %0 to i64
3652  ret i64 %conv
3653}
3654
3655; Function Attrs: nofree norecurse nounwind uwtable willreturn
3656define dso_local i64 @ld_0_uint64_t_uint64_t(i64 %ptr) {
3657; CHECK-LABEL: ld_0_uint64_t_uint64_t:
3658; CHECK:       # %bb.0: # %entry
3659; CHECK-NEXT:    ld r3, 0(r3)
3660; CHECK-NEXT:    blr
3661entry:
3662  %0 = inttoptr i64 %ptr to ptr
3663  %1 = load atomic i64, ptr %0 monotonic, align 8
3664  ret i64 %1
3665}
3666
3667; Function Attrs: nofree norecurse nounwind uwtable willreturn
3668define dso_local i64 @ld_align16_uint64_t_uint64_t(ptr nocapture readonly %ptr) {
3669; CHECK-LABEL: ld_align16_uint64_t_uint64_t:
3670; CHECK:       # %bb.0: # %entry
3671; CHECK-NEXT:    ld r3, 8(r3)
3672; CHECK-NEXT:    blr
3673entry:
3674  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3675  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
3676  ret i64 %0
3677}
3678
3679; Function Attrs: nofree norecurse nounwind uwtable willreturn
3680define dso_local i64 @ld_align32_uint64_t_uint64_t(ptr nocapture readonly %ptr) {
3681; CHECK-P10-LABEL: ld_align32_uint64_t_uint64_t:
3682; CHECK-P10:       # %bb.0: # %entry
3683; CHECK-P10-NEXT:    pld r3, 99999000(r3), 0
3684; CHECK-P10-NEXT:    blr
3685;
3686; CHECK-PREP10-LABEL: ld_align32_uint64_t_uint64_t:
3687; CHECK-PREP10:       # %bb.0: # %entry
3688; CHECK-PREP10-NEXT:    lis r4, 1525
3689; CHECK-PREP10-NEXT:    ori r4, r4, 56600
3690; CHECK-PREP10-NEXT:    ldx r3, r3, r4
3691; CHECK-PREP10-NEXT:    blr
3692entry:
3693  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3694  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
3695  ret i64 %0
3696}
3697
3698; Function Attrs: nofree norecurse nounwind uwtable willreturn
3699define dso_local i64 @ld_align64_uint64_t_uint64_t(ptr nocapture readonly %ptr) {
3700; CHECK-P10-LABEL: ld_align64_uint64_t_uint64_t:
3701; CHECK-P10:       # %bb.0: # %entry
3702; CHECK-P10-NEXT:    pli r4, 244140625
3703; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3704; CHECK-P10-NEXT:    ldx r3, r3, r4
3705; CHECK-P10-NEXT:    blr
3706;
3707; CHECK-PREP10-LABEL: ld_align64_uint64_t_uint64_t:
3708; CHECK-PREP10:       # %bb.0: # %entry
3709; CHECK-PREP10-NEXT:    lis r4, 3725
3710; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3711; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3712; CHECK-PREP10-NEXT:    ldx r3, r3, r4
3713; CHECK-PREP10-NEXT:    blr
3714entry:
3715  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3716  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
3717  ret i64 %0
3718}
3719
3720; Function Attrs: nofree norecurse nounwind uwtable willreturn
3721define dso_local i64 @ld_reg_uint64_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) {
3722; CHECK-LABEL: ld_reg_uint64_t_uint64_t:
3723; CHECK:       # %bb.0: # %entry
3724; CHECK-NEXT:    ldx r3, r3, r4
3725; CHECK-NEXT:    blr
3726entry:
3727  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3728  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
3729  ret i64 %0
3730}
3731
3732; Function Attrs: nofree norecurse nounwind uwtable willreturn
3733define dso_local i64 @ld_or_uint64_t_uint64_t(i64 %ptr, i8 zeroext %off) {
3734; CHECK-LABEL: ld_or_uint64_t_uint64_t:
3735; CHECK:       # %bb.0: # %entry
3736; CHECK-NEXT:    or r3, r4, r3
3737; CHECK-NEXT:    ld r3, 0(r3)
3738; CHECK-NEXT:    blr
3739entry:
3740  %conv = zext i8 %off to i64
3741  %or = or i64 %conv, %ptr
3742  %0 = inttoptr i64 %or to ptr
3743  %1 = load atomic i64, ptr %0 monotonic, align 8
3744  ret i64 %1
3745}
3746
3747; Function Attrs: nofree norecurse nounwind uwtable willreturn
3748define dso_local i64 @ld_not_disjoint16_uint64_t_uint64_t(i64 %ptr) {
3749; CHECK-LABEL: ld_not_disjoint16_uint64_t_uint64_t:
3750; CHECK:       # %bb.0: # %entry
3751; CHECK-NEXT:    ori r3, r3, 6
3752; CHECK-NEXT:    ld r3, 0(r3)
3753; CHECK-NEXT:    blr
3754entry:
3755  %or = or i64 %ptr, 6
3756  %0 = inttoptr i64 %or to ptr
3757  %1 = load atomic i64, ptr %0 monotonic, align 8
3758  ret i64 %1
3759}
3760
3761; Function Attrs: nofree norecurse nounwind uwtable willreturn
3762define dso_local i64 @ld_disjoint_align16_uint64_t_uint64_t(i64 %ptr) {
3763; CHECK-LABEL: ld_disjoint_align16_uint64_t_uint64_t:
3764; CHECK:       # %bb.0: # %entry
3765; CHECK-NEXT:    rldicr r3, r3, 0, 51
3766; CHECK-NEXT:    ld r3, 24(r3)
3767; CHECK-NEXT:    blr
3768entry:
3769  %and = and i64 %ptr, -4096
3770  %or = or i64 %and, 24
3771  %0 = inttoptr i64 %or to ptr
3772  %1 = load atomic i64, ptr %0 monotonic, align 8
3773  ret i64 %1
3774}
3775
3776; Function Attrs: nofree norecurse nounwind uwtable willreturn
3777define dso_local i64 @ld_not_disjoint32_uint64_t_uint64_t(i64 %ptr) {
3778; CHECK-LABEL: ld_not_disjoint32_uint64_t_uint64_t:
3779; CHECK:       # %bb.0: # %entry
3780; CHECK-NEXT:    ori r3, r3, 34463
3781; CHECK-NEXT:    oris r3, r3, 1
3782; CHECK-NEXT:    ld r3, 0(r3)
3783; CHECK-NEXT:    blr
3784entry:
3785  %or = or i64 %ptr, 99999
3786  %0 = inttoptr i64 %or to ptr
3787  %1 = load atomic i64, ptr %0 monotonic, align 8
3788  ret i64 %1
3789}
3790
3791; Function Attrs: nofree norecurse nounwind uwtable willreturn
3792define dso_local i64 @ld_disjoint_align32_uint64_t_uint64_t(i64 %ptr) {
3793; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_uint64_t:
3794; CHECK-P10:       # %bb.0: # %entry
3795; CHECK-P10-NEXT:    lis r4, -15264
3796; CHECK-P10-NEXT:    and r3, r3, r4
3797; CHECK-P10-NEXT:    pld r3, 999990000(r3), 0
3798; CHECK-P10-NEXT:    blr
3799;
3800; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_uint64_t:
3801; CHECK-PREP10:       # %bb.0: # %entry
3802; CHECK-PREP10-NEXT:    lis r4, -15264
3803; CHECK-PREP10-NEXT:    and r3, r3, r4
3804; CHECK-PREP10-NEXT:    lis r4, 15258
3805; CHECK-PREP10-NEXT:    ori r4, r4, 41712
3806; CHECK-PREP10-NEXT:    ldx r3, r3, r4
3807; CHECK-PREP10-NEXT:    blr
3808entry:
3809  %and = and i64 %ptr, -1000341504
3810  %or = or i64 %and, 999990000
3811  %0 = inttoptr i64 %or to ptr
3812  %1 = load atomic i64, ptr %0 monotonic, align 16
3813  ret i64 %1
3814}
3815
3816; Function Attrs: nofree norecurse nounwind uwtable willreturn
3817define dso_local i64 @ld_not_disjoint64_uint64_t_uint64_t(i64 %ptr) {
3818; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_uint64_t:
3819; CHECK-P10:       # %bb.0: # %entry
3820; CHECK-P10-NEXT:    pli r4, 232
3821; CHECK-P10-NEXT:    pli r5, 3567587329
3822; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
3823; CHECK-P10-NEXT:    or r3, r3, r5
3824; CHECK-P10-NEXT:    ld r3, 0(r3)
3825; CHECK-P10-NEXT:    blr
3826;
3827; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_uint64_t:
3828; CHECK-PREP10:       # %bb.0: # %entry
3829; CHECK-PREP10-NEXT:    li r4, 29
3830; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
3831; CHECK-PREP10-NEXT:    oris r4, r4, 54437
3832; CHECK-PREP10-NEXT:    ori r4, r4, 4097
3833; CHECK-PREP10-NEXT:    or r3, r3, r4
3834; CHECK-PREP10-NEXT:    ld r3, 0(r3)
3835; CHECK-PREP10-NEXT:    blr
3836entry:
3837  %or = or i64 %ptr, 1000000000001
3838  %0 = inttoptr i64 %or to ptr
3839  %1 = load atomic i64, ptr %0 monotonic, align 8
3840  ret i64 %1
3841}
3842
3843; Function Attrs: nofree norecurse nounwind uwtable willreturn
3844define dso_local i64 @ld_disjoint_align64_uint64_t_uint64_t(i64 %ptr) {
3845; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_uint64_t:
3846; CHECK-P10:       # %bb.0: # %entry
3847; CHECK-P10-NEXT:    pli r4, 244140625
3848; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3849; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3850; CHECK-P10-NEXT:    ldx r3, r3, r4
3851; CHECK-P10-NEXT:    blr
3852;
3853; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_uint64_t:
3854; CHECK-PREP10:       # %bb.0: # %entry
3855; CHECK-PREP10-NEXT:    lis r4, 3725
3856; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3857; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3858; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3859; CHECK-PREP10-NEXT:    ldx r3, r3, r4
3860; CHECK-PREP10-NEXT:    blr
3861entry:
3862  %and = and i64 %ptr, -1099511627776
3863  %or = or i64 %and, 1000000000000
3864  %0 = inttoptr i64 %or to ptr
3865  %1 = load atomic i64, ptr %0 monotonic, align 4096
3866  ret i64 %1
3867}
3868
3869; Function Attrs: nofree norecurse nounwind uwtable willreturn
3870define dso_local i64 @ld_cst_align16_uint64_t_uint64_t() {
3871; CHECK-LABEL: ld_cst_align16_uint64_t_uint64_t:
3872; CHECK:       # %bb.0: # %entry
3873; CHECK-NEXT:    ld r3, 4080(0)
3874; CHECK-NEXT:    blr
3875entry:
3876  %0 = load atomic i64, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
3877  ret i64 %0
3878}
3879
3880; Function Attrs: nofree norecurse nounwind uwtable willreturn
3881define dso_local i64 @ld_cst_align32_uint64_t_uint64_t() {
3882; CHECK-LABEL: ld_cst_align32_uint64_t_uint64_t:
3883; CHECK:       # %bb.0: # %entry
3884; CHECK-NEXT:    lis r3, 153
3885; CHECK-NEXT:    ld r3, -27108(r3)
3886; CHECK-NEXT:    blr
3887entry:
3888  %0 = load atomic i64, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8
3889  ret i64 %0
3890}
3891
3892; Function Attrs: nofree norecurse nounwind uwtable willreturn
3893define dso_local i64 @ld_cst_align64_uint64_t_uint64_t() {
3894; CHECK-P10-LABEL: ld_cst_align64_uint64_t_uint64_t:
3895; CHECK-P10:       # %bb.0: # %entry
3896; CHECK-P10-NEXT:    pli r3, 244140625
3897; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
3898; CHECK-P10-NEXT:    ld r3, 0(r3)
3899; CHECK-P10-NEXT:    blr
3900;
3901; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_uint64_t:
3902; CHECK-PREP10:       # %bb.0: # %entry
3903; CHECK-PREP10-NEXT:    lis r3, 3725
3904; CHECK-PREP10-NEXT:    ori r3, r3, 19025
3905; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
3906; CHECK-PREP10-NEXT:    ld r3, 0(r3)
3907; CHECK-PREP10-NEXT:    blr
3908entry:
3909  %0 = load atomic i64, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
3910  ret i64 %0
3911}
3912
3913; Function Attrs: nofree norecurse nounwind uwtable willreturn
3914define dso_local void @st_0_uint64_t_uint8_t(i64 %ptr, i64 %str) {
3915; CHECK-LABEL: st_0_uint64_t_uint8_t:
3916; CHECK:       # %bb.0: # %entry
3917; CHECK-NEXT:    stb r4, 0(r3)
3918; CHECK-NEXT:    blr
3919entry:
3920  %0 = inttoptr i64 %ptr to ptr
3921  %conv = trunc i64 %str to i8
3922  store atomic i8 %conv, ptr %0 monotonic, align 1
3923  ret void
3924}
3925
3926; Function Attrs: nofree norecurse nounwind uwtable willreturn
3927define dso_local void @st_align16_uint64_t_uint8_t(ptr nocapture %ptr, i64 %str) {
3928; CHECK-LABEL: st_align16_uint64_t_uint8_t:
3929; CHECK:       # %bb.0: # %entry
3930; CHECK-NEXT:    stb r4, 8(r3)
3931; CHECK-NEXT:    blr
3932entry:
3933  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3934  %conv = trunc i64 %str to i8
3935  store atomic i8 %conv, ptr %add.ptr monotonic, align 1
3936  ret void
3937}
3938
3939; Function Attrs: nofree norecurse nounwind uwtable willreturn
3940define dso_local void @st_align32_uint64_t_uint8_t(ptr nocapture %ptr, i64 %str) {
3941; CHECK-P10-LABEL: st_align32_uint64_t_uint8_t:
3942; CHECK-P10:       # %bb.0: # %entry
3943; CHECK-P10-NEXT:    pstb r4, 99999000(r3), 0
3944; CHECK-P10-NEXT:    blr
3945;
3946; CHECK-PREP10-LABEL: st_align32_uint64_t_uint8_t:
3947; CHECK-PREP10:       # %bb.0: # %entry
3948; CHECK-PREP10-NEXT:    lis r5, 1525
3949; CHECK-PREP10-NEXT:    ori r5, r5, 56600
3950; CHECK-PREP10-NEXT:    stbx r4, r3, r5
3951; CHECK-PREP10-NEXT:    blr
3952entry:
3953  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3954  %conv = trunc i64 %str to i8
3955  store atomic i8 %conv, ptr %add.ptr monotonic, align 1
3956  ret void
3957}
3958
3959; Function Attrs: nofree norecurse nounwind uwtable willreturn
3960define dso_local void @st_align64_uint64_t_uint8_t(ptr nocapture %ptr, i64 %str) {
3961; CHECK-P10-LABEL: st_align64_uint64_t_uint8_t:
3962; CHECK-P10:       # %bb.0: # %entry
3963; CHECK-P10-NEXT:    pli r5, 244140625
3964; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
3965; CHECK-P10-NEXT:    stbx r4, r3, r5
3966; CHECK-P10-NEXT:    blr
3967;
3968; CHECK-PREP10-LABEL: st_align64_uint64_t_uint8_t:
3969; CHECK-PREP10:       # %bb.0: # %entry
3970; CHECK-PREP10-NEXT:    lis r5, 3725
3971; CHECK-PREP10-NEXT:    ori r5, r5, 19025
3972; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
3973; CHECK-PREP10-NEXT:    stbx r4, r3, r5
3974; CHECK-PREP10-NEXT:    blr
3975entry:
3976  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3977  %conv = trunc i64 %str to i8
3978  store atomic i8 %conv, ptr %add.ptr monotonic, align 1
3979  ret void
3980}
3981
3982; Function Attrs: nofree norecurse nounwind uwtable willreturn
3983define dso_local void @st_reg_uint64_t_uint8_t(ptr nocapture %ptr, i64 %off, i64 %str) {
3984; CHECK-LABEL: st_reg_uint64_t_uint8_t:
3985; CHECK:       # %bb.0: # %entry
3986; CHECK-NEXT:    stbx r5, r3, r4
3987; CHECK-NEXT:    blr
3988entry:
3989  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3990  %conv = trunc i64 %str to i8
3991  store atomic i8 %conv, ptr %add.ptr monotonic, align 1
3992  ret void
3993}
3994
3995; Function Attrs: nofree norecurse nounwind uwtable willreturn
3996define dso_local void @st_or1_uint64_t_uint8_t(i64 %ptr, i8 zeroext %off, i64 %str) {
3997; CHECK-LABEL: st_or1_uint64_t_uint8_t:
3998; CHECK:       # %bb.0: # %entry
3999; CHECK-NEXT:    or r3, r4, r3
4000; CHECK-NEXT:    stb r5, 0(r3)
4001; CHECK-NEXT:    blr
4002entry:
4003  %conv = zext i8 %off to i64
4004  %or = or i64 %conv, %ptr
4005  %0 = inttoptr i64 %or to ptr
4006  %conv1 = trunc i64 %str to i8
4007  store atomic i8 %conv1, ptr %0 monotonic, align 1
4008  ret void
4009}
4010
4011; Function Attrs: nofree norecurse nounwind uwtable willreturn
4012define dso_local void @st_not_disjoint16_uint64_t_uint8_t(i64 %ptr, i64 %str) {
4013; CHECK-LABEL: st_not_disjoint16_uint64_t_uint8_t:
4014; CHECK:       # %bb.0: # %entry
4015; CHECK-NEXT:    ori r3, r3, 6
4016; CHECK-NEXT:    stb r4, 0(r3)
4017; CHECK-NEXT:    blr
4018entry:
4019  %or = or i64 %ptr, 6
4020  %0 = inttoptr i64 %or to ptr
4021  %conv = trunc i64 %str to i8
4022  store atomic i8 %conv, ptr %0 monotonic, align 1
4023  ret void
4024}
4025
4026; Function Attrs: nofree norecurse nounwind uwtable willreturn
4027define dso_local void @st_disjoint_align16_uint64_t_uint8_t(i64 %ptr, i64 %str) {
4028; CHECK-LABEL: st_disjoint_align16_uint64_t_uint8_t:
4029; CHECK:       # %bb.0: # %entry
4030; CHECK-NEXT:    rldicr r3, r3, 0, 51
4031; CHECK-NEXT:    stb r4, 24(r3)
4032; CHECK-NEXT:    blr
4033entry:
4034  %and = and i64 %ptr, -4096
4035  %or = or i64 %and, 24
4036  %0 = inttoptr i64 %or to ptr
4037  %conv = trunc i64 %str to i8
4038  store atomic i8 %conv, ptr %0 monotonic, align 8
4039  ret void
4040}
4041
4042; Function Attrs: nofree norecurse nounwind uwtable willreturn
4043define dso_local void @st_not_disjoint32_uint64_t_uint8_t(i64 %ptr, i64 %str) {
4044; CHECK-LABEL: st_not_disjoint32_uint64_t_uint8_t:
4045; CHECK:       # %bb.0: # %entry
4046; CHECK-NEXT:    ori r3, r3, 34463
4047; CHECK-NEXT:    oris r3, r3, 1
4048; CHECK-NEXT:    stb r4, 0(r3)
4049; CHECK-NEXT:    blr
4050entry:
4051  %or = or i64 %ptr, 99999
4052  %0 = inttoptr i64 %or to ptr
4053  %conv = trunc i64 %str to i8
4054  store atomic i8 %conv, ptr %0 monotonic, align 1
4055  ret void
4056}
4057
4058; Function Attrs: nofree norecurse nounwind uwtable willreturn
4059define dso_local void @st_disjoint_align32_uint64_t_uint8_t(i64 %ptr, i64 %str) {
4060; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_uint8_t:
4061; CHECK-P10:       # %bb.0: # %entry
4062; CHECK-P10-NEXT:    lis r5, -15264
4063; CHECK-P10-NEXT:    and r3, r3, r5
4064; CHECK-P10-NEXT:    pstb r4, 999990000(r3), 0
4065; CHECK-P10-NEXT:    blr
4066;
4067; CHECK-PREP10-LABEL: st_disjoint_align32_uint64_t_uint8_t:
4068; CHECK-PREP10:       # %bb.0: # %entry
4069; CHECK-PREP10-NEXT:    lis r5, -15264
4070; CHECK-PREP10-NEXT:    and r3, r3, r5
4071; CHECK-PREP10-NEXT:    lis r5, 15258
4072; CHECK-PREP10-NEXT:    ori r5, r5, 41712
4073; CHECK-PREP10-NEXT:    stbx r4, r3, r5
4074; CHECK-PREP10-NEXT:    blr
4075entry:
4076  %and = and i64 %ptr, -1000341504
4077  %or = or i64 %and, 999990000
4078  %0 = inttoptr i64 %or to ptr
4079  %conv = trunc i64 %str to i8
4080  store atomic i8 %conv, ptr %0 monotonic, align 16
4081  ret void
4082}
4083
4084; Function Attrs: nofree norecurse nounwind uwtable willreturn
4085define dso_local void @st_not_disjoint64_uint64_t_uint8_t(i64 %ptr, i64 %str) {
4086; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_uint8_t:
4087; CHECK-P10:       # %bb.0: # %entry
4088; CHECK-P10-NEXT:    pli r5, 232
4089; CHECK-P10-NEXT:    pli r6, 3567587329
4090; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
4091; CHECK-P10-NEXT:    or r3, r3, r6
4092; CHECK-P10-NEXT:    stb r4, 0(r3)
4093; CHECK-P10-NEXT:    blr
4094;
4095; CHECK-PREP10-LABEL: st_not_disjoint64_uint64_t_uint8_t:
4096; CHECK-PREP10:       # %bb.0: # %entry
4097; CHECK-PREP10-NEXT:    li r5, 29
4098; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
4099; CHECK-PREP10-NEXT:    oris r5, r5, 54437
4100; CHECK-PREP10-NEXT:    ori r5, r5, 4097
4101; CHECK-PREP10-NEXT:    or r3, r3, r5
4102; CHECK-PREP10-NEXT:    stb r4, 0(r3)
4103; CHECK-PREP10-NEXT:    blr
4104entry:
4105  %or = or i64 %ptr, 1000000000001
4106  %0 = inttoptr i64 %or to ptr
4107  %conv = trunc i64 %str to i8
4108  store atomic i8 %conv, ptr %0 monotonic, align 1
4109  ret void
4110}
4111
4112; Function Attrs: nofree norecurse nounwind uwtable willreturn
4113define dso_local void @st_disjoint_align64_uint64_t_uint8_t(i64 %ptr, i64 %str) {
4114; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_uint8_t:
4115; CHECK-P10:       # %bb.0: # %entry
4116; CHECK-P10-NEXT:    pli r5, 244140625
4117; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
4118; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4119; CHECK-P10-NEXT:    stbx r4, r3, r5
4120; CHECK-P10-NEXT:    blr
4121;
4122; CHECK-PREP10-LABEL: st_disjoint_align64_uint64_t_uint8_t:
4123; CHECK-PREP10:       # %bb.0: # %entry
4124; CHECK-PREP10-NEXT:    lis r5, 3725
4125; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
4126; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4127; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4128; CHECK-PREP10-NEXT:    stbx r4, r3, r5
4129; CHECK-PREP10-NEXT:    blr
4130entry:
4131  %and = and i64 %ptr, -1099511627776
4132  %or = or i64 %and, 1000000000000
4133  %0 = inttoptr i64 %or to ptr
4134  %conv = trunc i64 %str to i8
4135  store atomic i8 %conv, ptr %0 monotonic, align 4096
4136  ret void
4137}
4138
4139; Function Attrs: nofree norecurse nounwind uwtable willreturn
4140define dso_local void @st_cst_align16_uint64_t_uint8_t(i64 %str) {
4141; CHECK-LABEL: st_cst_align16_uint64_t_uint8_t:
4142; CHECK:       # %bb.0: # %entry
4143; CHECK-NEXT:    stb r3, 4080(0)
4144; CHECK-NEXT:    blr
4145entry:
4146  %conv = trunc i64 %str to i8
4147  store atomic i8 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
4148  ret void
4149}
4150
4151; Function Attrs: nofree norecurse nounwind uwtable willreturn
4152define dso_local void @st_cst_align32_uint64_t_uint8_t(i64 %str) {
4153; CHECK-LABEL: st_cst_align32_uint64_t_uint8_t:
4154; CHECK:       # %bb.0: # %entry
4155; CHECK-NEXT:    lis r4, 153
4156; CHECK-NEXT:    stb r3, -27108(r4)
4157; CHECK-NEXT:    blr
4158entry:
4159  %conv = trunc i64 %str to i8
4160  store atomic i8 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
4161  ret void
4162}
4163
4164; Function Attrs: nofree norecurse nounwind uwtable willreturn
4165define dso_local void @st_cst_align64_uint64_t_uint8_t(i64 %str) {
4166; CHECK-P10-LABEL: st_cst_align64_uint64_t_uint8_t:
4167; CHECK-P10:       # %bb.0: # %entry
4168; CHECK-P10-NEXT:    pli r4, 244140625
4169; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4170; CHECK-P10-NEXT:    stb r3, 0(r4)
4171; CHECK-P10-NEXT:    blr
4172;
4173; CHECK-PREP10-LABEL: st_cst_align64_uint64_t_uint8_t:
4174; CHECK-PREP10:       # %bb.0: # %entry
4175; CHECK-PREP10-NEXT:    lis r4, 3725
4176; CHECK-PREP10-NEXT:    ori r4, r4, 19025
4177; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
4178; CHECK-PREP10-NEXT:    stb r3, 0(r4)
4179; CHECK-PREP10-NEXT:    blr
4180entry:
4181  %conv = trunc i64 %str to i8
4182  store atomic i8 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
4183  ret void
4184}
4185
4186; Function Attrs: nofree norecurse nounwind uwtable willreturn
4187define dso_local void @st_0_uint64_t_uint16_t(i64 %ptr, i64 %str) {
4188; CHECK-LABEL: st_0_uint64_t_uint16_t:
4189; CHECK:       # %bb.0: # %entry
4190; CHECK-NEXT:    sth r4, 0(r3)
4191; CHECK-NEXT:    blr
4192entry:
4193  %0 = inttoptr i64 %ptr to ptr
4194  %conv = trunc i64 %str to i16
4195  store atomic i16 %conv, ptr %0 monotonic, align 2
4196  ret void
4197}
4198
4199; Function Attrs: nofree norecurse nounwind uwtable willreturn
4200define dso_local void @st_align16_uint64_t_uint16_t(ptr nocapture %ptr, i64 %str) {
4201; CHECK-LABEL: st_align16_uint64_t_uint16_t:
4202; CHECK:       # %bb.0: # %entry
4203; CHECK-NEXT:    sth r4, 8(r3)
4204; CHECK-NEXT:    blr
4205entry:
4206  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
4207  %conv = trunc i64 %str to i16
4208  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
4209  ret void
4210}
4211
4212; Function Attrs: nofree norecurse nounwind uwtable willreturn
4213define dso_local void @st_align32_uint64_t_uint16_t(ptr nocapture %ptr, i64 %str) {
4214; CHECK-P10-LABEL: st_align32_uint64_t_uint16_t:
4215; CHECK-P10:       # %bb.0: # %entry
4216; CHECK-P10-NEXT:    psth r4, 99999000(r3), 0
4217; CHECK-P10-NEXT:    blr
4218;
4219; CHECK-PREP10-LABEL: st_align32_uint64_t_uint16_t:
4220; CHECK-PREP10:       # %bb.0: # %entry
4221; CHECK-PREP10-NEXT:    lis r5, 1525
4222; CHECK-PREP10-NEXT:    ori r5, r5, 56600
4223; CHECK-PREP10-NEXT:    sthx r4, r3, r5
4224; CHECK-PREP10-NEXT:    blr
4225entry:
4226  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
4227  %conv = trunc i64 %str to i16
4228  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
4229  ret void
4230}
4231
4232; Function Attrs: nofree norecurse nounwind uwtable willreturn
4233define dso_local void @st_align64_uint64_t_uint16_t(ptr nocapture %ptr, i64 %str) {
4234; CHECK-P10-LABEL: st_align64_uint64_t_uint16_t:
4235; CHECK-P10:       # %bb.0: # %entry
4236; CHECK-P10-NEXT:    pli r5, 244140625
4237; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4238; CHECK-P10-NEXT:    sthx r4, r3, r5
4239; CHECK-P10-NEXT:    blr
4240;
4241; CHECK-PREP10-LABEL: st_align64_uint64_t_uint16_t:
4242; CHECK-PREP10:       # %bb.0: # %entry
4243; CHECK-PREP10-NEXT:    lis r5, 3725
4244; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4245; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4246; CHECK-PREP10-NEXT:    sthx r4, r3, r5
4247; CHECK-PREP10-NEXT:    blr
4248entry:
4249  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
4250  %conv = trunc i64 %str to i16
4251  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
4252  ret void
4253}
4254
4255; Function Attrs: nofree norecurse nounwind uwtable willreturn
4256define dso_local void @st_reg_uint64_t_uint16_t(ptr nocapture %ptr, i64 %off, i64 %str) {
4257; CHECK-LABEL: st_reg_uint64_t_uint16_t:
4258; CHECK:       # %bb.0: # %entry
4259; CHECK-NEXT:    sthx r5, r3, r4
4260; CHECK-NEXT:    blr
4261entry:
4262  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
4263  %conv = trunc i64 %str to i16
4264  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
4265  ret void
4266}
4267
4268; Function Attrs: nofree norecurse nounwind uwtable willreturn
4269define dso_local void @st_or1_uint64_t_uint16_t(i64 %ptr, i8 zeroext %off, i64 %str) {
4270; CHECK-LABEL: st_or1_uint64_t_uint16_t:
4271; CHECK:       # %bb.0: # %entry
4272; CHECK-NEXT:    or r3, r4, r3
4273; CHECK-NEXT:    sth r5, 0(r3)
4274; CHECK-NEXT:    blr
4275entry:
4276  %conv = zext i8 %off to i64
4277  %or = or i64 %conv, %ptr
4278  %0 = inttoptr i64 %or to ptr
4279  %conv1 = trunc i64 %str to i16
4280  store atomic i16 %conv1, ptr %0 monotonic, align 2
4281  ret void
4282}
4283
4284; Function Attrs: nofree norecurse nounwind uwtable willreturn
4285define dso_local void @st_not_disjoint16_uint64_t_uint16_t(i64 %ptr, i64 %str) {
4286; CHECK-LABEL: st_not_disjoint16_uint64_t_uint16_t:
4287; CHECK:       # %bb.0: # %entry
4288; CHECK-NEXT:    ori r3, r3, 6
4289; CHECK-NEXT:    sth r4, 0(r3)
4290; CHECK-NEXT:    blr
4291entry:
4292  %or = or i64 %ptr, 6
4293  %0 = inttoptr i64 %or to ptr
4294  %conv = trunc i64 %str to i16
4295  store atomic i16 %conv, ptr %0 monotonic, align 2
4296  ret void
4297}
4298
4299; Function Attrs: nofree norecurse nounwind uwtable willreturn
4300define dso_local void @st_disjoint_align16_uint64_t_uint16_t(i64 %ptr, i64 %str) {
4301; CHECK-LABEL: st_disjoint_align16_uint64_t_uint16_t:
4302; CHECK:       # %bb.0: # %entry
4303; CHECK-NEXT:    rldicr r3, r3, 0, 51
4304; CHECK-NEXT:    sth r4, 24(r3)
4305; CHECK-NEXT:    blr
4306entry:
4307  %and = and i64 %ptr, -4096
4308  %or = or i64 %and, 24
4309  %0 = inttoptr i64 %or to ptr
4310  %conv = trunc i64 %str to i16
4311  store atomic i16 %conv, ptr %0 monotonic, align 8
4312  ret void
4313}
4314
4315; Function Attrs: nofree norecurse nounwind uwtable willreturn
4316define dso_local void @st_not_disjoint32_uint64_t_uint16_t(i64 %ptr, i64 %str) {
4317; CHECK-LABEL: st_not_disjoint32_uint64_t_uint16_t:
4318; CHECK:       # %bb.0: # %entry
4319; CHECK-NEXT:    ori r3, r3, 34463
4320; CHECK-NEXT:    oris r3, r3, 1
4321; CHECK-NEXT:    sth r4, 0(r3)
4322; CHECK-NEXT:    blr
4323entry:
4324  %or = or i64 %ptr, 99999
4325  %0 = inttoptr i64 %or to ptr
4326  %conv = trunc i64 %str to i16
4327  store atomic i16 %conv, ptr %0 monotonic, align 2
4328  ret void
4329}
4330
4331; Function Attrs: nofree norecurse nounwind uwtable willreturn
4332define dso_local void @st_disjoint_align32_uint64_t_uint16_t(i64 %ptr, i64 %str) {
4333; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_uint16_t:
4334; CHECK-P10:       # %bb.0: # %entry
4335; CHECK-P10-NEXT:    lis r5, -15264
4336; CHECK-P10-NEXT:    and r3, r3, r5
4337; CHECK-P10-NEXT:    psth r4, 999990000(r3), 0
4338; CHECK-P10-NEXT:    blr
4339;
4340; CHECK-PREP10-LABEL: st_disjoint_align32_uint64_t_uint16_t:
4341; CHECK-PREP10:       # %bb.0: # %entry
4342; CHECK-PREP10-NEXT:    lis r5, -15264
4343; CHECK-PREP10-NEXT:    and r3, r3, r5
4344; CHECK-PREP10-NEXT:    lis r5, 15258
4345; CHECK-PREP10-NEXT:    ori r5, r5, 41712
4346; CHECK-PREP10-NEXT:    sthx r4, r3, r5
4347; CHECK-PREP10-NEXT:    blr
4348entry:
4349  %and = and i64 %ptr, -1000341504
4350  %or = or i64 %and, 999990000
4351  %0 = inttoptr i64 %or to ptr
4352  %conv = trunc i64 %str to i16
4353  store atomic i16 %conv, ptr %0 monotonic, align 16
4354  ret void
4355}
4356
4357; Function Attrs: nofree norecurse nounwind uwtable willreturn
4358define dso_local void @st_not_disjoint64_uint64_t_uint16_t(i64 %ptr, i64 %str) {
4359; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_uint16_t:
4360; CHECK-P10:       # %bb.0: # %entry
4361; CHECK-P10-NEXT:    pli r5, 232
4362; CHECK-P10-NEXT:    pli r6, 3567587329
4363; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
4364; CHECK-P10-NEXT:    or r3, r3, r6
4365; CHECK-P10-NEXT:    sth r4, 0(r3)
4366; CHECK-P10-NEXT:    blr
4367;
4368; CHECK-PREP10-LABEL: st_not_disjoint64_uint64_t_uint16_t:
4369; CHECK-PREP10:       # %bb.0: # %entry
4370; CHECK-PREP10-NEXT:    li r5, 29
4371; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
4372; CHECK-PREP10-NEXT:    oris r5, r5, 54437
4373; CHECK-PREP10-NEXT:    ori r5, r5, 4097
4374; CHECK-PREP10-NEXT:    or r3, r3, r5
4375; CHECK-PREP10-NEXT:    sth r4, 0(r3)
4376; CHECK-PREP10-NEXT:    blr
4377entry:
4378  %or = or i64 %ptr, 1000000000001
4379  %0 = inttoptr i64 %or to ptr
4380  %conv = trunc i64 %str to i16
4381  store atomic i16 %conv, ptr %0 monotonic, align 2
4382  ret void
4383}
4384
4385; Function Attrs: nofree norecurse nounwind uwtable willreturn
4386define dso_local void @st_disjoint_align64_uint64_t_uint16_t(i64 %ptr, i64 %str) {
4387; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_uint16_t:
4388; CHECK-P10:       # %bb.0: # %entry
4389; CHECK-P10-NEXT:    pli r5, 244140625
4390; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
4391; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4392; CHECK-P10-NEXT:    sthx r4, r3, r5
4393; CHECK-P10-NEXT:    blr
4394;
4395; CHECK-PREP10-LABEL: st_disjoint_align64_uint64_t_uint16_t:
4396; CHECK-PREP10:       # %bb.0: # %entry
4397; CHECK-PREP10-NEXT:    lis r5, 3725
4398; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
4399; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4400; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4401; CHECK-PREP10-NEXT:    sthx r4, r3, r5
4402; CHECK-PREP10-NEXT:    blr
4403entry:
4404  %and = and i64 %ptr, -1099511627776
4405  %or = or i64 %and, 1000000000000
4406  %0 = inttoptr i64 %or to ptr
4407  %conv = trunc i64 %str to i16
4408  store atomic i16 %conv, ptr %0 monotonic, align 4096
4409  ret void
4410}
4411
4412; Function Attrs: nofree norecurse nounwind uwtable willreturn
4413define dso_local void @st_cst_align16_uint64_t_uint16_t(i64 %str) {
4414; CHECK-LABEL: st_cst_align16_uint64_t_uint16_t:
4415; CHECK:       # %bb.0: # %entry
4416; CHECK-NEXT:    sth r3, 4080(0)
4417; CHECK-NEXT:    blr
4418entry:
4419  %conv = trunc i64 %str to i16
4420  store atomic i16 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
4421  ret void
4422}
4423
4424; Function Attrs: nofree norecurse nounwind uwtable willreturn
4425define dso_local void @st_cst_align32_uint64_t_uint16_t(i64 %str) {
4426; CHECK-LABEL: st_cst_align32_uint64_t_uint16_t:
4427; CHECK:       # %bb.0: # %entry
4428; CHECK-NEXT:    lis r4, 153
4429; CHECK-NEXT:    sth r3, -27108(r4)
4430; CHECK-NEXT:    blr
4431entry:
4432  %conv = trunc i64 %str to i16
4433  store atomic i16 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
4434  ret void
4435}
4436
4437; Function Attrs: nofree norecurse nounwind uwtable willreturn
4438define dso_local void @st_cst_align64_uint64_t_uint16_t(i64 %str) {
4439; CHECK-P10-LABEL: st_cst_align64_uint64_t_uint16_t:
4440; CHECK-P10:       # %bb.0: # %entry
4441; CHECK-P10-NEXT:    pli r4, 244140625
4442; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4443; CHECK-P10-NEXT:    sth r3, 0(r4)
4444; CHECK-P10-NEXT:    blr
4445;
4446; CHECK-PREP10-LABEL: st_cst_align64_uint64_t_uint16_t:
4447; CHECK-PREP10:       # %bb.0: # %entry
4448; CHECK-PREP10-NEXT:    lis r4, 3725
4449; CHECK-PREP10-NEXT:    ori r4, r4, 19025
4450; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
4451; CHECK-PREP10-NEXT:    sth r3, 0(r4)
4452; CHECK-PREP10-NEXT:    blr
4453entry:
4454  %conv = trunc i64 %str to i16
4455  store atomic i16 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
4456  ret void
4457}
4458
4459; Function Attrs: nofree norecurse nounwind uwtable willreturn
4460define dso_local void @st_0_uint64_t_uint32_t(i64 %ptr, i64 %str) {
4461; CHECK-LABEL: st_0_uint64_t_uint32_t:
4462; CHECK:       # %bb.0: # %entry
4463; CHECK-NEXT:    stw r4, 0(r3)
4464; CHECK-NEXT:    blr
4465entry:
4466  %0 = inttoptr i64 %ptr to ptr
4467  %conv = trunc i64 %str to i32
4468  store atomic i32 %conv, ptr %0 monotonic, align 4
4469  ret void
4470}
4471
4472; Function Attrs: nofree norecurse nounwind uwtable willreturn
4473define dso_local void @st_align16_uint64_t_uint32_t(ptr nocapture %ptr, i64 %str) {
4474; CHECK-LABEL: st_align16_uint64_t_uint32_t:
4475; CHECK:       # %bb.0: # %entry
4476; CHECK-NEXT:    stw r4, 8(r3)
4477; CHECK-NEXT:    blr
4478entry:
4479  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
4480  %conv = trunc i64 %str to i32
4481  store atomic i32 %conv, ptr %add.ptr monotonic, align 4
4482  ret void
4483}
4484
4485; Function Attrs: nofree norecurse nounwind uwtable willreturn
4486define dso_local void @st_align32_uint64_t_uint32_t(ptr nocapture %ptr, i64 %str) {
4487; CHECK-P10-LABEL: st_align32_uint64_t_uint32_t:
4488; CHECK-P10:       # %bb.0: # %entry
4489; CHECK-P10-NEXT:    pstw r4, 99999000(r3), 0
4490; CHECK-P10-NEXT:    blr
4491;
4492; CHECK-PREP10-LABEL: st_align32_uint64_t_uint32_t:
4493; CHECK-PREP10:       # %bb.0: # %entry
4494; CHECK-PREP10-NEXT:    lis r5, 1525
4495; CHECK-PREP10-NEXT:    ori r5, r5, 56600
4496; CHECK-PREP10-NEXT:    stwx r4, r3, r5
4497; CHECK-PREP10-NEXT:    blr
4498entry:
4499  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
4500  %conv = trunc i64 %str to i32
4501  store atomic i32 %conv, ptr %add.ptr monotonic, align 4
4502  ret void
4503}
4504
4505; Function Attrs: nofree norecurse nounwind uwtable willreturn
4506define dso_local void @st_align64_uint64_t_uint32_t(ptr nocapture %ptr, i64 %str) {
4507; CHECK-P10-LABEL: st_align64_uint64_t_uint32_t:
4508; CHECK-P10:       # %bb.0: # %entry
4509; CHECK-P10-NEXT:    pli r5, 244140625
4510; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4511; CHECK-P10-NEXT:    stwx r4, r3, r5
4512; CHECK-P10-NEXT:    blr
4513;
4514; CHECK-PREP10-LABEL: st_align64_uint64_t_uint32_t:
4515; CHECK-PREP10:       # %bb.0: # %entry
4516; CHECK-PREP10-NEXT:    lis r5, 3725
4517; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4518; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4519; CHECK-PREP10-NEXT:    stwx r4, r3, r5
4520; CHECK-PREP10-NEXT:    blr
4521entry:
4522  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
4523  %conv = trunc i64 %str to i32
4524  store atomic i32 %conv, ptr %add.ptr monotonic, align 4
4525  ret void
4526}
4527
4528; Function Attrs: nofree norecurse nounwind uwtable willreturn
4529define dso_local void @st_reg_uint64_t_uint32_t(ptr nocapture %ptr, i64 %off, i64 %str) {
4530; CHECK-LABEL: st_reg_uint64_t_uint32_t:
4531; CHECK:       # %bb.0: # %entry
4532; CHECK-NEXT:    stwx r5, r3, r4
4533; CHECK-NEXT:    blr
4534entry:
4535  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
4536  %conv = trunc i64 %str to i32
4537  store atomic i32 %conv, ptr %add.ptr monotonic, align 4
4538  ret void
4539}
4540
4541; Function Attrs: nofree norecurse nounwind uwtable willreturn
4542define dso_local void @st_or1_uint64_t_uint32_t(i64 %ptr, i8 zeroext %off, i64 %str) {
4543; CHECK-LABEL: st_or1_uint64_t_uint32_t:
4544; CHECK:       # %bb.0: # %entry
4545; CHECK-NEXT:    or r3, r4, r3
4546; CHECK-NEXT:    stw r5, 0(r3)
4547; CHECK-NEXT:    blr
4548entry:
4549  %conv = zext i8 %off to i64
4550  %or = or i64 %conv, %ptr
4551  %0 = inttoptr i64 %or to ptr
4552  %conv1 = trunc i64 %str to i32
4553  store atomic i32 %conv1, ptr %0 monotonic, align 4
4554  ret void
4555}
4556
4557; Function Attrs: nofree norecurse nounwind uwtable willreturn
4558define dso_local void @st_not_disjoint16_uint64_t_uint32_t(i64 %ptr, i64 %str) {
4559; CHECK-LABEL: st_not_disjoint16_uint64_t_uint32_t:
4560; CHECK:       # %bb.0: # %entry
4561; CHECK-NEXT:    ori r3, r3, 6
4562; CHECK-NEXT:    stw r4, 0(r3)
4563; CHECK-NEXT:    blr
4564entry:
4565  %or = or i64 %ptr, 6
4566  %0 = inttoptr i64 %or to ptr
4567  %conv = trunc i64 %str to i32
4568  store atomic i32 %conv, ptr %0 monotonic, align 4
4569  ret void
4570}
4571
4572; Function Attrs: nofree norecurse nounwind uwtable willreturn
4573define dso_local void @st_disjoint_align16_uint64_t_uint32_t(i64 %ptr, i64 %str) {
4574; CHECK-LABEL: st_disjoint_align16_uint64_t_uint32_t:
4575; CHECK:       # %bb.0: # %entry
4576; CHECK-NEXT:    rldicr r3, r3, 0, 51
4577; CHECK-NEXT:    stw r4, 24(r3)
4578; CHECK-NEXT:    blr
4579entry:
4580  %and = and i64 %ptr, -4096
4581  %or = or i64 %and, 24
4582  %0 = inttoptr i64 %or to ptr
4583  %conv = trunc i64 %str to i32
4584  store atomic i32 %conv, ptr %0 monotonic, align 8
4585  ret void
4586}
4587
4588; Function Attrs: nofree norecurse nounwind uwtable willreturn
4589define dso_local void @st_not_disjoint32_uint64_t_uint32_t(i64 %ptr, i64 %str) {
4590; CHECK-LABEL: st_not_disjoint32_uint64_t_uint32_t:
4591; CHECK:       # %bb.0: # %entry
4592; CHECK-NEXT:    ori r3, r3, 34463
4593; CHECK-NEXT:    oris r3, r3, 1
4594; CHECK-NEXT:    stw r4, 0(r3)
4595; CHECK-NEXT:    blr
4596entry:
4597  %or = or i64 %ptr, 99999
4598  %0 = inttoptr i64 %or to ptr
4599  %conv = trunc i64 %str to i32
4600  store atomic i32 %conv, ptr %0 monotonic, align 4
4601  ret void
4602}
4603
4604; Function Attrs: nofree norecurse nounwind uwtable willreturn
4605define dso_local void @st_disjoint_align32_uint64_t_uint32_t(i64 %ptr, i64 %str) {
4606; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_uint32_t:
4607; CHECK-P10:       # %bb.0: # %entry
4608; CHECK-P10-NEXT:    lis r5, -15264
4609; CHECK-P10-NEXT:    and r3, r3, r5
4610; CHECK-P10-NEXT:    pstw r4, 999990000(r3), 0
4611; CHECK-P10-NEXT:    blr
4612;
4613; CHECK-PREP10-LABEL: st_disjoint_align32_uint64_t_uint32_t:
4614; CHECK-PREP10:       # %bb.0: # %entry
4615; CHECK-PREP10-NEXT:    lis r5, -15264
4616; CHECK-PREP10-NEXT:    and r3, r3, r5
4617; CHECK-PREP10-NEXT:    lis r5, 15258
4618; CHECK-PREP10-NEXT:    ori r5, r5, 41712
4619; CHECK-PREP10-NEXT:    stwx r4, r3, r5
4620; CHECK-PREP10-NEXT:    blr
4621entry:
4622  %and = and i64 %ptr, -1000341504
4623  %or = or i64 %and, 999990000
4624  %0 = inttoptr i64 %or to ptr
4625  %conv = trunc i64 %str to i32
4626  store atomic i32 %conv, ptr %0 monotonic, align 16
4627  ret void
4628}
4629
4630; Function Attrs: nofree norecurse nounwind uwtable willreturn
4631define dso_local void @st_not_disjoint64_uint64_t_uint32_t(i64 %ptr, i64 %str) {
4632; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_uint32_t:
4633; CHECK-P10:       # %bb.0: # %entry
4634; CHECK-P10-NEXT:    pli r5, 232
4635; CHECK-P10-NEXT:    pli r6, 3567587329
4636; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
4637; CHECK-P10-NEXT:    or r3, r3, r6
4638; CHECK-P10-NEXT:    stw r4, 0(r3)
4639; CHECK-P10-NEXT:    blr
4640;
4641; CHECK-PREP10-LABEL: st_not_disjoint64_uint64_t_uint32_t:
4642; CHECK-PREP10:       # %bb.0: # %entry
4643; CHECK-PREP10-NEXT:    li r5, 29
4644; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
4645; CHECK-PREP10-NEXT:    oris r5, r5, 54437
4646; CHECK-PREP10-NEXT:    ori r5, r5, 4097
4647; CHECK-PREP10-NEXT:    or r3, r3, r5
4648; CHECK-PREP10-NEXT:    stw r4, 0(r3)
4649; CHECK-PREP10-NEXT:    blr
4650entry:
4651  %or = or i64 %ptr, 1000000000001
4652  %0 = inttoptr i64 %or to ptr
4653  %conv = trunc i64 %str to i32
4654  store atomic i32 %conv, ptr %0 monotonic, align 4
4655  ret void
4656}
4657
4658; Function Attrs: nofree norecurse nounwind uwtable willreturn
4659define dso_local void @st_disjoint_align64_uint64_t_uint32_t(i64 %ptr, i64 %str) {
4660; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_uint32_t:
4661; CHECK-P10:       # %bb.0: # %entry
4662; CHECK-P10-NEXT:    pli r5, 244140625
4663; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
4664; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4665; CHECK-P10-NEXT:    stwx r4, r3, r5
4666; CHECK-P10-NEXT:    blr
4667;
4668; CHECK-PREP10-LABEL: st_disjoint_align64_uint64_t_uint32_t:
4669; CHECK-PREP10:       # %bb.0: # %entry
4670; CHECK-PREP10-NEXT:    lis r5, 3725
4671; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
4672; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4673; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4674; CHECK-PREP10-NEXT:    stwx r4, r3, r5
4675; CHECK-PREP10-NEXT:    blr
4676entry:
4677  %and = and i64 %ptr, -1099511627776
4678  %or = or i64 %and, 1000000000000
4679  %0 = inttoptr i64 %or to ptr
4680  %conv = trunc i64 %str to i32
4681  store atomic i32 %conv, ptr %0 monotonic, align 4096
4682  ret void
4683}
4684
4685; Function Attrs: nofree norecurse nounwind uwtable willreturn
4686define dso_local void @st_cst_align16_uint64_t_uint32_t(i64 %str) {
4687; CHECK-LABEL: st_cst_align16_uint64_t_uint32_t:
4688; CHECK:       # %bb.0: # %entry
4689; CHECK-NEXT:    stw r3, 4080(0)
4690; CHECK-NEXT:    blr
4691entry:
4692  %conv = trunc i64 %str to i32
4693  store atomic i32 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
4694  ret void
4695}
4696
4697; Function Attrs: nofree norecurse nounwind uwtable willreturn
4698define dso_local void @st_cst_align32_uint64_t_uint32_t(i64 %str) {
4699; CHECK-LABEL: st_cst_align32_uint64_t_uint32_t:
4700; CHECK:       # %bb.0: # %entry
4701; CHECK-NEXT:    lis r4, 153
4702; CHECK-NEXT:    stw r3, -27108(r4)
4703; CHECK-NEXT:    blr
4704entry:
4705  %conv = trunc i64 %str to i32
4706  store atomic i32 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
4707  ret void
4708}
4709
4710; Function Attrs: nofree norecurse nounwind uwtable willreturn
4711define dso_local void @st_cst_align64_uint64_t_uint32_t(i64 %str) {
4712; CHECK-P10-LABEL: st_cst_align64_uint64_t_uint32_t:
4713; CHECK-P10:       # %bb.0: # %entry
4714; CHECK-P10-NEXT:    pli r4, 244140625
4715; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4716; CHECK-P10-NEXT:    stw r3, 0(r4)
4717; CHECK-P10-NEXT:    blr
4718;
4719; CHECK-PREP10-LABEL: st_cst_align64_uint64_t_uint32_t:
4720; CHECK-PREP10:       # %bb.0: # %entry
4721; CHECK-PREP10-NEXT:    lis r4, 3725
4722; CHECK-PREP10-NEXT:    ori r4, r4, 19025
4723; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
4724; CHECK-PREP10-NEXT:    stw r3, 0(r4)
4725; CHECK-PREP10-NEXT:    blr
4726entry:
4727  %conv = trunc i64 %str to i32
4728  store atomic i32 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
4729  ret void
4730}
4731
4732; Function Attrs: nofree norecurse nounwind uwtable willreturn
4733define dso_local void @st_0_uint64_t_uint64_t(i64 %ptr, i64 %str) {
4734; CHECK-LABEL: st_0_uint64_t_uint64_t:
4735; CHECK:       # %bb.0: # %entry
4736; CHECK-NEXT:    std r4, 0(r3)
4737; CHECK-NEXT:    blr
4738entry:
4739  %0 = inttoptr i64 %ptr to ptr
4740  store atomic i64 %str, ptr %0 monotonic, align 8
4741  ret void
4742}
4743
4744; Function Attrs: nofree norecurse nounwind uwtable willreturn
4745define dso_local void @st_align16_uint64_t_uint64_t(ptr nocapture %ptr, i64 %str) {
4746; CHECK-LABEL: st_align16_uint64_t_uint64_t:
4747; CHECK:       # %bb.0: # %entry
4748; CHECK-NEXT:    std r4, 8(r3)
4749; CHECK-NEXT:    blr
4750entry:
4751  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
4752  store atomic i64 %str, ptr %add.ptr monotonic, align 8
4753  ret void
4754}
4755
4756; Function Attrs: nofree norecurse nounwind uwtable willreturn
4757define dso_local void @st_align32_uint64_t_uint64_t(ptr nocapture %ptr, i64 %str) {
4758; CHECK-P10-LABEL: st_align32_uint64_t_uint64_t:
4759; CHECK-P10:       # %bb.0: # %entry
4760; CHECK-P10-NEXT:    pstd r4, 99999000(r3), 0
4761; CHECK-P10-NEXT:    blr
4762;
4763; CHECK-PREP10-LABEL: st_align32_uint64_t_uint64_t:
4764; CHECK-PREP10:       # %bb.0: # %entry
4765; CHECK-PREP10-NEXT:    lis r5, 1525
4766; CHECK-PREP10-NEXT:    ori r5, r5, 56600
4767; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4768; CHECK-PREP10-NEXT:    blr
4769entry:
4770  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
4771  store atomic i64 %str, ptr %add.ptr monotonic, align 8
4772  ret void
4773}
4774
4775; Function Attrs: nofree norecurse nounwind uwtable willreturn
4776define dso_local void @st_align64_uint64_t_uint64_t(ptr nocapture %ptr, i64 %str) {
4777; CHECK-P10-LABEL: st_align64_uint64_t_uint64_t:
4778; CHECK-P10:       # %bb.0: # %entry
4779; CHECK-P10-NEXT:    pli r5, 244140625
4780; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4781; CHECK-P10-NEXT:    stdx r4, r3, r5
4782; CHECK-P10-NEXT:    blr
4783;
4784; CHECK-PREP10-LABEL: st_align64_uint64_t_uint64_t:
4785; CHECK-PREP10:       # %bb.0: # %entry
4786; CHECK-PREP10-NEXT:    lis r5, 3725
4787; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4788; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4789; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4790; CHECK-PREP10-NEXT:    blr
4791entry:
4792  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
4793  store atomic i64 %str, ptr %add.ptr monotonic, align 8
4794  ret void
4795}
4796
4797; Function Attrs: nofree norecurse nounwind uwtable willreturn
4798define dso_local void @st_reg_uint64_t_uint64_t(ptr nocapture %ptr, i64 %off, i64 %str) {
4799; CHECK-LABEL: st_reg_uint64_t_uint64_t:
4800; CHECK:       # %bb.0: # %entry
4801; CHECK-NEXT:    stdx r5, r3, r4
4802; CHECK-NEXT:    blr
4803entry:
4804  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
4805  store atomic i64 %str, ptr %add.ptr monotonic, align 8
4806  ret void
4807}
4808
4809; Function Attrs: nofree norecurse nounwind uwtable willreturn
4810define dso_local void @st_or1_uint64_t_uint64_t(i64 %ptr, i8 zeroext %off, i64 %str) {
4811; CHECK-LABEL: st_or1_uint64_t_uint64_t:
4812; CHECK:       # %bb.0: # %entry
4813; CHECK-NEXT:    or r3, r4, r3
4814; CHECK-NEXT:    std r5, 0(r3)
4815; CHECK-NEXT:    blr
4816entry:
4817  %conv = zext i8 %off to i64
4818  %or = or i64 %conv, %ptr
4819  %0 = inttoptr i64 %or to ptr
4820  store atomic i64 %str, ptr %0 monotonic, align 8
4821  ret void
4822}
4823
4824; Function Attrs: nofree norecurse nounwind uwtable willreturn
4825define dso_local void @st_not_disjoint16_uint64_t_uint64_t(i64 %ptr, i64 %str) {
4826; CHECK-LABEL: st_not_disjoint16_uint64_t_uint64_t:
4827; CHECK:       # %bb.0: # %entry
4828; CHECK-NEXT:    ori r3, r3, 6
4829; CHECK-NEXT:    std r4, 0(r3)
4830; CHECK-NEXT:    blr
4831entry:
4832  %or = or i64 %ptr, 6
4833  %0 = inttoptr i64 %or to ptr
4834  store atomic i64 %str, ptr %0 monotonic, align 8
4835  ret void
4836}
4837
4838; Function Attrs: nofree norecurse nounwind uwtable willreturn
4839define dso_local void @st_disjoint_align16_uint64_t_uint64_t(i64 %ptr, i64 %str) {
4840; CHECK-LABEL: st_disjoint_align16_uint64_t_uint64_t:
4841; CHECK:       # %bb.0: # %entry
4842; CHECK-NEXT:    rldicr r3, r3, 0, 51
4843; CHECK-NEXT:    std r4, 24(r3)
4844; CHECK-NEXT:    blr
4845entry:
4846  %and = and i64 %ptr, -4096
4847  %or = or i64 %and, 24
4848  %0 = inttoptr i64 %or to ptr
4849  store atomic i64 %str, ptr %0 monotonic, align 8
4850  ret void
4851}
4852
4853; Function Attrs: nofree norecurse nounwind uwtable willreturn
4854define dso_local void @st_not_disjoint32_uint64_t_uint64_t(i64 %ptr, i64 %str) {
4855; CHECK-LABEL: st_not_disjoint32_uint64_t_uint64_t:
4856; CHECK:       # %bb.0: # %entry
4857; CHECK-NEXT:    ori r3, r3, 34463
4858; CHECK-NEXT:    oris r3, r3, 1
4859; CHECK-NEXT:    std r4, 0(r3)
4860; CHECK-NEXT:    blr
4861entry:
4862  %or = or i64 %ptr, 99999
4863  %0 = inttoptr i64 %or to ptr
4864  store atomic i64 %str, ptr %0 monotonic, align 8
4865  ret void
4866}
4867
4868; Function Attrs: nofree norecurse nounwind uwtable willreturn
4869define dso_local void @st_disjoint_align32_uint64_t_uint64_t(i64 %ptr, i64 %str) {
4870; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_uint64_t:
4871; CHECK-P10:       # %bb.0: # %entry
4872; CHECK-P10-NEXT:    lis r5, -15264
4873; CHECK-P10-NEXT:    and r3, r3, r5
4874; CHECK-P10-NEXT:    pstd r4, 999990000(r3), 0
4875; CHECK-P10-NEXT:    blr
4876;
4877; CHECK-PREP10-LABEL: st_disjoint_align32_uint64_t_uint64_t:
4878; CHECK-PREP10:       # %bb.0: # %entry
4879; CHECK-PREP10-NEXT:    lis r5, -15264
4880; CHECK-PREP10-NEXT:    and r3, r3, r5
4881; CHECK-PREP10-NEXT:    lis r5, 15258
4882; CHECK-PREP10-NEXT:    ori r5, r5, 41712
4883; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4884; CHECK-PREP10-NEXT:    blr
4885entry:
4886  %and = and i64 %ptr, -1000341504
4887  %or = or i64 %and, 999990000
4888  %0 = inttoptr i64 %or to ptr
4889  store atomic i64 %str, ptr %0 monotonic, align 16
4890  ret void
4891}
4892
4893; Function Attrs: nofree norecurse nounwind uwtable willreturn
4894define dso_local void @st_not_disjoint64_uint64_t_uint64_t(i64 %ptr, i64 %str) {
4895; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_uint64_t:
4896; CHECK-P10:       # %bb.0: # %entry
4897; CHECK-P10-NEXT:    pli r5, 232
4898; CHECK-P10-NEXT:    pli r6, 3567587329
4899; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
4900; CHECK-P10-NEXT:    or r3, r3, r6
4901; CHECK-P10-NEXT:    std r4, 0(r3)
4902; CHECK-P10-NEXT:    blr
4903;
4904; CHECK-PREP10-LABEL: st_not_disjoint64_uint64_t_uint64_t:
4905; CHECK-PREP10:       # %bb.0: # %entry
4906; CHECK-PREP10-NEXT:    li r5, 29
4907; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
4908; CHECK-PREP10-NEXT:    oris r5, r5, 54437
4909; CHECK-PREP10-NEXT:    ori r5, r5, 4097
4910; CHECK-PREP10-NEXT:    or r3, r3, r5
4911; CHECK-PREP10-NEXT:    std r4, 0(r3)
4912; CHECK-PREP10-NEXT:    blr
4913entry:
4914  %or = or i64 %ptr, 1000000000001
4915  %0 = inttoptr i64 %or to ptr
4916  store atomic i64 %str, ptr %0 monotonic, align 8
4917  ret void
4918}
4919
4920; Function Attrs: nofree norecurse nounwind uwtable willreturn
4921define dso_local void @st_disjoint_align64_uint64_t_uint64_t(i64 %ptr, i64 %str) {
4922; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_uint64_t:
4923; CHECK-P10:       # %bb.0: # %entry
4924; CHECK-P10-NEXT:    pli r5, 244140625
4925; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
4926; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4927; CHECK-P10-NEXT:    stdx r4, r3, r5
4928; CHECK-P10-NEXT:    blr
4929;
4930; CHECK-PREP10-LABEL: st_disjoint_align64_uint64_t_uint64_t:
4931; CHECK-PREP10:       # %bb.0: # %entry
4932; CHECK-PREP10-NEXT:    lis r5, 3725
4933; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
4934; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4935; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4936; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4937; CHECK-PREP10-NEXT:    blr
4938entry:
4939  %and = and i64 %ptr, -1099511627776
4940  %or = or i64 %and, 1000000000000
4941  %0 = inttoptr i64 %or to ptr
4942  store atomic i64 %str, ptr %0 monotonic, align 4096
4943  ret void
4944}
4945
4946; Function Attrs: nofree norecurse nounwind uwtable willreturn
4947define dso_local void @st_cst_align16_uint64_t_uint64_t(i64 %str) {
4948; CHECK-LABEL: st_cst_align16_uint64_t_uint64_t:
4949; CHECK:       # %bb.0: # %entry
4950; CHECK-NEXT:    std r3, 4080(0)
4951; CHECK-NEXT:    blr
4952entry:
4953  store atomic i64 %str, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
4954  ret void
4955}
4956
4957; Function Attrs: nofree norecurse nounwind uwtable willreturn
4958define dso_local void @st_cst_align32_uint64_t_uint64_t(i64 %str) {
4959; CHECK-LABEL: st_cst_align32_uint64_t_uint64_t:
4960; CHECK:       # %bb.0: # %entry
4961; CHECK-NEXT:    lis r4, 153
4962; CHECK-NEXT:    std r3, -27108(r4)
4963; CHECK-NEXT:    blr
4964entry:
4965  store atomic i64 %str, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8
4966  ret void
4967}
4968
4969; Function Attrs: nofree norecurse nounwind uwtable willreturn
4970define dso_local void @st_cst_align64_uint64_t_uint64_t(i64 %str) {
4971; CHECK-P10-LABEL: st_cst_align64_uint64_t_uint64_t:
4972; CHECK-P10:       # %bb.0: # %entry
4973; CHECK-P10-NEXT:    pli r4, 244140625
4974; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4975; CHECK-P10-NEXT:    std r3, 0(r4)
4976; CHECK-P10-NEXT:    blr
4977;
4978; CHECK-PREP10-LABEL: st_cst_align64_uint64_t_uint64_t:
4979; CHECK-PREP10:       # %bb.0: # %entry
4980; CHECK-PREP10-NEXT:    lis r4, 3725
4981; CHECK-PREP10-NEXT:    ori r4, r4, 19025
4982; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
4983; CHECK-PREP10-NEXT:    std r3, 0(r4)
4984; CHECK-PREP10-NEXT:    blr
4985entry:
4986  store atomic i64 %str, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
4987  ret void
4988}
4989;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
4990; CHECK-P8: {{.*}}
4991; CHECK-P9: {{.*}}
4992