xref: /llvm-project/llvm/test/CodeGen/PowerPC/atomics-i32-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
11; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
12; RUN:   -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
13; RUN:   < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10
14; 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
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
20
21; Function Attrs: nofree norecurse nounwind uwtable willreturn
22define dso_local signext i32 @ld_0_int32_t_uint8_t(i64 %ptr) {
23; CHECK-LABEL: ld_0_int32_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 i32
31  ret i32 %conv
32}
33
34; Function Attrs: nofree norecurse nounwind uwtable willreturn
35define dso_local signext i32 @ld_align16_int32_t_uint8_t(ptr nocapture readonly %ptr) {
36; CHECK-LABEL: ld_align16_int32_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 i32
44  ret i32 %conv
45}
46
47; Function Attrs: nofree norecurse nounwind uwtable willreturn
48define dso_local signext i32 @ld_align32_int32_t_uint8_t(ptr nocapture readonly %ptr) {
49; CHECK-P10-LABEL: ld_align32_int32_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_int32_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 i32
65  ret i32 %conv
66}
67
68; Function Attrs: nofree norecurse nounwind uwtable willreturn
69define dso_local signext i32 @ld_align64_int32_t_uint8_t(ptr nocapture readonly %ptr) {
70; CHECK-P10-LABEL: ld_align64_int32_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_int32_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 i32
88  ret i32 %conv
89}
90
91; Function Attrs: nofree norecurse nounwind uwtable willreturn
92define dso_local signext i32 @ld_reg_int32_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) {
93; CHECK-LABEL: ld_reg_int32_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 i32
101  ret i32 %conv
102}
103
104; Function Attrs: nofree norecurse nounwind uwtable willreturn
105define dso_local signext i32 @ld_or_int32_t_uint8_t(i64 %ptr, i8 zeroext %off) {
106; CHECK-LABEL: ld_or_int32_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 i32
117  ret i32 %conv1
118}
119
120; Function Attrs: nofree norecurse nounwind uwtable willreturn
121define dso_local signext i32 @ld_not_disjoint16_int32_t_uint8_t(i64 %ptr) {
122; CHECK-LABEL: ld_not_disjoint16_int32_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 i32
132  ret i32 %conv
133}
134
135; Function Attrs: nofree norecurse nounwind uwtable willreturn
136define dso_local signext i32 @ld_disjoint_align16_int32_t_uint8_t(i64 %ptr) {
137; CHECK-LABEL: ld_disjoint_align16_int32_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 i32
148  ret i32 %conv
149}
150
151; Function Attrs: nofree norecurse nounwind uwtable willreturn
152define dso_local signext i32 @ld_not_disjoint32_int32_t_uint8_t(i64 %ptr) {
153; CHECK-LABEL: ld_not_disjoint32_int32_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 i32
164  ret i32 %conv
165}
166
167; Function Attrs: nofree norecurse nounwind uwtable willreturn
168define dso_local signext i32 @ld_disjoint_align32_int32_t_uint8_t(i64 %ptr) {
169; CHECK-P10-LABEL: ld_disjoint_align32_int32_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_int32_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 i32
191  ret i32 %conv
192}
193
194; Function Attrs: nofree norecurse nounwind uwtable willreturn
195define dso_local signext i32 @ld_not_disjoint64_int32_t_uint8_t(i64 %ptr) {
196; CHECK-P10-LABEL: ld_not_disjoint64_int32_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_int32_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 i32
219  ret i32 %conv
220}
221
222; Function Attrs: nofree norecurse nounwind uwtable willreturn
223define dso_local signext i32 @ld_disjoint_align64_int32_t_uint8_t(i64 %ptr) {
224; CHECK-P10-LABEL: ld_disjoint_align64_int32_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_int32_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 i32
246  ret i32 %conv
247}
248
249; Function Attrs: nofree norecurse nounwind uwtable willreturn
250define dso_local signext i32 @ld_cst_align16_int32_t_uint8_t() {
251; CHECK-LABEL: ld_cst_align16_int32_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 i32
258  ret i32 %conv
259}
260
261; Function Attrs: nofree norecurse nounwind uwtable willreturn
262define dso_local signext i32 @ld_cst_align32_int32_t_uint8_t() {
263; CHECK-LABEL: ld_cst_align32_int32_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 i32
271  ret i32 %conv
272}
273
274; Function Attrs: nofree norecurse nounwind uwtable willreturn
275define dso_local signext i32 @ld_cst_align64_int32_t_uint8_t() {
276; CHECK-P10-LABEL: ld_cst_align64_int32_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_int32_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 i32
293  ret i32 %conv
294}
295
296; Function Attrs: nofree norecurse nounwind uwtable willreturn
297define dso_local signext i32 @ld_0_int32_t_int8_t(i64 %ptr) {
298; CHECK-LABEL: ld_0_int32_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 i32
307  ret i32 %conv
308}
309
310; Function Attrs: nofree norecurse nounwind uwtable willreturn
311define dso_local signext i32 @ld_align16_int32_t_int8_t(ptr nocapture readonly %ptr) {
312; CHECK-LABEL: ld_align16_int32_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 i32
321  ret i32 %conv
322}
323
324; Function Attrs: nofree norecurse nounwind uwtable willreturn
325define dso_local signext i32 @ld_align32_int32_t_int8_t(ptr nocapture readonly %ptr) {
326; CHECK-P10-LABEL: ld_align32_int32_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_int32_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 i32
343  ret i32 %conv
344}
345
346; Function Attrs: nofree norecurse nounwind uwtable willreturn
347define dso_local signext i32 @ld_align64_int32_t_int8_t(ptr nocapture readonly %ptr) {
348; CHECK-P10-LABEL: ld_align64_int32_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_int32_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 i32
368  ret i32 %conv
369}
370
371; Function Attrs: nofree norecurse nounwind uwtable willreturn
372define dso_local signext i32 @ld_reg_int32_t_int8_t(ptr nocapture readonly %ptr, i64 %off) {
373; CHECK-LABEL: ld_reg_int32_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 i32
382  ret i32 %conv
383}
384
385; Function Attrs: nofree norecurse nounwind uwtable willreturn
386define dso_local signext i32 @ld_or_int32_t_int8_t(i64 %ptr, i8 zeroext %off) {
387; CHECK-LABEL: ld_or_int32_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 i32
399  ret i32 %conv1
400}
401
402; Function Attrs: nofree norecurse nounwind uwtable willreturn
403define dso_local signext i32 @ld_not_disjoint16_int32_t_int8_t(i64 %ptr) {
404; CHECK-LABEL: ld_not_disjoint16_int32_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 i32
415  ret i32 %conv
416}
417
418; Function Attrs: nofree norecurse nounwind uwtable willreturn
419define dso_local signext i32 @ld_disjoint_align16_int32_t_int8_t(i64 %ptr) {
420; CHECK-LABEL: ld_disjoint_align16_int32_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 i32
432  ret i32 %conv
433}
434
435; Function Attrs: nofree norecurse nounwind uwtable willreturn
436define dso_local signext i32 @ld_not_disjoint32_int32_t_int8_t(i64 %ptr) {
437; CHECK-LABEL: ld_not_disjoint32_int32_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 i32
449  ret i32 %conv
450}
451
452; Function Attrs: nofree norecurse nounwind uwtable willreturn
453define dso_local signext i32 @ld_disjoint_align32_int32_t_int8_t(i64 %ptr) {
454; CHECK-P10-LABEL: ld_disjoint_align32_int32_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_int32_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 i32
477  ret i32 %conv
478}
479
480; Function Attrs: nofree norecurse nounwind uwtable willreturn
481define dso_local signext i32 @ld_not_disjoint64_int32_t_int8_t(i64 %ptr) {
482; CHECK-P10-LABEL: ld_not_disjoint64_int32_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_int32_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 i32
507  ret i32 %conv
508}
509
510; Function Attrs: nofree norecurse nounwind uwtable willreturn
511define dso_local signext i32 @ld_disjoint_align64_int32_t_int8_t(i64 %ptr) {
512; CHECK-P10-LABEL: ld_disjoint_align64_int32_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_int32_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 i32
536  ret i32 %conv
537}
538
539; Function Attrs: nofree norecurse nounwind uwtable willreturn
540define dso_local signext i32 @ld_cst_align16_int32_t_int8_t() {
541; CHECK-LABEL: ld_cst_align16_int32_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 i32
549  ret i32 %conv
550}
551
552; Function Attrs: nofree norecurse nounwind uwtable willreturn
553define dso_local signext i32 @ld_cst_align32_int32_t_int8_t() {
554; CHECK-LABEL: ld_cst_align32_int32_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 i32
563  ret i32 %conv
564}
565
566; Function Attrs: nofree norecurse nounwind uwtable willreturn
567define dso_local signext i32 @ld_cst_align64_int32_t_int8_t() {
568; CHECK-P10-LABEL: ld_cst_align64_int32_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_int32_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 i32
587  ret i32 %conv
588}
589
590; Function Attrs: nofree norecurse nounwind uwtable willreturn
591define dso_local signext i32 @ld_0_int32_t_uint16_t(i64 %ptr) {
592; CHECK-LABEL: ld_0_int32_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 i32
600  ret i32 %conv
601}
602
603; Function Attrs: nofree norecurse nounwind uwtable willreturn
604define dso_local signext i32 @ld_align16_int32_t_uint16_t(ptr nocapture readonly %ptr) {
605; CHECK-LABEL: ld_align16_int32_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 i32
613  ret i32 %conv
614}
615
616; Function Attrs: nofree norecurse nounwind uwtable willreturn
617define dso_local signext i32 @ld_align32_int32_t_uint16_t(ptr nocapture readonly %ptr) {
618; CHECK-P10-LABEL: ld_align32_int32_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_int32_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 i32
634  ret i32 %conv
635}
636
637; Function Attrs: nofree norecurse nounwind uwtable willreturn
638define dso_local signext i32 @ld_align64_int32_t_uint16_t(ptr nocapture readonly %ptr) {
639; CHECK-P10-LABEL: ld_align64_int32_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_int32_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 i32
657  ret i32 %conv
658}
659
660; Function Attrs: nofree norecurse nounwind uwtable willreturn
661define dso_local signext i32 @ld_reg_int32_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) {
662; CHECK-LABEL: ld_reg_int32_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 i32
670  ret i32 %conv
671}
672
673; Function Attrs: nofree norecurse nounwind uwtable willreturn
674define dso_local signext i32 @ld_or_int32_t_uint16_t(i64 %ptr, i8 zeroext %off) {
675; CHECK-LABEL: ld_or_int32_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 i32
686  ret i32 %conv1
687}
688
689; Function Attrs: nofree norecurse nounwind uwtable willreturn
690define dso_local signext i32 @ld_not_disjoint16_int32_t_uint16_t(i64 %ptr) {
691; CHECK-LABEL: ld_not_disjoint16_int32_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 i32
701  ret i32 %conv
702}
703
704; Function Attrs: nofree norecurse nounwind uwtable willreturn
705define dso_local signext i32 @ld_disjoint_align16_int32_t_uint16_t(i64 %ptr) {
706; CHECK-LABEL: ld_disjoint_align16_int32_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 i32
717  ret i32 %conv
718}
719
720; Function Attrs: nofree norecurse nounwind uwtable willreturn
721define dso_local signext i32 @ld_not_disjoint32_int32_t_uint16_t(i64 %ptr) {
722; CHECK-LABEL: ld_not_disjoint32_int32_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 i32
733  ret i32 %conv
734}
735
736; Function Attrs: nofree norecurse nounwind uwtable willreturn
737define dso_local signext i32 @ld_disjoint_align32_int32_t_uint16_t(i64 %ptr) {
738; CHECK-P10-LABEL: ld_disjoint_align32_int32_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_int32_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 i32
760  ret i32 %conv
761}
762
763; Function Attrs: nofree norecurse nounwind uwtable willreturn
764define dso_local signext i32 @ld_not_disjoint64_int32_t_uint16_t(i64 %ptr) {
765; CHECK-P10-LABEL: ld_not_disjoint64_int32_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_int32_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 i32
788  ret i32 %conv
789}
790
791; Function Attrs: nofree norecurse nounwind uwtable willreturn
792define dso_local signext i32 @ld_disjoint_align64_int32_t_uint16_t(i64 %ptr) {
793; CHECK-P10-LABEL: ld_disjoint_align64_int32_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_int32_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 i32
815  ret i32 %conv
816}
817
818; Function Attrs: nofree norecurse nounwind uwtable willreturn
819define dso_local signext i32 @ld_cst_align16_int32_t_uint16_t() {
820; CHECK-LABEL: ld_cst_align16_int32_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 i32
827  ret i32 %conv
828}
829
830; Function Attrs: nofree norecurse nounwind uwtable willreturn
831define dso_local signext i32 @ld_cst_align32_int32_t_uint16_t() {
832; CHECK-LABEL: ld_cst_align32_int32_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 i32
840  ret i32 %conv
841}
842
843; Function Attrs: nofree norecurse nounwind uwtable willreturn
844define dso_local signext i32 @ld_cst_align64_int32_t_uint16_t() {
845; CHECK-P10-LABEL: ld_cst_align64_int32_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_int32_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 i32
862  ret i32 %conv
863}
864
865; Function Attrs: nofree norecurse nounwind uwtable willreturn
866define dso_local signext i32 @ld_0_int32_t_int16_t(i64 %ptr) {
867; CHECK-LABEL: ld_0_int32_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 i32
876  ret i32 %conv
877}
878
879; Function Attrs: nofree norecurse nounwind uwtable willreturn
880define dso_local signext i32 @ld_align16_int32_t_int16_t(ptr nocapture readonly %ptr) {
881; CHECK-LABEL: ld_align16_int32_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 i32
890  ret i32 %conv
891}
892
893; Function Attrs: nofree norecurse nounwind uwtable willreturn
894define dso_local signext i32 @ld_align32_int32_t_int16_t(ptr nocapture readonly %ptr) {
895; CHECK-P10-LABEL: ld_align32_int32_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_int32_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 i32
912  ret i32 %conv
913}
914
915; Function Attrs: nofree norecurse nounwind uwtable willreturn
916define dso_local signext i32 @ld_align64_int32_t_int16_t(ptr nocapture readonly %ptr) {
917; CHECK-P10-LABEL: ld_align64_int32_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_int32_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 i32
937  ret i32 %conv
938}
939
940; Function Attrs: nofree norecurse nounwind uwtable willreturn
941define dso_local signext i32 @ld_reg_int32_t_int16_t(ptr nocapture readonly %ptr, i64 %off) {
942; CHECK-LABEL: ld_reg_int32_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 i32
951  ret i32 %conv
952}
953
954; Function Attrs: nofree norecurse nounwind uwtable willreturn
955define dso_local signext i32 @ld_or_int32_t_int16_t(i64 %ptr, i8 zeroext %off) {
956; CHECK-LABEL: ld_or_int32_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 i32
968  ret i32 %conv1
969}
970
971; Function Attrs: nofree norecurse nounwind uwtable willreturn
972define dso_local signext i32 @ld_not_disjoint16_int32_t_int16_t(i64 %ptr) {
973; CHECK-LABEL: ld_not_disjoint16_int32_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 i32
984  ret i32 %conv
985}
986
987; Function Attrs: nofree norecurse nounwind uwtable willreturn
988define dso_local signext i32 @ld_disjoint_align16_int32_t_int16_t(i64 %ptr) {
989; CHECK-LABEL: ld_disjoint_align16_int32_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 i32
1001  ret i32 %conv
1002}
1003
1004; Function Attrs: nofree norecurse nounwind uwtable willreturn
1005define dso_local signext i32 @ld_not_disjoint32_int32_t_int16_t(i64 %ptr) {
1006; CHECK-LABEL: ld_not_disjoint32_int32_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 i32
1018  ret i32 %conv
1019}
1020
1021; Function Attrs: nofree norecurse nounwind uwtable willreturn
1022define dso_local signext i32 @ld_disjoint_align32_int32_t_int16_t(i64 %ptr) {
1023; CHECK-P10-LABEL: ld_disjoint_align32_int32_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_int32_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 i32
1046  ret i32 %conv
1047}
1048
1049; Function Attrs: nofree norecurse nounwind uwtable willreturn
1050define dso_local signext i32 @ld_not_disjoint64_int32_t_int16_t(i64 %ptr) {
1051; CHECK-P10-LABEL: ld_not_disjoint64_int32_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_int32_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 i32
1076  ret i32 %conv
1077}
1078
1079; Function Attrs: nofree norecurse nounwind uwtable willreturn
1080define dso_local signext i32 @ld_disjoint_align64_int32_t_int16_t(i64 %ptr) {
1081; CHECK-P10-LABEL: ld_disjoint_align64_int32_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_int32_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 i32
1105  ret i32 %conv
1106}
1107
1108; Function Attrs: nofree norecurse nounwind uwtable willreturn
1109define dso_local signext i32 @ld_cst_align16_int32_t_int16_t() {
1110; CHECK-LABEL: ld_cst_align16_int32_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 i32
1118  ret i32 %conv
1119}
1120
1121; Function Attrs: nofree norecurse nounwind uwtable willreturn
1122define dso_local signext i32 @ld_cst_align32_int32_t_int16_t() {
1123; CHECK-LABEL: ld_cst_align32_int32_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 i32
1132  ret i32 %conv
1133}
1134
1135; Function Attrs: nofree norecurse nounwind uwtable willreturn
1136define dso_local signext i32 @ld_cst_align64_int32_t_int16_t() {
1137; CHECK-P10-LABEL: ld_cst_align64_int32_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_int32_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 i32
1156  ret i32 %conv
1157}
1158
1159; Function Attrs: nofree norecurse nounwind uwtable willreturn
1160define dso_local signext i32 @ld_0_int32_t_uint32_t(i64 %ptr) {
1161; CHECK-LABEL: ld_0_int32_t_uint32_t:
1162; CHECK:       # %bb.0: # %entry
1163; CHECK-NEXT:    lwa 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  ret i32 %1
1169}
1170
1171; Function Attrs: nofree norecurse nounwind uwtable willreturn
1172define dso_local signext i32 @ld_align16_int32_t_uint32_t(ptr nocapture readonly %ptr) {
1173; CHECK-LABEL: ld_align16_int32_t_uint32_t:
1174; CHECK:       # %bb.0: # %entry
1175; CHECK-NEXT:    lwa r3, 8(r3)
1176; CHECK-NEXT:    blr
1177entry:
1178  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
1179  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1180  ret i32 %0
1181}
1182
1183; Function Attrs: nofree norecurse nounwind uwtable willreturn
1184define dso_local signext i32 @ld_align32_int32_t_uint32_t(ptr nocapture readonly %ptr) {
1185; CHECK-P10-LABEL: ld_align32_int32_t_uint32_t:
1186; CHECK-P10:       # %bb.0: # %entry
1187; CHECK-P10-NEXT:    plwz r3, 99999000(r3), 0
1188; CHECK-P10-NEXT:    extsw r3, r3
1189; CHECK-P10-NEXT:    blr
1190;
1191; CHECK-PREP10-LABEL: ld_align32_int32_t_uint32_t:
1192; CHECK-PREP10:       # %bb.0: # %entry
1193; CHECK-PREP10-NEXT:    lis r4, 1525
1194; CHECK-PREP10-NEXT:    ori r4, r4, 56600
1195; CHECK-PREP10-NEXT:    lwax r3, r3, r4
1196; CHECK-PREP10-NEXT:    blr
1197entry:
1198  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
1199  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1200  ret i32 %0
1201}
1202
1203; Function Attrs: nofree norecurse nounwind uwtable willreturn
1204define dso_local signext i32 @ld_align64_int32_t_uint32_t(ptr nocapture readonly %ptr) {
1205; CHECK-P10-LABEL: ld_align64_int32_t_uint32_t:
1206; CHECK-P10:       # %bb.0: # %entry
1207; CHECK-P10-NEXT:    pli r4, 244140625
1208; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1209; CHECK-P10-NEXT:    lwax r3, r3, r4
1210; CHECK-P10-NEXT:    blr
1211;
1212; CHECK-PREP10-LABEL: ld_align64_int32_t_uint32_t:
1213; CHECK-PREP10:       # %bb.0: # %entry
1214; CHECK-PREP10-NEXT:    lis r4, 3725
1215; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1216; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1217; CHECK-PREP10-NEXT:    lwax r3, r3, r4
1218; CHECK-PREP10-NEXT:    blr
1219entry:
1220  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
1221  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1222  ret i32 %0
1223}
1224
1225; Function Attrs: nofree norecurse nounwind uwtable willreturn
1226define dso_local signext i32 @ld_reg_int32_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) {
1227; CHECK-LABEL: ld_reg_int32_t_uint32_t:
1228; CHECK:       # %bb.0: # %entry
1229; CHECK-NEXT:    lwax r3, r3, r4
1230; CHECK-NEXT:    blr
1231entry:
1232  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
1233  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1234  ret i32 %0
1235}
1236
1237; Function Attrs: nofree norecurse nounwind uwtable willreturn
1238define dso_local signext i32 @ld_or_int32_t_uint32_t(i64 %ptr, i8 zeroext %off) {
1239; CHECK-LABEL: ld_or_int32_t_uint32_t:
1240; CHECK:       # %bb.0: # %entry
1241; CHECK-NEXT:    or r3, r4, r3
1242; CHECK-NEXT:    lwa r3, 0(r3)
1243; CHECK-NEXT:    blr
1244entry:
1245  %conv = zext i8 %off to i64
1246  %or = or i64 %conv, %ptr
1247  %0 = inttoptr i64 %or to ptr
1248  %1 = load atomic i32, ptr %0 monotonic, align 4
1249  ret i32 %1
1250}
1251
1252; Function Attrs: nofree norecurse nounwind uwtable willreturn
1253define dso_local signext i32 @ld_not_disjoint16_int32_t_uint32_t(i64 %ptr) {
1254; CHECK-LABEL: ld_not_disjoint16_int32_t_uint32_t:
1255; CHECK:       # %bb.0: # %entry
1256; CHECK-NEXT:    ori r3, r3, 6
1257; CHECK-NEXT:    lwa r3, 0(r3)
1258; CHECK-NEXT:    blr
1259entry:
1260  %or = or i64 %ptr, 6
1261  %0 = inttoptr i64 %or to ptr
1262  %1 = load atomic i32, ptr %0 monotonic, align 4
1263  ret i32 %1
1264}
1265
1266; Function Attrs: nofree norecurse nounwind uwtable willreturn
1267define dso_local signext i32 @ld_disjoint_align16_int32_t_uint32_t(i64 %ptr) {
1268; CHECK-LABEL: ld_disjoint_align16_int32_t_uint32_t:
1269; CHECK:       # %bb.0: # %entry
1270; CHECK-NEXT:    rldicr r3, r3, 0, 51
1271; CHECK-NEXT:    lwa r3, 24(r3)
1272; CHECK-NEXT:    blr
1273entry:
1274  %and = and i64 %ptr, -4096
1275  %or = or i64 %and, 24
1276  %0 = inttoptr i64 %or to ptr
1277  %1 = load atomic i32, ptr %0 monotonic, align 8
1278  ret i32 %1
1279}
1280
1281; Function Attrs: nofree norecurse nounwind uwtable willreturn
1282define dso_local signext i32 @ld_not_disjoint32_int32_t_uint32_t(i64 %ptr) {
1283; CHECK-LABEL: ld_not_disjoint32_int32_t_uint32_t:
1284; CHECK:       # %bb.0: # %entry
1285; CHECK-NEXT:    ori r3, r3, 34463
1286; CHECK-NEXT:    oris r3, r3, 1
1287; CHECK-NEXT:    lwa r3, 0(r3)
1288; CHECK-NEXT:    blr
1289entry:
1290  %or = or i64 %ptr, 99999
1291  %0 = inttoptr i64 %or to ptr
1292  %1 = load atomic i32, ptr %0 monotonic, align 4
1293  ret i32 %1
1294}
1295
1296; Function Attrs: nofree norecurse nounwind uwtable willreturn
1297define dso_local signext i32 @ld_disjoint_align32_int32_t_uint32_t(i64 %ptr) {
1298; CHECK-P10-LABEL: ld_disjoint_align32_int32_t_uint32_t:
1299; CHECK-P10:       # %bb.0: # %entry
1300; CHECK-P10-NEXT:    lis r4, -15264
1301; CHECK-P10-NEXT:    and r3, r3, r4
1302; CHECK-P10-NEXT:    plwz r3, 999990000(r3), 0
1303; CHECK-P10-NEXT:    extsw r3, r3
1304; CHECK-P10-NEXT:    blr
1305;
1306; CHECK-PREP10-LABEL: ld_disjoint_align32_int32_t_uint32_t:
1307; CHECK-PREP10:       # %bb.0: # %entry
1308; CHECK-PREP10-NEXT:    lis r4, -15264
1309; CHECK-PREP10-NEXT:    and r3, r3, r4
1310; CHECK-PREP10-NEXT:    lis r4, 15258
1311; CHECK-PREP10-NEXT:    ori r4, r4, 41712
1312; CHECK-PREP10-NEXT:    lwax r3, r3, r4
1313; CHECK-PREP10-NEXT:    blr
1314entry:
1315  %and = and i64 %ptr, -1000341504
1316  %or = or i64 %and, 999990000
1317  %0 = inttoptr i64 %or to ptr
1318  %1 = load atomic i32, ptr %0 monotonic, align 16
1319  ret i32 %1
1320}
1321
1322; Function Attrs: nofree norecurse nounwind uwtable willreturn
1323define dso_local signext i32 @ld_not_disjoint64_int32_t_uint32_t(i64 %ptr) {
1324; CHECK-P10-LABEL: ld_not_disjoint64_int32_t_uint32_t:
1325; CHECK-P10:       # %bb.0: # %entry
1326; CHECK-P10-NEXT:    pli r4, 232
1327; CHECK-P10-NEXT:    pli r5, 3567587329
1328; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1329; CHECK-P10-NEXT:    or r3, r3, r5
1330; CHECK-P10-NEXT:    lwa r3, 0(r3)
1331; CHECK-P10-NEXT:    blr
1332;
1333; CHECK-PREP10-LABEL: ld_not_disjoint64_int32_t_uint32_t:
1334; CHECK-PREP10:       # %bb.0: # %entry
1335; CHECK-PREP10-NEXT:    li r4, 29
1336; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
1337; CHECK-PREP10-NEXT:    oris r4, r4, 54437
1338; CHECK-PREP10-NEXT:    ori r4, r4, 4097
1339; CHECK-PREP10-NEXT:    or r3, r3, r4
1340; CHECK-PREP10-NEXT:    lwa r3, 0(r3)
1341; CHECK-PREP10-NEXT:    blr
1342entry:
1343  %or = or i64 %ptr, 1000000000001
1344  %0 = inttoptr i64 %or to ptr
1345  %1 = load atomic i32, ptr %0 monotonic, align 4
1346  ret i32 %1
1347}
1348
1349; Function Attrs: nofree norecurse nounwind uwtable willreturn
1350define dso_local signext i32 @ld_disjoint_align64_int32_t_uint32_t(i64 %ptr) {
1351; CHECK-P10-LABEL: ld_disjoint_align64_int32_t_uint32_t:
1352; CHECK-P10:       # %bb.0: # %entry
1353; CHECK-P10-NEXT:    pli r4, 244140625
1354; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1355; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1356; CHECK-P10-NEXT:    lwax r3, r3, r4
1357; CHECK-P10-NEXT:    blr
1358;
1359; CHECK-PREP10-LABEL: ld_disjoint_align64_int32_t_uint32_t:
1360; CHECK-PREP10:       # %bb.0: # %entry
1361; CHECK-PREP10-NEXT:    lis r4, 3725
1362; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
1363; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1364; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1365; CHECK-PREP10-NEXT:    lwax r3, r3, r4
1366; CHECK-PREP10-NEXT:    blr
1367entry:
1368  %and = and i64 %ptr, -1099511627776
1369  %or = or i64 %and, 1000000000000
1370  %0 = inttoptr i64 %or to ptr
1371  %1 = load atomic i32, ptr %0 monotonic, align 4096
1372  ret i32 %1
1373}
1374
1375; Function Attrs: nofree norecurse nounwind uwtable willreturn
1376define dso_local signext i32 @ld_cst_align16_int32_t_uint32_t() {
1377; CHECK-LABEL: ld_cst_align16_int32_t_uint32_t:
1378; CHECK:       # %bb.0: # %entry
1379; CHECK-NEXT:    lwa r3, 4080(0)
1380; CHECK-NEXT:    blr
1381entry:
1382  %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
1383  ret i32 %0
1384}
1385
1386; Function Attrs: nofree norecurse nounwind uwtable willreturn
1387define dso_local signext i32 @ld_cst_align32_int32_t_uint32_t() {
1388; CHECK-LABEL: ld_cst_align32_int32_t_uint32_t:
1389; CHECK:       # %bb.0: # %entry
1390; CHECK-NEXT:    lis r3, 153
1391; CHECK-NEXT:    lwa r3, -27108(r3)
1392; CHECK-NEXT:    blr
1393entry:
1394  %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
1395  ret i32 %0
1396}
1397
1398; Function Attrs: nofree norecurse nounwind uwtable willreturn
1399define dso_local signext i32 @ld_cst_align64_int32_t_uint32_t() {
1400; CHECK-P10-LABEL: ld_cst_align64_int32_t_uint32_t:
1401; CHECK-P10:       # %bb.0: # %entry
1402; CHECK-P10-NEXT:    pli r3, 244140625
1403; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
1404; CHECK-P10-NEXT:    lwa r3, 0(r3)
1405; CHECK-P10-NEXT:    blr
1406;
1407; CHECK-PREP10-LABEL: ld_cst_align64_int32_t_uint32_t:
1408; CHECK-PREP10:       # %bb.0: # %entry
1409; CHECK-PREP10-NEXT:    lis r3, 3725
1410; CHECK-PREP10-NEXT:    ori r3, r3, 19025
1411; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
1412; CHECK-PREP10-NEXT:    lwa r3, 0(r3)
1413; CHECK-PREP10-NEXT:    blr
1414entry:
1415  %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
1416  ret i32 %0
1417}
1418
1419; Function Attrs: nofree norecurse nounwind uwtable willreturn
1420define dso_local signext i32 @ld_0_int32_t_uint64_t(i64 %ptr) {
1421; CHECK-LABEL: ld_0_int32_t_uint64_t:
1422; CHECK:       # %bb.0: # %entry
1423; CHECK-NEXT:    ld r3, 0(r3)
1424; CHECK-NEXT:    extsw r3, r3
1425; CHECK-NEXT:    blr
1426entry:
1427  %0 = inttoptr i64 %ptr to ptr
1428  %1 = load atomic i64, ptr %0 monotonic, align 8
1429  %conv = trunc i64 %1 to i32
1430  ret i32 %conv
1431}
1432
1433; Function Attrs: nofree norecurse nounwind uwtable willreturn
1434define dso_local signext i32 @ld_align16_int32_t_uint64_t(ptr nocapture readonly %ptr) {
1435; CHECK-LABEL: ld_align16_int32_t_uint64_t:
1436; CHECK:       # %bb.0: # %entry
1437; CHECK-NEXT:    ld r3, 8(r3)
1438; CHECK-NEXT:    extsw r3, r3
1439; CHECK-NEXT:    blr
1440entry:
1441  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
1442  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
1443  %conv = trunc i64 %0 to i32
1444  ret i32 %conv
1445}
1446
1447; Function Attrs: nofree norecurse nounwind uwtable willreturn
1448define dso_local signext i32 @ld_align32_int32_t_uint64_t(ptr nocapture readonly %ptr) {
1449; CHECK-P10-LABEL: ld_align32_int32_t_uint64_t:
1450; CHECK-P10:       # %bb.0: # %entry
1451; CHECK-P10-NEXT:    pld r3, 99999000(r3), 0
1452; CHECK-P10-NEXT:    extsw r3, r3
1453; CHECK-P10-NEXT:    blr
1454;
1455; CHECK-PREP10-LABEL: ld_align32_int32_t_uint64_t:
1456; CHECK-PREP10:       # %bb.0: # %entry
1457; CHECK-PREP10-NEXT:    lis r4, 1525
1458; CHECK-PREP10-NEXT:    ori r4, r4, 56600
1459; CHECK-PREP10-NEXT:    ldx r3, r3, r4
1460; CHECK-PREP10-NEXT:    extsw r3, r3
1461; CHECK-PREP10-NEXT:    blr
1462entry:
1463  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
1464  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
1465  %conv = trunc i64 %0 to i32
1466  ret i32 %conv
1467}
1468
1469; Function Attrs: nofree norecurse nounwind uwtable willreturn
1470define dso_local signext i32 @ld_align64_int32_t_uint64_t(ptr nocapture readonly %ptr) {
1471; CHECK-P10-LABEL: ld_align64_int32_t_uint64_t:
1472; CHECK-P10:       # %bb.0: # %entry
1473; CHECK-P10-NEXT:    pli r4, 244140625
1474; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1475; CHECK-P10-NEXT:    ldx r3, r3, r4
1476; CHECK-P10-NEXT:    extsw r3, r3
1477; CHECK-P10-NEXT:    blr
1478;
1479; CHECK-PREP10-LABEL: ld_align64_int32_t_uint64_t:
1480; CHECK-PREP10:       # %bb.0: # %entry
1481; CHECK-PREP10-NEXT:    lis r4, 3725
1482; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1483; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1484; CHECK-PREP10-NEXT:    ldx r3, r3, r4
1485; CHECK-PREP10-NEXT:    extsw r3, r3
1486; CHECK-PREP10-NEXT:    blr
1487entry:
1488  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
1489  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
1490  %conv = trunc i64 %0 to i32
1491  ret i32 %conv
1492}
1493
1494; Function Attrs: nofree norecurse nounwind uwtable willreturn
1495define dso_local signext i32 @ld_reg_int32_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) {
1496; CHECK-LABEL: ld_reg_int32_t_uint64_t:
1497; CHECK:       # %bb.0: # %entry
1498; CHECK-NEXT:    ldx r3, r3, r4
1499; CHECK-NEXT:    extsw r3, r3
1500; CHECK-NEXT:    blr
1501entry:
1502  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
1503  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
1504  %conv = trunc i64 %0 to i32
1505  ret i32 %conv
1506}
1507
1508; Function Attrs: nofree norecurse nounwind uwtable willreturn
1509define dso_local signext i32 @ld_or_int32_t_uint64_t(i64 %ptr, i8 zeroext %off) {
1510; CHECK-LABEL: ld_or_int32_t_uint64_t:
1511; CHECK:       # %bb.0: # %entry
1512; CHECK-NEXT:    or r3, r4, r3
1513; CHECK-NEXT:    ld r3, 0(r3)
1514; CHECK-NEXT:    extsw r3, r3
1515; CHECK-NEXT:    blr
1516entry:
1517  %conv = zext i8 %off to i64
1518  %or = or i64 %conv, %ptr
1519  %0 = inttoptr i64 %or to ptr
1520  %1 = load atomic i64, ptr %0 monotonic, align 8
1521  %conv1 = trunc i64 %1 to i32
1522  ret i32 %conv1
1523}
1524
1525; Function Attrs: nofree norecurse nounwind uwtable willreturn
1526define dso_local signext i32 @ld_not_disjoint16_int32_t_uint64_t(i64 %ptr) {
1527; CHECK-LABEL: ld_not_disjoint16_int32_t_uint64_t:
1528; CHECK:       # %bb.0: # %entry
1529; CHECK-NEXT:    ori r3, r3, 6
1530; CHECK-NEXT:    ld r3, 0(r3)
1531; CHECK-NEXT:    extsw r3, r3
1532; CHECK-NEXT:    blr
1533entry:
1534  %or = or i64 %ptr, 6
1535  %0 = inttoptr i64 %or to ptr
1536  %1 = load atomic i64, ptr %0 monotonic, align 8
1537  %conv = trunc i64 %1 to i32
1538  ret i32 %conv
1539}
1540
1541; Function Attrs: nofree norecurse nounwind uwtable willreturn
1542define dso_local signext i32 @ld_disjoint_align16_int32_t_uint64_t(i64 %ptr) {
1543; CHECK-LABEL: ld_disjoint_align16_int32_t_uint64_t:
1544; CHECK:       # %bb.0: # %entry
1545; CHECK-NEXT:    rldicr r3, r3, 0, 51
1546; CHECK-NEXT:    ld r3, 24(r3)
1547; CHECK-NEXT:    extsw r3, r3
1548; CHECK-NEXT:    blr
1549entry:
1550  %and = and i64 %ptr, -4096
1551  %or = or i64 %and, 24
1552  %0 = inttoptr i64 %or to ptr
1553  %1 = load atomic i64, ptr %0 monotonic, align 8
1554  %conv = trunc i64 %1 to i32
1555  ret i32 %conv
1556}
1557
1558; Function Attrs: nofree norecurse nounwind uwtable willreturn
1559define dso_local signext i32 @ld_not_disjoint32_int32_t_uint64_t(i64 %ptr) {
1560; CHECK-LABEL: ld_not_disjoint32_int32_t_uint64_t:
1561; CHECK:       # %bb.0: # %entry
1562; CHECK-NEXT:    ori r3, r3, 34463
1563; CHECK-NEXT:    oris r3, r3, 1
1564; CHECK-NEXT:    ld r3, 0(r3)
1565; CHECK-NEXT:    extsw r3, r3
1566; CHECK-NEXT:    blr
1567entry:
1568  %or = or i64 %ptr, 99999
1569  %0 = inttoptr i64 %or to ptr
1570  %1 = load atomic i64, ptr %0 monotonic, align 8
1571  %conv = trunc i64 %1 to i32
1572  ret i32 %conv
1573}
1574
1575; Function Attrs: nofree norecurse nounwind uwtable willreturn
1576define dso_local signext i32 @ld_disjoint_align32_int32_t_uint64_t(i64 %ptr) {
1577; CHECK-P10-LABEL: ld_disjoint_align32_int32_t_uint64_t:
1578; CHECK-P10:       # %bb.0: # %entry
1579; CHECK-P10-NEXT:    lis r4, -15264
1580; CHECK-P10-NEXT:    and r3, r3, r4
1581; CHECK-P10-NEXT:    pld r3, 999990000(r3), 0
1582; CHECK-P10-NEXT:    extsw r3, r3
1583; CHECK-P10-NEXT:    blr
1584;
1585; CHECK-PREP10-LABEL: ld_disjoint_align32_int32_t_uint64_t:
1586; CHECK-PREP10:       # %bb.0: # %entry
1587; CHECK-PREP10-NEXT:    lis r4, -15264
1588; CHECK-PREP10-NEXT:    and r3, r3, r4
1589; CHECK-PREP10-NEXT:    lis r4, 15258
1590; CHECK-PREP10-NEXT:    ori r4, r4, 41712
1591; CHECK-PREP10-NEXT:    ldx r3, r3, r4
1592; CHECK-PREP10-NEXT:    extsw r3, r3
1593; CHECK-PREP10-NEXT:    blr
1594entry:
1595  %and = and i64 %ptr, -1000341504
1596  %or = or i64 %and, 999990000
1597  %0 = inttoptr i64 %or to ptr
1598  %1 = load atomic i64, ptr %0 monotonic, align 16
1599  %conv = trunc i64 %1 to i32
1600  ret i32 %conv
1601}
1602
1603; Function Attrs: nofree norecurse nounwind uwtable willreturn
1604define dso_local signext i32 @ld_not_disjoint64_int32_t_uint64_t(i64 %ptr) {
1605; CHECK-P10-LABEL: ld_not_disjoint64_int32_t_uint64_t:
1606; CHECK-P10:       # %bb.0: # %entry
1607; CHECK-P10-NEXT:    pli r4, 232
1608; CHECK-P10-NEXT:    pli r5, 3567587329
1609; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1610; CHECK-P10-NEXT:    or r3, r3, r5
1611; CHECK-P10-NEXT:    ld r3, 0(r3)
1612; CHECK-P10-NEXT:    extsw r3, r3
1613; CHECK-P10-NEXT:    blr
1614;
1615; CHECK-PREP10-LABEL: ld_not_disjoint64_int32_t_uint64_t:
1616; CHECK-PREP10:       # %bb.0: # %entry
1617; CHECK-PREP10-NEXT:    li r4, 29
1618; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
1619; CHECK-PREP10-NEXT:    oris r4, r4, 54437
1620; CHECK-PREP10-NEXT:    ori r4, r4, 4097
1621; CHECK-PREP10-NEXT:    or r3, r3, r4
1622; CHECK-PREP10-NEXT:    ld r3, 0(r3)
1623; CHECK-PREP10-NEXT:    extsw r3, r3
1624; CHECK-PREP10-NEXT:    blr
1625entry:
1626  %or = or i64 %ptr, 1000000000001
1627  %0 = inttoptr i64 %or to ptr
1628  %1 = load atomic i64, ptr %0 monotonic, align 8
1629  %conv = trunc i64 %1 to i32
1630  ret i32 %conv
1631}
1632
1633; Function Attrs: nofree norecurse nounwind uwtable willreturn
1634define dso_local signext i32 @ld_disjoint_align64_int32_t_uint64_t(i64 %ptr) {
1635; CHECK-P10-LABEL: ld_disjoint_align64_int32_t_uint64_t:
1636; CHECK-P10:       # %bb.0: # %entry
1637; CHECK-P10-NEXT:    pli r4, 244140625
1638; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1639; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1640; CHECK-P10-NEXT:    ldx r3, r3, r4
1641; CHECK-P10-NEXT:    extsw r3, r3
1642; CHECK-P10-NEXT:    blr
1643;
1644; CHECK-PREP10-LABEL: ld_disjoint_align64_int32_t_uint64_t:
1645; CHECK-PREP10:       # %bb.0: # %entry
1646; CHECK-PREP10-NEXT:    lis r4, 3725
1647; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
1648; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1649; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1650; CHECK-PREP10-NEXT:    ldx r3, r3, r4
1651; CHECK-PREP10-NEXT:    extsw r3, r3
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 i64, ptr %0 monotonic, align 4096
1658  %conv = trunc i64 %1 to i32
1659  ret i32 %conv
1660}
1661
1662; Function Attrs: nofree norecurse nounwind uwtable willreturn
1663define dso_local signext i32 @ld_cst_align16_int32_t_uint64_t() {
1664; CHECK-LABEL: ld_cst_align16_int32_t_uint64_t:
1665; CHECK:       # %bb.0: # %entry
1666; CHECK-NEXT:    ld r3, 4080(0)
1667; CHECK-NEXT:    extsw r3, r3
1668; CHECK-NEXT:    blr
1669entry:
1670  %0 = load atomic i64, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
1671  %conv = trunc i64 %0 to i32
1672  ret i32 %conv
1673}
1674
1675; Function Attrs: nofree norecurse nounwind uwtable willreturn
1676define dso_local signext i32 @ld_cst_align32_int32_t_uint64_t() {
1677; CHECK-LABEL: ld_cst_align32_int32_t_uint64_t:
1678; CHECK:       # %bb.0: # %entry
1679; CHECK-NEXT:    lis r3, 153
1680; CHECK-NEXT:    ld r3, -27108(r3)
1681; CHECK-NEXT:    extsw r3, r3
1682; CHECK-NEXT:    blr
1683entry:
1684  %0 = load atomic i64, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8
1685  %conv = trunc i64 %0 to i32
1686  ret i32 %conv
1687}
1688
1689; Function Attrs: nofree norecurse nounwind uwtable willreturn
1690define dso_local signext i32 @ld_cst_align64_int32_t_uint64_t() {
1691; CHECK-P10-LABEL: ld_cst_align64_int32_t_uint64_t:
1692; CHECK-P10:       # %bb.0: # %entry
1693; CHECK-P10-NEXT:    pli r3, 244140625
1694; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
1695; CHECK-P10-NEXT:    ld r3, 0(r3)
1696; CHECK-P10-NEXT:    extsw r3, r3
1697; CHECK-P10-NEXT:    blr
1698;
1699; CHECK-PREP10-LABEL: ld_cst_align64_int32_t_uint64_t:
1700; CHECK-PREP10:       # %bb.0: # %entry
1701; CHECK-PREP10-NEXT:    lis r3, 3725
1702; CHECK-PREP10-NEXT:    ori r3, r3, 19025
1703; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
1704; CHECK-PREP10-NEXT:    ld r3, 0(r3)
1705; CHECK-PREP10-NEXT:    extsw r3, r3
1706; CHECK-PREP10-NEXT:    blr
1707entry:
1708  %0 = load atomic i64, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
1709  %conv = trunc i64 %0 to i32
1710  ret i32 %conv
1711}
1712
1713; Function Attrs: nofree norecurse nounwind uwtable willreturn
1714define dso_local zeroext i32 @ld_0_uint32_t_uint8_t(i64 %ptr) {
1715; CHECK-LABEL: ld_0_uint32_t_uint8_t:
1716; CHECK:       # %bb.0: # %entry
1717; CHECK-NEXT:    lbz r3, 0(r3)
1718; CHECK-NEXT:    blr
1719entry:
1720  %0 = inttoptr i64 %ptr to ptr
1721  %1 = load atomic i8, ptr %0 monotonic, align 1
1722  %conv = zext i8 %1 to i32
1723  ret i32 %conv
1724}
1725
1726; Function Attrs: nofree norecurse nounwind uwtable willreturn
1727define dso_local zeroext i32 @ld_align16_uint32_t_uint8_t(ptr nocapture readonly %ptr) {
1728; CHECK-LABEL: ld_align16_uint32_t_uint8_t:
1729; CHECK:       # %bb.0: # %entry
1730; CHECK-NEXT:    lbz r3, 8(r3)
1731; CHECK-NEXT:    blr
1732entry:
1733  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
1734  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
1735  %conv = zext i8 %0 to i32
1736  ret i32 %conv
1737}
1738
1739; Function Attrs: nofree norecurse nounwind uwtable willreturn
1740define dso_local zeroext i32 @ld_align32_uint32_t_uint8_t(ptr nocapture readonly %ptr) {
1741; CHECK-P10-LABEL: ld_align32_uint32_t_uint8_t:
1742; CHECK-P10:       # %bb.0: # %entry
1743; CHECK-P10-NEXT:    plbz r3, 99999000(r3), 0
1744; CHECK-P10-NEXT:    clrldi r3, r3, 32
1745; CHECK-P10-NEXT:    blr
1746;
1747; CHECK-PREP10-LABEL: ld_align32_uint32_t_uint8_t:
1748; CHECK-PREP10:       # %bb.0: # %entry
1749; CHECK-PREP10-NEXT:    lis r4, 1525
1750; CHECK-PREP10-NEXT:    ori r4, r4, 56600
1751; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
1752; CHECK-PREP10-NEXT:    blr
1753entry:
1754  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
1755  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
1756  %conv = zext i8 %0 to i32
1757  ret i32 %conv
1758}
1759
1760; Function Attrs: nofree norecurse nounwind uwtable willreturn
1761define dso_local zeroext i32 @ld_align64_uint32_t_uint8_t(ptr nocapture readonly %ptr) {
1762; CHECK-P10-LABEL: ld_align64_uint32_t_uint8_t:
1763; CHECK-P10:       # %bb.0: # %entry
1764; CHECK-P10-NEXT:    pli r4, 244140625
1765; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1766; CHECK-P10-NEXT:    lbzx r3, r3, r4
1767; CHECK-P10-NEXT:    blr
1768;
1769; CHECK-PREP10-LABEL: ld_align64_uint32_t_uint8_t:
1770; CHECK-PREP10:       # %bb.0: # %entry
1771; CHECK-PREP10-NEXT:    lis r4, 3725
1772; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1773; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1774; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
1775; CHECK-PREP10-NEXT:    blr
1776entry:
1777  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
1778  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
1779  %conv = zext i8 %0 to i32
1780  ret i32 %conv
1781}
1782
1783; Function Attrs: nofree norecurse nounwind uwtable willreturn
1784define dso_local zeroext i32 @ld_reg_uint32_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) {
1785; CHECK-LABEL: ld_reg_uint32_t_uint8_t:
1786; CHECK:       # %bb.0: # %entry
1787; CHECK-NEXT:    lbzx r3, r3, r4
1788; CHECK-NEXT:    blr
1789entry:
1790  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
1791  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
1792  %conv = zext i8 %0 to i32
1793  ret i32 %conv
1794}
1795
1796; Function Attrs: nofree norecurse nounwind uwtable willreturn
1797define dso_local zeroext i32 @ld_or_uint32_t_uint8_t(i64 %ptr, i8 zeroext %off) {
1798; CHECK-LABEL: ld_or_uint32_t_uint8_t:
1799; CHECK:       # %bb.0: # %entry
1800; CHECK-NEXT:    or r3, r4, r3
1801; CHECK-NEXT:    lbz r3, 0(r3)
1802; CHECK-NEXT:    blr
1803entry:
1804  %conv = zext i8 %off to i64
1805  %or = or i64 %conv, %ptr
1806  %0 = inttoptr i64 %or to ptr
1807  %1 = load atomic i8, ptr %0 monotonic, align 1
1808  %conv1 = zext i8 %1 to i32
1809  ret i32 %conv1
1810}
1811
1812; Function Attrs: nofree norecurse nounwind uwtable willreturn
1813define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_uint8_t(i64 %ptr) {
1814; CHECK-LABEL: ld_not_disjoint16_uint32_t_uint8_t:
1815; CHECK:       # %bb.0: # %entry
1816; CHECK-NEXT:    ori r3, r3, 6
1817; CHECK-NEXT:    lbz r3, 0(r3)
1818; CHECK-NEXT:    blr
1819entry:
1820  %or = or i64 %ptr, 6
1821  %0 = inttoptr i64 %or to ptr
1822  %1 = load atomic i8, ptr %0 monotonic, align 1
1823  %conv = zext i8 %1 to i32
1824  ret i32 %conv
1825}
1826
1827; Function Attrs: nofree norecurse nounwind uwtable willreturn
1828define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_uint8_t(i64 %ptr) {
1829; CHECK-LABEL: ld_disjoint_align16_uint32_t_uint8_t:
1830; CHECK:       # %bb.0: # %entry
1831; CHECK-NEXT:    rldicr r3, r3, 0, 51
1832; CHECK-NEXT:    lbz r3, 24(r3)
1833; CHECK-NEXT:    blr
1834entry:
1835  %and = and i64 %ptr, -4096
1836  %or = or i64 %and, 24
1837  %0 = inttoptr i64 %or to ptr
1838  %1 = load atomic i8, ptr %0 monotonic, align 8
1839  %conv = zext i8 %1 to i32
1840  ret i32 %conv
1841}
1842
1843; Function Attrs: nofree norecurse nounwind uwtable willreturn
1844define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_uint8_t(i64 %ptr) {
1845; CHECK-LABEL: ld_not_disjoint32_uint32_t_uint8_t:
1846; CHECK:       # %bb.0: # %entry
1847; CHECK-NEXT:    ori r3, r3, 34463
1848; CHECK-NEXT:    oris r3, r3, 1
1849; CHECK-NEXT:    lbz r3, 0(r3)
1850; CHECK-NEXT:    blr
1851entry:
1852  %or = or i64 %ptr, 99999
1853  %0 = inttoptr i64 %or to ptr
1854  %1 = load atomic i8, ptr %0 monotonic, align 1
1855  %conv = zext i8 %1 to i32
1856  ret i32 %conv
1857}
1858
1859; Function Attrs: nofree norecurse nounwind uwtable willreturn
1860define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_uint8_t(i64 %ptr) {
1861; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_uint8_t:
1862; CHECK-P10:       # %bb.0: # %entry
1863; CHECK-P10-NEXT:    lis r4, -15264
1864; CHECK-P10-NEXT:    and r3, r3, r4
1865; CHECK-P10-NEXT:    plbz r3, 999990000(r3), 0
1866; CHECK-P10-NEXT:    clrldi r3, r3, 32
1867; CHECK-P10-NEXT:    blr
1868;
1869; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_uint8_t:
1870; CHECK-PREP10:       # %bb.0: # %entry
1871; CHECK-PREP10-NEXT:    lis r4, -15264
1872; CHECK-PREP10-NEXT:    and r3, r3, r4
1873; CHECK-PREP10-NEXT:    lis r4, 15258
1874; CHECK-PREP10-NEXT:    ori r4, r4, 41712
1875; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
1876; CHECK-PREP10-NEXT:    blr
1877entry:
1878  %and = and i64 %ptr, -1000341504
1879  %or = or i64 %and, 999990000
1880  %0 = inttoptr i64 %or to ptr
1881  %1 = load atomic i8, ptr %0 monotonic, align 16
1882  %conv = zext i8 %1 to i32
1883  ret i32 %conv
1884}
1885
1886; Function Attrs: nofree norecurse nounwind uwtable willreturn
1887define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_uint8_t(i64 %ptr) {
1888; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_uint8_t:
1889; CHECK-P10:       # %bb.0: # %entry
1890; CHECK-P10-NEXT:    pli r4, 232
1891; CHECK-P10-NEXT:    pli r5, 3567587329
1892; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1893; CHECK-P10-NEXT:    or r3, r3, r5
1894; CHECK-P10-NEXT:    lbz r3, 0(r3)
1895; CHECK-P10-NEXT:    blr
1896;
1897; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_uint8_t:
1898; CHECK-PREP10:       # %bb.0: # %entry
1899; CHECK-PREP10-NEXT:    li r4, 29
1900; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
1901; CHECK-PREP10-NEXT:    oris r4, r4, 54437
1902; CHECK-PREP10-NEXT:    ori r4, r4, 4097
1903; CHECK-PREP10-NEXT:    or r3, r3, r4
1904; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
1905; CHECK-PREP10-NEXT:    blr
1906entry:
1907  %or = or i64 %ptr, 1000000000001
1908  %0 = inttoptr i64 %or to ptr
1909  %1 = load atomic i8, ptr %0 monotonic, align 1
1910  %conv = zext i8 %1 to i32
1911  ret i32 %conv
1912}
1913
1914; Function Attrs: nofree norecurse nounwind uwtable willreturn
1915define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_uint8_t(i64 %ptr) {
1916; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_uint8_t:
1917; CHECK-P10:       # %bb.0: # %entry
1918; CHECK-P10-NEXT:    pli r4, 244140625
1919; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1920; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1921; CHECK-P10-NEXT:    lbzx r3, r3, r4
1922; CHECK-P10-NEXT:    blr
1923;
1924; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_uint8_t:
1925; CHECK-PREP10:       # %bb.0: # %entry
1926; CHECK-PREP10-NEXT:    lis r4, 3725
1927; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
1928; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1929; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1930; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
1931; CHECK-PREP10-NEXT:    blr
1932entry:
1933  %and = and i64 %ptr, -1099511627776
1934  %or = or i64 %and, 1000000000000
1935  %0 = inttoptr i64 %or to ptr
1936  %1 = load atomic i8, ptr %0 monotonic, align 4096
1937  %conv = zext i8 %1 to i32
1938  ret i32 %conv
1939}
1940
1941; Function Attrs: nofree norecurse nounwind uwtable willreturn
1942define dso_local zeroext i32 @ld_cst_align16_uint32_t_uint8_t() {
1943; CHECK-LABEL: ld_cst_align16_uint32_t_uint8_t:
1944; CHECK:       # %bb.0: # %entry
1945; CHECK-NEXT:    lbz r3, 4080(0)
1946; CHECK-NEXT:    blr
1947entry:
1948  %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
1949  %conv = zext i8 %0 to i32
1950  ret i32 %conv
1951}
1952
1953; Function Attrs: nofree norecurse nounwind uwtable willreturn
1954define dso_local zeroext i32 @ld_cst_align32_uint32_t_uint8_t() {
1955; CHECK-LABEL: ld_cst_align32_uint32_t_uint8_t:
1956; CHECK:       # %bb.0: # %entry
1957; CHECK-NEXT:    lis r3, 153
1958; CHECK-NEXT:    lbz r3, -27108(r3)
1959; CHECK-NEXT:    blr
1960entry:
1961  %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
1962  %conv = zext i8 %0 to i32
1963  ret i32 %conv
1964}
1965
1966; Function Attrs: nofree norecurse nounwind uwtable willreturn
1967define dso_local zeroext i32 @ld_cst_align64_uint32_t_uint8_t() {
1968; CHECK-P10-LABEL: ld_cst_align64_uint32_t_uint8_t:
1969; CHECK-P10:       # %bb.0: # %entry
1970; CHECK-P10-NEXT:    pli r3, 244140625
1971; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
1972; CHECK-P10-NEXT:    lbz r3, 0(r3)
1973; CHECK-P10-NEXT:    blr
1974;
1975; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_uint8_t:
1976; CHECK-PREP10:       # %bb.0: # %entry
1977; CHECK-PREP10-NEXT:    lis r3, 3725
1978; CHECK-PREP10-NEXT:    ori r3, r3, 19025
1979; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
1980; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
1981; CHECK-PREP10-NEXT:    blr
1982entry:
1983  %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
1984  %conv = zext i8 %0 to i32
1985  ret i32 %conv
1986}
1987
1988; Function Attrs: nofree norecurse nounwind uwtable willreturn
1989define dso_local zeroext i32 @ld_0_uint32_t_int8_t(i64 %ptr) {
1990; CHECK-LABEL: ld_0_uint32_t_int8_t:
1991; CHECK:       # %bb.0: # %entry
1992; CHECK-NEXT:    lbz r3, 0(r3)
1993; CHECK-NEXT:    extsb r3, r3
1994; CHECK-NEXT:    clrldi r3, r3, 32
1995; CHECK-NEXT:    blr
1996entry:
1997  %0 = inttoptr i64 %ptr to ptr
1998  %1 = load atomic i8, ptr %0 monotonic, align 1
1999  %conv = sext i8 %1 to i32
2000  ret i32 %conv
2001}
2002
2003; Function Attrs: nofree norecurse nounwind uwtable willreturn
2004define dso_local zeroext i32 @ld_align16_uint32_t_int8_t(ptr nocapture readonly %ptr) {
2005; CHECK-LABEL: ld_align16_uint32_t_int8_t:
2006; CHECK:       # %bb.0: # %entry
2007; CHECK-NEXT:    lbz r3, 8(r3)
2008; CHECK-NEXT:    extsb r3, r3
2009; CHECK-NEXT:    clrldi r3, r3, 32
2010; CHECK-NEXT:    blr
2011entry:
2012  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2013  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
2014  %conv = sext i8 %0 to i32
2015  ret i32 %conv
2016}
2017
2018; Function Attrs: nofree norecurse nounwind uwtable willreturn
2019define dso_local zeroext i32 @ld_align32_uint32_t_int8_t(ptr nocapture readonly %ptr) {
2020; CHECK-P10-LABEL: ld_align32_uint32_t_int8_t:
2021; CHECK-P10:       # %bb.0: # %entry
2022; CHECK-P10-NEXT:    plbz r3, 99999000(r3), 0
2023; CHECK-P10-NEXT:    extsb r3, r3
2024; CHECK-P10-NEXT:    clrldi r3, r3, 32
2025; CHECK-P10-NEXT:    blr
2026;
2027; CHECK-PREP10-LABEL: ld_align32_uint32_t_int8_t:
2028; CHECK-PREP10:       # %bb.0: # %entry
2029; CHECK-PREP10-NEXT:    lis r4, 1525
2030; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2031; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2032; CHECK-PREP10-NEXT:    extsb r3, r3
2033; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2034; CHECK-PREP10-NEXT:    blr
2035entry:
2036  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2037  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
2038  %conv = sext i8 %0 to i32
2039  ret i32 %conv
2040}
2041
2042; Function Attrs: nofree norecurse nounwind uwtable willreturn
2043define dso_local zeroext i32 @ld_align64_uint32_t_int8_t(ptr nocapture readonly %ptr) {
2044; CHECK-P10-LABEL: ld_align64_uint32_t_int8_t:
2045; CHECK-P10:       # %bb.0: # %entry
2046; CHECK-P10-NEXT:    pli r4, 244140625
2047; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2048; CHECK-P10-NEXT:    lbzx r3, r3, r4
2049; CHECK-P10-NEXT:    extsb r3, r3
2050; CHECK-P10-NEXT:    clrldi r3, r3, 32
2051; CHECK-P10-NEXT:    blr
2052;
2053; CHECK-PREP10-LABEL: ld_align64_uint32_t_int8_t:
2054; CHECK-PREP10:       # %bb.0: # %entry
2055; CHECK-PREP10-NEXT:    lis r4, 3725
2056; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2057; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2058; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2059; CHECK-PREP10-NEXT:    extsb r3, r3
2060; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2061; CHECK-PREP10-NEXT:    blr
2062entry:
2063  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2064  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
2065  %conv = sext i8 %0 to i32
2066  ret i32 %conv
2067}
2068
2069; Function Attrs: nofree norecurse nounwind uwtable willreturn
2070define dso_local zeroext i32 @ld_reg_uint32_t_int8_t(ptr nocapture readonly %ptr, i64 %off) {
2071; CHECK-LABEL: ld_reg_uint32_t_int8_t:
2072; CHECK:       # %bb.0: # %entry
2073; CHECK-NEXT:    lbzx r3, r3, r4
2074; CHECK-NEXT:    extsb r3, r3
2075; CHECK-NEXT:    clrldi r3, r3, 32
2076; CHECK-NEXT:    blr
2077entry:
2078  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2079  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
2080  %conv = sext i8 %0 to i32
2081  ret i32 %conv
2082}
2083
2084; Function Attrs: nofree norecurse nounwind uwtable willreturn
2085define dso_local zeroext i32 @ld_or_uint32_t_int8_t(i64 %ptr, i8 zeroext %off) {
2086; CHECK-LABEL: ld_or_uint32_t_int8_t:
2087; CHECK:       # %bb.0: # %entry
2088; CHECK-NEXT:    or r3, r4, r3
2089; CHECK-NEXT:    lbz r3, 0(r3)
2090; CHECK-NEXT:    extsb r3, r3
2091; CHECK-NEXT:    clrldi r3, r3, 32
2092; CHECK-NEXT:    blr
2093entry:
2094  %conv = zext i8 %off to i64
2095  %or = or i64 %conv, %ptr
2096  %0 = inttoptr i64 %or to ptr
2097  %1 = load atomic i8, ptr %0 monotonic, align 1
2098  %conv1 = sext i8 %1 to i32
2099  ret i32 %conv1
2100}
2101
2102; Function Attrs: nofree norecurse nounwind uwtable willreturn
2103define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_int8_t(i64 %ptr) {
2104; CHECK-LABEL: ld_not_disjoint16_uint32_t_int8_t:
2105; CHECK:       # %bb.0: # %entry
2106; CHECK-NEXT:    ori r3, r3, 6
2107; CHECK-NEXT:    lbz r3, 0(r3)
2108; CHECK-NEXT:    extsb r3, r3
2109; CHECK-NEXT:    clrldi r3, r3, 32
2110; CHECK-NEXT:    blr
2111entry:
2112  %or = or i64 %ptr, 6
2113  %0 = inttoptr i64 %or to ptr
2114  %1 = load atomic i8, ptr %0 monotonic, align 1
2115  %conv = sext i8 %1 to i32
2116  ret i32 %conv
2117}
2118
2119; Function Attrs: nofree norecurse nounwind uwtable willreturn
2120define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_int8_t(i64 %ptr) {
2121; CHECK-LABEL: ld_disjoint_align16_uint32_t_int8_t:
2122; CHECK:       # %bb.0: # %entry
2123; CHECK-NEXT:    rldicr r3, r3, 0, 51
2124; CHECK-NEXT:    lbz r3, 24(r3)
2125; CHECK-NEXT:    extsb r3, r3
2126; CHECK-NEXT:    clrldi r3, r3, 32
2127; CHECK-NEXT:    blr
2128entry:
2129  %and = and i64 %ptr, -4096
2130  %or = or i64 %and, 24
2131  %0 = inttoptr i64 %or to ptr
2132  %1 = load atomic i8, ptr %0 monotonic, align 8
2133  %conv = sext i8 %1 to i32
2134  ret i32 %conv
2135}
2136
2137; Function Attrs: nofree norecurse nounwind uwtable willreturn
2138define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_int8_t(i64 %ptr) {
2139; CHECK-LABEL: ld_not_disjoint32_uint32_t_int8_t:
2140; CHECK:       # %bb.0: # %entry
2141; CHECK-NEXT:    ori r3, r3, 34463
2142; CHECK-NEXT:    oris r3, r3, 1
2143; CHECK-NEXT:    lbz r3, 0(r3)
2144; CHECK-NEXT:    extsb r3, r3
2145; CHECK-NEXT:    clrldi r3, r3, 32
2146; CHECK-NEXT:    blr
2147entry:
2148  %or = or i64 %ptr, 99999
2149  %0 = inttoptr i64 %or to ptr
2150  %1 = load atomic i8, ptr %0 monotonic, align 1
2151  %conv = sext i8 %1 to i32
2152  ret i32 %conv
2153}
2154
2155; Function Attrs: nofree norecurse nounwind uwtable willreturn
2156define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_int8_t(i64 %ptr) {
2157; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_int8_t:
2158; CHECK-P10:       # %bb.0: # %entry
2159; CHECK-P10-NEXT:    lis r4, -15264
2160; CHECK-P10-NEXT:    and r3, r3, r4
2161; CHECK-P10-NEXT:    plbz r3, 999990000(r3), 0
2162; CHECK-P10-NEXT:    extsb r3, r3
2163; CHECK-P10-NEXT:    clrldi r3, r3, 32
2164; CHECK-P10-NEXT:    blr
2165;
2166; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_int8_t:
2167; CHECK-PREP10:       # %bb.0: # %entry
2168; CHECK-PREP10-NEXT:    lis r4, -15264
2169; CHECK-PREP10-NEXT:    and r3, r3, r4
2170; CHECK-PREP10-NEXT:    lis r4, 15258
2171; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2172; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2173; CHECK-PREP10-NEXT:    extsb r3, r3
2174; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2175; CHECK-PREP10-NEXT:    blr
2176entry:
2177  %and = and i64 %ptr, -1000341504
2178  %or = or i64 %and, 999990000
2179  %0 = inttoptr i64 %or to ptr
2180  %1 = load atomic i8, ptr %0 monotonic, align 16
2181  %conv = sext i8 %1 to i32
2182  ret i32 %conv
2183}
2184
2185; Function Attrs: nofree norecurse nounwind uwtable willreturn
2186define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_int8_t(i64 %ptr) {
2187; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_int8_t:
2188; CHECK-P10:       # %bb.0: # %entry
2189; CHECK-P10-NEXT:    pli r4, 232
2190; CHECK-P10-NEXT:    pli r5, 3567587329
2191; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2192; CHECK-P10-NEXT:    or r3, r3, r5
2193; CHECK-P10-NEXT:    lbz r3, 0(r3)
2194; CHECK-P10-NEXT:    extsb r3, r3
2195; CHECK-P10-NEXT:    clrldi r3, r3, 32
2196; CHECK-P10-NEXT:    blr
2197;
2198; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_int8_t:
2199; CHECK-PREP10:       # %bb.0: # %entry
2200; CHECK-PREP10-NEXT:    li r4, 29
2201; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2202; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2203; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2204; CHECK-PREP10-NEXT:    or r3, r3, r4
2205; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
2206; CHECK-PREP10-NEXT:    extsb r3, r3
2207; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2208; CHECK-PREP10-NEXT:    blr
2209entry:
2210  %or = or i64 %ptr, 1000000000001
2211  %0 = inttoptr i64 %or to ptr
2212  %1 = load atomic i8, ptr %0 monotonic, align 1
2213  %conv = sext i8 %1 to i32
2214  ret i32 %conv
2215}
2216
2217; Function Attrs: nofree norecurse nounwind uwtable willreturn
2218define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_int8_t(i64 %ptr) {
2219; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_int8_t:
2220; CHECK-P10:       # %bb.0: # %entry
2221; CHECK-P10-NEXT:    pli r4, 244140625
2222; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2223; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2224; CHECK-P10-NEXT:    lbzx r3, r3, r4
2225; CHECK-P10-NEXT:    extsb r3, r3
2226; CHECK-P10-NEXT:    clrldi r3, r3, 32
2227; CHECK-P10-NEXT:    blr
2228;
2229; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_int8_t:
2230; CHECK-PREP10:       # %bb.0: # %entry
2231; CHECK-PREP10-NEXT:    lis r4, 3725
2232; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2233; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2234; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2235; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2236; CHECK-PREP10-NEXT:    extsb r3, r3
2237; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2238; CHECK-PREP10-NEXT:    blr
2239entry:
2240  %and = and i64 %ptr, -1099511627776
2241  %or = or i64 %and, 1000000000000
2242  %0 = inttoptr i64 %or to ptr
2243  %1 = load atomic i8, ptr %0 monotonic, align 4096
2244  %conv = sext i8 %1 to i32
2245  ret i32 %conv
2246}
2247
2248; Function Attrs: nofree norecurse nounwind uwtable willreturn
2249define dso_local zeroext i32 @ld_cst_align16_uint32_t_int8_t() {
2250; CHECK-LABEL: ld_cst_align16_uint32_t_int8_t:
2251; CHECK:       # %bb.0: # %entry
2252; CHECK-NEXT:    lbz r3, 4080(0)
2253; CHECK-NEXT:    extsb r3, r3
2254; CHECK-NEXT:    clrldi r3, r3, 32
2255; CHECK-NEXT:    blr
2256entry:
2257  %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
2258  %conv = sext i8 %0 to i32
2259  ret i32 %conv
2260}
2261
2262; Function Attrs: nofree norecurse nounwind uwtable willreturn
2263define dso_local zeroext i32 @ld_cst_align32_uint32_t_int8_t() {
2264; CHECK-LABEL: ld_cst_align32_uint32_t_int8_t:
2265; CHECK:       # %bb.0: # %entry
2266; CHECK-NEXT:    lis r3, 153
2267; CHECK-NEXT:    lbz r3, -27108(r3)
2268; CHECK-NEXT:    extsb r3, r3
2269; CHECK-NEXT:    clrldi r3, r3, 32
2270; CHECK-NEXT:    blr
2271entry:
2272  %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
2273  %conv = sext i8 %0 to i32
2274  ret i32 %conv
2275}
2276
2277; Function Attrs: nofree norecurse nounwind uwtable willreturn
2278define dso_local zeroext i32 @ld_cst_align64_uint32_t_int8_t() {
2279; CHECK-P10-LABEL: ld_cst_align64_uint32_t_int8_t:
2280; CHECK-P10:       # %bb.0: # %entry
2281; CHECK-P10-NEXT:    pli r3, 244140625
2282; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2283; CHECK-P10-NEXT:    lbz r3, 0(r3)
2284; CHECK-P10-NEXT:    extsb r3, r3
2285; CHECK-P10-NEXT:    clrldi r3, r3, 32
2286; CHECK-P10-NEXT:    blr
2287;
2288; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_int8_t:
2289; CHECK-PREP10:       # %bb.0: # %entry
2290; CHECK-PREP10-NEXT:    lis r3, 3725
2291; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2292; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2293; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
2294; CHECK-PREP10-NEXT:    extsb r3, r3
2295; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2296; CHECK-PREP10-NEXT:    blr
2297entry:
2298  %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
2299  %conv = sext i8 %0 to i32
2300  ret i32 %conv
2301}
2302
2303; Function Attrs: nofree norecurse nounwind uwtable willreturn
2304define dso_local zeroext i32 @ld_0_uint32_t_uint16_t(i64 %ptr) {
2305; CHECK-LABEL: ld_0_uint32_t_uint16_t:
2306; CHECK:       # %bb.0: # %entry
2307; CHECK-NEXT:    lhz r3, 0(r3)
2308; CHECK-NEXT:    blr
2309entry:
2310  %0 = inttoptr i64 %ptr to ptr
2311  %1 = load atomic i16, ptr %0 monotonic, align 2
2312  %conv = zext i16 %1 to i32
2313  ret i32 %conv
2314}
2315
2316; Function Attrs: nofree norecurse nounwind uwtable willreturn
2317define dso_local zeroext i32 @ld_align16_uint32_t_uint16_t(ptr nocapture readonly %ptr) {
2318; CHECK-LABEL: ld_align16_uint32_t_uint16_t:
2319; CHECK:       # %bb.0: # %entry
2320; CHECK-NEXT:    lhz r3, 8(r3)
2321; CHECK-NEXT:    blr
2322entry:
2323  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2324  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2325  %conv = zext i16 %0 to i32
2326  ret i32 %conv
2327}
2328
2329; Function Attrs: nofree norecurse nounwind uwtable willreturn
2330define dso_local zeroext i32 @ld_align32_uint32_t_uint16_t(ptr nocapture readonly %ptr) {
2331; CHECK-P10-LABEL: ld_align32_uint32_t_uint16_t:
2332; CHECK-P10:       # %bb.0: # %entry
2333; CHECK-P10-NEXT:    plhz r3, 99999000(r3), 0
2334; CHECK-P10-NEXT:    clrldi r3, r3, 32
2335; CHECK-P10-NEXT:    blr
2336;
2337; CHECK-PREP10-LABEL: ld_align32_uint32_t_uint16_t:
2338; CHECK-PREP10:       # %bb.0: # %entry
2339; CHECK-PREP10-NEXT:    lis r4, 1525
2340; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2341; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
2342; CHECK-PREP10-NEXT:    blr
2343entry:
2344  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2345  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2346  %conv = zext i16 %0 to i32
2347  ret i32 %conv
2348}
2349
2350; Function Attrs: nofree norecurse nounwind uwtable willreturn
2351define dso_local zeroext i32 @ld_align64_uint32_t_uint16_t(ptr nocapture readonly %ptr) {
2352; CHECK-P10-LABEL: ld_align64_uint32_t_uint16_t:
2353; CHECK-P10:       # %bb.0: # %entry
2354; CHECK-P10-NEXT:    pli r4, 244140625
2355; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2356; CHECK-P10-NEXT:    lhzx r3, r3, r4
2357; CHECK-P10-NEXT:    blr
2358;
2359; CHECK-PREP10-LABEL: ld_align64_uint32_t_uint16_t:
2360; CHECK-PREP10:       # %bb.0: # %entry
2361; CHECK-PREP10-NEXT:    lis r4, 3725
2362; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2363; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2364; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
2365; CHECK-PREP10-NEXT:    blr
2366entry:
2367  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2368  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2369  %conv = zext i16 %0 to i32
2370  ret i32 %conv
2371}
2372
2373; Function Attrs: nofree norecurse nounwind uwtable willreturn
2374define dso_local zeroext i32 @ld_reg_uint32_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) {
2375; CHECK-LABEL: ld_reg_uint32_t_uint16_t:
2376; CHECK:       # %bb.0: # %entry
2377; CHECK-NEXT:    lhzx r3, r3, r4
2378; CHECK-NEXT:    blr
2379entry:
2380  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2381  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2382  %conv = zext i16 %0 to i32
2383  ret i32 %conv
2384}
2385
2386; Function Attrs: nofree norecurse nounwind uwtable willreturn
2387define dso_local zeroext i32 @ld_or_uint32_t_uint16_t(i64 %ptr, i8 zeroext %off) {
2388; CHECK-LABEL: ld_or_uint32_t_uint16_t:
2389; CHECK:       # %bb.0: # %entry
2390; CHECK-NEXT:    or r3, r4, r3
2391; CHECK-NEXT:    lhz r3, 0(r3)
2392; CHECK-NEXT:    blr
2393entry:
2394  %conv = zext i8 %off to i64
2395  %or = or i64 %conv, %ptr
2396  %0 = inttoptr i64 %or to ptr
2397  %1 = load atomic i16, ptr %0 monotonic, align 2
2398  %conv1 = zext i16 %1 to i32
2399  ret i32 %conv1
2400}
2401
2402; Function Attrs: nofree norecurse nounwind uwtable willreturn
2403define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_uint16_t(i64 %ptr) {
2404; CHECK-LABEL: ld_not_disjoint16_uint32_t_uint16_t:
2405; CHECK:       # %bb.0: # %entry
2406; CHECK-NEXT:    ori r3, r3, 6
2407; CHECK-NEXT:    lhz r3, 0(r3)
2408; CHECK-NEXT:    blr
2409entry:
2410  %or = or i64 %ptr, 6
2411  %0 = inttoptr i64 %or to ptr
2412  %1 = load atomic i16, ptr %0 monotonic, align 2
2413  %conv = zext i16 %1 to i32
2414  ret i32 %conv
2415}
2416
2417; Function Attrs: nofree norecurse nounwind uwtable willreturn
2418define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_uint16_t(i64 %ptr) {
2419; CHECK-LABEL: ld_disjoint_align16_uint32_t_uint16_t:
2420; CHECK:       # %bb.0: # %entry
2421; CHECK-NEXT:    rldicr r3, r3, 0, 51
2422; CHECK-NEXT:    lhz r3, 24(r3)
2423; CHECK-NEXT:    blr
2424entry:
2425  %and = and i64 %ptr, -4096
2426  %or = or i64 %and, 24
2427  %0 = inttoptr i64 %or to ptr
2428  %1 = load atomic i16, ptr %0 monotonic, align 8
2429  %conv = zext i16 %1 to i32
2430  ret i32 %conv
2431}
2432
2433; Function Attrs: nofree norecurse nounwind uwtable willreturn
2434define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_uint16_t(i64 %ptr) {
2435; CHECK-LABEL: ld_not_disjoint32_uint32_t_uint16_t:
2436; CHECK:       # %bb.0: # %entry
2437; CHECK-NEXT:    ori r3, r3, 34463
2438; CHECK-NEXT:    oris r3, r3, 1
2439; CHECK-NEXT:    lhz r3, 0(r3)
2440; CHECK-NEXT:    blr
2441entry:
2442  %or = or i64 %ptr, 99999
2443  %0 = inttoptr i64 %or to ptr
2444  %1 = load atomic i16, ptr %0 monotonic, align 2
2445  %conv = zext i16 %1 to i32
2446  ret i32 %conv
2447}
2448
2449; Function Attrs: nofree norecurse nounwind uwtable willreturn
2450define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_uint16_t(i64 %ptr) {
2451; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_uint16_t:
2452; CHECK-P10:       # %bb.0: # %entry
2453; CHECK-P10-NEXT:    lis r4, -15264
2454; CHECK-P10-NEXT:    and r3, r3, r4
2455; CHECK-P10-NEXT:    plhz r3, 999990000(r3), 0
2456; CHECK-P10-NEXT:    clrldi r3, r3, 32
2457; CHECK-P10-NEXT:    blr
2458;
2459; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_uint16_t:
2460; CHECK-PREP10:       # %bb.0: # %entry
2461; CHECK-PREP10-NEXT:    lis r4, -15264
2462; CHECK-PREP10-NEXT:    and r3, r3, r4
2463; CHECK-PREP10-NEXT:    lis r4, 15258
2464; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2465; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
2466; CHECK-PREP10-NEXT:    blr
2467entry:
2468  %and = and i64 %ptr, -1000341504
2469  %or = or i64 %and, 999990000
2470  %0 = inttoptr i64 %or to ptr
2471  %1 = load atomic i16, ptr %0 monotonic, align 16
2472  %conv = zext i16 %1 to i32
2473  ret i32 %conv
2474}
2475
2476; Function Attrs: nofree norecurse nounwind uwtable willreturn
2477define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_uint16_t(i64 %ptr) {
2478; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_uint16_t:
2479; CHECK-P10:       # %bb.0: # %entry
2480; CHECK-P10-NEXT:    pli r4, 232
2481; CHECK-P10-NEXT:    pli r5, 3567587329
2482; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2483; CHECK-P10-NEXT:    or r3, r3, r5
2484; CHECK-P10-NEXT:    lhz r3, 0(r3)
2485; CHECK-P10-NEXT:    blr
2486;
2487; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_uint16_t:
2488; CHECK-PREP10:       # %bb.0: # %entry
2489; CHECK-PREP10-NEXT:    li r4, 29
2490; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2491; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2492; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2493; CHECK-PREP10-NEXT:    or r3, r3, r4
2494; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
2495; CHECK-PREP10-NEXT:    blr
2496entry:
2497  %or = or i64 %ptr, 1000000000001
2498  %0 = inttoptr i64 %or to ptr
2499  %1 = load atomic i16, ptr %0 monotonic, align 2
2500  %conv = zext i16 %1 to i32
2501  ret i32 %conv
2502}
2503
2504; Function Attrs: nofree norecurse nounwind uwtable willreturn
2505define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_uint16_t(i64 %ptr) {
2506; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_uint16_t:
2507; CHECK-P10:       # %bb.0: # %entry
2508; CHECK-P10-NEXT:    pli r4, 244140625
2509; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2510; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2511; CHECK-P10-NEXT:    lhzx r3, r3, r4
2512; CHECK-P10-NEXT:    blr
2513;
2514; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_uint16_t:
2515; CHECK-PREP10:       # %bb.0: # %entry
2516; CHECK-PREP10-NEXT:    lis r4, 3725
2517; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2518; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2519; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2520; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
2521; CHECK-PREP10-NEXT:    blr
2522entry:
2523  %and = and i64 %ptr, -1099511627776
2524  %or = or i64 %and, 1000000000000
2525  %0 = inttoptr i64 %or to ptr
2526  %1 = load atomic i16, ptr %0 monotonic, align 4096
2527  %conv = zext i16 %1 to i32
2528  ret i32 %conv
2529}
2530
2531; Function Attrs: nofree norecurse nounwind uwtable willreturn
2532define dso_local zeroext i32 @ld_cst_align16_uint32_t_uint16_t() {
2533; CHECK-LABEL: ld_cst_align16_uint32_t_uint16_t:
2534; CHECK:       # %bb.0: # %entry
2535; CHECK-NEXT:    lhz r3, 4080(0)
2536; CHECK-NEXT:    blr
2537entry:
2538  %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
2539  %conv = zext i16 %0 to i32
2540  ret i32 %conv
2541}
2542
2543; Function Attrs: nofree norecurse nounwind uwtable willreturn
2544define dso_local zeroext i32 @ld_cst_align32_uint32_t_uint16_t() {
2545; CHECK-LABEL: ld_cst_align32_uint32_t_uint16_t:
2546; CHECK:       # %bb.0: # %entry
2547; CHECK-NEXT:    lis r3, 153
2548; CHECK-NEXT:    lhz r3, -27108(r3)
2549; CHECK-NEXT:    blr
2550entry:
2551  %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
2552  %conv = zext i16 %0 to i32
2553  ret i32 %conv
2554}
2555
2556; Function Attrs: nofree norecurse nounwind uwtable willreturn
2557define dso_local zeroext i32 @ld_cst_align64_uint32_t_uint16_t() {
2558; CHECK-P10-LABEL: ld_cst_align64_uint32_t_uint16_t:
2559; CHECK-P10:       # %bb.0: # %entry
2560; CHECK-P10-NEXT:    pli r3, 244140625
2561; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2562; CHECK-P10-NEXT:    lhz r3, 0(r3)
2563; CHECK-P10-NEXT:    blr
2564;
2565; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_uint16_t:
2566; CHECK-PREP10:       # %bb.0: # %entry
2567; CHECK-PREP10-NEXT:    lis r3, 3725
2568; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2569; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2570; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
2571; CHECK-PREP10-NEXT:    blr
2572entry:
2573  %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
2574  %conv = zext i16 %0 to i32
2575  ret i32 %conv
2576}
2577
2578; Function Attrs: nofree norecurse nounwind uwtable willreturn
2579define dso_local zeroext i32 @ld_0_uint32_t_int16_t(i64 %ptr) {
2580; CHECK-LABEL: ld_0_uint32_t_int16_t:
2581; CHECK:       # %bb.0: # %entry
2582; CHECK-NEXT:    lha r3, 0(r3)
2583; CHECK-NEXT:    clrldi r3, r3, 32
2584; CHECK-NEXT:    blr
2585entry:
2586  %0 = inttoptr i64 %ptr to ptr
2587  %1 = load atomic i16, ptr %0 monotonic, align 2
2588  %conv = sext i16 %1 to i32
2589  ret i32 %conv
2590}
2591
2592; Function Attrs: nofree norecurse nounwind uwtable willreturn
2593define dso_local zeroext i32 @ld_align16_uint32_t_int16_t(ptr nocapture readonly %ptr) {
2594; CHECK-LABEL: ld_align16_uint32_t_int16_t:
2595; CHECK:       # %bb.0: # %entry
2596; CHECK-NEXT:    lha r3, 8(r3)
2597; CHECK-NEXT:    clrldi r3, r3, 32
2598; CHECK-NEXT:    blr
2599entry:
2600  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2601  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2602  %conv = sext i16 %0 to i32
2603  ret i32 %conv
2604}
2605
2606; Function Attrs: nofree norecurse nounwind uwtable willreturn
2607define dso_local zeroext i32 @ld_align32_uint32_t_int16_t(ptr nocapture readonly %ptr) {
2608; CHECK-P10-LABEL: ld_align32_uint32_t_int16_t:
2609; CHECK-P10:       # %bb.0: # %entry
2610; CHECK-P10-NEXT:    plhz r3, 99999000(r3), 0
2611; CHECK-P10-NEXT:    extsh r3, r3
2612; CHECK-P10-NEXT:    clrldi r3, r3, 32
2613; CHECK-P10-NEXT:    blr
2614;
2615; CHECK-PREP10-LABEL: ld_align32_uint32_t_int16_t:
2616; CHECK-PREP10:       # %bb.0: # %entry
2617; CHECK-PREP10-NEXT:    lis r4, 1525
2618; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2619; CHECK-PREP10-NEXT:    lhax r3, r3, r4
2620; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2621; CHECK-PREP10-NEXT:    blr
2622entry:
2623  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2624  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2625  %conv = sext i16 %0 to i32
2626  ret i32 %conv
2627}
2628
2629; Function Attrs: nofree norecurse nounwind uwtable willreturn
2630define dso_local zeroext i32 @ld_align64_uint32_t_int16_t(ptr nocapture readonly %ptr) {
2631; CHECK-P10-LABEL: ld_align64_uint32_t_int16_t:
2632; CHECK-P10:       # %bb.0: # %entry
2633; CHECK-P10-NEXT:    pli r4, 244140625
2634; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2635; CHECK-P10-NEXT:    lhax r3, r3, r4
2636; CHECK-P10-NEXT:    clrldi r3, r3, 32
2637; CHECK-P10-NEXT:    blr
2638;
2639; CHECK-PREP10-LABEL: ld_align64_uint32_t_int16_t:
2640; CHECK-PREP10:       # %bb.0: # %entry
2641; CHECK-PREP10-NEXT:    lis r4, 3725
2642; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2643; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2644; CHECK-PREP10-NEXT:    lhax r3, r3, r4
2645; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2646; CHECK-PREP10-NEXT:    blr
2647entry:
2648  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2649  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2650  %conv = sext i16 %0 to i32
2651  ret i32 %conv
2652}
2653
2654; Function Attrs: nofree norecurse nounwind uwtable willreturn
2655define dso_local zeroext i32 @ld_reg_uint32_t_int16_t(ptr nocapture readonly %ptr, i64 %off) {
2656; CHECK-LABEL: ld_reg_uint32_t_int16_t:
2657; CHECK:       # %bb.0: # %entry
2658; CHECK-NEXT:    lhax r3, r3, r4
2659; CHECK-NEXT:    clrldi r3, r3, 32
2660; CHECK-NEXT:    blr
2661entry:
2662  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2663  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
2664  %conv = sext i16 %0 to i32
2665  ret i32 %conv
2666}
2667
2668; Function Attrs: nofree norecurse nounwind uwtable willreturn
2669define dso_local zeroext i32 @ld_or_uint32_t_int16_t(i64 %ptr, i8 zeroext %off) {
2670; CHECK-LABEL: ld_or_uint32_t_int16_t:
2671; CHECK:       # %bb.0: # %entry
2672; CHECK-NEXT:    or r3, r4, r3
2673; CHECK-NEXT:    lha r3, 0(r3)
2674; CHECK-NEXT:    clrldi r3, r3, 32
2675; CHECK-NEXT:    blr
2676entry:
2677  %conv = zext i8 %off to i64
2678  %or = or i64 %conv, %ptr
2679  %0 = inttoptr i64 %or to ptr
2680  %1 = load atomic i16, ptr %0 monotonic, align 2
2681  %conv1 = sext i16 %1 to i32
2682  ret i32 %conv1
2683}
2684
2685; Function Attrs: nofree norecurse nounwind uwtable willreturn
2686define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_int16_t(i64 %ptr) {
2687; CHECK-LABEL: ld_not_disjoint16_uint32_t_int16_t:
2688; CHECK:       # %bb.0: # %entry
2689; CHECK-NEXT:    ori r3, r3, 6
2690; CHECK-NEXT:    lha r3, 0(r3)
2691; CHECK-NEXT:    clrldi r3, r3, 32
2692; CHECK-NEXT:    blr
2693entry:
2694  %or = or i64 %ptr, 6
2695  %0 = inttoptr i64 %or to ptr
2696  %1 = load atomic i16, ptr %0 monotonic, align 2
2697  %conv = sext i16 %1 to i32
2698  ret i32 %conv
2699}
2700
2701; Function Attrs: nofree norecurse nounwind uwtable willreturn
2702define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_int16_t(i64 %ptr) {
2703; CHECK-LABEL: ld_disjoint_align16_uint32_t_int16_t:
2704; CHECK:       # %bb.0: # %entry
2705; CHECK-NEXT:    rldicr r3, r3, 0, 51
2706; CHECK-NEXT:    lha r3, 24(r3)
2707; CHECK-NEXT:    clrldi r3, r3, 32
2708; CHECK-NEXT:    blr
2709entry:
2710  %and = and i64 %ptr, -4096
2711  %or = or i64 %and, 24
2712  %0 = inttoptr i64 %or to ptr
2713  %1 = load atomic i16, ptr %0 monotonic, align 8
2714  %conv = sext i16 %1 to i32
2715  ret i32 %conv
2716}
2717
2718; Function Attrs: nofree norecurse nounwind uwtable willreturn
2719define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_int16_t(i64 %ptr) {
2720; CHECK-LABEL: ld_not_disjoint32_uint32_t_int16_t:
2721; CHECK:       # %bb.0: # %entry
2722; CHECK-NEXT:    ori r3, r3, 34463
2723; CHECK-NEXT:    oris r3, r3, 1
2724; CHECK-NEXT:    lha r3, 0(r3)
2725; CHECK-NEXT:    clrldi r3, r3, 32
2726; CHECK-NEXT:    blr
2727entry:
2728  %or = or i64 %ptr, 99999
2729  %0 = inttoptr i64 %or to ptr
2730  %1 = load atomic i16, ptr %0 monotonic, align 2
2731  %conv = sext i16 %1 to i32
2732  ret i32 %conv
2733}
2734
2735; Function Attrs: nofree norecurse nounwind uwtable willreturn
2736define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_int16_t(i64 %ptr) {
2737; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_int16_t:
2738; CHECK-P10:       # %bb.0: # %entry
2739; CHECK-P10-NEXT:    lis r4, -15264
2740; CHECK-P10-NEXT:    and r3, r3, r4
2741; CHECK-P10-NEXT:    plhz r3, 999990000(r3), 0
2742; CHECK-P10-NEXT:    extsh r3, r3
2743; CHECK-P10-NEXT:    clrldi r3, r3, 32
2744; CHECK-P10-NEXT:    blr
2745;
2746; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_int16_t:
2747; CHECK-PREP10:       # %bb.0: # %entry
2748; CHECK-PREP10-NEXT:    lis r4, -15264
2749; CHECK-PREP10-NEXT:    and r3, r3, r4
2750; CHECK-PREP10-NEXT:    lis r4, 15258
2751; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2752; CHECK-PREP10-NEXT:    lhax r3, r3, r4
2753; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2754; CHECK-PREP10-NEXT:    blr
2755entry:
2756  %and = and i64 %ptr, -1000341504
2757  %or = or i64 %and, 999990000
2758  %0 = inttoptr i64 %or to ptr
2759  %1 = load atomic i16, ptr %0 monotonic, align 16
2760  %conv = sext i16 %1 to i32
2761  ret i32 %conv
2762}
2763
2764; Function Attrs: nofree norecurse nounwind uwtable willreturn
2765define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_int16_t(i64 %ptr) {
2766; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_int16_t:
2767; CHECK-P10:       # %bb.0: # %entry
2768; CHECK-P10-NEXT:    pli r4, 232
2769; CHECK-P10-NEXT:    pli r5, 3567587329
2770; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2771; CHECK-P10-NEXT:    or r3, r3, r5
2772; CHECK-P10-NEXT:    lha r3, 0(r3)
2773; CHECK-P10-NEXT:    clrldi r3, r3, 32
2774; CHECK-P10-NEXT:    blr
2775;
2776; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_int16_t:
2777; CHECK-PREP10:       # %bb.0: # %entry
2778; CHECK-PREP10-NEXT:    li r4, 29
2779; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2780; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2781; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2782; CHECK-PREP10-NEXT:    or r3, r3, r4
2783; CHECK-PREP10-NEXT:    lha r3, 0(r3)
2784; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2785; CHECK-PREP10-NEXT:    blr
2786entry:
2787  %or = or i64 %ptr, 1000000000001
2788  %0 = inttoptr i64 %or to ptr
2789  %1 = load atomic i16, ptr %0 monotonic, align 2
2790  %conv = sext i16 %1 to i32
2791  ret i32 %conv
2792}
2793
2794; Function Attrs: nofree norecurse nounwind uwtable willreturn
2795define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_int16_t(i64 %ptr) {
2796; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_int16_t:
2797; CHECK-P10:       # %bb.0: # %entry
2798; CHECK-P10-NEXT:    pli r4, 244140625
2799; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2800; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2801; CHECK-P10-NEXT:    lhax r3, r3, r4
2802; CHECK-P10-NEXT:    clrldi r3, r3, 32
2803; CHECK-P10-NEXT:    blr
2804;
2805; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_int16_t:
2806; CHECK-PREP10:       # %bb.0: # %entry
2807; CHECK-PREP10-NEXT:    lis r4, 3725
2808; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2809; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2810; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2811; CHECK-PREP10-NEXT:    lhax r3, r3, r4
2812; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2813; CHECK-PREP10-NEXT:    blr
2814entry:
2815  %and = and i64 %ptr, -1099511627776
2816  %or = or i64 %and, 1000000000000
2817  %0 = inttoptr i64 %or to ptr
2818  %1 = load atomic i16, ptr %0 monotonic, align 4096
2819  %conv = sext i16 %1 to i32
2820  ret i32 %conv
2821}
2822
2823; Function Attrs: nofree norecurse nounwind uwtable willreturn
2824define dso_local zeroext i32 @ld_cst_align16_uint32_t_int16_t() {
2825; CHECK-LABEL: ld_cst_align16_uint32_t_int16_t:
2826; CHECK:       # %bb.0: # %entry
2827; CHECK-NEXT:    lha r3, 4080(0)
2828; CHECK-NEXT:    clrldi r3, r3, 32
2829; CHECK-NEXT:    blr
2830entry:
2831  %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
2832  %conv = sext i16 %0 to i32
2833  ret i32 %conv
2834}
2835
2836; Function Attrs: nofree norecurse nounwind uwtable willreturn
2837define dso_local zeroext i32 @ld_cst_align32_uint32_t_int16_t() {
2838; CHECK-LABEL: ld_cst_align32_uint32_t_int16_t:
2839; CHECK:       # %bb.0: # %entry
2840; CHECK-NEXT:    lis r3, 153
2841; CHECK-NEXT:    lha r3, -27108(r3)
2842; CHECK-NEXT:    clrldi r3, r3, 32
2843; CHECK-NEXT:    blr
2844entry:
2845  %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
2846  %conv = sext i16 %0 to i32
2847  ret i32 %conv
2848}
2849
2850; Function Attrs: nofree norecurse nounwind uwtable willreturn
2851define dso_local zeroext i32 @ld_cst_align64_uint32_t_int16_t() {
2852; CHECK-P10-LABEL: ld_cst_align64_uint32_t_int16_t:
2853; CHECK-P10:       # %bb.0: # %entry
2854; CHECK-P10-NEXT:    pli r3, 244140625
2855; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2856; CHECK-P10-NEXT:    lha r3, 0(r3)
2857; CHECK-P10-NEXT:    clrldi r3, r3, 32
2858; CHECK-P10-NEXT:    blr
2859;
2860; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_int16_t:
2861; CHECK-PREP10:       # %bb.0: # %entry
2862; CHECK-PREP10-NEXT:    lis r3, 3725
2863; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2864; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2865; CHECK-PREP10-NEXT:    lha r3, 0(r3)
2866; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2867; CHECK-PREP10-NEXT:    blr
2868entry:
2869  %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
2870  %conv = sext i16 %0 to i32
2871  ret i32 %conv
2872}
2873
2874; Function Attrs: nofree norecurse nounwind uwtable willreturn
2875define dso_local zeroext i32 @ld_0_uint32_t_uint32_t(i64 %ptr) {
2876; CHECK-LABEL: ld_0_uint32_t_uint32_t:
2877; CHECK:       # %bb.0: # %entry
2878; CHECK-NEXT:    lwz r3, 0(r3)
2879; CHECK-NEXT:    blr
2880entry:
2881  %0 = inttoptr i64 %ptr to ptr
2882  %1 = load atomic i32, ptr %0 monotonic, align 4
2883  ret i32 %1
2884}
2885
2886; Function Attrs: nofree norecurse nounwind uwtable willreturn
2887define dso_local zeroext i32 @ld_align16_uint32_t_uint32_t(ptr nocapture readonly %ptr) {
2888; CHECK-LABEL: ld_align16_uint32_t_uint32_t:
2889; CHECK:       # %bb.0: # %entry
2890; CHECK-NEXT:    lwz r3, 8(r3)
2891; CHECK-NEXT:    blr
2892entry:
2893  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2894  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
2895  ret i32 %0
2896}
2897
2898; Function Attrs: nofree norecurse nounwind uwtable willreturn
2899define dso_local zeroext i32 @ld_align32_uint32_t_uint32_t(ptr nocapture readonly %ptr) {
2900; CHECK-P10-LABEL: ld_align32_uint32_t_uint32_t:
2901; CHECK-P10:       # %bb.0: # %entry
2902; CHECK-P10-NEXT:    plwz r3, 99999000(r3), 0
2903; CHECK-P10-NEXT:    clrldi r3, r3, 32
2904; CHECK-P10-NEXT:    blr
2905;
2906; CHECK-PREP10-LABEL: ld_align32_uint32_t_uint32_t:
2907; CHECK-PREP10:       # %bb.0: # %entry
2908; CHECK-PREP10-NEXT:    lis r4, 1525
2909; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2910; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
2911; CHECK-PREP10-NEXT:    blr
2912entry:
2913  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2914  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
2915  ret i32 %0
2916}
2917
2918; Function Attrs: nofree norecurse nounwind uwtable willreturn
2919define dso_local zeroext i32 @ld_align64_uint32_t_uint32_t(ptr nocapture readonly %ptr) {
2920; CHECK-P10-LABEL: ld_align64_uint32_t_uint32_t:
2921; CHECK-P10:       # %bb.0: # %entry
2922; CHECK-P10-NEXT:    pli r4, 244140625
2923; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2924; CHECK-P10-NEXT:    lwzx r3, r3, r4
2925; CHECK-P10-NEXT:    blr
2926;
2927; CHECK-PREP10-LABEL: ld_align64_uint32_t_uint32_t:
2928; CHECK-PREP10:       # %bb.0: # %entry
2929; CHECK-PREP10-NEXT:    lis r4, 3725
2930; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2931; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2932; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
2933; CHECK-PREP10-NEXT:    blr
2934entry:
2935  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2936  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
2937  ret i32 %0
2938}
2939
2940; Function Attrs: nofree norecurse nounwind uwtable willreturn
2941define dso_local zeroext i32 @ld_reg_uint32_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) {
2942; CHECK-LABEL: ld_reg_uint32_t_uint32_t:
2943; CHECK:       # %bb.0: # %entry
2944; CHECK-NEXT:    lwzx r3, r3, r4
2945; CHECK-NEXT:    blr
2946entry:
2947  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2948  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
2949  ret i32 %0
2950}
2951
2952; Function Attrs: nofree norecurse nounwind uwtable willreturn
2953define dso_local zeroext i32 @ld_or_uint32_t_uint32_t(i64 %ptr, i8 zeroext %off) {
2954; CHECK-LABEL: ld_or_uint32_t_uint32_t:
2955; CHECK:       # %bb.0: # %entry
2956; CHECK-NEXT:    or r3, r4, r3
2957; CHECK-NEXT:    lwz r3, 0(r3)
2958; CHECK-NEXT:    blr
2959entry:
2960  %conv = zext i8 %off to i64
2961  %or = or i64 %conv, %ptr
2962  %0 = inttoptr i64 %or to ptr
2963  %1 = load atomic i32, ptr %0 monotonic, align 4
2964  ret i32 %1
2965}
2966
2967; Function Attrs: nofree norecurse nounwind uwtable willreturn
2968define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_uint32_t(i64 %ptr) {
2969; CHECK-LABEL: ld_not_disjoint16_uint32_t_uint32_t:
2970; CHECK:       # %bb.0: # %entry
2971; CHECK-NEXT:    ori r3, r3, 6
2972; CHECK-NEXT:    lwz r3, 0(r3)
2973; CHECK-NEXT:    blr
2974entry:
2975  %or = or i64 %ptr, 6
2976  %0 = inttoptr i64 %or to ptr
2977  %1 = load atomic i32, ptr %0 monotonic, align 4
2978  ret i32 %1
2979}
2980
2981; Function Attrs: nofree norecurse nounwind uwtable willreturn
2982define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_uint32_t(i64 %ptr) {
2983; CHECK-LABEL: ld_disjoint_align16_uint32_t_uint32_t:
2984; CHECK:       # %bb.0: # %entry
2985; CHECK-NEXT:    rldicr r3, r3, 0, 51
2986; CHECK-NEXT:    lwz r3, 24(r3)
2987; CHECK-NEXT:    blr
2988entry:
2989  %and = and i64 %ptr, -4096
2990  %or = or i64 %and, 24
2991  %0 = inttoptr i64 %or to ptr
2992  %1 = load atomic i32, ptr %0 monotonic, align 8
2993  ret i32 %1
2994}
2995
2996; Function Attrs: nofree norecurse nounwind uwtable willreturn
2997define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_uint32_t(i64 %ptr) {
2998; CHECK-LABEL: ld_not_disjoint32_uint32_t_uint32_t:
2999; CHECK:       # %bb.0: # %entry
3000; CHECK-NEXT:    ori r3, r3, 34463
3001; CHECK-NEXT:    oris r3, r3, 1
3002; CHECK-NEXT:    lwz r3, 0(r3)
3003; CHECK-NEXT:    blr
3004entry:
3005  %or = or i64 %ptr, 99999
3006  %0 = inttoptr i64 %or to ptr
3007  %1 = load atomic i32, ptr %0 monotonic, align 4
3008  ret i32 %1
3009}
3010
3011; Function Attrs: nofree norecurse nounwind uwtable willreturn
3012define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_uint32_t(i64 %ptr) {
3013; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_uint32_t:
3014; CHECK-P10:       # %bb.0: # %entry
3015; CHECK-P10-NEXT:    lis r4, -15264
3016; CHECK-P10-NEXT:    and r3, r3, r4
3017; CHECK-P10-NEXT:    plwz r3, 999990000(r3), 0
3018; CHECK-P10-NEXT:    clrldi r3, r3, 32
3019; CHECK-P10-NEXT:    blr
3020;
3021; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_uint32_t:
3022; CHECK-PREP10:       # %bb.0: # %entry
3023; CHECK-PREP10-NEXT:    lis r4, -15264
3024; CHECK-PREP10-NEXT:    and r3, r3, r4
3025; CHECK-PREP10-NEXT:    lis r4, 15258
3026; CHECK-PREP10-NEXT:    ori r4, r4, 41712
3027; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
3028; CHECK-PREP10-NEXT:    blr
3029entry:
3030  %and = and i64 %ptr, -1000341504
3031  %or = or i64 %and, 999990000
3032  %0 = inttoptr i64 %or to ptr
3033  %1 = load atomic i32, ptr %0 monotonic, align 16
3034  ret i32 %1
3035}
3036
3037; Function Attrs: nofree norecurse nounwind uwtable willreturn
3038define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_uint32_t(i64 %ptr) {
3039; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_uint32_t:
3040; CHECK-P10:       # %bb.0: # %entry
3041; CHECK-P10-NEXT:    pli r4, 232
3042; CHECK-P10-NEXT:    pli r5, 3567587329
3043; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
3044; CHECK-P10-NEXT:    or r3, r3, r5
3045; CHECK-P10-NEXT:    lwz r3, 0(r3)
3046; CHECK-P10-NEXT:    blr
3047;
3048; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_uint32_t:
3049; CHECK-PREP10:       # %bb.0: # %entry
3050; CHECK-PREP10-NEXT:    li r4, 29
3051; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
3052; CHECK-PREP10-NEXT:    oris r4, r4, 54437
3053; CHECK-PREP10-NEXT:    ori r4, r4, 4097
3054; CHECK-PREP10-NEXT:    or r3, r3, r4
3055; CHECK-PREP10-NEXT:    lwz r3, 0(r3)
3056; CHECK-PREP10-NEXT:    blr
3057entry:
3058  %or = or i64 %ptr, 1000000000001
3059  %0 = inttoptr i64 %or to ptr
3060  %1 = load atomic i32, ptr %0 monotonic, align 4
3061  ret i32 %1
3062}
3063
3064; Function Attrs: nofree norecurse nounwind uwtable willreturn
3065define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_uint32_t(i64 %ptr) {
3066; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_uint32_t:
3067; CHECK-P10:       # %bb.0: # %entry
3068; CHECK-P10-NEXT:    pli r4, 244140625
3069; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3070; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3071; CHECK-P10-NEXT:    lwzx r3, r3, r4
3072; CHECK-P10-NEXT:    blr
3073;
3074; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_uint32_t:
3075; CHECK-PREP10:       # %bb.0: # %entry
3076; CHECK-PREP10-NEXT:    lis r4, 3725
3077; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3078; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3079; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3080; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
3081; CHECK-PREP10-NEXT:    blr
3082entry:
3083  %and = and i64 %ptr, -1099511627776
3084  %or = or i64 %and, 1000000000000
3085  %0 = inttoptr i64 %or to ptr
3086  %1 = load atomic i32, ptr %0 monotonic, align 4096
3087  ret i32 %1
3088}
3089
3090; Function Attrs: nofree norecurse nounwind uwtable willreturn
3091define dso_local zeroext i32 @ld_cst_align16_uint32_t_uint32_t() {
3092; CHECK-LABEL: ld_cst_align16_uint32_t_uint32_t:
3093; CHECK:       # %bb.0: # %entry
3094; CHECK-NEXT:    lwz r3, 4080(0)
3095; CHECK-NEXT:    blr
3096entry:
3097  %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
3098  ret i32 %0
3099}
3100
3101; Function Attrs: nofree norecurse nounwind uwtable willreturn
3102define dso_local zeroext i32 @ld_cst_align32_uint32_t_uint32_t() {
3103; CHECK-LABEL: ld_cst_align32_uint32_t_uint32_t:
3104; CHECK:       # %bb.0: # %entry
3105; CHECK-NEXT:    lis r3, 153
3106; CHECK-NEXT:    lwz r3, -27108(r3)
3107; CHECK-NEXT:    blr
3108entry:
3109  %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
3110  ret i32 %0
3111}
3112
3113; Function Attrs: nofree norecurse nounwind uwtable willreturn
3114define dso_local zeroext i32 @ld_cst_align64_uint32_t_uint32_t() {
3115; CHECK-P10-LABEL: ld_cst_align64_uint32_t_uint32_t:
3116; CHECK-P10:       # %bb.0: # %entry
3117; CHECK-P10-NEXT:    pli r3, 244140625
3118; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
3119; CHECK-P10-NEXT:    lwz r3, 0(r3)
3120; CHECK-P10-NEXT:    blr
3121;
3122; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_uint32_t:
3123; CHECK-PREP10:       # %bb.0: # %entry
3124; CHECK-PREP10-NEXT:    lis r3, 3725
3125; CHECK-PREP10-NEXT:    ori r3, r3, 19025
3126; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
3127; CHECK-PREP10-NEXT:    lwz r3, 0(r3)
3128; CHECK-PREP10-NEXT:    blr
3129entry:
3130  %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
3131  ret i32 %0
3132}
3133
3134; Function Attrs: nofree norecurse nounwind uwtable willreturn
3135define dso_local zeroext i32 @ld_0_uint32_t_uint64_t(i64 %ptr) {
3136; CHECK-LABEL: ld_0_uint32_t_uint64_t:
3137; CHECK:       # %bb.0: # %entry
3138; CHECK-NEXT:    ld r3, 0(r3)
3139; CHECK-NEXT:    clrldi r3, r3, 32
3140; CHECK-NEXT:    blr
3141entry:
3142  %0 = inttoptr i64 %ptr to ptr
3143  %1 = load atomic i64, ptr %0 monotonic, align 8
3144  %conv = trunc i64 %1 to i32
3145  ret i32 %conv
3146}
3147
3148; Function Attrs: nofree norecurse nounwind uwtable willreturn
3149define dso_local zeroext i32 @ld_align16_uint32_t_uint64_t(ptr nocapture readonly %ptr) {
3150; CHECK-LABEL: ld_align16_uint32_t_uint64_t:
3151; CHECK:       # %bb.0: # %entry
3152; CHECK-NEXT:    ld r3, 8(r3)
3153; CHECK-NEXT:    clrldi r3, r3, 32
3154; CHECK-NEXT:    blr
3155entry:
3156  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3157  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
3158  %conv = trunc i64 %0 to i32
3159  ret i32 %conv
3160}
3161
3162; Function Attrs: nofree norecurse nounwind uwtable willreturn
3163define dso_local zeroext i32 @ld_align32_uint32_t_uint64_t(ptr nocapture readonly %ptr) {
3164; CHECK-P10-LABEL: ld_align32_uint32_t_uint64_t:
3165; CHECK-P10:       # %bb.0: # %entry
3166; CHECK-P10-NEXT:    pld r3, 99999000(r3), 0
3167; CHECK-P10-NEXT:    clrldi r3, r3, 32
3168; CHECK-P10-NEXT:    blr
3169;
3170; CHECK-PREP10-LABEL: ld_align32_uint32_t_uint64_t:
3171; CHECK-PREP10:       # %bb.0: # %entry
3172; CHECK-PREP10-NEXT:    lis r4, 1525
3173; CHECK-PREP10-NEXT:    ori r4, r4, 56600
3174; CHECK-PREP10-NEXT:    ldx r3, r3, r4
3175; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
3176; CHECK-PREP10-NEXT:    blr
3177entry:
3178  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3179  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
3180  %conv = trunc i64 %0 to i32
3181  ret i32 %conv
3182}
3183
3184; Function Attrs: nofree norecurse nounwind uwtable willreturn
3185define dso_local zeroext i32 @ld_align64_uint32_t_uint64_t(ptr nocapture readonly %ptr) {
3186; CHECK-P10-LABEL: ld_align64_uint32_t_uint64_t:
3187; CHECK-P10:       # %bb.0: # %entry
3188; CHECK-P10-NEXT:    pli r4, 244140625
3189; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3190; CHECK-P10-NEXT:    ldx r3, r3, r4
3191; CHECK-P10-NEXT:    clrldi r3, r3, 32
3192; CHECK-P10-NEXT:    blr
3193;
3194; CHECK-PREP10-LABEL: ld_align64_uint32_t_uint64_t:
3195; CHECK-PREP10:       # %bb.0: # %entry
3196; CHECK-PREP10-NEXT:    lis r4, 3725
3197; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3198; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3199; CHECK-PREP10-NEXT:    ldx r3, r3, r4
3200; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
3201; CHECK-PREP10-NEXT:    blr
3202entry:
3203  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3204  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
3205  %conv = trunc i64 %0 to i32
3206  ret i32 %conv
3207}
3208
3209; Function Attrs: nofree norecurse nounwind uwtable willreturn
3210define dso_local zeroext i32 @ld_reg_uint32_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) {
3211; CHECK-LABEL: ld_reg_uint32_t_uint64_t:
3212; CHECK:       # %bb.0: # %entry
3213; CHECK-NEXT:    ldx r3, r3, r4
3214; CHECK-NEXT:    clrldi r3, r3, 32
3215; CHECK-NEXT:    blr
3216entry:
3217  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3218  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
3219  %conv = trunc i64 %0 to i32
3220  ret i32 %conv
3221}
3222
3223; Function Attrs: nofree norecurse nounwind uwtable willreturn
3224define dso_local zeroext i32 @ld_or_uint32_t_uint64_t(i64 %ptr, i8 zeroext %off) {
3225; CHECK-LABEL: ld_or_uint32_t_uint64_t:
3226; CHECK:       # %bb.0: # %entry
3227; CHECK-NEXT:    or r3, r4, r3
3228; CHECK-NEXT:    ld r3, 0(r3)
3229; CHECK-NEXT:    clrldi r3, r3, 32
3230; CHECK-NEXT:    blr
3231entry:
3232  %conv = zext i8 %off to i64
3233  %or = or i64 %conv, %ptr
3234  %0 = inttoptr i64 %or to ptr
3235  %1 = load atomic i64, ptr %0 monotonic, align 8
3236  %conv1 = trunc i64 %1 to i32
3237  ret i32 %conv1
3238}
3239
3240; Function Attrs: nofree norecurse nounwind uwtable willreturn
3241define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_uint64_t(i64 %ptr) {
3242; CHECK-LABEL: ld_not_disjoint16_uint32_t_uint64_t:
3243; CHECK:       # %bb.0: # %entry
3244; CHECK-NEXT:    ori r3, r3, 6
3245; CHECK-NEXT:    ld r3, 0(r3)
3246; CHECK-NEXT:    clrldi r3, r3, 32
3247; CHECK-NEXT:    blr
3248entry:
3249  %or = or i64 %ptr, 6
3250  %0 = inttoptr i64 %or to ptr
3251  %1 = load atomic i64, ptr %0 monotonic, align 8
3252  %conv = trunc i64 %1 to i32
3253  ret i32 %conv
3254}
3255
3256; Function Attrs: nofree norecurse nounwind uwtable willreturn
3257define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_uint64_t(i64 %ptr) {
3258; CHECK-LABEL: ld_disjoint_align16_uint32_t_uint64_t:
3259; CHECK:       # %bb.0: # %entry
3260; CHECK-NEXT:    rldicr r3, r3, 0, 51
3261; CHECK-NEXT:    ld r3, 24(r3)
3262; CHECK-NEXT:    clrldi r3, r3, 32
3263; CHECK-NEXT:    blr
3264entry:
3265  %and = and i64 %ptr, -4096
3266  %or = or i64 %and, 24
3267  %0 = inttoptr i64 %or to ptr
3268  %1 = load atomic i64, ptr %0 monotonic, align 8
3269  %conv = trunc i64 %1 to i32
3270  ret i32 %conv
3271}
3272
3273; Function Attrs: nofree norecurse nounwind uwtable willreturn
3274define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_uint64_t(i64 %ptr) {
3275; CHECK-LABEL: ld_not_disjoint32_uint32_t_uint64_t:
3276; CHECK:       # %bb.0: # %entry
3277; CHECK-NEXT:    ori r3, r3, 34463
3278; CHECK-NEXT:    oris r3, r3, 1
3279; CHECK-NEXT:    ld r3, 0(r3)
3280; CHECK-NEXT:    clrldi r3, r3, 32
3281; CHECK-NEXT:    blr
3282entry:
3283  %or = or i64 %ptr, 99999
3284  %0 = inttoptr i64 %or to ptr
3285  %1 = load atomic i64, ptr %0 monotonic, align 8
3286  %conv = trunc i64 %1 to i32
3287  ret i32 %conv
3288}
3289
3290; Function Attrs: nofree norecurse nounwind uwtable willreturn
3291define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_uint64_t(i64 %ptr) {
3292; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_uint64_t:
3293; CHECK-P10:       # %bb.0: # %entry
3294; CHECK-P10-NEXT:    lis r4, -15264
3295; CHECK-P10-NEXT:    and r3, r3, r4
3296; CHECK-P10-NEXT:    pld r3, 999990000(r3), 0
3297; CHECK-P10-NEXT:    clrldi r3, r3, 32
3298; CHECK-P10-NEXT:    blr
3299;
3300; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_uint64_t:
3301; CHECK-PREP10:       # %bb.0: # %entry
3302; CHECK-PREP10-NEXT:    lis r4, -15264
3303; CHECK-PREP10-NEXT:    and r3, r3, r4
3304; CHECK-PREP10-NEXT:    lis r4, 15258
3305; CHECK-PREP10-NEXT:    ori r4, r4, 41712
3306; CHECK-PREP10-NEXT:    ldx r3, r3, r4
3307; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
3308; CHECK-PREP10-NEXT:    blr
3309entry:
3310  %and = and i64 %ptr, -1000341504
3311  %or = or i64 %and, 999990000
3312  %0 = inttoptr i64 %or to ptr
3313  %1 = load atomic i64, ptr %0 monotonic, align 16
3314  %conv = trunc i64 %1 to i32
3315  ret i32 %conv
3316}
3317
3318; Function Attrs: nofree norecurse nounwind uwtable willreturn
3319define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_uint64_t(i64 %ptr) {
3320; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_uint64_t:
3321; CHECK-P10:       # %bb.0: # %entry
3322; CHECK-P10-NEXT:    pli r4, 232
3323; CHECK-P10-NEXT:    pli r5, 3567587329
3324; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
3325; CHECK-P10-NEXT:    or r3, r3, r5
3326; CHECK-P10-NEXT:    ld r3, 0(r3)
3327; CHECK-P10-NEXT:    clrldi r3, r3, 32
3328; CHECK-P10-NEXT:    blr
3329;
3330; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_uint64_t:
3331; CHECK-PREP10:       # %bb.0: # %entry
3332; CHECK-PREP10-NEXT:    li r4, 29
3333; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
3334; CHECK-PREP10-NEXT:    oris r4, r4, 54437
3335; CHECK-PREP10-NEXT:    ori r4, r4, 4097
3336; CHECK-PREP10-NEXT:    or r3, r3, r4
3337; CHECK-PREP10-NEXT:    ld r3, 0(r3)
3338; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
3339; CHECK-PREP10-NEXT:    blr
3340entry:
3341  %or = or i64 %ptr, 1000000000001
3342  %0 = inttoptr i64 %or to ptr
3343  %1 = load atomic i64, ptr %0 monotonic, align 8
3344  %conv = trunc i64 %1 to i32
3345  ret i32 %conv
3346}
3347
3348; Function Attrs: nofree norecurse nounwind uwtable willreturn
3349define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_uint64_t(i64 %ptr) {
3350; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_uint64_t:
3351; CHECK-P10:       # %bb.0: # %entry
3352; CHECK-P10-NEXT:    pli r4, 244140625
3353; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3354; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3355; CHECK-P10-NEXT:    ldx r3, r3, r4
3356; CHECK-P10-NEXT:    clrldi r3, r3, 32
3357; CHECK-P10-NEXT:    blr
3358;
3359; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_uint64_t:
3360; CHECK-PREP10:       # %bb.0: # %entry
3361; CHECK-PREP10-NEXT:    lis r4, 3725
3362; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3363; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3364; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3365; CHECK-PREP10-NEXT:    ldx r3, r3, r4
3366; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
3367; CHECK-PREP10-NEXT:    blr
3368entry:
3369  %and = and i64 %ptr, -1099511627776
3370  %or = or i64 %and, 1000000000000
3371  %0 = inttoptr i64 %or to ptr
3372  %1 = load atomic i64, ptr %0 monotonic, align 4096
3373  %conv = trunc i64 %1 to i32
3374  ret i32 %conv
3375}
3376
3377; Function Attrs: nofree norecurse nounwind uwtable willreturn
3378define dso_local zeroext i32 @ld_cst_align16_uint32_t_uint64_t() {
3379; CHECK-LABEL: ld_cst_align16_uint32_t_uint64_t:
3380; CHECK:       # %bb.0: # %entry
3381; CHECK-NEXT:    ld r3, 4080(0)
3382; CHECK-NEXT:    clrldi r3, r3, 32
3383; CHECK-NEXT:    blr
3384entry:
3385  %0 = load atomic i64, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
3386  %conv = trunc i64 %0 to i32
3387  ret i32 %conv
3388}
3389
3390; Function Attrs: nofree norecurse nounwind uwtable willreturn
3391define dso_local zeroext i32 @ld_cst_align32_uint32_t_uint64_t() {
3392; CHECK-LABEL: ld_cst_align32_uint32_t_uint64_t:
3393; CHECK:       # %bb.0: # %entry
3394; CHECK-NEXT:    lis r3, 153
3395; CHECK-NEXT:    ld r3, -27108(r3)
3396; CHECK-NEXT:    clrldi r3, r3, 32
3397; CHECK-NEXT:    blr
3398entry:
3399  %0 = load atomic i64, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8
3400  %conv = trunc i64 %0 to i32
3401  ret i32 %conv
3402}
3403
3404; Function Attrs: nofree norecurse nounwind uwtable willreturn
3405define dso_local zeroext i32 @ld_cst_align64_uint32_t_uint64_t() {
3406; CHECK-P10-LABEL: ld_cst_align64_uint32_t_uint64_t:
3407; CHECK-P10:       # %bb.0: # %entry
3408; CHECK-P10-NEXT:    pli r3, 244140625
3409; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
3410; CHECK-P10-NEXT:    ld r3, 0(r3)
3411; CHECK-P10-NEXT:    clrldi r3, r3, 32
3412; CHECK-P10-NEXT:    blr
3413;
3414; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_uint64_t:
3415; CHECK-PREP10:       # %bb.0: # %entry
3416; CHECK-PREP10-NEXT:    lis r3, 3725
3417; CHECK-PREP10-NEXT:    ori r3, r3, 19025
3418; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
3419; CHECK-PREP10-NEXT:    ld r3, 0(r3)
3420; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
3421; CHECK-PREP10-NEXT:    blr
3422entry:
3423  %0 = load atomic i64, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
3424  %conv = trunc i64 %0 to i32
3425  ret i32 %conv
3426}
3427
3428; Function Attrs: nofree norecurse nounwind uwtable willreturn
3429define dso_local void @st_0_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
3430; CHECK-LABEL: st_0_uint32_t_uint8_t:
3431; CHECK:       # %bb.0: # %entry
3432; CHECK-NEXT:    stb r4, 0(r3)
3433; CHECK-NEXT:    blr
3434entry:
3435  %0 = inttoptr i64 %ptr to ptr
3436  %conv = trunc i32 %str to i8
3437  store atomic i8 %conv, ptr %0 monotonic, align 1
3438  ret void
3439}
3440
3441; Function Attrs: nofree norecurse nounwind uwtable willreturn
3442define dso_local void @st_align16_uint32_t_uint8_t(ptr nocapture %ptr, i32 zeroext %str) {
3443; CHECK-LABEL: st_align16_uint32_t_uint8_t:
3444; CHECK:       # %bb.0: # %entry
3445; CHECK-NEXT:    stb r4, 8(r3)
3446; CHECK-NEXT:    blr
3447entry:
3448  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3449  %conv = trunc i32 %str to i8
3450  store atomic i8 %conv, ptr %add.ptr monotonic, align 1
3451  ret void
3452}
3453
3454; Function Attrs: nofree norecurse nounwind uwtable willreturn
3455define dso_local void @st_align32_uint32_t_uint8_t(ptr nocapture %ptr, i32 zeroext %str) {
3456; CHECK-P10-LABEL: st_align32_uint32_t_uint8_t:
3457; CHECK-P10:       # %bb.0: # %entry
3458; CHECK-P10-NEXT:    pstb r4, 99999000(r3), 0
3459; CHECK-P10-NEXT:    blr
3460;
3461; CHECK-PREP10-LABEL: st_align32_uint32_t_uint8_t:
3462; CHECK-PREP10:       # %bb.0: # %entry
3463; CHECK-PREP10-NEXT:    lis r5, 1525
3464; CHECK-PREP10-NEXT:    ori r5, r5, 56600
3465; CHECK-PREP10-NEXT:    stbx r4, r3, r5
3466; CHECK-PREP10-NEXT:    blr
3467entry:
3468  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3469  %conv = trunc i32 %str to i8
3470  store atomic i8 %conv, ptr %add.ptr monotonic, align 1
3471  ret void
3472}
3473
3474; Function Attrs: nofree norecurse nounwind uwtable willreturn
3475define dso_local void @st_align64_uint32_t_uint8_t(ptr nocapture %ptr, i32 zeroext %str) {
3476; CHECK-P10-LABEL: st_align64_uint32_t_uint8_t:
3477; CHECK-P10:       # %bb.0: # %entry
3478; CHECK-P10-NEXT:    pli r5, 244140625
3479; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
3480; CHECK-P10-NEXT:    stbx r4, r3, r5
3481; CHECK-P10-NEXT:    blr
3482;
3483; CHECK-PREP10-LABEL: st_align64_uint32_t_uint8_t:
3484; CHECK-PREP10:       # %bb.0: # %entry
3485; CHECK-PREP10-NEXT:    lis r5, 3725
3486; CHECK-PREP10-NEXT:    ori r5, r5, 19025
3487; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
3488; CHECK-PREP10-NEXT:    stbx r4, r3, r5
3489; CHECK-PREP10-NEXT:    blr
3490entry:
3491  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3492  %conv = trunc i32 %str to i8
3493  store atomic i8 %conv, ptr %add.ptr monotonic, align 1
3494  ret void
3495}
3496
3497; Function Attrs: nofree norecurse nounwind uwtable willreturn
3498define dso_local void @st_reg_uint32_t_uint8_t(ptr nocapture %ptr, i64 %off, i32 zeroext %str) {
3499; CHECK-LABEL: st_reg_uint32_t_uint8_t:
3500; CHECK:       # %bb.0: # %entry
3501; CHECK-NEXT:    stbx r5, r3, r4
3502; CHECK-NEXT:    blr
3503entry:
3504  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3505  %conv = trunc i32 %str to i8
3506  store atomic i8 %conv, ptr %add.ptr monotonic, align 1
3507  ret void
3508}
3509
3510; Function Attrs: nofree norecurse nounwind uwtable willreturn
3511define dso_local void @st_or1_uint32_t_uint8_t(i64 %ptr, i8 zeroext %off, i32 zeroext %str) {
3512; CHECK-LABEL: st_or1_uint32_t_uint8_t:
3513; CHECK:       # %bb.0: # %entry
3514; CHECK-NEXT:    or r3, r4, r3
3515; CHECK-NEXT:    stb r5, 0(r3)
3516; CHECK-NEXT:    blr
3517entry:
3518  %conv = zext i8 %off to i64
3519  %or = or i64 %conv, %ptr
3520  %0 = inttoptr i64 %or to ptr
3521  %conv1 = trunc i32 %str to i8
3522  store atomic i8 %conv1, ptr %0 monotonic, align 1
3523  ret void
3524}
3525
3526; Function Attrs: nofree norecurse nounwind uwtable willreturn
3527define dso_local void @st_not_disjoint16_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
3528; CHECK-LABEL: st_not_disjoint16_uint32_t_uint8_t:
3529; CHECK:       # %bb.0: # %entry
3530; CHECK-NEXT:    ori r3, r3, 6
3531; CHECK-NEXT:    stb r4, 0(r3)
3532; CHECK-NEXT:    blr
3533entry:
3534  %or = or i64 %ptr, 6
3535  %0 = inttoptr i64 %or to ptr
3536  %conv = trunc i32 %str to i8
3537  store atomic i8 %conv, ptr %0 monotonic, align 1
3538  ret void
3539}
3540
3541; Function Attrs: nofree norecurse nounwind uwtable willreturn
3542define dso_local void @st_disjoint_align16_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
3543; CHECK-LABEL: st_disjoint_align16_uint32_t_uint8_t:
3544; CHECK:       # %bb.0: # %entry
3545; CHECK-NEXT:    rldicr r3, r3, 0, 51
3546; CHECK-NEXT:    stb r4, 24(r3)
3547; CHECK-NEXT:    blr
3548entry:
3549  %and = and i64 %ptr, -4096
3550  %or = or i64 %and, 24
3551  %0 = inttoptr i64 %or to ptr
3552  %conv = trunc i32 %str to i8
3553  store atomic i8 %conv, ptr %0 monotonic, align 8
3554  ret void
3555}
3556
3557; Function Attrs: nofree norecurse nounwind uwtable willreturn
3558define dso_local void @st_not_disjoint32_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
3559; CHECK-LABEL: st_not_disjoint32_uint32_t_uint8_t:
3560; CHECK:       # %bb.0: # %entry
3561; CHECK-NEXT:    ori r3, r3, 34463
3562; CHECK-NEXT:    oris r3, r3, 1
3563; CHECK-NEXT:    stb r4, 0(r3)
3564; CHECK-NEXT:    blr
3565entry:
3566  %or = or i64 %ptr, 99999
3567  %0 = inttoptr i64 %or to ptr
3568  %conv = trunc i32 %str to i8
3569  store atomic i8 %conv, ptr %0 monotonic, align 1
3570  ret void
3571}
3572
3573; Function Attrs: nofree norecurse nounwind uwtable willreturn
3574define dso_local void @st_disjoint_align32_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
3575; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_uint8_t:
3576; CHECK-P10:       # %bb.0: # %entry
3577; CHECK-P10-NEXT:    lis r5, -15264
3578; CHECK-P10-NEXT:    and r3, r3, r5
3579; CHECK-P10-NEXT:    pstb r4, 999990000(r3), 0
3580; CHECK-P10-NEXT:    blr
3581;
3582; CHECK-PREP10-LABEL: st_disjoint_align32_uint32_t_uint8_t:
3583; CHECK-PREP10:       # %bb.0: # %entry
3584; CHECK-PREP10-NEXT:    lis r5, -15264
3585; CHECK-PREP10-NEXT:    and r3, r3, r5
3586; CHECK-PREP10-NEXT:    lis r5, 15258
3587; CHECK-PREP10-NEXT:    ori r5, r5, 41712
3588; CHECK-PREP10-NEXT:    stbx r4, r3, r5
3589; CHECK-PREP10-NEXT:    blr
3590entry:
3591  %and = and i64 %ptr, -1000341504
3592  %or = or i64 %and, 999990000
3593  %0 = inttoptr i64 %or to ptr
3594  %conv = trunc i32 %str to i8
3595  store atomic i8 %conv, ptr %0 monotonic, align 16
3596  ret void
3597}
3598
3599; Function Attrs: nofree norecurse nounwind uwtable willreturn
3600define dso_local void @st_not_disjoint64_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
3601; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_uint8_t:
3602; CHECK-P10:       # %bb.0: # %entry
3603; CHECK-P10-NEXT:    pli r5, 232
3604; CHECK-P10-NEXT:    pli r6, 3567587329
3605; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
3606; CHECK-P10-NEXT:    or r3, r3, r6
3607; CHECK-P10-NEXT:    stb r4, 0(r3)
3608; CHECK-P10-NEXT:    blr
3609;
3610; CHECK-PREP10-LABEL: st_not_disjoint64_uint32_t_uint8_t:
3611; CHECK-PREP10:       # %bb.0: # %entry
3612; CHECK-PREP10-NEXT:    li r5, 29
3613; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
3614; CHECK-PREP10-NEXT:    oris r5, r5, 54437
3615; CHECK-PREP10-NEXT:    ori r5, r5, 4097
3616; CHECK-PREP10-NEXT:    or r3, r3, r5
3617; CHECK-PREP10-NEXT:    stb r4, 0(r3)
3618; CHECK-PREP10-NEXT:    blr
3619entry:
3620  %or = or i64 %ptr, 1000000000001
3621  %0 = inttoptr i64 %or to ptr
3622  %conv = trunc i32 %str to i8
3623  store atomic i8 %conv, ptr %0 monotonic, align 1
3624  ret void
3625}
3626
3627; Function Attrs: nofree norecurse nounwind uwtable willreturn
3628define dso_local void @st_disjoint_align64_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
3629; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_uint8_t:
3630; CHECK-P10:       # %bb.0: # %entry
3631; CHECK-P10-NEXT:    pli r5, 244140625
3632; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3633; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
3634; CHECK-P10-NEXT:    stbx r4, r3, r5
3635; CHECK-P10-NEXT:    blr
3636;
3637; CHECK-PREP10-LABEL: st_disjoint_align64_uint32_t_uint8_t:
3638; CHECK-PREP10:       # %bb.0: # %entry
3639; CHECK-PREP10-NEXT:    lis r5, 3725
3640; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3641; CHECK-PREP10-NEXT:    ori r5, r5, 19025
3642; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
3643; CHECK-PREP10-NEXT:    stbx r4, r3, r5
3644; CHECK-PREP10-NEXT:    blr
3645entry:
3646  %and = and i64 %ptr, -1099511627776
3647  %or = or i64 %and, 1000000000000
3648  %0 = inttoptr i64 %or to ptr
3649  %conv = trunc i32 %str to i8
3650  store atomic i8 %conv, ptr %0 monotonic, align 4096
3651  ret void
3652}
3653
3654; Function Attrs: nofree norecurse nounwind uwtable willreturn
3655define dso_local void @st_cst_align16_uint32_t_uint8_t(i32 zeroext %str) {
3656; CHECK-LABEL: st_cst_align16_uint32_t_uint8_t:
3657; CHECK:       # %bb.0: # %entry
3658; CHECK-NEXT:    stb r3, 4080(0)
3659; CHECK-NEXT:    blr
3660entry:
3661  %conv = trunc i32 %str to i8
3662  store atomic i8 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
3663  ret void
3664}
3665
3666; Function Attrs: nofree norecurse nounwind uwtable willreturn
3667define dso_local void @st_cst_align32_uint32_t_uint8_t(i32 zeroext %str) {
3668; CHECK-LABEL: st_cst_align32_uint32_t_uint8_t:
3669; CHECK:       # %bb.0: # %entry
3670; CHECK-NEXT:    lis r4, 153
3671; CHECK-NEXT:    stb r3, -27108(r4)
3672; CHECK-NEXT:    blr
3673entry:
3674  %conv = trunc i32 %str to i8
3675  store atomic i8 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
3676  ret void
3677}
3678
3679; Function Attrs: nofree norecurse nounwind uwtable willreturn
3680define dso_local void @st_cst_align64_uint32_t_uint8_t(i32 zeroext %str) {
3681; CHECK-P10-LABEL: st_cst_align64_uint32_t_uint8_t:
3682; CHECK-P10:       # %bb.0: # %entry
3683; CHECK-P10-NEXT:    pli r4, 244140625
3684; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3685; CHECK-P10-NEXT:    stb r3, 0(r4)
3686; CHECK-P10-NEXT:    blr
3687;
3688; CHECK-PREP10-LABEL: st_cst_align64_uint32_t_uint8_t:
3689; CHECK-PREP10:       # %bb.0: # %entry
3690; CHECK-PREP10-NEXT:    lis r4, 3725
3691; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3692; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3693; CHECK-PREP10-NEXT:    stb r3, 0(r4)
3694; CHECK-PREP10-NEXT:    blr
3695entry:
3696  %conv = trunc i32 %str to i8
3697  store atomic i8 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
3698  ret void
3699}
3700
3701; Function Attrs: nofree norecurse nounwind uwtable willreturn
3702define dso_local void @st_0_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
3703; CHECK-LABEL: st_0_uint32_t_uint16_t:
3704; CHECK:       # %bb.0: # %entry
3705; CHECK-NEXT:    sth r4, 0(r3)
3706; CHECK-NEXT:    blr
3707entry:
3708  %0 = inttoptr i64 %ptr to ptr
3709  %conv = trunc i32 %str to i16
3710  store atomic i16 %conv, ptr %0 monotonic, align 2
3711  ret void
3712}
3713
3714; Function Attrs: nofree norecurse nounwind uwtable willreturn
3715define dso_local void @st_align16_uint32_t_uint16_t(ptr nocapture %ptr, i32 zeroext %str) {
3716; CHECK-LABEL: st_align16_uint32_t_uint16_t:
3717; CHECK:       # %bb.0: # %entry
3718; CHECK-NEXT:    sth r4, 8(r3)
3719; CHECK-NEXT:    blr
3720entry:
3721  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3722  %conv = trunc i32 %str to i16
3723  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
3724  ret void
3725}
3726
3727; Function Attrs: nofree norecurse nounwind uwtable willreturn
3728define dso_local void @st_align32_uint32_t_uint16_t(ptr nocapture %ptr, i32 zeroext %str) {
3729; CHECK-P10-LABEL: st_align32_uint32_t_uint16_t:
3730; CHECK-P10:       # %bb.0: # %entry
3731; CHECK-P10-NEXT:    psth r4, 99999000(r3), 0
3732; CHECK-P10-NEXT:    blr
3733;
3734; CHECK-PREP10-LABEL: st_align32_uint32_t_uint16_t:
3735; CHECK-PREP10:       # %bb.0: # %entry
3736; CHECK-PREP10-NEXT:    lis r5, 1525
3737; CHECK-PREP10-NEXT:    ori r5, r5, 56600
3738; CHECK-PREP10-NEXT:    sthx r4, r3, r5
3739; CHECK-PREP10-NEXT:    blr
3740entry:
3741  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3742  %conv = trunc i32 %str to i16
3743  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
3744  ret void
3745}
3746
3747; Function Attrs: nofree norecurse nounwind uwtable willreturn
3748define dso_local void @st_align64_uint32_t_uint16_t(ptr nocapture %ptr, i32 zeroext %str) {
3749; CHECK-P10-LABEL: st_align64_uint32_t_uint16_t:
3750; CHECK-P10:       # %bb.0: # %entry
3751; CHECK-P10-NEXT:    pli r5, 244140625
3752; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
3753; CHECK-P10-NEXT:    sthx r4, r3, r5
3754; CHECK-P10-NEXT:    blr
3755;
3756; CHECK-PREP10-LABEL: st_align64_uint32_t_uint16_t:
3757; CHECK-PREP10:       # %bb.0: # %entry
3758; CHECK-PREP10-NEXT:    lis r5, 3725
3759; CHECK-PREP10-NEXT:    ori r5, r5, 19025
3760; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
3761; CHECK-PREP10-NEXT:    sthx r4, r3, r5
3762; CHECK-PREP10-NEXT:    blr
3763entry:
3764  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3765  %conv = trunc i32 %str to i16
3766  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
3767  ret void
3768}
3769
3770; Function Attrs: nofree norecurse nounwind uwtable willreturn
3771define dso_local void @st_reg_uint32_t_uint16_t(ptr nocapture %ptr, i64 %off, i32 zeroext %str) {
3772; CHECK-LABEL: st_reg_uint32_t_uint16_t:
3773; CHECK:       # %bb.0: # %entry
3774; CHECK-NEXT:    sthx r5, r3, r4
3775; CHECK-NEXT:    blr
3776entry:
3777  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3778  %conv = trunc i32 %str to i16
3779  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
3780  ret void
3781}
3782
3783; Function Attrs: nofree norecurse nounwind uwtable willreturn
3784define dso_local void @st_or1_uint32_t_uint16_t(i64 %ptr, i8 zeroext %off, i32 zeroext %str) {
3785; CHECK-LABEL: st_or1_uint32_t_uint16_t:
3786; CHECK:       # %bb.0: # %entry
3787; CHECK-NEXT:    or r3, r4, r3
3788; CHECK-NEXT:    sth r5, 0(r3)
3789; CHECK-NEXT:    blr
3790entry:
3791  %conv = zext i8 %off to i64
3792  %or = or i64 %conv, %ptr
3793  %0 = inttoptr i64 %or to ptr
3794  %conv1 = trunc i32 %str to i16
3795  store atomic i16 %conv1, ptr %0 monotonic, align 2
3796  ret void
3797}
3798
3799; Function Attrs: nofree norecurse nounwind uwtable willreturn
3800define dso_local void @st_not_disjoint16_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
3801; CHECK-LABEL: st_not_disjoint16_uint32_t_uint16_t:
3802; CHECK:       # %bb.0: # %entry
3803; CHECK-NEXT:    ori r3, r3, 6
3804; CHECK-NEXT:    sth r4, 0(r3)
3805; CHECK-NEXT:    blr
3806entry:
3807  %or = or i64 %ptr, 6
3808  %0 = inttoptr i64 %or to ptr
3809  %conv = trunc i32 %str to i16
3810  store atomic i16 %conv, ptr %0 monotonic, align 2
3811  ret void
3812}
3813
3814; Function Attrs: nofree norecurse nounwind uwtable willreturn
3815define dso_local void @st_disjoint_align16_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
3816; CHECK-LABEL: st_disjoint_align16_uint32_t_uint16_t:
3817; CHECK:       # %bb.0: # %entry
3818; CHECK-NEXT:    rldicr r3, r3, 0, 51
3819; CHECK-NEXT:    sth r4, 24(r3)
3820; CHECK-NEXT:    blr
3821entry:
3822  %and = and i64 %ptr, -4096
3823  %or = or i64 %and, 24
3824  %0 = inttoptr i64 %or to ptr
3825  %conv = trunc i32 %str to i16
3826  store atomic i16 %conv, ptr %0 monotonic, align 8
3827  ret void
3828}
3829
3830; Function Attrs: nofree norecurse nounwind uwtable willreturn
3831define dso_local void @st_not_disjoint32_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
3832; CHECK-LABEL: st_not_disjoint32_uint32_t_uint16_t:
3833; CHECK:       # %bb.0: # %entry
3834; CHECK-NEXT:    ori r3, r3, 34463
3835; CHECK-NEXT:    oris r3, r3, 1
3836; CHECK-NEXT:    sth r4, 0(r3)
3837; CHECK-NEXT:    blr
3838entry:
3839  %or = or i64 %ptr, 99999
3840  %0 = inttoptr i64 %or to ptr
3841  %conv = trunc i32 %str to i16
3842  store atomic i16 %conv, ptr %0 monotonic, align 2
3843  ret void
3844}
3845
3846; Function Attrs: nofree norecurse nounwind uwtable willreturn
3847define dso_local void @st_disjoint_align32_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
3848; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_uint16_t:
3849; CHECK-P10:       # %bb.0: # %entry
3850; CHECK-P10-NEXT:    lis r5, -15264
3851; CHECK-P10-NEXT:    and r3, r3, r5
3852; CHECK-P10-NEXT:    psth r4, 999990000(r3), 0
3853; CHECK-P10-NEXT:    blr
3854;
3855; CHECK-PREP10-LABEL: st_disjoint_align32_uint32_t_uint16_t:
3856; CHECK-PREP10:       # %bb.0: # %entry
3857; CHECK-PREP10-NEXT:    lis r5, -15264
3858; CHECK-PREP10-NEXT:    and r3, r3, r5
3859; CHECK-PREP10-NEXT:    lis r5, 15258
3860; CHECK-PREP10-NEXT:    ori r5, r5, 41712
3861; CHECK-PREP10-NEXT:    sthx r4, r3, r5
3862; CHECK-PREP10-NEXT:    blr
3863entry:
3864  %and = and i64 %ptr, -1000341504
3865  %or = or i64 %and, 999990000
3866  %0 = inttoptr i64 %or to ptr
3867  %conv = trunc i32 %str to i16
3868  store atomic i16 %conv, ptr %0 monotonic, align 16
3869  ret void
3870}
3871
3872; Function Attrs: nofree norecurse nounwind uwtable willreturn
3873define dso_local void @st_not_disjoint64_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
3874; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_uint16_t:
3875; CHECK-P10:       # %bb.0: # %entry
3876; CHECK-P10-NEXT:    pli r5, 232
3877; CHECK-P10-NEXT:    pli r6, 3567587329
3878; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
3879; CHECK-P10-NEXT:    or r3, r3, r6
3880; CHECK-P10-NEXT:    sth r4, 0(r3)
3881; CHECK-P10-NEXT:    blr
3882;
3883; CHECK-PREP10-LABEL: st_not_disjoint64_uint32_t_uint16_t:
3884; CHECK-PREP10:       # %bb.0: # %entry
3885; CHECK-PREP10-NEXT:    li r5, 29
3886; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
3887; CHECK-PREP10-NEXT:    oris r5, r5, 54437
3888; CHECK-PREP10-NEXT:    ori r5, r5, 4097
3889; CHECK-PREP10-NEXT:    or r3, r3, r5
3890; CHECK-PREP10-NEXT:    sth r4, 0(r3)
3891; CHECK-PREP10-NEXT:    blr
3892entry:
3893  %or = or i64 %ptr, 1000000000001
3894  %0 = inttoptr i64 %or to ptr
3895  %conv = trunc i32 %str to i16
3896  store atomic i16 %conv, ptr %0 monotonic, align 2
3897  ret void
3898}
3899
3900; Function Attrs: nofree norecurse nounwind uwtable willreturn
3901define dso_local void @st_disjoint_align64_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
3902; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_uint16_t:
3903; CHECK-P10:       # %bb.0: # %entry
3904; CHECK-P10-NEXT:    pli r5, 244140625
3905; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3906; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
3907; CHECK-P10-NEXT:    sthx r4, r3, r5
3908; CHECK-P10-NEXT:    blr
3909;
3910; CHECK-PREP10-LABEL: st_disjoint_align64_uint32_t_uint16_t:
3911; CHECK-PREP10:       # %bb.0: # %entry
3912; CHECK-PREP10-NEXT:    lis r5, 3725
3913; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3914; CHECK-PREP10-NEXT:    ori r5, r5, 19025
3915; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
3916; CHECK-PREP10-NEXT:    sthx r4, r3, r5
3917; CHECK-PREP10-NEXT:    blr
3918entry:
3919  %and = and i64 %ptr, -1099511627776
3920  %or = or i64 %and, 1000000000000
3921  %0 = inttoptr i64 %or to ptr
3922  %conv = trunc i32 %str to i16
3923  store atomic i16 %conv, ptr %0 monotonic, align 4096
3924  ret void
3925}
3926
3927; Function Attrs: nofree norecurse nounwind uwtable willreturn
3928define dso_local void @st_cst_align16_uint32_t_uint16_t(i32 zeroext %str) {
3929; CHECK-LABEL: st_cst_align16_uint32_t_uint16_t:
3930; CHECK:       # %bb.0: # %entry
3931; CHECK-NEXT:    sth r3, 4080(0)
3932; CHECK-NEXT:    blr
3933entry:
3934  %conv = trunc i32 %str to i16
3935  store atomic i16 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
3936  ret void
3937}
3938
3939; Function Attrs: nofree norecurse nounwind uwtable willreturn
3940define dso_local void @st_cst_align32_uint32_t_uint16_t(i32 zeroext %str) {
3941; CHECK-LABEL: st_cst_align32_uint32_t_uint16_t:
3942; CHECK:       # %bb.0: # %entry
3943; CHECK-NEXT:    lis r4, 153
3944; CHECK-NEXT:    sth r3, -27108(r4)
3945; CHECK-NEXT:    blr
3946entry:
3947  %conv = trunc i32 %str to i16
3948  store atomic i16 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
3949  ret void
3950}
3951
3952; Function Attrs: nofree norecurse nounwind uwtable willreturn
3953define dso_local void @st_cst_align64_uint32_t_uint16_t(i32 zeroext %str) {
3954; CHECK-P10-LABEL: st_cst_align64_uint32_t_uint16_t:
3955; CHECK-P10:       # %bb.0: # %entry
3956; CHECK-P10-NEXT:    pli r4, 244140625
3957; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3958; CHECK-P10-NEXT:    sth r3, 0(r4)
3959; CHECK-P10-NEXT:    blr
3960;
3961; CHECK-PREP10-LABEL: st_cst_align64_uint32_t_uint16_t:
3962; CHECK-PREP10:       # %bb.0: # %entry
3963; CHECK-PREP10-NEXT:    lis r4, 3725
3964; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3965; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3966; CHECK-PREP10-NEXT:    sth r3, 0(r4)
3967; CHECK-PREP10-NEXT:    blr
3968entry:
3969  %conv = trunc i32 %str to i16
3970  store atomic i16 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
3971  ret void
3972}
3973
3974; Function Attrs: nofree norecurse nounwind uwtable willreturn
3975define dso_local void @st_0_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
3976; CHECK-LABEL: st_0_uint32_t_uint32_t:
3977; CHECK:       # %bb.0: # %entry
3978; CHECK-NEXT:    stw r4, 0(r3)
3979; CHECK-NEXT:    blr
3980entry:
3981  %0 = inttoptr i64 %ptr to ptr
3982  store atomic i32 %str, ptr %0 monotonic, align 4
3983  ret void
3984}
3985
3986; Function Attrs: nofree norecurse nounwind uwtable willreturn
3987define dso_local void @st_align16_uint32_t_uint32_t(ptr nocapture %ptr, i32 zeroext %str) {
3988; CHECK-LABEL: st_align16_uint32_t_uint32_t:
3989; CHECK:       # %bb.0: # %entry
3990; CHECK-NEXT:    stw r4, 8(r3)
3991; CHECK-NEXT:    blr
3992entry:
3993  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3994  store atomic i32 %str, ptr %add.ptr monotonic, align 4
3995  ret void
3996}
3997
3998; Function Attrs: nofree norecurse nounwind uwtable willreturn
3999define dso_local void @st_align32_uint32_t_uint32_t(ptr nocapture %ptr, i32 zeroext %str) {
4000; CHECK-P10-LABEL: st_align32_uint32_t_uint32_t:
4001; CHECK-P10:       # %bb.0: # %entry
4002; CHECK-P10-NEXT:    pstw r4, 99999000(r3), 0
4003; CHECK-P10-NEXT:    blr
4004;
4005; CHECK-PREP10-LABEL: st_align32_uint32_t_uint32_t:
4006; CHECK-PREP10:       # %bb.0: # %entry
4007; CHECK-PREP10-NEXT:    lis r5, 1525
4008; CHECK-PREP10-NEXT:    ori r5, r5, 56600
4009; CHECK-PREP10-NEXT:    stwx r4, r3, r5
4010; CHECK-PREP10-NEXT:    blr
4011entry:
4012  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
4013  store atomic i32 %str, ptr %add.ptr monotonic, align 4
4014  ret void
4015}
4016
4017; Function Attrs: nofree norecurse nounwind uwtable willreturn
4018define dso_local void @st_align64_uint32_t_uint32_t(ptr nocapture %ptr, i32 zeroext %str) {
4019; CHECK-P10-LABEL: st_align64_uint32_t_uint32_t:
4020; CHECK-P10:       # %bb.0: # %entry
4021; CHECK-P10-NEXT:    pli r5, 244140625
4022; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4023; CHECK-P10-NEXT:    stwx r4, r3, r5
4024; CHECK-P10-NEXT:    blr
4025;
4026; CHECK-PREP10-LABEL: st_align64_uint32_t_uint32_t:
4027; CHECK-PREP10:       # %bb.0: # %entry
4028; CHECK-PREP10-NEXT:    lis r5, 3725
4029; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4030; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4031; CHECK-PREP10-NEXT:    stwx r4, r3, r5
4032; CHECK-PREP10-NEXT:    blr
4033entry:
4034  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
4035  store atomic i32 %str, ptr %add.ptr monotonic, align 4
4036  ret void
4037}
4038
4039; Function Attrs: nofree norecurse nounwind uwtable willreturn
4040define dso_local void @st_reg_uint32_t_uint32_t(ptr nocapture %ptr, i64 %off, i32 zeroext %str) {
4041; CHECK-LABEL: st_reg_uint32_t_uint32_t:
4042; CHECK:       # %bb.0: # %entry
4043; CHECK-NEXT:    stwx r5, r3, r4
4044; CHECK-NEXT:    blr
4045entry:
4046  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
4047  store atomic i32 %str, ptr %add.ptr monotonic, align 4
4048  ret void
4049}
4050
4051; Function Attrs: nofree norecurse nounwind uwtable willreturn
4052define dso_local void @st_or1_uint32_t_uint32_t(i64 %ptr, i8 zeroext %off, i32 zeroext %str) {
4053; CHECK-LABEL: st_or1_uint32_t_uint32_t:
4054; CHECK:       # %bb.0: # %entry
4055; CHECK-NEXT:    or r3, r4, r3
4056; CHECK-NEXT:    stw r5, 0(r3)
4057; CHECK-NEXT:    blr
4058entry:
4059  %conv = zext i8 %off to i64
4060  %or = or i64 %conv, %ptr
4061  %0 = inttoptr i64 %or to ptr
4062  store atomic i32 %str, ptr %0 monotonic, align 4
4063  ret void
4064}
4065
4066; Function Attrs: nofree norecurse nounwind uwtable willreturn
4067define dso_local void @st_not_disjoint16_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
4068; CHECK-LABEL: st_not_disjoint16_uint32_t_uint32_t:
4069; CHECK:       # %bb.0: # %entry
4070; CHECK-NEXT:    ori r3, r3, 6
4071; CHECK-NEXT:    stw r4, 0(r3)
4072; CHECK-NEXT:    blr
4073entry:
4074  %or = or i64 %ptr, 6
4075  %0 = inttoptr i64 %or to ptr
4076  store atomic i32 %str, ptr %0 monotonic, align 4
4077  ret void
4078}
4079
4080; Function Attrs: nofree norecurse nounwind uwtable willreturn
4081define dso_local void @st_disjoint_align16_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
4082; CHECK-LABEL: st_disjoint_align16_uint32_t_uint32_t:
4083; CHECK:       # %bb.0: # %entry
4084; CHECK-NEXT:    rldicr r3, r3, 0, 51
4085; CHECK-NEXT:    stw r4, 24(r3)
4086; CHECK-NEXT:    blr
4087entry:
4088  %and = and i64 %ptr, -4096
4089  %or = or i64 %and, 24
4090  %0 = inttoptr i64 %or to ptr
4091  store atomic i32 %str, ptr %0 monotonic, align 8
4092  ret void
4093}
4094
4095; Function Attrs: nofree norecurse nounwind uwtable willreturn
4096define dso_local void @st_not_disjoint32_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
4097; CHECK-LABEL: st_not_disjoint32_uint32_t_uint32_t:
4098; CHECK:       # %bb.0: # %entry
4099; CHECK-NEXT:    ori r3, r3, 34463
4100; CHECK-NEXT:    oris r3, r3, 1
4101; CHECK-NEXT:    stw r4, 0(r3)
4102; CHECK-NEXT:    blr
4103entry:
4104  %or = or i64 %ptr, 99999
4105  %0 = inttoptr i64 %or to ptr
4106  store atomic i32 %str, ptr %0 monotonic, align 4
4107  ret void
4108}
4109
4110; Function Attrs: nofree norecurse nounwind uwtable willreturn
4111define dso_local void @st_disjoint_align32_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
4112; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_uint32_t:
4113; CHECK-P10:       # %bb.0: # %entry
4114; CHECK-P10-NEXT:    lis r5, -15264
4115; CHECK-P10-NEXT:    and r3, r3, r5
4116; CHECK-P10-NEXT:    pstw r4, 999990000(r3), 0
4117; CHECK-P10-NEXT:    blr
4118;
4119; CHECK-PREP10-LABEL: st_disjoint_align32_uint32_t_uint32_t:
4120; CHECK-PREP10:       # %bb.0: # %entry
4121; CHECK-PREP10-NEXT:    lis r5, -15264
4122; CHECK-PREP10-NEXT:    and r3, r3, r5
4123; CHECK-PREP10-NEXT:    lis r5, 15258
4124; CHECK-PREP10-NEXT:    ori r5, r5, 41712
4125; CHECK-PREP10-NEXT:    stwx r4, r3, r5
4126; CHECK-PREP10-NEXT:    blr
4127entry:
4128  %and = and i64 %ptr, -1000341504
4129  %or = or i64 %and, 999990000
4130  %0 = inttoptr i64 %or to ptr
4131  store atomic i32 %str, ptr %0 monotonic, align 16
4132  ret void
4133}
4134
4135; Function Attrs: nofree norecurse nounwind uwtable willreturn
4136define dso_local void @st_not_disjoint64_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
4137; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_uint32_t:
4138; CHECK-P10:       # %bb.0: # %entry
4139; CHECK-P10-NEXT:    pli r5, 232
4140; CHECK-P10-NEXT:    pli r6, 3567587329
4141; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
4142; CHECK-P10-NEXT:    or r3, r3, r6
4143; CHECK-P10-NEXT:    stw r4, 0(r3)
4144; CHECK-P10-NEXT:    blr
4145;
4146; CHECK-PREP10-LABEL: st_not_disjoint64_uint32_t_uint32_t:
4147; CHECK-PREP10:       # %bb.0: # %entry
4148; CHECK-PREP10-NEXT:    li r5, 29
4149; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
4150; CHECK-PREP10-NEXT:    oris r5, r5, 54437
4151; CHECK-PREP10-NEXT:    ori r5, r5, 4097
4152; CHECK-PREP10-NEXT:    or r3, r3, r5
4153; CHECK-PREP10-NEXT:    stw r4, 0(r3)
4154; CHECK-PREP10-NEXT:    blr
4155entry:
4156  %or = or i64 %ptr, 1000000000001
4157  %0 = inttoptr i64 %or to ptr
4158  store atomic i32 %str, ptr %0 monotonic, align 4
4159  ret void
4160}
4161
4162; Function Attrs: nofree norecurse nounwind uwtable willreturn
4163define dso_local void @st_disjoint_align64_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
4164; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_uint32_t:
4165; CHECK-P10:       # %bb.0: # %entry
4166; CHECK-P10-NEXT:    pli r5, 244140625
4167; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
4168; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4169; CHECK-P10-NEXT:    stwx r4, r3, r5
4170; CHECK-P10-NEXT:    blr
4171;
4172; CHECK-PREP10-LABEL: st_disjoint_align64_uint32_t_uint32_t:
4173; CHECK-PREP10:       # %bb.0: # %entry
4174; CHECK-PREP10-NEXT:    lis r5, 3725
4175; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
4176; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4177; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4178; CHECK-PREP10-NEXT:    stwx r4, r3, r5
4179; CHECK-PREP10-NEXT:    blr
4180entry:
4181  %and = and i64 %ptr, -1099511627776
4182  %or = or i64 %and, 1000000000000
4183  %0 = inttoptr i64 %or to ptr
4184  store atomic i32 %str, ptr %0 monotonic, align 4096
4185  ret void
4186}
4187
4188; Function Attrs: nofree norecurse nounwind uwtable willreturn
4189define dso_local void @st_cst_align16_uint32_t_uint32_t(i32 zeroext %str) {
4190; CHECK-LABEL: st_cst_align16_uint32_t_uint32_t:
4191; CHECK:       # %bb.0: # %entry
4192; CHECK-NEXT:    stw r3, 4080(0)
4193; CHECK-NEXT:    blr
4194entry:
4195  store atomic i32 %str, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
4196  ret void
4197}
4198
4199; Function Attrs: nofree norecurse nounwind uwtable willreturn
4200define dso_local void @st_cst_align32_uint32_t_uint32_t(i32 zeroext %str) {
4201; CHECK-LABEL: st_cst_align32_uint32_t_uint32_t:
4202; CHECK:       # %bb.0: # %entry
4203; CHECK-NEXT:    lis r4, 153
4204; CHECK-NEXT:    stw r3, -27108(r4)
4205; CHECK-NEXT:    blr
4206entry:
4207  store atomic i32 %str, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
4208  ret void
4209}
4210
4211; Function Attrs: nofree norecurse nounwind uwtable willreturn
4212define dso_local void @st_cst_align64_uint32_t_uint32_t(i32 zeroext %str) {
4213; CHECK-P10-LABEL: st_cst_align64_uint32_t_uint32_t:
4214; CHECK-P10:       # %bb.0: # %entry
4215; CHECK-P10-NEXT:    pli r4, 244140625
4216; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4217; CHECK-P10-NEXT:    stw r3, 0(r4)
4218; CHECK-P10-NEXT:    blr
4219;
4220; CHECK-PREP10-LABEL: st_cst_align64_uint32_t_uint32_t:
4221; CHECK-PREP10:       # %bb.0: # %entry
4222; CHECK-PREP10-NEXT:    lis r4, 3725
4223; CHECK-PREP10-NEXT:    ori r4, r4, 19025
4224; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
4225; CHECK-PREP10-NEXT:    stw r3, 0(r4)
4226; CHECK-PREP10-NEXT:    blr
4227entry:
4228  store atomic i32 %str, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
4229  ret void
4230}
4231
4232; Function Attrs: nofree norecurse nounwind uwtable willreturn
4233define dso_local void @st_0_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
4234; CHECK-LABEL: st_0_uint32_t_uint64_t:
4235; CHECK:       # %bb.0: # %entry
4236; CHECK-NEXT:    std r4, 0(r3)
4237; CHECK-NEXT:    blr
4238entry:
4239  %0 = inttoptr i64 %ptr to ptr
4240  %conv = zext i32 %str to i64
4241  store atomic i64 %conv, ptr %0 monotonic, align 8
4242  ret void
4243}
4244
4245; Function Attrs: nofree norecurse nounwind uwtable willreturn
4246define dso_local void @st_align16_uint32_t_uint64_t(ptr nocapture %ptr, i32 zeroext %str) {
4247; CHECK-LABEL: st_align16_uint32_t_uint64_t:
4248; CHECK:       # %bb.0: # %entry
4249; CHECK-NEXT:    std r4, 8(r3)
4250; CHECK-NEXT:    blr
4251entry:
4252  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
4253  %conv = zext i32 %str to i64
4254  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
4255  ret void
4256}
4257
4258; Function Attrs: nofree norecurse nounwind uwtable willreturn
4259define dso_local void @st_align32_uint32_t_uint64_t(ptr nocapture %ptr, i32 zeroext %str) {
4260; CHECK-P10-LABEL: st_align32_uint32_t_uint64_t:
4261; CHECK-P10:       # %bb.0: # %entry
4262; CHECK-P10-NEXT:    pstd r4, 99999000(r3), 0
4263; CHECK-P10-NEXT:    blr
4264;
4265; CHECK-PREP10-LABEL: st_align32_uint32_t_uint64_t:
4266; CHECK-PREP10:       # %bb.0: # %entry
4267; CHECK-PREP10-NEXT:    lis r5, 1525
4268; CHECK-PREP10-NEXT:    ori r5, r5, 56600
4269; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4270; CHECK-PREP10-NEXT:    blr
4271entry:
4272  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
4273  %conv = zext i32 %str to i64
4274  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
4275  ret void
4276}
4277
4278; Function Attrs: nofree norecurse nounwind uwtable willreturn
4279define dso_local void @st_align64_uint32_t_uint64_t(ptr nocapture %ptr, i32 zeroext %str) {
4280; CHECK-P10-LABEL: st_align64_uint32_t_uint64_t:
4281; CHECK-P10:       # %bb.0: # %entry
4282; CHECK-P10-NEXT:    pli r5, 244140625
4283; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4284; CHECK-P10-NEXT:    stdx r4, r3, r5
4285; CHECK-P10-NEXT:    blr
4286;
4287; CHECK-PREP10-LABEL: st_align64_uint32_t_uint64_t:
4288; CHECK-PREP10:       # %bb.0: # %entry
4289; CHECK-PREP10-NEXT:    lis r5, 3725
4290; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4291; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4292; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4293; CHECK-PREP10-NEXT:    blr
4294entry:
4295  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
4296  %conv = zext i32 %str to i64
4297  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
4298  ret void
4299}
4300
4301; Function Attrs: nofree norecurse nounwind uwtable willreturn
4302define dso_local void @st_reg_uint32_t_uint64_t(ptr nocapture %ptr, i64 %off, i32 zeroext %str) {
4303; CHECK-LABEL: st_reg_uint32_t_uint64_t:
4304; CHECK:       # %bb.0: # %entry
4305; CHECK-NEXT:    stdx r5, r3, r4
4306; CHECK-NEXT:    blr
4307entry:
4308  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
4309  %conv = zext i32 %str to i64
4310  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
4311  ret void
4312}
4313
4314; Function Attrs: nofree norecurse nounwind uwtable willreturn
4315define dso_local void @st_or1_uint32_t_uint64_t(i64 %ptr, i8 zeroext %off, i32 zeroext %str) {
4316; CHECK-LABEL: st_or1_uint32_t_uint64_t:
4317; CHECK:       # %bb.0: # %entry
4318; CHECK-NEXT:    or r3, r4, r3
4319; CHECK-NEXT:    std r5, 0(r3)
4320; CHECK-NEXT:    blr
4321entry:
4322  %conv = zext i8 %off to i64
4323  %or = or i64 %conv, %ptr
4324  %0 = inttoptr i64 %or to ptr
4325  %conv1 = zext i32 %str to i64
4326  store atomic i64 %conv1, ptr %0 monotonic, align 8
4327  ret void
4328}
4329
4330; Function Attrs: nofree norecurse nounwind uwtable willreturn
4331define dso_local void @st_not_disjoint16_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
4332; CHECK-LABEL: st_not_disjoint16_uint32_t_uint64_t:
4333; CHECK:       # %bb.0: # %entry
4334; CHECK-NEXT:    ori r3, r3, 6
4335; CHECK-NEXT:    std r4, 0(r3)
4336; CHECK-NEXT:    blr
4337entry:
4338  %or = or i64 %ptr, 6
4339  %0 = inttoptr i64 %or to ptr
4340  %conv = zext i32 %str to i64
4341  store atomic i64 %conv, ptr %0 monotonic, align 8
4342  ret void
4343}
4344
4345; Function Attrs: nofree norecurse nounwind uwtable willreturn
4346define dso_local void @st_disjoint_align16_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
4347; CHECK-LABEL: st_disjoint_align16_uint32_t_uint64_t:
4348; CHECK:       # %bb.0: # %entry
4349; CHECK-NEXT:    rldicr r3, r3, 0, 51
4350; CHECK-NEXT:    std r4, 24(r3)
4351; CHECK-NEXT:    blr
4352entry:
4353  %and = and i64 %ptr, -4096
4354  %or = or i64 %and, 24
4355  %0 = inttoptr i64 %or to ptr
4356  %conv = zext i32 %str to i64
4357  store atomic i64 %conv, ptr %0 monotonic, align 8
4358  ret void
4359}
4360
4361; Function Attrs: nofree norecurse nounwind uwtable willreturn
4362define dso_local void @st_not_disjoint32_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
4363; CHECK-LABEL: st_not_disjoint32_uint32_t_uint64_t:
4364; CHECK:       # %bb.0: # %entry
4365; CHECK-NEXT:    ori r3, r3, 34463
4366; CHECK-NEXT:    oris r3, r3, 1
4367; CHECK-NEXT:    std r4, 0(r3)
4368; CHECK-NEXT:    blr
4369entry:
4370  %or = or i64 %ptr, 99999
4371  %0 = inttoptr i64 %or to ptr
4372  %conv = zext i32 %str to i64
4373  store atomic i64 %conv, ptr %0 monotonic, align 8
4374  ret void
4375}
4376
4377; Function Attrs: nofree norecurse nounwind uwtable willreturn
4378define dso_local void @st_disjoint_align32_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
4379; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_uint64_t:
4380; CHECK-P10:       # %bb.0: # %entry
4381; CHECK-P10-NEXT:    lis r5, -15264
4382; CHECK-P10-NEXT:    and r3, r3, r5
4383; CHECK-P10-NEXT:    pstd r4, 999990000(r3), 0
4384; CHECK-P10-NEXT:    blr
4385;
4386; CHECK-PREP10-LABEL: st_disjoint_align32_uint32_t_uint64_t:
4387; CHECK-PREP10:       # %bb.0: # %entry
4388; CHECK-PREP10-NEXT:    lis r5, -15264
4389; CHECK-PREP10-NEXT:    and r3, r3, r5
4390; CHECK-PREP10-NEXT:    lis r5, 15258
4391; CHECK-PREP10-NEXT:    ori r5, r5, 41712
4392; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4393; CHECK-PREP10-NEXT:    blr
4394entry:
4395  %and = and i64 %ptr, -1000341504
4396  %or = or i64 %and, 999990000
4397  %0 = inttoptr i64 %or to ptr
4398  %conv = zext i32 %str to i64
4399  store atomic i64 %conv, ptr %0 monotonic, align 16
4400  ret void
4401}
4402
4403; Function Attrs: nofree norecurse nounwind uwtable willreturn
4404define dso_local void @st_not_disjoint64_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
4405; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_uint64_t:
4406; CHECK-P10:       # %bb.0: # %entry
4407; CHECK-P10-NEXT:    pli r5, 232
4408; CHECK-P10-NEXT:    pli r6, 3567587329
4409; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
4410; CHECK-P10-NEXT:    or r3, r3, r6
4411; CHECK-P10-NEXT:    std r4, 0(r3)
4412; CHECK-P10-NEXT:    blr
4413;
4414; CHECK-PREP10-LABEL: st_not_disjoint64_uint32_t_uint64_t:
4415; CHECK-PREP10:       # %bb.0: # %entry
4416; CHECK-PREP10-NEXT:    li r5, 29
4417; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
4418; CHECK-PREP10-NEXT:    oris r5, r5, 54437
4419; CHECK-PREP10-NEXT:    ori r5, r5, 4097
4420; CHECK-PREP10-NEXT:    or r3, r3, r5
4421; CHECK-PREP10-NEXT:    std r4, 0(r3)
4422; CHECK-PREP10-NEXT:    blr
4423entry:
4424  %or = or i64 %ptr, 1000000000001
4425  %0 = inttoptr i64 %or to ptr
4426  %conv = zext i32 %str to i64
4427  store atomic i64 %conv, ptr %0 monotonic, align 8
4428  ret void
4429}
4430
4431; Function Attrs: nofree norecurse nounwind uwtable willreturn
4432define dso_local void @st_disjoint_align64_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
4433; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_uint64_t:
4434; CHECK-P10:       # %bb.0: # %entry
4435; CHECK-P10-NEXT:    pli r5, 244140625
4436; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
4437; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4438; CHECK-P10-NEXT:    stdx r4, r3, r5
4439; CHECK-P10-NEXT:    blr
4440;
4441; CHECK-PREP10-LABEL: st_disjoint_align64_uint32_t_uint64_t:
4442; CHECK-PREP10:       # %bb.0: # %entry
4443; CHECK-PREP10-NEXT:    lis r5, 3725
4444; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
4445; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4446; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4447; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4448; CHECK-PREP10-NEXT:    blr
4449entry:
4450  %and = and i64 %ptr, -1099511627776
4451  %or = or i64 %and, 1000000000000
4452  %0 = inttoptr i64 %or to ptr
4453  %conv = zext i32 %str to i64
4454  store atomic i64 %conv, ptr %0 monotonic, align 4096
4455  ret void
4456}
4457
4458; Function Attrs: nofree norecurse nounwind uwtable willreturn
4459define dso_local void @st_cst_align16_uint32_t_uint64_t(i32 zeroext %str) {
4460; CHECK-LABEL: st_cst_align16_uint32_t_uint64_t:
4461; CHECK:       # %bb.0: # %entry
4462; CHECK-NEXT:    std r3, 4080(0)
4463; CHECK-NEXT:    blr
4464entry:
4465  %conv = zext i32 %str to i64
4466  store atomic i64 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
4467  ret void
4468}
4469
4470; Function Attrs: nofree norecurse nounwind uwtable willreturn
4471define dso_local void @st_cst_align32_uint32_t_uint64_t(i32 zeroext %str) {
4472; CHECK-LABEL: st_cst_align32_uint32_t_uint64_t:
4473; CHECK:       # %bb.0: # %entry
4474; CHECK-NEXT:    lis r4, 153
4475; CHECK-NEXT:    std r3, -27108(r4)
4476; CHECK-NEXT:    blr
4477entry:
4478  %conv = zext i32 %str to i64
4479  store atomic i64 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8
4480  ret void
4481}
4482
4483; Function Attrs: nofree norecurse nounwind uwtable willreturn
4484define dso_local void @st_cst_align64_uint32_t_uint64_t(i32 zeroext %str) {
4485; CHECK-P10-LABEL: st_cst_align64_uint32_t_uint64_t:
4486; CHECK-P10:       # %bb.0: # %entry
4487; CHECK-P10-NEXT:    pli r4, 244140625
4488; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4489; CHECK-P10-NEXT:    std r3, 0(r4)
4490; CHECK-P10-NEXT:    blr
4491;
4492; CHECK-PREP10-LABEL: st_cst_align64_uint32_t_uint64_t:
4493; CHECK-PREP10:       # %bb.0: # %entry
4494; CHECK-PREP10-NEXT:    lis r4, 3725
4495; CHECK-PREP10-NEXT:    ori r4, r4, 19025
4496; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
4497; CHECK-PREP10-NEXT:    std r3, 0(r4)
4498; CHECK-PREP10-NEXT:    blr
4499entry:
4500  %conv = zext i32 %str to i64
4501  store atomic i64 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
4502  ret void
4503}
4504
4505; Function Attrs: nofree norecurse nounwind uwtable willreturn
4506define dso_local void @st_0_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
4507; CHECK-LABEL: st_0_int32_t_uint64_t:
4508; CHECK:       # %bb.0: # %entry
4509; CHECK-NEXT:    std r4, 0(r3)
4510; CHECK-NEXT:    blr
4511entry:
4512  %0 = inttoptr i64 %ptr to ptr
4513  %conv = sext i32 %str to i64
4514  store atomic i64 %conv, ptr %0 monotonic, align 8
4515  ret void
4516}
4517
4518; Function Attrs: nofree norecurse nounwind uwtable willreturn
4519define dso_local void @st_align16_int32_t_uint64_t(ptr nocapture %ptr, i32 signext %str) {
4520; CHECK-LABEL: st_align16_int32_t_uint64_t:
4521; CHECK:       # %bb.0: # %entry
4522; CHECK-NEXT:    std r4, 8(r3)
4523; CHECK-NEXT:    blr
4524entry:
4525  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
4526  %conv = sext i32 %str to i64
4527  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
4528  ret void
4529}
4530
4531; Function Attrs: nofree norecurse nounwind uwtable willreturn
4532define dso_local void @st_align32_int32_t_uint64_t(ptr nocapture %ptr, i32 signext %str) {
4533; CHECK-P10-LABEL: st_align32_int32_t_uint64_t:
4534; CHECK-P10:       # %bb.0: # %entry
4535; CHECK-P10-NEXT:    pstd r4, 99999000(r3), 0
4536; CHECK-P10-NEXT:    blr
4537;
4538; CHECK-PREP10-LABEL: st_align32_int32_t_uint64_t:
4539; CHECK-PREP10:       # %bb.0: # %entry
4540; CHECK-PREP10-NEXT:    lis r5, 1525
4541; CHECK-PREP10-NEXT:    ori r5, r5, 56600
4542; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4543; CHECK-PREP10-NEXT:    blr
4544entry:
4545  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
4546  %conv = sext i32 %str to i64
4547  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
4548  ret void
4549}
4550
4551; Function Attrs: nofree norecurse nounwind uwtable willreturn
4552define dso_local void @st_align64_int32_t_uint64_t(ptr nocapture %ptr, i32 signext %str) {
4553; CHECK-P10-LABEL: st_align64_int32_t_uint64_t:
4554; CHECK-P10:       # %bb.0: # %entry
4555; CHECK-P10-NEXT:    pli r5, 244140625
4556; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4557; CHECK-P10-NEXT:    stdx r4, r3, r5
4558; CHECK-P10-NEXT:    blr
4559;
4560; CHECK-PREP10-LABEL: st_align64_int32_t_uint64_t:
4561; CHECK-PREP10:       # %bb.0: # %entry
4562; CHECK-PREP10-NEXT:    lis r5, 3725
4563; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4564; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4565; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4566; CHECK-PREP10-NEXT:    blr
4567entry:
4568  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
4569  %conv = sext i32 %str to i64
4570  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
4571  ret void
4572}
4573
4574; Function Attrs: nofree norecurse nounwind uwtable willreturn
4575define dso_local void @st_reg_int32_t_uint64_t(ptr nocapture %ptr, i64 %off, i32 signext %str) {
4576; CHECK-LABEL: st_reg_int32_t_uint64_t:
4577; CHECK:       # %bb.0: # %entry
4578; CHECK-NEXT:    stdx r5, r3, r4
4579; CHECK-NEXT:    blr
4580entry:
4581  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
4582  %conv = sext i32 %str to i64
4583  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
4584  ret void
4585}
4586
4587; Function Attrs: nofree norecurse nounwind uwtable willreturn
4588define dso_local void @st_or1_int32_t_uint64_t(i64 %ptr, i8 zeroext %off, i32 signext %str) {
4589; CHECK-LABEL: st_or1_int32_t_uint64_t:
4590; CHECK:       # %bb.0: # %entry
4591; CHECK-NEXT:    or r3, r4, r3
4592; CHECK-NEXT:    std r5, 0(r3)
4593; CHECK-NEXT:    blr
4594entry:
4595  %conv = zext i8 %off to i64
4596  %or = or i64 %conv, %ptr
4597  %0 = inttoptr i64 %or to ptr
4598  %conv1 = sext i32 %str to i64
4599  store atomic i64 %conv1, ptr %0 monotonic, align 8
4600  ret void
4601}
4602
4603; Function Attrs: nofree norecurse nounwind uwtable willreturn
4604define dso_local void @st_not_disjoint16_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
4605; CHECK-LABEL: st_not_disjoint16_int32_t_uint64_t:
4606; CHECK:       # %bb.0: # %entry
4607; CHECK-NEXT:    ori r3, r3, 6
4608; CHECK-NEXT:    std r4, 0(r3)
4609; CHECK-NEXT:    blr
4610entry:
4611  %or = or i64 %ptr, 6
4612  %0 = inttoptr i64 %or to ptr
4613  %conv = sext i32 %str to i64
4614  store atomic i64 %conv, ptr %0 monotonic, align 8
4615  ret void
4616}
4617
4618; Function Attrs: nofree norecurse nounwind uwtable willreturn
4619define dso_local void @st_disjoint_align16_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
4620; CHECK-LABEL: st_disjoint_align16_int32_t_uint64_t:
4621; CHECK:       # %bb.0: # %entry
4622; CHECK-NEXT:    rldicr r3, r3, 0, 51
4623; CHECK-NEXT:    std r4, 24(r3)
4624; CHECK-NEXT:    blr
4625entry:
4626  %and = and i64 %ptr, -4096
4627  %or = or i64 %and, 24
4628  %0 = inttoptr i64 %or to ptr
4629  %conv = sext i32 %str to i64
4630  store atomic i64 %conv, ptr %0 monotonic, align 8
4631  ret void
4632}
4633
4634; Function Attrs: nofree norecurse nounwind uwtable willreturn
4635define dso_local void @st_not_disjoint32_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
4636; CHECK-LABEL: st_not_disjoint32_int32_t_uint64_t:
4637; CHECK:       # %bb.0: # %entry
4638; CHECK-NEXT:    ori r3, r3, 34463
4639; CHECK-NEXT:    oris r3, r3, 1
4640; CHECK-NEXT:    std r4, 0(r3)
4641; CHECK-NEXT:    blr
4642entry:
4643  %or = or i64 %ptr, 99999
4644  %0 = inttoptr i64 %or to ptr
4645  %conv = sext i32 %str to i64
4646  store atomic i64 %conv, ptr %0 monotonic, align 8
4647  ret void
4648}
4649
4650; Function Attrs: nofree norecurse nounwind uwtable willreturn
4651define dso_local void @st_disjoint_align32_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
4652; CHECK-P10-LABEL: st_disjoint_align32_int32_t_uint64_t:
4653; CHECK-P10:       # %bb.0: # %entry
4654; CHECK-P10-NEXT:    lis r5, -15264
4655; CHECK-P10-NEXT:    and r3, r3, r5
4656; CHECK-P10-NEXT:    pstd r4, 999990000(r3), 0
4657; CHECK-P10-NEXT:    blr
4658;
4659; CHECK-PREP10-LABEL: st_disjoint_align32_int32_t_uint64_t:
4660; CHECK-PREP10:       # %bb.0: # %entry
4661; CHECK-PREP10-NEXT:    lis r5, -15264
4662; CHECK-PREP10-NEXT:    and r3, r3, r5
4663; CHECK-PREP10-NEXT:    lis r5, 15258
4664; CHECK-PREP10-NEXT:    ori r5, r5, 41712
4665; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4666; CHECK-PREP10-NEXT:    blr
4667entry:
4668  %and = and i64 %ptr, -1000341504
4669  %or = or i64 %and, 999990000
4670  %0 = inttoptr i64 %or to ptr
4671  %conv = sext i32 %str to i64
4672  store atomic i64 %conv, ptr %0 monotonic, align 16
4673  ret void
4674}
4675
4676; Function Attrs: nofree norecurse nounwind uwtable willreturn
4677define dso_local void @st_not_disjoint64_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
4678; CHECK-P10-LABEL: st_not_disjoint64_int32_t_uint64_t:
4679; CHECK-P10:       # %bb.0: # %entry
4680; CHECK-P10-NEXT:    pli r5, 232
4681; CHECK-P10-NEXT:    pli r6, 3567587329
4682; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
4683; CHECK-P10-NEXT:    or r3, r3, r6
4684; CHECK-P10-NEXT:    std r4, 0(r3)
4685; CHECK-P10-NEXT:    blr
4686;
4687; CHECK-PREP10-LABEL: st_not_disjoint64_int32_t_uint64_t:
4688; CHECK-PREP10:       # %bb.0: # %entry
4689; CHECK-PREP10-NEXT:    li r5, 29
4690; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
4691; CHECK-PREP10-NEXT:    oris r5, r5, 54437
4692; CHECK-PREP10-NEXT:    ori r5, r5, 4097
4693; CHECK-PREP10-NEXT:    or r3, r3, r5
4694; CHECK-PREP10-NEXT:    std r4, 0(r3)
4695; CHECK-PREP10-NEXT:    blr
4696entry:
4697  %or = or i64 %ptr, 1000000000001
4698  %0 = inttoptr i64 %or to ptr
4699  %conv = sext i32 %str to i64
4700  store atomic i64 %conv, ptr %0 monotonic, align 8
4701  ret void
4702}
4703
4704; Function Attrs: nofree norecurse nounwind uwtable willreturn
4705define dso_local void @st_disjoint_align64_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
4706; CHECK-P10-LABEL: st_disjoint_align64_int32_t_uint64_t:
4707; CHECK-P10:       # %bb.0: # %entry
4708; CHECK-P10-NEXT:    pli r5, 244140625
4709; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
4710; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4711; CHECK-P10-NEXT:    stdx r4, r3, r5
4712; CHECK-P10-NEXT:    blr
4713;
4714; CHECK-PREP10-LABEL: st_disjoint_align64_int32_t_uint64_t:
4715; CHECK-PREP10:       # %bb.0: # %entry
4716; CHECK-PREP10-NEXT:    lis r5, 3725
4717; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
4718; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4719; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4720; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4721; CHECK-PREP10-NEXT:    blr
4722entry:
4723  %and = and i64 %ptr, -1099511627776
4724  %or = or i64 %and, 1000000000000
4725  %0 = inttoptr i64 %or to ptr
4726  %conv = sext i32 %str to i64
4727  store atomic i64 %conv, ptr %0 monotonic, align 4096
4728  ret void
4729}
4730
4731; Function Attrs: nofree norecurse nounwind uwtable willreturn
4732define dso_local void @st_cst_align16_int32_t_uint64_t(i32 signext %str) {
4733; CHECK-LABEL: st_cst_align16_int32_t_uint64_t:
4734; CHECK:       # %bb.0: # %entry
4735; CHECK-NEXT:    std r3, 4080(0)
4736; CHECK-NEXT:    blr
4737entry:
4738  %conv = sext i32 %str to i64
4739  store atomic i64 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
4740  ret void
4741}
4742
4743; Function Attrs: nofree norecurse nounwind uwtable willreturn
4744define dso_local void @st_cst_align32_int32_t_uint64_t(i32 signext %str) {
4745; CHECK-LABEL: st_cst_align32_int32_t_uint64_t:
4746; CHECK:       # %bb.0: # %entry
4747; CHECK-NEXT:    lis r4, 153
4748; CHECK-NEXT:    std r3, -27108(r4)
4749; CHECK-NEXT:    blr
4750entry:
4751  %conv = sext i32 %str to i64
4752  store atomic i64 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8
4753  ret void
4754}
4755
4756; Function Attrs: nofree norecurse nounwind uwtable willreturn
4757define dso_local void @st_cst_align64_int32_t_uint64_t(i32 signext %str) {
4758; CHECK-P10-LABEL: st_cst_align64_int32_t_uint64_t:
4759; CHECK-P10:       # %bb.0: # %entry
4760; CHECK-P10-NEXT:    pli r4, 244140625
4761; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4762; CHECK-P10-NEXT:    std r3, 0(r4)
4763; CHECK-P10-NEXT:    blr
4764;
4765; CHECK-PREP10-LABEL: st_cst_align64_int32_t_uint64_t:
4766; CHECK-PREP10:       # %bb.0: # %entry
4767; CHECK-PREP10-NEXT:    lis r4, 3725
4768; CHECK-PREP10-NEXT:    ori r4, r4, 19025
4769; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
4770; CHECK-PREP10-NEXT:    std r3, 0(r4)
4771; CHECK-PREP10-NEXT:    blr
4772entry:
4773  %conv = sext i32 %str to i64
4774  store atomic i64 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
4775  ret void
4776}
4777