xref: /llvm-project/llvm/test/CodeGen/PowerPC/atomics-i8-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 i8 @ld_0_int8_t_uint8_t(i64 %ptr) {
23; CHECK-LABEL: ld_0_int8_t_uint8_t:
24; CHECK:       # %bb.0: # %entry
25; CHECK-NEXT:    lbz r3, 0(r3)
26; CHECK-NEXT:    extsb r3, r3
27; CHECK-NEXT:    blr
28entry:
29  %0 = inttoptr i64 %ptr to ptr
30  %1 = load atomic i8, ptr %0 monotonic, align 1
31  ret i8 %1
32}
33
34; Function Attrs: nofree norecurse nounwind uwtable willreturn
35define dso_local signext i8 @ld_align16_int8_t_uint8_t(ptr nocapture readonly %ptr) {
36; CHECK-LABEL: ld_align16_int8_t_uint8_t:
37; CHECK:       # %bb.0: # %entry
38; CHECK-NEXT:    lbz r3, 8(r3)
39; CHECK-NEXT:    extsb r3, r3
40; CHECK-NEXT:    blr
41entry:
42  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
43  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
44  ret i8 %0
45}
46
47; Function Attrs: nofree norecurse nounwind uwtable willreturn
48define dso_local signext i8 @ld_align32_int8_t_uint8_t(ptr nocapture readonly %ptr) {
49; CHECK-P10-LABEL: ld_align32_int8_t_uint8_t:
50; CHECK-P10:       # %bb.0: # %entry
51; CHECK-P10-NEXT:    plbz r3, 99999000(r3), 0
52; CHECK-P10-NEXT:    extsb r3, r3
53; CHECK-P10-NEXT:    blr
54;
55; CHECK-PREP10-LABEL: ld_align32_int8_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:    extsb r3, r3
61; CHECK-PREP10-NEXT:    blr
62entry:
63  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
64  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
65  ret i8 %0
66}
67
68; Function Attrs: nofree norecurse nounwind uwtable willreturn
69define dso_local signext i8 @ld_align64_int8_t_uint8_t(ptr nocapture readonly %ptr) {
70; CHECK-P10-LABEL: ld_align64_int8_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:    extsb r3, r3
76; CHECK-P10-NEXT:    blr
77;
78; CHECK-PREP10-LABEL: ld_align64_int8_t_uint8_t:
79; CHECK-PREP10:       # %bb.0: # %entry
80; CHECK-PREP10-NEXT:    lis r4, 3725
81; CHECK-PREP10-NEXT:    ori r4, r4, 19025
82; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
83; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
84; CHECK-PREP10-NEXT:    extsb r3, r3
85; CHECK-PREP10-NEXT:    blr
86entry:
87  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
88  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
89  ret i8 %0
90}
91
92; Function Attrs: nofree norecurse nounwind uwtable willreturn
93define dso_local signext i8 @ld_reg_int8_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) {
94; CHECK-LABEL: ld_reg_int8_t_uint8_t:
95; CHECK:       # %bb.0: # %entry
96; CHECK-NEXT:    lbzx r3, r3, r4
97; CHECK-NEXT:    extsb r3, r3
98; CHECK-NEXT:    blr
99entry:
100  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
101  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
102  ret i8 %0
103}
104
105; Function Attrs: nofree norecurse nounwind uwtable willreturn
106define dso_local signext i8 @ld_or_int8_t_uint8_t(i64 %ptr, i8 zeroext %off) {
107; CHECK-LABEL: ld_or_int8_t_uint8_t:
108; CHECK:       # %bb.0: # %entry
109; CHECK-NEXT:    or r3, r4, r3
110; CHECK-NEXT:    lbz r3, 0(r3)
111; CHECK-NEXT:    extsb r3, r3
112; CHECK-NEXT:    blr
113entry:
114  %conv = zext i8 %off to i64
115  %or = or i64 %conv, %ptr
116  %0 = inttoptr i64 %or to ptr
117  %1 = load atomic i8, ptr %0 monotonic, align 1
118  ret i8 %1
119}
120
121; Function Attrs: nofree norecurse nounwind uwtable willreturn
122define dso_local signext i8 @ld_not_disjoint16_int8_t_uint8_t(i64 %ptr) {
123; CHECK-LABEL: ld_not_disjoint16_int8_t_uint8_t:
124; CHECK:       # %bb.0: # %entry
125; CHECK-NEXT:    ori r3, r3, 6
126; CHECK-NEXT:    lbz r3, 0(r3)
127; CHECK-NEXT:    extsb r3, r3
128; CHECK-NEXT:    blr
129entry:
130  %or = or i64 %ptr, 6
131  %0 = inttoptr i64 %or to ptr
132  %1 = load atomic i8, ptr %0 monotonic, align 1
133  ret i8 %1
134}
135
136; Function Attrs: nofree norecurse nounwind uwtable willreturn
137define dso_local signext i8 @ld_disjoint_align16_int8_t_uint8_t(i64 %ptr) {
138; CHECK-LABEL: ld_disjoint_align16_int8_t_uint8_t:
139; CHECK:       # %bb.0: # %entry
140; CHECK-NEXT:    rldicr r3, r3, 0, 51
141; CHECK-NEXT:    lbz r3, 24(r3)
142; CHECK-NEXT:    extsb r3, r3
143; CHECK-NEXT:    blr
144entry:
145  %and = and i64 %ptr, -4096
146  %or = or i64 %and, 24
147  %0 = inttoptr i64 %or to ptr
148  %1 = load atomic i8, ptr %0 monotonic, align 8
149  ret i8 %1
150}
151
152; Function Attrs: nofree norecurse nounwind uwtable willreturn
153define dso_local signext i8 @ld_not_disjoint32_int8_t_uint8_t(i64 %ptr) {
154; CHECK-LABEL: ld_not_disjoint32_int8_t_uint8_t:
155; CHECK:       # %bb.0: # %entry
156; CHECK-NEXT:    ori r3, r3, 34463
157; CHECK-NEXT:    oris r3, r3, 1
158; CHECK-NEXT:    lbz r3, 0(r3)
159; CHECK-NEXT:    extsb r3, r3
160; CHECK-NEXT:    blr
161entry:
162  %or = or i64 %ptr, 99999
163  %0 = inttoptr i64 %or to ptr
164  %1 = load atomic i8, ptr %0 monotonic, align 1
165  ret i8 %1
166}
167
168; Function Attrs: nofree norecurse nounwind uwtable willreturn
169define dso_local signext i8 @ld_disjoint_align32_int8_t_uint8_t(i64 %ptr) {
170; CHECK-P10-LABEL: ld_disjoint_align32_int8_t_uint8_t:
171; CHECK-P10:       # %bb.0: # %entry
172; CHECK-P10-NEXT:    lis r4, -15264
173; CHECK-P10-NEXT:    and r3, r3, r4
174; CHECK-P10-NEXT:    plbz r3, 999990000(r3), 0
175; CHECK-P10-NEXT:    extsb r3, r3
176; CHECK-P10-NEXT:    blr
177;
178; CHECK-PREP10-LABEL: ld_disjoint_align32_int8_t_uint8_t:
179; CHECK-PREP10:       # %bb.0: # %entry
180; CHECK-PREP10-NEXT:    lis r4, -15264
181; CHECK-PREP10-NEXT:    and r3, r3, r4
182; CHECK-PREP10-NEXT:    lis r4, 15258
183; CHECK-PREP10-NEXT:    ori r4, r4, 41712
184; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
185; CHECK-PREP10-NEXT:    extsb r3, r3
186; CHECK-PREP10-NEXT:    blr
187entry:
188  %and = and i64 %ptr, -1000341504
189  %or = or i64 %and, 999990000
190  %0 = inttoptr i64 %or to ptr
191  %1 = load atomic i8, ptr %0 monotonic, align 16
192  ret i8 %1
193}
194
195; Function Attrs: nofree norecurse nounwind uwtable willreturn
196define dso_local signext i8 @ld_not_disjoint64_int8_t_uint8_t(i64 %ptr) {
197; CHECK-P10-LABEL: ld_not_disjoint64_int8_t_uint8_t:
198; CHECK-P10:       # %bb.0: # %entry
199; CHECK-P10-NEXT:    pli r4, 232
200; CHECK-P10-NEXT:    pli r5, 3567587329
201; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
202; CHECK-P10-NEXT:    or r3, r3, r5
203; CHECK-P10-NEXT:    lbz r3, 0(r3)
204; CHECK-P10-NEXT:    extsb r3, r3
205; CHECK-P10-NEXT:    blr
206;
207; CHECK-PREP10-LABEL: ld_not_disjoint64_int8_t_uint8_t:
208; CHECK-PREP10:       # %bb.0: # %entry
209; CHECK-PREP10-NEXT:    li r4, 29
210; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
211; CHECK-PREP10-NEXT:    oris r4, r4, 54437
212; CHECK-PREP10-NEXT:    ori r4, r4, 4097
213; CHECK-PREP10-NEXT:    or r3, r3, r4
214; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
215; CHECK-PREP10-NEXT:    extsb r3, r3
216; CHECK-PREP10-NEXT:    blr
217entry:
218  %or = or i64 %ptr, 1000000000001
219  %0 = inttoptr i64 %or to ptr
220  %1 = load atomic i8, ptr %0 monotonic, align 1
221  ret i8 %1
222}
223
224; Function Attrs: nofree norecurse nounwind uwtable willreturn
225define dso_local signext i8 @ld_disjoint_align64_int8_t_uint8_t(i64 %ptr) {
226; CHECK-P10-LABEL: ld_disjoint_align64_int8_t_uint8_t:
227; CHECK-P10:       # %bb.0: # %entry
228; CHECK-P10-NEXT:    pli r4, 244140625
229; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
230; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
231; CHECK-P10-NEXT:    lbzx r3, r3, r4
232; CHECK-P10-NEXT:    extsb r3, r3
233; CHECK-P10-NEXT:    blr
234;
235; CHECK-PREP10-LABEL: ld_disjoint_align64_int8_t_uint8_t:
236; CHECK-PREP10:       # %bb.0: # %entry
237; CHECK-PREP10-NEXT:    lis r4, 3725
238; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
239; CHECK-PREP10-NEXT:    ori r4, r4, 19025
240; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
241; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
242; CHECK-PREP10-NEXT:    extsb r3, r3
243; CHECK-PREP10-NEXT:    blr
244entry:
245  %and = and i64 %ptr, -1099511627776
246  %or = or i64 %and, 1000000000000
247  %0 = inttoptr i64 %or to ptr
248  %1 = load atomic i8, ptr %0 monotonic, align 4096
249  ret i8 %1
250}
251
252; Function Attrs: nofree norecurse nounwind uwtable willreturn
253define dso_local signext i8 @ld_cst_align16_int8_t_uint8_t() {
254; CHECK-LABEL: ld_cst_align16_int8_t_uint8_t:
255; CHECK:       # %bb.0: # %entry
256; CHECK-NEXT:    lbz r3, 4080(0)
257; CHECK-NEXT:    extsb r3, r3
258; CHECK-NEXT:    blr
259entry:
260  %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
261  ret i8 %0
262}
263
264; Function Attrs: nofree norecurse nounwind uwtable willreturn
265define dso_local signext i8 @ld_cst_align32_int8_t_uint8_t() {
266; CHECK-LABEL: ld_cst_align32_int8_t_uint8_t:
267; CHECK:       # %bb.0: # %entry
268; CHECK-NEXT:    lis r3, 153
269; CHECK-NEXT:    lbz r3, -27108(r3)
270; CHECK-NEXT:    extsb r3, r3
271; CHECK-NEXT:    blr
272entry:
273  %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
274  ret i8 %0
275}
276
277; Function Attrs: nofree norecurse nounwind uwtable willreturn
278define dso_local signext i8 @ld_cst_align64_int8_t_uint8_t() {
279; CHECK-P10-LABEL: ld_cst_align64_int8_t_uint8_t:
280; CHECK-P10:       # %bb.0: # %entry
281; CHECK-P10-NEXT:    pli r3, 244140625
282; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
283; CHECK-P10-NEXT:    lbz r3, 0(r3)
284; CHECK-P10-NEXT:    extsb r3, r3
285; CHECK-P10-NEXT:    blr
286;
287; CHECK-PREP10-LABEL: ld_cst_align64_int8_t_uint8_t:
288; CHECK-PREP10:       # %bb.0: # %entry
289; CHECK-PREP10-NEXT:    lis r3, 3725
290; CHECK-PREP10-NEXT:    ori r3, r3, 19025
291; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
292; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
293; CHECK-PREP10-NEXT:    extsb r3, r3
294; CHECK-PREP10-NEXT:    blr
295entry:
296  %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
297  ret i8 %0
298}
299
300; Function Attrs: nofree norecurse nounwind uwtable willreturn
301define dso_local signext i8 @ld_0_int8_t_uint16_t(i64 %ptr) {
302; CHECK-LABEL: ld_0_int8_t_uint16_t:
303; CHECK:       # %bb.0: # %entry
304; CHECK-NEXT:    lhz r3, 0(r3)
305; CHECK-NEXT:    extsb r3, r3
306; CHECK-NEXT:    blr
307entry:
308  %0 = inttoptr i64 %ptr to ptr
309  %1 = load atomic i16, ptr %0 monotonic, align 2
310  %conv = trunc i16 %1 to i8
311  ret i8 %conv
312}
313
314; Function Attrs: nofree norecurse nounwind uwtable willreturn
315define dso_local signext i8 @ld_align16_int8_t_uint16_t(ptr nocapture readonly %ptr) {
316; CHECK-LABEL: ld_align16_int8_t_uint16_t:
317; CHECK:       # %bb.0: # %entry
318; CHECK-NEXT:    lhz r3, 8(r3)
319; CHECK-NEXT:    extsb r3, r3
320; CHECK-NEXT:    blr
321entry:
322  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
323  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
324  %conv = trunc i16 %0 to i8
325  ret i8 %conv
326}
327
328; Function Attrs: nofree norecurse nounwind uwtable willreturn
329define dso_local signext i8 @ld_align32_int8_t_uint16_t(ptr nocapture readonly %ptr) {
330; CHECK-P10-LABEL: ld_align32_int8_t_uint16_t:
331; CHECK-P10:       # %bb.0: # %entry
332; CHECK-P10-NEXT:    plhz r3, 99999000(r3), 0
333; CHECK-P10-NEXT:    extsb r3, r3
334; CHECK-P10-NEXT:    blr
335;
336; CHECK-PREP10-LABEL: ld_align32_int8_t_uint16_t:
337; CHECK-PREP10:       # %bb.0: # %entry
338; CHECK-PREP10-NEXT:    lis r4, 1525
339; CHECK-PREP10-NEXT:    ori r4, r4, 56600
340; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
341; CHECK-PREP10-NEXT:    extsb r3, r3
342; CHECK-PREP10-NEXT:    blr
343entry:
344  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
345  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
346  %conv = trunc i16 %0 to i8
347  ret i8 %conv
348}
349
350; Function Attrs: nofree norecurse nounwind uwtable willreturn
351define dso_local signext i8 @ld_align64_int8_t_uint16_t(ptr nocapture readonly %ptr) {
352; CHECK-P10-LABEL: ld_align64_int8_t_uint16_t:
353; CHECK-P10:       # %bb.0: # %entry
354; CHECK-P10-NEXT:    pli r4, 244140625
355; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
356; CHECK-P10-NEXT:    lhzx r3, r3, r4
357; CHECK-P10-NEXT:    extsb r3, r3
358; CHECK-P10-NEXT:    blr
359;
360; CHECK-PREP10-LABEL: ld_align64_int8_t_uint16_t:
361; CHECK-PREP10:       # %bb.0: # %entry
362; CHECK-PREP10-NEXT:    lis r4, 3725
363; CHECK-PREP10-NEXT:    ori r4, r4, 19025
364; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
365; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
366; CHECK-PREP10-NEXT:    extsb r3, r3
367; CHECK-PREP10-NEXT:    blr
368entry:
369  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
370  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
371  %conv = trunc i16 %0 to i8
372  ret i8 %conv
373}
374
375; Function Attrs: nofree norecurse nounwind uwtable willreturn
376define dso_local signext i8 @ld_reg_int8_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) {
377; CHECK-LABEL: ld_reg_int8_t_uint16_t:
378; CHECK:       # %bb.0: # %entry
379; CHECK-NEXT:    lhzx r3, r3, r4
380; CHECK-NEXT:    extsb r3, r3
381; CHECK-NEXT:    blr
382entry:
383  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
384  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
385  %conv = trunc i16 %0 to i8
386  ret i8 %conv
387}
388
389; Function Attrs: nofree norecurse nounwind uwtable willreturn
390define dso_local signext i8 @ld_or_int8_t_uint16_t(i64 %ptr, i8 zeroext %off) {
391; CHECK-LABEL: ld_or_int8_t_uint16_t:
392; CHECK:       # %bb.0: # %entry
393; CHECK-NEXT:    or r3, r4, r3
394; CHECK-NEXT:    lhz r3, 0(r3)
395; CHECK-NEXT:    extsb r3, r3
396; CHECK-NEXT:    blr
397entry:
398  %conv = zext i8 %off to i64
399  %or = or i64 %conv, %ptr
400  %0 = inttoptr i64 %or to ptr
401  %1 = load atomic i16, ptr %0 monotonic, align 2
402  %conv1 = trunc i16 %1 to i8
403  ret i8 %conv1
404}
405
406; Function Attrs: nofree norecurse nounwind uwtable willreturn
407define dso_local signext i8 @ld_not_disjoint16_int8_t_uint16_t(i64 %ptr) {
408; CHECK-LABEL: ld_not_disjoint16_int8_t_uint16_t:
409; CHECK:       # %bb.0: # %entry
410; CHECK-NEXT:    ori r3, r3, 6
411; CHECK-NEXT:    lhz r3, 0(r3)
412; CHECK-NEXT:    extsb r3, r3
413; CHECK-NEXT:    blr
414entry:
415  %or = or i64 %ptr, 6
416  %0 = inttoptr i64 %or to ptr
417  %1 = load atomic i16, ptr %0 monotonic, align 2
418  %conv = trunc i16 %1 to i8
419  ret i8 %conv
420}
421
422; Function Attrs: nofree norecurse nounwind uwtable willreturn
423define dso_local signext i8 @ld_disjoint_align16_int8_t_uint16_t(i64 %ptr) {
424; CHECK-LABEL: ld_disjoint_align16_int8_t_uint16_t:
425; CHECK:       # %bb.0: # %entry
426; CHECK-NEXT:    rldicr r3, r3, 0, 51
427; CHECK-NEXT:    lhz r3, 24(r3)
428; CHECK-NEXT:    extsb r3, r3
429; CHECK-NEXT:    blr
430entry:
431  %and = and i64 %ptr, -4096
432  %or = or i64 %and, 24
433  %0 = inttoptr i64 %or to ptr
434  %1 = load atomic i16, ptr %0 monotonic, align 8
435  %conv = trunc i16 %1 to i8
436  ret i8 %conv
437}
438
439; Function Attrs: nofree norecurse nounwind uwtable willreturn
440define dso_local signext i8 @ld_not_disjoint32_int8_t_uint16_t(i64 %ptr) {
441; CHECK-LABEL: ld_not_disjoint32_int8_t_uint16_t:
442; CHECK:       # %bb.0: # %entry
443; CHECK-NEXT:    ori r3, r3, 34463
444; CHECK-NEXT:    oris r3, r3, 1
445; CHECK-NEXT:    lhz r3, 0(r3)
446; CHECK-NEXT:    extsb r3, r3
447; CHECK-NEXT:    blr
448entry:
449  %or = or i64 %ptr, 99999
450  %0 = inttoptr i64 %or to ptr
451  %1 = load atomic i16, ptr %0 monotonic, align 2
452  %conv = trunc i16 %1 to i8
453  ret i8 %conv
454}
455
456; Function Attrs: nofree norecurse nounwind uwtable willreturn
457define dso_local signext i8 @ld_disjoint_align32_int8_t_uint16_t(i64 %ptr) {
458; CHECK-P10-LABEL: ld_disjoint_align32_int8_t_uint16_t:
459; CHECK-P10:       # %bb.0: # %entry
460; CHECK-P10-NEXT:    lis r4, -15264
461; CHECK-P10-NEXT:    and r3, r3, r4
462; CHECK-P10-NEXT:    plhz r3, 999990000(r3), 0
463; CHECK-P10-NEXT:    extsb r3, r3
464; CHECK-P10-NEXT:    blr
465;
466; CHECK-PREP10-LABEL: ld_disjoint_align32_int8_t_uint16_t:
467; CHECK-PREP10:       # %bb.0: # %entry
468; CHECK-PREP10-NEXT:    lis r4, -15264
469; CHECK-PREP10-NEXT:    and r3, r3, r4
470; CHECK-PREP10-NEXT:    lis r4, 15258
471; CHECK-PREP10-NEXT:    ori r4, r4, 41712
472; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
473; CHECK-PREP10-NEXT:    extsb r3, r3
474; CHECK-PREP10-NEXT:    blr
475entry:
476  %and = and i64 %ptr, -1000341504
477  %or = or i64 %and, 999990000
478  %0 = inttoptr i64 %or to ptr
479  %1 = load atomic i16, ptr %0 monotonic, align 16
480  %conv = trunc i16 %1 to i8
481  ret i8 %conv
482}
483
484; Function Attrs: nofree norecurse nounwind uwtable willreturn
485define dso_local signext i8 @ld_not_disjoint64_int8_t_uint16_t(i64 %ptr) {
486; CHECK-P10-LABEL: ld_not_disjoint64_int8_t_uint16_t:
487; CHECK-P10:       # %bb.0: # %entry
488; CHECK-P10-NEXT:    pli r4, 232
489; CHECK-P10-NEXT:    pli r5, 3567587329
490; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
491; CHECK-P10-NEXT:    or r3, r3, r5
492; CHECK-P10-NEXT:    lhz r3, 0(r3)
493; CHECK-P10-NEXT:    extsb r3, r3
494; CHECK-P10-NEXT:    blr
495;
496; CHECK-PREP10-LABEL: ld_not_disjoint64_int8_t_uint16_t:
497; CHECK-PREP10:       # %bb.0: # %entry
498; CHECK-PREP10-NEXT:    li r4, 29
499; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
500; CHECK-PREP10-NEXT:    oris r4, r4, 54437
501; CHECK-PREP10-NEXT:    ori r4, r4, 4097
502; CHECK-PREP10-NEXT:    or r3, r3, r4
503; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
504; CHECK-PREP10-NEXT:    extsb r3, r3
505; CHECK-PREP10-NEXT:    blr
506entry:
507  %or = or i64 %ptr, 1000000000001
508  %0 = inttoptr i64 %or to ptr
509  %1 = load atomic i16, ptr %0 monotonic, align 2
510  %conv = trunc i16 %1 to i8
511  ret i8 %conv
512}
513
514; Function Attrs: nofree norecurse nounwind uwtable willreturn
515define dso_local signext i8 @ld_disjoint_align64_int8_t_uint16_t(i64 %ptr) {
516; CHECK-P10-LABEL: ld_disjoint_align64_int8_t_uint16_t:
517; CHECK-P10:       # %bb.0: # %entry
518; CHECK-P10-NEXT:    pli r4, 244140625
519; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
520; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
521; CHECK-P10-NEXT:    lhzx r3, r3, r4
522; CHECK-P10-NEXT:    extsb r3, r3
523; CHECK-P10-NEXT:    blr
524;
525; CHECK-PREP10-LABEL: ld_disjoint_align64_int8_t_uint16_t:
526; CHECK-PREP10:       # %bb.0: # %entry
527; CHECK-PREP10-NEXT:    lis r4, 3725
528; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
529; CHECK-PREP10-NEXT:    ori r4, r4, 19025
530; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
531; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
532; CHECK-PREP10-NEXT:    extsb r3, r3
533; CHECK-PREP10-NEXT:    blr
534entry:
535  %and = and i64 %ptr, -1099511627776
536  %or = or i64 %and, 1000000000000
537  %0 = inttoptr i64 %or to ptr
538  %1 = load atomic i16, ptr %0 monotonic, align 4096
539  %conv = trunc i16 %1 to i8
540  ret i8 %conv
541}
542
543; Function Attrs: nofree norecurse nounwind uwtable willreturn
544define dso_local signext i8 @ld_cst_align16_int8_t_uint16_t() {
545; CHECK-LABEL: ld_cst_align16_int8_t_uint16_t:
546; CHECK:       # %bb.0: # %entry
547; CHECK-NEXT:    lhz r3, 4080(0)
548; CHECK-NEXT:    extsb r3, r3
549; CHECK-NEXT:    blr
550entry:
551  %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
552  %conv = trunc i16 %0 to i8
553  ret i8 %conv
554}
555
556; Function Attrs: nofree norecurse nounwind uwtable willreturn
557define dso_local signext i8 @ld_cst_align32_int8_t_uint16_t() {
558; CHECK-LABEL: ld_cst_align32_int8_t_uint16_t:
559; CHECK:       # %bb.0: # %entry
560; CHECK-NEXT:    lis r3, 153
561; CHECK-NEXT:    lhz r3, -27108(r3)
562; CHECK-NEXT:    extsb r3, r3
563; CHECK-NEXT:    blr
564entry:
565  %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
566  %conv = trunc i16 %0 to i8
567  ret i8 %conv
568}
569
570; Function Attrs: nofree norecurse nounwind uwtable willreturn
571define dso_local signext i8 @ld_cst_align64_int8_t_uint16_t() {
572; CHECK-P10-LABEL: ld_cst_align64_int8_t_uint16_t:
573; CHECK-P10:       # %bb.0: # %entry
574; CHECK-P10-NEXT:    pli r3, 244140625
575; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
576; CHECK-P10-NEXT:    lhz r3, 0(r3)
577; CHECK-P10-NEXT:    extsb r3, r3
578; CHECK-P10-NEXT:    blr
579;
580; CHECK-PREP10-LABEL: ld_cst_align64_int8_t_uint16_t:
581; CHECK-PREP10:       # %bb.0: # %entry
582; CHECK-PREP10-NEXT:    lis r3, 3725
583; CHECK-PREP10-NEXT:    ori r3, r3, 19025
584; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
585; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
586; CHECK-PREP10-NEXT:    extsb r3, r3
587; CHECK-PREP10-NEXT:    blr
588entry:
589  %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
590  %conv = trunc i16 %0 to i8
591  ret i8 %conv
592}
593
594; Function Attrs: nofree norecurse nounwind uwtable willreturn
595define dso_local signext i8 @ld_0_int8_t_uint32_t(i64 %ptr) {
596; CHECK-LABEL: ld_0_int8_t_uint32_t:
597; CHECK:       # %bb.0: # %entry
598; CHECK-NEXT:    lwz r3, 0(r3)
599; CHECK-NEXT:    extsb r3, r3
600; CHECK-NEXT:    blr
601entry:
602  %0 = inttoptr i64 %ptr to ptr
603  %1 = load atomic i32, ptr %0 monotonic, align 4
604  %conv = trunc i32 %1 to i8
605  ret i8 %conv
606}
607
608; Function Attrs: nofree norecurse nounwind uwtable willreturn
609define dso_local signext i8 @ld_align16_int8_t_uint32_t(ptr nocapture readonly %ptr) {
610; CHECK-LABEL: ld_align16_int8_t_uint32_t:
611; CHECK:       # %bb.0: # %entry
612; CHECK-NEXT:    lwz r3, 8(r3)
613; CHECK-NEXT:    extsb r3, r3
614; CHECK-NEXT:    blr
615entry:
616  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
617  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
618  %conv = trunc i32 %0 to i8
619  ret i8 %conv
620}
621
622; Function Attrs: nofree norecurse nounwind uwtable willreturn
623define dso_local signext i8 @ld_align32_int8_t_uint32_t(ptr nocapture readonly %ptr) {
624; CHECK-P10-LABEL: ld_align32_int8_t_uint32_t:
625; CHECK-P10:       # %bb.0: # %entry
626; CHECK-P10-NEXT:    plwz r3, 99999000(r3), 0
627; CHECK-P10-NEXT:    extsb r3, r3
628; CHECK-P10-NEXT:    blr
629;
630; CHECK-PREP10-LABEL: ld_align32_int8_t_uint32_t:
631; CHECK-PREP10:       # %bb.0: # %entry
632; CHECK-PREP10-NEXT:    lis r4, 1525
633; CHECK-PREP10-NEXT:    ori r4, r4, 56600
634; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
635; CHECK-PREP10-NEXT:    extsb r3, r3
636; CHECK-PREP10-NEXT:    blr
637entry:
638  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
639  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
640  %conv = trunc i32 %0 to i8
641  ret i8 %conv
642}
643
644; Function Attrs: nofree norecurse nounwind uwtable willreturn
645define dso_local signext i8 @ld_align64_int8_t_uint32_t(ptr nocapture readonly %ptr) {
646; CHECK-P10-LABEL: ld_align64_int8_t_uint32_t:
647; CHECK-P10:       # %bb.0: # %entry
648; CHECK-P10-NEXT:    pli r4, 244140625
649; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
650; CHECK-P10-NEXT:    lwzx r3, r3, r4
651; CHECK-P10-NEXT:    extsb r3, r3
652; CHECK-P10-NEXT:    blr
653;
654; CHECK-PREP10-LABEL: ld_align64_int8_t_uint32_t:
655; CHECK-PREP10:       # %bb.0: # %entry
656; CHECK-PREP10-NEXT:    lis r4, 3725
657; CHECK-PREP10-NEXT:    ori r4, r4, 19025
658; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
659; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
660; CHECK-PREP10-NEXT:    extsb r3, r3
661; CHECK-PREP10-NEXT:    blr
662entry:
663  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
664  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
665  %conv = trunc i32 %0 to i8
666  ret i8 %conv
667}
668
669; Function Attrs: nofree norecurse nounwind uwtable willreturn
670define dso_local signext i8 @ld_reg_int8_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) {
671; CHECK-LABEL: ld_reg_int8_t_uint32_t:
672; CHECK:       # %bb.0: # %entry
673; CHECK-NEXT:    lwzx r3, r3, r4
674; CHECK-NEXT:    extsb r3, r3
675; CHECK-NEXT:    blr
676entry:
677  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
678  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
679  %conv = trunc i32 %0 to i8
680  ret i8 %conv
681}
682
683; Function Attrs: nofree norecurse nounwind uwtable willreturn
684define dso_local signext i8 @ld_or_int8_t_uint32_t(i64 %ptr, i8 zeroext %off) {
685; CHECK-LABEL: ld_or_int8_t_uint32_t:
686; CHECK:       # %bb.0: # %entry
687; CHECK-NEXT:    or r3, r4, r3
688; CHECK-NEXT:    lwz r3, 0(r3)
689; CHECK-NEXT:    extsb r3, r3
690; CHECK-NEXT:    blr
691entry:
692  %conv = zext i8 %off to i64
693  %or = or i64 %conv, %ptr
694  %0 = inttoptr i64 %or to ptr
695  %1 = load atomic i32, ptr %0 monotonic, align 4
696  %conv1 = trunc i32 %1 to i8
697  ret i8 %conv1
698}
699
700; Function Attrs: nofree norecurse nounwind uwtable willreturn
701define dso_local signext i8 @ld_not_disjoint16_int8_t_uint32_t(i64 %ptr) {
702; CHECK-LABEL: ld_not_disjoint16_int8_t_uint32_t:
703; CHECK:       # %bb.0: # %entry
704; CHECK-NEXT:    ori r3, r3, 6
705; CHECK-NEXT:    lwz r3, 0(r3)
706; CHECK-NEXT:    extsb r3, r3
707; CHECK-NEXT:    blr
708entry:
709  %or = or i64 %ptr, 6
710  %0 = inttoptr i64 %or to ptr
711  %1 = load atomic i32, ptr %0 monotonic, align 4
712  %conv = trunc i32 %1 to i8
713  ret i8 %conv
714}
715
716; Function Attrs: nofree norecurse nounwind uwtable willreturn
717define dso_local signext i8 @ld_disjoint_align16_int8_t_uint32_t(i64 %ptr) {
718; CHECK-LABEL: ld_disjoint_align16_int8_t_uint32_t:
719; CHECK:       # %bb.0: # %entry
720; CHECK-NEXT:    rldicr r3, r3, 0, 51
721; CHECK-NEXT:    lwz r3, 24(r3)
722; CHECK-NEXT:    extsb r3, r3
723; CHECK-NEXT:    blr
724entry:
725  %and = and i64 %ptr, -4096
726  %or = or i64 %and, 24
727  %0 = inttoptr i64 %or to ptr
728  %1 = load atomic i32, ptr %0 monotonic, align 8
729  %conv = trunc i32 %1 to i8
730  ret i8 %conv
731}
732
733; Function Attrs: nofree norecurse nounwind uwtable willreturn
734define dso_local signext i8 @ld_not_disjoint32_int8_t_uint32_t(i64 %ptr) {
735; CHECK-LABEL: ld_not_disjoint32_int8_t_uint32_t:
736; CHECK:       # %bb.0: # %entry
737; CHECK-NEXT:    ori r3, r3, 34463
738; CHECK-NEXT:    oris r3, r3, 1
739; CHECK-NEXT:    lwz r3, 0(r3)
740; CHECK-NEXT:    extsb r3, r3
741; CHECK-NEXT:    blr
742entry:
743  %or = or i64 %ptr, 99999
744  %0 = inttoptr i64 %or to ptr
745  %1 = load atomic i32, ptr %0 monotonic, align 4
746  %conv = trunc i32 %1 to i8
747  ret i8 %conv
748}
749
750; Function Attrs: nofree norecurse nounwind uwtable willreturn
751define dso_local signext i8 @ld_disjoint_align32_int8_t_uint32_t(i64 %ptr) {
752; CHECK-P10-LABEL: ld_disjoint_align32_int8_t_uint32_t:
753; CHECK-P10:       # %bb.0: # %entry
754; CHECK-P10-NEXT:    lis r4, -15264
755; CHECK-P10-NEXT:    and r3, r3, r4
756; CHECK-P10-NEXT:    plwz r3, 999990000(r3), 0
757; CHECK-P10-NEXT:    extsb r3, r3
758; CHECK-P10-NEXT:    blr
759;
760; CHECK-PREP10-LABEL: ld_disjoint_align32_int8_t_uint32_t:
761; CHECK-PREP10:       # %bb.0: # %entry
762; CHECK-PREP10-NEXT:    lis r4, -15264
763; CHECK-PREP10-NEXT:    and r3, r3, r4
764; CHECK-PREP10-NEXT:    lis r4, 15258
765; CHECK-PREP10-NEXT:    ori r4, r4, 41712
766; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
767; CHECK-PREP10-NEXT:    extsb r3, r3
768; CHECK-PREP10-NEXT:    blr
769entry:
770  %and = and i64 %ptr, -1000341504
771  %or = or i64 %and, 999990000
772  %0 = inttoptr i64 %or to ptr
773  %1 = load atomic i32, ptr %0 monotonic, align 16
774  %conv = trunc i32 %1 to i8
775  ret i8 %conv
776}
777
778; Function Attrs: nofree norecurse nounwind uwtable willreturn
779define dso_local signext i8 @ld_not_disjoint64_int8_t_uint32_t(i64 %ptr) {
780; CHECK-P10-LABEL: ld_not_disjoint64_int8_t_uint32_t:
781; CHECK-P10:       # %bb.0: # %entry
782; CHECK-P10-NEXT:    pli r4, 232
783; CHECK-P10-NEXT:    pli r5, 3567587329
784; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
785; CHECK-P10-NEXT:    or r3, r3, r5
786; CHECK-P10-NEXT:    lwz r3, 0(r3)
787; CHECK-P10-NEXT:    extsb r3, r3
788; CHECK-P10-NEXT:    blr
789;
790; CHECK-PREP10-LABEL: ld_not_disjoint64_int8_t_uint32_t:
791; CHECK-PREP10:       # %bb.0: # %entry
792; CHECK-PREP10-NEXT:    li r4, 29
793; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
794; CHECK-PREP10-NEXT:    oris r4, r4, 54437
795; CHECK-PREP10-NEXT:    ori r4, r4, 4097
796; CHECK-PREP10-NEXT:    or r3, r3, r4
797; CHECK-PREP10-NEXT:    lwz r3, 0(r3)
798; CHECK-PREP10-NEXT:    extsb r3, r3
799; CHECK-PREP10-NEXT:    blr
800entry:
801  %or = or i64 %ptr, 1000000000001
802  %0 = inttoptr i64 %or to ptr
803  %1 = load atomic i32, ptr %0 monotonic, align 4
804  %conv = trunc i32 %1 to i8
805  ret i8 %conv
806}
807
808; Function Attrs: nofree norecurse nounwind uwtable willreturn
809define dso_local signext i8 @ld_disjoint_align64_int8_t_uint32_t(i64 %ptr) {
810; CHECK-P10-LABEL: ld_disjoint_align64_int8_t_uint32_t:
811; CHECK-P10:       # %bb.0: # %entry
812; CHECK-P10-NEXT:    pli r4, 244140625
813; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
814; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
815; CHECK-P10-NEXT:    lwzx r3, r3, r4
816; CHECK-P10-NEXT:    extsb r3, r3
817; CHECK-P10-NEXT:    blr
818;
819; CHECK-PREP10-LABEL: ld_disjoint_align64_int8_t_uint32_t:
820; CHECK-PREP10:       # %bb.0: # %entry
821; CHECK-PREP10-NEXT:    lis r4, 3725
822; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
823; CHECK-PREP10-NEXT:    ori r4, r4, 19025
824; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
825; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
826; CHECK-PREP10-NEXT:    extsb r3, r3
827; CHECK-PREP10-NEXT:    blr
828entry:
829  %and = and i64 %ptr, -1099511627776
830  %or = or i64 %and, 1000000000000
831  %0 = inttoptr i64 %or to ptr
832  %1 = load atomic i32, ptr %0 monotonic, align 4096
833  %conv = trunc i32 %1 to i8
834  ret i8 %conv
835}
836
837; Function Attrs: nofree norecurse nounwind uwtable willreturn
838define dso_local signext i8 @ld_cst_align16_int8_t_uint32_t() {
839; CHECK-LABEL: ld_cst_align16_int8_t_uint32_t:
840; CHECK:       # %bb.0: # %entry
841; CHECK-NEXT:    lwz r3, 4080(0)
842; CHECK-NEXT:    extsb r3, r3
843; CHECK-NEXT:    blr
844entry:
845  %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
846  %conv = trunc i32 %0 to i8
847  ret i8 %conv
848}
849
850; Function Attrs: nofree norecurse nounwind uwtable willreturn
851define dso_local signext i8 @ld_cst_align32_int8_t_uint32_t() {
852; CHECK-LABEL: ld_cst_align32_int8_t_uint32_t:
853; CHECK:       # %bb.0: # %entry
854; CHECK-NEXT:    lis r3, 153
855; CHECK-NEXT:    lwz r3, -27108(r3)
856; CHECK-NEXT:    extsb r3, r3
857; CHECK-NEXT:    blr
858entry:
859  %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
860  %conv = trunc i32 %0 to i8
861  ret i8 %conv
862}
863
864; Function Attrs: nofree norecurse nounwind uwtable willreturn
865define dso_local signext i8 @ld_cst_align64_int8_t_uint32_t() {
866; CHECK-P10-LABEL: ld_cst_align64_int8_t_uint32_t:
867; CHECK-P10:       # %bb.0: # %entry
868; CHECK-P10-NEXT:    pli r3, 244140625
869; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
870; CHECK-P10-NEXT:    lwz r3, 0(r3)
871; CHECK-P10-NEXT:    extsb r3, r3
872; CHECK-P10-NEXT:    blr
873;
874; CHECK-PREP10-LABEL: ld_cst_align64_int8_t_uint32_t:
875; CHECK-PREP10:       # %bb.0: # %entry
876; CHECK-PREP10-NEXT:    lis r3, 3725
877; CHECK-PREP10-NEXT:    ori r3, r3, 19025
878; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
879; CHECK-PREP10-NEXT:    lwz r3, 0(r3)
880; CHECK-PREP10-NEXT:    extsb r3, r3
881; CHECK-PREP10-NEXT:    blr
882entry:
883  %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
884  %conv = trunc i32 %0 to i8
885  ret i8 %conv
886}
887
888; Function Attrs: nofree norecurse nounwind uwtable willreturn
889define dso_local signext i8 @ld_0_int8_t_uint64_t(i64 %ptr) {
890; CHECK-LABEL: ld_0_int8_t_uint64_t:
891; CHECK:       # %bb.0: # %entry
892; CHECK-NEXT:    ld r3, 0(r3)
893; CHECK-NEXT:    extsb r3, r3
894; CHECK-NEXT:    blr
895entry:
896  %0 = inttoptr i64 %ptr to ptr
897  %1 = load atomic i64, ptr %0 monotonic, align 8
898  %conv = trunc i64 %1 to i8
899  ret i8 %conv
900}
901
902; Function Attrs: nofree norecurse nounwind uwtable willreturn
903define dso_local signext i8 @ld_align16_int8_t_uint64_t(ptr nocapture readonly %ptr) {
904; CHECK-LABEL: ld_align16_int8_t_uint64_t:
905; CHECK:       # %bb.0: # %entry
906; CHECK-NEXT:    ld r3, 8(r3)
907; CHECK-NEXT:    extsb r3, r3
908; CHECK-NEXT:    blr
909entry:
910  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
911  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
912  %conv = trunc i64 %0 to i8
913  ret i8 %conv
914}
915
916; Function Attrs: nofree norecurse nounwind uwtable willreturn
917define dso_local signext i8 @ld_align32_int8_t_uint64_t(ptr nocapture readonly %ptr) {
918; CHECK-P10-LABEL: ld_align32_int8_t_uint64_t:
919; CHECK-P10:       # %bb.0: # %entry
920; CHECK-P10-NEXT:    pld r3, 99999000(r3), 0
921; CHECK-P10-NEXT:    extsb r3, r3
922; CHECK-P10-NEXT:    blr
923;
924; CHECK-PREP10-LABEL: ld_align32_int8_t_uint64_t:
925; CHECK-PREP10:       # %bb.0: # %entry
926; CHECK-PREP10-NEXT:    lis r4, 1525
927; CHECK-PREP10-NEXT:    ori r4, r4, 56600
928; CHECK-PREP10-NEXT:    ldx r3, r3, r4
929; CHECK-PREP10-NEXT:    extsb r3, r3
930; CHECK-PREP10-NEXT:    blr
931entry:
932  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
933  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
934  %conv = trunc i64 %0 to i8
935  ret i8 %conv
936}
937
938; Function Attrs: nofree norecurse nounwind uwtable willreturn
939define dso_local signext i8 @ld_align64_int8_t_uint64_t(ptr nocapture readonly %ptr) {
940; CHECK-P10-LABEL: ld_align64_int8_t_uint64_t:
941; CHECK-P10:       # %bb.0: # %entry
942; CHECK-P10-NEXT:    pli r4, 244140625
943; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
944; CHECK-P10-NEXT:    ldx r3, r3, r4
945; CHECK-P10-NEXT:    extsb r3, r3
946; CHECK-P10-NEXT:    blr
947;
948; CHECK-PREP10-LABEL: ld_align64_int8_t_uint64_t:
949; CHECK-PREP10:       # %bb.0: # %entry
950; CHECK-PREP10-NEXT:    lis r4, 3725
951; CHECK-PREP10-NEXT:    ori r4, r4, 19025
952; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
953; CHECK-PREP10-NEXT:    ldx r3, r3, r4
954; CHECK-PREP10-NEXT:    extsb r3, r3
955; CHECK-PREP10-NEXT:    blr
956entry:
957  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
958  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
959  %conv = trunc i64 %0 to i8
960  ret i8 %conv
961}
962
963; Function Attrs: nofree norecurse nounwind uwtable willreturn
964define dso_local signext i8 @ld_reg_int8_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) {
965; CHECK-LABEL: ld_reg_int8_t_uint64_t:
966; CHECK:       # %bb.0: # %entry
967; CHECK-NEXT:    ldx r3, r3, r4
968; CHECK-NEXT:    extsb r3, r3
969; CHECK-NEXT:    blr
970entry:
971  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
972  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
973  %conv = trunc i64 %0 to i8
974  ret i8 %conv
975}
976
977; Function Attrs: nofree norecurse nounwind uwtable willreturn
978define dso_local signext i8 @ld_or_int8_t_uint64_t(i64 %ptr, i8 zeroext %off) {
979; CHECK-LABEL: ld_or_int8_t_uint64_t:
980; CHECK:       # %bb.0: # %entry
981; CHECK-NEXT:    or r3, r4, r3
982; CHECK-NEXT:    ld r3, 0(r3)
983; CHECK-NEXT:    extsb r3, r3
984; CHECK-NEXT:    blr
985entry:
986  %conv = zext i8 %off to i64
987  %or = or i64 %conv, %ptr
988  %0 = inttoptr i64 %or to ptr
989  %1 = load atomic i64, ptr %0 monotonic, align 8
990  %conv1 = trunc i64 %1 to i8
991  ret i8 %conv1
992}
993
994; Function Attrs: nofree norecurse nounwind uwtable willreturn
995define dso_local signext i8 @ld_not_disjoint16_int8_t_uint64_t(i64 %ptr) {
996; CHECK-LABEL: ld_not_disjoint16_int8_t_uint64_t:
997; CHECK:       # %bb.0: # %entry
998; CHECK-NEXT:    ori r3, r3, 6
999; CHECK-NEXT:    ld r3, 0(r3)
1000; CHECK-NEXT:    extsb r3, r3
1001; CHECK-NEXT:    blr
1002entry:
1003  %or = or i64 %ptr, 6
1004  %0 = inttoptr i64 %or to ptr
1005  %1 = load atomic i64, ptr %0 monotonic, align 8
1006  %conv = trunc i64 %1 to i8
1007  ret i8 %conv
1008}
1009
1010; Function Attrs: nofree norecurse nounwind uwtable willreturn
1011define dso_local signext i8 @ld_disjoint_align16_int8_t_uint64_t(i64 %ptr) {
1012; CHECK-LABEL: ld_disjoint_align16_int8_t_uint64_t:
1013; CHECK:       # %bb.0: # %entry
1014; CHECK-NEXT:    rldicr r3, r3, 0, 51
1015; CHECK-NEXT:    ld r3, 24(r3)
1016; CHECK-NEXT:    extsb r3, r3
1017; CHECK-NEXT:    blr
1018entry:
1019  %and = and i64 %ptr, -4096
1020  %or = or i64 %and, 24
1021  %0 = inttoptr i64 %or to ptr
1022  %1 = load atomic i64, ptr %0 monotonic, align 8
1023  %conv = trunc i64 %1 to i8
1024  ret i8 %conv
1025}
1026
1027; Function Attrs: nofree norecurse nounwind uwtable willreturn
1028define dso_local signext i8 @ld_not_disjoint32_int8_t_uint64_t(i64 %ptr) {
1029; CHECK-LABEL: ld_not_disjoint32_int8_t_uint64_t:
1030; CHECK:       # %bb.0: # %entry
1031; CHECK-NEXT:    ori r3, r3, 34463
1032; CHECK-NEXT:    oris r3, r3, 1
1033; CHECK-NEXT:    ld r3, 0(r3)
1034; CHECK-NEXT:    extsb r3, r3
1035; CHECK-NEXT:    blr
1036entry:
1037  %or = or i64 %ptr, 99999
1038  %0 = inttoptr i64 %or to ptr
1039  %1 = load atomic i64, ptr %0 monotonic, align 8
1040  %conv = trunc i64 %1 to i8
1041  ret i8 %conv
1042}
1043
1044; Function Attrs: nofree norecurse nounwind uwtable willreturn
1045define dso_local signext i8 @ld_disjoint_align32_int8_t_uint64_t(i64 %ptr) {
1046; CHECK-P10-LABEL: ld_disjoint_align32_int8_t_uint64_t:
1047; CHECK-P10:       # %bb.0: # %entry
1048; CHECK-P10-NEXT:    lis r4, -15264
1049; CHECK-P10-NEXT:    and r3, r3, r4
1050; CHECK-P10-NEXT:    pld r3, 999990000(r3), 0
1051; CHECK-P10-NEXT:    extsb r3, r3
1052; CHECK-P10-NEXT:    blr
1053;
1054; CHECK-PREP10-LABEL: ld_disjoint_align32_int8_t_uint64_t:
1055; CHECK-PREP10:       # %bb.0: # %entry
1056; CHECK-PREP10-NEXT:    lis r4, -15264
1057; CHECK-PREP10-NEXT:    and r3, r3, r4
1058; CHECK-PREP10-NEXT:    lis r4, 15258
1059; CHECK-PREP10-NEXT:    ori r4, r4, 41712
1060; CHECK-PREP10-NEXT:    ldx r3, r3, r4
1061; CHECK-PREP10-NEXT:    extsb r3, r3
1062; CHECK-PREP10-NEXT:    blr
1063entry:
1064  %and = and i64 %ptr, -1000341504
1065  %or = or i64 %and, 999990000
1066  %0 = inttoptr i64 %or to ptr
1067  %1 = load atomic i64, ptr %0 monotonic, align 16
1068  %conv = trunc i64 %1 to i8
1069  ret i8 %conv
1070}
1071
1072; Function Attrs: nofree norecurse nounwind uwtable willreturn
1073define dso_local signext i8 @ld_not_disjoint64_int8_t_uint64_t(i64 %ptr) {
1074; CHECK-P10-LABEL: ld_not_disjoint64_int8_t_uint64_t:
1075; CHECK-P10:       # %bb.0: # %entry
1076; CHECK-P10-NEXT:    pli r4, 232
1077; CHECK-P10-NEXT:    pli r5, 3567587329
1078; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1079; CHECK-P10-NEXT:    or r3, r3, r5
1080; CHECK-P10-NEXT:    ld r3, 0(r3)
1081; CHECK-P10-NEXT:    extsb r3, r3
1082; CHECK-P10-NEXT:    blr
1083;
1084; CHECK-PREP10-LABEL: ld_not_disjoint64_int8_t_uint64_t:
1085; CHECK-PREP10:       # %bb.0: # %entry
1086; CHECK-PREP10-NEXT:    li r4, 29
1087; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
1088; CHECK-PREP10-NEXT:    oris r4, r4, 54437
1089; CHECK-PREP10-NEXT:    ori r4, r4, 4097
1090; CHECK-PREP10-NEXT:    or r3, r3, r4
1091; CHECK-PREP10-NEXT:    ld r3, 0(r3)
1092; CHECK-PREP10-NEXT:    extsb r3, r3
1093; CHECK-PREP10-NEXT:    blr
1094entry:
1095  %or = or i64 %ptr, 1000000000001
1096  %0 = inttoptr i64 %or to ptr
1097  %1 = load atomic i64, ptr %0 monotonic, align 8
1098  %conv = trunc i64 %1 to i8
1099  ret i8 %conv
1100}
1101
1102; Function Attrs: nofree norecurse nounwind uwtable willreturn
1103define dso_local signext i8 @ld_disjoint_align64_int8_t_uint64_t(i64 %ptr) {
1104; CHECK-P10-LABEL: ld_disjoint_align64_int8_t_uint64_t:
1105; CHECK-P10:       # %bb.0: # %entry
1106; CHECK-P10-NEXT:    pli r4, 244140625
1107; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1108; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1109; CHECK-P10-NEXT:    ldx r3, r3, r4
1110; CHECK-P10-NEXT:    extsb r3, r3
1111; CHECK-P10-NEXT:    blr
1112;
1113; CHECK-PREP10-LABEL: ld_disjoint_align64_int8_t_uint64_t:
1114; CHECK-PREP10:       # %bb.0: # %entry
1115; CHECK-PREP10-NEXT:    lis r4, 3725
1116; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
1117; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1118; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1119; CHECK-PREP10-NEXT:    ldx r3, r3, r4
1120; CHECK-PREP10-NEXT:    extsb r3, r3
1121; CHECK-PREP10-NEXT:    blr
1122entry:
1123  %and = and i64 %ptr, -1099511627776
1124  %or = or i64 %and, 1000000000000
1125  %0 = inttoptr i64 %or to ptr
1126  %1 = load atomic i64, ptr %0 monotonic, align 4096
1127  %conv = trunc i64 %1 to i8
1128  ret i8 %conv
1129}
1130
1131; Function Attrs: nofree norecurse nounwind uwtable willreturn
1132define dso_local signext i8 @ld_cst_align16_int8_t_uint64_t() {
1133; CHECK-LABEL: ld_cst_align16_int8_t_uint64_t:
1134; CHECK:       # %bb.0: # %entry
1135; CHECK-NEXT:    ld r3, 4080(0)
1136; CHECK-NEXT:    extsb r3, r3
1137; CHECK-NEXT:    blr
1138entry:
1139  %0 = load atomic i64, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
1140  %conv = trunc i64 %0 to i8
1141  ret i8 %conv
1142}
1143
1144; Function Attrs: nofree norecurse nounwind uwtable willreturn
1145define dso_local signext i8 @ld_cst_align32_int8_t_uint64_t() {
1146; CHECK-LABEL: ld_cst_align32_int8_t_uint64_t:
1147; CHECK:       # %bb.0: # %entry
1148; CHECK-NEXT:    lis r3, 153
1149; CHECK-NEXT:    ld r3, -27108(r3)
1150; CHECK-NEXT:    extsb r3, r3
1151; CHECK-NEXT:    blr
1152entry:
1153  %0 = load atomic i64, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8
1154  %conv = trunc i64 %0 to i8
1155  ret i8 %conv
1156}
1157
1158; Function Attrs: nofree norecurse nounwind uwtable willreturn
1159define dso_local signext i8 @ld_cst_align64_int8_t_uint64_t() {
1160; CHECK-P10-LABEL: ld_cst_align64_int8_t_uint64_t:
1161; CHECK-P10:       # %bb.0: # %entry
1162; CHECK-P10-NEXT:    pli r3, 244140625
1163; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
1164; CHECK-P10-NEXT:    ld r3, 0(r3)
1165; CHECK-P10-NEXT:    extsb r3, r3
1166; CHECK-P10-NEXT:    blr
1167;
1168; CHECK-PREP10-LABEL: ld_cst_align64_int8_t_uint64_t:
1169; CHECK-PREP10:       # %bb.0: # %entry
1170; CHECK-PREP10-NEXT:    lis r3, 3725
1171; CHECK-PREP10-NEXT:    ori r3, r3, 19025
1172; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
1173; CHECK-PREP10-NEXT:    ld r3, 0(r3)
1174; CHECK-PREP10-NEXT:    extsb r3, r3
1175; CHECK-PREP10-NEXT:    blr
1176entry:
1177  %0 = load atomic i64, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
1178  %conv = trunc i64 %0 to i8
1179  ret i8 %conv
1180}
1181
1182; Function Attrs: nofree norecurse nounwind uwtable willreturn
1183define dso_local zeroext i8 @ld_0_uint8_t_uint8_t(i64 %ptr) {
1184; CHECK-LABEL: ld_0_uint8_t_uint8_t:
1185; CHECK:       # %bb.0: # %entry
1186; CHECK-NEXT:    lbz r3, 0(r3)
1187; CHECK-NEXT:    blr
1188entry:
1189  %0 = inttoptr i64 %ptr to ptr
1190  %1 = load atomic i8, ptr %0 monotonic, align 1
1191  ret i8 %1
1192}
1193
1194; Function Attrs: nofree norecurse nounwind uwtable willreturn
1195define dso_local zeroext i8 @ld_align16_uint8_t_uint8_t(ptr nocapture readonly %ptr) {
1196; CHECK-LABEL: ld_align16_uint8_t_uint8_t:
1197; CHECK:       # %bb.0: # %entry
1198; CHECK-NEXT:    lbz r3, 8(r3)
1199; CHECK-NEXT:    blr
1200entry:
1201  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
1202  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
1203  ret i8 %0
1204}
1205
1206; Function Attrs: nofree norecurse nounwind uwtable willreturn
1207define dso_local zeroext i8 @ld_align32_uint8_t_uint8_t(ptr nocapture readonly %ptr) {
1208; CHECK-P10-LABEL: ld_align32_uint8_t_uint8_t:
1209; CHECK-P10:       # %bb.0: # %entry
1210; CHECK-P10-NEXT:    plbz r3, 99999000(r3), 0
1211; CHECK-P10-NEXT:    clrldi r3, r3, 32
1212; CHECK-P10-NEXT:    blr
1213;
1214; CHECK-PREP10-LABEL: ld_align32_uint8_t_uint8_t:
1215; CHECK-PREP10:       # %bb.0: # %entry
1216; CHECK-PREP10-NEXT:    lis r4, 1525
1217; CHECK-PREP10-NEXT:    ori r4, r4, 56600
1218; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
1219; CHECK-PREP10-NEXT:    blr
1220entry:
1221  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
1222  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
1223  ret i8 %0
1224}
1225
1226; Function Attrs: nofree norecurse nounwind uwtable willreturn
1227define dso_local zeroext i8 @ld_align64_uint8_t_uint8_t(ptr nocapture readonly %ptr) {
1228; CHECK-P10-LABEL: ld_align64_uint8_t_uint8_t:
1229; CHECK-P10:       # %bb.0: # %entry
1230; CHECK-P10-NEXT:    pli r4, 244140625
1231; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1232; CHECK-P10-NEXT:    lbzx r3, r3, r4
1233; CHECK-P10-NEXT:    blr
1234;
1235; CHECK-PREP10-LABEL: ld_align64_uint8_t_uint8_t:
1236; CHECK-PREP10:       # %bb.0: # %entry
1237; CHECK-PREP10-NEXT:    lis r4, 3725
1238; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1239; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1240; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
1241; CHECK-PREP10-NEXT:    blr
1242entry:
1243  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
1244  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
1245  ret i8 %0
1246}
1247
1248; Function Attrs: nofree norecurse nounwind uwtable willreturn
1249define dso_local zeroext i8 @ld_reg_uint8_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) {
1250; CHECK-LABEL: ld_reg_uint8_t_uint8_t:
1251; CHECK:       # %bb.0: # %entry
1252; CHECK-NEXT:    lbzx r3, r3, r4
1253; CHECK-NEXT:    blr
1254entry:
1255  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
1256  %0 = load atomic i8, ptr %add.ptr monotonic, align 1
1257  ret i8 %0
1258}
1259
1260; Function Attrs: nofree norecurse nounwind uwtable willreturn
1261define dso_local zeroext i8 @ld_or_uint8_t_uint8_t(i64 %ptr, i8 zeroext %off) {
1262; CHECK-LABEL: ld_or_uint8_t_uint8_t:
1263; CHECK:       # %bb.0: # %entry
1264; CHECK-NEXT:    or r3, r4, r3
1265; CHECK-NEXT:    lbz r3, 0(r3)
1266; CHECK-NEXT:    blr
1267entry:
1268  %conv = zext i8 %off to i64
1269  %or = or i64 %conv, %ptr
1270  %0 = inttoptr i64 %or to ptr
1271  %1 = load atomic i8, ptr %0 monotonic, align 1
1272  ret i8 %1
1273}
1274
1275; Function Attrs: nofree norecurse nounwind uwtable willreturn
1276define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_uint8_t(i64 %ptr) {
1277; CHECK-LABEL: ld_not_disjoint16_uint8_t_uint8_t:
1278; CHECK:       # %bb.0: # %entry
1279; CHECK-NEXT:    ori r3, r3, 6
1280; CHECK-NEXT:    lbz r3, 0(r3)
1281; CHECK-NEXT:    blr
1282entry:
1283  %or = or i64 %ptr, 6
1284  %0 = inttoptr i64 %or to ptr
1285  %1 = load atomic i8, ptr %0 monotonic, align 1
1286  ret i8 %1
1287}
1288
1289; Function Attrs: nofree norecurse nounwind uwtable willreturn
1290define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_uint8_t(i64 %ptr) {
1291; CHECK-LABEL: ld_disjoint_align16_uint8_t_uint8_t:
1292; CHECK:       # %bb.0: # %entry
1293; CHECK-NEXT:    rldicr r3, r3, 0, 51
1294; CHECK-NEXT:    lbz r3, 24(r3)
1295; CHECK-NEXT:    blr
1296entry:
1297  %and = and i64 %ptr, -4096
1298  %or = or i64 %and, 24
1299  %0 = inttoptr i64 %or to ptr
1300  %1 = load atomic i8, ptr %0 monotonic, align 8
1301  ret i8 %1
1302}
1303
1304; Function Attrs: nofree norecurse nounwind uwtable willreturn
1305define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_uint8_t(i64 %ptr) {
1306; CHECK-LABEL: ld_not_disjoint32_uint8_t_uint8_t:
1307; CHECK:       # %bb.0: # %entry
1308; CHECK-NEXT:    ori r3, r3, 34463
1309; CHECK-NEXT:    oris r3, r3, 1
1310; CHECK-NEXT:    lbz r3, 0(r3)
1311; CHECK-NEXT:    blr
1312entry:
1313  %or = or i64 %ptr, 99999
1314  %0 = inttoptr i64 %or to ptr
1315  %1 = load atomic i8, ptr %0 monotonic, align 1
1316  ret i8 %1
1317}
1318
1319; Function Attrs: nofree norecurse nounwind uwtable willreturn
1320define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_uint8_t(i64 %ptr) {
1321; CHECK-P10-LABEL: ld_disjoint_align32_uint8_t_uint8_t:
1322; CHECK-P10:       # %bb.0: # %entry
1323; CHECK-P10-NEXT:    lis r4, -15264
1324; CHECK-P10-NEXT:    and r3, r3, r4
1325; CHECK-P10-NEXT:    plbz r3, 999990000(r3), 0
1326; CHECK-P10-NEXT:    clrldi r3, r3, 32
1327; CHECK-P10-NEXT:    blr
1328;
1329; CHECK-PREP10-LABEL: ld_disjoint_align32_uint8_t_uint8_t:
1330; CHECK-PREP10:       # %bb.0: # %entry
1331; CHECK-PREP10-NEXT:    lis r4, -15264
1332; CHECK-PREP10-NEXT:    and r3, r3, r4
1333; CHECK-PREP10-NEXT:    lis r4, 15258
1334; CHECK-PREP10-NEXT:    ori r4, r4, 41712
1335; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
1336; CHECK-PREP10-NEXT:    blr
1337entry:
1338  %and = and i64 %ptr, -1000341504
1339  %or = or i64 %and, 999990000
1340  %0 = inttoptr i64 %or to ptr
1341  %1 = load atomic i8, ptr %0 monotonic, align 16
1342  ret i8 %1
1343}
1344
1345; Function Attrs: nofree norecurse nounwind uwtable willreturn
1346define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_uint8_t(i64 %ptr) {
1347; CHECK-P10-LABEL: ld_not_disjoint64_uint8_t_uint8_t:
1348; CHECK-P10:       # %bb.0: # %entry
1349; CHECK-P10-NEXT:    pli r4, 232
1350; CHECK-P10-NEXT:    pli r5, 3567587329
1351; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1352; CHECK-P10-NEXT:    or r3, r3, r5
1353; CHECK-P10-NEXT:    lbz r3, 0(r3)
1354; CHECK-P10-NEXT:    blr
1355;
1356; CHECK-PREP10-LABEL: ld_not_disjoint64_uint8_t_uint8_t:
1357; CHECK-PREP10:       # %bb.0: # %entry
1358; CHECK-PREP10-NEXT:    li r4, 29
1359; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
1360; CHECK-PREP10-NEXT:    oris r4, r4, 54437
1361; CHECK-PREP10-NEXT:    ori r4, r4, 4097
1362; CHECK-PREP10-NEXT:    or r3, r3, r4
1363; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
1364; CHECK-PREP10-NEXT:    blr
1365entry:
1366  %or = or i64 %ptr, 1000000000001
1367  %0 = inttoptr i64 %or to ptr
1368  %1 = load atomic i8, ptr %0 monotonic, align 1
1369  ret i8 %1
1370}
1371
1372; Function Attrs: nofree norecurse nounwind uwtable willreturn
1373define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_uint8_t(i64 %ptr) {
1374; CHECK-P10-LABEL: ld_disjoint_align64_uint8_t_uint8_t:
1375; CHECK-P10:       # %bb.0: # %entry
1376; CHECK-P10-NEXT:    pli r4, 244140625
1377; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1378; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1379; CHECK-P10-NEXT:    lbzx r3, r3, r4
1380; CHECK-P10-NEXT:    blr
1381;
1382; CHECK-PREP10-LABEL: ld_disjoint_align64_uint8_t_uint8_t:
1383; CHECK-PREP10:       # %bb.0: # %entry
1384; CHECK-PREP10-NEXT:    lis r4, 3725
1385; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
1386; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1387; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1388; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
1389; CHECK-PREP10-NEXT:    blr
1390entry:
1391  %and = and i64 %ptr, -1099511627776
1392  %or = or i64 %and, 1000000000000
1393  %0 = inttoptr i64 %or to ptr
1394  %1 = load atomic i8, ptr %0 monotonic, align 4096
1395  ret i8 %1
1396}
1397
1398; Function Attrs: nofree norecurse nounwind uwtable willreturn
1399define dso_local zeroext i8 @ld_cst_align16_uint8_t_uint8_t() {
1400; CHECK-LABEL: ld_cst_align16_uint8_t_uint8_t:
1401; CHECK:       # %bb.0: # %entry
1402; CHECK-NEXT:    lbz r3, 4080(0)
1403; CHECK-NEXT:    blr
1404entry:
1405  %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
1406  ret i8 %0
1407}
1408
1409; Function Attrs: nofree norecurse nounwind uwtable willreturn
1410define dso_local zeroext i8 @ld_cst_align32_uint8_t_uint8_t() {
1411; CHECK-LABEL: ld_cst_align32_uint8_t_uint8_t:
1412; CHECK:       # %bb.0: # %entry
1413; CHECK-NEXT:    lis r3, 153
1414; CHECK-NEXT:    lbz r3, -27108(r3)
1415; CHECK-NEXT:    blr
1416entry:
1417  %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
1418  ret i8 %0
1419}
1420
1421; Function Attrs: nofree norecurse nounwind uwtable willreturn
1422define dso_local zeroext i8 @ld_cst_align64_uint8_t_uint8_t() {
1423; CHECK-P10-LABEL: ld_cst_align64_uint8_t_uint8_t:
1424; CHECK-P10:       # %bb.0: # %entry
1425; CHECK-P10-NEXT:    pli r3, 244140625
1426; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
1427; CHECK-P10-NEXT:    lbz r3, 0(r3)
1428; CHECK-P10-NEXT:    blr
1429;
1430; CHECK-PREP10-LABEL: ld_cst_align64_uint8_t_uint8_t:
1431; CHECK-PREP10:       # %bb.0: # %entry
1432; CHECK-PREP10-NEXT:    lis r3, 3725
1433; CHECK-PREP10-NEXT:    ori r3, r3, 19025
1434; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
1435; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
1436; CHECK-PREP10-NEXT:    blr
1437entry:
1438  %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
1439  ret i8 %0
1440}
1441
1442; Function Attrs: nofree norecurse nounwind uwtable willreturn
1443define dso_local zeroext i8 @ld_0_uint8_t_uint16_t(i64 %ptr) {
1444; CHECK-LABEL: ld_0_uint8_t_uint16_t:
1445; CHECK:       # %bb.0: # %entry
1446; CHECK-NEXT:    lhz r3, 0(r3)
1447; CHECK-NEXT:    clrldi r3, r3, 56
1448; CHECK-NEXT:    blr
1449entry:
1450  %0 = inttoptr i64 %ptr to ptr
1451  %1 = load atomic i16, ptr %0 monotonic, align 2
1452  %conv = trunc i16 %1 to i8
1453  ret i8 %conv
1454}
1455
1456; Function Attrs: nofree norecurse nounwind uwtable willreturn
1457define dso_local zeroext i8 @ld_align16_uint8_t_uint16_t(ptr nocapture readonly %ptr) {
1458; CHECK-LABEL: ld_align16_uint8_t_uint16_t:
1459; CHECK:       # %bb.0: # %entry
1460; CHECK-NEXT:    lhz r3, 8(r3)
1461; CHECK-NEXT:    clrldi r3, r3, 56
1462; CHECK-NEXT:    blr
1463entry:
1464  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
1465  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
1466  %conv = trunc i16 %0 to i8
1467  ret i8 %conv
1468}
1469
1470; Function Attrs: nofree norecurse nounwind uwtable willreturn
1471define dso_local zeroext i8 @ld_align32_uint8_t_uint16_t(ptr nocapture readonly %ptr) {
1472; CHECK-P10-LABEL: ld_align32_uint8_t_uint16_t:
1473; CHECK-P10:       # %bb.0: # %entry
1474; CHECK-P10-NEXT:    plhz r3, 99999000(r3), 0
1475; CHECK-P10-NEXT:    clrldi r3, r3, 56
1476; CHECK-P10-NEXT:    blr
1477;
1478; CHECK-PREP10-LABEL: ld_align32_uint8_t_uint16_t:
1479; CHECK-PREP10:       # %bb.0: # %entry
1480; CHECK-PREP10-NEXT:    lis r4, 1525
1481; CHECK-PREP10-NEXT:    ori r4, r4, 56600
1482; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
1483; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
1484; CHECK-PREP10-NEXT:    blr
1485entry:
1486  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
1487  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
1488  %conv = trunc i16 %0 to i8
1489  ret i8 %conv
1490}
1491
1492; Function Attrs: nofree norecurse nounwind uwtable willreturn
1493define dso_local zeroext i8 @ld_align64_uint8_t_uint16_t(ptr nocapture readonly %ptr) {
1494; CHECK-P10-LABEL: ld_align64_uint8_t_uint16_t:
1495; CHECK-P10:       # %bb.0: # %entry
1496; CHECK-P10-NEXT:    pli r4, 244140625
1497; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1498; CHECK-P10-NEXT:    lhzx r3, r3, r4
1499; CHECK-P10-NEXT:    clrldi r3, r3, 56
1500; CHECK-P10-NEXT:    blr
1501;
1502; CHECK-PREP10-LABEL: ld_align64_uint8_t_uint16_t:
1503; CHECK-PREP10:       # %bb.0: # %entry
1504; CHECK-PREP10-NEXT:    lis r4, 3725
1505; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1506; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1507; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
1508; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
1509; CHECK-PREP10-NEXT:    blr
1510entry:
1511  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
1512  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
1513  %conv = trunc i16 %0 to i8
1514  ret i8 %conv
1515}
1516
1517; Function Attrs: nofree norecurse nounwind uwtable willreturn
1518define dso_local zeroext i8 @ld_reg_uint8_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) {
1519; CHECK-LABEL: ld_reg_uint8_t_uint16_t:
1520; CHECK:       # %bb.0: # %entry
1521; CHECK-NEXT:    lhzx r3, r3, r4
1522; CHECK-NEXT:    clrldi r3, r3, 56
1523; CHECK-NEXT:    blr
1524entry:
1525  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
1526  %0 = load atomic i16, ptr %add.ptr monotonic, align 2
1527  %conv = trunc i16 %0 to i8
1528  ret i8 %conv
1529}
1530
1531; Function Attrs: nofree norecurse nounwind uwtable willreturn
1532define dso_local zeroext i8 @ld_or_uint8_t_uint16_t(i64 %ptr, i8 zeroext %off) {
1533; CHECK-LABEL: ld_or_uint8_t_uint16_t:
1534; CHECK:       # %bb.0: # %entry
1535; CHECK-NEXT:    or r3, r4, r3
1536; CHECK-NEXT:    lhz r3, 0(r3)
1537; CHECK-NEXT:    clrldi r3, r3, 56
1538; CHECK-NEXT:    blr
1539entry:
1540  %conv = zext i8 %off to i64
1541  %or = or i64 %conv, %ptr
1542  %0 = inttoptr i64 %or to ptr
1543  %1 = load atomic i16, ptr %0 monotonic, align 2
1544  %conv1 = trunc i16 %1 to i8
1545  ret i8 %conv1
1546}
1547
1548; Function Attrs: nofree norecurse nounwind uwtable willreturn
1549define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_uint16_t(i64 %ptr) {
1550; CHECK-LABEL: ld_not_disjoint16_uint8_t_uint16_t:
1551; CHECK:       # %bb.0: # %entry
1552; CHECK-NEXT:    ori r3, r3, 6
1553; CHECK-NEXT:    lhz r3, 0(r3)
1554; CHECK-NEXT:    clrldi r3, r3, 56
1555; CHECK-NEXT:    blr
1556entry:
1557  %or = or i64 %ptr, 6
1558  %0 = inttoptr i64 %or to ptr
1559  %1 = load atomic i16, ptr %0 monotonic, align 2
1560  %conv = trunc i16 %1 to i8
1561  ret i8 %conv
1562}
1563
1564; Function Attrs: nofree norecurse nounwind uwtable willreturn
1565define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_uint16_t(i64 %ptr) {
1566; CHECK-LABEL: ld_disjoint_align16_uint8_t_uint16_t:
1567; CHECK:       # %bb.0: # %entry
1568; CHECK-NEXT:    rldicr r3, r3, 0, 51
1569; CHECK-NEXT:    lhz r3, 24(r3)
1570; CHECK-NEXT:    clrldi r3, r3, 56
1571; CHECK-NEXT:    blr
1572entry:
1573  %and = and i64 %ptr, -4096
1574  %or = or i64 %and, 24
1575  %0 = inttoptr i64 %or to ptr
1576  %1 = load atomic i16, ptr %0 monotonic, align 8
1577  %conv = trunc i16 %1 to i8
1578  ret i8 %conv
1579}
1580
1581; Function Attrs: nofree norecurse nounwind uwtable willreturn
1582define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_uint16_t(i64 %ptr) {
1583; CHECK-LABEL: ld_not_disjoint32_uint8_t_uint16_t:
1584; CHECK:       # %bb.0: # %entry
1585; CHECK-NEXT:    ori r3, r3, 34463
1586; CHECK-NEXT:    oris r3, r3, 1
1587; CHECK-NEXT:    lhz r3, 0(r3)
1588; CHECK-NEXT:    clrldi r3, r3, 56
1589; CHECK-NEXT:    blr
1590entry:
1591  %or = or i64 %ptr, 99999
1592  %0 = inttoptr i64 %or to ptr
1593  %1 = load atomic i16, ptr %0 monotonic, align 2
1594  %conv = trunc i16 %1 to i8
1595  ret i8 %conv
1596}
1597
1598; Function Attrs: nofree norecurse nounwind uwtable willreturn
1599define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_uint16_t(i64 %ptr) {
1600; CHECK-P10-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
1601; CHECK-P10:       # %bb.0: # %entry
1602; CHECK-P10-NEXT:    lis r4, -15264
1603; CHECK-P10-NEXT:    and r3, r3, r4
1604; CHECK-P10-NEXT:    plhz r3, 999990000(r3), 0
1605; CHECK-P10-NEXT:    clrldi r3, r3, 56
1606; CHECK-P10-NEXT:    blr
1607;
1608; CHECK-PREP10-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
1609; CHECK-PREP10:       # %bb.0: # %entry
1610; CHECK-PREP10-NEXT:    lis r4, -15264
1611; CHECK-PREP10-NEXT:    and r3, r3, r4
1612; CHECK-PREP10-NEXT:    lis r4, 15258
1613; CHECK-PREP10-NEXT:    ori r4, r4, 41712
1614; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
1615; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
1616; CHECK-PREP10-NEXT:    blr
1617entry:
1618  %and = and i64 %ptr, -1000341504
1619  %or = or i64 %and, 999990000
1620  %0 = inttoptr i64 %or to ptr
1621  %1 = load atomic i16, ptr %0 monotonic, align 16
1622  %conv = trunc i16 %1 to i8
1623  ret i8 %conv
1624}
1625
1626; Function Attrs: nofree norecurse nounwind uwtable willreturn
1627define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_uint16_t(i64 %ptr) {
1628; CHECK-P10-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
1629; CHECK-P10:       # %bb.0: # %entry
1630; CHECK-P10-NEXT:    pli r4, 232
1631; CHECK-P10-NEXT:    pli r5, 3567587329
1632; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1633; CHECK-P10-NEXT:    or r3, r3, r5
1634; CHECK-P10-NEXT:    lhz r3, 0(r3)
1635; CHECK-P10-NEXT:    clrldi r3, r3, 56
1636; CHECK-P10-NEXT:    blr
1637;
1638; CHECK-PREP10-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
1639; CHECK-PREP10:       # %bb.0: # %entry
1640; CHECK-PREP10-NEXT:    li r4, 29
1641; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
1642; CHECK-PREP10-NEXT:    oris r4, r4, 54437
1643; CHECK-PREP10-NEXT:    ori r4, r4, 4097
1644; CHECK-PREP10-NEXT:    or r3, r3, r4
1645; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
1646; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
1647; CHECK-PREP10-NEXT:    blr
1648entry:
1649  %or = or i64 %ptr, 1000000000001
1650  %0 = inttoptr i64 %or to ptr
1651  %1 = load atomic i16, ptr %0 monotonic, align 2
1652  %conv = trunc i16 %1 to i8
1653  ret i8 %conv
1654}
1655
1656; Function Attrs: nofree norecurse nounwind uwtable willreturn
1657define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_uint16_t(i64 %ptr) {
1658; CHECK-P10-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
1659; CHECK-P10:       # %bb.0: # %entry
1660; CHECK-P10-NEXT:    pli r4, 244140625
1661; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1662; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1663; CHECK-P10-NEXT:    lhzx r3, r3, r4
1664; CHECK-P10-NEXT:    clrldi r3, r3, 56
1665; CHECK-P10-NEXT:    blr
1666;
1667; CHECK-PREP10-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
1668; CHECK-PREP10:       # %bb.0: # %entry
1669; CHECK-PREP10-NEXT:    lis r4, 3725
1670; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
1671; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1672; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1673; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
1674; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
1675; CHECK-PREP10-NEXT:    blr
1676entry:
1677  %and = and i64 %ptr, -1099511627776
1678  %or = or i64 %and, 1000000000000
1679  %0 = inttoptr i64 %or to ptr
1680  %1 = load atomic i16, ptr %0 monotonic, align 4096
1681  %conv = trunc i16 %1 to i8
1682  ret i8 %conv
1683}
1684
1685; Function Attrs: nofree norecurse nounwind uwtable willreturn
1686define dso_local zeroext i8 @ld_cst_align16_uint8_t_uint16_t() {
1687; CHECK-LABEL: ld_cst_align16_uint8_t_uint16_t:
1688; CHECK:       # %bb.0: # %entry
1689; CHECK-NEXT:    lhz r3, 4080(0)
1690; CHECK-NEXT:    clrldi r3, r3, 56
1691; CHECK-NEXT:    blr
1692entry:
1693  %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
1694  %conv = trunc i16 %0 to i8
1695  ret i8 %conv
1696}
1697
1698; Function Attrs: nofree norecurse nounwind uwtable willreturn
1699define dso_local zeroext i8 @ld_cst_align32_uint8_t_uint16_t() {
1700; CHECK-LABEL: ld_cst_align32_uint8_t_uint16_t:
1701; CHECK:       # %bb.0: # %entry
1702; CHECK-NEXT:    lis r3, 153
1703; CHECK-NEXT:    lhz r3, -27108(r3)
1704; CHECK-NEXT:    clrldi r3, r3, 56
1705; CHECK-NEXT:    blr
1706entry:
1707  %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
1708  %conv = trunc i16 %0 to i8
1709  ret i8 %conv
1710}
1711
1712; Function Attrs: nofree norecurse nounwind uwtable willreturn
1713define dso_local zeroext i8 @ld_cst_align64_uint8_t_uint16_t() {
1714; CHECK-P10-LABEL: ld_cst_align64_uint8_t_uint16_t:
1715; CHECK-P10:       # %bb.0: # %entry
1716; CHECK-P10-NEXT:    pli r3, 244140625
1717; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
1718; CHECK-P10-NEXT:    lhz r3, 0(r3)
1719; CHECK-P10-NEXT:    clrldi r3, r3, 56
1720; CHECK-P10-NEXT:    blr
1721;
1722; CHECK-PREP10-LABEL: ld_cst_align64_uint8_t_uint16_t:
1723; CHECK-PREP10:       # %bb.0: # %entry
1724; CHECK-PREP10-NEXT:    lis r3, 3725
1725; CHECK-PREP10-NEXT:    ori r3, r3, 19025
1726; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
1727; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
1728; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
1729; CHECK-PREP10-NEXT:    blr
1730entry:
1731  %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
1732  %conv = trunc i16 %0 to i8
1733  ret i8 %conv
1734}
1735
1736; Function Attrs: nofree norecurse nounwind uwtable willreturn
1737define dso_local zeroext i8 @ld_0_uint8_t_uint32_t(i64 %ptr) {
1738; CHECK-LABEL: ld_0_uint8_t_uint32_t:
1739; CHECK:       # %bb.0: # %entry
1740; CHECK-NEXT:    lwz r3, 0(r3)
1741; CHECK-NEXT:    clrldi r3, r3, 56
1742; CHECK-NEXT:    blr
1743entry:
1744  %0 = inttoptr i64 %ptr to ptr
1745  %1 = load atomic i32, ptr %0 monotonic, align 4
1746  %conv = trunc i32 %1 to i8
1747  ret i8 %conv
1748}
1749
1750; Function Attrs: nofree norecurse nounwind uwtable willreturn
1751define dso_local zeroext i8 @ld_align16_uint8_t_uint32_t(ptr nocapture readonly %ptr) {
1752; CHECK-LABEL: ld_align16_uint8_t_uint32_t:
1753; CHECK:       # %bb.0: # %entry
1754; CHECK-NEXT:    lwz r3, 8(r3)
1755; CHECK-NEXT:    clrldi r3, r3, 56
1756; CHECK-NEXT:    blr
1757entry:
1758  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
1759  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1760  %conv = trunc i32 %0 to i8
1761  ret i8 %conv
1762}
1763
1764; Function Attrs: nofree norecurse nounwind uwtable willreturn
1765define dso_local zeroext i8 @ld_align32_uint8_t_uint32_t(ptr nocapture readonly %ptr) {
1766; CHECK-P10-LABEL: ld_align32_uint8_t_uint32_t:
1767; CHECK-P10:       # %bb.0: # %entry
1768; CHECK-P10-NEXT:    plwz r3, 99999000(r3), 0
1769; CHECK-P10-NEXT:    clrldi r3, r3, 56
1770; CHECK-P10-NEXT:    blr
1771;
1772; CHECK-PREP10-LABEL: ld_align32_uint8_t_uint32_t:
1773; CHECK-PREP10:       # %bb.0: # %entry
1774; CHECK-PREP10-NEXT:    lis r4, 1525
1775; CHECK-PREP10-NEXT:    ori r4, r4, 56600
1776; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
1777; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
1778; CHECK-PREP10-NEXT:    blr
1779entry:
1780  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
1781  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1782  %conv = trunc i32 %0 to i8
1783  ret i8 %conv
1784}
1785
1786; Function Attrs: nofree norecurse nounwind uwtable willreturn
1787define dso_local zeroext i8 @ld_align64_uint8_t_uint32_t(ptr nocapture readonly %ptr) {
1788; CHECK-P10-LABEL: ld_align64_uint8_t_uint32_t:
1789; CHECK-P10:       # %bb.0: # %entry
1790; CHECK-P10-NEXT:    pli r4, 244140625
1791; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1792; CHECK-P10-NEXT:    lwzx r3, r3, r4
1793; CHECK-P10-NEXT:    clrldi r3, r3, 56
1794; CHECK-P10-NEXT:    blr
1795;
1796; CHECK-PREP10-LABEL: ld_align64_uint8_t_uint32_t:
1797; CHECK-PREP10:       # %bb.0: # %entry
1798; CHECK-PREP10-NEXT:    lis r4, 3725
1799; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1800; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1801; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
1802; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
1803; CHECK-PREP10-NEXT:    blr
1804entry:
1805  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
1806  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1807  %conv = trunc i32 %0 to i8
1808  ret i8 %conv
1809}
1810
1811; Function Attrs: nofree norecurse nounwind uwtable willreturn
1812define dso_local zeroext i8 @ld_reg_uint8_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) {
1813; CHECK-LABEL: ld_reg_uint8_t_uint32_t:
1814; CHECK:       # %bb.0: # %entry
1815; CHECK-NEXT:    lwzx r3, r3, r4
1816; CHECK-NEXT:    clrldi r3, r3, 56
1817; CHECK-NEXT:    blr
1818entry:
1819  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
1820  %0 = load atomic i32, ptr %add.ptr monotonic, align 4
1821  %conv = trunc i32 %0 to i8
1822  ret i8 %conv
1823}
1824
1825; Function Attrs: nofree norecurse nounwind uwtable willreturn
1826define dso_local zeroext i8 @ld_or_uint8_t_uint32_t(i64 %ptr, i8 zeroext %off) {
1827; CHECK-LABEL: ld_or_uint8_t_uint32_t:
1828; CHECK:       # %bb.0: # %entry
1829; CHECK-NEXT:    or r3, r4, r3
1830; CHECK-NEXT:    lwz r3, 0(r3)
1831; CHECK-NEXT:    clrldi r3, r3, 56
1832; CHECK-NEXT:    blr
1833entry:
1834  %conv = zext i8 %off to i64
1835  %or = or i64 %conv, %ptr
1836  %0 = inttoptr i64 %or to ptr
1837  %1 = load atomic i32, ptr %0 monotonic, align 4
1838  %conv1 = trunc i32 %1 to i8
1839  ret i8 %conv1
1840}
1841
1842; Function Attrs: nofree norecurse nounwind uwtable willreturn
1843define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_uint32_t(i64 %ptr) {
1844; CHECK-LABEL: ld_not_disjoint16_uint8_t_uint32_t:
1845; CHECK:       # %bb.0: # %entry
1846; CHECK-NEXT:    ori r3, r3, 6
1847; CHECK-NEXT:    lwz r3, 0(r3)
1848; CHECK-NEXT:    clrldi r3, r3, 56
1849; CHECK-NEXT:    blr
1850entry:
1851  %or = or i64 %ptr, 6
1852  %0 = inttoptr i64 %or to ptr
1853  %1 = load atomic i32, ptr %0 monotonic, align 4
1854  %conv = trunc i32 %1 to i8
1855  ret i8 %conv
1856}
1857
1858; Function Attrs: nofree norecurse nounwind uwtable willreturn
1859define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_uint32_t(i64 %ptr) {
1860; CHECK-LABEL: ld_disjoint_align16_uint8_t_uint32_t:
1861; CHECK:       # %bb.0: # %entry
1862; CHECK-NEXT:    rldicr r3, r3, 0, 51
1863; CHECK-NEXT:    lwz r3, 24(r3)
1864; CHECK-NEXT:    clrldi r3, r3, 56
1865; CHECK-NEXT:    blr
1866entry:
1867  %and = and i64 %ptr, -4096
1868  %or = or i64 %and, 24
1869  %0 = inttoptr i64 %or to ptr
1870  %1 = load atomic i32, ptr %0 monotonic, align 8
1871  %conv = trunc i32 %1 to i8
1872  ret i8 %conv
1873}
1874
1875; Function Attrs: nofree norecurse nounwind uwtable willreturn
1876define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_uint32_t(i64 %ptr) {
1877; CHECK-LABEL: ld_not_disjoint32_uint8_t_uint32_t:
1878; CHECK:       # %bb.0: # %entry
1879; CHECK-NEXT:    ori r3, r3, 34463
1880; CHECK-NEXT:    oris r3, r3, 1
1881; CHECK-NEXT:    lwz r3, 0(r3)
1882; CHECK-NEXT:    clrldi r3, r3, 56
1883; CHECK-NEXT:    blr
1884entry:
1885  %or = or i64 %ptr, 99999
1886  %0 = inttoptr i64 %or to ptr
1887  %1 = load atomic i32, ptr %0 monotonic, align 4
1888  %conv = trunc i32 %1 to i8
1889  ret i8 %conv
1890}
1891
1892; Function Attrs: nofree norecurse nounwind uwtable willreturn
1893define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_uint32_t(i64 %ptr) {
1894; CHECK-P10-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
1895; CHECK-P10:       # %bb.0: # %entry
1896; CHECK-P10-NEXT:    lis r4, -15264
1897; CHECK-P10-NEXT:    and r3, r3, r4
1898; CHECK-P10-NEXT:    plwz r3, 999990000(r3), 0
1899; CHECK-P10-NEXT:    clrldi r3, r3, 56
1900; CHECK-P10-NEXT:    blr
1901;
1902; CHECK-PREP10-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
1903; CHECK-PREP10:       # %bb.0: # %entry
1904; CHECK-PREP10-NEXT:    lis r4, -15264
1905; CHECK-PREP10-NEXT:    and r3, r3, r4
1906; CHECK-PREP10-NEXT:    lis r4, 15258
1907; CHECK-PREP10-NEXT:    ori r4, r4, 41712
1908; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
1909; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
1910; CHECK-PREP10-NEXT:    blr
1911entry:
1912  %and = and i64 %ptr, -1000341504
1913  %or = or i64 %and, 999990000
1914  %0 = inttoptr i64 %or to ptr
1915  %1 = load atomic i32, ptr %0 monotonic, align 16
1916  %conv = trunc i32 %1 to i8
1917  ret i8 %conv
1918}
1919
1920; Function Attrs: nofree norecurse nounwind uwtable willreturn
1921define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_uint32_t(i64 %ptr) {
1922; CHECK-P10-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
1923; CHECK-P10:       # %bb.0: # %entry
1924; CHECK-P10-NEXT:    pli r4, 232
1925; CHECK-P10-NEXT:    pli r5, 3567587329
1926; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1927; CHECK-P10-NEXT:    or r3, r3, r5
1928; CHECK-P10-NEXT:    lwz r3, 0(r3)
1929; CHECK-P10-NEXT:    clrldi r3, r3, 56
1930; CHECK-P10-NEXT:    blr
1931;
1932; CHECK-PREP10-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
1933; CHECK-PREP10:       # %bb.0: # %entry
1934; CHECK-PREP10-NEXT:    li r4, 29
1935; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
1936; CHECK-PREP10-NEXT:    oris r4, r4, 54437
1937; CHECK-PREP10-NEXT:    ori r4, r4, 4097
1938; CHECK-PREP10-NEXT:    or r3, r3, r4
1939; CHECK-PREP10-NEXT:    lwz r3, 0(r3)
1940; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
1941; CHECK-PREP10-NEXT:    blr
1942entry:
1943  %or = or i64 %ptr, 1000000000001
1944  %0 = inttoptr i64 %or to ptr
1945  %1 = load atomic i32, ptr %0 monotonic, align 4
1946  %conv = trunc i32 %1 to i8
1947  ret i8 %conv
1948}
1949
1950; Function Attrs: nofree norecurse nounwind uwtable willreturn
1951define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_uint32_t(i64 %ptr) {
1952; CHECK-P10-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
1953; CHECK-P10:       # %bb.0: # %entry
1954; CHECK-P10-NEXT:    pli r4, 244140625
1955; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1956; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1957; CHECK-P10-NEXT:    lwzx r3, r3, r4
1958; CHECK-P10-NEXT:    clrldi r3, r3, 56
1959; CHECK-P10-NEXT:    blr
1960;
1961; CHECK-PREP10-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
1962; CHECK-PREP10:       # %bb.0: # %entry
1963; CHECK-PREP10-NEXT:    lis r4, 3725
1964; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
1965; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1966; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1967; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
1968; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
1969; CHECK-PREP10-NEXT:    blr
1970entry:
1971  %and = and i64 %ptr, -1099511627776
1972  %or = or i64 %and, 1000000000000
1973  %0 = inttoptr i64 %or to ptr
1974  %1 = load atomic i32, ptr %0 monotonic, align 4096
1975  %conv = trunc i32 %1 to i8
1976  ret i8 %conv
1977}
1978
1979; Function Attrs: nofree norecurse nounwind uwtable willreturn
1980define dso_local zeroext i8 @ld_cst_align16_uint8_t_uint32_t() {
1981; CHECK-LABEL: ld_cst_align16_uint8_t_uint32_t:
1982; CHECK:       # %bb.0: # %entry
1983; CHECK-NEXT:    lwz r3, 4080(0)
1984; CHECK-NEXT:    clrldi r3, r3, 56
1985; CHECK-NEXT:    blr
1986entry:
1987  %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
1988  %conv = trunc i32 %0 to i8
1989  ret i8 %conv
1990}
1991
1992; Function Attrs: nofree norecurse nounwind uwtable willreturn
1993define dso_local zeroext i8 @ld_cst_align32_uint8_t_uint32_t() {
1994; CHECK-LABEL: ld_cst_align32_uint8_t_uint32_t:
1995; CHECK:       # %bb.0: # %entry
1996; CHECK-NEXT:    lis r3, 153
1997; CHECK-NEXT:    lwz r3, -27108(r3)
1998; CHECK-NEXT:    clrldi r3, r3, 56
1999; CHECK-NEXT:    blr
2000entry:
2001  %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
2002  %conv = trunc i32 %0 to i8
2003  ret i8 %conv
2004}
2005
2006; Function Attrs: nofree norecurse nounwind uwtable willreturn
2007define dso_local zeroext i8 @ld_cst_align64_uint8_t_uint32_t() {
2008; CHECK-P10-LABEL: ld_cst_align64_uint8_t_uint32_t:
2009; CHECK-P10:       # %bb.0: # %entry
2010; CHECK-P10-NEXT:    pli r3, 244140625
2011; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2012; CHECK-P10-NEXT:    lwz r3, 0(r3)
2013; CHECK-P10-NEXT:    clrldi r3, r3, 56
2014; CHECK-P10-NEXT:    blr
2015;
2016; CHECK-PREP10-LABEL: ld_cst_align64_uint8_t_uint32_t:
2017; CHECK-PREP10:       # %bb.0: # %entry
2018; CHECK-PREP10-NEXT:    lis r3, 3725
2019; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2020; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2021; CHECK-PREP10-NEXT:    lwz r3, 0(r3)
2022; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
2023; CHECK-PREP10-NEXT:    blr
2024entry:
2025  %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
2026  %conv = trunc i32 %0 to i8
2027  ret i8 %conv
2028}
2029
2030; Function Attrs: nofree norecurse nounwind uwtable willreturn
2031define dso_local zeroext i8 @ld_0_uint8_t_uint64_t(i64 %ptr) {
2032; CHECK-LABEL: ld_0_uint8_t_uint64_t:
2033; CHECK:       # %bb.0: # %entry
2034; CHECK-NEXT:    ld r3, 0(r3)
2035; CHECK-NEXT:    clrldi r3, r3, 56
2036; CHECK-NEXT:    blr
2037entry:
2038  %0 = inttoptr i64 %ptr to ptr
2039  %1 = load atomic i64, ptr %0 monotonic, align 8
2040  %conv = trunc i64 %1 to i8
2041  ret i8 %conv
2042}
2043
2044; Function Attrs: nofree norecurse nounwind uwtable willreturn
2045define dso_local zeroext i8 @ld_align16_uint8_t_uint64_t(ptr nocapture readonly %ptr) {
2046; CHECK-LABEL: ld_align16_uint8_t_uint64_t:
2047; CHECK:       # %bb.0: # %entry
2048; CHECK-NEXT:    ld r3, 8(r3)
2049; CHECK-NEXT:    clrldi r3, r3, 56
2050; CHECK-NEXT:    blr
2051entry:
2052  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2053  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
2054  %conv = trunc i64 %0 to i8
2055  ret i8 %conv
2056}
2057
2058; Function Attrs: nofree norecurse nounwind uwtable willreturn
2059define dso_local zeroext i8 @ld_align32_uint8_t_uint64_t(ptr nocapture readonly %ptr) {
2060; CHECK-P10-LABEL: ld_align32_uint8_t_uint64_t:
2061; CHECK-P10:       # %bb.0: # %entry
2062; CHECK-P10-NEXT:    pld r3, 99999000(r3), 0
2063; CHECK-P10-NEXT:    clrldi r3, r3, 56
2064; CHECK-P10-NEXT:    blr
2065;
2066; CHECK-PREP10-LABEL: ld_align32_uint8_t_uint64_t:
2067; CHECK-PREP10:       # %bb.0: # %entry
2068; CHECK-PREP10-NEXT:    lis r4, 1525
2069; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2070; CHECK-PREP10-NEXT:    ldx r3, r3, r4
2071; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
2072; CHECK-PREP10-NEXT:    blr
2073entry:
2074  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2075  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
2076  %conv = trunc i64 %0 to i8
2077  ret i8 %conv
2078}
2079
2080; Function Attrs: nofree norecurse nounwind uwtable willreturn
2081define dso_local zeroext i8 @ld_align64_uint8_t_uint64_t(ptr nocapture readonly %ptr) {
2082; CHECK-P10-LABEL: ld_align64_uint8_t_uint64_t:
2083; CHECK-P10:       # %bb.0: # %entry
2084; CHECK-P10-NEXT:    pli r4, 244140625
2085; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2086; CHECK-P10-NEXT:    ldx r3, r3, r4
2087; CHECK-P10-NEXT:    clrldi r3, r3, 56
2088; CHECK-P10-NEXT:    blr
2089;
2090; CHECK-PREP10-LABEL: ld_align64_uint8_t_uint64_t:
2091; CHECK-PREP10:       # %bb.0: # %entry
2092; CHECK-PREP10-NEXT:    lis r4, 3725
2093; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2094; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2095; CHECK-PREP10-NEXT:    ldx r3, r3, r4
2096; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
2097; CHECK-PREP10-NEXT:    blr
2098entry:
2099  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2100  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
2101  %conv = trunc i64 %0 to i8
2102  ret i8 %conv
2103}
2104
2105; Function Attrs: nofree norecurse nounwind uwtable willreturn
2106define dso_local zeroext i8 @ld_reg_uint8_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) {
2107; CHECK-LABEL: ld_reg_uint8_t_uint64_t:
2108; CHECK:       # %bb.0: # %entry
2109; CHECK-NEXT:    ldx r3, r3, r4
2110; CHECK-NEXT:    clrldi r3, r3, 56
2111; CHECK-NEXT:    blr
2112entry:
2113  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2114  %0 = load atomic i64, ptr %add.ptr monotonic, align 8
2115  %conv = trunc i64 %0 to i8
2116  ret i8 %conv
2117}
2118
2119; Function Attrs: nofree norecurse nounwind uwtable willreturn
2120define dso_local zeroext i8 @ld_or_uint8_t_uint64_t(i64 %ptr, i8 zeroext %off) {
2121; CHECK-LABEL: ld_or_uint8_t_uint64_t:
2122; CHECK:       # %bb.0: # %entry
2123; CHECK-NEXT:    or r3, r4, r3
2124; CHECK-NEXT:    ld r3, 0(r3)
2125; CHECK-NEXT:    clrldi r3, r3, 56
2126; CHECK-NEXT:    blr
2127entry:
2128  %conv = zext i8 %off to i64
2129  %or = or i64 %conv, %ptr
2130  %0 = inttoptr i64 %or to ptr
2131  %1 = load atomic i64, ptr %0 monotonic, align 8
2132  %conv1 = trunc i64 %1 to i8
2133  ret i8 %conv1
2134}
2135
2136; Function Attrs: nofree norecurse nounwind uwtable willreturn
2137define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_uint64_t(i64 %ptr) {
2138; CHECK-LABEL: ld_not_disjoint16_uint8_t_uint64_t:
2139; CHECK:       # %bb.0: # %entry
2140; CHECK-NEXT:    ori r3, r3, 6
2141; CHECK-NEXT:    ld r3, 0(r3)
2142; CHECK-NEXT:    clrldi r3, r3, 56
2143; CHECK-NEXT:    blr
2144entry:
2145  %or = or i64 %ptr, 6
2146  %0 = inttoptr i64 %or to ptr
2147  %1 = load atomic i64, ptr %0 monotonic, align 8
2148  %conv = trunc i64 %1 to i8
2149  ret i8 %conv
2150}
2151
2152; Function Attrs: nofree norecurse nounwind uwtable willreturn
2153define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_uint64_t(i64 %ptr) {
2154; CHECK-LABEL: ld_disjoint_align16_uint8_t_uint64_t:
2155; CHECK:       # %bb.0: # %entry
2156; CHECK-NEXT:    rldicr r3, r3, 0, 51
2157; CHECK-NEXT:    ld r3, 24(r3)
2158; CHECK-NEXT:    clrldi r3, r3, 56
2159; CHECK-NEXT:    blr
2160entry:
2161  %and = and i64 %ptr, -4096
2162  %or = or i64 %and, 24
2163  %0 = inttoptr i64 %or to ptr
2164  %1 = load atomic i64, ptr %0 monotonic, align 8
2165  %conv = trunc i64 %1 to i8
2166  ret i8 %conv
2167}
2168
2169; Function Attrs: nofree norecurse nounwind uwtable willreturn
2170define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_uint64_t(i64 %ptr) {
2171; CHECK-LABEL: ld_not_disjoint32_uint8_t_uint64_t:
2172; CHECK:       # %bb.0: # %entry
2173; CHECK-NEXT:    ori r3, r3, 34463
2174; CHECK-NEXT:    oris r3, r3, 1
2175; CHECK-NEXT:    ld r3, 0(r3)
2176; CHECK-NEXT:    clrldi r3, r3, 56
2177; CHECK-NEXT:    blr
2178entry:
2179  %or = or i64 %ptr, 99999
2180  %0 = inttoptr i64 %or to ptr
2181  %1 = load atomic i64, ptr %0 monotonic, align 8
2182  %conv = trunc i64 %1 to i8
2183  ret i8 %conv
2184}
2185
2186; Function Attrs: nofree norecurse nounwind uwtable willreturn
2187define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_uint64_t(i64 %ptr) {
2188; CHECK-P10-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
2189; CHECK-P10:       # %bb.0: # %entry
2190; CHECK-P10-NEXT:    lis r4, -15264
2191; CHECK-P10-NEXT:    and r3, r3, r4
2192; CHECK-P10-NEXT:    pld r3, 999990000(r3), 0
2193; CHECK-P10-NEXT:    clrldi r3, r3, 56
2194; CHECK-P10-NEXT:    blr
2195;
2196; CHECK-PREP10-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
2197; CHECK-PREP10:       # %bb.0: # %entry
2198; CHECK-PREP10-NEXT:    lis r4, -15264
2199; CHECK-PREP10-NEXT:    and r3, r3, r4
2200; CHECK-PREP10-NEXT:    lis r4, 15258
2201; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2202; CHECK-PREP10-NEXT:    ldx r3, r3, r4
2203; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
2204; CHECK-PREP10-NEXT:    blr
2205entry:
2206  %and = and i64 %ptr, -1000341504
2207  %or = or i64 %and, 999990000
2208  %0 = inttoptr i64 %or to ptr
2209  %1 = load atomic i64, ptr %0 monotonic, align 16
2210  %conv = trunc i64 %1 to i8
2211  ret i8 %conv
2212}
2213
2214; Function Attrs: nofree norecurse nounwind uwtable willreturn
2215define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_uint64_t(i64 %ptr) {
2216; CHECK-P10-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
2217; CHECK-P10:       # %bb.0: # %entry
2218; CHECK-P10-NEXT:    pli r4, 232
2219; CHECK-P10-NEXT:    pli r5, 3567587329
2220; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2221; CHECK-P10-NEXT:    or r3, r3, r5
2222; CHECK-P10-NEXT:    ld r3, 0(r3)
2223; CHECK-P10-NEXT:    clrldi r3, r3, 56
2224; CHECK-P10-NEXT:    blr
2225;
2226; CHECK-PREP10-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
2227; CHECK-PREP10:       # %bb.0: # %entry
2228; CHECK-PREP10-NEXT:    li r4, 29
2229; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2230; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2231; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2232; CHECK-PREP10-NEXT:    or r3, r3, r4
2233; CHECK-PREP10-NEXT:    ld r3, 0(r3)
2234; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
2235; CHECK-PREP10-NEXT:    blr
2236entry:
2237  %or = or i64 %ptr, 1000000000001
2238  %0 = inttoptr i64 %or to ptr
2239  %1 = load atomic i64, ptr %0 monotonic, align 8
2240  %conv = trunc i64 %1 to i8
2241  ret i8 %conv
2242}
2243
2244; Function Attrs: nofree norecurse nounwind uwtable willreturn
2245define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_uint64_t(i64 %ptr) {
2246; CHECK-P10-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
2247; CHECK-P10:       # %bb.0: # %entry
2248; CHECK-P10-NEXT:    pli r4, 244140625
2249; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2250; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2251; CHECK-P10-NEXT:    ldx r3, r3, r4
2252; CHECK-P10-NEXT:    clrldi r3, r3, 56
2253; CHECK-P10-NEXT:    blr
2254;
2255; CHECK-PREP10-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
2256; CHECK-PREP10:       # %bb.0: # %entry
2257; CHECK-PREP10-NEXT:    lis r4, 3725
2258; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2259; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2260; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2261; CHECK-PREP10-NEXT:    ldx r3, r3, r4
2262; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
2263; CHECK-PREP10-NEXT:    blr
2264entry:
2265  %and = and i64 %ptr, -1099511627776
2266  %or = or i64 %and, 1000000000000
2267  %0 = inttoptr i64 %or to ptr
2268  %1 = load atomic i64, ptr %0 monotonic, align 4096
2269  %conv = trunc i64 %1 to i8
2270  ret i8 %conv
2271}
2272
2273; Function Attrs: nofree norecurse nounwind uwtable willreturn
2274define dso_local zeroext i8 @ld_cst_align16_uint8_t_uint64_t() {
2275; CHECK-LABEL: ld_cst_align16_uint8_t_uint64_t:
2276; CHECK:       # %bb.0: # %entry
2277; CHECK-NEXT:    ld r3, 4080(0)
2278; CHECK-NEXT:    clrldi r3, r3, 56
2279; CHECK-NEXT:    blr
2280entry:
2281  %0 = load atomic i64, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
2282  %conv = trunc i64 %0 to i8
2283  ret i8 %conv
2284}
2285
2286; Function Attrs: nofree norecurse nounwind uwtable willreturn
2287define dso_local zeroext i8 @ld_cst_align32_uint8_t_uint64_t() {
2288; CHECK-LABEL: ld_cst_align32_uint8_t_uint64_t:
2289; CHECK:       # %bb.0: # %entry
2290; CHECK-NEXT:    lis r3, 153
2291; CHECK-NEXT:    ld r3, -27108(r3)
2292; CHECK-NEXT:    clrldi r3, r3, 56
2293; CHECK-NEXT:    blr
2294entry:
2295  %0 = load atomic i64, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8
2296  %conv = trunc i64 %0 to i8
2297  ret i8 %conv
2298}
2299
2300; Function Attrs: nofree norecurse nounwind uwtable willreturn
2301define dso_local zeroext i8 @ld_cst_align64_uint8_t_uint64_t() {
2302; CHECK-P10-LABEL: ld_cst_align64_uint8_t_uint64_t:
2303; CHECK-P10:       # %bb.0: # %entry
2304; CHECK-P10-NEXT:    pli r3, 244140625
2305; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2306; CHECK-P10-NEXT:    ld r3, 0(r3)
2307; CHECK-P10-NEXT:    clrldi r3, r3, 56
2308; CHECK-P10-NEXT:    blr
2309;
2310; CHECK-PREP10-LABEL: ld_cst_align64_uint8_t_uint64_t:
2311; CHECK-PREP10:       # %bb.0: # %entry
2312; CHECK-PREP10-NEXT:    lis r3, 3725
2313; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2314; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2315; CHECK-PREP10-NEXT:    ld r3, 0(r3)
2316; CHECK-PREP10-NEXT:    clrldi r3, r3, 56
2317; CHECK-PREP10-NEXT:    blr
2318entry:
2319  %0 = load atomic i64, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
2320  %conv = trunc i64 %0 to i8
2321  ret i8 %conv
2322}
2323
2324; Function Attrs: nofree norecurse nounwind uwtable willreturn
2325define dso_local void @st_0_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
2326; CHECK-LABEL: st_0_uint8_t_uint8_t:
2327; CHECK:       # %bb.0: # %entry
2328; CHECK-NEXT:    stb r4, 0(r3)
2329; CHECK-NEXT:    blr
2330entry:
2331  %0 = inttoptr i64 %ptr to ptr
2332  store atomic i8 %str, ptr %0 monotonic, align 1
2333  ret void
2334}
2335
2336; Function Attrs: nofree norecurse nounwind uwtable willreturn
2337define dso_local void @st_align16_uint8_t_uint8_t(ptr nocapture %ptr, i8 zeroext %str) {
2338; CHECK-LABEL: st_align16_uint8_t_uint8_t:
2339; CHECK:       # %bb.0: # %entry
2340; CHECK-NEXT:    stb r4, 8(r3)
2341; CHECK-NEXT:    blr
2342entry:
2343  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2344  store atomic i8 %str, ptr %add.ptr monotonic, align 1
2345  ret void
2346}
2347
2348; Function Attrs: nofree norecurse nounwind uwtable willreturn
2349define dso_local void @st_align32_uint8_t_uint8_t(ptr nocapture %ptr, i8 zeroext %str) {
2350; CHECK-P10-LABEL: st_align32_uint8_t_uint8_t:
2351; CHECK-P10:       # %bb.0: # %entry
2352; CHECK-P10-NEXT:    pstb r4, 99999000(r3), 0
2353; CHECK-P10-NEXT:    blr
2354;
2355; CHECK-PREP10-LABEL: st_align32_uint8_t_uint8_t:
2356; CHECK-PREP10:       # %bb.0: # %entry
2357; CHECK-PREP10-NEXT:    lis r5, 1525
2358; CHECK-PREP10-NEXT:    ori r5, r5, 56600
2359; CHECK-PREP10-NEXT:    stbx r4, r3, r5
2360; CHECK-PREP10-NEXT:    blr
2361entry:
2362  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2363  store atomic i8 %str, ptr %add.ptr monotonic, align 1
2364  ret void
2365}
2366
2367; Function Attrs: nofree norecurse nounwind uwtable willreturn
2368define dso_local void @st_align64_uint8_t_uint8_t(ptr nocapture %ptr, i8 zeroext %str) {
2369; CHECK-P10-LABEL: st_align64_uint8_t_uint8_t:
2370; CHECK-P10:       # %bb.0: # %entry
2371; CHECK-P10-NEXT:    pli r5, 244140625
2372; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
2373; CHECK-P10-NEXT:    stbx r4, r3, r5
2374; CHECK-P10-NEXT:    blr
2375;
2376; CHECK-PREP10-LABEL: st_align64_uint8_t_uint8_t:
2377; CHECK-PREP10:       # %bb.0: # %entry
2378; CHECK-PREP10-NEXT:    lis r5, 3725
2379; CHECK-PREP10-NEXT:    ori r5, r5, 19025
2380; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
2381; CHECK-PREP10-NEXT:    stbx r4, r3, r5
2382; CHECK-PREP10-NEXT:    blr
2383entry:
2384  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2385  store atomic i8 %str, ptr %add.ptr monotonic, align 1
2386  ret void
2387}
2388
2389; Function Attrs: nofree norecurse nounwind uwtable willreturn
2390define dso_local void @st_reg_uint8_t_uint8_t(ptr nocapture %ptr, i64 %off, i8 zeroext %str) {
2391; CHECK-LABEL: st_reg_uint8_t_uint8_t:
2392; CHECK:       # %bb.0: # %entry
2393; CHECK-NEXT:    stbx r5, r3, r4
2394; CHECK-NEXT:    blr
2395entry:
2396  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2397  store atomic i8 %str, ptr %add.ptr monotonic, align 1
2398  ret void
2399}
2400
2401; Function Attrs: nofree norecurse nounwind uwtable willreturn
2402define dso_local void @st_or1_uint8_t_uint8_t(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
2403; CHECK-LABEL: st_or1_uint8_t_uint8_t:
2404; CHECK:       # %bb.0: # %entry
2405; CHECK-NEXT:    or r3, r4, r3
2406; CHECK-NEXT:    stb r5, 0(r3)
2407; CHECK-NEXT:    blr
2408entry:
2409  %conv = zext i8 %off to i64
2410  %or = or i64 %conv, %ptr
2411  %0 = inttoptr i64 %or to ptr
2412  store atomic i8 %str, ptr %0 monotonic, align 1
2413  ret void
2414}
2415
2416; Function Attrs: nofree norecurse nounwind uwtable willreturn
2417define dso_local void @st_not_disjoint16_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
2418; CHECK-LABEL: st_not_disjoint16_uint8_t_uint8_t:
2419; CHECK:       # %bb.0: # %entry
2420; CHECK-NEXT:    ori r3, r3, 6
2421; CHECK-NEXT:    stb r4, 0(r3)
2422; CHECK-NEXT:    blr
2423entry:
2424  %or = or i64 %ptr, 6
2425  %0 = inttoptr i64 %or to ptr
2426  store atomic i8 %str, ptr %0 monotonic, align 1
2427  ret void
2428}
2429
2430; Function Attrs: nofree norecurse nounwind uwtable willreturn
2431define dso_local void @st_disjoint_align16_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
2432; CHECK-LABEL: st_disjoint_align16_uint8_t_uint8_t:
2433; CHECK:       # %bb.0: # %entry
2434; CHECK-NEXT:    rldicr r3, r3, 0, 51
2435; CHECK-NEXT:    stb r4, 24(r3)
2436; CHECK-NEXT:    blr
2437entry:
2438  %and = and i64 %ptr, -4096
2439  %or = or i64 %and, 24
2440  %0 = inttoptr i64 %or to ptr
2441  store atomic i8 %str, ptr %0 monotonic, align 8
2442  ret void
2443}
2444
2445; Function Attrs: nofree norecurse nounwind uwtable willreturn
2446define dso_local void @st_not_disjoint32_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
2447; CHECK-LABEL: st_not_disjoint32_uint8_t_uint8_t:
2448; CHECK:       # %bb.0: # %entry
2449; CHECK-NEXT:    ori r3, r3, 34463
2450; CHECK-NEXT:    oris r3, r3, 1
2451; CHECK-NEXT:    stb r4, 0(r3)
2452; CHECK-NEXT:    blr
2453entry:
2454  %or = or i64 %ptr, 99999
2455  %0 = inttoptr i64 %or to ptr
2456  store atomic i8 %str, ptr %0 monotonic, align 1
2457  ret void
2458}
2459
2460; Function Attrs: nofree norecurse nounwind uwtable willreturn
2461define dso_local void @st_disjoint_align32_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
2462; CHECK-P10-LABEL: st_disjoint_align32_uint8_t_uint8_t:
2463; CHECK-P10:       # %bb.0: # %entry
2464; CHECK-P10-NEXT:    lis r5, -15264
2465; CHECK-P10-NEXT:    and r3, r3, r5
2466; CHECK-P10-NEXT:    pstb r4, 999990000(r3), 0
2467; CHECK-P10-NEXT:    blr
2468;
2469; CHECK-PREP10-LABEL: st_disjoint_align32_uint8_t_uint8_t:
2470; CHECK-PREP10:       # %bb.0: # %entry
2471; CHECK-PREP10-NEXT:    lis r5, -15264
2472; CHECK-PREP10-NEXT:    and r3, r3, r5
2473; CHECK-PREP10-NEXT:    lis r5, 15258
2474; CHECK-PREP10-NEXT:    ori r5, r5, 41712
2475; CHECK-PREP10-NEXT:    stbx r4, r3, r5
2476; CHECK-PREP10-NEXT:    blr
2477entry:
2478  %and = and i64 %ptr, -1000341504
2479  %or = or i64 %and, 999990000
2480  %0 = inttoptr i64 %or to ptr
2481  store atomic i8 %str, ptr %0 monotonic, align 16
2482  ret void
2483}
2484
2485; Function Attrs: nofree norecurse nounwind uwtable willreturn
2486define dso_local void @st_not_disjoint64_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
2487; CHECK-P10-LABEL: st_not_disjoint64_uint8_t_uint8_t:
2488; CHECK-P10:       # %bb.0: # %entry
2489; CHECK-P10-NEXT:    pli r5, 232
2490; CHECK-P10-NEXT:    pli r6, 3567587329
2491; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
2492; CHECK-P10-NEXT:    or r3, r3, r6
2493; CHECK-P10-NEXT:    stb r4, 0(r3)
2494; CHECK-P10-NEXT:    blr
2495;
2496; CHECK-PREP10-LABEL: st_not_disjoint64_uint8_t_uint8_t:
2497; CHECK-PREP10:       # %bb.0: # %entry
2498; CHECK-PREP10-NEXT:    li r5, 29
2499; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
2500; CHECK-PREP10-NEXT:    oris r5, r5, 54437
2501; CHECK-PREP10-NEXT:    ori r5, r5, 4097
2502; CHECK-PREP10-NEXT:    or r3, r3, r5
2503; CHECK-PREP10-NEXT:    stb r4, 0(r3)
2504; CHECK-PREP10-NEXT:    blr
2505entry:
2506  %or = or i64 %ptr, 1000000000001
2507  %0 = inttoptr i64 %or to ptr
2508  store atomic i8 %str, ptr %0 monotonic, align 1
2509  ret void
2510}
2511
2512; Function Attrs: nofree norecurse nounwind uwtable willreturn
2513define dso_local void @st_disjoint_align64_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
2514; CHECK-P10-LABEL: st_disjoint_align64_uint8_t_uint8_t:
2515; CHECK-P10:       # %bb.0: # %entry
2516; CHECK-P10-NEXT:    pli r5, 244140625
2517; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2518; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
2519; CHECK-P10-NEXT:    stbx r4, r3, r5
2520; CHECK-P10-NEXT:    blr
2521;
2522; CHECK-PREP10-LABEL: st_disjoint_align64_uint8_t_uint8_t:
2523; CHECK-PREP10:       # %bb.0: # %entry
2524; CHECK-PREP10-NEXT:    lis r5, 3725
2525; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2526; CHECK-PREP10-NEXT:    ori r5, r5, 19025
2527; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
2528; CHECK-PREP10-NEXT:    stbx r4, r3, r5
2529; CHECK-PREP10-NEXT:    blr
2530entry:
2531  %and = and i64 %ptr, -1099511627776
2532  %or = or i64 %and, 1000000000000
2533  %0 = inttoptr i64 %or to ptr
2534  store atomic i8 %str, ptr %0 monotonic, align 4096
2535  ret void
2536}
2537
2538; Function Attrs: nofree norecurse nounwind uwtable willreturn
2539define dso_local void @st_cst_align16_uint8_t_uint8_t(i8 zeroext %str) {
2540; CHECK-LABEL: st_cst_align16_uint8_t_uint8_t:
2541; CHECK:       # %bb.0: # %entry
2542; CHECK-NEXT:    stb r3, 4080(0)
2543; CHECK-NEXT:    blr
2544entry:
2545  store atomic i8 %str, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
2546  ret void
2547}
2548
2549; Function Attrs: nofree norecurse nounwind uwtable willreturn
2550define dso_local void @st_cst_align32_uint8_t_uint8_t(i8 zeroext %str) {
2551; CHECK-LABEL: st_cst_align32_uint8_t_uint8_t:
2552; CHECK:       # %bb.0: # %entry
2553; CHECK-NEXT:    lis r4, 153
2554; CHECK-NEXT:    stb r3, -27108(r4)
2555; CHECK-NEXT:    blr
2556entry:
2557  store atomic i8 %str, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
2558  ret void
2559}
2560
2561; Function Attrs: nofree norecurse nounwind uwtable willreturn
2562define dso_local void @st_cst_align64_uint8_t_uint8_t(i8 zeroext %str) {
2563; CHECK-P10-LABEL: st_cst_align64_uint8_t_uint8_t:
2564; CHECK-P10:       # %bb.0: # %entry
2565; CHECK-P10-NEXT:    pli r4, 244140625
2566; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2567; CHECK-P10-NEXT:    stb r3, 0(r4)
2568; CHECK-P10-NEXT:    blr
2569;
2570; CHECK-PREP10-LABEL: st_cst_align64_uint8_t_uint8_t:
2571; CHECK-PREP10:       # %bb.0: # %entry
2572; CHECK-PREP10-NEXT:    lis r4, 3725
2573; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2574; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2575; CHECK-PREP10-NEXT:    stb r3, 0(r4)
2576; CHECK-PREP10-NEXT:    blr
2577entry:
2578  store atomic i8 %str, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
2579  ret void
2580}
2581
2582; Function Attrs: nofree norecurse nounwind uwtable willreturn
2583define dso_local void @st_0_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
2584; CHECK-LABEL: st_0_uint8_t_uint16_t:
2585; CHECK:       # %bb.0: # %entry
2586; CHECK-NEXT:    sth r4, 0(r3)
2587; CHECK-NEXT:    blr
2588entry:
2589  %0 = inttoptr i64 %ptr to ptr
2590  %conv = zext i8 %str to i16
2591  store atomic i16 %conv, ptr %0 monotonic, align 2
2592  ret void
2593}
2594
2595; Function Attrs: nofree norecurse nounwind uwtable willreturn
2596define dso_local void @st_align16_uint8_t_uint16_t(ptr nocapture %ptr, i8 zeroext %str) {
2597; CHECK-LABEL: st_align16_uint8_t_uint16_t:
2598; CHECK:       # %bb.0: # %entry
2599; CHECK-NEXT:    sth r4, 8(r3)
2600; CHECK-NEXT:    blr
2601entry:
2602  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2603  %conv = zext i8 %str to i16
2604  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
2605  ret void
2606}
2607
2608; Function Attrs: nofree norecurse nounwind uwtable willreturn
2609define dso_local void @st_align32_uint8_t_uint16_t(ptr nocapture %ptr, i8 zeroext %str) {
2610; CHECK-P10-LABEL: st_align32_uint8_t_uint16_t:
2611; CHECK-P10:       # %bb.0: # %entry
2612; CHECK-P10-NEXT:    psth r4, 99999000(r3), 0
2613; CHECK-P10-NEXT:    blr
2614;
2615; CHECK-PREP10-LABEL: st_align32_uint8_t_uint16_t:
2616; CHECK-PREP10:       # %bb.0: # %entry
2617; CHECK-PREP10-NEXT:    lis r5, 1525
2618; CHECK-PREP10-NEXT:    ori r5, r5, 56600
2619; CHECK-PREP10-NEXT:    sthx r4, r3, r5
2620; CHECK-PREP10-NEXT:    blr
2621entry:
2622  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2623  %conv = zext i8 %str to i16
2624  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
2625  ret void
2626}
2627
2628; Function Attrs: nofree norecurse nounwind uwtable willreturn
2629define dso_local void @st_align64_uint8_t_uint16_t(ptr nocapture %ptr, i8 zeroext %str) {
2630; CHECK-P10-LABEL: st_align64_uint8_t_uint16_t:
2631; CHECK-P10:       # %bb.0: # %entry
2632; CHECK-P10-NEXT:    pli r5, 244140625
2633; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
2634; CHECK-P10-NEXT:    sthx r4, r3, r5
2635; CHECK-P10-NEXT:    blr
2636;
2637; CHECK-PREP10-LABEL: st_align64_uint8_t_uint16_t:
2638; CHECK-PREP10:       # %bb.0: # %entry
2639; CHECK-PREP10-NEXT:    lis r5, 3725
2640; CHECK-PREP10-NEXT:    ori r5, r5, 19025
2641; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
2642; CHECK-PREP10-NEXT:    sthx r4, r3, r5
2643; CHECK-PREP10-NEXT:    blr
2644entry:
2645  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2646  %conv = zext i8 %str to i16
2647  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
2648  ret void
2649}
2650
2651; Function Attrs: nofree norecurse nounwind uwtable willreturn
2652define dso_local void @st_reg_uint8_t_uint16_t(ptr nocapture %ptr, i64 %off, i8 zeroext %str) {
2653; CHECK-LABEL: st_reg_uint8_t_uint16_t:
2654; CHECK:       # %bb.0: # %entry
2655; CHECK-NEXT:    sthx r5, r3, r4
2656; CHECK-NEXT:    blr
2657entry:
2658  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2659  %conv = zext i8 %str to i16
2660  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
2661  ret void
2662}
2663
2664; Function Attrs: nofree norecurse nounwind uwtable willreturn
2665define dso_local void @st_or1_uint8_t_uint16_t(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
2666; CHECK-LABEL: st_or1_uint8_t_uint16_t:
2667; CHECK:       # %bb.0: # %entry
2668; CHECK-NEXT:    or r3, r4, r3
2669; CHECK-NEXT:    sth r5, 0(r3)
2670; CHECK-NEXT:    blr
2671entry:
2672  %conv = zext i8 %off to i64
2673  %or = or i64 %conv, %ptr
2674  %0 = inttoptr i64 %or to ptr
2675  %conv1 = zext i8 %str to i16
2676  store atomic i16 %conv1, ptr %0 monotonic, align 2
2677  ret void
2678}
2679
2680; Function Attrs: nofree norecurse nounwind uwtable willreturn
2681define dso_local void @st_not_disjoint16_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
2682; CHECK-LABEL: st_not_disjoint16_uint8_t_uint16_t:
2683; CHECK:       # %bb.0: # %entry
2684; CHECK-NEXT:    ori r3, r3, 6
2685; CHECK-NEXT:    sth r4, 0(r3)
2686; CHECK-NEXT:    blr
2687entry:
2688  %or = or i64 %ptr, 6
2689  %0 = inttoptr i64 %or to ptr
2690  %conv = zext i8 %str to i16
2691  store atomic i16 %conv, ptr %0 monotonic, align 2
2692  ret void
2693}
2694
2695; Function Attrs: nofree norecurse nounwind uwtable willreturn
2696define dso_local void @st_disjoint_align16_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
2697; CHECK-LABEL: st_disjoint_align16_uint8_t_uint16_t:
2698; CHECK:       # %bb.0: # %entry
2699; CHECK-NEXT:    rldicr r3, r3, 0, 51
2700; CHECK-NEXT:    sth r4, 24(r3)
2701; CHECK-NEXT:    blr
2702entry:
2703  %and = and i64 %ptr, -4096
2704  %or = or i64 %and, 24
2705  %0 = inttoptr i64 %or to ptr
2706  %conv = zext i8 %str to i16
2707  store atomic i16 %conv, ptr %0 monotonic, align 8
2708  ret void
2709}
2710
2711; Function Attrs: nofree norecurse nounwind uwtable willreturn
2712define dso_local void @st_not_disjoint32_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
2713; CHECK-LABEL: st_not_disjoint32_uint8_t_uint16_t:
2714; CHECK:       # %bb.0: # %entry
2715; CHECK-NEXT:    ori r3, r3, 34463
2716; CHECK-NEXT:    oris r3, r3, 1
2717; CHECK-NEXT:    sth r4, 0(r3)
2718; CHECK-NEXT:    blr
2719entry:
2720  %or = or i64 %ptr, 99999
2721  %0 = inttoptr i64 %or to ptr
2722  %conv = zext i8 %str to i16
2723  store atomic i16 %conv, ptr %0 monotonic, align 2
2724  ret void
2725}
2726
2727; Function Attrs: nofree norecurse nounwind uwtable willreturn
2728define dso_local void @st_disjoint_align32_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
2729; CHECK-P10-LABEL: st_disjoint_align32_uint8_t_uint16_t:
2730; CHECK-P10:       # %bb.0: # %entry
2731; CHECK-P10-NEXT:    lis r5, -15264
2732; CHECK-P10-NEXT:    and r3, r3, r5
2733; CHECK-P10-NEXT:    psth r4, 999990000(r3), 0
2734; CHECK-P10-NEXT:    blr
2735;
2736; CHECK-PREP10-LABEL: st_disjoint_align32_uint8_t_uint16_t:
2737; CHECK-PREP10:       # %bb.0: # %entry
2738; CHECK-PREP10-NEXT:    lis r5, -15264
2739; CHECK-PREP10-NEXT:    and r3, r3, r5
2740; CHECK-PREP10-NEXT:    lis r5, 15258
2741; CHECK-PREP10-NEXT:    ori r5, r5, 41712
2742; CHECK-PREP10-NEXT:    sthx r4, r3, r5
2743; CHECK-PREP10-NEXT:    blr
2744entry:
2745  %and = and i64 %ptr, -1000341504
2746  %or = or i64 %and, 999990000
2747  %0 = inttoptr i64 %or to ptr
2748  %conv = zext i8 %str to i16
2749  store atomic i16 %conv, ptr %0 monotonic, align 16
2750  ret void
2751}
2752
2753; Function Attrs: nofree norecurse nounwind uwtable willreturn
2754define dso_local void @st_not_disjoint64_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
2755; CHECK-P10-LABEL: st_not_disjoint64_uint8_t_uint16_t:
2756; CHECK-P10:       # %bb.0: # %entry
2757; CHECK-P10-NEXT:    pli r5, 232
2758; CHECK-P10-NEXT:    pli r6, 3567587329
2759; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
2760; CHECK-P10-NEXT:    or r3, r3, r6
2761; CHECK-P10-NEXT:    sth r4, 0(r3)
2762; CHECK-P10-NEXT:    blr
2763;
2764; CHECK-PREP10-LABEL: st_not_disjoint64_uint8_t_uint16_t:
2765; CHECK-PREP10:       # %bb.0: # %entry
2766; CHECK-PREP10-NEXT:    li r5, 29
2767; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
2768; CHECK-PREP10-NEXT:    oris r5, r5, 54437
2769; CHECK-PREP10-NEXT:    ori r5, r5, 4097
2770; CHECK-PREP10-NEXT:    or r3, r3, r5
2771; CHECK-PREP10-NEXT:    sth r4, 0(r3)
2772; CHECK-PREP10-NEXT:    blr
2773entry:
2774  %or = or i64 %ptr, 1000000000001
2775  %0 = inttoptr i64 %or to ptr
2776  %conv = zext i8 %str to i16
2777  store atomic i16 %conv, ptr %0 monotonic, align 2
2778  ret void
2779}
2780
2781; Function Attrs: nofree norecurse nounwind uwtable willreturn
2782define dso_local void @st_disjoint_align64_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
2783; CHECK-P10-LABEL: st_disjoint_align64_uint8_t_uint16_t:
2784; CHECK-P10:       # %bb.0: # %entry
2785; CHECK-P10-NEXT:    pli r5, 244140625
2786; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2787; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
2788; CHECK-P10-NEXT:    sthx r4, r3, r5
2789; CHECK-P10-NEXT:    blr
2790;
2791; CHECK-PREP10-LABEL: st_disjoint_align64_uint8_t_uint16_t:
2792; CHECK-PREP10:       # %bb.0: # %entry
2793; CHECK-PREP10-NEXT:    lis r5, 3725
2794; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2795; CHECK-PREP10-NEXT:    ori r5, r5, 19025
2796; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
2797; CHECK-PREP10-NEXT:    sthx r4, r3, r5
2798; CHECK-PREP10-NEXT:    blr
2799entry:
2800  %and = and i64 %ptr, -1099511627776
2801  %or = or i64 %and, 1000000000000
2802  %0 = inttoptr i64 %or to ptr
2803  %conv = zext i8 %str to i16
2804  store atomic i16 %conv, ptr %0 monotonic, align 4096
2805  ret void
2806}
2807
2808; Function Attrs: nofree norecurse nounwind uwtable willreturn
2809define dso_local void @st_cst_align16_uint8_t_uint16_t(i8 zeroext %str) {
2810; CHECK-LABEL: st_cst_align16_uint8_t_uint16_t:
2811; CHECK:       # %bb.0: # %entry
2812; CHECK-NEXT:    sth r3, 4080(0)
2813; CHECK-NEXT:    blr
2814entry:
2815  %conv = zext i8 %str to i16
2816  store atomic i16 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
2817  ret void
2818}
2819
2820; Function Attrs: nofree norecurse nounwind uwtable willreturn
2821define dso_local void @st_cst_align32_uint8_t_uint16_t(i8 zeroext %str) {
2822; CHECK-LABEL: st_cst_align32_uint8_t_uint16_t:
2823; CHECK:       # %bb.0: # %entry
2824; CHECK-NEXT:    lis r4, 153
2825; CHECK-NEXT:    sth r3, -27108(r4)
2826; CHECK-NEXT:    blr
2827entry:
2828  %conv = zext i8 %str to i16
2829  store atomic i16 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
2830  ret void
2831}
2832
2833; Function Attrs: nofree norecurse nounwind uwtable willreturn
2834define dso_local void @st_cst_align64_uint8_t_uint16_t(i8 zeroext %str) {
2835; CHECK-P10-LABEL: st_cst_align64_uint8_t_uint16_t:
2836; CHECK-P10:       # %bb.0: # %entry
2837; CHECK-P10-NEXT:    pli r4, 244140625
2838; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2839; CHECK-P10-NEXT:    sth r3, 0(r4)
2840; CHECK-P10-NEXT:    blr
2841;
2842; CHECK-PREP10-LABEL: st_cst_align64_uint8_t_uint16_t:
2843; CHECK-PREP10:       # %bb.0: # %entry
2844; CHECK-PREP10-NEXT:    lis r4, 3725
2845; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2846; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2847; CHECK-PREP10-NEXT:    sth r3, 0(r4)
2848; CHECK-PREP10-NEXT:    blr
2849entry:
2850  %conv = zext i8 %str to i16
2851  store atomic i16 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
2852  ret void
2853}
2854
2855; Function Attrs: nofree norecurse nounwind uwtable willreturn
2856define dso_local void @st_0_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
2857; CHECK-LABEL: st_0_uint8_t_uint32_t:
2858; CHECK:       # %bb.0: # %entry
2859; CHECK-NEXT:    stw r4, 0(r3)
2860; CHECK-NEXT:    blr
2861entry:
2862  %0 = inttoptr i64 %ptr to ptr
2863  %conv = zext i8 %str to i32
2864  store atomic i32 %conv, ptr %0 monotonic, align 4
2865  ret void
2866}
2867
2868; Function Attrs: nofree norecurse nounwind uwtable willreturn
2869define dso_local void @st_align16_uint8_t_uint32_t(ptr nocapture %ptr, i8 zeroext %str) {
2870; CHECK-LABEL: st_align16_uint8_t_uint32_t:
2871; CHECK:       # %bb.0: # %entry
2872; CHECK-NEXT:    stw r4, 8(r3)
2873; CHECK-NEXT:    blr
2874entry:
2875  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2876  %conv = zext i8 %str to i32
2877  store atomic i32 %conv, ptr %add.ptr monotonic, align 4
2878  ret void
2879}
2880
2881; Function Attrs: nofree norecurse nounwind uwtable willreturn
2882define dso_local void @st_align32_uint8_t_uint32_t(ptr nocapture %ptr, i8 zeroext %str) {
2883; CHECK-P10-LABEL: st_align32_uint8_t_uint32_t:
2884; CHECK-P10:       # %bb.0: # %entry
2885; CHECK-P10-NEXT:    pstw r4, 99999000(r3), 0
2886; CHECK-P10-NEXT:    blr
2887;
2888; CHECK-PREP10-LABEL: st_align32_uint8_t_uint32_t:
2889; CHECK-PREP10:       # %bb.0: # %entry
2890; CHECK-PREP10-NEXT:    lis r5, 1525
2891; CHECK-PREP10-NEXT:    ori r5, r5, 56600
2892; CHECK-PREP10-NEXT:    stwx r4, r3, r5
2893; CHECK-PREP10-NEXT:    blr
2894entry:
2895  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2896  %conv = zext i8 %str to i32
2897  store atomic i32 %conv, ptr %add.ptr monotonic, align 4
2898  ret void
2899}
2900
2901; Function Attrs: nofree norecurse nounwind uwtable willreturn
2902define dso_local void @st_align64_uint8_t_uint32_t(ptr nocapture %ptr, i8 zeroext %str) {
2903; CHECK-P10-LABEL: st_align64_uint8_t_uint32_t:
2904; CHECK-P10:       # %bb.0: # %entry
2905; CHECK-P10-NEXT:    pli r5, 244140625
2906; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
2907; CHECK-P10-NEXT:    stwx r4, r3, r5
2908; CHECK-P10-NEXT:    blr
2909;
2910; CHECK-PREP10-LABEL: st_align64_uint8_t_uint32_t:
2911; CHECK-PREP10:       # %bb.0: # %entry
2912; CHECK-PREP10-NEXT:    lis r5, 3725
2913; CHECK-PREP10-NEXT:    ori r5, r5, 19025
2914; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
2915; CHECK-PREP10-NEXT:    stwx r4, r3, r5
2916; CHECK-PREP10-NEXT:    blr
2917entry:
2918  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2919  %conv = zext i8 %str to i32
2920  store atomic i32 %conv, ptr %add.ptr monotonic, align 4
2921  ret void
2922}
2923
2924; Function Attrs: nofree norecurse nounwind uwtable willreturn
2925define dso_local void @st_reg_uint8_t_uint32_t(ptr nocapture %ptr, i64 %off, i8 zeroext %str) {
2926; CHECK-LABEL: st_reg_uint8_t_uint32_t:
2927; CHECK:       # %bb.0: # %entry
2928; CHECK-NEXT:    stwx r5, r3, r4
2929; CHECK-NEXT:    blr
2930entry:
2931  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2932  %conv = zext i8 %str to i32
2933  store atomic i32 %conv, ptr %add.ptr monotonic, align 4
2934  ret void
2935}
2936
2937; Function Attrs: nofree norecurse nounwind uwtable willreturn
2938define dso_local void @st_or1_uint8_t_uint32_t(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
2939; CHECK-LABEL: st_or1_uint8_t_uint32_t:
2940; CHECK:       # %bb.0: # %entry
2941; CHECK-NEXT:    or r3, r4, r3
2942; CHECK-NEXT:    stw r5, 0(r3)
2943; CHECK-NEXT:    blr
2944entry:
2945  %conv = zext i8 %off to i64
2946  %or = or i64 %conv, %ptr
2947  %0 = inttoptr i64 %or to ptr
2948  %conv1 = zext i8 %str to i32
2949  store atomic i32 %conv1, ptr %0 monotonic, align 4
2950  ret void
2951}
2952
2953; Function Attrs: nofree norecurse nounwind uwtable willreturn
2954define dso_local void @st_not_disjoint16_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
2955; CHECK-LABEL: st_not_disjoint16_uint8_t_uint32_t:
2956; CHECK:       # %bb.0: # %entry
2957; CHECK-NEXT:    ori r3, r3, 6
2958; CHECK-NEXT:    stw r4, 0(r3)
2959; CHECK-NEXT:    blr
2960entry:
2961  %or = or i64 %ptr, 6
2962  %0 = inttoptr i64 %or to ptr
2963  %conv = zext i8 %str to i32
2964  store atomic i32 %conv, ptr %0 monotonic, align 4
2965  ret void
2966}
2967
2968; Function Attrs: nofree norecurse nounwind uwtable willreturn
2969define dso_local void @st_disjoint_align16_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
2970; CHECK-LABEL: st_disjoint_align16_uint8_t_uint32_t:
2971; CHECK:       # %bb.0: # %entry
2972; CHECK-NEXT:    rldicr r3, r3, 0, 51
2973; CHECK-NEXT:    stw r4, 24(r3)
2974; CHECK-NEXT:    blr
2975entry:
2976  %and = and i64 %ptr, -4096
2977  %or = or i64 %and, 24
2978  %0 = inttoptr i64 %or to ptr
2979  %conv = zext i8 %str to i32
2980  store atomic i32 %conv, ptr %0 monotonic, align 8
2981  ret void
2982}
2983
2984; Function Attrs: nofree norecurse nounwind uwtable willreturn
2985define dso_local void @st_not_disjoint32_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
2986; CHECK-LABEL: st_not_disjoint32_uint8_t_uint32_t:
2987; CHECK:       # %bb.0: # %entry
2988; CHECK-NEXT:    ori r3, r3, 34463
2989; CHECK-NEXT:    oris r3, r3, 1
2990; CHECK-NEXT:    stw r4, 0(r3)
2991; CHECK-NEXT:    blr
2992entry:
2993  %or = or i64 %ptr, 99999
2994  %0 = inttoptr i64 %or to ptr
2995  %conv = zext i8 %str to i32
2996  store atomic i32 %conv, ptr %0 monotonic, align 4
2997  ret void
2998}
2999
3000; Function Attrs: nofree norecurse nounwind uwtable willreturn
3001define dso_local void @st_disjoint_align32_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
3002; CHECK-P10-LABEL: st_disjoint_align32_uint8_t_uint32_t:
3003; CHECK-P10:       # %bb.0: # %entry
3004; CHECK-P10-NEXT:    lis r5, -15264
3005; CHECK-P10-NEXT:    and r3, r3, r5
3006; CHECK-P10-NEXT:    pstw r4, 999990000(r3), 0
3007; CHECK-P10-NEXT:    blr
3008;
3009; CHECK-PREP10-LABEL: st_disjoint_align32_uint8_t_uint32_t:
3010; CHECK-PREP10:       # %bb.0: # %entry
3011; CHECK-PREP10-NEXT:    lis r5, -15264
3012; CHECK-PREP10-NEXT:    and r3, r3, r5
3013; CHECK-PREP10-NEXT:    lis r5, 15258
3014; CHECK-PREP10-NEXT:    ori r5, r5, 41712
3015; CHECK-PREP10-NEXT:    stwx r4, r3, r5
3016; CHECK-PREP10-NEXT:    blr
3017entry:
3018  %and = and i64 %ptr, -1000341504
3019  %or = or i64 %and, 999990000
3020  %0 = inttoptr i64 %or to ptr
3021  %conv = zext i8 %str to i32
3022  store atomic i32 %conv, ptr %0 monotonic, align 16
3023  ret void
3024}
3025
3026; Function Attrs: nofree norecurse nounwind uwtable willreturn
3027define dso_local void @st_not_disjoint64_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
3028; CHECK-P10-LABEL: st_not_disjoint64_uint8_t_uint32_t:
3029; CHECK-P10:       # %bb.0: # %entry
3030; CHECK-P10-NEXT:    pli r5, 232
3031; CHECK-P10-NEXT:    pli r6, 3567587329
3032; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
3033; CHECK-P10-NEXT:    or r3, r3, r6
3034; CHECK-P10-NEXT:    stw r4, 0(r3)
3035; CHECK-P10-NEXT:    blr
3036;
3037; CHECK-PREP10-LABEL: st_not_disjoint64_uint8_t_uint32_t:
3038; CHECK-PREP10:       # %bb.0: # %entry
3039; CHECK-PREP10-NEXT:    li r5, 29
3040; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
3041; CHECK-PREP10-NEXT:    oris r5, r5, 54437
3042; CHECK-PREP10-NEXT:    ori r5, r5, 4097
3043; CHECK-PREP10-NEXT:    or r3, r3, r5
3044; CHECK-PREP10-NEXT:    stw r4, 0(r3)
3045; CHECK-PREP10-NEXT:    blr
3046entry:
3047  %or = or i64 %ptr, 1000000000001
3048  %0 = inttoptr i64 %or to ptr
3049  %conv = zext i8 %str to i32
3050  store atomic i32 %conv, ptr %0 monotonic, align 4
3051  ret void
3052}
3053
3054; Function Attrs: nofree norecurse nounwind uwtable willreturn
3055define dso_local void @st_disjoint_align64_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
3056; CHECK-P10-LABEL: st_disjoint_align64_uint8_t_uint32_t:
3057; CHECK-P10:       # %bb.0: # %entry
3058; CHECK-P10-NEXT:    pli r5, 244140625
3059; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3060; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
3061; CHECK-P10-NEXT:    stwx r4, r3, r5
3062; CHECK-P10-NEXT:    blr
3063;
3064; CHECK-PREP10-LABEL: st_disjoint_align64_uint8_t_uint32_t:
3065; CHECK-PREP10:       # %bb.0: # %entry
3066; CHECK-PREP10-NEXT:    lis r5, 3725
3067; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3068; CHECK-PREP10-NEXT:    ori r5, r5, 19025
3069; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
3070; CHECK-PREP10-NEXT:    stwx r4, r3, r5
3071; CHECK-PREP10-NEXT:    blr
3072entry:
3073  %and = and i64 %ptr, -1099511627776
3074  %or = or i64 %and, 1000000000000
3075  %0 = inttoptr i64 %or to ptr
3076  %conv = zext i8 %str to i32
3077  store atomic i32 %conv, ptr %0 monotonic, align 4096
3078  ret void
3079}
3080
3081; Function Attrs: nofree norecurse nounwind uwtable willreturn
3082define dso_local void @st_cst_align16_uint8_t_uint32_t(i8 zeroext %str) {
3083; CHECK-LABEL: st_cst_align16_uint8_t_uint32_t:
3084; CHECK:       # %bb.0: # %entry
3085; CHECK-NEXT:    stw r3, 4080(0)
3086; CHECK-NEXT:    blr
3087entry:
3088  %conv = zext i8 %str to i32
3089  store atomic i32 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
3090  ret void
3091}
3092
3093; Function Attrs: nofree norecurse nounwind uwtable willreturn
3094define dso_local void @st_cst_align32_uint8_t_uint32_t(i8 zeroext %str) {
3095; CHECK-LABEL: st_cst_align32_uint8_t_uint32_t:
3096; CHECK:       # %bb.0: # %entry
3097; CHECK-NEXT:    lis r4, 153
3098; CHECK-NEXT:    stw r3, -27108(r4)
3099; CHECK-NEXT:    blr
3100entry:
3101  %conv = zext i8 %str to i32
3102  store atomic i32 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
3103  ret void
3104}
3105
3106; Function Attrs: nofree norecurse nounwind uwtable willreturn
3107define dso_local void @st_cst_align64_uint8_t_uint32_t(i8 zeroext %str) {
3108; CHECK-P10-LABEL: st_cst_align64_uint8_t_uint32_t:
3109; CHECK-P10:       # %bb.0: # %entry
3110; CHECK-P10-NEXT:    pli r4, 244140625
3111; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3112; CHECK-P10-NEXT:    stw r3, 0(r4)
3113; CHECK-P10-NEXT:    blr
3114;
3115; CHECK-PREP10-LABEL: st_cst_align64_uint8_t_uint32_t:
3116; CHECK-PREP10:       # %bb.0: # %entry
3117; CHECK-PREP10-NEXT:    lis r4, 3725
3118; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3119; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3120; CHECK-PREP10-NEXT:    stw r3, 0(r4)
3121; CHECK-PREP10-NEXT:    blr
3122entry:
3123  %conv = zext i8 %str to i32
3124  store atomic i32 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
3125  ret void
3126}
3127
3128; Function Attrs: nofree norecurse nounwind uwtable willreturn
3129define dso_local void @st_0_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
3130; CHECK-LABEL: st_0_uint8_t_uint64_t:
3131; CHECK:       # %bb.0: # %entry
3132; CHECK-NEXT:    std r4, 0(r3)
3133; CHECK-NEXT:    blr
3134entry:
3135  %0 = inttoptr i64 %ptr to ptr
3136  %conv = zext i8 %str to i64
3137  store atomic i64 %conv, ptr %0 monotonic, align 8
3138  ret void
3139}
3140
3141; Function Attrs: nofree norecurse nounwind uwtable willreturn
3142define dso_local void @st_align16_uint8_t_uint64_t(ptr nocapture %ptr, i8 zeroext %str) {
3143; CHECK-LABEL: st_align16_uint8_t_uint64_t:
3144; CHECK:       # %bb.0: # %entry
3145; CHECK-NEXT:    std r4, 8(r3)
3146; CHECK-NEXT:    blr
3147entry:
3148  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3149  %conv = zext i8 %str to i64
3150  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
3151  ret void
3152}
3153
3154; Function Attrs: nofree norecurse nounwind uwtable willreturn
3155define dso_local void @st_align32_uint8_t_uint64_t(ptr nocapture %ptr, i8 zeroext %str) {
3156; CHECK-P10-LABEL: st_align32_uint8_t_uint64_t:
3157; CHECK-P10:       # %bb.0: # %entry
3158; CHECK-P10-NEXT:    pstd r4, 99999000(r3), 0
3159; CHECK-P10-NEXT:    blr
3160;
3161; CHECK-PREP10-LABEL: st_align32_uint8_t_uint64_t:
3162; CHECK-PREP10:       # %bb.0: # %entry
3163; CHECK-PREP10-NEXT:    lis r5, 1525
3164; CHECK-PREP10-NEXT:    ori r5, r5, 56600
3165; CHECK-PREP10-NEXT:    stdx r4, r3, r5
3166; CHECK-PREP10-NEXT:    blr
3167entry:
3168  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3169  %conv = zext i8 %str to i64
3170  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
3171  ret void
3172}
3173
3174; Function Attrs: nofree norecurse nounwind uwtable willreturn
3175define dso_local void @st_align64_uint8_t_uint64_t(ptr nocapture %ptr, i8 zeroext %str) {
3176; CHECK-P10-LABEL: st_align64_uint8_t_uint64_t:
3177; CHECK-P10:       # %bb.0: # %entry
3178; CHECK-P10-NEXT:    pli r5, 244140625
3179; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
3180; CHECK-P10-NEXT:    stdx r4, r3, r5
3181; CHECK-P10-NEXT:    blr
3182;
3183; CHECK-PREP10-LABEL: st_align64_uint8_t_uint64_t:
3184; CHECK-PREP10:       # %bb.0: # %entry
3185; CHECK-PREP10-NEXT:    lis r5, 3725
3186; CHECK-PREP10-NEXT:    ori r5, r5, 19025
3187; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
3188; CHECK-PREP10-NEXT:    stdx r4, r3, r5
3189; CHECK-PREP10-NEXT:    blr
3190entry:
3191  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3192  %conv = zext i8 %str to i64
3193  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
3194  ret void
3195}
3196
3197; Function Attrs: nofree norecurse nounwind uwtable willreturn
3198define dso_local void @st_reg_uint8_t_uint64_t(ptr nocapture %ptr, i64 %off, i8 zeroext %str) {
3199; CHECK-LABEL: st_reg_uint8_t_uint64_t:
3200; CHECK:       # %bb.0: # %entry
3201; CHECK-NEXT:    stdx r5, r3, r4
3202; CHECK-NEXT:    blr
3203entry:
3204  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3205  %conv = zext i8 %str to i64
3206  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
3207  ret void
3208}
3209
3210; Function Attrs: nofree norecurse nounwind uwtable willreturn
3211define dso_local void @st_or1_uint8_t_uint64_t(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
3212; CHECK-LABEL: st_or1_uint8_t_uint64_t:
3213; CHECK:       # %bb.0: # %entry
3214; CHECK-NEXT:    or r3, r4, r3
3215; CHECK-NEXT:    std r5, 0(r3)
3216; CHECK-NEXT:    blr
3217entry:
3218  %conv = zext i8 %off to i64
3219  %or = or i64 %conv, %ptr
3220  %0 = inttoptr i64 %or to ptr
3221  %conv1 = zext i8 %str to i64
3222  store atomic i64 %conv1, ptr %0 monotonic, align 8
3223  ret void
3224}
3225
3226; Function Attrs: nofree norecurse nounwind uwtable willreturn
3227define dso_local void @st_not_disjoint16_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
3228; CHECK-LABEL: st_not_disjoint16_uint8_t_uint64_t:
3229; CHECK:       # %bb.0: # %entry
3230; CHECK-NEXT:    ori r3, r3, 6
3231; CHECK-NEXT:    std r4, 0(r3)
3232; CHECK-NEXT:    blr
3233entry:
3234  %or = or i64 %ptr, 6
3235  %0 = inttoptr i64 %or to ptr
3236  %conv = zext i8 %str to i64
3237  store atomic i64 %conv, ptr %0 monotonic, align 8
3238  ret void
3239}
3240
3241; Function Attrs: nofree norecurse nounwind uwtable willreturn
3242define dso_local void @st_disjoint_align16_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
3243; CHECK-LABEL: st_disjoint_align16_uint8_t_uint64_t:
3244; CHECK:       # %bb.0: # %entry
3245; CHECK-NEXT:    rldicr r3, r3, 0, 51
3246; CHECK-NEXT:    std r4, 24(r3)
3247; CHECK-NEXT:    blr
3248entry:
3249  %and = and i64 %ptr, -4096
3250  %or = or i64 %and, 24
3251  %0 = inttoptr i64 %or to ptr
3252  %conv = zext i8 %str to i64
3253  store atomic i64 %conv, ptr %0 monotonic, align 8
3254  ret void
3255}
3256
3257; Function Attrs: nofree norecurse nounwind uwtable willreturn
3258define dso_local void @st_not_disjoint32_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
3259; CHECK-LABEL: st_not_disjoint32_uint8_t_uint64_t:
3260; CHECK:       # %bb.0: # %entry
3261; CHECK-NEXT:    ori r3, r3, 34463
3262; CHECK-NEXT:    oris r3, r3, 1
3263; CHECK-NEXT:    std r4, 0(r3)
3264; CHECK-NEXT:    blr
3265entry:
3266  %or = or i64 %ptr, 99999
3267  %0 = inttoptr i64 %or to ptr
3268  %conv = zext i8 %str to i64
3269  store atomic i64 %conv, ptr %0 monotonic, align 8
3270  ret void
3271}
3272
3273; Function Attrs: nofree norecurse nounwind uwtable willreturn
3274define dso_local void @st_disjoint_align32_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
3275; CHECK-P10-LABEL: st_disjoint_align32_uint8_t_uint64_t:
3276; CHECK-P10:       # %bb.0: # %entry
3277; CHECK-P10-NEXT:    lis r5, -15264
3278; CHECK-P10-NEXT:    and r3, r3, r5
3279; CHECK-P10-NEXT:    pstd r4, 999990000(r3), 0
3280; CHECK-P10-NEXT:    blr
3281;
3282; CHECK-PREP10-LABEL: st_disjoint_align32_uint8_t_uint64_t:
3283; CHECK-PREP10:       # %bb.0: # %entry
3284; CHECK-PREP10-NEXT:    lis r5, -15264
3285; CHECK-PREP10-NEXT:    and r3, r3, r5
3286; CHECK-PREP10-NEXT:    lis r5, 15258
3287; CHECK-PREP10-NEXT:    ori r5, r5, 41712
3288; CHECK-PREP10-NEXT:    stdx r4, r3, r5
3289; CHECK-PREP10-NEXT:    blr
3290entry:
3291  %and = and i64 %ptr, -1000341504
3292  %or = or i64 %and, 999990000
3293  %0 = inttoptr i64 %or to ptr
3294  %conv = zext i8 %str to i64
3295  store atomic i64 %conv, ptr %0 monotonic, align 16
3296  ret void
3297}
3298
3299; Function Attrs: nofree norecurse nounwind uwtable willreturn
3300define dso_local void @st_not_disjoint64_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
3301; CHECK-P10-LABEL: st_not_disjoint64_uint8_t_uint64_t:
3302; CHECK-P10:       # %bb.0: # %entry
3303; CHECK-P10-NEXT:    pli r5, 232
3304; CHECK-P10-NEXT:    pli r6, 3567587329
3305; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
3306; CHECK-P10-NEXT:    or r3, r3, r6
3307; CHECK-P10-NEXT:    std r4, 0(r3)
3308; CHECK-P10-NEXT:    blr
3309;
3310; CHECK-PREP10-LABEL: st_not_disjoint64_uint8_t_uint64_t:
3311; CHECK-PREP10:       # %bb.0: # %entry
3312; CHECK-PREP10-NEXT:    li r5, 29
3313; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
3314; CHECK-PREP10-NEXT:    oris r5, r5, 54437
3315; CHECK-PREP10-NEXT:    ori r5, r5, 4097
3316; CHECK-PREP10-NEXT:    or r3, r3, r5
3317; CHECK-PREP10-NEXT:    std r4, 0(r3)
3318; CHECK-PREP10-NEXT:    blr
3319entry:
3320  %or = or i64 %ptr, 1000000000001
3321  %0 = inttoptr i64 %or to ptr
3322  %conv = zext i8 %str to i64
3323  store atomic i64 %conv, ptr %0 monotonic, align 8
3324  ret void
3325}
3326
3327; Function Attrs: nofree norecurse nounwind uwtable willreturn
3328define dso_local void @st_disjoint_align64_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
3329; CHECK-P10-LABEL: st_disjoint_align64_uint8_t_uint64_t:
3330; CHECK-P10:       # %bb.0: # %entry
3331; CHECK-P10-NEXT:    pli r5, 244140625
3332; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3333; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
3334; CHECK-P10-NEXT:    stdx r4, r3, r5
3335; CHECK-P10-NEXT:    blr
3336;
3337; CHECK-PREP10-LABEL: st_disjoint_align64_uint8_t_uint64_t:
3338; CHECK-PREP10:       # %bb.0: # %entry
3339; CHECK-PREP10-NEXT:    lis r5, 3725
3340; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3341; CHECK-PREP10-NEXT:    ori r5, r5, 19025
3342; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
3343; CHECK-PREP10-NEXT:    stdx r4, r3, r5
3344; CHECK-PREP10-NEXT:    blr
3345entry:
3346  %and = and i64 %ptr, -1099511627776
3347  %or = or i64 %and, 1000000000000
3348  %0 = inttoptr i64 %or to ptr
3349  %conv = zext i8 %str to i64
3350  store atomic i64 %conv, ptr %0 monotonic, align 4096
3351  ret void
3352}
3353
3354; Function Attrs: nofree norecurse nounwind uwtable willreturn
3355define dso_local void @st_cst_align16_uint8_t_uint64_t(i8 zeroext %str) {
3356; CHECK-LABEL: st_cst_align16_uint8_t_uint64_t:
3357; CHECK:       # %bb.0: # %entry
3358; CHECK-NEXT:    std r3, 4080(0)
3359; CHECK-NEXT:    blr
3360entry:
3361  %conv = zext i8 %str to i64
3362  store atomic i64 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
3363  ret void
3364}
3365
3366; Function Attrs: nofree norecurse nounwind uwtable willreturn
3367define dso_local void @st_cst_align32_uint8_t_uint64_t(i8 zeroext %str) {
3368; CHECK-LABEL: st_cst_align32_uint8_t_uint64_t:
3369; CHECK:       # %bb.0: # %entry
3370; CHECK-NEXT:    lis r4, 153
3371; CHECK-NEXT:    std r3, -27108(r4)
3372; CHECK-NEXT:    blr
3373entry:
3374  %conv = zext i8 %str to i64
3375  store atomic i64 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8
3376  ret void
3377}
3378
3379; Function Attrs: nofree norecurse nounwind uwtable willreturn
3380define dso_local void @st_cst_align64_uint8_t_uint64_t(i8 zeroext %str) {
3381; CHECK-P10-LABEL: st_cst_align64_uint8_t_uint64_t:
3382; CHECK-P10:       # %bb.0: # %entry
3383; CHECK-P10-NEXT:    pli r4, 244140625
3384; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3385; CHECK-P10-NEXT:    std r3, 0(r4)
3386; CHECK-P10-NEXT:    blr
3387;
3388; CHECK-PREP10-LABEL: st_cst_align64_uint8_t_uint64_t:
3389; CHECK-PREP10:       # %bb.0: # %entry
3390; CHECK-PREP10-NEXT:    lis r4, 3725
3391; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3392; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3393; CHECK-PREP10-NEXT:    std r3, 0(r4)
3394; CHECK-PREP10-NEXT:    blr
3395entry:
3396  %conv = zext i8 %str to i64
3397  store atomic i64 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
3398  ret void
3399}
3400
3401; Function Attrs: nofree norecurse nounwind uwtable willreturn
3402define dso_local void @st_0_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
3403; CHECK-LABEL: st_0_int8_t_uint16_t:
3404; CHECK:       # %bb.0: # %entry
3405; CHECK-NEXT:    sth r4, 0(r3)
3406; CHECK-NEXT:    blr
3407entry:
3408  %0 = inttoptr i64 %ptr to ptr
3409  %conv = sext i8 %str to i16
3410  store atomic i16 %conv, ptr %0 monotonic, align 2
3411  ret void
3412}
3413
3414; Function Attrs: nofree norecurse nounwind uwtable willreturn
3415define dso_local void @st_align16_int8_t_uint16_t(ptr nocapture %ptr, i8 signext %str) {
3416; CHECK-LABEL: st_align16_int8_t_uint16_t:
3417; CHECK:       # %bb.0: # %entry
3418; CHECK-NEXT:    sth r4, 8(r3)
3419; CHECK-NEXT:    blr
3420entry:
3421  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3422  %conv = sext i8 %str to i16
3423  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
3424  ret void
3425}
3426
3427; Function Attrs: nofree norecurse nounwind uwtable willreturn
3428define dso_local void @st_align32_int8_t_uint16_t(ptr nocapture %ptr, i8 signext %str) {
3429; CHECK-P10-LABEL: st_align32_int8_t_uint16_t:
3430; CHECK-P10:       # %bb.0: # %entry
3431; CHECK-P10-NEXT:    psth r4, 99999000(r3), 0
3432; CHECK-P10-NEXT:    blr
3433;
3434; CHECK-PREP10-LABEL: st_align32_int8_t_uint16_t:
3435; CHECK-PREP10:       # %bb.0: # %entry
3436; CHECK-PREP10-NEXT:    lis r5, 1525
3437; CHECK-PREP10-NEXT:    ori r5, r5, 56600
3438; CHECK-PREP10-NEXT:    sthx r4, r3, r5
3439; CHECK-PREP10-NEXT:    blr
3440entry:
3441  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3442  %conv = sext i8 %str to i16
3443  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
3444  ret void
3445}
3446
3447; Function Attrs: nofree norecurse nounwind uwtable willreturn
3448define dso_local void @st_align64_int8_t_uint16_t(ptr nocapture %ptr, i8 signext %str) {
3449; CHECK-P10-LABEL: st_align64_int8_t_uint16_t:
3450; CHECK-P10:       # %bb.0: # %entry
3451; CHECK-P10-NEXT:    pli r5, 244140625
3452; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
3453; CHECK-P10-NEXT:    sthx r4, r3, r5
3454; CHECK-P10-NEXT:    blr
3455;
3456; CHECK-PREP10-LABEL: st_align64_int8_t_uint16_t:
3457; CHECK-PREP10:       # %bb.0: # %entry
3458; CHECK-PREP10-NEXT:    lis r5, 3725
3459; CHECK-PREP10-NEXT:    ori r5, r5, 19025
3460; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
3461; CHECK-PREP10-NEXT:    sthx r4, r3, r5
3462; CHECK-PREP10-NEXT:    blr
3463entry:
3464  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3465  %conv = sext i8 %str to i16
3466  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
3467  ret void
3468}
3469
3470; Function Attrs: nofree norecurse nounwind uwtable willreturn
3471define dso_local void @st_reg_int8_t_uint16_t(ptr nocapture %ptr, i64 %off, i8 signext %str) {
3472; CHECK-LABEL: st_reg_int8_t_uint16_t:
3473; CHECK:       # %bb.0: # %entry
3474; CHECK-NEXT:    sthx r5, r3, r4
3475; CHECK-NEXT:    blr
3476entry:
3477  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3478  %conv = sext i8 %str to i16
3479  store atomic i16 %conv, ptr %add.ptr monotonic, align 2
3480  ret void
3481}
3482
3483; Function Attrs: nofree norecurse nounwind uwtable willreturn
3484define dso_local void @st_or1_int8_t_uint16_t(i64 %ptr, i8 zeroext %off, i8 signext %str) {
3485; CHECK-LABEL: st_or1_int8_t_uint16_t:
3486; CHECK:       # %bb.0: # %entry
3487; CHECK-NEXT:    or r3, r4, r3
3488; CHECK-NEXT:    sth r5, 0(r3)
3489; CHECK-NEXT:    blr
3490entry:
3491  %conv = zext i8 %off to i64
3492  %or = or i64 %conv, %ptr
3493  %0 = inttoptr i64 %or to ptr
3494  %conv1 = sext i8 %str to i16
3495  store atomic i16 %conv1, ptr %0 monotonic, align 2
3496  ret void
3497}
3498
3499; Function Attrs: nofree norecurse nounwind uwtable willreturn
3500define dso_local void @st_not_disjoint16_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
3501; CHECK-LABEL: st_not_disjoint16_int8_t_uint16_t:
3502; CHECK:       # %bb.0: # %entry
3503; CHECK-NEXT:    ori r3, r3, 6
3504; CHECK-NEXT:    sth r4, 0(r3)
3505; CHECK-NEXT:    blr
3506entry:
3507  %or = or i64 %ptr, 6
3508  %0 = inttoptr i64 %or to ptr
3509  %conv = sext i8 %str to i16
3510  store atomic i16 %conv, ptr %0 monotonic, align 2
3511  ret void
3512}
3513
3514; Function Attrs: nofree norecurse nounwind uwtable willreturn
3515define dso_local void @st_disjoint_align16_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
3516; CHECK-LABEL: st_disjoint_align16_int8_t_uint16_t:
3517; CHECK:       # %bb.0: # %entry
3518; CHECK-NEXT:    rldicr r3, r3, 0, 51
3519; CHECK-NEXT:    sth r4, 24(r3)
3520; CHECK-NEXT:    blr
3521entry:
3522  %and = and i64 %ptr, -4096
3523  %or = or i64 %and, 24
3524  %0 = inttoptr i64 %or to ptr
3525  %conv = sext i8 %str to i16
3526  store atomic i16 %conv, ptr %0 monotonic, align 8
3527  ret void
3528}
3529
3530; Function Attrs: nofree norecurse nounwind uwtable willreturn
3531define dso_local void @st_not_disjoint32_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
3532; CHECK-LABEL: st_not_disjoint32_int8_t_uint16_t:
3533; CHECK:       # %bb.0: # %entry
3534; CHECK-NEXT:    ori r3, r3, 34463
3535; CHECK-NEXT:    oris r3, r3, 1
3536; CHECK-NEXT:    sth r4, 0(r3)
3537; CHECK-NEXT:    blr
3538entry:
3539  %or = or i64 %ptr, 99999
3540  %0 = inttoptr i64 %or to ptr
3541  %conv = sext i8 %str to i16
3542  store atomic i16 %conv, ptr %0 monotonic, align 2
3543  ret void
3544}
3545
3546; Function Attrs: nofree norecurse nounwind uwtable willreturn
3547define dso_local void @st_disjoint_align32_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
3548; CHECK-P10-LABEL: st_disjoint_align32_int8_t_uint16_t:
3549; CHECK-P10:       # %bb.0: # %entry
3550; CHECK-P10-NEXT:    lis r5, -15264
3551; CHECK-P10-NEXT:    and r3, r3, r5
3552; CHECK-P10-NEXT:    psth r4, 999990000(r3), 0
3553; CHECK-P10-NEXT:    blr
3554;
3555; CHECK-PREP10-LABEL: st_disjoint_align32_int8_t_uint16_t:
3556; CHECK-PREP10:       # %bb.0: # %entry
3557; CHECK-PREP10-NEXT:    lis r5, -15264
3558; CHECK-PREP10-NEXT:    and r3, r3, r5
3559; CHECK-PREP10-NEXT:    lis r5, 15258
3560; CHECK-PREP10-NEXT:    ori r5, r5, 41712
3561; CHECK-PREP10-NEXT:    sthx r4, r3, r5
3562; CHECK-PREP10-NEXT:    blr
3563entry:
3564  %and = and i64 %ptr, -1000341504
3565  %or = or i64 %and, 999990000
3566  %0 = inttoptr i64 %or to ptr
3567  %conv = sext i8 %str to i16
3568  store atomic i16 %conv, ptr %0 monotonic, align 16
3569  ret void
3570}
3571
3572; Function Attrs: nofree norecurse nounwind uwtable willreturn
3573define dso_local void @st_not_disjoint64_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
3574; CHECK-P10-LABEL: st_not_disjoint64_int8_t_uint16_t:
3575; CHECK-P10:       # %bb.0: # %entry
3576; CHECK-P10-NEXT:    pli r5, 232
3577; CHECK-P10-NEXT:    pli r6, 3567587329
3578; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
3579; CHECK-P10-NEXT:    or r3, r3, r6
3580; CHECK-P10-NEXT:    sth r4, 0(r3)
3581; CHECK-P10-NEXT:    blr
3582;
3583; CHECK-PREP10-LABEL: st_not_disjoint64_int8_t_uint16_t:
3584; CHECK-PREP10:       # %bb.0: # %entry
3585; CHECK-PREP10-NEXT:    li r5, 29
3586; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
3587; CHECK-PREP10-NEXT:    oris r5, r5, 54437
3588; CHECK-PREP10-NEXT:    ori r5, r5, 4097
3589; CHECK-PREP10-NEXT:    or r3, r3, r5
3590; CHECK-PREP10-NEXT:    sth r4, 0(r3)
3591; CHECK-PREP10-NEXT:    blr
3592entry:
3593  %or = or i64 %ptr, 1000000000001
3594  %0 = inttoptr i64 %or to ptr
3595  %conv = sext i8 %str to i16
3596  store atomic i16 %conv, ptr %0 monotonic, align 2
3597  ret void
3598}
3599
3600; Function Attrs: nofree norecurse nounwind uwtable willreturn
3601define dso_local void @st_disjoint_align64_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
3602; CHECK-P10-LABEL: st_disjoint_align64_int8_t_uint16_t:
3603; CHECK-P10:       # %bb.0: # %entry
3604; CHECK-P10-NEXT:    pli r5, 244140625
3605; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3606; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
3607; CHECK-P10-NEXT:    sthx r4, r3, r5
3608; CHECK-P10-NEXT:    blr
3609;
3610; CHECK-PREP10-LABEL: st_disjoint_align64_int8_t_uint16_t:
3611; CHECK-PREP10:       # %bb.0: # %entry
3612; CHECK-PREP10-NEXT:    lis r5, 3725
3613; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3614; CHECK-PREP10-NEXT:    ori r5, r5, 19025
3615; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
3616; CHECK-PREP10-NEXT:    sthx r4, r3, r5
3617; CHECK-PREP10-NEXT:    blr
3618entry:
3619  %and = and i64 %ptr, -1099511627776
3620  %or = or i64 %and, 1000000000000
3621  %0 = inttoptr i64 %or to ptr
3622  %conv = sext i8 %str to i16
3623  store atomic i16 %conv, ptr %0 monotonic, align 4096
3624  ret void
3625}
3626
3627; Function Attrs: nofree norecurse nounwind uwtable willreturn
3628define dso_local void @st_cst_align16_int8_t_uint16_t(i8 signext %str) {
3629; CHECK-LABEL: st_cst_align16_int8_t_uint16_t:
3630; CHECK:       # %bb.0: # %entry
3631; CHECK-NEXT:    sth r3, 4080(0)
3632; CHECK-NEXT:    blr
3633entry:
3634  %conv = sext i8 %str to i16
3635  store atomic i16 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
3636  ret void
3637}
3638
3639; Function Attrs: nofree norecurse nounwind uwtable willreturn
3640define dso_local void @st_cst_align32_int8_t_uint16_t(i8 signext %str) {
3641; CHECK-LABEL: st_cst_align32_int8_t_uint16_t:
3642; CHECK:       # %bb.0: # %entry
3643; CHECK-NEXT:    lis r4, 153
3644; CHECK-NEXT:    sth r3, -27108(r4)
3645; CHECK-NEXT:    blr
3646entry:
3647  %conv = sext i8 %str to i16
3648  store atomic i16 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
3649  ret void
3650}
3651
3652; Function Attrs: nofree norecurse nounwind uwtable willreturn
3653define dso_local void @st_cst_align64_int8_t_uint16_t(i8 signext %str) {
3654; CHECK-P10-LABEL: st_cst_align64_int8_t_uint16_t:
3655; CHECK-P10:       # %bb.0: # %entry
3656; CHECK-P10-NEXT:    pli r4, 244140625
3657; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3658; CHECK-P10-NEXT:    sth r3, 0(r4)
3659; CHECK-P10-NEXT:    blr
3660;
3661; CHECK-PREP10-LABEL: st_cst_align64_int8_t_uint16_t:
3662; CHECK-PREP10:       # %bb.0: # %entry
3663; CHECK-PREP10-NEXT:    lis r4, 3725
3664; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3665; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3666; CHECK-PREP10-NEXT:    sth r3, 0(r4)
3667; CHECK-PREP10-NEXT:    blr
3668entry:
3669  %conv = sext i8 %str to i16
3670  store atomic i16 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
3671  ret void
3672}
3673
3674; Function Attrs: nofree norecurse nounwind uwtable willreturn
3675define dso_local void @st_0_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
3676; CHECK-LABEL: st_0_int8_t_uint32_t:
3677; CHECK:       # %bb.0: # %entry
3678; CHECK-NEXT:    stw r4, 0(r3)
3679; CHECK-NEXT:    blr
3680entry:
3681  %0 = inttoptr i64 %ptr to ptr
3682  %conv = sext i8 %str to i32
3683  store atomic i32 %conv, ptr %0 monotonic, align 4
3684  ret void
3685}
3686
3687; Function Attrs: nofree norecurse nounwind uwtable willreturn
3688define dso_local void @st_align16_int8_t_uint32_t(ptr nocapture %ptr, i8 signext %str) {
3689; CHECK-LABEL: st_align16_int8_t_uint32_t:
3690; CHECK:       # %bb.0: # %entry
3691; CHECK-NEXT:    stw r4, 8(r3)
3692; CHECK-NEXT:    blr
3693entry:
3694  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3695  %conv = sext i8 %str to i32
3696  store atomic i32 %conv, ptr %add.ptr monotonic, align 4
3697  ret void
3698}
3699
3700; Function Attrs: nofree norecurse nounwind uwtable willreturn
3701define dso_local void @st_align32_int8_t_uint32_t(ptr nocapture %ptr, i8 signext %str) {
3702; CHECK-P10-LABEL: st_align32_int8_t_uint32_t:
3703; CHECK-P10:       # %bb.0: # %entry
3704; CHECK-P10-NEXT:    pstw r4, 99999000(r3), 0
3705; CHECK-P10-NEXT:    blr
3706;
3707; CHECK-PREP10-LABEL: st_align32_int8_t_uint32_t:
3708; CHECK-PREP10:       # %bb.0: # %entry
3709; CHECK-PREP10-NEXT:    lis r5, 1525
3710; CHECK-PREP10-NEXT:    ori r5, r5, 56600
3711; CHECK-PREP10-NEXT:    stwx r4, r3, r5
3712; CHECK-PREP10-NEXT:    blr
3713entry:
3714  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3715  %conv = sext i8 %str to i32
3716  store atomic i32 %conv, ptr %add.ptr monotonic, align 4
3717  ret void
3718}
3719
3720; Function Attrs: nofree norecurse nounwind uwtable willreturn
3721define dso_local void @st_align64_int8_t_uint32_t(ptr nocapture %ptr, i8 signext %str) {
3722; CHECK-P10-LABEL: st_align64_int8_t_uint32_t:
3723; CHECK-P10:       # %bb.0: # %entry
3724; CHECK-P10-NEXT:    pli r5, 244140625
3725; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
3726; CHECK-P10-NEXT:    stwx r4, r3, r5
3727; CHECK-P10-NEXT:    blr
3728;
3729; CHECK-PREP10-LABEL: st_align64_int8_t_uint32_t:
3730; CHECK-PREP10:       # %bb.0: # %entry
3731; CHECK-PREP10-NEXT:    lis r5, 3725
3732; CHECK-PREP10-NEXT:    ori r5, r5, 19025
3733; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
3734; CHECK-PREP10-NEXT:    stwx r4, r3, r5
3735; CHECK-PREP10-NEXT:    blr
3736entry:
3737  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3738  %conv = sext i8 %str to i32
3739  store atomic i32 %conv, ptr %add.ptr monotonic, align 4
3740  ret void
3741}
3742
3743; Function Attrs: nofree norecurse nounwind uwtable willreturn
3744define dso_local void @st_reg_int8_t_uint32_t(ptr nocapture %ptr, i64 %off, i8 signext %str) {
3745; CHECK-LABEL: st_reg_int8_t_uint32_t:
3746; CHECK:       # %bb.0: # %entry
3747; CHECK-NEXT:    stwx r5, r3, r4
3748; CHECK-NEXT:    blr
3749entry:
3750  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3751  %conv = sext i8 %str to i32
3752  store atomic i32 %conv, ptr %add.ptr monotonic, align 4
3753  ret void
3754}
3755
3756; Function Attrs: nofree norecurse nounwind uwtable willreturn
3757define dso_local void @st_or1_int8_t_uint32_t(i64 %ptr, i8 zeroext %off, i8 signext %str) {
3758; CHECK-LABEL: st_or1_int8_t_uint32_t:
3759; CHECK:       # %bb.0: # %entry
3760; CHECK-NEXT:    or r3, r4, r3
3761; CHECK-NEXT:    stw r5, 0(r3)
3762; CHECK-NEXT:    blr
3763entry:
3764  %conv = zext i8 %off to i64
3765  %or = or i64 %conv, %ptr
3766  %0 = inttoptr i64 %or to ptr
3767  %conv1 = sext i8 %str to i32
3768  store atomic i32 %conv1, ptr %0 monotonic, align 4
3769  ret void
3770}
3771
3772; Function Attrs: nofree norecurse nounwind uwtable willreturn
3773define dso_local void @st_not_disjoint16_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
3774; CHECK-LABEL: st_not_disjoint16_int8_t_uint32_t:
3775; CHECK:       # %bb.0: # %entry
3776; CHECK-NEXT:    ori r3, r3, 6
3777; CHECK-NEXT:    stw r4, 0(r3)
3778; CHECK-NEXT:    blr
3779entry:
3780  %or = or i64 %ptr, 6
3781  %0 = inttoptr i64 %or to ptr
3782  %conv = sext i8 %str to i32
3783  store atomic i32 %conv, ptr %0 monotonic, align 4
3784  ret void
3785}
3786
3787; Function Attrs: nofree norecurse nounwind uwtable willreturn
3788define dso_local void @st_disjoint_align16_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
3789; CHECK-LABEL: st_disjoint_align16_int8_t_uint32_t:
3790; CHECK:       # %bb.0: # %entry
3791; CHECK-NEXT:    rldicr r3, r3, 0, 51
3792; CHECK-NEXT:    stw r4, 24(r3)
3793; CHECK-NEXT:    blr
3794entry:
3795  %and = and i64 %ptr, -4096
3796  %or = or i64 %and, 24
3797  %0 = inttoptr i64 %or to ptr
3798  %conv = sext i8 %str to i32
3799  store atomic i32 %conv, ptr %0 monotonic, align 8
3800  ret void
3801}
3802
3803; Function Attrs: nofree norecurse nounwind uwtable willreturn
3804define dso_local void @st_not_disjoint32_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
3805; CHECK-LABEL: st_not_disjoint32_int8_t_uint32_t:
3806; CHECK:       # %bb.0: # %entry
3807; CHECK-NEXT:    ori r3, r3, 34463
3808; CHECK-NEXT:    oris r3, r3, 1
3809; CHECK-NEXT:    stw r4, 0(r3)
3810; CHECK-NEXT:    blr
3811entry:
3812  %or = or i64 %ptr, 99999
3813  %0 = inttoptr i64 %or to ptr
3814  %conv = sext i8 %str to i32
3815  store atomic i32 %conv, ptr %0 monotonic, align 4
3816  ret void
3817}
3818
3819; Function Attrs: nofree norecurse nounwind uwtable willreturn
3820define dso_local void @st_disjoint_align32_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
3821; CHECK-P10-LABEL: st_disjoint_align32_int8_t_uint32_t:
3822; CHECK-P10:       # %bb.0: # %entry
3823; CHECK-P10-NEXT:    lis r5, -15264
3824; CHECK-P10-NEXT:    and r3, r3, r5
3825; CHECK-P10-NEXT:    pstw r4, 999990000(r3), 0
3826; CHECK-P10-NEXT:    blr
3827;
3828; CHECK-PREP10-LABEL: st_disjoint_align32_int8_t_uint32_t:
3829; CHECK-PREP10:       # %bb.0: # %entry
3830; CHECK-PREP10-NEXT:    lis r5, -15264
3831; CHECK-PREP10-NEXT:    and r3, r3, r5
3832; CHECK-PREP10-NEXT:    lis r5, 15258
3833; CHECK-PREP10-NEXT:    ori r5, r5, 41712
3834; CHECK-PREP10-NEXT:    stwx r4, r3, r5
3835; CHECK-PREP10-NEXT:    blr
3836entry:
3837  %and = and i64 %ptr, -1000341504
3838  %or = or i64 %and, 999990000
3839  %0 = inttoptr i64 %or to ptr
3840  %conv = sext i8 %str to i32
3841  store atomic i32 %conv, ptr %0 monotonic, align 16
3842  ret void
3843}
3844
3845; Function Attrs: nofree norecurse nounwind uwtable willreturn
3846define dso_local void @st_not_disjoint64_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
3847; CHECK-P10-LABEL: st_not_disjoint64_int8_t_uint32_t:
3848; CHECK-P10:       # %bb.0: # %entry
3849; CHECK-P10-NEXT:    pli r5, 232
3850; CHECK-P10-NEXT:    pli r6, 3567587329
3851; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
3852; CHECK-P10-NEXT:    or r3, r3, r6
3853; CHECK-P10-NEXT:    stw r4, 0(r3)
3854; CHECK-P10-NEXT:    blr
3855;
3856; CHECK-PREP10-LABEL: st_not_disjoint64_int8_t_uint32_t:
3857; CHECK-PREP10:       # %bb.0: # %entry
3858; CHECK-PREP10-NEXT:    li r5, 29
3859; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
3860; CHECK-PREP10-NEXT:    oris r5, r5, 54437
3861; CHECK-PREP10-NEXT:    ori r5, r5, 4097
3862; CHECK-PREP10-NEXT:    or r3, r3, r5
3863; CHECK-PREP10-NEXT:    stw r4, 0(r3)
3864; CHECK-PREP10-NEXT:    blr
3865entry:
3866  %or = or i64 %ptr, 1000000000001
3867  %0 = inttoptr i64 %or to ptr
3868  %conv = sext i8 %str to i32
3869  store atomic i32 %conv, ptr %0 monotonic, align 4
3870  ret void
3871}
3872
3873; Function Attrs: nofree norecurse nounwind uwtable willreturn
3874define dso_local void @st_disjoint_align64_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
3875; CHECK-P10-LABEL: st_disjoint_align64_int8_t_uint32_t:
3876; CHECK-P10:       # %bb.0: # %entry
3877; CHECK-P10-NEXT:    pli r5, 244140625
3878; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3879; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
3880; CHECK-P10-NEXT:    stwx r4, r3, r5
3881; CHECK-P10-NEXT:    blr
3882;
3883; CHECK-PREP10-LABEL: st_disjoint_align64_int8_t_uint32_t:
3884; CHECK-PREP10:       # %bb.0: # %entry
3885; CHECK-PREP10-NEXT:    lis r5, 3725
3886; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3887; CHECK-PREP10-NEXT:    ori r5, r5, 19025
3888; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
3889; CHECK-PREP10-NEXT:    stwx r4, r3, r5
3890; CHECK-PREP10-NEXT:    blr
3891entry:
3892  %and = and i64 %ptr, -1099511627776
3893  %or = or i64 %and, 1000000000000
3894  %0 = inttoptr i64 %or to ptr
3895  %conv = sext i8 %str to i32
3896  store atomic i32 %conv, ptr %0 monotonic, align 4096
3897  ret void
3898}
3899
3900; Function Attrs: nofree norecurse nounwind uwtable willreturn
3901define dso_local void @st_cst_align16_int8_t_uint32_t(i8 signext %str) {
3902; CHECK-LABEL: st_cst_align16_int8_t_uint32_t:
3903; CHECK:       # %bb.0: # %entry
3904; CHECK-NEXT:    stw r3, 4080(0)
3905; CHECK-NEXT:    blr
3906entry:
3907  %conv = sext i8 %str to i32
3908  store atomic i32 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
3909  ret void
3910}
3911
3912; Function Attrs: nofree norecurse nounwind uwtable willreturn
3913define dso_local void @st_cst_align32_int8_t_uint32_t(i8 signext %str) {
3914; CHECK-LABEL: st_cst_align32_int8_t_uint32_t:
3915; CHECK:       # %bb.0: # %entry
3916; CHECK-NEXT:    lis r4, 153
3917; CHECK-NEXT:    stw r3, -27108(r4)
3918; CHECK-NEXT:    blr
3919entry:
3920  %conv = sext i8 %str to i32
3921  store atomic i32 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4
3922  ret void
3923}
3924
3925; Function Attrs: nofree norecurse nounwind uwtable willreturn
3926define dso_local void @st_cst_align64_int8_t_uint32_t(i8 signext %str) {
3927; CHECK-P10-LABEL: st_cst_align64_int8_t_uint32_t:
3928; CHECK-P10:       # %bb.0: # %entry
3929; CHECK-P10-NEXT:    pli r4, 244140625
3930; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3931; CHECK-P10-NEXT:    stw r3, 0(r4)
3932; CHECK-P10-NEXT:    blr
3933;
3934; CHECK-PREP10-LABEL: st_cst_align64_int8_t_uint32_t:
3935; CHECK-PREP10:       # %bb.0: # %entry
3936; CHECK-PREP10-NEXT:    lis r4, 3725
3937; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3938; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3939; CHECK-PREP10-NEXT:    stw r3, 0(r4)
3940; CHECK-PREP10-NEXT:    blr
3941entry:
3942  %conv = sext i8 %str to i32
3943  store atomic i32 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
3944  ret void
3945}
3946
3947; Function Attrs: nofree norecurse nounwind uwtable willreturn
3948define dso_local void @st_0_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
3949; CHECK-LABEL: st_0_int8_t_uint64_t:
3950; CHECK:       # %bb.0: # %entry
3951; CHECK-NEXT:    std r4, 0(r3)
3952; CHECK-NEXT:    blr
3953entry:
3954  %0 = inttoptr i64 %ptr to ptr
3955  %conv = sext i8 %str to i64
3956  store atomic i64 %conv, ptr %0 monotonic, align 8
3957  ret void
3958}
3959
3960; Function Attrs: nofree norecurse nounwind uwtable willreturn
3961define dso_local void @st_align16_int8_t_uint64_t(ptr nocapture %ptr, i8 signext %str) {
3962; CHECK-LABEL: st_align16_int8_t_uint64_t:
3963; CHECK:       # %bb.0: # %entry
3964; CHECK-NEXT:    std r4, 8(r3)
3965; CHECK-NEXT:    blr
3966entry:
3967  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3968  %conv = sext i8 %str to i64
3969  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
3970  ret void
3971}
3972
3973; Function Attrs: nofree norecurse nounwind uwtable willreturn
3974define dso_local void @st_align32_int8_t_uint64_t(ptr nocapture %ptr, i8 signext %str) {
3975; CHECK-P10-LABEL: st_align32_int8_t_uint64_t:
3976; CHECK-P10:       # %bb.0: # %entry
3977; CHECK-P10-NEXT:    pstd r4, 99999000(r3), 0
3978; CHECK-P10-NEXT:    blr
3979;
3980; CHECK-PREP10-LABEL: st_align32_int8_t_uint64_t:
3981; CHECK-PREP10:       # %bb.0: # %entry
3982; CHECK-PREP10-NEXT:    lis r5, 1525
3983; CHECK-PREP10-NEXT:    ori r5, r5, 56600
3984; CHECK-PREP10-NEXT:    stdx r4, r3, r5
3985; CHECK-PREP10-NEXT:    blr
3986entry:
3987  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3988  %conv = sext i8 %str to i64
3989  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
3990  ret void
3991}
3992
3993; Function Attrs: nofree norecurse nounwind uwtable willreturn
3994define dso_local void @st_align64_int8_t_uint64_t(ptr nocapture %ptr, i8 signext %str) {
3995; CHECK-P10-LABEL: st_align64_int8_t_uint64_t:
3996; CHECK-P10:       # %bb.0: # %entry
3997; CHECK-P10-NEXT:    pli r5, 244140625
3998; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
3999; CHECK-P10-NEXT:    stdx r4, r3, r5
4000; CHECK-P10-NEXT:    blr
4001;
4002; CHECK-PREP10-LABEL: st_align64_int8_t_uint64_t:
4003; CHECK-PREP10:       # %bb.0: # %entry
4004; CHECK-PREP10-NEXT:    lis r5, 3725
4005; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4006; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4007; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4008; CHECK-PREP10-NEXT:    blr
4009entry:
4010  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
4011  %conv = sext i8 %str to i64
4012  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
4013  ret void
4014}
4015
4016; Function Attrs: nofree norecurse nounwind uwtable willreturn
4017define dso_local void @st_reg_int8_t_uint64_t(ptr nocapture %ptr, i64 %off, i8 signext %str) {
4018; CHECK-LABEL: st_reg_int8_t_uint64_t:
4019; CHECK:       # %bb.0: # %entry
4020; CHECK-NEXT:    stdx r5, r3, r4
4021; CHECK-NEXT:    blr
4022entry:
4023  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
4024  %conv = sext i8 %str to i64
4025  store atomic i64 %conv, ptr %add.ptr monotonic, align 8
4026  ret void
4027}
4028
4029; Function Attrs: nofree norecurse nounwind uwtable willreturn
4030define dso_local void @st_or1_int8_t_uint64_t(i64 %ptr, i8 zeroext %off, i8 signext %str) {
4031; CHECK-LABEL: st_or1_int8_t_uint64_t:
4032; CHECK:       # %bb.0: # %entry
4033; CHECK-NEXT:    or r3, r4, r3
4034; CHECK-NEXT:    std r5, 0(r3)
4035; CHECK-NEXT:    blr
4036entry:
4037  %conv = zext i8 %off to i64
4038  %or = or i64 %conv, %ptr
4039  %0 = inttoptr i64 %or to ptr
4040  %conv1 = sext i8 %str to i64
4041  store atomic i64 %conv1, ptr %0 monotonic, align 8
4042  ret void
4043}
4044
4045; Function Attrs: nofree norecurse nounwind uwtable willreturn
4046define dso_local void @st_not_disjoint16_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
4047; CHECK-LABEL: st_not_disjoint16_int8_t_uint64_t:
4048; CHECK:       # %bb.0: # %entry
4049; CHECK-NEXT:    ori r3, r3, 6
4050; CHECK-NEXT:    std r4, 0(r3)
4051; CHECK-NEXT:    blr
4052entry:
4053  %or = or i64 %ptr, 6
4054  %0 = inttoptr i64 %or to ptr
4055  %conv = sext i8 %str to i64
4056  store atomic i64 %conv, ptr %0 monotonic, align 8
4057  ret void
4058}
4059
4060; Function Attrs: nofree norecurse nounwind uwtable willreturn
4061define dso_local void @st_disjoint_align16_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
4062; CHECK-LABEL: st_disjoint_align16_int8_t_uint64_t:
4063; CHECK:       # %bb.0: # %entry
4064; CHECK-NEXT:    rldicr r3, r3, 0, 51
4065; CHECK-NEXT:    std r4, 24(r3)
4066; CHECK-NEXT:    blr
4067entry:
4068  %and = and i64 %ptr, -4096
4069  %or = or i64 %and, 24
4070  %0 = inttoptr i64 %or to ptr
4071  %conv = sext i8 %str to i64
4072  store atomic i64 %conv, ptr %0 monotonic, align 8
4073  ret void
4074}
4075
4076; Function Attrs: nofree norecurse nounwind uwtable willreturn
4077define dso_local void @st_not_disjoint32_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
4078; CHECK-LABEL: st_not_disjoint32_int8_t_uint64_t:
4079; CHECK:       # %bb.0: # %entry
4080; CHECK-NEXT:    ori r3, r3, 34463
4081; CHECK-NEXT:    oris r3, r3, 1
4082; CHECK-NEXT:    std r4, 0(r3)
4083; CHECK-NEXT:    blr
4084entry:
4085  %or = or i64 %ptr, 99999
4086  %0 = inttoptr i64 %or to ptr
4087  %conv = sext i8 %str to i64
4088  store atomic i64 %conv, ptr %0 monotonic, align 8
4089  ret void
4090}
4091
4092; Function Attrs: nofree norecurse nounwind uwtable willreturn
4093define dso_local void @st_disjoint_align32_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
4094; CHECK-P10-LABEL: st_disjoint_align32_int8_t_uint64_t:
4095; CHECK-P10:       # %bb.0: # %entry
4096; CHECK-P10-NEXT:    lis r5, -15264
4097; CHECK-P10-NEXT:    and r3, r3, r5
4098; CHECK-P10-NEXT:    pstd r4, 999990000(r3), 0
4099; CHECK-P10-NEXT:    blr
4100;
4101; CHECK-PREP10-LABEL: st_disjoint_align32_int8_t_uint64_t:
4102; CHECK-PREP10:       # %bb.0: # %entry
4103; CHECK-PREP10-NEXT:    lis r5, -15264
4104; CHECK-PREP10-NEXT:    and r3, r3, r5
4105; CHECK-PREP10-NEXT:    lis r5, 15258
4106; CHECK-PREP10-NEXT:    ori r5, r5, 41712
4107; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4108; CHECK-PREP10-NEXT:    blr
4109entry:
4110  %and = and i64 %ptr, -1000341504
4111  %or = or i64 %and, 999990000
4112  %0 = inttoptr i64 %or to ptr
4113  %conv = sext i8 %str to i64
4114  store atomic i64 %conv, ptr %0 monotonic, align 16
4115  ret void
4116}
4117
4118; Function Attrs: nofree norecurse nounwind uwtable willreturn
4119define dso_local void @st_not_disjoint64_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
4120; CHECK-P10-LABEL: st_not_disjoint64_int8_t_uint64_t:
4121; CHECK-P10:       # %bb.0: # %entry
4122; CHECK-P10-NEXT:    pli r5, 232
4123; CHECK-P10-NEXT:    pli r6, 3567587329
4124; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
4125; CHECK-P10-NEXT:    or r3, r3, r6
4126; CHECK-P10-NEXT:    std r4, 0(r3)
4127; CHECK-P10-NEXT:    blr
4128;
4129; CHECK-PREP10-LABEL: st_not_disjoint64_int8_t_uint64_t:
4130; CHECK-PREP10:       # %bb.0: # %entry
4131; CHECK-PREP10-NEXT:    li r5, 29
4132; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
4133; CHECK-PREP10-NEXT:    oris r5, r5, 54437
4134; CHECK-PREP10-NEXT:    ori r5, r5, 4097
4135; CHECK-PREP10-NEXT:    or r3, r3, r5
4136; CHECK-PREP10-NEXT:    std r4, 0(r3)
4137; CHECK-PREP10-NEXT:    blr
4138entry:
4139  %or = or i64 %ptr, 1000000000001
4140  %0 = inttoptr i64 %or to ptr
4141  %conv = sext i8 %str to i64
4142  store atomic i64 %conv, ptr %0 monotonic, align 8
4143  ret void
4144}
4145
4146; Function Attrs: nofree norecurse nounwind uwtable willreturn
4147define dso_local void @st_disjoint_align64_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
4148; CHECK-P10-LABEL: st_disjoint_align64_int8_t_uint64_t:
4149; CHECK-P10:       # %bb.0: # %entry
4150; CHECK-P10-NEXT:    pli r5, 244140625
4151; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
4152; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4153; CHECK-P10-NEXT:    stdx r4, r3, r5
4154; CHECK-P10-NEXT:    blr
4155;
4156; CHECK-PREP10-LABEL: st_disjoint_align64_int8_t_uint64_t:
4157; CHECK-PREP10:       # %bb.0: # %entry
4158; CHECK-PREP10-NEXT:    lis r5, 3725
4159; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
4160; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4161; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4162; CHECK-PREP10-NEXT:    stdx r4, r3, r5
4163; CHECK-PREP10-NEXT:    blr
4164entry:
4165  %and = and i64 %ptr, -1099511627776
4166  %or = or i64 %and, 1000000000000
4167  %0 = inttoptr i64 %or to ptr
4168  %conv = sext i8 %str to i64
4169  store atomic i64 %conv, ptr %0 monotonic, align 4096
4170  ret void
4171}
4172
4173; Function Attrs: nofree norecurse nounwind uwtable willreturn
4174define dso_local void @st_cst_align16_int8_t_uint64_t(i8 signext %str) {
4175; CHECK-LABEL: st_cst_align16_int8_t_uint64_t:
4176; CHECK:       # %bb.0: # %entry
4177; CHECK-NEXT:    std r3, 4080(0)
4178; CHECK-NEXT:    blr
4179entry:
4180  %conv = sext i8 %str to i64
4181  store atomic i64 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16
4182  ret void
4183}
4184
4185; Function Attrs: nofree norecurse nounwind uwtable willreturn
4186define dso_local void @st_cst_align32_int8_t_uint64_t(i8 signext %str) {
4187; CHECK-LABEL: st_cst_align32_int8_t_uint64_t:
4188; CHECK:       # %bb.0: # %entry
4189; CHECK-NEXT:    lis r4, 153
4190; CHECK-NEXT:    std r3, -27108(r4)
4191; CHECK-NEXT:    blr
4192entry:
4193  %conv = sext i8 %str to i64
4194  store atomic i64 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8
4195  ret void
4196}
4197
4198; Function Attrs: nofree norecurse nounwind uwtable willreturn
4199define dso_local void @st_cst_align64_int8_t_uint64_t(i8 signext %str) {
4200; CHECK-P10-LABEL: st_cst_align64_int8_t_uint64_t:
4201; CHECK-P10:       # %bb.0: # %entry
4202; CHECK-P10-NEXT:    pli r4, 244140625
4203; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4204; CHECK-P10-NEXT:    std r3, 0(r4)
4205; CHECK-P10-NEXT:    blr
4206;
4207; CHECK-PREP10-LABEL: st_cst_align64_int8_t_uint64_t:
4208; CHECK-PREP10:       # %bb.0: # %entry
4209; CHECK-PREP10-NEXT:    lis r4, 3725
4210; CHECK-PREP10-NEXT:    ori r4, r4, 19025
4211; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
4212; CHECK-PREP10-NEXT:    std r3, 0(r4)
4213; CHECK-PREP10-NEXT:    blr
4214entry:
4215  %conv = sext i8 %str to i64
4216  store atomic i64 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096
4217  ret void
4218}
4219