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