xref: /llvm-project/llvm/test/CodeGen/PowerPC/scalar-i32-ldst.ll (revision b922a3621116b404d868af8b74cab25ab78555be)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
3; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
4; RUN:   < %s | FileCheck %s --check-prefixes=CHECK,CHECK-P10,CHECK-LE,CHECK-P10-LE
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,CHECK-BE,CHECK-P10-BE
8; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
9; RUN:   -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
10; RUN:   < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10,CHECK-P9,CHECK-LE,CHECK-P9-LE
11; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
12; RUN:   -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
13; RUN:   < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10,CHECK-P9,CHECK-BE,CHECK-P9-BE
14; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
15; RUN:   -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
16; RUN:   < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10,CHECK-P8,CHECK-LE,CHECK-P8-LE
17; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
18; RUN:   -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
19; RUN:   < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10,CHECK-P8,CHECK-BE,CHECK-P8-BE
20
21; Function Attrs: norecurse nounwind readonly uwtable willreturn
22define dso_local signext i32 @ld_0_int32_t_int8_t(i64 %ptr) {
23; CHECK-LABEL: ld_0_int32_t_int8_t:
24; CHECK:       # %bb.0: # %entry
25; CHECK-NEXT:    lbz r3, 0(r3)
26; CHECK-NEXT:    extsb r3, r3
27; CHECK-NEXT:    blr
28entry:
29  %0 = inttoptr i64 %ptr to ptr
30  %1 = load i8, ptr %0, align 1
31  %conv = sext i8 %1 to i32
32  ret i32 %conv
33}
34
35; Function Attrs: norecurse nounwind readonly uwtable willreturn
36define dso_local signext i32 @ld_align16_int32_t_int8_t(ptr nocapture readonly %ptr) {
37; CHECK-LABEL: ld_align16_int32_t_int8_t:
38; CHECK:       # %bb.0: # %entry
39; CHECK-NEXT:    lbz r3, 8(r3)
40; CHECK-NEXT:    extsb r3, r3
41; CHECK-NEXT:    blr
42entry:
43  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
44  %0 = load i8, ptr %add.ptr, align 1
45  %conv = sext i8 %0 to i32
46  ret i32 %conv
47}
48
49; Function Attrs: norecurse nounwind readonly uwtable willreturn
50define dso_local signext i32 @ld_align32_int32_t_int8_t(ptr nocapture readonly %ptr) {
51; CHECK-P10-LABEL: ld_align32_int32_t_int8_t:
52; CHECK-P10:       # %bb.0: # %entry
53; CHECK-P10-NEXT:    plbz r3, 99999000(r3), 0
54; CHECK-P10-NEXT:    extsb r3, r3
55; CHECK-P10-NEXT:    blr
56;
57; CHECK-PREP10-LABEL: ld_align32_int32_t_int8_t:
58; CHECK-PREP10:       # %bb.0: # %entry
59; CHECK-PREP10-NEXT:    lis r4, 1525
60; CHECK-PREP10-NEXT:    ori r4, r4, 56600
61; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
62; CHECK-PREP10-NEXT:    extsb r3, r3
63; CHECK-PREP10-NEXT:    blr
64entry:
65  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
66  %0 = load i8, ptr %add.ptr, align 1
67  %conv = sext i8 %0 to i32
68  ret i32 %conv
69}
70
71; Function Attrs: norecurse nounwind readonly uwtable willreturn
72define dso_local signext i32 @ld_align64_int32_t_int8_t(ptr nocapture readonly %ptr) {
73; CHECK-P10-LABEL: ld_align64_int32_t_int8_t:
74; CHECK-P10:       # %bb.0: # %entry
75; CHECK-P10-NEXT:    pli r4, 244140625
76; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
77; CHECK-P10-NEXT:    lbzx r3, r3, r4
78; CHECK-P10-NEXT:    extsb r3, r3
79; CHECK-P10-NEXT:    blr
80;
81; CHECK-PREP10-LABEL: ld_align64_int32_t_int8_t:
82; CHECK-PREP10:       # %bb.0: # %entry
83; CHECK-PREP10-NEXT:    lis r4, 3725
84; CHECK-PREP10-NEXT:    ori r4, r4, 19025
85; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
86; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
87; CHECK-PREP10-NEXT:    extsb r3, r3
88; CHECK-PREP10-NEXT:    blr
89entry:
90  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
91  %0 = load i8, ptr %add.ptr, align 1
92  %conv = sext i8 %0 to i32
93  ret i32 %conv
94}
95
96; Function Attrs: norecurse nounwind readonly uwtable willreturn
97define dso_local signext i32 @ld_reg_int32_t_int8_t(ptr nocapture readonly %ptr, i64 %off) {
98; CHECK-LABEL: ld_reg_int32_t_int8_t:
99; CHECK:       # %bb.0: # %entry
100; CHECK-NEXT:    lbzx r3, r3, r4
101; CHECK-NEXT:    extsb r3, r3
102; CHECK-NEXT:    blr
103entry:
104  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
105  %0 = load i8, ptr %add.ptr, align 1
106  %conv = sext i8 %0 to i32
107  ret i32 %conv
108}
109
110; Function Attrs: norecurse nounwind readonly uwtable willreturn
111define dso_local signext i32 @ld_or_int32_t_int8_t(i64 %ptr, i8 zeroext %off) {
112; CHECK-LABEL: ld_or_int32_t_int8_t:
113; CHECK:       # %bb.0: # %entry
114; CHECK-NEXT:    or r3, r4, r3
115; CHECK-NEXT:    lbz r3, 0(r3)
116; CHECK-NEXT:    extsb r3, r3
117; CHECK-NEXT:    blr
118entry:
119  %conv = zext i8 %off to i64
120  %or = or i64 %conv, %ptr
121  %0 = inttoptr i64 %or to ptr
122  %1 = load i8, ptr %0, align 1
123  %conv1 = sext i8 %1 to i32
124  ret i32 %conv1
125}
126
127; Function Attrs: norecurse nounwind readonly uwtable willreturn
128define dso_local signext i32 @ld_or2_int32_t_int8_t(i64 %ptr, i8 zeroext %off) {
129; CHECK-LABEL: ld_or2_int32_t_int8_t:
130; CHECK:       # %bb.0: # %entry
131; CHECK-NEXT:    rldicr r3, r3, 0, 51
132; CHECK-NEXT:    lbzx r3, r3, r4
133; CHECK-NEXT:    extsb r3, r3
134; CHECK-NEXT:    blr
135entry:
136  %and = and i64 %ptr, -4096
137  %conv = zext i8 %off to i64
138  %or = or i64 %and, %conv
139  %0 = inttoptr i64 %or to ptr
140  %1 = load i8, ptr %0, align 1
141  %conv1 = sext i8 %1 to i32
142  ret i32 %conv1
143}
144
145; Function Attrs: norecurse nounwind readonly uwtable willreturn
146define dso_local signext i32 @ld_not_disjoint16_int32_t_int8_t(i64 %ptr) {
147; CHECK-LABEL: ld_not_disjoint16_int32_t_int8_t:
148; CHECK:       # %bb.0: # %entry
149; CHECK-NEXT:    ori r3, r3, 6
150; CHECK-NEXT:    lbz r3, 0(r3)
151; CHECK-NEXT:    extsb r3, r3
152; CHECK-NEXT:    blr
153entry:
154  %or = or i64 %ptr, 6
155  %0 = inttoptr i64 %or to ptr
156  %1 = load i8, ptr %0, align 1
157  %conv = sext i8 %1 to i32
158  ret i32 %conv
159}
160
161; Function Attrs: norecurse nounwind readonly uwtable willreturn
162define dso_local signext i32 @ld_disjoint_align16_int32_t_int8_t(i64 %ptr) {
163; CHECK-LABEL: ld_disjoint_align16_int32_t_int8_t:
164; CHECK:       # %bb.0: # %entry
165; CHECK-NEXT:    rldicr r3, r3, 0, 51
166; CHECK-NEXT:    lbz r3, 24(r3)
167; CHECK-NEXT:    extsb r3, r3
168; CHECK-NEXT:    blr
169entry:
170  %and = and i64 %ptr, -4096
171  %or = or i64 %and, 24
172  %0 = inttoptr i64 %or to ptr
173  %1 = load i8, ptr %0, align 8
174  %conv = sext i8 %1 to i32
175  ret i32 %conv
176}
177
178; Function Attrs: norecurse nounwind readonly uwtable willreturn
179define dso_local signext i32 @ld_not_disjoint32_int32_t_int8_t(i64 %ptr) {
180; CHECK-LABEL: ld_not_disjoint32_int32_t_int8_t:
181; CHECK:       # %bb.0: # %entry
182; CHECK-NEXT:    ori r3, r3, 34463
183; CHECK-NEXT:    oris r3, r3, 1
184; CHECK-NEXT:    lbz r3, 0(r3)
185; CHECK-NEXT:    extsb r3, r3
186; CHECK-NEXT:    blr
187entry:
188  %or = or i64 %ptr, 99999
189  %0 = inttoptr i64 %or to ptr
190  %1 = load i8, ptr %0, align 1
191  %conv = sext i8 %1 to i32
192  ret i32 %conv
193}
194
195; Function Attrs: norecurse nounwind readonly uwtable willreturn
196define dso_local signext i32 @ld_disjoint_align32_int32_t_int8_t(i64 %ptr) {
197; CHECK-P10-LABEL: ld_disjoint_align32_int32_t_int8_t:
198; CHECK-P10:       # %bb.0: # %entry
199; CHECK-P10-NEXT:    lis r4, -15264
200; CHECK-P10-NEXT:    and r3, r3, r4
201; CHECK-P10-NEXT:    plbz r3, 999990000(r3), 0
202; CHECK-P10-NEXT:    extsb r3, r3
203; CHECK-P10-NEXT:    blr
204;
205; CHECK-PREP10-LABEL: ld_disjoint_align32_int32_t_int8_t:
206; CHECK-PREP10:       # %bb.0: # %entry
207; CHECK-PREP10-NEXT:    lis r4, -15264
208; CHECK-PREP10-NEXT:    and r3, r3, r4
209; CHECK-PREP10-NEXT:    lis r4, 15258
210; CHECK-PREP10-NEXT:    ori r4, r4, 41712
211; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
212; CHECK-PREP10-NEXT:    extsb r3, r3
213; CHECK-PREP10-NEXT:    blr
214entry:
215  %and = and i64 %ptr, -1000341504
216  %or = or i64 %and, 999990000
217  %0 = inttoptr i64 %or to ptr
218  %1 = load i8, ptr %0, align 16
219  %conv = sext i8 %1 to i32
220  ret i32 %conv
221}
222
223; Function Attrs: norecurse nounwind readonly uwtable willreturn
224define dso_local signext i32 @ld_not_disjoint64_int32_t_int8_t(i64 %ptr) {
225; CHECK-P10-LABEL: ld_not_disjoint64_int32_t_int8_t:
226; CHECK-P10:       # %bb.0: # %entry
227; CHECK-P10-NEXT:    pli r4, 232
228; CHECK-P10-NEXT:    pli r5, 3567587329
229; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
230; CHECK-P10-NEXT:    or r3, r3, r5
231; CHECK-P10-NEXT:    lbz r3, 0(r3)
232; CHECK-P10-NEXT:    extsb r3, r3
233; CHECK-P10-NEXT:    blr
234;
235; CHECK-PREP10-LABEL: ld_not_disjoint64_int32_t_int8_t:
236; CHECK-PREP10:       # %bb.0: # %entry
237; CHECK-PREP10-NEXT:    li r4, 29
238; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
239; CHECK-PREP10-NEXT:    oris r4, r4, 54437
240; CHECK-PREP10-NEXT:    ori r4, r4, 4097
241; CHECK-PREP10-NEXT:    or r3, r3, r4
242; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
243; CHECK-PREP10-NEXT:    extsb r3, r3
244; CHECK-PREP10-NEXT:    blr
245entry:
246  %or = or i64 %ptr, 1000000000001
247  %0 = inttoptr i64 %or to ptr
248  %1 = load i8, ptr %0, align 1
249  %conv = sext i8 %1 to i32
250  ret i32 %conv
251}
252
253; Function Attrs: norecurse nounwind readonly uwtable willreturn
254define dso_local signext i32 @ld_disjoint_align64_int32_t_int8_t(i64 %ptr) {
255; CHECK-P10-LABEL: ld_disjoint_align64_int32_t_int8_t:
256; CHECK-P10:       # %bb.0: # %entry
257; CHECK-P10-NEXT:    pli r4, 244140625
258; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
259; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
260; CHECK-P10-NEXT:    lbzx r3, r3, r4
261; CHECK-P10-NEXT:    extsb r3, r3
262; CHECK-P10-NEXT:    blr
263;
264; CHECK-PREP10-LABEL: ld_disjoint_align64_int32_t_int8_t:
265; CHECK-PREP10:       # %bb.0: # %entry
266; CHECK-PREP10-NEXT:    lis r4, 3725
267; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
268; CHECK-PREP10-NEXT:    ori r4, r4, 19025
269; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
270; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
271; CHECK-PREP10-NEXT:    extsb r3, r3
272; CHECK-PREP10-NEXT:    blr
273entry:
274  %and = and i64 %ptr, -1099511627776
275  %or = or i64 %and, 1000000000000
276  %0 = inttoptr i64 %or to ptr
277  %1 = load i8, ptr %0, align 4096
278  %conv = sext i8 %1 to i32
279  ret i32 %conv
280}
281
282; Function Attrs: norecurse nounwind readonly uwtable willreturn
283define dso_local signext i32 @ld_cst_align16_int32_t_int8_t() {
284; CHECK-LABEL: ld_cst_align16_int32_t_int8_t:
285; CHECK:       # %bb.0: # %entry
286; CHECK-NEXT:    lbz r3, 4080(0)
287; CHECK-NEXT:    extsb r3, r3
288; CHECK-NEXT:    blr
289entry:
290  %0 = load i8, ptr inttoptr (i64 4080 to ptr), align 16
291  %conv = sext i8 %0 to i32
292  ret i32 %conv
293}
294
295; Function Attrs: norecurse nounwind readonly uwtable willreturn
296define dso_local signext i32 @ld_cst_align32_int32_t_int8_t() {
297; CHECK-LABEL: ld_cst_align32_int32_t_int8_t:
298; CHECK:       # %bb.0: # %entry
299; CHECK-NEXT:    lis r3, 153
300; CHECK-NEXT:    lbz r3, -27108(r3)
301; CHECK-NEXT:    extsb r3, r3
302; CHECK-NEXT:    blr
303entry:
304  %0 = load i8, ptr inttoptr (i64 9999900 to ptr), align 4
305  %conv = sext i8 %0 to i32
306  ret i32 %conv
307}
308
309; Function Attrs: norecurse nounwind readonly uwtable willreturn
310define dso_local signext i32 @ld_cst_align64_int32_t_int8_t() {
311; CHECK-P10-LABEL: ld_cst_align64_int32_t_int8_t:
312; CHECK-P10:       # %bb.0: # %entry
313; CHECK-P10-NEXT:    pli r3, 244140625
314; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
315; CHECK-P10-NEXT:    lbz r3, 0(r3)
316; CHECK-P10-NEXT:    extsb r3, r3
317; CHECK-P10-NEXT:    blr
318;
319; CHECK-PREP10-LABEL: ld_cst_align64_int32_t_int8_t:
320; CHECK-PREP10:       # %bb.0: # %entry
321; CHECK-PREP10-NEXT:    lis r3, 3725
322; CHECK-PREP10-NEXT:    ori r3, r3, 19025
323; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
324; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
325; CHECK-PREP10-NEXT:    extsb r3, r3
326; CHECK-PREP10-NEXT:    blr
327entry:
328  %0 = load i8, ptr inttoptr (i64 1000000000000 to ptr), align 4096
329  %conv = sext i8 %0 to i32
330  ret i32 %conv
331}
332
333; Function Attrs: norecurse nounwind readonly uwtable willreturn
334define dso_local signext i32 @ld_0_int32_t_int16_t(i64 %ptr) {
335; CHECK-LABEL: ld_0_int32_t_int16_t:
336; CHECK:       # %bb.0: # %entry
337; CHECK-NEXT:    lha r3, 0(r3)
338; CHECK-NEXT:    blr
339entry:
340  %0 = inttoptr i64 %ptr to ptr
341  %1 = load i16, ptr %0, align 2
342  %conv = sext i16 %1 to i32
343  ret i32 %conv
344}
345
346; Function Attrs: norecurse nounwind readonly uwtable willreturn
347define dso_local signext i32 @ld_align16_int32_t_int16_t(ptr nocapture readonly %ptr) {
348; CHECK-LABEL: ld_align16_int32_t_int16_t:
349; CHECK:       # %bb.0: # %entry
350; CHECK-NEXT:    lha r3, 8(r3)
351; CHECK-NEXT:    blr
352entry:
353  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
354  %0 = load i16, ptr %add.ptr, align 2
355  %conv = sext i16 %0 to i32
356  ret i32 %conv
357}
358
359; Function Attrs: norecurse nounwind readonly uwtable willreturn
360define dso_local signext i32 @ld_align32_int32_t_int16_t(ptr nocapture readonly %ptr) {
361; CHECK-P10-LABEL: ld_align32_int32_t_int16_t:
362; CHECK-P10:       # %bb.0: # %entry
363; CHECK-P10-NEXT:    plha r3, 99999000(r3), 0
364; CHECK-P10-NEXT:    blr
365;
366; CHECK-PREP10-LABEL: ld_align32_int32_t_int16_t:
367; CHECK-PREP10:       # %bb.0: # %entry
368; CHECK-PREP10-NEXT:    lis r4, 1525
369; CHECK-PREP10-NEXT:    ori r4, r4, 56600
370; CHECK-PREP10-NEXT:    lhax r3, r3, r4
371; CHECK-PREP10-NEXT:    blr
372entry:
373  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
374  %0 = load i16, ptr %add.ptr, align 2
375  %conv = sext i16 %0 to i32
376  ret i32 %conv
377}
378
379; Function Attrs: norecurse nounwind readonly uwtable willreturn
380define dso_local signext i32 @ld_align64_int32_t_int16_t(ptr nocapture readonly %ptr) {
381; CHECK-P10-LABEL: ld_align64_int32_t_int16_t:
382; CHECK-P10:       # %bb.0: # %entry
383; CHECK-P10-NEXT:    pli r4, 244140625
384; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
385; CHECK-P10-NEXT:    lhax r3, r3, r4
386; CHECK-P10-NEXT:    blr
387;
388; CHECK-PREP10-LABEL: ld_align64_int32_t_int16_t:
389; CHECK-PREP10:       # %bb.0: # %entry
390; CHECK-PREP10-NEXT:    lis r4, 3725
391; CHECK-PREP10-NEXT:    ori r4, r4, 19025
392; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
393; CHECK-PREP10-NEXT:    lhax r3, r3, r4
394; CHECK-PREP10-NEXT:    blr
395entry:
396  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
397  %0 = load i16, ptr %add.ptr, align 2
398  %conv = sext i16 %0 to i32
399  ret i32 %conv
400}
401
402; Function Attrs: norecurse nounwind readonly uwtable willreturn
403define dso_local signext i32 @ld_reg_int32_t_int16_t(ptr nocapture readonly %ptr, i64 %off) {
404; CHECK-LABEL: ld_reg_int32_t_int16_t:
405; CHECK:       # %bb.0: # %entry
406; CHECK-NEXT:    lhax r3, r3, r4
407; CHECK-NEXT:    blr
408entry:
409  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
410  %0 = load i16, ptr %add.ptr, align 2
411  %conv = sext i16 %0 to i32
412  ret i32 %conv
413}
414
415; Function Attrs: norecurse nounwind readonly uwtable willreturn
416define dso_local signext i32 @ld_or_int32_t_int16_t(i64 %ptr, i8 zeroext %off) {
417; CHECK-LABEL: ld_or_int32_t_int16_t:
418; CHECK:       # %bb.0: # %entry
419; CHECK-NEXT:    or r3, r4, r3
420; CHECK-NEXT:    lha r3, 0(r3)
421; CHECK-NEXT:    blr
422entry:
423  %conv = zext i8 %off to i64
424  %or = or i64 %conv, %ptr
425  %0 = inttoptr i64 %or to ptr
426  %1 = load i16, ptr %0, align 2
427  %conv1 = sext i16 %1 to i32
428  ret i32 %conv1
429}
430
431; Function Attrs: norecurse nounwind readonly uwtable willreturn
432define dso_local signext i32 @ld_or2_int32_t_int16_t(i64 %ptr, i8 zeroext %off) {
433; CHECK-LABEL: ld_or2_int32_t_int16_t:
434; CHECK:       # %bb.0: # %entry
435; CHECK-NEXT:    rldicr r3, r3, 0, 51
436; CHECK-NEXT:    lhax r3, r3, r4
437; CHECK-NEXT:    blr
438entry:
439  %and = and i64 %ptr, -4096
440  %conv = zext i8 %off to i64
441  %or = or i64 %and, %conv
442  %0 = inttoptr i64 %or to ptr
443  %1 = load i16, ptr %0, align 2
444  %conv1 = sext i16 %1 to i32
445  ret i32 %conv1
446}
447
448; Function Attrs: norecurse nounwind readonly uwtable willreturn
449define dso_local signext i32 @ld_not_disjoint16_int32_t_int16_t(i64 %ptr) {
450; CHECK-LABEL: ld_not_disjoint16_int32_t_int16_t:
451; CHECK:       # %bb.0: # %entry
452; CHECK-NEXT:    ori r3, r3, 6
453; CHECK-NEXT:    lha r3, 0(r3)
454; CHECK-NEXT:    blr
455entry:
456  %or = or i64 %ptr, 6
457  %0 = inttoptr i64 %or to ptr
458  %1 = load i16, ptr %0, align 2
459  %conv = sext i16 %1 to i32
460  ret i32 %conv
461}
462
463; Function Attrs: norecurse nounwind readonly uwtable willreturn
464define dso_local signext i32 @ld_disjoint_align16_int32_t_int16_t(i64 %ptr) {
465; CHECK-LABEL: ld_disjoint_align16_int32_t_int16_t:
466; CHECK:       # %bb.0: # %entry
467; CHECK-NEXT:    rldicr r3, r3, 0, 51
468; CHECK-NEXT:    lha r3, 24(r3)
469; CHECK-NEXT:    blr
470entry:
471  %and = and i64 %ptr, -4096
472  %or = or i64 %and, 24
473  %0 = inttoptr i64 %or to ptr
474  %1 = load i16, ptr %0, align 8
475  %conv = sext i16 %1 to i32
476  ret i32 %conv
477}
478
479; Function Attrs: norecurse nounwind readonly uwtable willreturn
480define dso_local signext i32 @ld_not_disjoint32_int32_t_int16_t(i64 %ptr) {
481; CHECK-LABEL: ld_not_disjoint32_int32_t_int16_t:
482; CHECK:       # %bb.0: # %entry
483; CHECK-NEXT:    ori r3, r3, 34463
484; CHECK-NEXT:    oris r3, r3, 1
485; CHECK-NEXT:    lha r3, 0(r3)
486; CHECK-NEXT:    blr
487entry:
488  %or = or i64 %ptr, 99999
489  %0 = inttoptr i64 %or to ptr
490  %1 = load i16, ptr %0, align 2
491  %conv = sext i16 %1 to i32
492  ret i32 %conv
493}
494
495; Function Attrs: norecurse nounwind readonly uwtable willreturn
496define dso_local signext i32 @ld_disjoint_align32_int32_t_int16_t(i64 %ptr) {
497; CHECK-P10-LABEL: ld_disjoint_align32_int32_t_int16_t:
498; CHECK-P10:       # %bb.0: # %entry
499; CHECK-P10-NEXT:    lis r4, -15264
500; CHECK-P10-NEXT:    and r3, r3, r4
501; CHECK-P10-NEXT:    plha r3, 999990000(r3), 0
502; CHECK-P10-NEXT:    blr
503;
504; CHECK-PREP10-LABEL: ld_disjoint_align32_int32_t_int16_t:
505; CHECK-PREP10:       # %bb.0: # %entry
506; CHECK-PREP10-NEXT:    lis r4, -15264
507; CHECK-PREP10-NEXT:    and r3, r3, r4
508; CHECK-PREP10-NEXT:    lis r4, 15258
509; CHECK-PREP10-NEXT:    ori r4, r4, 41712
510; CHECK-PREP10-NEXT:    lhax r3, r3, r4
511; CHECK-PREP10-NEXT:    blr
512entry:
513  %and = and i64 %ptr, -1000341504
514  %or = or i64 %and, 999990000
515  %0 = inttoptr i64 %or to ptr
516  %1 = load i16, ptr %0, align 16
517  %conv = sext i16 %1 to i32
518  ret i32 %conv
519}
520
521; Function Attrs: norecurse nounwind readonly uwtable willreturn
522define dso_local signext i32 @ld_not_disjoint64_int32_t_int16_t(i64 %ptr) {
523; CHECK-P10-LABEL: ld_not_disjoint64_int32_t_int16_t:
524; CHECK-P10:       # %bb.0: # %entry
525; CHECK-P10-NEXT:    pli r4, 232
526; CHECK-P10-NEXT:    pli r5, 3567587329
527; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
528; CHECK-P10-NEXT:    or r3, r3, r5
529; CHECK-P10-NEXT:    lha r3, 0(r3)
530; CHECK-P10-NEXT:    blr
531;
532; CHECK-PREP10-LABEL: ld_not_disjoint64_int32_t_int16_t:
533; CHECK-PREP10:       # %bb.0: # %entry
534; CHECK-PREP10-NEXT:    li r4, 29
535; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
536; CHECK-PREP10-NEXT:    oris r4, r4, 54437
537; CHECK-PREP10-NEXT:    ori r4, r4, 4097
538; CHECK-PREP10-NEXT:    or r3, r3, r4
539; CHECK-PREP10-NEXT:    lha r3, 0(r3)
540; CHECK-PREP10-NEXT:    blr
541entry:
542  %or = or i64 %ptr, 1000000000001
543  %0 = inttoptr i64 %or to ptr
544  %1 = load i16, ptr %0, align 2
545  %conv = sext i16 %1 to i32
546  ret i32 %conv
547}
548
549; Function Attrs: norecurse nounwind readonly uwtable willreturn
550define dso_local signext i32 @ld_disjoint_align64_int32_t_int16_t(i64 %ptr) {
551; CHECK-P10-LABEL: ld_disjoint_align64_int32_t_int16_t:
552; CHECK-P10:       # %bb.0: # %entry
553; CHECK-P10-NEXT:    pli r4, 244140625
554; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
555; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
556; CHECK-P10-NEXT:    lhax r3, r3, r4
557; CHECK-P10-NEXT:    blr
558;
559; CHECK-PREP10-LABEL: ld_disjoint_align64_int32_t_int16_t:
560; CHECK-PREP10:       # %bb.0: # %entry
561; CHECK-PREP10-NEXT:    lis r4, 3725
562; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
563; CHECK-PREP10-NEXT:    ori r4, r4, 19025
564; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
565; CHECK-PREP10-NEXT:    lhax r3, r3, r4
566; CHECK-PREP10-NEXT:    blr
567entry:
568  %and = and i64 %ptr, -1099511627776
569  %or = or i64 %and, 1000000000000
570  %0 = inttoptr i64 %or to ptr
571  %1 = load i16, ptr %0, align 4096
572  %conv = sext i16 %1 to i32
573  ret i32 %conv
574}
575
576; Function Attrs: norecurse nounwind readonly uwtable willreturn
577define dso_local signext i32 @ld_cst_align16_int32_t_int16_t() {
578; CHECK-LABEL: ld_cst_align16_int32_t_int16_t:
579; CHECK:       # %bb.0: # %entry
580; CHECK-NEXT:    lha r3, 4080(0)
581; CHECK-NEXT:    blr
582entry:
583  %0 = load i16, ptr inttoptr (i64 4080 to ptr), align 16
584  %conv = sext i16 %0 to i32
585  ret i32 %conv
586}
587
588; Function Attrs: norecurse nounwind readonly uwtable willreturn
589define dso_local signext i32 @ld_cst_align32_int32_t_int16_t() {
590; CHECK-LABEL: ld_cst_align32_int32_t_int16_t:
591; CHECK:       # %bb.0: # %entry
592; CHECK-NEXT:    lis r3, 153
593; CHECK-NEXT:    lha r3, -27108(r3)
594; CHECK-NEXT:    blr
595entry:
596  %0 = load i16, ptr inttoptr (i64 9999900 to ptr), align 4
597  %conv = sext i16 %0 to i32
598  ret i32 %conv
599}
600
601; Function Attrs: norecurse nounwind readonly uwtable willreturn
602define dso_local signext i32 @ld_cst_align64_int32_t_int16_t() {
603; CHECK-P10-LABEL: ld_cst_align64_int32_t_int16_t:
604; CHECK-P10:       # %bb.0: # %entry
605; CHECK-P10-NEXT:    pli r3, 244140625
606; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
607; CHECK-P10-NEXT:    lha r3, 0(r3)
608; CHECK-P10-NEXT:    blr
609;
610; CHECK-PREP10-LABEL: ld_cst_align64_int32_t_int16_t:
611; CHECK-PREP10:       # %bb.0: # %entry
612; CHECK-PREP10-NEXT:    lis r3, 3725
613; CHECK-PREP10-NEXT:    ori r3, r3, 19025
614; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
615; CHECK-PREP10-NEXT:    lha r3, 0(r3)
616; CHECK-PREP10-NEXT:    blr
617entry:
618  %0 = load i16, ptr inttoptr (i64 1000000000000 to ptr), align 4096
619  %conv = sext i16 %0 to i32
620  ret i32 %conv
621}
622
623; Function Attrs: norecurse nounwind readonly uwtable willreturn
624define dso_local signext i32 @ld_0_int32_t_uint32_t(i64 %ptr) {
625; CHECK-LABEL: ld_0_int32_t_uint32_t:
626; CHECK:       # %bb.0: # %entry
627; CHECK-NEXT:    lwa r3, 0(r3)
628; CHECK-NEXT:    blr
629entry:
630  %0 = inttoptr i64 %ptr to ptr
631  %1 = load i32, ptr %0, align 4
632  ret i32 %1
633}
634
635; Function Attrs: norecurse nounwind readonly uwtable willreturn
636define dso_local signext i32 @ld_align16_int32_t_uint32_t(ptr nocapture readonly %ptr) {
637; CHECK-LABEL: ld_align16_int32_t_uint32_t:
638; CHECK:       # %bb.0: # %entry
639; CHECK-NEXT:    lwa r3, 8(r3)
640; CHECK-NEXT:    blr
641entry:
642  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
643  %0 = load i32, ptr %add.ptr, align 4
644  ret i32 %0
645}
646
647; Function Attrs: norecurse nounwind readonly uwtable willreturn
648define dso_local signext i32 @ld_align32_int32_t_uint32_t(ptr nocapture readonly %ptr) {
649; CHECK-P10-LABEL: ld_align32_int32_t_uint32_t:
650; CHECK-P10:       # %bb.0: # %entry
651; CHECK-P10-NEXT:    plwa r3, 99999000(r3), 0
652; CHECK-P10-NEXT:    blr
653;
654; CHECK-PREP10-LABEL: ld_align32_int32_t_uint32_t:
655; CHECK-PREP10:       # %bb.0: # %entry
656; CHECK-PREP10-NEXT:    lis r4, 1525
657; CHECK-PREP10-NEXT:    ori r4, r4, 56600
658; CHECK-PREP10-NEXT:    lwax r3, r3, r4
659; CHECK-PREP10-NEXT:    blr
660entry:
661  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
662  %0 = load i32, ptr %add.ptr, align 4
663  ret i32 %0
664}
665
666; Function Attrs: norecurse nounwind readonly uwtable willreturn
667define dso_local signext i32 @ld_align64_int32_t_uint32_t(ptr nocapture readonly %ptr) {
668; CHECK-P10-LABEL: ld_align64_int32_t_uint32_t:
669; CHECK-P10:       # %bb.0: # %entry
670; CHECK-P10-NEXT:    pli r4, 244140625
671; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
672; CHECK-P10-NEXT:    lwax r3, r3, r4
673; CHECK-P10-NEXT:    blr
674;
675; CHECK-PREP10-LABEL: ld_align64_int32_t_uint32_t:
676; CHECK-PREP10:       # %bb.0: # %entry
677; CHECK-PREP10-NEXT:    lis r4, 3725
678; CHECK-PREP10-NEXT:    ori r4, r4, 19025
679; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
680; CHECK-PREP10-NEXT:    lwax r3, r3, r4
681; CHECK-PREP10-NEXT:    blr
682entry:
683  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
684  %0 = load i32, ptr %add.ptr, align 4
685  ret i32 %0
686}
687
688; Function Attrs: norecurse nounwind readonly uwtable willreturn
689define dso_local signext i32 @ld_reg_int32_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) {
690; CHECK-LABEL: ld_reg_int32_t_uint32_t:
691; CHECK:       # %bb.0: # %entry
692; CHECK-NEXT:    lwax r3, r3, r4
693; CHECK-NEXT:    blr
694entry:
695  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
696  %0 = load i32, ptr %add.ptr, align 4
697  ret i32 %0
698}
699
700; Function Attrs: norecurse nounwind readonly uwtable willreturn
701define dso_local signext i32 @ld_or_int32_t_uint32_t(i64 %ptr, i8 zeroext %off) {
702; CHECK-LABEL: ld_or_int32_t_uint32_t:
703; CHECK:       # %bb.0: # %entry
704; CHECK-NEXT:    or r3, r4, r3
705; CHECK-NEXT:    lwa r3, 0(r3)
706; CHECK-NEXT:    blr
707entry:
708  %conv = zext i8 %off to i64
709  %or = or i64 %conv, %ptr
710  %0 = inttoptr i64 %or to ptr
711  %1 = load i32, ptr %0, align 4
712  ret i32 %1
713}
714
715; Function Attrs: norecurse nounwind readonly uwtable willreturn
716define dso_local signext i32 @ld_or2_int32_t_uint32_t(i64 %ptr, i8 zeroext %off) {
717; CHECK-LABEL: ld_or2_int32_t_uint32_t:
718; CHECK:       # %bb.0: # %entry
719; CHECK-NEXT:    rldicr r3, r3, 0, 51
720; CHECK-NEXT:    lwax r3, r3, r4
721; CHECK-NEXT:    blr
722entry:
723  %and = and i64 %ptr, -4096
724  %conv = zext i8 %off to i64
725  %or = or i64 %and, %conv
726  %0 = inttoptr i64 %or to ptr
727  %1 = load i32, ptr %0, align 4
728  ret i32 %1
729}
730
731; Function Attrs: norecurse nounwind readonly uwtable willreturn
732define dso_local signext i32 @ld_not_disjoint16_int32_t_uint32_t(i64 %ptr) {
733; CHECK-LABEL: ld_not_disjoint16_int32_t_uint32_t:
734; CHECK:       # %bb.0: # %entry
735; CHECK-NEXT:    ori r3, r3, 6
736; CHECK-NEXT:    lwa r3, 0(r3)
737; CHECK-NEXT:    blr
738entry:
739  %or = or i64 %ptr, 6
740  %0 = inttoptr i64 %or to ptr
741  %1 = load i32, ptr %0, align 4
742  ret i32 %1
743}
744
745; Function Attrs: norecurse nounwind readonly uwtable willreturn
746define dso_local signext i32 @ld_disjoint_unalign16_int32_t_uint32_t(i64 %ptr) {
747; CHECK-P10-LABEL: ld_disjoint_unalign16_int32_t_uint32_t:
748; CHECK-P10:       # %bb.0: # %entry
749; CHECK-P10-NEXT:    rldicr r3, r3, 0, 51
750; CHECK-P10-NEXT:    plwa r3, 6(r3), 0
751; CHECK-P10-NEXT:    blr
752;
753; CHECK-PREP10-LABEL: ld_disjoint_unalign16_int32_t_uint32_t:
754; CHECK-PREP10:       # %bb.0: # %entry
755; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 51
756; CHECK-PREP10-NEXT:    li r4, 6
757; CHECK-PREP10-NEXT:    lwax r3, r3, r4
758; CHECK-PREP10-NEXT:    blr
759entry:
760  %and = and i64 %ptr, -4096
761  %or = or i64 %and, 6
762  %0 = inttoptr i64 %or to ptr
763  %1 = load i32, ptr %0, align 4
764  ret i32 %1
765}
766
767; Function Attrs: norecurse nounwind readonly uwtable willreturn
768define dso_local signext i32 @ld_disjoint_align16_int32_t_uint32_t(i64 %ptr) {
769; CHECK-LABEL: ld_disjoint_align16_int32_t_uint32_t:
770; CHECK:       # %bb.0: # %entry
771; CHECK-NEXT:    rldicr r3, r3, 0, 51
772; CHECK-NEXT:    lwa r3, 24(r3)
773; CHECK-NEXT:    blr
774entry:
775  %and = and i64 %ptr, -4096
776  %or = or i64 %and, 24
777  %0 = inttoptr i64 %or to ptr
778  %1 = load i32, ptr %0, align 8
779  ret i32 %1
780}
781
782; Function Attrs: norecurse nounwind readonly uwtable willreturn
783define dso_local signext i32 @ld_not_disjoint32_int32_t_uint32_t(i64 %ptr) {
784; CHECK-LABEL: ld_not_disjoint32_int32_t_uint32_t:
785; CHECK:       # %bb.0: # %entry
786; CHECK-NEXT:    ori r3, r3, 34463
787; CHECK-NEXT:    oris r3, r3, 1
788; CHECK-NEXT:    lwa r3, 0(r3)
789; CHECK-NEXT:    blr
790entry:
791  %or = or i64 %ptr, 99999
792  %0 = inttoptr i64 %or to ptr
793  %1 = load i32, ptr %0, align 4
794  ret i32 %1
795}
796
797; Function Attrs: norecurse nounwind readonly uwtable willreturn
798define dso_local signext i32 @ld_disjoint_align32_int32_t_uint32_t(i64 %ptr) {
799; CHECK-P10-LABEL: ld_disjoint_align32_int32_t_uint32_t:
800; CHECK-P10:       # %bb.0: # %entry
801; CHECK-P10-NEXT:    lis r4, -15264
802; CHECK-P10-NEXT:    and r3, r3, r4
803; CHECK-P10-NEXT:    plwa r3, 999990000(r3), 0
804; CHECK-P10-NEXT:    blr
805;
806; CHECK-PREP10-LABEL: ld_disjoint_align32_int32_t_uint32_t:
807; CHECK-PREP10:       # %bb.0: # %entry
808; CHECK-PREP10-NEXT:    lis r4, -15264
809; CHECK-PREP10-NEXT:    and r3, r3, r4
810; CHECK-PREP10-NEXT:    lis r4, 15258
811; CHECK-PREP10-NEXT:    ori r4, r4, 41712
812; CHECK-PREP10-NEXT:    lwax r3, r3, r4
813; CHECK-PREP10-NEXT:    blr
814entry:
815  %and = and i64 %ptr, -1000341504
816  %or = or i64 %and, 999990000
817  %0 = inttoptr i64 %or to ptr
818  %1 = load i32, ptr %0, align 16
819  ret i32 %1
820}
821
822; Function Attrs: norecurse nounwind readonly uwtable willreturn
823define dso_local signext i32 @ld_not_disjoint64_int32_t_uint32_t(i64 %ptr) {
824; CHECK-P10-LABEL: ld_not_disjoint64_int32_t_uint32_t:
825; CHECK-P10:       # %bb.0: # %entry
826; CHECK-P10-NEXT:    pli r4, 232
827; CHECK-P10-NEXT:    pli r5, 3567587329
828; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
829; CHECK-P10-NEXT:    or r3, r3, r5
830; CHECK-P10-NEXT:    lwa r3, 0(r3)
831; CHECK-P10-NEXT:    blr
832;
833; CHECK-PREP10-LABEL: ld_not_disjoint64_int32_t_uint32_t:
834; CHECK-PREP10:       # %bb.0: # %entry
835; CHECK-PREP10-NEXT:    li r4, 29
836; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
837; CHECK-PREP10-NEXT:    oris r4, r4, 54437
838; CHECK-PREP10-NEXT:    ori r4, r4, 4097
839; CHECK-PREP10-NEXT:    or r3, r3, r4
840; CHECK-PREP10-NEXT:    lwa r3, 0(r3)
841; CHECK-PREP10-NEXT:    blr
842entry:
843  %or = or i64 %ptr, 1000000000001
844  %0 = inttoptr i64 %or to ptr
845  %1 = load i32, ptr %0, align 4
846  ret i32 %1
847}
848
849; Function Attrs: norecurse nounwind readonly uwtable willreturn
850define dso_local signext i32 @ld_disjoint_align64_int32_t_uint32_t(i64 %ptr) {
851; CHECK-P10-LABEL: ld_disjoint_align64_int32_t_uint32_t:
852; CHECK-P10:       # %bb.0: # %entry
853; CHECK-P10-NEXT:    pli r4, 244140625
854; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
855; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
856; CHECK-P10-NEXT:    lwax r3, r3, r4
857; CHECK-P10-NEXT:    blr
858;
859; CHECK-PREP10-LABEL: ld_disjoint_align64_int32_t_uint32_t:
860; CHECK-PREP10:       # %bb.0: # %entry
861; CHECK-PREP10-NEXT:    lis r4, 3725
862; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
863; CHECK-PREP10-NEXT:    ori r4, r4, 19025
864; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
865; CHECK-PREP10-NEXT:    lwax r3, r3, r4
866; CHECK-PREP10-NEXT:    blr
867entry:
868  %and = and i64 %ptr, -1099511627776
869  %or = or i64 %and, 1000000000000
870  %0 = inttoptr i64 %or to ptr
871  %1 = load i32, ptr %0, align 4096
872  ret i32 %1
873}
874
875; Function Attrs: norecurse nounwind readonly uwtable willreturn
876define dso_local signext i32 @ld_cst_align16_int32_t_uint32_t() {
877; CHECK-LABEL: ld_cst_align16_int32_t_uint32_t:
878; CHECK:       # %bb.0: # %entry
879; CHECK-NEXT:    lwa r3, 4080(0)
880; CHECK-NEXT:    blr
881entry:
882  %0 = load i32, ptr inttoptr (i64 4080 to ptr), align 16
883  ret i32 %0
884}
885
886; Function Attrs: norecurse nounwind readonly uwtable willreturn
887define dso_local signext i32 @ld_cst_align32_int32_t_uint32_t() {
888; CHECK-LABEL: ld_cst_align32_int32_t_uint32_t:
889; CHECK:       # %bb.0: # %entry
890; CHECK-NEXT:    lis r3, 153
891; CHECK-NEXT:    lwa r3, -27108(r3)
892; CHECK-NEXT:    blr
893entry:
894  %0 = load i32, ptr inttoptr (i64 9999900 to ptr), align 4
895  ret i32 %0
896}
897
898; Function Attrs: norecurse nounwind readonly uwtable willreturn
899define dso_local signext i32 @ld_cst_align64_int32_t_uint32_t() {
900; CHECK-P10-LABEL: ld_cst_align64_int32_t_uint32_t:
901; CHECK-P10:       # %bb.0: # %entry
902; CHECK-P10-NEXT:    pli r3, 244140625
903; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
904; CHECK-P10-NEXT:    lwa r3, 0(r3)
905; CHECK-P10-NEXT:    blr
906;
907; CHECK-PREP10-LABEL: ld_cst_align64_int32_t_uint32_t:
908; CHECK-PREP10:       # %bb.0: # %entry
909; CHECK-PREP10-NEXT:    lis r3, 3725
910; CHECK-PREP10-NEXT:    ori r3, r3, 19025
911; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
912; CHECK-PREP10-NEXT:    lwa r3, 0(r3)
913; CHECK-PREP10-NEXT:    blr
914entry:
915  %0 = load i32, ptr inttoptr (i64 1000000000000 to ptr), align 4096
916  ret i32 %0
917}
918
919; Function Attrs: norecurse nounwind readonly uwtable willreturn
920define dso_local signext i32 @ld_0_int32_t_uint64_t(i64 %ptr) {
921; CHECK-LE-LABEL: ld_0_int32_t_uint64_t:
922; CHECK-LE:       # %bb.0: # %entry
923; CHECK-LE-NEXT:    lwa r3, 0(r3)
924; CHECK-LE-NEXT:    blr
925;
926; CHECK-BE-LABEL: ld_0_int32_t_uint64_t:
927; CHECK-BE:       # %bb.0: # %entry
928; CHECK-BE-NEXT:    lwa r3, 4(r3)
929; CHECK-BE-NEXT:    blr
930entry:
931  %0 = inttoptr i64 %ptr to ptr
932  %1 = load i64, ptr %0, align 8
933  %conv = trunc i64 %1 to i32
934  ret i32 %conv
935}
936
937; Function Attrs: norecurse nounwind readonly uwtable willreturn
938define dso_local signext i32 @ld_unalign16_int32_t_uint64_t(ptr nocapture readonly %ptr) {
939; CHECK-P10-LE-LABEL: ld_unalign16_int32_t_uint64_t:
940; CHECK-P10-LE:       # %bb.0: # %entry
941; CHECK-P10-LE-NEXT:    plwa r3, 1(r3), 0
942; CHECK-P10-LE-NEXT:    blr
943;
944; CHECK-P10-BE-LABEL: ld_unalign16_int32_t_uint64_t:
945; CHECK-P10-BE:       # %bb.0: # %entry
946; CHECK-P10-BE-NEXT:    plwa r3, 5(r3), 0
947; CHECK-P10-BE-NEXT:    blr
948;
949; CHECK-P9-LE-LABEL: ld_unalign16_int32_t_uint64_t:
950; CHECK-P9-LE:       # %bb.0: # %entry
951; CHECK-P9-LE-NEXT:    li r4, 1
952; CHECK-P9-LE-NEXT:    lwax r3, r3, r4
953; CHECK-P9-LE-NEXT:    blr
954;
955; CHECK-P9-BE-LABEL: ld_unalign16_int32_t_uint64_t:
956; CHECK-P9-BE:       # %bb.0: # %entry
957; CHECK-P9-BE-NEXT:    li r4, 5
958; CHECK-P9-BE-NEXT:    lwax r3, r3, r4
959; CHECK-P9-BE-NEXT:    blr
960;
961; CHECK-P8-LE-LABEL: ld_unalign16_int32_t_uint64_t:
962; CHECK-P8-LE:       # %bb.0: # %entry
963; CHECK-P8-LE-NEXT:    li r4, 1
964; CHECK-P8-LE-NEXT:    lwax r3, r3, r4
965; CHECK-P8-LE-NEXT:    blr
966;
967; CHECK-P8-BE-LABEL: ld_unalign16_int32_t_uint64_t:
968; CHECK-P8-BE:       # %bb.0: # %entry
969; CHECK-P8-BE-NEXT:    li r4, 5
970; CHECK-P8-BE-NEXT:    lwax r3, r3, r4
971; CHECK-P8-BE-NEXT:    blr
972entry:
973  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1
974  %0 = load i64, ptr %add.ptr, align 8
975  %conv = trunc i64 %0 to i32
976  ret i32 %conv
977}
978
979; Function Attrs: norecurse nounwind readonly uwtable willreturn
980define dso_local signext i32 @ld_align16_int32_t_uint64_t(ptr nocapture readonly %ptr) {
981; CHECK-LE-LABEL: ld_align16_int32_t_uint64_t:
982; CHECK-LE:       # %bb.0: # %entry
983; CHECK-LE-NEXT:    lwa r3, 8(r3)
984; CHECK-LE-NEXT:    blr
985;
986; CHECK-BE-LABEL: ld_align16_int32_t_uint64_t:
987; CHECK-BE:       # %bb.0: # %entry
988; CHECK-BE-NEXT:    lwa r3, 12(r3)
989; CHECK-BE-NEXT:    blr
990entry:
991  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
992  %0 = load i64, ptr %add.ptr, align 8
993  %conv = trunc i64 %0 to i32
994  ret i32 %conv
995}
996
997; Function Attrs: norecurse nounwind readonly uwtable willreturn
998define dso_local signext i32 @ld_align32_int32_t_uint64_t(ptr nocapture readonly %ptr) {
999; CHECK-P10-LE-LABEL: ld_align32_int32_t_uint64_t:
1000; CHECK-P10-LE:       # %bb.0: # %entry
1001; CHECK-P10-LE-NEXT:    plwa r3, 99999000(r3), 0
1002; CHECK-P10-LE-NEXT:    blr
1003;
1004; CHECK-P10-BE-LABEL: ld_align32_int32_t_uint64_t:
1005; CHECK-P10-BE:       # %bb.0: # %entry
1006; CHECK-P10-BE-NEXT:    plwa r3, 99999004(r3), 0
1007; CHECK-P10-BE-NEXT:    blr
1008;
1009; CHECK-P9-LE-LABEL: ld_align32_int32_t_uint64_t:
1010; CHECK-P9-LE:       # %bb.0: # %entry
1011; CHECK-P9-LE-NEXT:    lis r4, 1525
1012; CHECK-P9-LE-NEXT:    ori r4, r4, 56600
1013; CHECK-P9-LE-NEXT:    lwax r3, r3, r4
1014; CHECK-P9-LE-NEXT:    blr
1015;
1016; CHECK-P9-BE-LABEL: ld_align32_int32_t_uint64_t:
1017; CHECK-P9-BE:       # %bb.0: # %entry
1018; CHECK-P9-BE-NEXT:    lis r4, 1525
1019; CHECK-P9-BE-NEXT:    ori r4, r4, 56604
1020; CHECK-P9-BE-NEXT:    lwax r3, r3, r4
1021; CHECK-P9-BE-NEXT:    blr
1022;
1023; CHECK-P8-LE-LABEL: ld_align32_int32_t_uint64_t:
1024; CHECK-P8-LE:       # %bb.0: # %entry
1025; CHECK-P8-LE-NEXT:    lis r4, 1525
1026; CHECK-P8-LE-NEXT:    ori r4, r4, 56600
1027; CHECK-P8-LE-NEXT:    lwax r3, r3, r4
1028; CHECK-P8-LE-NEXT:    blr
1029;
1030; CHECK-P8-BE-LABEL: ld_align32_int32_t_uint64_t:
1031; CHECK-P8-BE:       # %bb.0: # %entry
1032; CHECK-P8-BE-NEXT:    lis r4, 1525
1033; CHECK-P8-BE-NEXT:    ori r4, r4, 56604
1034; CHECK-P8-BE-NEXT:    lwax r3, r3, r4
1035; CHECK-P8-BE-NEXT:    blr
1036entry:
1037  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
1038  %0 = load i64, ptr %add.ptr, align 8
1039  %conv = trunc i64 %0 to i32
1040  ret i32 %conv
1041}
1042
1043; Function Attrs: norecurse nounwind readonly uwtable willreturn
1044define dso_local signext i32 @ld_align64_int32_t_uint64_t(ptr nocapture readonly %ptr) {
1045; CHECK-P10-LE-LABEL: ld_align64_int32_t_uint64_t:
1046; CHECK-P10-LE:       # %bb.0: # %entry
1047; CHECK-P10-LE-NEXT:    pli r4, 244140625
1048; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
1049; CHECK-P10-LE-NEXT:    lwax r3, r3, r4
1050; CHECK-P10-LE-NEXT:    blr
1051;
1052; CHECK-P10-BE-LABEL: ld_align64_int32_t_uint64_t:
1053; CHECK-P10-BE:       # %bb.0: # %entry
1054; CHECK-P10-BE-NEXT:    pli r4, 232
1055; CHECK-P10-BE-NEXT:    pli r5, 3567587332
1056; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
1057; CHECK-P10-BE-NEXT:    lwax r3, r3, r5
1058; CHECK-P10-BE-NEXT:    blr
1059;
1060; CHECK-P9-LE-LABEL: ld_align64_int32_t_uint64_t:
1061; CHECK-P9-LE:       # %bb.0: # %entry
1062; CHECK-P9-LE-NEXT:    lis r4, 3725
1063; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
1064; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
1065; CHECK-P9-LE-NEXT:    lwax r3, r3, r4
1066; CHECK-P9-LE-NEXT:    blr
1067;
1068; CHECK-P9-BE-LABEL: ld_align64_int32_t_uint64_t:
1069; CHECK-P9-BE:       # %bb.0: # %entry
1070; CHECK-P9-BE-NEXT:    li r4, 29
1071; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
1072; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
1073; CHECK-P9-BE-NEXT:    ori r4, r4, 4100
1074; CHECK-P9-BE-NEXT:    lwax r3, r3, r4
1075; CHECK-P9-BE-NEXT:    blr
1076;
1077; CHECK-P8-LE-LABEL: ld_align64_int32_t_uint64_t:
1078; CHECK-P8-LE:       # %bb.0: # %entry
1079; CHECK-P8-LE-NEXT:    lis r4, 3725
1080; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
1081; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
1082; CHECK-P8-LE-NEXT:    lwax r3, r3, r4
1083; CHECK-P8-LE-NEXT:    blr
1084;
1085; CHECK-P8-BE-LABEL: ld_align64_int32_t_uint64_t:
1086; CHECK-P8-BE:       # %bb.0: # %entry
1087; CHECK-P8-BE-NEXT:    li r4, 29
1088; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
1089; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
1090; CHECK-P8-BE-NEXT:    ori r4, r4, 4100
1091; CHECK-P8-BE-NEXT:    lwax r3, r3, r4
1092; CHECK-P8-BE-NEXT:    blr
1093entry:
1094  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
1095  %0 = load i64, ptr %add.ptr, align 8
1096  %conv = trunc i64 %0 to i32
1097  ret i32 %conv
1098}
1099
1100; Function Attrs: norecurse nounwind readonly uwtable willreturn
1101define dso_local signext i32 @ld_reg_int32_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) {
1102; CHECK-LE-LABEL: ld_reg_int32_t_uint64_t:
1103; CHECK-LE:       # %bb.0: # %entry
1104; CHECK-LE-NEXT:    lwax r3, r3, r4
1105; CHECK-LE-NEXT:    blr
1106;
1107; CHECK-BE-LABEL: ld_reg_int32_t_uint64_t:
1108; CHECK-BE:       # %bb.0: # %entry
1109; CHECK-BE-NEXT:    add r3, r3, r4
1110; CHECK-BE-NEXT:    lwa r3, 4(r3)
1111; CHECK-BE-NEXT:    blr
1112entry:
1113  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
1114  %0 = load i64, ptr %add.ptr, align 8
1115  %conv = trunc i64 %0 to i32
1116  ret i32 %conv
1117}
1118
1119; Function Attrs: norecurse nounwind readonly uwtable willreturn
1120define dso_local signext i32 @ld_or_int32_t_uint64_t(i64 %ptr, i8 zeroext %off) {
1121; CHECK-LE-LABEL: ld_or_int32_t_uint64_t:
1122; CHECK-LE:       # %bb.0: # %entry
1123; CHECK-LE-NEXT:    or r3, r4, r3
1124; CHECK-LE-NEXT:    lwa r3, 0(r3)
1125; CHECK-LE-NEXT:    blr
1126;
1127; CHECK-BE-LABEL: ld_or_int32_t_uint64_t:
1128; CHECK-BE:       # %bb.0: # %entry
1129; CHECK-BE-NEXT:    or r3, r4, r3
1130; CHECK-BE-NEXT:    lwa r3, 4(r3)
1131; CHECK-BE-NEXT:    blr
1132entry:
1133  %conv = zext i8 %off to i64
1134  %or = or i64 %conv, %ptr
1135  %0 = inttoptr i64 %or to ptr
1136  %1 = load i64, ptr %0, align 8
1137  %conv1 = trunc i64 %1 to i32
1138  ret i32 %conv1
1139}
1140
1141; Function Attrs: norecurse nounwind readonly uwtable willreturn
1142define dso_local signext i32 @ld_or2_int32_t_uint64_t(i64 %ptr, i8 zeroext %off) {
1143; CHECK-LE-LABEL: ld_or2_int32_t_uint64_t:
1144; CHECK-LE:       # %bb.0: # %entry
1145; CHECK-LE-NEXT:    rldicr r3, r3, 0, 51
1146; CHECK-LE-NEXT:    lwax r3, r3, r4
1147; CHECK-LE-NEXT:    blr
1148;
1149; CHECK-BE-LABEL: ld_or2_int32_t_uint64_t:
1150; CHECK-BE:       # %bb.0: # %entry
1151; CHECK-BE-NEXT:    rotldi r3, r3, 52
1152; CHECK-BE-NEXT:    rldimi r4, r3, 12, 0
1153; CHECK-BE-NEXT:    lwa r3, 4(r4)
1154; CHECK-BE-NEXT:    blr
1155entry:
1156  %and = and i64 %ptr, -4096
1157  %conv = zext i8 %off to i64
1158  %or = or i64 %and, %conv
1159  %0 = inttoptr i64 %or to ptr
1160  %1 = load i64, ptr %0, align 8
1161  %conv1 = trunc i64 %1 to i32
1162  ret i32 %conv1
1163}
1164
1165; Function Attrs: norecurse nounwind readonly uwtable willreturn
1166define dso_local signext i32 @ld_not_disjoint16_int32_t_uint64_t(i64 %ptr) {
1167; CHECK-LE-LABEL: ld_not_disjoint16_int32_t_uint64_t:
1168; CHECK-LE:       # %bb.0: # %entry
1169; CHECK-LE-NEXT:    ori r3, r3, 6
1170; CHECK-LE-NEXT:    lwa r3, 0(r3)
1171; CHECK-LE-NEXT:    blr
1172;
1173; CHECK-BE-LABEL: ld_not_disjoint16_int32_t_uint64_t:
1174; CHECK-BE:       # %bb.0: # %entry
1175; CHECK-BE-NEXT:    ori r3, r3, 6
1176; CHECK-BE-NEXT:    lwa r3, 4(r3)
1177; CHECK-BE-NEXT:    blr
1178entry:
1179  %or = or i64 %ptr, 6
1180  %0 = inttoptr i64 %or to ptr
1181  %1 = load i64, ptr %0, align 8
1182  %conv = trunc i64 %1 to i32
1183  ret i32 %conv
1184}
1185
1186; Function Attrs: norecurse nounwind readonly uwtable willreturn
1187define dso_local signext i32 @ld_disjoint_unalign16_int32_t_uint64_t(i64 %ptr) {
1188; CHECK-P10-LE-LABEL: ld_disjoint_unalign16_int32_t_uint64_t:
1189; CHECK-P10-LE:       # %bb.0: # %entry
1190; CHECK-P10-LE-NEXT:    rldicr r3, r3, 0, 51
1191; CHECK-P10-LE-NEXT:    plwa r3, 6(r3), 0
1192; CHECK-P10-LE-NEXT:    blr
1193;
1194; CHECK-P10-BE-LABEL: ld_disjoint_unalign16_int32_t_uint64_t:
1195; CHECK-P10-BE:       # %bb.0: # %entry
1196; CHECK-P10-BE-NEXT:    rldicr r3, r3, 0, 51
1197; CHECK-P10-BE-NEXT:    plwa r3, 10(r3), 0
1198; CHECK-P10-BE-NEXT:    blr
1199;
1200; CHECK-P9-LE-LABEL: ld_disjoint_unalign16_int32_t_uint64_t:
1201; CHECK-P9-LE:       # %bb.0: # %entry
1202; CHECK-P9-LE-NEXT:    rldicr r3, r3, 0, 51
1203; CHECK-P9-LE-NEXT:    li r4, 6
1204; CHECK-P9-LE-NEXT:    lwax r3, r3, r4
1205; CHECK-P9-LE-NEXT:    blr
1206;
1207; CHECK-P9-BE-LABEL: ld_disjoint_unalign16_int32_t_uint64_t:
1208; CHECK-P9-BE:       # %bb.0: # %entry
1209; CHECK-P9-BE-NEXT:    rldicr r3, r3, 0, 51
1210; CHECK-P9-BE-NEXT:    li r4, 10
1211; CHECK-P9-BE-NEXT:    lwax r3, r3, r4
1212; CHECK-P9-BE-NEXT:    blr
1213;
1214; CHECK-P8-LE-LABEL: ld_disjoint_unalign16_int32_t_uint64_t:
1215; CHECK-P8-LE:       # %bb.0: # %entry
1216; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 51
1217; CHECK-P8-LE-NEXT:    li r4, 6
1218; CHECK-P8-LE-NEXT:    lwax r3, r3, r4
1219; CHECK-P8-LE-NEXT:    blr
1220;
1221; CHECK-P8-BE-LABEL: ld_disjoint_unalign16_int32_t_uint64_t:
1222; CHECK-P8-BE:       # %bb.0: # %entry
1223; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 51
1224; CHECK-P8-BE-NEXT:    li r4, 10
1225; CHECK-P8-BE-NEXT:    lwax r3, r3, r4
1226; CHECK-P8-BE-NEXT:    blr
1227entry:
1228  %and = and i64 %ptr, -4096
1229  %or = or i64 %and, 6
1230  %0 = inttoptr i64 %or to ptr
1231  %1 = load i64, ptr %0, align 8
1232  %conv = trunc i64 %1 to i32
1233  ret i32 %conv
1234}
1235
1236; Function Attrs: norecurse nounwind readonly uwtable willreturn
1237define dso_local signext i32 @ld_disjoint_align16_int32_t_uint64_t(i64 %ptr) {
1238; CHECK-LE-LABEL: ld_disjoint_align16_int32_t_uint64_t:
1239; CHECK-LE:       # %bb.0: # %entry
1240; CHECK-LE-NEXT:    rldicr r3, r3, 0, 51
1241; CHECK-LE-NEXT:    lwa r3, 24(r3)
1242; CHECK-LE-NEXT:    blr
1243;
1244; CHECK-BE-LABEL: ld_disjoint_align16_int32_t_uint64_t:
1245; CHECK-BE:       # %bb.0: # %entry
1246; CHECK-BE-NEXT:    rldicr r3, r3, 0, 51
1247; CHECK-BE-NEXT:    lwa r3, 28(r3)
1248; CHECK-BE-NEXT:    blr
1249entry:
1250  %and = and i64 %ptr, -4096
1251  %or = or i64 %and, 24
1252  %0 = inttoptr i64 %or to ptr
1253  %1 = load i64, ptr %0, align 8
1254  %conv = trunc i64 %1 to i32
1255  ret i32 %conv
1256}
1257
1258; Function Attrs: norecurse nounwind readonly uwtable willreturn
1259define dso_local signext i32 @ld_not_disjoint32_int32_t_uint64_t(i64 %ptr) {
1260; CHECK-LE-LABEL: ld_not_disjoint32_int32_t_uint64_t:
1261; CHECK-LE:       # %bb.0: # %entry
1262; CHECK-LE-NEXT:    ori r3, r3, 34463
1263; CHECK-LE-NEXT:    oris r3, r3, 1
1264; CHECK-LE-NEXT:    lwa r3, 0(r3)
1265; CHECK-LE-NEXT:    blr
1266;
1267; CHECK-BE-LABEL: ld_not_disjoint32_int32_t_uint64_t:
1268; CHECK-BE:       # %bb.0: # %entry
1269; CHECK-BE-NEXT:    ori r3, r3, 34463
1270; CHECK-BE-NEXT:    oris r3, r3, 1
1271; CHECK-BE-NEXT:    lwa r3, 4(r3)
1272; CHECK-BE-NEXT:    blr
1273entry:
1274  %or = or i64 %ptr, 99999
1275  %0 = inttoptr i64 %or to ptr
1276  %1 = load i64, ptr %0, align 8
1277  %conv = trunc i64 %1 to i32
1278  ret i32 %conv
1279}
1280
1281; Function Attrs: norecurse nounwind readonly uwtable willreturn
1282define dso_local signext i32 @ld_disjoint_align32_int32_t_uint64_t(i64 %ptr) {
1283; CHECK-P10-LE-LABEL: ld_disjoint_align32_int32_t_uint64_t:
1284; CHECK-P10-LE:       # %bb.0: # %entry
1285; CHECK-P10-LE-NEXT:    lis r4, -15264
1286; CHECK-P10-LE-NEXT:    and r3, r3, r4
1287; CHECK-P10-LE-NEXT:    plwa r3, 999990000(r3), 0
1288; CHECK-P10-LE-NEXT:    blr
1289;
1290; CHECK-P10-BE-LABEL: ld_disjoint_align32_int32_t_uint64_t:
1291; CHECK-P10-BE:       # %bb.0: # %entry
1292; CHECK-P10-BE-NEXT:    lis r4, -15264
1293; CHECK-P10-BE-NEXT:    and r3, r3, r4
1294; CHECK-P10-BE-NEXT:    plwa r3, 999990004(r3), 0
1295; CHECK-P10-BE-NEXT:    blr
1296;
1297; CHECK-P9-LE-LABEL: ld_disjoint_align32_int32_t_uint64_t:
1298; CHECK-P9-LE:       # %bb.0: # %entry
1299; CHECK-P9-LE-NEXT:    lis r4, -15264
1300; CHECK-P9-LE-NEXT:    and r3, r3, r4
1301; CHECK-P9-LE-NEXT:    lis r4, 15258
1302; CHECK-P9-LE-NEXT:    ori r4, r4, 41712
1303; CHECK-P9-LE-NEXT:    lwax r3, r3, r4
1304; CHECK-P9-LE-NEXT:    blr
1305;
1306; CHECK-P9-BE-LABEL: ld_disjoint_align32_int32_t_uint64_t:
1307; CHECK-P9-BE:       # %bb.0: # %entry
1308; CHECK-P9-BE-NEXT:    lis r4, -15264
1309; CHECK-P9-BE-NEXT:    and r3, r3, r4
1310; CHECK-P9-BE-NEXT:    lis r4, 15258
1311; CHECK-P9-BE-NEXT:    ori r4, r4, 41716
1312; CHECK-P9-BE-NEXT:    lwax r3, r3, r4
1313; CHECK-P9-BE-NEXT:    blr
1314;
1315; CHECK-P8-LE-LABEL: ld_disjoint_align32_int32_t_uint64_t:
1316; CHECK-P8-LE:       # %bb.0: # %entry
1317; CHECK-P8-LE-NEXT:    lis r4, -15264
1318; CHECK-P8-LE-NEXT:    and r3, r3, r4
1319; CHECK-P8-LE-NEXT:    lis r4, 15258
1320; CHECK-P8-LE-NEXT:    ori r4, r4, 41712
1321; CHECK-P8-LE-NEXT:    lwax r3, r3, r4
1322; CHECK-P8-LE-NEXT:    blr
1323;
1324; CHECK-P8-BE-LABEL: ld_disjoint_align32_int32_t_uint64_t:
1325; CHECK-P8-BE:       # %bb.0: # %entry
1326; CHECK-P8-BE-NEXT:    lis r4, -15264
1327; CHECK-P8-BE-NEXT:    and r3, r3, r4
1328; CHECK-P8-BE-NEXT:    lis r4, 15258
1329; CHECK-P8-BE-NEXT:    ori r4, r4, 41716
1330; CHECK-P8-BE-NEXT:    lwax r3, r3, r4
1331; CHECK-P8-BE-NEXT:    blr
1332entry:
1333  %and = and i64 %ptr, -1000341504
1334  %or = or i64 %and, 999990000
1335  %0 = inttoptr i64 %or to ptr
1336  %1 = load i64, ptr %0, align 16
1337  %conv = trunc i64 %1 to i32
1338  ret i32 %conv
1339}
1340
1341; Function Attrs: norecurse nounwind readonly uwtable willreturn
1342define dso_local signext i32 @ld_not_disjoint64_int32_t_uint64_t(i64 %ptr) {
1343; CHECK-P10-LE-LABEL: ld_not_disjoint64_int32_t_uint64_t:
1344; CHECK-P10-LE:       # %bb.0: # %entry
1345; CHECK-P10-LE-NEXT:    pli r4, 232
1346; CHECK-P10-LE-NEXT:    pli r5, 3567587329
1347; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
1348; CHECK-P10-LE-NEXT:    or r3, r3, r5
1349; CHECK-P10-LE-NEXT:    lwa r3, 0(r3)
1350; CHECK-P10-LE-NEXT:    blr
1351;
1352; CHECK-P10-BE-LABEL: ld_not_disjoint64_int32_t_uint64_t:
1353; CHECK-P10-BE:       # %bb.0: # %entry
1354; CHECK-P10-BE-NEXT:    pli r4, 232
1355; CHECK-P10-BE-NEXT:    pli r5, 3567587329
1356; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
1357; CHECK-P10-BE-NEXT:    or r3, r3, r5
1358; CHECK-P10-BE-NEXT:    lwa r3, 4(r3)
1359; CHECK-P10-BE-NEXT:    blr
1360;
1361; CHECK-P9-LE-LABEL: ld_not_disjoint64_int32_t_uint64_t:
1362; CHECK-P9-LE:       # %bb.0: # %entry
1363; CHECK-P9-LE-NEXT:    li r4, 29
1364; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
1365; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
1366; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
1367; CHECK-P9-LE-NEXT:    or r3, r3, r4
1368; CHECK-P9-LE-NEXT:    lwa r3, 0(r3)
1369; CHECK-P9-LE-NEXT:    blr
1370;
1371; CHECK-P9-BE-LABEL: ld_not_disjoint64_int32_t_uint64_t:
1372; CHECK-P9-BE:       # %bb.0: # %entry
1373; CHECK-P9-BE-NEXT:    li r4, 29
1374; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
1375; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
1376; CHECK-P9-BE-NEXT:    ori r4, r4, 4097
1377; CHECK-P9-BE-NEXT:    or r3, r3, r4
1378; CHECK-P9-BE-NEXT:    lwa r3, 4(r3)
1379; CHECK-P9-BE-NEXT:    blr
1380;
1381; CHECK-P8-LE-LABEL: ld_not_disjoint64_int32_t_uint64_t:
1382; CHECK-P8-LE:       # %bb.0: # %entry
1383; CHECK-P8-LE-NEXT:    li r4, 29
1384; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
1385; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
1386; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
1387; CHECK-P8-LE-NEXT:    or r3, r3, r4
1388; CHECK-P8-LE-NEXT:    lwa r3, 0(r3)
1389; CHECK-P8-LE-NEXT:    blr
1390;
1391; CHECK-P8-BE-LABEL: ld_not_disjoint64_int32_t_uint64_t:
1392; CHECK-P8-BE:       # %bb.0: # %entry
1393; CHECK-P8-BE-NEXT:    li r4, 29
1394; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
1395; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
1396; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
1397; CHECK-P8-BE-NEXT:    or r3, r3, r4
1398; CHECK-P8-BE-NEXT:    lwa r3, 4(r3)
1399; CHECK-P8-BE-NEXT:    blr
1400entry:
1401  %or = or i64 %ptr, 1000000000001
1402  %0 = inttoptr i64 %or to ptr
1403  %1 = load i64, ptr %0, align 8
1404  %conv = trunc i64 %1 to i32
1405  ret i32 %conv
1406}
1407
1408; Function Attrs: norecurse nounwind readonly uwtable willreturn
1409define dso_local signext i32 @ld_disjoint_align64_int32_t_uint64_t(i64 %ptr) {
1410; CHECK-P10-LE-LABEL: ld_disjoint_align64_int32_t_uint64_t:
1411; CHECK-P10-LE:       # %bb.0: # %entry
1412; CHECK-P10-LE-NEXT:    pli r4, 244140625
1413; CHECK-P10-LE-NEXT:    rldicr r3, r3, 0, 23
1414; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
1415; CHECK-P10-LE-NEXT:    lwax r3, r3, r4
1416; CHECK-P10-LE-NEXT:    blr
1417;
1418; CHECK-P10-BE-LABEL: ld_disjoint_align64_int32_t_uint64_t:
1419; CHECK-P10-BE:       # %bb.0: # %entry
1420; CHECK-P10-BE-NEXT:    pli r4, 232
1421; CHECK-P10-BE-NEXT:    pli r5, 3567587332
1422; CHECK-P10-BE-NEXT:    rldicr r3, r3, 0, 23
1423; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
1424; CHECK-P10-BE-NEXT:    lwax r3, r3, r5
1425; CHECK-P10-BE-NEXT:    blr
1426;
1427; CHECK-P9-LE-LABEL: ld_disjoint_align64_int32_t_uint64_t:
1428; CHECK-P9-LE:       # %bb.0: # %entry
1429; CHECK-P9-LE-NEXT:    lis r4, 3725
1430; CHECK-P9-LE-NEXT:    rldicr r3, r3, 0, 23
1431; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
1432; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
1433; CHECK-P9-LE-NEXT:    lwax r3, r3, r4
1434; CHECK-P9-LE-NEXT:    blr
1435;
1436; CHECK-P9-BE-LABEL: ld_disjoint_align64_int32_t_uint64_t:
1437; CHECK-P9-BE:       # %bb.0: # %entry
1438; CHECK-P9-BE-NEXT:    li r4, 29
1439; CHECK-P9-BE-NEXT:    rldicr r3, r3, 0, 23
1440; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
1441; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
1442; CHECK-P9-BE-NEXT:    ori r4, r4, 4100
1443; CHECK-P9-BE-NEXT:    lwax r3, r3, r4
1444; CHECK-P9-BE-NEXT:    blr
1445;
1446; CHECK-P8-LE-LABEL: ld_disjoint_align64_int32_t_uint64_t:
1447; CHECK-P8-LE:       # %bb.0: # %entry
1448; CHECK-P8-LE-NEXT:    lis r4, 3725
1449; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
1450; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
1451; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
1452; CHECK-P8-LE-NEXT:    lwax r3, r3, r4
1453; CHECK-P8-LE-NEXT:    blr
1454;
1455; CHECK-P8-BE-LABEL: ld_disjoint_align64_int32_t_uint64_t:
1456; CHECK-P8-BE:       # %bb.0: # %entry
1457; CHECK-P8-BE-NEXT:    li r4, 29
1458; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
1459; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
1460; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
1461; CHECK-P8-BE-NEXT:    ori r4, r4, 4100
1462; CHECK-P8-BE-NEXT:    lwax r3, r3, r4
1463; CHECK-P8-BE-NEXT:    blr
1464entry:
1465  %and = and i64 %ptr, -1099511627776
1466  %or = or i64 %and, 1000000000000
1467  %0 = inttoptr i64 %or to ptr
1468  %1 = load i64, ptr %0, align 4096
1469  %conv = trunc i64 %1 to i32
1470  ret i32 %conv
1471}
1472
1473; Function Attrs: norecurse nounwind readonly uwtable willreturn
1474define dso_local signext i32 @ld_cst_align16_int32_t_uint64_t() {
1475; CHECK-LE-LABEL: ld_cst_align16_int32_t_uint64_t:
1476; CHECK-LE:       # %bb.0: # %entry
1477; CHECK-LE-NEXT:    lwa r3, 4080(0)
1478; CHECK-LE-NEXT:    blr
1479;
1480; CHECK-BE-LABEL: ld_cst_align16_int32_t_uint64_t:
1481; CHECK-BE:       # %bb.0: # %entry
1482; CHECK-BE-NEXT:    lwa r3, 4084(0)
1483; CHECK-BE-NEXT:    blr
1484entry:
1485  %0 = load i64, ptr inttoptr (i64 4080 to ptr), align 16
1486  %conv = trunc i64 %0 to i32
1487  ret i32 %conv
1488}
1489
1490; Function Attrs: norecurse nounwind readonly uwtable willreturn
1491define dso_local signext i32 @ld_cst_align32_int32_t_uint64_t() {
1492; CHECK-LE-LABEL: ld_cst_align32_int32_t_uint64_t:
1493; CHECK-LE:       # %bb.0: # %entry
1494; CHECK-LE-NEXT:    lis r3, 153
1495; CHECK-LE-NEXT:    lwa r3, -27108(r3)
1496; CHECK-LE-NEXT:    blr
1497;
1498; CHECK-BE-LABEL: ld_cst_align32_int32_t_uint64_t:
1499; CHECK-BE:       # %bb.0: # %entry
1500; CHECK-BE-NEXT:    lis r3, 153
1501; CHECK-BE-NEXT:    lwa r3, -27104(r3)
1502; CHECK-BE-NEXT:    blr
1503entry:
1504  %0 = load i64, ptr inttoptr (i64 9999900 to ptr), align 8
1505  %conv = trunc i64 %0 to i32
1506  ret i32 %conv
1507}
1508
1509; Function Attrs: norecurse nounwind readonly uwtable willreturn
1510define dso_local signext i32 @ld_cst_align64_int32_t_uint64_t() {
1511; CHECK-P10-LE-LABEL: ld_cst_align64_int32_t_uint64_t:
1512; CHECK-P10-LE:       # %bb.0: # %entry
1513; CHECK-P10-LE-NEXT:    pli r3, 244140625
1514; CHECK-P10-LE-NEXT:    rldic r3, r3, 12, 24
1515; CHECK-P10-LE-NEXT:    lwa r3, 0(r3)
1516; CHECK-P10-LE-NEXT:    blr
1517;
1518; CHECK-P10-BE-LABEL: ld_cst_align64_int32_t_uint64_t:
1519; CHECK-P10-BE:       # %bb.0: # %entry
1520; CHECK-P10-BE-NEXT:    pli r3, 232
1521; CHECK-P10-BE-NEXT:    pli r4, 3567587332
1522; CHECK-P10-BE-NEXT:    rldimi r4, r3, 32, 0
1523; CHECK-P10-BE-NEXT:    lwa r3, 0(r4)
1524; CHECK-P10-BE-NEXT:    blr
1525;
1526; CHECK-P9-LE-LABEL: ld_cst_align64_int32_t_uint64_t:
1527; CHECK-P9-LE:       # %bb.0: # %entry
1528; CHECK-P9-LE-NEXT:    lis r3, 3725
1529; CHECK-P9-LE-NEXT:    ori r3, r3, 19025
1530; CHECK-P9-LE-NEXT:    rldic r3, r3, 12, 24
1531; CHECK-P9-LE-NEXT:    lwa r3, 0(r3)
1532; CHECK-P9-LE-NEXT:    blr
1533;
1534; CHECK-P9-BE-LABEL: ld_cst_align64_int32_t_uint64_t:
1535; CHECK-P9-BE:       # %bb.0: # %entry
1536; CHECK-P9-BE-NEXT:    li r3, 29
1537; CHECK-P9-BE-NEXT:    rldic r3, r3, 35, 24
1538; CHECK-P9-BE-NEXT:    oris r3, r3, 54437
1539; CHECK-P9-BE-NEXT:    ori r3, r3, 4100
1540; CHECK-P9-BE-NEXT:    lwa r3, 0(r3)
1541; CHECK-P9-BE-NEXT:    blr
1542;
1543; CHECK-P8-LE-LABEL: ld_cst_align64_int32_t_uint64_t:
1544; CHECK-P8-LE:       # %bb.0: # %entry
1545; CHECK-P8-LE-NEXT:    lis r3, 3725
1546; CHECK-P8-LE-NEXT:    ori r3, r3, 19025
1547; CHECK-P8-LE-NEXT:    rldic r3, r3, 12, 24
1548; CHECK-P8-LE-NEXT:    lwa r3, 0(r3)
1549; CHECK-P8-LE-NEXT:    blr
1550;
1551; CHECK-P8-BE-LABEL: ld_cst_align64_int32_t_uint64_t:
1552; CHECK-P8-BE:       # %bb.0: # %entry
1553; CHECK-P8-BE-NEXT:    li r3, 29
1554; CHECK-P8-BE-NEXT:    rldic r3, r3, 35, 24
1555; CHECK-P8-BE-NEXT:    oris r3, r3, 54437
1556; CHECK-P8-BE-NEXT:    ori r3, r3, 4100
1557; CHECK-P8-BE-NEXT:    lwa r3, 0(r3)
1558; CHECK-P8-BE-NEXT:    blr
1559entry:
1560  %0 = load i64, ptr inttoptr (i64 1000000000000 to ptr), align 4096
1561  %conv = trunc i64 %0 to i32
1562  ret i32 %conv
1563}
1564
1565; Function Attrs: norecurse nounwind readonly uwtable willreturn
1566define dso_local signext i32 @ld_0_int32_t_float(i64 %ptr) {
1567; CHECK-LABEL: ld_0_int32_t_float:
1568; CHECK:       # %bb.0: # %entry
1569; CHECK-NEXT:    lfs f0, 0(r3)
1570; CHECK-NEXT:    xscvdpsxws f0, f0
1571; CHECK-NEXT:    mffprwz r3, f0
1572; CHECK-NEXT:    extsw r3, r3
1573; CHECK-NEXT:    blr
1574entry:
1575  %0 = inttoptr i64 %ptr to ptr
1576  %1 = load float, ptr %0, align 4
1577  %conv = fptosi float %1 to i32
1578  ret i32 %conv
1579}
1580
1581; Function Attrs: norecurse nounwind readonly uwtable willreturn
1582define dso_local signext i32 @ld_align16_int32_t_float(ptr nocapture readonly %ptr) {
1583; CHECK-LABEL: ld_align16_int32_t_float:
1584; CHECK:       # %bb.0: # %entry
1585; CHECK-NEXT:    lfs f0, 8(r3)
1586; CHECK-NEXT:    xscvdpsxws f0, f0
1587; CHECK-NEXT:    mffprwz r3, f0
1588; CHECK-NEXT:    extsw r3, r3
1589; CHECK-NEXT:    blr
1590entry:
1591  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
1592  %0 = load float, ptr %add.ptr, align 4
1593  %conv = fptosi float %0 to i32
1594  ret i32 %conv
1595}
1596
1597; Function Attrs: norecurse nounwind readonly uwtable willreturn
1598define dso_local signext i32 @ld_align32_int32_t_float(ptr nocapture readonly %ptr) {
1599; CHECK-P10-LABEL: ld_align32_int32_t_float:
1600; CHECK-P10:       # %bb.0: # %entry
1601; CHECK-P10-NEXT:    plfs f0, 99999000(r3), 0
1602; CHECK-P10-NEXT:    xscvdpsxws f0, f0
1603; CHECK-P10-NEXT:    mffprwz r3, f0
1604; CHECK-P10-NEXT:    extsw r3, r3
1605; CHECK-P10-NEXT:    blr
1606;
1607; CHECK-PREP10-LABEL: ld_align32_int32_t_float:
1608; CHECK-PREP10:       # %bb.0: # %entry
1609; CHECK-PREP10-NEXT:    lis r4, 1525
1610; CHECK-PREP10-NEXT:    ori r4, r4, 56600
1611; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
1612; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
1613; CHECK-PREP10-NEXT:    mffprwz r3, f0
1614; CHECK-PREP10-NEXT:    extsw r3, r3
1615; CHECK-PREP10-NEXT:    blr
1616entry:
1617  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
1618  %0 = load float, ptr %add.ptr, align 4
1619  %conv = fptosi float %0 to i32
1620  ret i32 %conv
1621}
1622
1623; Function Attrs: norecurse nounwind readonly uwtable willreturn
1624define dso_local signext i32 @ld_align64_int32_t_float(ptr nocapture readonly %ptr) {
1625; CHECK-P10-LABEL: ld_align64_int32_t_float:
1626; CHECK-P10:       # %bb.0: # %entry
1627; CHECK-P10-NEXT:    pli r4, 244140625
1628; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1629; CHECK-P10-NEXT:    lfsx f0, r3, r4
1630; CHECK-P10-NEXT:    xscvdpsxws f0, f0
1631; CHECK-P10-NEXT:    mffprwz r3, f0
1632; CHECK-P10-NEXT:    extsw r3, r3
1633; CHECK-P10-NEXT:    blr
1634;
1635; CHECK-PREP10-LABEL: ld_align64_int32_t_float:
1636; CHECK-PREP10:       # %bb.0: # %entry
1637; CHECK-PREP10-NEXT:    lis r4, 3725
1638; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1639; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1640; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
1641; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
1642; CHECK-PREP10-NEXT:    mffprwz r3, f0
1643; CHECK-PREP10-NEXT:    extsw r3, r3
1644; CHECK-PREP10-NEXT:    blr
1645entry:
1646  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
1647  %0 = load float, ptr %add.ptr, align 4
1648  %conv = fptosi float %0 to i32
1649  ret i32 %conv
1650}
1651
1652; Function Attrs: norecurse nounwind readonly uwtable willreturn
1653define dso_local signext i32 @ld_reg_int32_t_float(ptr nocapture readonly %ptr, i64 %off) {
1654; CHECK-LABEL: ld_reg_int32_t_float:
1655; CHECK:       # %bb.0: # %entry
1656; CHECK-NEXT:    lfsx f0, r3, r4
1657; CHECK-NEXT:    xscvdpsxws f0, f0
1658; CHECK-NEXT:    mffprwz r3, f0
1659; CHECK-NEXT:    extsw r3, r3
1660; CHECK-NEXT:    blr
1661entry:
1662  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
1663  %0 = load float, ptr %add.ptr, align 4
1664  %conv = fptosi float %0 to i32
1665  ret i32 %conv
1666}
1667
1668; Function Attrs: norecurse nounwind readonly uwtable willreturn
1669define dso_local signext i32 @ld_or_int32_t_float(i64 %ptr, i8 zeroext %off) {
1670; CHECK-LABEL: ld_or_int32_t_float:
1671; CHECK:       # %bb.0: # %entry
1672; CHECK-NEXT:    or r3, r4, r3
1673; CHECK-NEXT:    lfs f0, 0(r3)
1674; CHECK-NEXT:    xscvdpsxws f0, f0
1675; CHECK-NEXT:    mffprwz r3, f0
1676; CHECK-NEXT:    extsw r3, r3
1677; CHECK-NEXT:    blr
1678entry:
1679  %conv = zext i8 %off to i64
1680  %or = or i64 %conv, %ptr
1681  %0 = inttoptr i64 %or to ptr
1682  %1 = load float, ptr %0, align 4
1683  %conv1 = fptosi float %1 to i32
1684  ret i32 %conv1
1685}
1686
1687; Function Attrs: norecurse nounwind readonly uwtable willreturn
1688define dso_local signext i32 @ld_or2_int32_t_float(i64 %ptr, i8 zeroext %off) {
1689; CHECK-LABEL: ld_or2_int32_t_float:
1690; CHECK:       # %bb.0: # %entry
1691; CHECK-NEXT:    rldicr r3, r3, 0, 51
1692; CHECK-NEXT:    lfsx f0, r3, r4
1693; CHECK-NEXT:    xscvdpsxws f0, f0
1694; CHECK-NEXT:    mffprwz r3, f0
1695; CHECK-NEXT:    extsw r3, r3
1696; CHECK-NEXT:    blr
1697entry:
1698  %and = and i64 %ptr, -4096
1699  %conv = zext i8 %off to i64
1700  %or = or i64 %and, %conv
1701  %0 = inttoptr i64 %or to ptr
1702  %1 = load float, ptr %0, align 4
1703  %conv1 = fptosi float %1 to i32
1704  ret i32 %conv1
1705}
1706
1707; Function Attrs: norecurse nounwind readonly uwtable willreturn
1708define dso_local signext i32 @ld_not_disjoint16_int32_t_float(i64 %ptr) {
1709; CHECK-LABEL: ld_not_disjoint16_int32_t_float:
1710; CHECK:       # %bb.0: # %entry
1711; CHECK-NEXT:    ori r3, r3, 6
1712; CHECK-NEXT:    lfs f0, 0(r3)
1713; CHECK-NEXT:    xscvdpsxws f0, f0
1714; CHECK-NEXT:    mffprwz r3, f0
1715; CHECK-NEXT:    extsw r3, r3
1716; CHECK-NEXT:    blr
1717entry:
1718  %or = or i64 %ptr, 6
1719  %0 = inttoptr i64 %or to ptr
1720  %1 = load float, ptr %0, align 4
1721  %conv = fptosi float %1 to i32
1722  ret i32 %conv
1723}
1724
1725; Function Attrs: norecurse nounwind readonly uwtable willreturn
1726define dso_local signext i32 @ld_disjoint_align16_int32_t_float(i64 %ptr) {
1727; CHECK-LABEL: ld_disjoint_align16_int32_t_float:
1728; CHECK:       # %bb.0: # %entry
1729; CHECK-NEXT:    rldicr r3, r3, 0, 51
1730; CHECK-NEXT:    lfs f0, 24(r3)
1731; CHECK-NEXT:    xscvdpsxws f0, f0
1732; CHECK-NEXT:    mffprwz r3, f0
1733; CHECK-NEXT:    extsw r3, r3
1734; CHECK-NEXT:    blr
1735entry:
1736  %and = and i64 %ptr, -4096
1737  %or = or i64 %and, 24
1738  %0 = inttoptr i64 %or to ptr
1739  %1 = load float, ptr %0, align 8
1740  %conv = fptosi float %1 to i32
1741  ret i32 %conv
1742}
1743
1744; Function Attrs: norecurse nounwind readonly uwtable willreturn
1745define dso_local signext i32 @ld_not_disjoint32_int32_t_float(i64 %ptr) {
1746; CHECK-LABEL: ld_not_disjoint32_int32_t_float:
1747; CHECK:       # %bb.0: # %entry
1748; CHECK-NEXT:    ori r3, r3, 34463
1749; CHECK-NEXT:    oris r3, r3, 1
1750; CHECK-NEXT:    lfs f0, 0(r3)
1751; CHECK-NEXT:    xscvdpsxws f0, f0
1752; CHECK-NEXT:    mffprwz r3, f0
1753; CHECK-NEXT:    extsw r3, r3
1754; CHECK-NEXT:    blr
1755entry:
1756  %or = or i64 %ptr, 99999
1757  %0 = inttoptr i64 %or to ptr
1758  %1 = load float, ptr %0, align 4
1759  %conv = fptosi float %1 to i32
1760  ret i32 %conv
1761}
1762
1763; Function Attrs: norecurse nounwind readonly uwtable willreturn
1764define dso_local signext i32 @ld_disjoint_align32_int32_t_float(i64 %ptr) {
1765; CHECK-P10-LABEL: ld_disjoint_align32_int32_t_float:
1766; CHECK-P10:       # %bb.0: # %entry
1767; CHECK-P10-NEXT:    lis r4, -15264
1768; CHECK-P10-NEXT:    and r3, r3, r4
1769; CHECK-P10-NEXT:    plfs f0, 999990000(r3), 0
1770; CHECK-P10-NEXT:    xscvdpsxws f0, f0
1771; CHECK-P10-NEXT:    mffprwz r3, f0
1772; CHECK-P10-NEXT:    extsw r3, r3
1773; CHECK-P10-NEXT:    blr
1774;
1775; CHECK-PREP10-LABEL: ld_disjoint_align32_int32_t_float:
1776; CHECK-PREP10:       # %bb.0: # %entry
1777; CHECK-PREP10-NEXT:    lis r4, -15264
1778; CHECK-PREP10-NEXT:    and r3, r3, r4
1779; CHECK-PREP10-NEXT:    lis r4, 15258
1780; CHECK-PREP10-NEXT:    ori r4, r4, 41712
1781; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
1782; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
1783; CHECK-PREP10-NEXT:    mffprwz r3, f0
1784; CHECK-PREP10-NEXT:    extsw r3, r3
1785; CHECK-PREP10-NEXT:    blr
1786entry:
1787  %and = and i64 %ptr, -1000341504
1788  %or = or i64 %and, 999990000
1789  %0 = inttoptr i64 %or to ptr
1790  %1 = load float, ptr %0, align 16
1791  %conv = fptosi float %1 to i32
1792  ret i32 %conv
1793}
1794
1795; Function Attrs: norecurse nounwind readonly uwtable willreturn
1796define dso_local signext i32 @ld_not_disjoint64_int32_t_float(i64 %ptr) {
1797; CHECK-P10-LABEL: ld_not_disjoint64_int32_t_float:
1798; CHECK-P10:       # %bb.0: # %entry
1799; CHECK-P10-NEXT:    pli r4, 232
1800; CHECK-P10-NEXT:    pli r5, 3567587329
1801; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
1802; CHECK-P10-NEXT:    or r3, r3, r5
1803; CHECK-P10-NEXT:    lfs f0, 0(r3)
1804; CHECK-P10-NEXT:    xscvdpsxws f0, f0
1805; CHECK-P10-NEXT:    mffprwz r3, f0
1806; CHECK-P10-NEXT:    extsw r3, r3
1807; CHECK-P10-NEXT:    blr
1808;
1809; CHECK-PREP10-LABEL: ld_not_disjoint64_int32_t_float:
1810; CHECK-PREP10:       # %bb.0: # %entry
1811; CHECK-PREP10-NEXT:    li r4, 29
1812; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
1813; CHECK-PREP10-NEXT:    oris r4, r4, 54437
1814; CHECK-PREP10-NEXT:    ori r4, r4, 4097
1815; CHECK-PREP10-NEXT:    or r3, r3, r4
1816; CHECK-PREP10-NEXT:    lfs f0, 0(r3)
1817; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
1818; CHECK-PREP10-NEXT:    mffprwz r3, f0
1819; CHECK-PREP10-NEXT:    extsw r3, r3
1820; CHECK-PREP10-NEXT:    blr
1821entry:
1822  %or = or i64 %ptr, 1000000000001
1823  %0 = inttoptr i64 %or to ptr
1824  %1 = load float, ptr %0, align 4
1825  %conv = fptosi float %1 to i32
1826  ret i32 %conv
1827}
1828
1829; Function Attrs: norecurse nounwind readonly uwtable willreturn
1830define dso_local signext i32 @ld_disjoint_align64_int32_t_float(i64 %ptr) {
1831; CHECK-P10-LABEL: ld_disjoint_align64_int32_t_float:
1832; CHECK-P10:       # %bb.0: # %entry
1833; CHECK-P10-NEXT:    pli r4, 244140625
1834; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
1835; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1836; CHECK-P10-NEXT:    lfsx f0, r3, r4
1837; CHECK-P10-NEXT:    xscvdpsxws f0, f0
1838; CHECK-P10-NEXT:    mffprwz r3, f0
1839; CHECK-P10-NEXT:    extsw r3, r3
1840; CHECK-P10-NEXT:    blr
1841;
1842; CHECK-PREP10-LABEL: ld_disjoint_align64_int32_t_float:
1843; CHECK-PREP10:       # %bb.0: # %entry
1844; CHECK-PREP10-NEXT:    lis r4, 3725
1845; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
1846; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1847; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1848; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
1849; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
1850; CHECK-PREP10-NEXT:    mffprwz r3, f0
1851; CHECK-PREP10-NEXT:    extsw r3, r3
1852; CHECK-PREP10-NEXT:    blr
1853entry:
1854  %and = and i64 %ptr, -1099511627776
1855  %or = or i64 %and, 1000000000000
1856  %0 = inttoptr i64 %or to ptr
1857  %1 = load float, ptr %0, align 4096
1858  %conv = fptosi float %1 to i32
1859  ret i32 %conv
1860}
1861
1862; Function Attrs: norecurse nounwind readonly uwtable willreturn
1863define dso_local signext i32 @ld_cst_align16_int32_t_float() {
1864; CHECK-LABEL: ld_cst_align16_int32_t_float:
1865; CHECK:       # %bb.0: # %entry
1866; CHECK-NEXT:    lfs f0, 4080(0)
1867; CHECK-NEXT:    xscvdpsxws f0, f0
1868; CHECK-NEXT:    mffprwz r3, f0
1869; CHECK-NEXT:    extsw r3, r3
1870; CHECK-NEXT:    blr
1871entry:
1872  %0 = load float, ptr inttoptr (i64 4080 to ptr), align 16
1873  %conv = fptosi float %0 to i32
1874  ret i32 %conv
1875}
1876
1877; Function Attrs: norecurse nounwind readonly uwtable willreturn
1878define dso_local signext i32 @ld_cst_align32_int32_t_float() {
1879; CHECK-LABEL: ld_cst_align32_int32_t_float:
1880; CHECK:       # %bb.0: # %entry
1881; CHECK-NEXT:    lis r3, 153
1882; CHECK-NEXT:    lfs f0, -27108(r3)
1883; CHECK-NEXT:    xscvdpsxws f0, f0
1884; CHECK-NEXT:    mffprwz r3, f0
1885; CHECK-NEXT:    extsw r3, r3
1886; CHECK-NEXT:    blr
1887entry:
1888  %0 = load float, ptr inttoptr (i64 9999900 to ptr), align 4
1889  %conv = fptosi float %0 to i32
1890  ret i32 %conv
1891}
1892
1893; Function Attrs: norecurse nounwind readonly uwtable willreturn
1894define dso_local signext i32 @ld_cst_align64_int32_t_float() {
1895; CHECK-P10-LABEL: ld_cst_align64_int32_t_float:
1896; CHECK-P10:       # %bb.0: # %entry
1897; CHECK-P10-NEXT:    pli r3, 244140625
1898; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
1899; CHECK-P10-NEXT:    lfs f0, 0(r3)
1900; CHECK-P10-NEXT:    xscvdpsxws f0, f0
1901; CHECK-P10-NEXT:    mffprwz r3, f0
1902; CHECK-P10-NEXT:    extsw r3, r3
1903; CHECK-P10-NEXT:    blr
1904;
1905; CHECK-PREP10-LABEL: ld_cst_align64_int32_t_float:
1906; CHECK-PREP10:       # %bb.0: # %entry
1907; CHECK-PREP10-NEXT:    lis r3, 3725
1908; CHECK-PREP10-NEXT:    ori r3, r3, 19025
1909; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
1910; CHECK-PREP10-NEXT:    lfs f0, 0(r3)
1911; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
1912; CHECK-PREP10-NEXT:    mffprwz r3, f0
1913; CHECK-PREP10-NEXT:    extsw r3, r3
1914; CHECK-PREP10-NEXT:    blr
1915entry:
1916  %0 = load float, ptr inttoptr (i64 1000000000000 to ptr), align 4096
1917  %conv = fptosi float %0 to i32
1918  ret i32 %conv
1919}
1920
1921; Function Attrs: norecurse nounwind readonly uwtable willreturn
1922define dso_local signext i32 @ld_0_int32_t_double(i64 %ptr) {
1923; CHECK-LABEL: ld_0_int32_t_double:
1924; CHECK:       # %bb.0: # %entry
1925; CHECK-NEXT:    lfd f0, 0(r3)
1926; CHECK-NEXT:    xscvdpsxws f0, f0
1927; CHECK-NEXT:    mffprwz r3, f0
1928; CHECK-NEXT:    extsw r3, r3
1929; CHECK-NEXT:    blr
1930entry:
1931  %0 = inttoptr i64 %ptr to ptr
1932  %1 = load double, ptr %0, align 8
1933  %conv = fptosi double %1 to i32
1934  ret i32 %conv
1935}
1936
1937; Function Attrs: norecurse nounwind readonly uwtable willreturn
1938define dso_local signext i32 @ld_align16_int32_t_double(ptr nocapture readonly %ptr) {
1939; CHECK-LABEL: ld_align16_int32_t_double:
1940; CHECK:       # %bb.0: # %entry
1941; CHECK-NEXT:    lfd f0, 8(r3)
1942; CHECK-NEXT:    xscvdpsxws f0, f0
1943; CHECK-NEXT:    mffprwz r3, f0
1944; CHECK-NEXT:    extsw r3, r3
1945; CHECK-NEXT:    blr
1946entry:
1947  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
1948  %0 = load double, ptr %add.ptr, align 8
1949  %conv = fptosi double %0 to i32
1950  ret i32 %conv
1951}
1952
1953; Function Attrs: norecurse nounwind readonly uwtable willreturn
1954define dso_local signext i32 @ld_align32_int32_t_double(ptr nocapture readonly %ptr) {
1955; CHECK-P10-LABEL: ld_align32_int32_t_double:
1956; CHECK-P10:       # %bb.0: # %entry
1957; CHECK-P10-NEXT:    plfd f0, 99999000(r3), 0
1958; CHECK-P10-NEXT:    xscvdpsxws f0, f0
1959; CHECK-P10-NEXT:    mffprwz r3, f0
1960; CHECK-P10-NEXT:    extsw r3, r3
1961; CHECK-P10-NEXT:    blr
1962;
1963; CHECK-PREP10-LABEL: ld_align32_int32_t_double:
1964; CHECK-PREP10:       # %bb.0: # %entry
1965; CHECK-PREP10-NEXT:    lis r4, 1525
1966; CHECK-PREP10-NEXT:    ori r4, r4, 56600
1967; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
1968; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
1969; CHECK-PREP10-NEXT:    mffprwz r3, f0
1970; CHECK-PREP10-NEXT:    extsw r3, r3
1971; CHECK-PREP10-NEXT:    blr
1972entry:
1973  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
1974  %0 = load double, ptr %add.ptr, align 8
1975  %conv = fptosi double %0 to i32
1976  ret i32 %conv
1977}
1978
1979; Function Attrs: norecurse nounwind readonly uwtable willreturn
1980define dso_local signext i32 @ld_align64_int32_t_double(ptr nocapture readonly %ptr) {
1981; CHECK-P10-LABEL: ld_align64_int32_t_double:
1982; CHECK-P10:       # %bb.0: # %entry
1983; CHECK-P10-NEXT:    pli r4, 244140625
1984; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
1985; CHECK-P10-NEXT:    lfdx f0, r3, r4
1986; CHECK-P10-NEXT:    xscvdpsxws f0, f0
1987; CHECK-P10-NEXT:    mffprwz r3, f0
1988; CHECK-P10-NEXT:    extsw r3, r3
1989; CHECK-P10-NEXT:    blr
1990;
1991; CHECK-PREP10-LABEL: ld_align64_int32_t_double:
1992; CHECK-PREP10:       # %bb.0: # %entry
1993; CHECK-PREP10-NEXT:    lis r4, 3725
1994; CHECK-PREP10-NEXT:    ori r4, r4, 19025
1995; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
1996; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
1997; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
1998; CHECK-PREP10-NEXT:    mffprwz r3, f0
1999; CHECK-PREP10-NEXT:    extsw r3, r3
2000; CHECK-PREP10-NEXT:    blr
2001entry:
2002  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2003  %0 = load double, ptr %add.ptr, align 8
2004  %conv = fptosi double %0 to i32
2005  ret i32 %conv
2006}
2007
2008; Function Attrs: norecurse nounwind readonly uwtable willreturn
2009define dso_local signext i32 @ld_reg_int32_t_double(ptr nocapture readonly %ptr, i64 %off) {
2010; CHECK-LABEL: ld_reg_int32_t_double:
2011; CHECK:       # %bb.0: # %entry
2012; CHECK-NEXT:    lfdx f0, r3, r4
2013; CHECK-NEXT:    xscvdpsxws f0, f0
2014; CHECK-NEXT:    mffprwz r3, f0
2015; CHECK-NEXT:    extsw r3, r3
2016; CHECK-NEXT:    blr
2017entry:
2018  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2019  %0 = load double, ptr %add.ptr, align 8
2020  %conv = fptosi double %0 to i32
2021  ret i32 %conv
2022}
2023
2024; Function Attrs: norecurse nounwind readonly uwtable willreturn
2025define dso_local signext i32 @ld_or_int32_t_double(i64 %ptr, i8 zeroext %off) {
2026; CHECK-LABEL: ld_or_int32_t_double:
2027; CHECK:       # %bb.0: # %entry
2028; CHECK-NEXT:    or r3, r4, r3
2029; CHECK-NEXT:    lfd f0, 0(r3)
2030; CHECK-NEXT:    xscvdpsxws f0, f0
2031; CHECK-NEXT:    mffprwz r3, f0
2032; CHECK-NEXT:    extsw r3, r3
2033; CHECK-NEXT:    blr
2034entry:
2035  %conv = zext i8 %off to i64
2036  %or = or i64 %conv, %ptr
2037  %0 = inttoptr i64 %or to ptr
2038  %1 = load double, ptr %0, align 8
2039  %conv1 = fptosi double %1 to i32
2040  ret i32 %conv1
2041}
2042
2043; Function Attrs: norecurse nounwind readonly uwtable willreturn
2044define dso_local signext i32 @ld_or2_int32_t_double(i64 %ptr, i8 zeroext %off) {
2045; CHECK-LABEL: ld_or2_int32_t_double:
2046; CHECK:       # %bb.0: # %entry
2047; CHECK-NEXT:    rldicr r3, r3, 0, 51
2048; CHECK-NEXT:    lfdx f0, r3, r4
2049; CHECK-NEXT:    xscvdpsxws f0, f0
2050; CHECK-NEXT:    mffprwz r3, f0
2051; CHECK-NEXT:    extsw r3, r3
2052; CHECK-NEXT:    blr
2053entry:
2054  %and = and i64 %ptr, -4096
2055  %conv = zext i8 %off to i64
2056  %or = or i64 %and, %conv
2057  %0 = inttoptr i64 %or to ptr
2058  %1 = load double, ptr %0, align 8
2059  %conv1 = fptosi double %1 to i32
2060  ret i32 %conv1
2061}
2062
2063; Function Attrs: norecurse nounwind readonly uwtable willreturn
2064define dso_local signext i32 @ld_not_disjoint16_int32_t_double(i64 %ptr) {
2065; CHECK-LABEL: ld_not_disjoint16_int32_t_double:
2066; CHECK:       # %bb.0: # %entry
2067; CHECK-NEXT:    ori r3, r3, 6
2068; CHECK-NEXT:    lfd f0, 0(r3)
2069; CHECK-NEXT:    xscvdpsxws f0, f0
2070; CHECK-NEXT:    mffprwz r3, f0
2071; CHECK-NEXT:    extsw r3, r3
2072; CHECK-NEXT:    blr
2073entry:
2074  %or = or i64 %ptr, 6
2075  %0 = inttoptr i64 %or to ptr
2076  %1 = load double, ptr %0, align 8
2077  %conv = fptosi double %1 to i32
2078  ret i32 %conv
2079}
2080
2081; Function Attrs: norecurse nounwind readonly uwtable willreturn
2082define dso_local signext i32 @ld_disjoint_align16_int32_t_double(i64 %ptr) {
2083; CHECK-LABEL: ld_disjoint_align16_int32_t_double:
2084; CHECK:       # %bb.0: # %entry
2085; CHECK-NEXT:    rldicr r3, r3, 0, 51
2086; CHECK-NEXT:    lfd f0, 24(r3)
2087; CHECK-NEXT:    xscvdpsxws f0, f0
2088; CHECK-NEXT:    mffprwz r3, f0
2089; CHECK-NEXT:    extsw r3, r3
2090; CHECK-NEXT:    blr
2091entry:
2092  %and = and i64 %ptr, -4096
2093  %or = or i64 %and, 24
2094  %0 = inttoptr i64 %or to ptr
2095  %1 = load double, ptr %0, align 8
2096  %conv = fptosi double %1 to i32
2097  ret i32 %conv
2098}
2099
2100; Function Attrs: norecurse nounwind readonly uwtable willreturn
2101define dso_local signext i32 @ld_not_disjoint32_int32_t_double(i64 %ptr) {
2102; CHECK-LABEL: ld_not_disjoint32_int32_t_double:
2103; CHECK:       # %bb.0: # %entry
2104; CHECK-NEXT:    ori r3, r3, 34463
2105; CHECK-NEXT:    oris r3, r3, 1
2106; CHECK-NEXT:    lfd f0, 0(r3)
2107; CHECK-NEXT:    xscvdpsxws f0, f0
2108; CHECK-NEXT:    mffprwz r3, f0
2109; CHECK-NEXT:    extsw r3, r3
2110; CHECK-NEXT:    blr
2111entry:
2112  %or = or i64 %ptr, 99999
2113  %0 = inttoptr i64 %or to ptr
2114  %1 = load double, ptr %0, align 8
2115  %conv = fptosi double %1 to i32
2116  ret i32 %conv
2117}
2118
2119; Function Attrs: norecurse nounwind readonly uwtable willreturn
2120define dso_local signext i32 @ld_disjoint_align32_int32_t_double(i64 %ptr) {
2121; CHECK-P10-LABEL: ld_disjoint_align32_int32_t_double:
2122; CHECK-P10:       # %bb.0: # %entry
2123; CHECK-P10-NEXT:    lis r4, -15264
2124; CHECK-P10-NEXT:    and r3, r3, r4
2125; CHECK-P10-NEXT:    plfd f0, 999990000(r3), 0
2126; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2127; CHECK-P10-NEXT:    mffprwz r3, f0
2128; CHECK-P10-NEXT:    extsw r3, r3
2129; CHECK-P10-NEXT:    blr
2130;
2131; CHECK-PREP10-LABEL: ld_disjoint_align32_int32_t_double:
2132; CHECK-PREP10:       # %bb.0: # %entry
2133; CHECK-PREP10-NEXT:    lis r4, -15264
2134; CHECK-PREP10-NEXT:    and r3, r3, r4
2135; CHECK-PREP10-NEXT:    lis r4, 15258
2136; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2137; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
2138; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2139; CHECK-PREP10-NEXT:    mffprwz r3, f0
2140; CHECK-PREP10-NEXT:    extsw r3, r3
2141; CHECK-PREP10-NEXT:    blr
2142entry:
2143  %and = and i64 %ptr, -1000341504
2144  %or = or i64 %and, 999990000
2145  %0 = inttoptr i64 %or to ptr
2146  %1 = load double, ptr %0, align 16
2147  %conv = fptosi double %1 to i32
2148  ret i32 %conv
2149}
2150
2151; Function Attrs: norecurse nounwind readonly uwtable willreturn
2152define dso_local signext i32 @ld_not_disjoint64_int32_t_double(i64 %ptr) {
2153; CHECK-P10-LABEL: ld_not_disjoint64_int32_t_double:
2154; CHECK-P10:       # %bb.0: # %entry
2155; CHECK-P10-NEXT:    pli r4, 232
2156; CHECK-P10-NEXT:    pli r5, 3567587329
2157; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2158; CHECK-P10-NEXT:    or r3, r3, r5
2159; CHECK-P10-NEXT:    lfd f0, 0(r3)
2160; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2161; CHECK-P10-NEXT:    mffprwz r3, f0
2162; CHECK-P10-NEXT:    extsw r3, r3
2163; CHECK-P10-NEXT:    blr
2164;
2165; CHECK-PREP10-LABEL: ld_not_disjoint64_int32_t_double:
2166; CHECK-PREP10:       # %bb.0: # %entry
2167; CHECK-PREP10-NEXT:    li r4, 29
2168; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2169; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2170; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2171; CHECK-PREP10-NEXT:    or r3, r3, r4
2172; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
2173; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2174; CHECK-PREP10-NEXT:    mffprwz r3, f0
2175; CHECK-PREP10-NEXT:    extsw r3, r3
2176; CHECK-PREP10-NEXT:    blr
2177entry:
2178  %or = or i64 %ptr, 1000000000001
2179  %0 = inttoptr i64 %or to ptr
2180  %1 = load double, ptr %0, align 8
2181  %conv = fptosi double %1 to i32
2182  ret i32 %conv
2183}
2184
2185; Function Attrs: norecurse nounwind readonly uwtable willreturn
2186define dso_local signext i32 @ld_disjoint_align64_int32_t_double(i64 %ptr) {
2187; CHECK-P10-LABEL: ld_disjoint_align64_int32_t_double:
2188; CHECK-P10:       # %bb.0: # %entry
2189; CHECK-P10-NEXT:    pli r4, 244140625
2190; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2191; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2192; CHECK-P10-NEXT:    lfdx f0, r3, r4
2193; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2194; CHECK-P10-NEXT:    mffprwz r3, f0
2195; CHECK-P10-NEXT:    extsw r3, r3
2196; CHECK-P10-NEXT:    blr
2197;
2198; CHECK-PREP10-LABEL: ld_disjoint_align64_int32_t_double:
2199; CHECK-PREP10:       # %bb.0: # %entry
2200; CHECK-PREP10-NEXT:    lis r4, 3725
2201; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2202; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2203; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2204; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
2205; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2206; CHECK-PREP10-NEXT:    mffprwz r3, f0
2207; CHECK-PREP10-NEXT:    extsw r3, r3
2208; CHECK-PREP10-NEXT:    blr
2209entry:
2210  %and = and i64 %ptr, -1099511627776
2211  %or = or i64 %and, 1000000000000
2212  %0 = inttoptr i64 %or to ptr
2213  %1 = load double, ptr %0, align 4096
2214  %conv = fptosi double %1 to i32
2215  ret i32 %conv
2216}
2217
2218; Function Attrs: norecurse nounwind readonly uwtable willreturn
2219define dso_local signext i32 @ld_cst_align16_int32_t_double() {
2220; CHECK-LABEL: ld_cst_align16_int32_t_double:
2221; CHECK:       # %bb.0: # %entry
2222; CHECK-NEXT:    lfd f0, 4080(0)
2223; CHECK-NEXT:    xscvdpsxws f0, f0
2224; CHECK-NEXT:    mffprwz r3, f0
2225; CHECK-NEXT:    extsw r3, r3
2226; CHECK-NEXT:    blr
2227entry:
2228  %0 = load double, ptr inttoptr (i64 4080 to ptr), align 16
2229  %conv = fptosi double %0 to i32
2230  ret i32 %conv
2231}
2232
2233; Function Attrs: norecurse nounwind readonly uwtable willreturn
2234define dso_local signext i32 @ld_cst_align32_int32_t_double() {
2235; CHECK-LABEL: ld_cst_align32_int32_t_double:
2236; CHECK:       # %bb.0: # %entry
2237; CHECK-NEXT:    lis r3, 153
2238; CHECK-NEXT:    lfd f0, -27108(r3)
2239; CHECK-NEXT:    xscvdpsxws f0, f0
2240; CHECK-NEXT:    mffprwz r3, f0
2241; CHECK-NEXT:    extsw r3, r3
2242; CHECK-NEXT:    blr
2243entry:
2244  %0 = load double, ptr inttoptr (i64 9999900 to ptr), align 8
2245  %conv = fptosi double %0 to i32
2246  ret i32 %conv
2247}
2248
2249; Function Attrs: norecurse nounwind readonly uwtable willreturn
2250define dso_local signext i32 @ld_cst_align64_int32_t_double() {
2251; CHECK-P10-LABEL: ld_cst_align64_int32_t_double:
2252; CHECK-P10:       # %bb.0: # %entry
2253; CHECK-P10-NEXT:    pli r3, 244140625
2254; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2255; CHECK-P10-NEXT:    lfd f0, 0(r3)
2256; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2257; CHECK-P10-NEXT:    mffprwz r3, f0
2258; CHECK-P10-NEXT:    extsw r3, r3
2259; CHECK-P10-NEXT:    blr
2260;
2261; CHECK-PREP10-LABEL: ld_cst_align64_int32_t_double:
2262; CHECK-PREP10:       # %bb.0: # %entry
2263; CHECK-PREP10-NEXT:    lis r3, 3725
2264; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2265; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2266; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
2267; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2268; CHECK-PREP10-NEXT:    mffprwz r3, f0
2269; CHECK-PREP10-NEXT:    extsw r3, r3
2270; CHECK-PREP10-NEXT:    blr
2271entry:
2272  %0 = load double, ptr inttoptr (i64 1000000000000 to ptr), align 4096
2273  %conv = fptosi double %0 to i32
2274  ret i32 %conv
2275}
2276
2277; Function Attrs: norecurse nounwind readonly uwtable willreturn
2278define dso_local zeroext i32 @ld_0_uint32_t_uint8_t(i64 %ptr) {
2279; CHECK-LABEL: ld_0_uint32_t_uint8_t:
2280; CHECK:       # %bb.0: # %entry
2281; CHECK-NEXT:    lbz r3, 0(r3)
2282; CHECK-NEXT:    blr
2283entry:
2284  %0 = inttoptr i64 %ptr to ptr
2285  %1 = load i8, ptr %0, align 1
2286  %conv = zext i8 %1 to i32
2287  ret i32 %conv
2288}
2289
2290; Function Attrs: norecurse nounwind readonly uwtable willreturn
2291define dso_local zeroext i32 @ld_align16_uint32_t_uint8_t(ptr nocapture readonly %ptr) {
2292; CHECK-LABEL: ld_align16_uint32_t_uint8_t:
2293; CHECK:       # %bb.0: # %entry
2294; CHECK-NEXT:    lbz r3, 8(r3)
2295; CHECK-NEXT:    blr
2296entry:
2297  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2298  %0 = load i8, ptr %add.ptr, align 1
2299  %conv = zext i8 %0 to i32
2300  ret i32 %conv
2301}
2302
2303; Function Attrs: norecurse nounwind readonly uwtable willreturn
2304define dso_local zeroext i32 @ld_align32_uint32_t_uint8_t(ptr nocapture readonly %ptr) {
2305; CHECK-P10-LABEL: ld_align32_uint32_t_uint8_t:
2306; CHECK-P10:       # %bb.0: # %entry
2307; CHECK-P10-NEXT:    plbz r3, 99999000(r3), 0
2308; CHECK-P10-NEXT:    blr
2309;
2310; CHECK-PREP10-LABEL: ld_align32_uint32_t_uint8_t:
2311; CHECK-PREP10:       # %bb.0: # %entry
2312; CHECK-PREP10-NEXT:    lis r4, 1525
2313; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2314; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2315; CHECK-PREP10-NEXT:    blr
2316entry:
2317  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2318  %0 = load i8, ptr %add.ptr, align 1
2319  %conv = zext i8 %0 to i32
2320  ret i32 %conv
2321}
2322
2323; Function Attrs: norecurse nounwind readonly uwtable willreturn
2324define dso_local zeroext i32 @ld_align64_uint32_t_uint8_t(ptr nocapture readonly %ptr) {
2325; CHECK-P10-LABEL: ld_align64_uint32_t_uint8_t:
2326; CHECK-P10:       # %bb.0: # %entry
2327; CHECK-P10-NEXT:    pli r4, 244140625
2328; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2329; CHECK-P10-NEXT:    lbzx r3, r3, r4
2330; CHECK-P10-NEXT:    blr
2331;
2332; CHECK-PREP10-LABEL: ld_align64_uint32_t_uint8_t:
2333; CHECK-PREP10:       # %bb.0: # %entry
2334; CHECK-PREP10-NEXT:    lis r4, 3725
2335; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2336; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2337; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2338; CHECK-PREP10-NEXT:    blr
2339entry:
2340  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2341  %0 = load i8, ptr %add.ptr, align 1
2342  %conv = zext i8 %0 to i32
2343  ret i32 %conv
2344}
2345
2346; Function Attrs: norecurse nounwind readonly uwtable willreturn
2347define dso_local zeroext i32 @ld_reg_uint32_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) {
2348; CHECK-LABEL: ld_reg_uint32_t_uint8_t:
2349; CHECK:       # %bb.0: # %entry
2350; CHECK-NEXT:    lbzx r3, r3, r4
2351; CHECK-NEXT:    blr
2352entry:
2353  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2354  %0 = load i8, ptr %add.ptr, align 1
2355  %conv = zext i8 %0 to i32
2356  ret i32 %conv
2357}
2358
2359; Function Attrs: norecurse nounwind readonly uwtable willreturn
2360define dso_local zeroext i32 @ld_or_uint32_t_uint8_t(i64 %ptr, i8 zeroext %off) {
2361; CHECK-LABEL: ld_or_uint32_t_uint8_t:
2362; CHECK:       # %bb.0: # %entry
2363; CHECK-NEXT:    or r3, r4, r3
2364; CHECK-NEXT:    lbz r3, 0(r3)
2365; CHECK-NEXT:    blr
2366entry:
2367  %conv = zext i8 %off to i64
2368  %or = or i64 %conv, %ptr
2369  %0 = inttoptr i64 %or to ptr
2370  %1 = load i8, ptr %0, align 1
2371  %conv1 = zext i8 %1 to i32
2372  ret i32 %conv1
2373}
2374
2375; Function Attrs: norecurse nounwind readonly uwtable willreturn
2376define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_uint8_t(i64 %ptr) {
2377; CHECK-LABEL: ld_not_disjoint16_uint32_t_uint8_t:
2378; CHECK:       # %bb.0: # %entry
2379; CHECK-NEXT:    ori r3, r3, 6
2380; CHECK-NEXT:    lbz r3, 0(r3)
2381; CHECK-NEXT:    blr
2382entry:
2383  %or = or i64 %ptr, 6
2384  %0 = inttoptr i64 %or to ptr
2385  %1 = load i8, ptr %0, align 1
2386  %conv = zext i8 %1 to i32
2387  ret i32 %conv
2388}
2389
2390; Function Attrs: norecurse nounwind readonly uwtable willreturn
2391define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_uint8_t(i64 %ptr) {
2392; CHECK-LABEL: ld_disjoint_align16_uint32_t_uint8_t:
2393; CHECK:       # %bb.0: # %entry
2394; CHECK-NEXT:    rldicr r3, r3, 0, 51
2395; CHECK-NEXT:    lbz r3, 24(r3)
2396; CHECK-NEXT:    blr
2397entry:
2398  %and = and i64 %ptr, -4096
2399  %or = or i64 %and, 24
2400  %0 = inttoptr i64 %or to ptr
2401  %1 = load i8, ptr %0, align 8
2402  %conv = zext i8 %1 to i32
2403  ret i32 %conv
2404}
2405
2406; Function Attrs: norecurse nounwind readonly uwtable willreturn
2407define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_uint8_t(i64 %ptr) {
2408; CHECK-LABEL: ld_not_disjoint32_uint32_t_uint8_t:
2409; CHECK:       # %bb.0: # %entry
2410; CHECK-NEXT:    ori r3, r3, 34463
2411; CHECK-NEXT:    oris r3, r3, 1
2412; CHECK-NEXT:    lbz r3, 0(r3)
2413; CHECK-NEXT:    blr
2414entry:
2415  %or = or i64 %ptr, 99999
2416  %0 = inttoptr i64 %or to ptr
2417  %1 = load i8, ptr %0, align 1
2418  %conv = zext i8 %1 to i32
2419  ret i32 %conv
2420}
2421
2422; Function Attrs: norecurse nounwind readonly uwtable willreturn
2423define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_uint8_t(i64 %ptr) {
2424; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_uint8_t:
2425; CHECK-P10:       # %bb.0: # %entry
2426; CHECK-P10-NEXT:    lis r4, -15264
2427; CHECK-P10-NEXT:    and r3, r3, r4
2428; CHECK-P10-NEXT:    plbz r3, 999990000(r3), 0
2429; CHECK-P10-NEXT:    blr
2430;
2431; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_uint8_t:
2432; CHECK-PREP10:       # %bb.0: # %entry
2433; CHECK-PREP10-NEXT:    lis r4, -15264
2434; CHECK-PREP10-NEXT:    and r3, r3, r4
2435; CHECK-PREP10-NEXT:    lis r4, 15258
2436; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2437; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2438; CHECK-PREP10-NEXT:    blr
2439entry:
2440  %and = and i64 %ptr, -1000341504
2441  %or = or i64 %and, 999990000
2442  %0 = inttoptr i64 %or to ptr
2443  %1 = load i8, ptr %0, align 16
2444  %conv = zext i8 %1 to i32
2445  ret i32 %conv
2446}
2447
2448; Function Attrs: norecurse nounwind readonly uwtable willreturn
2449define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_uint8_t(i64 %ptr) {
2450; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_uint8_t:
2451; CHECK-P10:       # %bb.0: # %entry
2452; CHECK-P10-NEXT:    pli r4, 232
2453; CHECK-P10-NEXT:    pli r5, 3567587329
2454; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2455; CHECK-P10-NEXT:    or r3, r3, r5
2456; CHECK-P10-NEXT:    lbz r3, 0(r3)
2457; CHECK-P10-NEXT:    blr
2458;
2459; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_uint8_t:
2460; CHECK-PREP10:       # %bb.0: # %entry
2461; CHECK-PREP10-NEXT:    li r4, 29
2462; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2463; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2464; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2465; CHECK-PREP10-NEXT:    or r3, r3, r4
2466; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
2467; CHECK-PREP10-NEXT:    blr
2468entry:
2469  %or = or i64 %ptr, 1000000000001
2470  %0 = inttoptr i64 %or to ptr
2471  %1 = load i8, ptr %0, align 1
2472  %conv = zext i8 %1 to i32
2473  ret i32 %conv
2474}
2475
2476; Function Attrs: norecurse nounwind readonly uwtable willreturn
2477define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_uint8_t(i64 %ptr) {
2478; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_uint8_t:
2479; CHECK-P10:       # %bb.0: # %entry
2480; CHECK-P10-NEXT:    pli r4, 244140625
2481; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2482; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2483; CHECK-P10-NEXT:    lbzx r3, r3, r4
2484; CHECK-P10-NEXT:    blr
2485;
2486; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_uint8_t:
2487; CHECK-PREP10:       # %bb.0: # %entry
2488; CHECK-PREP10-NEXT:    lis r4, 3725
2489; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2490; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2491; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2492; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2493; CHECK-PREP10-NEXT:    blr
2494entry:
2495  %and = and i64 %ptr, -1099511627776
2496  %or = or i64 %and, 1000000000000
2497  %0 = inttoptr i64 %or to ptr
2498  %1 = load i8, ptr %0, align 4096
2499  %conv = zext i8 %1 to i32
2500  ret i32 %conv
2501}
2502
2503; Function Attrs: norecurse nounwind readonly uwtable willreturn
2504define dso_local zeroext i32 @ld_cst_align16_uint32_t_uint8_t() {
2505; CHECK-LABEL: ld_cst_align16_uint32_t_uint8_t:
2506; CHECK:       # %bb.0: # %entry
2507; CHECK-NEXT:    lbz r3, 4080(0)
2508; CHECK-NEXT:    blr
2509entry:
2510  %0 = load i8, ptr inttoptr (i64 4080 to ptr), align 16
2511  %conv = zext i8 %0 to i32
2512  ret i32 %conv
2513}
2514
2515; Function Attrs: norecurse nounwind readonly uwtable willreturn
2516define dso_local zeroext i32 @ld_cst_align32_uint32_t_uint8_t() {
2517; CHECK-LABEL: ld_cst_align32_uint32_t_uint8_t:
2518; CHECK:       # %bb.0: # %entry
2519; CHECK-NEXT:    lis r3, 153
2520; CHECK-NEXT:    lbz r3, -27108(r3)
2521; CHECK-NEXT:    blr
2522entry:
2523  %0 = load i8, ptr inttoptr (i64 9999900 to ptr), align 4
2524  %conv = zext i8 %0 to i32
2525  ret i32 %conv
2526}
2527
2528; Function Attrs: norecurse nounwind readonly uwtable willreturn
2529define dso_local zeroext i32 @ld_cst_align64_uint32_t_uint8_t() {
2530; CHECK-P10-LABEL: ld_cst_align64_uint32_t_uint8_t:
2531; CHECK-P10:       # %bb.0: # %entry
2532; CHECK-P10-NEXT:    pli r3, 244140625
2533; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2534; CHECK-P10-NEXT:    lbz r3, 0(r3)
2535; CHECK-P10-NEXT:    blr
2536;
2537; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_uint8_t:
2538; CHECK-PREP10:       # %bb.0: # %entry
2539; CHECK-PREP10-NEXT:    lis r3, 3725
2540; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2541; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2542; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
2543; CHECK-PREP10-NEXT:    blr
2544entry:
2545  %0 = load i8, ptr inttoptr (i64 1000000000000 to ptr), align 4096
2546  %conv = zext i8 %0 to i32
2547  ret i32 %conv
2548}
2549
2550; Function Attrs: norecurse nounwind readonly uwtable willreturn
2551define dso_local zeroext i32 @ld_0_uint32_t_int8_t(i64 %ptr) {
2552; CHECK-LABEL: ld_0_uint32_t_int8_t:
2553; CHECK:       # %bb.0: # %entry
2554; CHECK-NEXT:    lbz r3, 0(r3)
2555; CHECK-NEXT:    extsb r3, r3
2556; CHECK-NEXT:    clrldi r3, r3, 32
2557; CHECK-NEXT:    blr
2558entry:
2559  %0 = inttoptr i64 %ptr to ptr
2560  %1 = load i8, ptr %0, align 1
2561  %conv = sext i8 %1 to i32
2562  ret i32 %conv
2563}
2564
2565; Function Attrs: norecurse nounwind readonly uwtable willreturn
2566define dso_local zeroext i32 @ld_align16_uint32_t_int8_t(ptr nocapture readonly %ptr) {
2567; CHECK-LABEL: ld_align16_uint32_t_int8_t:
2568; CHECK:       # %bb.0: # %entry
2569; CHECK-NEXT:    lbz r3, 8(r3)
2570; CHECK-NEXT:    extsb r3, r3
2571; CHECK-NEXT:    clrldi r3, r3, 32
2572; CHECK-NEXT:    blr
2573entry:
2574  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2575  %0 = load i8, ptr %add.ptr, align 1
2576  %conv = sext i8 %0 to i32
2577  ret i32 %conv
2578}
2579
2580; Function Attrs: norecurse nounwind readonly uwtable willreturn
2581define dso_local zeroext i32 @ld_align32_uint32_t_int8_t(ptr nocapture readonly %ptr) {
2582; CHECK-P10-LABEL: ld_align32_uint32_t_int8_t:
2583; CHECK-P10:       # %bb.0: # %entry
2584; CHECK-P10-NEXT:    plbz r3, 99999000(r3), 0
2585; CHECK-P10-NEXT:    extsb r3, r3
2586; CHECK-P10-NEXT:    clrldi r3, r3, 32
2587; CHECK-P10-NEXT:    blr
2588;
2589; CHECK-PREP10-LABEL: ld_align32_uint32_t_int8_t:
2590; CHECK-PREP10:       # %bb.0: # %entry
2591; CHECK-PREP10-NEXT:    lis r4, 1525
2592; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2593; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2594; CHECK-PREP10-NEXT:    extsb r3, r3
2595; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2596; CHECK-PREP10-NEXT:    blr
2597entry:
2598  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2599  %0 = load i8, ptr %add.ptr, align 1
2600  %conv = sext i8 %0 to i32
2601  ret i32 %conv
2602}
2603
2604; Function Attrs: norecurse nounwind readonly uwtable willreturn
2605define dso_local zeroext i32 @ld_align64_uint32_t_int8_t(ptr nocapture readonly %ptr) {
2606; CHECK-P10-LABEL: ld_align64_uint32_t_int8_t:
2607; CHECK-P10:       # %bb.0: # %entry
2608; CHECK-P10-NEXT:    pli r4, 244140625
2609; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2610; CHECK-P10-NEXT:    lbzx r3, r3, r4
2611; CHECK-P10-NEXT:    extsb r3, r3
2612; CHECK-P10-NEXT:    clrldi r3, r3, 32
2613; CHECK-P10-NEXT:    blr
2614;
2615; CHECK-PREP10-LABEL: ld_align64_uint32_t_int8_t:
2616; CHECK-PREP10:       # %bb.0: # %entry
2617; CHECK-PREP10-NEXT:    lis r4, 3725
2618; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2619; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2620; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2621; CHECK-PREP10-NEXT:    extsb r3, r3
2622; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2623; CHECK-PREP10-NEXT:    blr
2624entry:
2625  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2626  %0 = load i8, ptr %add.ptr, align 1
2627  %conv = sext i8 %0 to i32
2628  ret i32 %conv
2629}
2630
2631; Function Attrs: norecurse nounwind readonly uwtable willreturn
2632define dso_local zeroext i32 @ld_reg_uint32_t_int8_t(ptr nocapture readonly %ptr, i64 %off) {
2633; CHECK-LABEL: ld_reg_uint32_t_int8_t:
2634; CHECK:       # %bb.0: # %entry
2635; CHECK-NEXT:    lbzx r3, r3, r4
2636; CHECK-NEXT:    extsb r3, r3
2637; CHECK-NEXT:    clrldi r3, r3, 32
2638; CHECK-NEXT:    blr
2639entry:
2640  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2641  %0 = load i8, ptr %add.ptr, align 1
2642  %conv = sext i8 %0 to i32
2643  ret i32 %conv
2644}
2645
2646; Function Attrs: norecurse nounwind readonly uwtable willreturn
2647define dso_local zeroext i32 @ld_or_uint32_t_int8_t(i64 %ptr, i8 zeroext %off) {
2648; CHECK-LABEL: ld_or_uint32_t_int8_t:
2649; CHECK:       # %bb.0: # %entry
2650; CHECK-NEXT:    or r3, r4, r3
2651; CHECK-NEXT:    lbz r3, 0(r3)
2652; CHECK-NEXT:    extsb r3, r3
2653; CHECK-NEXT:    clrldi r3, r3, 32
2654; CHECK-NEXT:    blr
2655entry:
2656  %conv = zext i8 %off to i64
2657  %or = or i64 %conv, %ptr
2658  %0 = inttoptr i64 %or to ptr
2659  %1 = load i8, ptr %0, align 1
2660  %conv1 = sext i8 %1 to i32
2661  ret i32 %conv1
2662}
2663
2664; Function Attrs: norecurse nounwind readonly uwtable willreturn
2665define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_int8_t(i64 %ptr) {
2666; CHECK-LABEL: ld_not_disjoint16_uint32_t_int8_t:
2667; CHECK:       # %bb.0: # %entry
2668; CHECK-NEXT:    ori r3, r3, 6
2669; CHECK-NEXT:    lbz r3, 0(r3)
2670; CHECK-NEXT:    extsb r3, r3
2671; CHECK-NEXT:    clrldi r3, r3, 32
2672; CHECK-NEXT:    blr
2673entry:
2674  %or = or i64 %ptr, 6
2675  %0 = inttoptr i64 %or to ptr
2676  %1 = load i8, ptr %0, align 1
2677  %conv = sext i8 %1 to i32
2678  ret i32 %conv
2679}
2680
2681; Function Attrs: norecurse nounwind readonly uwtable willreturn
2682define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_int8_t(i64 %ptr) {
2683; CHECK-LABEL: ld_disjoint_align16_uint32_t_int8_t:
2684; CHECK:       # %bb.0: # %entry
2685; CHECK-NEXT:    rldicr r3, r3, 0, 51
2686; CHECK-NEXT:    lbz r3, 24(r3)
2687; CHECK-NEXT:    extsb r3, r3
2688; CHECK-NEXT:    clrldi r3, r3, 32
2689; CHECK-NEXT:    blr
2690entry:
2691  %and = and i64 %ptr, -4096
2692  %or = or i64 %and, 24
2693  %0 = inttoptr i64 %or to ptr
2694  %1 = load i8, ptr %0, align 8
2695  %conv = sext i8 %1 to i32
2696  ret i32 %conv
2697}
2698
2699; Function Attrs: norecurse nounwind readonly uwtable willreturn
2700define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_int8_t(i64 %ptr) {
2701; CHECK-LABEL: ld_not_disjoint32_uint32_t_int8_t:
2702; CHECK:       # %bb.0: # %entry
2703; CHECK-NEXT:    ori r3, r3, 34463
2704; CHECK-NEXT:    oris r3, r3, 1
2705; CHECK-NEXT:    lbz r3, 0(r3)
2706; CHECK-NEXT:    extsb r3, r3
2707; CHECK-NEXT:    clrldi r3, r3, 32
2708; CHECK-NEXT:    blr
2709entry:
2710  %or = or i64 %ptr, 99999
2711  %0 = inttoptr i64 %or to ptr
2712  %1 = load i8, ptr %0, align 1
2713  %conv = sext i8 %1 to i32
2714  ret i32 %conv
2715}
2716
2717; Function Attrs: norecurse nounwind readonly uwtable willreturn
2718define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_int8_t(i64 %ptr) {
2719; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_int8_t:
2720; CHECK-P10:       # %bb.0: # %entry
2721; CHECK-P10-NEXT:    lis r4, -15264
2722; CHECK-P10-NEXT:    and r3, r3, r4
2723; CHECK-P10-NEXT:    plbz r3, 999990000(r3), 0
2724; CHECK-P10-NEXT:    extsb r3, r3
2725; CHECK-P10-NEXT:    clrldi r3, r3, 32
2726; CHECK-P10-NEXT:    blr
2727;
2728; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_int8_t:
2729; CHECK-PREP10:       # %bb.0: # %entry
2730; CHECK-PREP10-NEXT:    lis r4, -15264
2731; CHECK-PREP10-NEXT:    and r3, r3, r4
2732; CHECK-PREP10-NEXT:    lis r4, 15258
2733; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2734; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2735; CHECK-PREP10-NEXT:    extsb r3, r3
2736; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2737; CHECK-PREP10-NEXT:    blr
2738entry:
2739  %and = and i64 %ptr, -1000341504
2740  %or = or i64 %and, 999990000
2741  %0 = inttoptr i64 %or to ptr
2742  %1 = load i8, ptr %0, align 16
2743  %conv = sext i8 %1 to i32
2744  ret i32 %conv
2745}
2746
2747; Function Attrs: norecurse nounwind readonly uwtable willreturn
2748define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_int8_t(i64 %ptr) {
2749; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_int8_t:
2750; CHECK-P10:       # %bb.0: # %entry
2751; CHECK-P10-NEXT:    pli r4, 232
2752; CHECK-P10-NEXT:    pli r5, 3567587329
2753; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2754; CHECK-P10-NEXT:    or r3, r3, r5
2755; CHECK-P10-NEXT:    lbz r3, 0(r3)
2756; CHECK-P10-NEXT:    extsb r3, r3
2757; CHECK-P10-NEXT:    clrldi r3, r3, 32
2758; CHECK-P10-NEXT:    blr
2759;
2760; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_int8_t:
2761; CHECK-PREP10:       # %bb.0: # %entry
2762; CHECK-PREP10-NEXT:    li r4, 29
2763; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2764; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2765; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2766; CHECK-PREP10-NEXT:    or r3, r3, r4
2767; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
2768; CHECK-PREP10-NEXT:    extsb r3, r3
2769; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2770; CHECK-PREP10-NEXT:    blr
2771entry:
2772  %or = or i64 %ptr, 1000000000001
2773  %0 = inttoptr i64 %or to ptr
2774  %1 = load i8, ptr %0, align 1
2775  %conv = sext i8 %1 to i32
2776  ret i32 %conv
2777}
2778
2779; Function Attrs: norecurse nounwind readonly uwtable willreturn
2780define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_int8_t(i64 %ptr) {
2781; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_int8_t:
2782; CHECK-P10:       # %bb.0: # %entry
2783; CHECK-P10-NEXT:    pli r4, 244140625
2784; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2785; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2786; CHECK-P10-NEXT:    lbzx r3, r3, r4
2787; CHECK-P10-NEXT:    extsb r3, r3
2788; CHECK-P10-NEXT:    clrldi r3, r3, 32
2789; CHECK-P10-NEXT:    blr
2790;
2791; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_int8_t:
2792; CHECK-PREP10:       # %bb.0: # %entry
2793; CHECK-PREP10-NEXT:    lis r4, 3725
2794; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2795; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2796; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2797; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2798; CHECK-PREP10-NEXT:    extsb r3, r3
2799; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2800; CHECK-PREP10-NEXT:    blr
2801entry:
2802  %and = and i64 %ptr, -1099511627776
2803  %or = or i64 %and, 1000000000000
2804  %0 = inttoptr i64 %or to ptr
2805  %1 = load i8, ptr %0, align 4096
2806  %conv = sext i8 %1 to i32
2807  ret i32 %conv
2808}
2809
2810; Function Attrs: norecurse nounwind readonly uwtable willreturn
2811define dso_local zeroext i32 @ld_cst_align16_uint32_t_int8_t() {
2812; CHECK-LABEL: ld_cst_align16_uint32_t_int8_t:
2813; CHECK:       # %bb.0: # %entry
2814; CHECK-NEXT:    lbz r3, 4080(0)
2815; CHECK-NEXT:    extsb r3, r3
2816; CHECK-NEXT:    clrldi r3, r3, 32
2817; CHECK-NEXT:    blr
2818entry:
2819  %0 = load i8, ptr inttoptr (i64 4080 to ptr), align 16
2820  %conv = sext i8 %0 to i32
2821  ret i32 %conv
2822}
2823
2824; Function Attrs: norecurse nounwind readonly uwtable willreturn
2825define dso_local zeroext i32 @ld_cst_align32_uint32_t_int8_t() {
2826; CHECK-LABEL: ld_cst_align32_uint32_t_int8_t:
2827; CHECK:       # %bb.0: # %entry
2828; CHECK-NEXT:    lis r3, 153
2829; CHECK-NEXT:    lbz r3, -27108(r3)
2830; CHECK-NEXT:    extsb r3, r3
2831; CHECK-NEXT:    clrldi r3, r3, 32
2832; CHECK-NEXT:    blr
2833entry:
2834  %0 = load i8, ptr inttoptr (i64 9999900 to ptr), align 4
2835  %conv = sext i8 %0 to i32
2836  ret i32 %conv
2837}
2838
2839; Function Attrs: norecurse nounwind readonly uwtable willreturn
2840define dso_local zeroext i32 @ld_cst_align64_uint32_t_int8_t() {
2841; CHECK-P10-LABEL: ld_cst_align64_uint32_t_int8_t:
2842; CHECK-P10:       # %bb.0: # %entry
2843; CHECK-P10-NEXT:    pli r3, 244140625
2844; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2845; CHECK-P10-NEXT:    lbz r3, 0(r3)
2846; CHECK-P10-NEXT:    extsb r3, r3
2847; CHECK-P10-NEXT:    clrldi r3, r3, 32
2848; CHECK-P10-NEXT:    blr
2849;
2850; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_int8_t:
2851; CHECK-PREP10:       # %bb.0: # %entry
2852; CHECK-PREP10-NEXT:    lis r3, 3725
2853; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2854; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2855; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
2856; CHECK-PREP10-NEXT:    extsb r3, r3
2857; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
2858; CHECK-PREP10-NEXT:    blr
2859entry:
2860  %0 = load i8, ptr inttoptr (i64 1000000000000 to ptr), align 4096
2861  %conv = sext i8 %0 to i32
2862  ret i32 %conv
2863}
2864
2865; Function Attrs: norecurse nounwind readonly uwtable willreturn
2866define dso_local zeroext i32 @ld_0_uint32_t_uint16_t(i64 %ptr) {
2867; CHECK-LABEL: ld_0_uint32_t_uint16_t:
2868; CHECK:       # %bb.0: # %entry
2869; CHECK-NEXT:    lhz r3, 0(r3)
2870; CHECK-NEXT:    blr
2871entry:
2872  %0 = inttoptr i64 %ptr to ptr
2873  %1 = load i16, ptr %0, align 2
2874  %conv = zext i16 %1 to i32
2875  ret i32 %conv
2876}
2877
2878; Function Attrs: norecurse nounwind readonly uwtable willreturn
2879define dso_local zeroext i32 @ld_align16_uint32_t_uint16_t(ptr nocapture readonly %ptr) {
2880; CHECK-LABEL: ld_align16_uint32_t_uint16_t:
2881; CHECK:       # %bb.0: # %entry
2882; CHECK-NEXT:    lhz r3, 8(r3)
2883; CHECK-NEXT:    blr
2884entry:
2885  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2886  %0 = load i16, ptr %add.ptr, align 2
2887  %conv = zext i16 %0 to i32
2888  ret i32 %conv
2889}
2890
2891; Function Attrs: norecurse nounwind readonly uwtable willreturn
2892define dso_local zeroext i32 @ld_align32_uint32_t_uint16_t(ptr nocapture readonly %ptr) {
2893; CHECK-P10-LABEL: ld_align32_uint32_t_uint16_t:
2894; CHECK-P10:       # %bb.0: # %entry
2895; CHECK-P10-NEXT:    plhz r3, 99999000(r3), 0
2896; CHECK-P10-NEXT:    blr
2897;
2898; CHECK-PREP10-LABEL: ld_align32_uint32_t_uint16_t:
2899; CHECK-PREP10:       # %bb.0: # %entry
2900; CHECK-PREP10-NEXT:    lis r4, 1525
2901; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2902; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
2903; CHECK-PREP10-NEXT:    blr
2904entry:
2905  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2906  %0 = load i16, ptr %add.ptr, align 2
2907  %conv = zext i16 %0 to i32
2908  ret i32 %conv
2909}
2910
2911; Function Attrs: norecurse nounwind readonly uwtable willreturn
2912define dso_local zeroext i32 @ld_align64_uint32_t_uint16_t(ptr nocapture readonly %ptr) {
2913; CHECK-P10-LABEL: ld_align64_uint32_t_uint16_t:
2914; CHECK-P10:       # %bb.0: # %entry
2915; CHECK-P10-NEXT:    pli r4, 244140625
2916; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2917; CHECK-P10-NEXT:    lhzx r3, r3, r4
2918; CHECK-P10-NEXT:    blr
2919;
2920; CHECK-PREP10-LABEL: ld_align64_uint32_t_uint16_t:
2921; CHECK-PREP10:       # %bb.0: # %entry
2922; CHECK-PREP10-NEXT:    lis r4, 3725
2923; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2924; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2925; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
2926; CHECK-PREP10-NEXT:    blr
2927entry:
2928  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2929  %0 = load i16, ptr %add.ptr, align 2
2930  %conv = zext i16 %0 to i32
2931  ret i32 %conv
2932}
2933
2934; Function Attrs: norecurse nounwind readonly uwtable willreturn
2935define dso_local zeroext i32 @ld_reg_uint32_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) {
2936; CHECK-LABEL: ld_reg_uint32_t_uint16_t:
2937; CHECK:       # %bb.0: # %entry
2938; CHECK-NEXT:    lhzx r3, r3, r4
2939; CHECK-NEXT:    blr
2940entry:
2941  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2942  %0 = load i16, ptr %add.ptr, align 2
2943  %conv = zext i16 %0 to i32
2944  ret i32 %conv
2945}
2946
2947; Function Attrs: norecurse nounwind readonly uwtable willreturn
2948define dso_local zeroext i32 @ld_or_uint32_t_uint16_t(i64 %ptr, i8 zeroext %off) {
2949; CHECK-LABEL: ld_or_uint32_t_uint16_t:
2950; CHECK:       # %bb.0: # %entry
2951; CHECK-NEXT:    or r3, r4, r3
2952; CHECK-NEXT:    lhz r3, 0(r3)
2953; CHECK-NEXT:    blr
2954entry:
2955  %conv = zext i8 %off to i64
2956  %or = or i64 %conv, %ptr
2957  %0 = inttoptr i64 %or to ptr
2958  %1 = load i16, ptr %0, align 2
2959  %conv1 = zext i16 %1 to i32
2960  ret i32 %conv1
2961}
2962
2963; Function Attrs: norecurse nounwind readonly uwtable willreturn
2964define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_uint16_t(i64 %ptr) {
2965; CHECK-LABEL: ld_not_disjoint16_uint32_t_uint16_t:
2966; CHECK:       # %bb.0: # %entry
2967; CHECK-NEXT:    ori r3, r3, 6
2968; CHECK-NEXT:    lhz r3, 0(r3)
2969; CHECK-NEXT:    blr
2970entry:
2971  %or = or i64 %ptr, 6
2972  %0 = inttoptr i64 %or to ptr
2973  %1 = load i16, ptr %0, align 2
2974  %conv = zext i16 %1 to i32
2975  ret i32 %conv
2976}
2977
2978; Function Attrs: norecurse nounwind readonly uwtable willreturn
2979define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_uint16_t(i64 %ptr) {
2980; CHECK-LABEL: ld_disjoint_align16_uint32_t_uint16_t:
2981; CHECK:       # %bb.0: # %entry
2982; CHECK-NEXT:    rldicr r3, r3, 0, 51
2983; CHECK-NEXT:    lhz r3, 24(r3)
2984; CHECK-NEXT:    blr
2985entry:
2986  %and = and i64 %ptr, -4096
2987  %or = or i64 %and, 24
2988  %0 = inttoptr i64 %or to ptr
2989  %1 = load i16, ptr %0, align 8
2990  %conv = zext i16 %1 to i32
2991  ret i32 %conv
2992}
2993
2994; Function Attrs: norecurse nounwind readonly uwtable willreturn
2995define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_uint16_t(i64 %ptr) {
2996; CHECK-LABEL: ld_not_disjoint32_uint32_t_uint16_t:
2997; CHECK:       # %bb.0: # %entry
2998; CHECK-NEXT:    ori r3, r3, 34463
2999; CHECK-NEXT:    oris r3, r3, 1
3000; CHECK-NEXT:    lhz r3, 0(r3)
3001; CHECK-NEXT:    blr
3002entry:
3003  %or = or i64 %ptr, 99999
3004  %0 = inttoptr i64 %or to ptr
3005  %1 = load i16, ptr %0, align 2
3006  %conv = zext i16 %1 to i32
3007  ret i32 %conv
3008}
3009
3010; Function Attrs: norecurse nounwind readonly uwtable willreturn
3011define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_uint16_t(i64 %ptr) {
3012; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_uint16_t:
3013; CHECK-P10:       # %bb.0: # %entry
3014; CHECK-P10-NEXT:    lis r4, -15264
3015; CHECK-P10-NEXT:    and r3, r3, r4
3016; CHECK-P10-NEXT:    plhz r3, 999990000(r3), 0
3017; CHECK-P10-NEXT:    blr
3018;
3019; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_uint16_t:
3020; CHECK-PREP10:       # %bb.0: # %entry
3021; CHECK-PREP10-NEXT:    lis r4, -15264
3022; CHECK-PREP10-NEXT:    and r3, r3, r4
3023; CHECK-PREP10-NEXT:    lis r4, 15258
3024; CHECK-PREP10-NEXT:    ori r4, r4, 41712
3025; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
3026; CHECK-PREP10-NEXT:    blr
3027entry:
3028  %and = and i64 %ptr, -1000341504
3029  %or = or i64 %and, 999990000
3030  %0 = inttoptr i64 %or to ptr
3031  %1 = load i16, ptr %0, align 16
3032  %conv = zext i16 %1 to i32
3033  ret i32 %conv
3034}
3035
3036; Function Attrs: norecurse nounwind readonly uwtable willreturn
3037define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_uint16_t(i64 %ptr) {
3038; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_uint16_t:
3039; CHECK-P10:       # %bb.0: # %entry
3040; CHECK-P10-NEXT:    pli r4, 232
3041; CHECK-P10-NEXT:    pli r5, 3567587329
3042; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
3043; CHECK-P10-NEXT:    or r3, r3, r5
3044; CHECK-P10-NEXT:    lhz r3, 0(r3)
3045; CHECK-P10-NEXT:    blr
3046;
3047; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_uint16_t:
3048; CHECK-PREP10:       # %bb.0: # %entry
3049; CHECK-PREP10-NEXT:    li r4, 29
3050; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
3051; CHECK-PREP10-NEXT:    oris r4, r4, 54437
3052; CHECK-PREP10-NEXT:    ori r4, r4, 4097
3053; CHECK-PREP10-NEXT:    or r3, r3, r4
3054; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
3055; CHECK-PREP10-NEXT:    blr
3056entry:
3057  %or = or i64 %ptr, 1000000000001
3058  %0 = inttoptr i64 %or to ptr
3059  %1 = load i16, ptr %0, align 2
3060  %conv = zext i16 %1 to i32
3061  ret i32 %conv
3062}
3063
3064; Function Attrs: norecurse nounwind readonly uwtable willreturn
3065define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_uint16_t(i64 %ptr) {
3066; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_uint16_t:
3067; CHECK-P10:       # %bb.0: # %entry
3068; CHECK-P10-NEXT:    pli r4, 244140625
3069; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3070; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3071; CHECK-P10-NEXT:    lhzx r3, r3, r4
3072; CHECK-P10-NEXT:    blr
3073;
3074; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_uint16_t:
3075; CHECK-PREP10:       # %bb.0: # %entry
3076; CHECK-PREP10-NEXT:    lis r4, 3725
3077; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3078; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3079; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3080; CHECK-PREP10-NEXT:    lhzx r3, r3, r4
3081; CHECK-PREP10-NEXT:    blr
3082entry:
3083  %and = and i64 %ptr, -1099511627776
3084  %or = or i64 %and, 1000000000000
3085  %0 = inttoptr i64 %or to ptr
3086  %1 = load i16, ptr %0, align 4096
3087  %conv = zext i16 %1 to i32
3088  ret i32 %conv
3089}
3090
3091; Function Attrs: norecurse nounwind readonly uwtable willreturn
3092define dso_local zeroext i32 @ld_cst_align16_uint32_t_uint16_t() {
3093; CHECK-LABEL: ld_cst_align16_uint32_t_uint16_t:
3094; CHECK:       # %bb.0: # %entry
3095; CHECK-NEXT:    lhz r3, 4080(0)
3096; CHECK-NEXT:    blr
3097entry:
3098  %0 = load i16, ptr inttoptr (i64 4080 to ptr), align 16
3099  %conv = zext i16 %0 to i32
3100  ret i32 %conv
3101}
3102
3103; Function Attrs: norecurse nounwind readonly uwtable willreturn
3104define dso_local zeroext i32 @ld_cst_align32_uint32_t_uint16_t() {
3105; CHECK-LABEL: ld_cst_align32_uint32_t_uint16_t:
3106; CHECK:       # %bb.0: # %entry
3107; CHECK-NEXT:    lis r3, 153
3108; CHECK-NEXT:    lhz r3, -27108(r3)
3109; CHECK-NEXT:    blr
3110entry:
3111  %0 = load i16, ptr inttoptr (i64 9999900 to ptr), align 4
3112  %conv = zext i16 %0 to i32
3113  ret i32 %conv
3114}
3115
3116; Function Attrs: norecurse nounwind readonly uwtable willreturn
3117define dso_local zeroext i32 @ld_cst_align64_uint32_t_uint16_t() {
3118; CHECK-P10-LABEL: ld_cst_align64_uint32_t_uint16_t:
3119; CHECK-P10:       # %bb.0: # %entry
3120; CHECK-P10-NEXT:    pli r3, 244140625
3121; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
3122; CHECK-P10-NEXT:    lhz r3, 0(r3)
3123; CHECK-P10-NEXT:    blr
3124;
3125; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_uint16_t:
3126; CHECK-PREP10:       # %bb.0: # %entry
3127; CHECK-PREP10-NEXT:    lis r3, 3725
3128; CHECK-PREP10-NEXT:    ori r3, r3, 19025
3129; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
3130; CHECK-PREP10-NEXT:    lhz r3, 0(r3)
3131; CHECK-PREP10-NEXT:    blr
3132entry:
3133  %0 = load i16, ptr inttoptr (i64 1000000000000 to ptr), align 4096
3134  %conv = zext i16 %0 to i32
3135  ret i32 %conv
3136}
3137
3138; Function Attrs: norecurse nounwind readonly uwtable willreturn
3139define dso_local zeroext i32 @ld_0_uint32_t_int16_t(i64 %ptr) {
3140; CHECK-LABEL: ld_0_uint32_t_int16_t:
3141; CHECK:       # %bb.0: # %entry
3142; CHECK-NEXT:    lha r3, 0(r3)
3143; CHECK-NEXT:    clrldi r3, r3, 32
3144; CHECK-NEXT:    blr
3145entry:
3146  %0 = inttoptr i64 %ptr to ptr
3147  %1 = load i16, ptr %0, align 2
3148  %conv = sext i16 %1 to i32
3149  ret i32 %conv
3150}
3151
3152; Function Attrs: norecurse nounwind readonly uwtable willreturn
3153define dso_local zeroext i32 @ld_align16_uint32_t_int16_t(ptr nocapture readonly %ptr) {
3154; CHECK-LABEL: ld_align16_uint32_t_int16_t:
3155; CHECK:       # %bb.0: # %entry
3156; CHECK-NEXT:    lha r3, 8(r3)
3157; CHECK-NEXT:    clrldi r3, r3, 32
3158; CHECK-NEXT:    blr
3159entry:
3160  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3161  %0 = load i16, ptr %add.ptr, align 2
3162  %conv = sext i16 %0 to i32
3163  ret i32 %conv
3164}
3165
3166; Function Attrs: norecurse nounwind readonly uwtable willreturn
3167define dso_local zeroext i32 @ld_align32_uint32_t_int16_t(ptr nocapture readonly %ptr) {
3168; CHECK-P10-LABEL: ld_align32_uint32_t_int16_t:
3169; CHECK-P10:       # %bb.0: # %entry
3170; CHECK-P10-NEXT:    plha r3, 99999000(r3), 0
3171; CHECK-P10-NEXT:    clrldi r3, r3, 32
3172; CHECK-P10-NEXT:    blr
3173;
3174; CHECK-PREP10-LABEL: ld_align32_uint32_t_int16_t:
3175; CHECK-PREP10:       # %bb.0: # %entry
3176; CHECK-PREP10-NEXT:    lis r4, 1525
3177; CHECK-PREP10-NEXT:    ori r4, r4, 56600
3178; CHECK-PREP10-NEXT:    lhax r3, r3, r4
3179; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
3180; CHECK-PREP10-NEXT:    blr
3181entry:
3182  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3183  %0 = load i16, ptr %add.ptr, align 2
3184  %conv = sext i16 %0 to i32
3185  ret i32 %conv
3186}
3187
3188; Function Attrs: norecurse nounwind readonly uwtable willreturn
3189define dso_local zeroext i32 @ld_align64_uint32_t_int16_t(ptr nocapture readonly %ptr) {
3190; CHECK-P10-LABEL: ld_align64_uint32_t_int16_t:
3191; CHECK-P10:       # %bb.0: # %entry
3192; CHECK-P10-NEXT:    pli r4, 244140625
3193; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3194; CHECK-P10-NEXT:    lhax r3, r3, r4
3195; CHECK-P10-NEXT:    clrldi r3, r3, 32
3196; CHECK-P10-NEXT:    blr
3197;
3198; CHECK-PREP10-LABEL: ld_align64_uint32_t_int16_t:
3199; CHECK-PREP10:       # %bb.0: # %entry
3200; CHECK-PREP10-NEXT:    lis r4, 3725
3201; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3202; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3203; CHECK-PREP10-NEXT:    lhax r3, r3, r4
3204; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
3205; CHECK-PREP10-NEXT:    blr
3206entry:
3207  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3208  %0 = load i16, ptr %add.ptr, align 2
3209  %conv = sext i16 %0 to i32
3210  ret i32 %conv
3211}
3212
3213; Function Attrs: norecurse nounwind readonly uwtable willreturn
3214define dso_local zeroext i32 @ld_reg_uint32_t_int16_t(ptr nocapture readonly %ptr, i64 %off) {
3215; CHECK-LABEL: ld_reg_uint32_t_int16_t:
3216; CHECK:       # %bb.0: # %entry
3217; CHECK-NEXT:    lhax r3, r3, r4
3218; CHECK-NEXT:    clrldi r3, r3, 32
3219; CHECK-NEXT:    blr
3220entry:
3221  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3222  %0 = load i16, ptr %add.ptr, align 2
3223  %conv = sext i16 %0 to i32
3224  ret i32 %conv
3225}
3226
3227; Function Attrs: norecurse nounwind readonly uwtable willreturn
3228define dso_local zeroext i32 @ld_or_uint32_t_int16_t(i64 %ptr, i8 zeroext %off) {
3229; CHECK-LABEL: ld_or_uint32_t_int16_t:
3230; CHECK:       # %bb.0: # %entry
3231; CHECK-NEXT:    or r3, r4, r3
3232; CHECK-NEXT:    lha r3, 0(r3)
3233; CHECK-NEXT:    clrldi r3, r3, 32
3234; CHECK-NEXT:    blr
3235entry:
3236  %conv = zext i8 %off to i64
3237  %or = or i64 %conv, %ptr
3238  %0 = inttoptr i64 %or to ptr
3239  %1 = load i16, ptr %0, align 2
3240  %conv1 = sext i16 %1 to i32
3241  ret i32 %conv1
3242}
3243
3244; Function Attrs: norecurse nounwind readonly uwtable willreturn
3245define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_int16_t(i64 %ptr) {
3246; CHECK-LABEL: ld_not_disjoint16_uint32_t_int16_t:
3247; CHECK:       # %bb.0: # %entry
3248; CHECK-NEXT:    ori r3, r3, 6
3249; CHECK-NEXT:    lha r3, 0(r3)
3250; CHECK-NEXT:    clrldi r3, r3, 32
3251; CHECK-NEXT:    blr
3252entry:
3253  %or = or i64 %ptr, 6
3254  %0 = inttoptr i64 %or to ptr
3255  %1 = load i16, ptr %0, align 2
3256  %conv = sext i16 %1 to i32
3257  ret i32 %conv
3258}
3259
3260; Function Attrs: norecurse nounwind readonly uwtable willreturn
3261define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_int16_t(i64 %ptr) {
3262; CHECK-LABEL: ld_disjoint_align16_uint32_t_int16_t:
3263; CHECK:       # %bb.0: # %entry
3264; CHECK-NEXT:    rldicr r3, r3, 0, 51
3265; CHECK-NEXT:    lha r3, 24(r3)
3266; CHECK-NEXT:    clrldi r3, r3, 32
3267; CHECK-NEXT:    blr
3268entry:
3269  %and = and i64 %ptr, -4096
3270  %or = or i64 %and, 24
3271  %0 = inttoptr i64 %or to ptr
3272  %1 = load i16, ptr %0, align 8
3273  %conv = sext i16 %1 to i32
3274  ret i32 %conv
3275}
3276
3277; Function Attrs: norecurse nounwind readonly uwtable willreturn
3278define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_int16_t(i64 %ptr) {
3279; CHECK-LABEL: ld_not_disjoint32_uint32_t_int16_t:
3280; CHECK:       # %bb.0: # %entry
3281; CHECK-NEXT:    ori r3, r3, 34463
3282; CHECK-NEXT:    oris r3, r3, 1
3283; CHECK-NEXT:    lha r3, 0(r3)
3284; CHECK-NEXT:    clrldi r3, r3, 32
3285; CHECK-NEXT:    blr
3286entry:
3287  %or = or i64 %ptr, 99999
3288  %0 = inttoptr i64 %or to ptr
3289  %1 = load i16, ptr %0, align 2
3290  %conv = sext i16 %1 to i32
3291  ret i32 %conv
3292}
3293
3294; Function Attrs: norecurse nounwind readonly uwtable willreturn
3295define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_int16_t(i64 %ptr) {
3296; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_int16_t:
3297; CHECK-P10:       # %bb.0: # %entry
3298; CHECK-P10-NEXT:    lis r4, -15264
3299; CHECK-P10-NEXT:    and r3, r3, r4
3300; CHECK-P10-NEXT:    plha r3, 999990000(r3), 0
3301; CHECK-P10-NEXT:    clrldi r3, r3, 32
3302; CHECK-P10-NEXT:    blr
3303;
3304; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_int16_t:
3305; CHECK-PREP10:       # %bb.0: # %entry
3306; CHECK-PREP10-NEXT:    lis r4, -15264
3307; CHECK-PREP10-NEXT:    and r3, r3, r4
3308; CHECK-PREP10-NEXT:    lis r4, 15258
3309; CHECK-PREP10-NEXT:    ori r4, r4, 41712
3310; CHECK-PREP10-NEXT:    lhax r3, r3, r4
3311; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
3312; CHECK-PREP10-NEXT:    blr
3313entry:
3314  %and = and i64 %ptr, -1000341504
3315  %or = or i64 %and, 999990000
3316  %0 = inttoptr i64 %or to ptr
3317  %1 = load i16, ptr %0, align 16
3318  %conv = sext i16 %1 to i32
3319  ret i32 %conv
3320}
3321
3322; Function Attrs: norecurse nounwind readonly uwtable willreturn
3323define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_int16_t(i64 %ptr) {
3324; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_int16_t:
3325; CHECK-P10:       # %bb.0: # %entry
3326; CHECK-P10-NEXT:    pli r4, 232
3327; CHECK-P10-NEXT:    pli r5, 3567587329
3328; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
3329; CHECK-P10-NEXT:    or r3, r3, r5
3330; CHECK-P10-NEXT:    lha r3, 0(r3)
3331; CHECK-P10-NEXT:    clrldi r3, r3, 32
3332; CHECK-P10-NEXT:    blr
3333;
3334; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_int16_t:
3335; CHECK-PREP10:       # %bb.0: # %entry
3336; CHECK-PREP10-NEXT:    li r4, 29
3337; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
3338; CHECK-PREP10-NEXT:    oris r4, r4, 54437
3339; CHECK-PREP10-NEXT:    ori r4, r4, 4097
3340; CHECK-PREP10-NEXT:    or r3, r3, r4
3341; CHECK-PREP10-NEXT:    lha r3, 0(r3)
3342; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
3343; CHECK-PREP10-NEXT:    blr
3344entry:
3345  %or = or i64 %ptr, 1000000000001
3346  %0 = inttoptr i64 %or to ptr
3347  %1 = load i16, ptr %0, align 2
3348  %conv = sext i16 %1 to i32
3349  ret i32 %conv
3350}
3351
3352; Function Attrs: norecurse nounwind readonly uwtable willreturn
3353define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_int16_t(i64 %ptr) {
3354; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_int16_t:
3355; CHECK-P10:       # %bb.0: # %entry
3356; CHECK-P10-NEXT:    pli r4, 244140625
3357; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3358; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3359; CHECK-P10-NEXT:    lhax r3, r3, r4
3360; CHECK-P10-NEXT:    clrldi r3, r3, 32
3361; CHECK-P10-NEXT:    blr
3362;
3363; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_int16_t:
3364; CHECK-PREP10:       # %bb.0: # %entry
3365; CHECK-PREP10-NEXT:    lis r4, 3725
3366; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3367; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3368; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3369; CHECK-PREP10-NEXT:    lhax r3, r3, r4
3370; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
3371; CHECK-PREP10-NEXT:    blr
3372entry:
3373  %and = and i64 %ptr, -1099511627776
3374  %or = or i64 %and, 1000000000000
3375  %0 = inttoptr i64 %or to ptr
3376  %1 = load i16, ptr %0, align 4096
3377  %conv = sext i16 %1 to i32
3378  ret i32 %conv
3379}
3380
3381; Function Attrs: norecurse nounwind readonly uwtable willreturn
3382define dso_local zeroext i32 @ld_cst_align16_uint32_t_int16_t() {
3383; CHECK-LABEL: ld_cst_align16_uint32_t_int16_t:
3384; CHECK:       # %bb.0: # %entry
3385; CHECK-NEXT:    lha r3, 4080(0)
3386; CHECK-NEXT:    clrldi r3, r3, 32
3387; CHECK-NEXT:    blr
3388entry:
3389  %0 = load i16, ptr inttoptr (i64 4080 to ptr), align 16
3390  %conv = sext i16 %0 to i32
3391  ret i32 %conv
3392}
3393
3394; Function Attrs: norecurse nounwind readonly uwtable willreturn
3395define dso_local zeroext i32 @ld_cst_align32_uint32_t_int16_t() {
3396; CHECK-LABEL: ld_cst_align32_uint32_t_int16_t:
3397; CHECK:       # %bb.0: # %entry
3398; CHECK-NEXT:    lis r3, 153
3399; CHECK-NEXT:    lha r3, -27108(r3)
3400; CHECK-NEXT:    clrldi r3, r3, 32
3401; CHECK-NEXT:    blr
3402entry:
3403  %0 = load i16, ptr inttoptr (i64 9999900 to ptr), align 4
3404  %conv = sext i16 %0 to i32
3405  ret i32 %conv
3406}
3407
3408; Function Attrs: norecurse nounwind readonly uwtable willreturn
3409define dso_local zeroext i32 @ld_cst_align64_uint32_t_int16_t() {
3410; CHECK-P10-LABEL: ld_cst_align64_uint32_t_int16_t:
3411; CHECK-P10:       # %bb.0: # %entry
3412; CHECK-P10-NEXT:    pli r3, 244140625
3413; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
3414; CHECK-P10-NEXT:    lha r3, 0(r3)
3415; CHECK-P10-NEXT:    clrldi r3, r3, 32
3416; CHECK-P10-NEXT:    blr
3417;
3418; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_int16_t:
3419; CHECK-PREP10:       # %bb.0: # %entry
3420; CHECK-PREP10-NEXT:    lis r3, 3725
3421; CHECK-PREP10-NEXT:    ori r3, r3, 19025
3422; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
3423; CHECK-PREP10-NEXT:    lha r3, 0(r3)
3424; CHECK-PREP10-NEXT:    clrldi r3, r3, 32
3425; CHECK-PREP10-NEXT:    blr
3426entry:
3427  %0 = load i16, ptr inttoptr (i64 1000000000000 to ptr), align 4096
3428  %conv = sext i16 %0 to i32
3429  ret i32 %conv
3430}
3431
3432; Function Attrs: norecurse nounwind readonly uwtable willreturn
3433define dso_local zeroext i32 @ld_0_uint32_t_uint32_t(i64 %ptr) {
3434; CHECK-LABEL: ld_0_uint32_t_uint32_t:
3435; CHECK:       # %bb.0: # %entry
3436; CHECK-NEXT:    lwz r3, 0(r3)
3437; CHECK-NEXT:    blr
3438entry:
3439  %0 = inttoptr i64 %ptr to ptr
3440  %1 = load i32, ptr %0, align 4
3441  ret i32 %1
3442}
3443
3444; Function Attrs: norecurse nounwind readonly uwtable willreturn
3445define dso_local zeroext i32 @ld_align16_uint32_t_uint32_t(ptr nocapture readonly %ptr) {
3446; CHECK-LABEL: ld_align16_uint32_t_uint32_t:
3447; CHECK:       # %bb.0: # %entry
3448; CHECK-NEXT:    lwz r3, 8(r3)
3449; CHECK-NEXT:    blr
3450entry:
3451  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3452  %0 = load i32, ptr %add.ptr, align 4
3453  ret i32 %0
3454}
3455
3456; Function Attrs: norecurse nounwind readonly uwtable willreturn
3457define dso_local zeroext i32 @ld_align32_uint32_t_uint32_t(ptr nocapture readonly %ptr) {
3458; CHECK-P10-LABEL: ld_align32_uint32_t_uint32_t:
3459; CHECK-P10:       # %bb.0: # %entry
3460; CHECK-P10-NEXT:    plwz r3, 99999000(r3), 0
3461; CHECK-P10-NEXT:    blr
3462;
3463; CHECK-PREP10-LABEL: ld_align32_uint32_t_uint32_t:
3464; CHECK-PREP10:       # %bb.0: # %entry
3465; CHECK-PREP10-NEXT:    lis r4, 1525
3466; CHECK-PREP10-NEXT:    ori r4, r4, 56600
3467; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
3468; CHECK-PREP10-NEXT:    blr
3469entry:
3470  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3471  %0 = load i32, ptr %add.ptr, align 4
3472  ret i32 %0
3473}
3474
3475; Function Attrs: norecurse nounwind readonly uwtable willreturn
3476define dso_local zeroext i32 @ld_align64_uint32_t_uint32_t(ptr nocapture readonly %ptr) {
3477; CHECK-P10-LABEL: ld_align64_uint32_t_uint32_t:
3478; CHECK-P10:       # %bb.0: # %entry
3479; CHECK-P10-NEXT:    pli r4, 244140625
3480; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3481; CHECK-P10-NEXT:    lwzx r3, r3, r4
3482; CHECK-P10-NEXT:    blr
3483;
3484; CHECK-PREP10-LABEL: ld_align64_uint32_t_uint32_t:
3485; CHECK-PREP10:       # %bb.0: # %entry
3486; CHECK-PREP10-NEXT:    lis r4, 3725
3487; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3488; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3489; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
3490; CHECK-PREP10-NEXT:    blr
3491entry:
3492  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3493  %0 = load i32, ptr %add.ptr, align 4
3494  ret i32 %0
3495}
3496
3497; Function Attrs: norecurse nounwind readonly uwtable willreturn
3498define dso_local zeroext i32 @ld_reg_uint32_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) {
3499; CHECK-LABEL: ld_reg_uint32_t_uint32_t:
3500; CHECK:       # %bb.0: # %entry
3501; CHECK-NEXT:    lwzx r3, r3, r4
3502; CHECK-NEXT:    blr
3503entry:
3504  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3505  %0 = load i32, ptr %add.ptr, align 4
3506  ret i32 %0
3507}
3508
3509; Function Attrs: norecurse nounwind readonly uwtable willreturn
3510define dso_local zeroext i32 @ld_or_uint32_t_uint32_t(i64 %ptr, i8 zeroext %off) {
3511; CHECK-LABEL: ld_or_uint32_t_uint32_t:
3512; CHECK:       # %bb.0: # %entry
3513; CHECK-NEXT:    or r3, r4, r3
3514; CHECK-NEXT:    lwz r3, 0(r3)
3515; CHECK-NEXT:    blr
3516entry:
3517  %conv = zext i8 %off to i64
3518  %or = or i64 %conv, %ptr
3519  %0 = inttoptr i64 %or to ptr
3520  %1 = load i32, ptr %0, align 4
3521  ret i32 %1
3522}
3523
3524; Function Attrs: norecurse nounwind readonly uwtable willreturn
3525define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_uint32_t(i64 %ptr) {
3526; CHECK-LABEL: ld_not_disjoint16_uint32_t_uint32_t:
3527; CHECK:       # %bb.0: # %entry
3528; CHECK-NEXT:    ori r3, r3, 6
3529; CHECK-NEXT:    lwz r3, 0(r3)
3530; CHECK-NEXT:    blr
3531entry:
3532  %or = or i64 %ptr, 6
3533  %0 = inttoptr i64 %or to ptr
3534  %1 = load i32, ptr %0, align 4
3535  ret i32 %1
3536}
3537
3538; Function Attrs: norecurse nounwind readonly uwtable willreturn
3539define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_uint32_t(i64 %ptr) {
3540; CHECK-LABEL: ld_disjoint_align16_uint32_t_uint32_t:
3541; CHECK:       # %bb.0: # %entry
3542; CHECK-NEXT:    rldicr r3, r3, 0, 51
3543; CHECK-NEXT:    lwz r3, 24(r3)
3544; CHECK-NEXT:    blr
3545entry:
3546  %and = and i64 %ptr, -4096
3547  %or = or i64 %and, 24
3548  %0 = inttoptr i64 %or to ptr
3549  %1 = load i32, ptr %0, align 8
3550  ret i32 %1
3551}
3552
3553; Function Attrs: norecurse nounwind readonly uwtable willreturn
3554define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_uint32_t(i64 %ptr) {
3555; CHECK-LABEL: ld_not_disjoint32_uint32_t_uint32_t:
3556; CHECK:       # %bb.0: # %entry
3557; CHECK-NEXT:    ori r3, r3, 34463
3558; CHECK-NEXT:    oris r3, r3, 1
3559; CHECK-NEXT:    lwz r3, 0(r3)
3560; CHECK-NEXT:    blr
3561entry:
3562  %or = or i64 %ptr, 99999
3563  %0 = inttoptr i64 %or to ptr
3564  %1 = load i32, ptr %0, align 4
3565  ret i32 %1
3566}
3567
3568; Function Attrs: norecurse nounwind readonly uwtable willreturn
3569define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_uint32_t(i64 %ptr) {
3570; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_uint32_t:
3571; CHECK-P10:       # %bb.0: # %entry
3572; CHECK-P10-NEXT:    lis r4, -15264
3573; CHECK-P10-NEXT:    and r3, r3, r4
3574; CHECK-P10-NEXT:    plwz r3, 999990000(r3), 0
3575; CHECK-P10-NEXT:    blr
3576;
3577; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_uint32_t:
3578; CHECK-PREP10:       # %bb.0: # %entry
3579; CHECK-PREP10-NEXT:    lis r4, -15264
3580; CHECK-PREP10-NEXT:    and r3, r3, r4
3581; CHECK-PREP10-NEXT:    lis r4, 15258
3582; CHECK-PREP10-NEXT:    ori r4, r4, 41712
3583; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
3584; CHECK-PREP10-NEXT:    blr
3585entry:
3586  %and = and i64 %ptr, -1000341504
3587  %or = or i64 %and, 999990000
3588  %0 = inttoptr i64 %or to ptr
3589  %1 = load i32, ptr %0, align 16
3590  ret i32 %1
3591}
3592
3593; Function Attrs: norecurse nounwind readonly uwtable willreturn
3594define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_uint32_t(i64 %ptr) {
3595; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_uint32_t:
3596; CHECK-P10:       # %bb.0: # %entry
3597; CHECK-P10-NEXT:    pli r4, 232
3598; CHECK-P10-NEXT:    pli r5, 3567587329
3599; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
3600; CHECK-P10-NEXT:    or r3, r3, r5
3601; CHECK-P10-NEXT:    lwz r3, 0(r3)
3602; CHECK-P10-NEXT:    blr
3603;
3604; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_uint32_t:
3605; CHECK-PREP10:       # %bb.0: # %entry
3606; CHECK-PREP10-NEXT:    li r4, 29
3607; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
3608; CHECK-PREP10-NEXT:    oris r4, r4, 54437
3609; CHECK-PREP10-NEXT:    ori r4, r4, 4097
3610; CHECK-PREP10-NEXT:    or r3, r3, r4
3611; CHECK-PREP10-NEXT:    lwz r3, 0(r3)
3612; CHECK-PREP10-NEXT:    blr
3613entry:
3614  %or = or i64 %ptr, 1000000000001
3615  %0 = inttoptr i64 %or to ptr
3616  %1 = load i32, ptr %0, align 4
3617  ret i32 %1
3618}
3619
3620; Function Attrs: norecurse nounwind readonly uwtable willreturn
3621define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_uint32_t(i64 %ptr) {
3622; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_uint32_t:
3623; CHECK-P10:       # %bb.0: # %entry
3624; CHECK-P10-NEXT:    pli r4, 244140625
3625; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3626; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3627; CHECK-P10-NEXT:    lwzx r3, r3, r4
3628; CHECK-P10-NEXT:    blr
3629;
3630; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_uint32_t:
3631; CHECK-PREP10:       # %bb.0: # %entry
3632; CHECK-PREP10-NEXT:    lis r4, 3725
3633; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3634; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3635; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3636; CHECK-PREP10-NEXT:    lwzx r3, r3, r4
3637; CHECK-PREP10-NEXT:    blr
3638entry:
3639  %and = and i64 %ptr, -1099511627776
3640  %or = or i64 %and, 1000000000000
3641  %0 = inttoptr i64 %or to ptr
3642  %1 = load i32, ptr %0, align 4096
3643  ret i32 %1
3644}
3645
3646; Function Attrs: norecurse nounwind readonly uwtable willreturn
3647define dso_local zeroext i32 @ld_cst_align16_uint32_t_uint32_t() {
3648; CHECK-LABEL: ld_cst_align16_uint32_t_uint32_t:
3649; CHECK:       # %bb.0: # %entry
3650; CHECK-NEXT:    lwz r3, 4080(0)
3651; CHECK-NEXT:    blr
3652entry:
3653  %0 = load i32, ptr inttoptr (i64 4080 to ptr), align 16
3654  ret i32 %0
3655}
3656
3657; Function Attrs: norecurse nounwind readonly uwtable willreturn
3658define dso_local zeroext i32 @ld_cst_align32_uint32_t_uint32_t() {
3659; CHECK-LABEL: ld_cst_align32_uint32_t_uint32_t:
3660; CHECK:       # %bb.0: # %entry
3661; CHECK-NEXT:    lis r3, 153
3662; CHECK-NEXT:    lwz r3, -27108(r3)
3663; CHECK-NEXT:    blr
3664entry:
3665  %0 = load i32, ptr inttoptr (i64 9999900 to ptr), align 4
3666  ret i32 %0
3667}
3668
3669; Function Attrs: norecurse nounwind readonly uwtable willreturn
3670define dso_local zeroext i32 @ld_cst_align64_uint32_t_uint32_t() {
3671; CHECK-P10-LABEL: ld_cst_align64_uint32_t_uint32_t:
3672; CHECK-P10:       # %bb.0: # %entry
3673; CHECK-P10-NEXT:    pli r3, 244140625
3674; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
3675; CHECK-P10-NEXT:    lwz r3, 0(r3)
3676; CHECK-P10-NEXT:    blr
3677;
3678; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_uint32_t:
3679; CHECK-PREP10:       # %bb.0: # %entry
3680; CHECK-PREP10-NEXT:    lis r3, 3725
3681; CHECK-PREP10-NEXT:    ori r3, r3, 19025
3682; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
3683; CHECK-PREP10-NEXT:    lwz r3, 0(r3)
3684; CHECK-PREP10-NEXT:    blr
3685entry:
3686  %0 = load i32, ptr inttoptr (i64 1000000000000 to ptr), align 4096
3687  ret i32 %0
3688}
3689
3690; Function Attrs: norecurse nounwind readonly uwtable willreturn
3691define dso_local zeroext i32 @ld_0_uint32_t_uint64_t(i64 %ptr) {
3692; CHECK-LE-LABEL: ld_0_uint32_t_uint64_t:
3693; CHECK-LE:       # %bb.0: # %entry
3694; CHECK-LE-NEXT:    lwz r3, 0(r3)
3695; CHECK-LE-NEXT:    blr
3696;
3697; CHECK-BE-LABEL: ld_0_uint32_t_uint64_t:
3698; CHECK-BE:       # %bb.0: # %entry
3699; CHECK-BE-NEXT:    lwz r3, 4(r3)
3700; CHECK-BE-NEXT:    blr
3701entry:
3702  %0 = inttoptr i64 %ptr to ptr
3703  %1 = load i64, ptr %0, align 8
3704  %conv = trunc i64 %1 to i32
3705  ret i32 %conv
3706}
3707
3708; Function Attrs: norecurse nounwind readonly uwtable willreturn
3709define dso_local zeroext i32 @ld_align16_uint32_t_uint64_t(ptr nocapture readonly %ptr) {
3710; CHECK-LE-LABEL: ld_align16_uint32_t_uint64_t:
3711; CHECK-LE:       # %bb.0: # %entry
3712; CHECK-LE-NEXT:    lwz r3, 8(r3)
3713; CHECK-LE-NEXT:    blr
3714;
3715; CHECK-BE-LABEL: ld_align16_uint32_t_uint64_t:
3716; CHECK-BE:       # %bb.0: # %entry
3717; CHECK-BE-NEXT:    lwz r3, 12(r3)
3718; CHECK-BE-NEXT:    blr
3719entry:
3720  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3721  %0 = load i64, ptr %add.ptr, align 8
3722  %conv = trunc i64 %0 to i32
3723  ret i32 %conv
3724}
3725
3726; Function Attrs: norecurse nounwind readonly uwtable willreturn
3727define dso_local zeroext i32 @ld_align32_uint32_t_uint64_t(ptr nocapture readonly %ptr) {
3728; CHECK-P10-LE-LABEL: ld_align32_uint32_t_uint64_t:
3729; CHECK-P10-LE:       # %bb.0: # %entry
3730; CHECK-P10-LE-NEXT:    plwz r3, 99999000(r3), 0
3731; CHECK-P10-LE-NEXT:    blr
3732;
3733; CHECK-P10-BE-LABEL: ld_align32_uint32_t_uint64_t:
3734; CHECK-P10-BE:       # %bb.0: # %entry
3735; CHECK-P10-BE-NEXT:    plwz r3, 99999004(r3), 0
3736; CHECK-P10-BE-NEXT:    blr
3737;
3738; CHECK-P9-LE-LABEL: ld_align32_uint32_t_uint64_t:
3739; CHECK-P9-LE:       # %bb.0: # %entry
3740; CHECK-P9-LE-NEXT:    lis r4, 1525
3741; CHECK-P9-LE-NEXT:    ori r4, r4, 56600
3742; CHECK-P9-LE-NEXT:    lwzx r3, r3, r4
3743; CHECK-P9-LE-NEXT:    blr
3744;
3745; CHECK-P9-BE-LABEL: ld_align32_uint32_t_uint64_t:
3746; CHECK-P9-BE:       # %bb.0: # %entry
3747; CHECK-P9-BE-NEXT:    lis r4, 1525
3748; CHECK-P9-BE-NEXT:    ori r4, r4, 56604
3749; CHECK-P9-BE-NEXT:    lwzx r3, r3, r4
3750; CHECK-P9-BE-NEXT:    blr
3751;
3752; CHECK-P8-LE-LABEL: ld_align32_uint32_t_uint64_t:
3753; CHECK-P8-LE:       # %bb.0: # %entry
3754; CHECK-P8-LE-NEXT:    lis r4, 1525
3755; CHECK-P8-LE-NEXT:    ori r4, r4, 56600
3756; CHECK-P8-LE-NEXT:    lwzx r3, r3, r4
3757; CHECK-P8-LE-NEXT:    blr
3758;
3759; CHECK-P8-BE-LABEL: ld_align32_uint32_t_uint64_t:
3760; CHECK-P8-BE:       # %bb.0: # %entry
3761; CHECK-P8-BE-NEXT:    lis r4, 1525
3762; CHECK-P8-BE-NEXT:    ori r4, r4, 56604
3763; CHECK-P8-BE-NEXT:    lwzx r3, r3, r4
3764; CHECK-P8-BE-NEXT:    blr
3765entry:
3766  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3767  %0 = load i64, ptr %add.ptr, align 8
3768  %conv = trunc i64 %0 to i32
3769  ret i32 %conv
3770}
3771
3772; Function Attrs: norecurse nounwind readonly uwtable willreturn
3773define dso_local zeroext i32 @ld_align64_uint32_t_uint64_t(ptr nocapture readonly %ptr) {
3774; CHECK-P10-LE-LABEL: ld_align64_uint32_t_uint64_t:
3775; CHECK-P10-LE:       # %bb.0: # %entry
3776; CHECK-P10-LE-NEXT:    pli r4, 244140625
3777; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
3778; CHECK-P10-LE-NEXT:    lwzx r3, r3, r4
3779; CHECK-P10-LE-NEXT:    blr
3780;
3781; CHECK-P10-BE-LABEL: ld_align64_uint32_t_uint64_t:
3782; CHECK-P10-BE:       # %bb.0: # %entry
3783; CHECK-P10-BE-NEXT:    pli r4, 232
3784; CHECK-P10-BE-NEXT:    pli r5, 3567587332
3785; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
3786; CHECK-P10-BE-NEXT:    lwzx r3, r3, r5
3787; CHECK-P10-BE-NEXT:    blr
3788;
3789; CHECK-P9-LE-LABEL: ld_align64_uint32_t_uint64_t:
3790; CHECK-P9-LE:       # %bb.0: # %entry
3791; CHECK-P9-LE-NEXT:    lis r4, 3725
3792; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
3793; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
3794; CHECK-P9-LE-NEXT:    lwzx r3, r3, r4
3795; CHECK-P9-LE-NEXT:    blr
3796;
3797; CHECK-P9-BE-LABEL: ld_align64_uint32_t_uint64_t:
3798; CHECK-P9-BE:       # %bb.0: # %entry
3799; CHECK-P9-BE-NEXT:    li r4, 29
3800; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
3801; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
3802; CHECK-P9-BE-NEXT:    ori r4, r4, 4100
3803; CHECK-P9-BE-NEXT:    lwzx r3, r3, r4
3804; CHECK-P9-BE-NEXT:    blr
3805;
3806; CHECK-P8-LE-LABEL: ld_align64_uint32_t_uint64_t:
3807; CHECK-P8-LE:       # %bb.0: # %entry
3808; CHECK-P8-LE-NEXT:    lis r4, 3725
3809; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
3810; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
3811; CHECK-P8-LE-NEXT:    lwzx r3, r3, r4
3812; CHECK-P8-LE-NEXT:    blr
3813;
3814; CHECK-P8-BE-LABEL: ld_align64_uint32_t_uint64_t:
3815; CHECK-P8-BE:       # %bb.0: # %entry
3816; CHECK-P8-BE-NEXT:    li r4, 29
3817; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
3818; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
3819; CHECK-P8-BE-NEXT:    ori r4, r4, 4100
3820; CHECK-P8-BE-NEXT:    lwzx r3, r3, r4
3821; CHECK-P8-BE-NEXT:    blr
3822entry:
3823  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3824  %0 = load i64, ptr %add.ptr, align 8
3825  %conv = trunc i64 %0 to i32
3826  ret i32 %conv
3827}
3828
3829; Function Attrs: norecurse nounwind readonly uwtable willreturn
3830define dso_local zeroext i32 @ld_reg_uint32_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) {
3831; CHECK-LE-LABEL: ld_reg_uint32_t_uint64_t:
3832; CHECK-LE:       # %bb.0: # %entry
3833; CHECK-LE-NEXT:    lwzx r3, r3, r4
3834; CHECK-LE-NEXT:    blr
3835;
3836; CHECK-BE-LABEL: ld_reg_uint32_t_uint64_t:
3837; CHECK-BE:       # %bb.0: # %entry
3838; CHECK-BE-NEXT:    add r3, r3, r4
3839; CHECK-BE-NEXT:    lwz r3, 4(r3)
3840; CHECK-BE-NEXT:    blr
3841entry:
3842  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3843  %0 = load i64, ptr %add.ptr, align 8
3844  %conv = trunc i64 %0 to i32
3845  ret i32 %conv
3846}
3847
3848; Function Attrs: norecurse nounwind readonly uwtable willreturn
3849define dso_local zeroext i32 @ld_or_uint32_t_uint64_t(i64 %ptr, i8 zeroext %off) {
3850; CHECK-LE-LABEL: ld_or_uint32_t_uint64_t:
3851; CHECK-LE:       # %bb.0: # %entry
3852; CHECK-LE-NEXT:    or r3, r4, r3
3853; CHECK-LE-NEXT:    lwz r3, 0(r3)
3854; CHECK-LE-NEXT:    blr
3855;
3856; CHECK-BE-LABEL: ld_or_uint32_t_uint64_t:
3857; CHECK-BE:       # %bb.0: # %entry
3858; CHECK-BE-NEXT:    or r3, r4, r3
3859; CHECK-BE-NEXT:    lwz r3, 4(r3)
3860; CHECK-BE-NEXT:    blr
3861entry:
3862  %conv = zext i8 %off to i64
3863  %or = or i64 %conv, %ptr
3864  %0 = inttoptr i64 %or to ptr
3865  %1 = load i64, ptr %0, align 8
3866  %conv1 = trunc i64 %1 to i32
3867  ret i32 %conv1
3868}
3869
3870; Function Attrs: norecurse nounwind readonly uwtable willreturn
3871define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_uint64_t(i64 %ptr) {
3872; CHECK-LE-LABEL: ld_not_disjoint16_uint32_t_uint64_t:
3873; CHECK-LE:       # %bb.0: # %entry
3874; CHECK-LE-NEXT:    ori r3, r3, 6
3875; CHECK-LE-NEXT:    lwz r3, 0(r3)
3876; CHECK-LE-NEXT:    blr
3877;
3878; CHECK-BE-LABEL: ld_not_disjoint16_uint32_t_uint64_t:
3879; CHECK-BE:       # %bb.0: # %entry
3880; CHECK-BE-NEXT:    ori r3, r3, 6
3881; CHECK-BE-NEXT:    lwz r3, 4(r3)
3882; CHECK-BE-NEXT:    blr
3883entry:
3884  %or = or i64 %ptr, 6
3885  %0 = inttoptr i64 %or to ptr
3886  %1 = load i64, ptr %0, align 8
3887  %conv = trunc i64 %1 to i32
3888  ret i32 %conv
3889}
3890
3891; Function Attrs: norecurse nounwind readonly uwtable willreturn
3892define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_uint64_t(i64 %ptr) {
3893; CHECK-LE-LABEL: ld_disjoint_align16_uint32_t_uint64_t:
3894; CHECK-LE:       # %bb.0: # %entry
3895; CHECK-LE-NEXT:    rldicr r3, r3, 0, 51
3896; CHECK-LE-NEXT:    lwz r3, 24(r3)
3897; CHECK-LE-NEXT:    blr
3898;
3899; CHECK-BE-LABEL: ld_disjoint_align16_uint32_t_uint64_t:
3900; CHECK-BE:       # %bb.0: # %entry
3901; CHECK-BE-NEXT:    rldicr r3, r3, 0, 51
3902; CHECK-BE-NEXT:    lwz r3, 28(r3)
3903; CHECK-BE-NEXT:    blr
3904entry:
3905  %and = and i64 %ptr, -4096
3906  %or = or i64 %and, 24
3907  %0 = inttoptr i64 %or to ptr
3908  %1 = load i64, ptr %0, align 8
3909  %conv = trunc i64 %1 to i32
3910  ret i32 %conv
3911}
3912
3913; Function Attrs: norecurse nounwind readonly uwtable willreturn
3914define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_uint64_t(i64 %ptr) {
3915; CHECK-LE-LABEL: ld_not_disjoint32_uint32_t_uint64_t:
3916; CHECK-LE:       # %bb.0: # %entry
3917; CHECK-LE-NEXT:    ori r3, r3, 34463
3918; CHECK-LE-NEXT:    oris r3, r3, 1
3919; CHECK-LE-NEXT:    lwz r3, 0(r3)
3920; CHECK-LE-NEXT:    blr
3921;
3922; CHECK-BE-LABEL: ld_not_disjoint32_uint32_t_uint64_t:
3923; CHECK-BE:       # %bb.0: # %entry
3924; CHECK-BE-NEXT:    ori r3, r3, 34463
3925; CHECK-BE-NEXT:    oris r3, r3, 1
3926; CHECK-BE-NEXT:    lwz r3, 4(r3)
3927; CHECK-BE-NEXT:    blr
3928entry:
3929  %or = or i64 %ptr, 99999
3930  %0 = inttoptr i64 %or to ptr
3931  %1 = load i64, ptr %0, align 8
3932  %conv = trunc i64 %1 to i32
3933  ret i32 %conv
3934}
3935
3936; Function Attrs: norecurse nounwind readonly uwtable willreturn
3937define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_uint64_t(i64 %ptr) {
3938; CHECK-P10-LE-LABEL: ld_disjoint_align32_uint32_t_uint64_t:
3939; CHECK-P10-LE:       # %bb.0: # %entry
3940; CHECK-P10-LE-NEXT:    lis r4, -15264
3941; CHECK-P10-LE-NEXT:    and r3, r3, r4
3942; CHECK-P10-LE-NEXT:    plwz r3, 999990000(r3), 0
3943; CHECK-P10-LE-NEXT:    blr
3944;
3945; CHECK-P10-BE-LABEL: ld_disjoint_align32_uint32_t_uint64_t:
3946; CHECK-P10-BE:       # %bb.0: # %entry
3947; CHECK-P10-BE-NEXT:    lis r4, -15264
3948; CHECK-P10-BE-NEXT:    and r3, r3, r4
3949; CHECK-P10-BE-NEXT:    plwz r3, 999990004(r3), 0
3950; CHECK-P10-BE-NEXT:    blr
3951;
3952; CHECK-P9-LE-LABEL: ld_disjoint_align32_uint32_t_uint64_t:
3953; CHECK-P9-LE:       # %bb.0: # %entry
3954; CHECK-P9-LE-NEXT:    lis r4, -15264
3955; CHECK-P9-LE-NEXT:    and r3, r3, r4
3956; CHECK-P9-LE-NEXT:    lis r4, 15258
3957; CHECK-P9-LE-NEXT:    ori r4, r4, 41712
3958; CHECK-P9-LE-NEXT:    lwzx r3, r3, r4
3959; CHECK-P9-LE-NEXT:    blr
3960;
3961; CHECK-P9-BE-LABEL: ld_disjoint_align32_uint32_t_uint64_t:
3962; CHECK-P9-BE:       # %bb.0: # %entry
3963; CHECK-P9-BE-NEXT:    lis r4, -15264
3964; CHECK-P9-BE-NEXT:    and r3, r3, r4
3965; CHECK-P9-BE-NEXT:    lis r4, 15258
3966; CHECK-P9-BE-NEXT:    ori r4, r4, 41716
3967; CHECK-P9-BE-NEXT:    lwzx r3, r3, r4
3968; CHECK-P9-BE-NEXT:    blr
3969;
3970; CHECK-P8-LE-LABEL: ld_disjoint_align32_uint32_t_uint64_t:
3971; CHECK-P8-LE:       # %bb.0: # %entry
3972; CHECK-P8-LE-NEXT:    lis r4, -15264
3973; CHECK-P8-LE-NEXT:    and r3, r3, r4
3974; CHECK-P8-LE-NEXT:    lis r4, 15258
3975; CHECK-P8-LE-NEXT:    ori r4, r4, 41712
3976; CHECK-P8-LE-NEXT:    lwzx r3, r3, r4
3977; CHECK-P8-LE-NEXT:    blr
3978;
3979; CHECK-P8-BE-LABEL: ld_disjoint_align32_uint32_t_uint64_t:
3980; CHECK-P8-BE:       # %bb.0: # %entry
3981; CHECK-P8-BE-NEXT:    lis r4, -15264
3982; CHECK-P8-BE-NEXT:    and r3, r3, r4
3983; CHECK-P8-BE-NEXT:    lis r4, 15258
3984; CHECK-P8-BE-NEXT:    ori r4, r4, 41716
3985; CHECK-P8-BE-NEXT:    lwzx r3, r3, r4
3986; CHECK-P8-BE-NEXT:    blr
3987entry:
3988  %and = and i64 %ptr, -1000341504
3989  %or = or i64 %and, 999990000
3990  %0 = inttoptr i64 %or to ptr
3991  %1 = load i64, ptr %0, align 16
3992  %conv = trunc i64 %1 to i32
3993  ret i32 %conv
3994}
3995
3996; Function Attrs: norecurse nounwind readonly uwtable willreturn
3997define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_uint64_t(i64 %ptr) {
3998; CHECK-P10-LE-LABEL: ld_not_disjoint64_uint32_t_uint64_t:
3999; CHECK-P10-LE:       # %bb.0: # %entry
4000; CHECK-P10-LE-NEXT:    pli r4, 232
4001; CHECK-P10-LE-NEXT:    pli r5, 3567587329
4002; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
4003; CHECK-P10-LE-NEXT:    or r3, r3, r5
4004; CHECK-P10-LE-NEXT:    lwz r3, 0(r3)
4005; CHECK-P10-LE-NEXT:    blr
4006;
4007; CHECK-P10-BE-LABEL: ld_not_disjoint64_uint32_t_uint64_t:
4008; CHECK-P10-BE:       # %bb.0: # %entry
4009; CHECK-P10-BE-NEXT:    pli r4, 232
4010; CHECK-P10-BE-NEXT:    pli r5, 3567587329
4011; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
4012; CHECK-P10-BE-NEXT:    or r3, r3, r5
4013; CHECK-P10-BE-NEXT:    lwz r3, 4(r3)
4014; CHECK-P10-BE-NEXT:    blr
4015;
4016; CHECK-P9-LE-LABEL: ld_not_disjoint64_uint32_t_uint64_t:
4017; CHECK-P9-LE:       # %bb.0: # %entry
4018; CHECK-P9-LE-NEXT:    li r4, 29
4019; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
4020; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
4021; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
4022; CHECK-P9-LE-NEXT:    or r3, r3, r4
4023; CHECK-P9-LE-NEXT:    lwz r3, 0(r3)
4024; CHECK-P9-LE-NEXT:    blr
4025;
4026; CHECK-P9-BE-LABEL: ld_not_disjoint64_uint32_t_uint64_t:
4027; CHECK-P9-BE:       # %bb.0: # %entry
4028; CHECK-P9-BE-NEXT:    li r4, 29
4029; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
4030; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
4031; CHECK-P9-BE-NEXT:    ori r4, r4, 4097
4032; CHECK-P9-BE-NEXT:    or r3, r3, r4
4033; CHECK-P9-BE-NEXT:    lwz r3, 4(r3)
4034; CHECK-P9-BE-NEXT:    blr
4035;
4036; CHECK-P8-LE-LABEL: ld_not_disjoint64_uint32_t_uint64_t:
4037; CHECK-P8-LE:       # %bb.0: # %entry
4038; CHECK-P8-LE-NEXT:    li r4, 29
4039; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
4040; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
4041; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
4042; CHECK-P8-LE-NEXT:    or r3, r3, r4
4043; CHECK-P8-LE-NEXT:    lwz r3, 0(r3)
4044; CHECK-P8-LE-NEXT:    blr
4045;
4046; CHECK-P8-BE-LABEL: ld_not_disjoint64_uint32_t_uint64_t:
4047; CHECK-P8-BE:       # %bb.0: # %entry
4048; CHECK-P8-BE-NEXT:    li r4, 29
4049; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
4050; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
4051; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
4052; CHECK-P8-BE-NEXT:    or r3, r3, r4
4053; CHECK-P8-BE-NEXT:    lwz r3, 4(r3)
4054; CHECK-P8-BE-NEXT:    blr
4055entry:
4056  %or = or i64 %ptr, 1000000000001
4057  %0 = inttoptr i64 %or to ptr
4058  %1 = load i64, ptr %0, align 8
4059  %conv = trunc i64 %1 to i32
4060  ret i32 %conv
4061}
4062
4063; Function Attrs: norecurse nounwind readonly uwtable willreturn
4064define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_uint64_t(i64 %ptr) {
4065; CHECK-P10-LE-LABEL: ld_disjoint_align64_uint32_t_uint64_t:
4066; CHECK-P10-LE:       # %bb.0: # %entry
4067; CHECK-P10-LE-NEXT:    pli r4, 244140625
4068; CHECK-P10-LE-NEXT:    rldicr r3, r3, 0, 23
4069; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
4070; CHECK-P10-LE-NEXT:    lwzx r3, r3, r4
4071; CHECK-P10-LE-NEXT:    blr
4072;
4073; CHECK-P10-BE-LABEL: ld_disjoint_align64_uint32_t_uint64_t:
4074; CHECK-P10-BE:       # %bb.0: # %entry
4075; CHECK-P10-BE-NEXT:    pli r4, 232
4076; CHECK-P10-BE-NEXT:    pli r5, 3567587332
4077; CHECK-P10-BE-NEXT:    rldicr r3, r3, 0, 23
4078; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
4079; CHECK-P10-BE-NEXT:    lwzx r3, r3, r5
4080; CHECK-P10-BE-NEXT:    blr
4081;
4082; CHECK-P9-LE-LABEL: ld_disjoint_align64_uint32_t_uint64_t:
4083; CHECK-P9-LE:       # %bb.0: # %entry
4084; CHECK-P9-LE-NEXT:    lis r4, 3725
4085; CHECK-P9-LE-NEXT:    rldicr r3, r3, 0, 23
4086; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
4087; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
4088; CHECK-P9-LE-NEXT:    lwzx r3, r3, r4
4089; CHECK-P9-LE-NEXT:    blr
4090;
4091; CHECK-P9-BE-LABEL: ld_disjoint_align64_uint32_t_uint64_t:
4092; CHECK-P9-BE:       # %bb.0: # %entry
4093; CHECK-P9-BE-NEXT:    li r4, 29
4094; CHECK-P9-BE-NEXT:    rldicr r3, r3, 0, 23
4095; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
4096; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
4097; CHECK-P9-BE-NEXT:    ori r4, r4, 4100
4098; CHECK-P9-BE-NEXT:    lwzx r3, r3, r4
4099; CHECK-P9-BE-NEXT:    blr
4100;
4101; CHECK-P8-LE-LABEL: ld_disjoint_align64_uint32_t_uint64_t:
4102; CHECK-P8-LE:       # %bb.0: # %entry
4103; CHECK-P8-LE-NEXT:    lis r4, 3725
4104; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
4105; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
4106; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
4107; CHECK-P8-LE-NEXT:    lwzx r3, r3, r4
4108; CHECK-P8-LE-NEXT:    blr
4109;
4110; CHECK-P8-BE-LABEL: ld_disjoint_align64_uint32_t_uint64_t:
4111; CHECK-P8-BE:       # %bb.0: # %entry
4112; CHECK-P8-BE-NEXT:    li r4, 29
4113; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
4114; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
4115; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
4116; CHECK-P8-BE-NEXT:    ori r4, r4, 4100
4117; CHECK-P8-BE-NEXT:    lwzx r3, r3, r4
4118; CHECK-P8-BE-NEXT:    blr
4119entry:
4120  %and = and i64 %ptr, -1099511627776
4121  %or = or i64 %and, 1000000000000
4122  %0 = inttoptr i64 %or to ptr
4123  %1 = load i64, ptr %0, align 4096
4124  %conv = trunc i64 %1 to i32
4125  ret i32 %conv
4126}
4127
4128; Function Attrs: norecurse nounwind readonly uwtable willreturn
4129define dso_local zeroext i32 @ld_cst_align16_uint32_t_uint64_t() {
4130; CHECK-LE-LABEL: ld_cst_align16_uint32_t_uint64_t:
4131; CHECK-LE:       # %bb.0: # %entry
4132; CHECK-LE-NEXT:    lwz r3, 4080(0)
4133; CHECK-LE-NEXT:    blr
4134;
4135; CHECK-BE-LABEL: ld_cst_align16_uint32_t_uint64_t:
4136; CHECK-BE:       # %bb.0: # %entry
4137; CHECK-BE-NEXT:    lwz r3, 4084(0)
4138; CHECK-BE-NEXT:    blr
4139entry:
4140  %0 = load i64, ptr inttoptr (i64 4080 to ptr), align 16
4141  %conv = trunc i64 %0 to i32
4142  ret i32 %conv
4143}
4144
4145; Function Attrs: norecurse nounwind readonly uwtable willreturn
4146define dso_local zeroext i32 @ld_cst_align32_uint32_t_uint64_t() {
4147; CHECK-LE-LABEL: ld_cst_align32_uint32_t_uint64_t:
4148; CHECK-LE:       # %bb.0: # %entry
4149; CHECK-LE-NEXT:    lis r3, 153
4150; CHECK-LE-NEXT:    lwz r3, -27108(r3)
4151; CHECK-LE-NEXT:    blr
4152;
4153; CHECK-BE-LABEL: ld_cst_align32_uint32_t_uint64_t:
4154; CHECK-BE:       # %bb.0: # %entry
4155; CHECK-BE-NEXT:    lis r3, 153
4156; CHECK-BE-NEXT:    lwz r3, -27104(r3)
4157; CHECK-BE-NEXT:    blr
4158entry:
4159  %0 = load i64, ptr inttoptr (i64 9999900 to ptr), align 8
4160  %conv = trunc i64 %0 to i32
4161  ret i32 %conv
4162}
4163
4164; Function Attrs: norecurse nounwind readonly uwtable willreturn
4165define dso_local zeroext i32 @ld_cst_align64_uint32_t_uint64_t() {
4166; CHECK-P10-LE-LABEL: ld_cst_align64_uint32_t_uint64_t:
4167; CHECK-P10-LE:       # %bb.0: # %entry
4168; CHECK-P10-LE-NEXT:    pli r3, 244140625
4169; CHECK-P10-LE-NEXT:    rldic r3, r3, 12, 24
4170; CHECK-P10-LE-NEXT:    lwz r3, 0(r3)
4171; CHECK-P10-LE-NEXT:    blr
4172;
4173; CHECK-P10-BE-LABEL: ld_cst_align64_uint32_t_uint64_t:
4174; CHECK-P10-BE:       # %bb.0: # %entry
4175; CHECK-P10-BE-NEXT:    pli r3, 232
4176; CHECK-P10-BE-NEXT:    pli r4, 3567587332
4177; CHECK-P10-BE-NEXT:    rldimi r4, r3, 32, 0
4178; CHECK-P10-BE-NEXT:    lwz r3, 0(r4)
4179; CHECK-P10-BE-NEXT:    blr
4180;
4181; CHECK-P9-LE-LABEL: ld_cst_align64_uint32_t_uint64_t:
4182; CHECK-P9-LE:       # %bb.0: # %entry
4183; CHECK-P9-LE-NEXT:    lis r3, 3725
4184; CHECK-P9-LE-NEXT:    ori r3, r3, 19025
4185; CHECK-P9-LE-NEXT:    rldic r3, r3, 12, 24
4186; CHECK-P9-LE-NEXT:    lwz r3, 0(r3)
4187; CHECK-P9-LE-NEXT:    blr
4188;
4189; CHECK-P9-BE-LABEL: ld_cst_align64_uint32_t_uint64_t:
4190; CHECK-P9-BE:       # %bb.0: # %entry
4191; CHECK-P9-BE-NEXT:    li r3, 29
4192; CHECK-P9-BE-NEXT:    rldic r3, r3, 35, 24
4193; CHECK-P9-BE-NEXT:    oris r3, r3, 54437
4194; CHECK-P9-BE-NEXT:    ori r3, r3, 4100
4195; CHECK-P9-BE-NEXT:    lwz r3, 0(r3)
4196; CHECK-P9-BE-NEXT:    blr
4197;
4198; CHECK-P8-LE-LABEL: ld_cst_align64_uint32_t_uint64_t:
4199; CHECK-P8-LE:       # %bb.0: # %entry
4200; CHECK-P8-LE-NEXT:    lis r3, 3725
4201; CHECK-P8-LE-NEXT:    ori r3, r3, 19025
4202; CHECK-P8-LE-NEXT:    rldic r3, r3, 12, 24
4203; CHECK-P8-LE-NEXT:    lwz r3, 0(r3)
4204; CHECK-P8-LE-NEXT:    blr
4205;
4206; CHECK-P8-BE-LABEL: ld_cst_align64_uint32_t_uint64_t:
4207; CHECK-P8-BE:       # %bb.0: # %entry
4208; CHECK-P8-BE-NEXT:    li r3, 29
4209; CHECK-P8-BE-NEXT:    rldic r3, r3, 35, 24
4210; CHECK-P8-BE-NEXT:    oris r3, r3, 54437
4211; CHECK-P8-BE-NEXT:    ori r3, r3, 4100
4212; CHECK-P8-BE-NEXT:    lwz r3, 0(r3)
4213; CHECK-P8-BE-NEXT:    blr
4214entry:
4215  %0 = load i64, ptr inttoptr (i64 1000000000000 to ptr), align 4096
4216  %conv = trunc i64 %0 to i32
4217  ret i32 %conv
4218}
4219
4220; Function Attrs: norecurse nounwind readonly uwtable willreturn
4221define dso_local zeroext i32 @ld_0_uint32_t_float(i64 %ptr) {
4222; CHECK-LABEL: ld_0_uint32_t_float:
4223; CHECK:       # %bb.0: # %entry
4224; CHECK-NEXT:    lfs f0, 0(r3)
4225; CHECK-NEXT:    xscvdpuxws f0, f0
4226; CHECK-NEXT:    mffprwz r3, f0
4227; CHECK-NEXT:    blr
4228entry:
4229  %0 = inttoptr i64 %ptr to ptr
4230  %1 = load float, ptr %0, align 4
4231  %conv = fptoui float %1 to i32
4232  ret i32 %conv
4233}
4234
4235; Function Attrs: norecurse nounwind readonly uwtable willreturn
4236define dso_local zeroext i32 @ld_align16_uint32_t_float(ptr nocapture readonly %ptr) {
4237; CHECK-LABEL: ld_align16_uint32_t_float:
4238; CHECK:       # %bb.0: # %entry
4239; CHECK-NEXT:    lfs f0, 8(r3)
4240; CHECK-NEXT:    xscvdpuxws f0, f0
4241; CHECK-NEXT:    mffprwz r3, f0
4242; CHECK-NEXT:    blr
4243entry:
4244  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
4245  %0 = load float, ptr %add.ptr, align 4
4246  %conv = fptoui float %0 to i32
4247  ret i32 %conv
4248}
4249
4250; Function Attrs: norecurse nounwind readonly uwtable willreturn
4251define dso_local zeroext i32 @ld_align32_uint32_t_float(ptr nocapture readonly %ptr) {
4252; CHECK-P10-LABEL: ld_align32_uint32_t_float:
4253; CHECK-P10:       # %bb.0: # %entry
4254; CHECK-P10-NEXT:    plfs f0, 99999000(r3), 0
4255; CHECK-P10-NEXT:    xscvdpuxws f0, f0
4256; CHECK-P10-NEXT:    mffprwz r3, f0
4257; CHECK-P10-NEXT:    blr
4258;
4259; CHECK-PREP10-LABEL: ld_align32_uint32_t_float:
4260; CHECK-PREP10:       # %bb.0: # %entry
4261; CHECK-PREP10-NEXT:    lis r4, 1525
4262; CHECK-PREP10-NEXT:    ori r4, r4, 56600
4263; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
4264; CHECK-PREP10-NEXT:    xscvdpuxws f0, f0
4265; CHECK-PREP10-NEXT:    mffprwz r3, f0
4266; CHECK-PREP10-NEXT:    blr
4267entry:
4268  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
4269  %0 = load float, ptr %add.ptr, align 4
4270  %conv = fptoui float %0 to i32
4271  ret i32 %conv
4272}
4273
4274; Function Attrs: norecurse nounwind readonly uwtable willreturn
4275define dso_local zeroext i32 @ld_align64_uint32_t_float(ptr nocapture readonly %ptr) {
4276; CHECK-P10-LABEL: ld_align64_uint32_t_float:
4277; CHECK-P10:       # %bb.0: # %entry
4278; CHECK-P10-NEXT:    pli r4, 244140625
4279; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4280; CHECK-P10-NEXT:    lfsx f0, r3, r4
4281; CHECK-P10-NEXT:    xscvdpuxws f0, f0
4282; CHECK-P10-NEXT:    mffprwz r3, f0
4283; CHECK-P10-NEXT:    blr
4284;
4285; CHECK-PREP10-LABEL: ld_align64_uint32_t_float:
4286; CHECK-PREP10:       # %bb.0: # %entry
4287; CHECK-PREP10-NEXT:    lis r4, 3725
4288; CHECK-PREP10-NEXT:    ori r4, r4, 19025
4289; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
4290; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
4291; CHECK-PREP10-NEXT:    xscvdpuxws f0, f0
4292; CHECK-PREP10-NEXT:    mffprwz r3, f0
4293; CHECK-PREP10-NEXT:    blr
4294entry:
4295  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
4296  %0 = load float, ptr %add.ptr, align 4
4297  %conv = fptoui float %0 to i32
4298  ret i32 %conv
4299}
4300
4301; Function Attrs: norecurse nounwind readonly uwtable willreturn
4302define dso_local zeroext i32 @ld_reg_uint32_t_float(ptr nocapture readonly %ptr, i64 %off) {
4303; CHECK-LABEL: ld_reg_uint32_t_float:
4304; CHECK:       # %bb.0: # %entry
4305; CHECK-NEXT:    lfsx f0, r3, r4
4306; CHECK-NEXT:    xscvdpuxws f0, f0
4307; CHECK-NEXT:    mffprwz r3, f0
4308; CHECK-NEXT:    blr
4309entry:
4310  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
4311  %0 = load float, ptr %add.ptr, align 4
4312  %conv = fptoui float %0 to i32
4313  ret i32 %conv
4314}
4315
4316; Function Attrs: norecurse nounwind readonly uwtable willreturn
4317define dso_local zeroext i32 @ld_or_uint32_t_float(i64 %ptr, i8 zeroext %off) {
4318; CHECK-LABEL: ld_or_uint32_t_float:
4319; CHECK:       # %bb.0: # %entry
4320; CHECK-NEXT:    or r3, r4, r3
4321; CHECK-NEXT:    lfs f0, 0(r3)
4322; CHECK-NEXT:    xscvdpuxws f0, f0
4323; CHECK-NEXT:    mffprwz r3, f0
4324; CHECK-NEXT:    blr
4325entry:
4326  %conv = zext i8 %off to i64
4327  %or = or i64 %conv, %ptr
4328  %0 = inttoptr i64 %or to ptr
4329  %1 = load float, ptr %0, align 4
4330  %conv1 = fptoui float %1 to i32
4331  ret i32 %conv1
4332}
4333
4334; Function Attrs: norecurse nounwind readonly uwtable willreturn
4335define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_float(i64 %ptr) {
4336; CHECK-LABEL: ld_not_disjoint16_uint32_t_float:
4337; CHECK:       # %bb.0: # %entry
4338; CHECK-NEXT:    ori r3, r3, 6
4339; CHECK-NEXT:    lfs f0, 0(r3)
4340; CHECK-NEXT:    xscvdpuxws f0, f0
4341; CHECK-NEXT:    mffprwz r3, f0
4342; CHECK-NEXT:    blr
4343entry:
4344  %or = or i64 %ptr, 6
4345  %0 = inttoptr i64 %or to ptr
4346  %1 = load float, ptr %0, align 4
4347  %conv = fptoui float %1 to i32
4348  ret i32 %conv
4349}
4350
4351; Function Attrs: norecurse nounwind readonly uwtable willreturn
4352define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_float(i64 %ptr) {
4353; CHECK-LABEL: ld_disjoint_align16_uint32_t_float:
4354; CHECK:       # %bb.0: # %entry
4355; CHECK-NEXT:    rldicr r3, r3, 0, 51
4356; CHECK-NEXT:    lfs f0, 24(r3)
4357; CHECK-NEXT:    xscvdpuxws f0, f0
4358; CHECK-NEXT:    mffprwz r3, f0
4359; CHECK-NEXT:    blr
4360entry:
4361  %and = and i64 %ptr, -4096
4362  %or = or i64 %and, 24
4363  %0 = inttoptr i64 %or to ptr
4364  %1 = load float, ptr %0, align 8
4365  %conv = fptoui float %1 to i32
4366  ret i32 %conv
4367}
4368
4369; Function Attrs: norecurse nounwind readonly uwtable willreturn
4370define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_float(i64 %ptr) {
4371; CHECK-LABEL: ld_not_disjoint32_uint32_t_float:
4372; CHECK:       # %bb.0: # %entry
4373; CHECK-NEXT:    ori r3, r3, 34463
4374; CHECK-NEXT:    oris r3, r3, 1
4375; CHECK-NEXT:    lfs f0, 0(r3)
4376; CHECK-NEXT:    xscvdpuxws f0, f0
4377; CHECK-NEXT:    mffprwz r3, f0
4378; CHECK-NEXT:    blr
4379entry:
4380  %or = or i64 %ptr, 99999
4381  %0 = inttoptr i64 %or to ptr
4382  %1 = load float, ptr %0, align 4
4383  %conv = fptoui float %1 to i32
4384  ret i32 %conv
4385}
4386
4387; Function Attrs: norecurse nounwind readonly uwtable willreturn
4388define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_float(i64 %ptr) {
4389; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_float:
4390; CHECK-P10:       # %bb.0: # %entry
4391; CHECK-P10-NEXT:    lis r4, -15264
4392; CHECK-P10-NEXT:    and r3, r3, r4
4393; CHECK-P10-NEXT:    plfs f0, 999990000(r3), 0
4394; CHECK-P10-NEXT:    xscvdpuxws f0, f0
4395; CHECK-P10-NEXT:    mffprwz r3, f0
4396; CHECK-P10-NEXT:    blr
4397;
4398; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_float:
4399; CHECK-PREP10:       # %bb.0: # %entry
4400; CHECK-PREP10-NEXT:    lis r4, -15264
4401; CHECK-PREP10-NEXT:    and r3, r3, r4
4402; CHECK-PREP10-NEXT:    lis r4, 15258
4403; CHECK-PREP10-NEXT:    ori r4, r4, 41712
4404; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
4405; CHECK-PREP10-NEXT:    xscvdpuxws f0, f0
4406; CHECK-PREP10-NEXT:    mffprwz r3, f0
4407; CHECK-PREP10-NEXT:    blr
4408entry:
4409  %and = and i64 %ptr, -1000341504
4410  %or = or i64 %and, 999990000
4411  %0 = inttoptr i64 %or to ptr
4412  %1 = load float, ptr %0, align 16
4413  %conv = fptoui float %1 to i32
4414  ret i32 %conv
4415}
4416
4417; Function Attrs: norecurse nounwind readonly uwtable willreturn
4418define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_float(i64 %ptr) {
4419; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_float:
4420; CHECK-P10:       # %bb.0: # %entry
4421; CHECK-P10-NEXT:    pli r4, 232
4422; CHECK-P10-NEXT:    pli r5, 3567587329
4423; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
4424; CHECK-P10-NEXT:    or r3, r3, r5
4425; CHECK-P10-NEXT:    lfs f0, 0(r3)
4426; CHECK-P10-NEXT:    xscvdpuxws f0, f0
4427; CHECK-P10-NEXT:    mffprwz r3, f0
4428; CHECK-P10-NEXT:    blr
4429;
4430; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_float:
4431; CHECK-PREP10:       # %bb.0: # %entry
4432; CHECK-PREP10-NEXT:    li r4, 29
4433; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
4434; CHECK-PREP10-NEXT:    oris r4, r4, 54437
4435; CHECK-PREP10-NEXT:    ori r4, r4, 4097
4436; CHECK-PREP10-NEXT:    or r3, r3, r4
4437; CHECK-PREP10-NEXT:    lfs f0, 0(r3)
4438; CHECK-PREP10-NEXT:    xscvdpuxws f0, f0
4439; CHECK-PREP10-NEXT:    mffprwz r3, f0
4440; CHECK-PREP10-NEXT:    blr
4441entry:
4442  %or = or i64 %ptr, 1000000000001
4443  %0 = inttoptr i64 %or to ptr
4444  %1 = load float, ptr %0, align 4
4445  %conv = fptoui float %1 to i32
4446  ret i32 %conv
4447}
4448
4449; Function Attrs: norecurse nounwind readonly uwtable willreturn
4450define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_float(i64 %ptr) {
4451; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_float:
4452; CHECK-P10:       # %bb.0: # %entry
4453; CHECK-P10-NEXT:    pli r4, 244140625
4454; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
4455; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4456; CHECK-P10-NEXT:    lfsx f0, r3, r4
4457; CHECK-P10-NEXT:    xscvdpuxws f0, f0
4458; CHECK-P10-NEXT:    mffprwz r3, f0
4459; CHECK-P10-NEXT:    blr
4460;
4461; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_float:
4462; CHECK-PREP10:       # %bb.0: # %entry
4463; CHECK-PREP10-NEXT:    lis r4, 3725
4464; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
4465; CHECK-PREP10-NEXT:    ori r4, r4, 19025
4466; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
4467; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
4468; CHECK-PREP10-NEXT:    xscvdpuxws f0, f0
4469; CHECK-PREP10-NEXT:    mffprwz r3, f0
4470; CHECK-PREP10-NEXT:    blr
4471entry:
4472  %and = and i64 %ptr, -1099511627776
4473  %or = or i64 %and, 1000000000000
4474  %0 = inttoptr i64 %or to ptr
4475  %1 = load float, ptr %0, align 4096
4476  %conv = fptoui float %1 to i32
4477  ret i32 %conv
4478}
4479
4480; Function Attrs: norecurse nounwind readonly uwtable willreturn
4481define dso_local zeroext i32 @ld_cst_align16_uint32_t_float() {
4482; CHECK-LABEL: ld_cst_align16_uint32_t_float:
4483; CHECK:       # %bb.0: # %entry
4484; CHECK-NEXT:    lfs f0, 4080(0)
4485; CHECK-NEXT:    xscvdpuxws f0, f0
4486; CHECK-NEXT:    mffprwz r3, f0
4487; CHECK-NEXT:    blr
4488entry:
4489  %0 = load float, ptr inttoptr (i64 4080 to ptr), align 16
4490  %conv = fptoui float %0 to i32
4491  ret i32 %conv
4492}
4493
4494; Function Attrs: norecurse nounwind readonly uwtable willreturn
4495define dso_local zeroext i32 @ld_cst_align32_uint32_t_float() {
4496; CHECK-LABEL: ld_cst_align32_uint32_t_float:
4497; CHECK:       # %bb.0: # %entry
4498; CHECK-NEXT:    lis r3, 153
4499; CHECK-NEXT:    lfs f0, -27108(r3)
4500; CHECK-NEXT:    xscvdpuxws f0, f0
4501; CHECK-NEXT:    mffprwz r3, f0
4502; CHECK-NEXT:    blr
4503entry:
4504  %0 = load float, ptr inttoptr (i64 9999900 to ptr), align 4
4505  %conv = fptoui float %0 to i32
4506  ret i32 %conv
4507}
4508
4509; Function Attrs: norecurse nounwind readonly uwtable willreturn
4510define dso_local zeroext i32 @ld_cst_align64_uint32_t_float() {
4511; CHECK-P10-LABEL: ld_cst_align64_uint32_t_float:
4512; CHECK-P10:       # %bb.0: # %entry
4513; CHECK-P10-NEXT:    pli r3, 244140625
4514; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
4515; CHECK-P10-NEXT:    lfs f0, 0(r3)
4516; CHECK-P10-NEXT:    xscvdpuxws f0, f0
4517; CHECK-P10-NEXT:    mffprwz r3, f0
4518; CHECK-P10-NEXT:    blr
4519;
4520; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_float:
4521; CHECK-PREP10:       # %bb.0: # %entry
4522; CHECK-PREP10-NEXT:    lis r3, 3725
4523; CHECK-PREP10-NEXT:    ori r3, r3, 19025
4524; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
4525; CHECK-PREP10-NEXT:    lfs f0, 0(r3)
4526; CHECK-PREP10-NEXT:    xscvdpuxws f0, f0
4527; CHECK-PREP10-NEXT:    mffprwz r3, f0
4528; CHECK-PREP10-NEXT:    blr
4529entry:
4530  %0 = load float, ptr inttoptr (i64 1000000000000 to ptr), align 4096
4531  %conv = fptoui float %0 to i32
4532  ret i32 %conv
4533}
4534
4535; Function Attrs: norecurse nounwind readonly uwtable willreturn
4536define dso_local zeroext i32 @ld_0_uint32_t_double(i64 %ptr) {
4537; CHECK-LABEL: ld_0_uint32_t_double:
4538; CHECK:       # %bb.0: # %entry
4539; CHECK-NEXT:    lfd f0, 0(r3)
4540; CHECK-NEXT:    xscvdpuxws f0, f0
4541; CHECK-NEXT:    mffprwz r3, f0
4542; CHECK-NEXT:    blr
4543entry:
4544  %0 = inttoptr i64 %ptr to ptr
4545  %1 = load double, ptr %0, align 8
4546  %conv = fptoui double %1 to i32
4547  ret i32 %conv
4548}
4549
4550; Function Attrs: norecurse nounwind readonly uwtable willreturn
4551define dso_local zeroext i32 @ld_align16_uint32_t_double(ptr nocapture readonly %ptr) {
4552; CHECK-LABEL: ld_align16_uint32_t_double:
4553; CHECK:       # %bb.0: # %entry
4554; CHECK-NEXT:    lfd f0, 8(r3)
4555; CHECK-NEXT:    xscvdpuxws f0, f0
4556; CHECK-NEXT:    mffprwz r3, f0
4557; CHECK-NEXT:    blr
4558entry:
4559  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
4560  %0 = load double, ptr %add.ptr, align 8
4561  %conv = fptoui double %0 to i32
4562  ret i32 %conv
4563}
4564
4565; Function Attrs: norecurse nounwind readonly uwtable willreturn
4566define dso_local zeroext i32 @ld_align32_uint32_t_double(ptr nocapture readonly %ptr) {
4567; CHECK-P10-LABEL: ld_align32_uint32_t_double:
4568; CHECK-P10:       # %bb.0: # %entry
4569; CHECK-P10-NEXT:    plfd f0, 99999000(r3), 0
4570; CHECK-P10-NEXT:    xscvdpuxws f0, f0
4571; CHECK-P10-NEXT:    mffprwz r3, f0
4572; CHECK-P10-NEXT:    blr
4573;
4574; CHECK-PREP10-LABEL: ld_align32_uint32_t_double:
4575; CHECK-PREP10:       # %bb.0: # %entry
4576; CHECK-PREP10-NEXT:    lis r4, 1525
4577; CHECK-PREP10-NEXT:    ori r4, r4, 56600
4578; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
4579; CHECK-PREP10-NEXT:    xscvdpuxws f0, f0
4580; CHECK-PREP10-NEXT:    mffprwz r3, f0
4581; CHECK-PREP10-NEXT:    blr
4582entry:
4583  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
4584  %0 = load double, ptr %add.ptr, align 8
4585  %conv = fptoui double %0 to i32
4586  ret i32 %conv
4587}
4588
4589; Function Attrs: norecurse nounwind readonly uwtable willreturn
4590define dso_local zeroext i32 @ld_align64_uint32_t_double(ptr nocapture readonly %ptr) {
4591; CHECK-P10-LABEL: ld_align64_uint32_t_double:
4592; CHECK-P10:       # %bb.0: # %entry
4593; CHECK-P10-NEXT:    pli r4, 244140625
4594; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4595; CHECK-P10-NEXT:    lfdx f0, r3, r4
4596; CHECK-P10-NEXT:    xscvdpuxws f0, f0
4597; CHECK-P10-NEXT:    mffprwz r3, f0
4598; CHECK-P10-NEXT:    blr
4599;
4600; CHECK-PREP10-LABEL: ld_align64_uint32_t_double:
4601; CHECK-PREP10:       # %bb.0: # %entry
4602; CHECK-PREP10-NEXT:    lis r4, 3725
4603; CHECK-PREP10-NEXT:    ori r4, r4, 19025
4604; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
4605; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
4606; CHECK-PREP10-NEXT:    xscvdpuxws f0, f0
4607; CHECK-PREP10-NEXT:    mffprwz r3, f0
4608; CHECK-PREP10-NEXT:    blr
4609entry:
4610  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
4611  %0 = load double, ptr %add.ptr, align 8
4612  %conv = fptoui double %0 to i32
4613  ret i32 %conv
4614}
4615
4616; Function Attrs: norecurse nounwind readonly uwtable willreturn
4617define dso_local zeroext i32 @ld_reg_uint32_t_double(ptr nocapture readonly %ptr, i64 %off) {
4618; CHECK-LABEL: ld_reg_uint32_t_double:
4619; CHECK:       # %bb.0: # %entry
4620; CHECK-NEXT:    lfdx f0, r3, r4
4621; CHECK-NEXT:    xscvdpuxws f0, f0
4622; CHECK-NEXT:    mffprwz r3, f0
4623; CHECK-NEXT:    blr
4624entry:
4625  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
4626  %0 = load double, ptr %add.ptr, align 8
4627  %conv = fptoui double %0 to i32
4628  ret i32 %conv
4629}
4630
4631; Function Attrs: norecurse nounwind readonly uwtable willreturn
4632define dso_local zeroext i32 @ld_or_uint32_t_double(i64 %ptr, i8 zeroext %off) {
4633; CHECK-LABEL: ld_or_uint32_t_double:
4634; CHECK:       # %bb.0: # %entry
4635; CHECK-NEXT:    or r3, r4, r3
4636; CHECK-NEXT:    lfd f0, 0(r3)
4637; CHECK-NEXT:    xscvdpuxws f0, f0
4638; CHECK-NEXT:    mffprwz r3, f0
4639; CHECK-NEXT:    blr
4640entry:
4641  %conv = zext i8 %off to i64
4642  %or = or i64 %conv, %ptr
4643  %0 = inttoptr i64 %or to ptr
4644  %1 = load double, ptr %0, align 8
4645  %conv1 = fptoui double %1 to i32
4646  ret i32 %conv1
4647}
4648
4649; Function Attrs: norecurse nounwind readonly uwtable willreturn
4650define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_double(i64 %ptr) {
4651; CHECK-LABEL: ld_not_disjoint16_uint32_t_double:
4652; CHECK:       # %bb.0: # %entry
4653; CHECK-NEXT:    ori r3, r3, 6
4654; CHECK-NEXT:    lfd f0, 0(r3)
4655; CHECK-NEXT:    xscvdpuxws f0, f0
4656; CHECK-NEXT:    mffprwz r3, f0
4657; CHECK-NEXT:    blr
4658entry:
4659  %or = or i64 %ptr, 6
4660  %0 = inttoptr i64 %or to ptr
4661  %1 = load double, ptr %0, align 8
4662  %conv = fptoui double %1 to i32
4663  ret i32 %conv
4664}
4665
4666; Function Attrs: norecurse nounwind readonly uwtable willreturn
4667define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_double(i64 %ptr) {
4668; CHECK-LABEL: ld_disjoint_align16_uint32_t_double:
4669; CHECK:       # %bb.0: # %entry
4670; CHECK-NEXT:    rldicr r3, r3, 0, 51
4671; CHECK-NEXT:    lfd f0, 24(r3)
4672; CHECK-NEXT:    xscvdpuxws f0, f0
4673; CHECK-NEXT:    mffprwz r3, f0
4674; CHECK-NEXT:    blr
4675entry:
4676  %and = and i64 %ptr, -4096
4677  %or = or i64 %and, 24
4678  %0 = inttoptr i64 %or to ptr
4679  %1 = load double, ptr %0, align 8
4680  %conv = fptoui double %1 to i32
4681  ret i32 %conv
4682}
4683
4684; Function Attrs: norecurse nounwind readonly uwtable willreturn
4685define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_double(i64 %ptr) {
4686; CHECK-LABEL: ld_not_disjoint32_uint32_t_double:
4687; CHECK:       # %bb.0: # %entry
4688; CHECK-NEXT:    ori r3, r3, 34463
4689; CHECK-NEXT:    oris r3, r3, 1
4690; CHECK-NEXT:    lfd f0, 0(r3)
4691; CHECK-NEXT:    xscvdpuxws f0, f0
4692; CHECK-NEXT:    mffprwz r3, f0
4693; CHECK-NEXT:    blr
4694entry:
4695  %or = or i64 %ptr, 99999
4696  %0 = inttoptr i64 %or to ptr
4697  %1 = load double, ptr %0, align 8
4698  %conv = fptoui double %1 to i32
4699  ret i32 %conv
4700}
4701
4702; Function Attrs: norecurse nounwind readonly uwtable willreturn
4703define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_double(i64 %ptr) {
4704; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_double:
4705; CHECK-P10:       # %bb.0: # %entry
4706; CHECK-P10-NEXT:    lis r4, -15264
4707; CHECK-P10-NEXT:    and r3, r3, r4
4708; CHECK-P10-NEXT:    plfd f0, 999990000(r3), 0
4709; CHECK-P10-NEXT:    xscvdpuxws f0, f0
4710; CHECK-P10-NEXT:    mffprwz r3, f0
4711; CHECK-P10-NEXT:    blr
4712;
4713; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_double:
4714; CHECK-PREP10:       # %bb.0: # %entry
4715; CHECK-PREP10-NEXT:    lis r4, -15264
4716; CHECK-PREP10-NEXT:    and r3, r3, r4
4717; CHECK-PREP10-NEXT:    lis r4, 15258
4718; CHECK-PREP10-NEXT:    ori r4, r4, 41712
4719; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
4720; CHECK-PREP10-NEXT:    xscvdpuxws f0, f0
4721; CHECK-PREP10-NEXT:    mffprwz r3, f0
4722; CHECK-PREP10-NEXT:    blr
4723entry:
4724  %and = and i64 %ptr, -1000341504
4725  %or = or i64 %and, 999990000
4726  %0 = inttoptr i64 %or to ptr
4727  %1 = load double, ptr %0, align 16
4728  %conv = fptoui double %1 to i32
4729  ret i32 %conv
4730}
4731
4732; Function Attrs: norecurse nounwind readonly uwtable willreturn
4733define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_double(i64 %ptr) {
4734; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_double:
4735; CHECK-P10:       # %bb.0: # %entry
4736; CHECK-P10-NEXT:    pli r4, 232
4737; CHECK-P10-NEXT:    pli r5, 3567587329
4738; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
4739; CHECK-P10-NEXT:    or r3, r3, r5
4740; CHECK-P10-NEXT:    lfd f0, 0(r3)
4741; CHECK-P10-NEXT:    xscvdpuxws f0, f0
4742; CHECK-P10-NEXT:    mffprwz r3, f0
4743; CHECK-P10-NEXT:    blr
4744;
4745; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_double:
4746; CHECK-PREP10:       # %bb.0: # %entry
4747; CHECK-PREP10-NEXT:    li r4, 29
4748; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
4749; CHECK-PREP10-NEXT:    oris r4, r4, 54437
4750; CHECK-PREP10-NEXT:    ori r4, r4, 4097
4751; CHECK-PREP10-NEXT:    or r3, r3, r4
4752; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
4753; CHECK-PREP10-NEXT:    xscvdpuxws f0, f0
4754; CHECK-PREP10-NEXT:    mffprwz r3, f0
4755; CHECK-PREP10-NEXT:    blr
4756entry:
4757  %or = or i64 %ptr, 1000000000001
4758  %0 = inttoptr i64 %or to ptr
4759  %1 = load double, ptr %0, align 8
4760  %conv = fptoui double %1 to i32
4761  ret i32 %conv
4762}
4763
4764; Function Attrs: norecurse nounwind readonly uwtable willreturn
4765define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_double(i64 %ptr) {
4766; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_double:
4767; CHECK-P10:       # %bb.0: # %entry
4768; CHECK-P10-NEXT:    pli r4, 244140625
4769; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
4770; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4771; CHECK-P10-NEXT:    lfdx f0, r3, r4
4772; CHECK-P10-NEXT:    xscvdpuxws f0, f0
4773; CHECK-P10-NEXT:    mffprwz r3, f0
4774; CHECK-P10-NEXT:    blr
4775;
4776; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_double:
4777; CHECK-PREP10:       # %bb.0: # %entry
4778; CHECK-PREP10-NEXT:    lis r4, 3725
4779; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
4780; CHECK-PREP10-NEXT:    ori r4, r4, 19025
4781; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
4782; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
4783; CHECK-PREP10-NEXT:    xscvdpuxws f0, f0
4784; CHECK-PREP10-NEXT:    mffprwz r3, f0
4785; CHECK-PREP10-NEXT:    blr
4786entry:
4787  %and = and i64 %ptr, -1099511627776
4788  %or = or i64 %and, 1000000000000
4789  %0 = inttoptr i64 %or to ptr
4790  %1 = load double, ptr %0, align 4096
4791  %conv = fptoui double %1 to i32
4792  ret i32 %conv
4793}
4794
4795; Function Attrs: norecurse nounwind readonly uwtable willreturn
4796define dso_local zeroext i32 @ld_cst_align16_uint32_t_double() {
4797; CHECK-LABEL: ld_cst_align16_uint32_t_double:
4798; CHECK:       # %bb.0: # %entry
4799; CHECK-NEXT:    lfd f0, 4080(0)
4800; CHECK-NEXT:    xscvdpuxws f0, f0
4801; CHECK-NEXT:    mffprwz r3, f0
4802; CHECK-NEXT:    blr
4803entry:
4804  %0 = load double, ptr inttoptr (i64 4080 to ptr), align 16
4805  %conv = fptoui double %0 to i32
4806  ret i32 %conv
4807}
4808
4809; Function Attrs: norecurse nounwind readonly uwtable willreturn
4810define dso_local zeroext i32 @ld_cst_align32_uint32_t_double() {
4811; CHECK-LABEL: ld_cst_align32_uint32_t_double:
4812; CHECK:       # %bb.0: # %entry
4813; CHECK-NEXT:    lis r3, 153
4814; CHECK-NEXT:    lfd f0, -27108(r3)
4815; CHECK-NEXT:    xscvdpuxws f0, f0
4816; CHECK-NEXT:    mffprwz r3, f0
4817; CHECK-NEXT:    blr
4818entry:
4819  %0 = load double, ptr inttoptr (i64 9999900 to ptr), align 8
4820  %conv = fptoui double %0 to i32
4821  ret i32 %conv
4822}
4823
4824; Function Attrs: norecurse nounwind readonly uwtable willreturn
4825define dso_local zeroext i32 @ld_cst_align64_uint32_t_double() {
4826; CHECK-P10-LABEL: ld_cst_align64_uint32_t_double:
4827; CHECK-P10:       # %bb.0: # %entry
4828; CHECK-P10-NEXT:    pli r3, 244140625
4829; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
4830; CHECK-P10-NEXT:    lfd f0, 0(r3)
4831; CHECK-P10-NEXT:    xscvdpuxws f0, f0
4832; CHECK-P10-NEXT:    mffprwz r3, f0
4833; CHECK-P10-NEXT:    blr
4834;
4835; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_double:
4836; CHECK-PREP10:       # %bb.0: # %entry
4837; CHECK-PREP10-NEXT:    lis r3, 3725
4838; CHECK-PREP10-NEXT:    ori r3, r3, 19025
4839; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
4840; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
4841; CHECK-PREP10-NEXT:    xscvdpuxws f0, f0
4842; CHECK-PREP10-NEXT:    mffprwz r3, f0
4843; CHECK-PREP10-NEXT:    blr
4844entry:
4845  %0 = load double, ptr inttoptr (i64 1000000000000 to ptr), align 4096
4846  %conv = fptoui double %0 to i32
4847  ret i32 %conv
4848}
4849
4850; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4851define dso_local void @st_0_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
4852; CHECK-LABEL: st_0_uint32_t_uint8_t:
4853; CHECK:       # %bb.0: # %entry
4854; CHECK-NEXT:    stb r4, 0(r3)
4855; CHECK-NEXT:    blr
4856entry:
4857  %conv = trunc i32 %str to i8
4858  %0 = inttoptr i64 %ptr to ptr
4859  store i8 %conv, ptr %0, align 1
4860  ret void
4861}
4862
4863; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4864define dso_local void @st_align16_uint32_t_uint8_t(ptr nocapture %ptr, i32 zeroext %str) {
4865; CHECK-LABEL: st_align16_uint32_t_uint8_t:
4866; CHECK:       # %bb.0: # %entry
4867; CHECK-NEXT:    stb r4, 8(r3)
4868; CHECK-NEXT:    blr
4869entry:
4870  %conv = trunc i32 %str to i8
4871  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
4872  store i8 %conv, ptr %add.ptr, align 1
4873  ret void
4874}
4875
4876; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4877define dso_local void @st_align32_uint32_t_uint8_t(ptr nocapture %ptr, i32 zeroext %str) {
4878; CHECK-P10-LABEL: st_align32_uint32_t_uint8_t:
4879; CHECK-P10:       # %bb.0: # %entry
4880; CHECK-P10-NEXT:    pstb r4, 99999000(r3), 0
4881; CHECK-P10-NEXT:    blr
4882;
4883; CHECK-PREP10-LABEL: st_align32_uint32_t_uint8_t:
4884; CHECK-PREP10:       # %bb.0: # %entry
4885; CHECK-PREP10-NEXT:    lis r5, 1525
4886; CHECK-PREP10-NEXT:    ori r5, r5, 56600
4887; CHECK-PREP10-NEXT:    stbx r4, r3, r5
4888; CHECK-PREP10-NEXT:    blr
4889entry:
4890  %conv = trunc i32 %str to i8
4891  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
4892  store i8 %conv, ptr %add.ptr, align 1
4893  ret void
4894}
4895
4896; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4897define dso_local void @st_align64_uint32_t_uint8_t(ptr nocapture %ptr, i32 zeroext %str) {
4898; CHECK-P10-LABEL: st_align64_uint32_t_uint8_t:
4899; CHECK-P10:       # %bb.0: # %entry
4900; CHECK-P10-NEXT:    pli r5, 244140625
4901; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
4902; CHECK-P10-NEXT:    stbx r4, r3, r5
4903; CHECK-P10-NEXT:    blr
4904;
4905; CHECK-PREP10-LABEL: st_align64_uint32_t_uint8_t:
4906; CHECK-PREP10:       # %bb.0: # %entry
4907; CHECK-PREP10-NEXT:    lis r5, 3725
4908; CHECK-PREP10-NEXT:    ori r5, r5, 19025
4909; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
4910; CHECK-PREP10-NEXT:    stbx r4, r3, r5
4911; CHECK-PREP10-NEXT:    blr
4912entry:
4913  %conv = trunc i32 %str to i8
4914  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
4915  store i8 %conv, ptr %add.ptr, align 1
4916  ret void
4917}
4918
4919; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4920define dso_local void @st_reg_uint32_t_uint8_t(ptr nocapture %ptr, i64 %off, i32 zeroext %str) {
4921; CHECK-LABEL: st_reg_uint32_t_uint8_t:
4922; CHECK:       # %bb.0: # %entry
4923; CHECK-NEXT:    stbx r5, r3, r4
4924; CHECK-NEXT:    blr
4925entry:
4926  %conv = trunc i32 %str to i8
4927  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
4928  store i8 %conv, ptr %add.ptr, align 1
4929  ret void
4930}
4931
4932; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4933define dso_local void @st_or1_uint32_t_uint8_t(i64 %ptr, i8 zeroext %off, i32 zeroext %str) {
4934; CHECK-LABEL: st_or1_uint32_t_uint8_t:
4935; CHECK:       # %bb.0: # %entry
4936; CHECK-NEXT:    or r3, r4, r3
4937; CHECK-NEXT:    stb r5, 0(r3)
4938; CHECK-NEXT:    blr
4939entry:
4940  %conv = trunc i32 %str to i8
4941  %conv1 = zext i8 %off to i64
4942  %or = or i64 %conv1, %ptr
4943  %0 = inttoptr i64 %or to ptr
4944  store i8 %conv, ptr %0, align 1
4945  ret void
4946}
4947
4948; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4949define dso_local void @st_not_disjoint16_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
4950; CHECK-LABEL: st_not_disjoint16_uint32_t_uint8_t:
4951; CHECK:       # %bb.0: # %entry
4952; CHECK-NEXT:    ori r3, r3, 6
4953; CHECK-NEXT:    stb r4, 0(r3)
4954; CHECK-NEXT:    blr
4955entry:
4956  %conv = trunc i32 %str to i8
4957  %or = or i64 %ptr, 6
4958  %0 = inttoptr i64 %or to ptr
4959  store i8 %conv, ptr %0, align 1
4960  ret void
4961}
4962
4963; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4964define dso_local void @st_disjoint_align16_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
4965; CHECK-LABEL: st_disjoint_align16_uint32_t_uint8_t:
4966; CHECK:       # %bb.0: # %entry
4967; CHECK-NEXT:    rldicr r3, r3, 0, 51
4968; CHECK-NEXT:    stb r4, 24(r3)
4969; CHECK-NEXT:    blr
4970entry:
4971  %and = and i64 %ptr, -4096
4972  %conv = trunc i32 %str to i8
4973  %or = or i64 %and, 24
4974  %0 = inttoptr i64 %or to ptr
4975  store i8 %conv, ptr %0, align 8
4976  ret void
4977}
4978
4979; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4980define dso_local void @st_not_disjoint32_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
4981; CHECK-LABEL: st_not_disjoint32_uint32_t_uint8_t:
4982; CHECK:       # %bb.0: # %entry
4983; CHECK-NEXT:    ori r3, r3, 34463
4984; CHECK-NEXT:    oris r3, r3, 1
4985; CHECK-NEXT:    stb r4, 0(r3)
4986; CHECK-NEXT:    blr
4987entry:
4988  %conv = trunc i32 %str to i8
4989  %or = or i64 %ptr, 99999
4990  %0 = inttoptr i64 %or to ptr
4991  store i8 %conv, ptr %0, align 1
4992  ret void
4993}
4994
4995; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4996define dso_local void @st_disjoint_align32_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
4997; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_uint8_t:
4998; CHECK-P10:       # %bb.0: # %entry
4999; CHECK-P10-NEXT:    lis r5, -15264
5000; CHECK-P10-NEXT:    and r3, r3, r5
5001; CHECK-P10-NEXT:    pstb r4, 999990000(r3), 0
5002; CHECK-P10-NEXT:    blr
5003;
5004; CHECK-PREP10-LABEL: st_disjoint_align32_uint32_t_uint8_t:
5005; CHECK-PREP10:       # %bb.0: # %entry
5006; CHECK-PREP10-NEXT:    lis r5, -15264
5007; CHECK-PREP10-NEXT:    and r3, r3, r5
5008; CHECK-PREP10-NEXT:    lis r5, 15258
5009; CHECK-PREP10-NEXT:    ori r5, r5, 41712
5010; CHECK-PREP10-NEXT:    stbx r4, r3, r5
5011; CHECK-PREP10-NEXT:    blr
5012entry:
5013  %and = and i64 %ptr, -1000341504
5014  %conv = trunc i32 %str to i8
5015  %or = or i64 %and, 999990000
5016  %0 = inttoptr i64 %or to ptr
5017  store i8 %conv, ptr %0, align 16
5018  ret void
5019}
5020
5021; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5022define dso_local void @st_not_disjoint64_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
5023; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_uint8_t:
5024; CHECK-P10:       # %bb.0: # %entry
5025; CHECK-P10-NEXT:    pli r5, 232
5026; CHECK-P10-NEXT:    pli r6, 3567587329
5027; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
5028; CHECK-P10-NEXT:    or r3, r3, r6
5029; CHECK-P10-NEXT:    stb r4, 0(r3)
5030; CHECK-P10-NEXT:    blr
5031;
5032; CHECK-PREP10-LABEL: st_not_disjoint64_uint32_t_uint8_t:
5033; CHECK-PREP10:       # %bb.0: # %entry
5034; CHECK-PREP10-NEXT:    li r5, 29
5035; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
5036; CHECK-PREP10-NEXT:    oris r5, r5, 54437
5037; CHECK-PREP10-NEXT:    ori r5, r5, 4097
5038; CHECK-PREP10-NEXT:    or r3, r3, r5
5039; CHECK-PREP10-NEXT:    stb r4, 0(r3)
5040; CHECK-PREP10-NEXT:    blr
5041entry:
5042  %conv = trunc i32 %str to i8
5043  %or = or i64 %ptr, 1000000000001
5044  %0 = inttoptr i64 %or to ptr
5045  store i8 %conv, ptr %0, align 1
5046  ret void
5047}
5048
5049; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5050define dso_local void @st_disjoint_align64_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) {
5051; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_uint8_t:
5052; CHECK-P10:       # %bb.0: # %entry
5053; CHECK-P10-NEXT:    pli r5, 244140625
5054; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
5055; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
5056; CHECK-P10-NEXT:    stbx r4, r3, r5
5057; CHECK-P10-NEXT:    blr
5058;
5059; CHECK-PREP10-LABEL: st_disjoint_align64_uint32_t_uint8_t:
5060; CHECK-PREP10:       # %bb.0: # %entry
5061; CHECK-PREP10-NEXT:    lis r5, 3725
5062; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
5063; CHECK-PREP10-NEXT:    ori r5, r5, 19025
5064; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
5065; CHECK-PREP10-NEXT:    stbx r4, r3, r5
5066; CHECK-PREP10-NEXT:    blr
5067entry:
5068  %and = and i64 %ptr, -1099511627776
5069  %conv = trunc i32 %str to i8
5070  %or = or i64 %and, 1000000000000
5071  %0 = inttoptr i64 %or to ptr
5072  store i8 %conv, ptr %0, align 4096
5073  ret void
5074}
5075
5076; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5077define dso_local void @st_cst_align16_uint32_t_uint8_t(i32 zeroext %str) {
5078; CHECK-LABEL: st_cst_align16_uint32_t_uint8_t:
5079; CHECK:       # %bb.0: # %entry
5080; CHECK-NEXT:    stb r3, 4080(0)
5081; CHECK-NEXT:    blr
5082entry:
5083  %conv = trunc i32 %str to i8
5084  store i8 %conv, ptr inttoptr (i64 4080 to ptr), align 16
5085  ret void
5086}
5087
5088; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5089define dso_local void @st_cst_align32_uint32_t_uint8_t(i32 zeroext %str) {
5090; CHECK-LABEL: st_cst_align32_uint32_t_uint8_t:
5091; CHECK:       # %bb.0: # %entry
5092; CHECK-NEXT:    lis r4, 153
5093; CHECK-NEXT:    stb r3, -27108(r4)
5094; CHECK-NEXT:    blr
5095entry:
5096  %conv = trunc i32 %str to i8
5097  store i8 %conv, ptr inttoptr (i64 9999900 to ptr), align 4
5098  ret void
5099}
5100
5101; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5102define dso_local void @st_cst_align64_uint32_t_uint8_t(i32 zeroext %str) {
5103; CHECK-P10-LABEL: st_cst_align64_uint32_t_uint8_t:
5104; CHECK-P10:       # %bb.0: # %entry
5105; CHECK-P10-NEXT:    pli r4, 244140625
5106; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5107; CHECK-P10-NEXT:    stb r3, 0(r4)
5108; CHECK-P10-NEXT:    blr
5109;
5110; CHECK-PREP10-LABEL: st_cst_align64_uint32_t_uint8_t:
5111; CHECK-PREP10:       # %bb.0: # %entry
5112; CHECK-PREP10-NEXT:    lis r4, 3725
5113; CHECK-PREP10-NEXT:    ori r4, r4, 19025
5114; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
5115; CHECK-PREP10-NEXT:    stb r3, 0(r4)
5116; CHECK-PREP10-NEXT:    blr
5117entry:
5118  %conv = trunc i32 %str to i8
5119  store i8 %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
5120  ret void
5121}
5122
5123; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5124define dso_local void @st_0_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
5125; CHECK-LABEL: st_0_uint32_t_uint16_t:
5126; CHECK:       # %bb.0: # %entry
5127; CHECK-NEXT:    sth r4, 0(r3)
5128; CHECK-NEXT:    blr
5129entry:
5130  %conv = trunc i32 %str to i16
5131  %0 = inttoptr i64 %ptr to ptr
5132  store i16 %conv, ptr %0, align 2
5133  ret void
5134}
5135
5136; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5137define dso_local void @st_align16_uint32_t_uint16_t(ptr nocapture %ptr, i32 zeroext %str) {
5138; CHECK-LABEL: st_align16_uint32_t_uint16_t:
5139; CHECK:       # %bb.0: # %entry
5140; CHECK-NEXT:    sth r4, 8(r3)
5141; CHECK-NEXT:    blr
5142entry:
5143  %conv = trunc i32 %str to i16
5144  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
5145  store i16 %conv, ptr %add.ptr, align 2
5146  ret void
5147}
5148
5149; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5150define dso_local void @st_align32_uint32_t_uint16_t(ptr nocapture %ptr, i32 zeroext %str) {
5151; CHECK-P10-LABEL: st_align32_uint32_t_uint16_t:
5152; CHECK-P10:       # %bb.0: # %entry
5153; CHECK-P10-NEXT:    psth r4, 99999000(r3), 0
5154; CHECK-P10-NEXT:    blr
5155;
5156; CHECK-PREP10-LABEL: st_align32_uint32_t_uint16_t:
5157; CHECK-PREP10:       # %bb.0: # %entry
5158; CHECK-PREP10-NEXT:    lis r5, 1525
5159; CHECK-PREP10-NEXT:    ori r5, r5, 56600
5160; CHECK-PREP10-NEXT:    sthx r4, r3, r5
5161; CHECK-PREP10-NEXT:    blr
5162entry:
5163  %conv = trunc i32 %str to i16
5164  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
5165  store i16 %conv, ptr %add.ptr, align 2
5166  ret void
5167}
5168
5169; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5170define dso_local void @st_align64_uint32_t_uint16_t(ptr nocapture %ptr, i32 zeroext %str) {
5171; CHECK-P10-LABEL: st_align64_uint32_t_uint16_t:
5172; CHECK-P10:       # %bb.0: # %entry
5173; CHECK-P10-NEXT:    pli r5, 244140625
5174; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
5175; CHECK-P10-NEXT:    sthx r4, r3, r5
5176; CHECK-P10-NEXT:    blr
5177;
5178; CHECK-PREP10-LABEL: st_align64_uint32_t_uint16_t:
5179; CHECK-PREP10:       # %bb.0: # %entry
5180; CHECK-PREP10-NEXT:    lis r5, 3725
5181; CHECK-PREP10-NEXT:    ori r5, r5, 19025
5182; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
5183; CHECK-PREP10-NEXT:    sthx r4, r3, r5
5184; CHECK-PREP10-NEXT:    blr
5185entry:
5186  %conv = trunc i32 %str to i16
5187  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
5188  store i16 %conv, ptr %add.ptr, align 2
5189  ret void
5190}
5191
5192; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5193define dso_local void @st_reg_uint32_t_uint16_t(ptr nocapture %ptr, i64 %off, i32 zeroext %str) {
5194; CHECK-LABEL: st_reg_uint32_t_uint16_t:
5195; CHECK:       # %bb.0: # %entry
5196; CHECK-NEXT:    sthx r5, r3, r4
5197; CHECK-NEXT:    blr
5198entry:
5199  %conv = trunc i32 %str to i16
5200  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
5201  store i16 %conv, ptr %add.ptr, align 2
5202  ret void
5203}
5204
5205; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5206define dso_local void @st_or1_uint32_t_uint16_t(i64 %ptr, i8 zeroext %off, i32 zeroext %str) {
5207; CHECK-LABEL: st_or1_uint32_t_uint16_t:
5208; CHECK:       # %bb.0: # %entry
5209; CHECK-NEXT:    or r3, r4, r3
5210; CHECK-NEXT:    sth r5, 0(r3)
5211; CHECK-NEXT:    blr
5212entry:
5213  %conv = trunc i32 %str to i16
5214  %conv1 = zext i8 %off to i64
5215  %or = or i64 %conv1, %ptr
5216  %0 = inttoptr i64 %or to ptr
5217  store i16 %conv, ptr %0, align 2
5218  ret void
5219}
5220
5221; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5222define dso_local void @st_not_disjoint16_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
5223; CHECK-LABEL: st_not_disjoint16_uint32_t_uint16_t:
5224; CHECK:       # %bb.0: # %entry
5225; CHECK-NEXT:    ori r3, r3, 6
5226; CHECK-NEXT:    sth r4, 0(r3)
5227; CHECK-NEXT:    blr
5228entry:
5229  %conv = trunc i32 %str to i16
5230  %or = or i64 %ptr, 6
5231  %0 = inttoptr i64 %or to ptr
5232  store i16 %conv, ptr %0, align 2
5233  ret void
5234}
5235
5236; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5237define dso_local void @st_disjoint_align16_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
5238; CHECK-LABEL: st_disjoint_align16_uint32_t_uint16_t:
5239; CHECK:       # %bb.0: # %entry
5240; CHECK-NEXT:    rldicr r3, r3, 0, 51
5241; CHECK-NEXT:    sth r4, 24(r3)
5242; CHECK-NEXT:    blr
5243entry:
5244  %and = and i64 %ptr, -4096
5245  %conv = trunc i32 %str to i16
5246  %or = or i64 %and, 24
5247  %0 = inttoptr i64 %or to ptr
5248  store i16 %conv, ptr %0, align 8
5249  ret void
5250}
5251
5252; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5253define dso_local void @st_not_disjoint32_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
5254; CHECK-LABEL: st_not_disjoint32_uint32_t_uint16_t:
5255; CHECK:       # %bb.0: # %entry
5256; CHECK-NEXT:    ori r3, r3, 34463
5257; CHECK-NEXT:    oris r3, r3, 1
5258; CHECK-NEXT:    sth r4, 0(r3)
5259; CHECK-NEXT:    blr
5260entry:
5261  %conv = trunc i32 %str to i16
5262  %or = or i64 %ptr, 99999
5263  %0 = inttoptr i64 %or to ptr
5264  store i16 %conv, ptr %0, align 2
5265  ret void
5266}
5267
5268; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5269define dso_local void @st_disjoint_align32_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
5270; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_uint16_t:
5271; CHECK-P10:       # %bb.0: # %entry
5272; CHECK-P10-NEXT:    lis r5, -15264
5273; CHECK-P10-NEXT:    and r3, r3, r5
5274; CHECK-P10-NEXT:    psth r4, 999990000(r3), 0
5275; CHECK-P10-NEXT:    blr
5276;
5277; CHECK-PREP10-LABEL: st_disjoint_align32_uint32_t_uint16_t:
5278; CHECK-PREP10:       # %bb.0: # %entry
5279; CHECK-PREP10-NEXT:    lis r5, -15264
5280; CHECK-PREP10-NEXT:    and r3, r3, r5
5281; CHECK-PREP10-NEXT:    lis r5, 15258
5282; CHECK-PREP10-NEXT:    ori r5, r5, 41712
5283; CHECK-PREP10-NEXT:    sthx r4, r3, r5
5284; CHECK-PREP10-NEXT:    blr
5285entry:
5286  %and = and i64 %ptr, -1000341504
5287  %conv = trunc i32 %str to i16
5288  %or = or i64 %and, 999990000
5289  %0 = inttoptr i64 %or to ptr
5290  store i16 %conv, ptr %0, align 16
5291  ret void
5292}
5293
5294; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5295define dso_local void @st_not_disjoint64_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
5296; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_uint16_t:
5297; CHECK-P10:       # %bb.0: # %entry
5298; CHECK-P10-NEXT:    pli r5, 232
5299; CHECK-P10-NEXT:    pli r6, 3567587329
5300; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
5301; CHECK-P10-NEXT:    or r3, r3, r6
5302; CHECK-P10-NEXT:    sth r4, 0(r3)
5303; CHECK-P10-NEXT:    blr
5304;
5305; CHECK-PREP10-LABEL: st_not_disjoint64_uint32_t_uint16_t:
5306; CHECK-PREP10:       # %bb.0: # %entry
5307; CHECK-PREP10-NEXT:    li r5, 29
5308; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
5309; CHECK-PREP10-NEXT:    oris r5, r5, 54437
5310; CHECK-PREP10-NEXT:    ori r5, r5, 4097
5311; CHECK-PREP10-NEXT:    or r3, r3, r5
5312; CHECK-PREP10-NEXT:    sth r4, 0(r3)
5313; CHECK-PREP10-NEXT:    blr
5314entry:
5315  %conv = trunc i32 %str to i16
5316  %or = or i64 %ptr, 1000000000001
5317  %0 = inttoptr i64 %or to ptr
5318  store i16 %conv, ptr %0, align 2
5319  ret void
5320}
5321
5322; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5323define dso_local void @st_disjoint_align64_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) {
5324; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_uint16_t:
5325; CHECK-P10:       # %bb.0: # %entry
5326; CHECK-P10-NEXT:    pli r5, 244140625
5327; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
5328; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
5329; CHECK-P10-NEXT:    sthx r4, r3, r5
5330; CHECK-P10-NEXT:    blr
5331;
5332; CHECK-PREP10-LABEL: st_disjoint_align64_uint32_t_uint16_t:
5333; CHECK-PREP10:       # %bb.0: # %entry
5334; CHECK-PREP10-NEXT:    lis r5, 3725
5335; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
5336; CHECK-PREP10-NEXT:    ori r5, r5, 19025
5337; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
5338; CHECK-PREP10-NEXT:    sthx r4, r3, r5
5339; CHECK-PREP10-NEXT:    blr
5340entry:
5341  %and = and i64 %ptr, -1099511627776
5342  %conv = trunc i32 %str to i16
5343  %or = or i64 %and, 1000000000000
5344  %0 = inttoptr i64 %or to ptr
5345  store i16 %conv, ptr %0, align 4096
5346  ret void
5347}
5348
5349; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5350define dso_local void @st_cst_align16_uint32_t_uint16_t(i32 zeroext %str) {
5351; CHECK-LABEL: st_cst_align16_uint32_t_uint16_t:
5352; CHECK:       # %bb.0: # %entry
5353; CHECK-NEXT:    sth r3, 4080(0)
5354; CHECK-NEXT:    blr
5355entry:
5356  %conv = trunc i32 %str to i16
5357  store i16 %conv, ptr inttoptr (i64 4080 to ptr), align 16
5358  ret void
5359}
5360
5361; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5362define dso_local void @st_cst_align32_uint32_t_uint16_t(i32 zeroext %str) {
5363; CHECK-LABEL: st_cst_align32_uint32_t_uint16_t:
5364; CHECK:       # %bb.0: # %entry
5365; CHECK-NEXT:    lis r4, 153
5366; CHECK-NEXT:    sth r3, -27108(r4)
5367; CHECK-NEXT:    blr
5368entry:
5369  %conv = trunc i32 %str to i16
5370  store i16 %conv, ptr inttoptr (i64 9999900 to ptr), align 4
5371  ret void
5372}
5373
5374; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5375define dso_local void @st_cst_align64_uint32_t_uint16_t(i32 zeroext %str) {
5376; CHECK-P10-LABEL: st_cst_align64_uint32_t_uint16_t:
5377; CHECK-P10:       # %bb.0: # %entry
5378; CHECK-P10-NEXT:    pli r4, 244140625
5379; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5380; CHECK-P10-NEXT:    sth r3, 0(r4)
5381; CHECK-P10-NEXT:    blr
5382;
5383; CHECK-PREP10-LABEL: st_cst_align64_uint32_t_uint16_t:
5384; CHECK-PREP10:       # %bb.0: # %entry
5385; CHECK-PREP10-NEXT:    lis r4, 3725
5386; CHECK-PREP10-NEXT:    ori r4, r4, 19025
5387; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
5388; CHECK-PREP10-NEXT:    sth r3, 0(r4)
5389; CHECK-PREP10-NEXT:    blr
5390entry:
5391  %conv = trunc i32 %str to i16
5392  store i16 %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
5393  ret void
5394}
5395
5396; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5397define dso_local void @st_0_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
5398; CHECK-LABEL: st_0_uint32_t_uint32_t:
5399; CHECK:       # %bb.0: # %entry
5400; CHECK-NEXT:    stw r4, 0(r3)
5401; CHECK-NEXT:    blr
5402entry:
5403  %0 = inttoptr i64 %ptr to ptr
5404  store i32 %str, ptr %0, align 4
5405  ret void
5406}
5407
5408; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5409define dso_local void @st_align16_uint32_t_uint32_t(ptr nocapture %ptr, i32 zeroext %str) {
5410; CHECK-LABEL: st_align16_uint32_t_uint32_t:
5411; CHECK:       # %bb.0: # %entry
5412; CHECK-NEXT:    stw r4, 8(r3)
5413; CHECK-NEXT:    blr
5414entry:
5415  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
5416  store i32 %str, ptr %add.ptr, align 4
5417  ret void
5418}
5419
5420; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5421define dso_local void @st_align32_uint32_t_uint32_t(ptr nocapture %ptr, i32 zeroext %str) {
5422; CHECK-P10-LABEL: st_align32_uint32_t_uint32_t:
5423; CHECK-P10:       # %bb.0: # %entry
5424; CHECK-P10-NEXT:    pstw r4, 99999000(r3), 0
5425; CHECK-P10-NEXT:    blr
5426;
5427; CHECK-PREP10-LABEL: st_align32_uint32_t_uint32_t:
5428; CHECK-PREP10:       # %bb.0: # %entry
5429; CHECK-PREP10-NEXT:    lis r5, 1525
5430; CHECK-PREP10-NEXT:    ori r5, r5, 56600
5431; CHECK-PREP10-NEXT:    stwx r4, r3, r5
5432; CHECK-PREP10-NEXT:    blr
5433entry:
5434  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
5435  store i32 %str, ptr %add.ptr, align 4
5436  ret void
5437}
5438
5439; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5440define dso_local void @st_align64_uint32_t_uint32_t(ptr nocapture %ptr, i32 zeroext %str) {
5441; CHECK-P10-LABEL: st_align64_uint32_t_uint32_t:
5442; CHECK-P10:       # %bb.0: # %entry
5443; CHECK-P10-NEXT:    pli r5, 244140625
5444; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
5445; CHECK-P10-NEXT:    stwx r4, r3, r5
5446; CHECK-P10-NEXT:    blr
5447;
5448; CHECK-PREP10-LABEL: st_align64_uint32_t_uint32_t:
5449; CHECK-PREP10:       # %bb.0: # %entry
5450; CHECK-PREP10-NEXT:    lis r5, 3725
5451; CHECK-PREP10-NEXT:    ori r5, r5, 19025
5452; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
5453; CHECK-PREP10-NEXT:    stwx r4, r3, r5
5454; CHECK-PREP10-NEXT:    blr
5455entry:
5456  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
5457  store i32 %str, ptr %add.ptr, align 4
5458  ret void
5459}
5460
5461; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5462define dso_local void @st_reg_uint32_t_uint32_t(ptr nocapture %ptr, i64 %off, i32 zeroext %str) {
5463; CHECK-LABEL: st_reg_uint32_t_uint32_t:
5464; CHECK:       # %bb.0: # %entry
5465; CHECK-NEXT:    stwx r5, r3, r4
5466; CHECK-NEXT:    blr
5467entry:
5468  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
5469  store i32 %str, ptr %add.ptr, align 4
5470  ret void
5471}
5472
5473; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5474define dso_local void @st_or1_uint32_t_uint32_t(i64 %ptr, i8 zeroext %off, i32 zeroext %str) {
5475; CHECK-LABEL: st_or1_uint32_t_uint32_t:
5476; CHECK:       # %bb.0: # %entry
5477; CHECK-NEXT:    or r3, r4, r3
5478; CHECK-NEXT:    stw r5, 0(r3)
5479; CHECK-NEXT:    blr
5480entry:
5481  %conv = zext i8 %off to i64
5482  %or = or i64 %conv, %ptr
5483  %0 = inttoptr i64 %or to ptr
5484  store i32 %str, ptr %0, align 4
5485  ret void
5486}
5487
5488; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5489define dso_local void @st_not_disjoint16_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
5490; CHECK-LABEL: st_not_disjoint16_uint32_t_uint32_t:
5491; CHECK:       # %bb.0: # %entry
5492; CHECK-NEXT:    ori r3, r3, 6
5493; CHECK-NEXT:    stw r4, 0(r3)
5494; CHECK-NEXT:    blr
5495entry:
5496  %or = or i64 %ptr, 6
5497  %0 = inttoptr i64 %or to ptr
5498  store i32 %str, ptr %0, align 4
5499  ret void
5500}
5501
5502; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5503define dso_local void @st_disjoint_align16_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
5504; CHECK-LABEL: st_disjoint_align16_uint32_t_uint32_t:
5505; CHECK:       # %bb.0: # %entry
5506; CHECK-NEXT:    rldicr r3, r3, 0, 51
5507; CHECK-NEXT:    stw r4, 24(r3)
5508; CHECK-NEXT:    blr
5509entry:
5510  %and = and i64 %ptr, -4096
5511  %or = or i64 %and, 24
5512  %0 = inttoptr i64 %or to ptr
5513  store i32 %str, ptr %0, align 8
5514  ret void
5515}
5516
5517; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5518define dso_local void @st_not_disjoint32_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
5519; CHECK-LABEL: st_not_disjoint32_uint32_t_uint32_t:
5520; CHECK:       # %bb.0: # %entry
5521; CHECK-NEXT:    ori r3, r3, 34463
5522; CHECK-NEXT:    oris r3, r3, 1
5523; CHECK-NEXT:    stw r4, 0(r3)
5524; CHECK-NEXT:    blr
5525entry:
5526  %or = or i64 %ptr, 99999
5527  %0 = inttoptr i64 %or to ptr
5528  store i32 %str, ptr %0, align 4
5529  ret void
5530}
5531
5532; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5533define dso_local void @st_disjoint_align32_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
5534; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_uint32_t:
5535; CHECK-P10:       # %bb.0: # %entry
5536; CHECK-P10-NEXT:    lis r5, -15264
5537; CHECK-P10-NEXT:    and r3, r3, r5
5538; CHECK-P10-NEXT:    pstw r4, 999990000(r3), 0
5539; CHECK-P10-NEXT:    blr
5540;
5541; CHECK-PREP10-LABEL: st_disjoint_align32_uint32_t_uint32_t:
5542; CHECK-PREP10:       # %bb.0: # %entry
5543; CHECK-PREP10-NEXT:    lis r5, -15264
5544; CHECK-PREP10-NEXT:    and r3, r3, r5
5545; CHECK-PREP10-NEXT:    lis r5, 15258
5546; CHECK-PREP10-NEXT:    ori r5, r5, 41712
5547; CHECK-PREP10-NEXT:    stwx r4, r3, r5
5548; CHECK-PREP10-NEXT:    blr
5549entry:
5550  %and = and i64 %ptr, -1000341504
5551  %or = or i64 %and, 999990000
5552  %0 = inttoptr i64 %or to ptr
5553  store i32 %str, ptr %0, align 16
5554  ret void
5555}
5556
5557; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5558define dso_local void @st_not_disjoint64_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
5559; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_uint32_t:
5560; CHECK-P10:       # %bb.0: # %entry
5561; CHECK-P10-NEXT:    pli r5, 232
5562; CHECK-P10-NEXT:    pli r6, 3567587329
5563; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
5564; CHECK-P10-NEXT:    or r3, r3, r6
5565; CHECK-P10-NEXT:    stw r4, 0(r3)
5566; CHECK-P10-NEXT:    blr
5567;
5568; CHECK-PREP10-LABEL: st_not_disjoint64_uint32_t_uint32_t:
5569; CHECK-PREP10:       # %bb.0: # %entry
5570; CHECK-PREP10-NEXT:    li r5, 29
5571; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
5572; CHECK-PREP10-NEXT:    oris r5, r5, 54437
5573; CHECK-PREP10-NEXT:    ori r5, r5, 4097
5574; CHECK-PREP10-NEXT:    or r3, r3, r5
5575; CHECK-PREP10-NEXT:    stw r4, 0(r3)
5576; CHECK-PREP10-NEXT:    blr
5577entry:
5578  %or = or i64 %ptr, 1000000000001
5579  %0 = inttoptr i64 %or to ptr
5580  store i32 %str, ptr %0, align 4
5581  ret void
5582}
5583
5584; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5585define dso_local void @st_disjoint_align64_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) {
5586; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_uint32_t:
5587; CHECK-P10:       # %bb.0: # %entry
5588; CHECK-P10-NEXT:    pli r5, 244140625
5589; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
5590; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
5591; CHECK-P10-NEXT:    stwx r4, r3, r5
5592; CHECK-P10-NEXT:    blr
5593;
5594; CHECK-PREP10-LABEL: st_disjoint_align64_uint32_t_uint32_t:
5595; CHECK-PREP10:       # %bb.0: # %entry
5596; CHECK-PREP10-NEXT:    lis r5, 3725
5597; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
5598; CHECK-PREP10-NEXT:    ori r5, r5, 19025
5599; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
5600; CHECK-PREP10-NEXT:    stwx r4, r3, r5
5601; CHECK-PREP10-NEXT:    blr
5602entry:
5603  %and = and i64 %ptr, -1099511627776
5604  %or = or i64 %and, 1000000000000
5605  %0 = inttoptr i64 %or to ptr
5606  store i32 %str, ptr %0, align 4096
5607  ret void
5608}
5609
5610; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5611define dso_local void @st_cst_align16_uint32_t_uint32_t(i32 zeroext %str) {
5612; CHECK-LABEL: st_cst_align16_uint32_t_uint32_t:
5613; CHECK:       # %bb.0: # %entry
5614; CHECK-NEXT:    stw r3, 4080(0)
5615; CHECK-NEXT:    blr
5616entry:
5617  store i32 %str, ptr inttoptr (i64 4080 to ptr), align 16
5618  ret void
5619}
5620
5621; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5622define dso_local void @st_cst_align32_uint32_t_uint32_t(i32 zeroext %str) {
5623; CHECK-LABEL: st_cst_align32_uint32_t_uint32_t:
5624; CHECK:       # %bb.0: # %entry
5625; CHECK-NEXT:    lis r4, 153
5626; CHECK-NEXT:    stw r3, -27108(r4)
5627; CHECK-NEXT:    blr
5628entry:
5629  store i32 %str, ptr inttoptr (i64 9999900 to ptr), align 4
5630  ret void
5631}
5632
5633; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5634define dso_local void @st_cst_align64_uint32_t_uint32_t(i32 zeroext %str) {
5635; CHECK-P10-LABEL: st_cst_align64_uint32_t_uint32_t:
5636; CHECK-P10:       # %bb.0: # %entry
5637; CHECK-P10-NEXT:    pli r4, 244140625
5638; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5639; CHECK-P10-NEXT:    stw r3, 0(r4)
5640; CHECK-P10-NEXT:    blr
5641;
5642; CHECK-PREP10-LABEL: st_cst_align64_uint32_t_uint32_t:
5643; CHECK-PREP10:       # %bb.0: # %entry
5644; CHECK-PREP10-NEXT:    lis r4, 3725
5645; CHECK-PREP10-NEXT:    ori r4, r4, 19025
5646; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
5647; CHECK-PREP10-NEXT:    stw r3, 0(r4)
5648; CHECK-PREP10-NEXT:    blr
5649entry:
5650  store i32 %str, ptr inttoptr (i64 1000000000000 to ptr), align 4096
5651  ret void
5652}
5653
5654; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5655define dso_local void @st_0_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
5656; CHECK-LABEL: st_0_uint32_t_uint64_t:
5657; CHECK:       # %bb.0: # %entry
5658; CHECK-NEXT:    std r4, 0(r3)
5659; CHECK-NEXT:    blr
5660entry:
5661  %conv = zext i32 %str to i64
5662  %0 = inttoptr i64 %ptr to ptr
5663  store i64 %conv, ptr %0, align 8
5664  ret void
5665}
5666
5667; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5668define dso_local void @st_align16_uint32_t_uint64_t(ptr nocapture %ptr, i32 zeroext %str) {
5669; CHECK-LABEL: st_align16_uint32_t_uint64_t:
5670; CHECK:       # %bb.0: # %entry
5671; CHECK-NEXT:    std r4, 8(r3)
5672; CHECK-NEXT:    blr
5673entry:
5674  %conv = zext i32 %str to i64
5675  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
5676  store i64 %conv, ptr %add.ptr, align 8
5677  ret void
5678}
5679
5680; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5681define dso_local void @st_align32_uint32_t_uint64_t(ptr nocapture %ptr, i32 zeroext %str) {
5682; CHECK-P10-LABEL: st_align32_uint32_t_uint64_t:
5683; CHECK-P10:       # %bb.0: # %entry
5684; CHECK-P10-NEXT:    pstd r4, 99999000(r3), 0
5685; CHECK-P10-NEXT:    blr
5686;
5687; CHECK-PREP10-LABEL: st_align32_uint32_t_uint64_t:
5688; CHECK-PREP10:       # %bb.0: # %entry
5689; CHECK-PREP10-NEXT:    lis r5, 1525
5690; CHECK-PREP10-NEXT:    ori r5, r5, 56600
5691; CHECK-PREP10-NEXT:    stdx r4, r3, r5
5692; CHECK-PREP10-NEXT:    blr
5693entry:
5694  %conv = zext i32 %str to i64
5695  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
5696  store i64 %conv, ptr %add.ptr, align 8
5697  ret void
5698}
5699
5700; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5701define dso_local void @st_align64_uint32_t_uint64_t(ptr nocapture %ptr, i32 zeroext %str) {
5702; CHECK-P10-LABEL: st_align64_uint32_t_uint64_t:
5703; CHECK-P10:       # %bb.0: # %entry
5704; CHECK-P10-NEXT:    pli r5, 244140625
5705; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
5706; CHECK-P10-NEXT:    stdx r4, r3, r5
5707; CHECK-P10-NEXT:    blr
5708;
5709; CHECK-PREP10-LABEL: st_align64_uint32_t_uint64_t:
5710; CHECK-PREP10:       # %bb.0: # %entry
5711; CHECK-PREP10-NEXT:    lis r5, 3725
5712; CHECK-PREP10-NEXT:    ori r5, r5, 19025
5713; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
5714; CHECK-PREP10-NEXT:    stdx r4, r3, r5
5715; CHECK-PREP10-NEXT:    blr
5716entry:
5717  %conv = zext i32 %str to i64
5718  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
5719  store i64 %conv, ptr %add.ptr, align 8
5720  ret void
5721}
5722
5723; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5724define dso_local void @st_reg_uint32_t_uint64_t(ptr nocapture %ptr, i64 %off, i32 zeroext %str) {
5725; CHECK-LABEL: st_reg_uint32_t_uint64_t:
5726; CHECK:       # %bb.0: # %entry
5727; CHECK-NEXT:    stdx r5, r3, r4
5728; CHECK-NEXT:    blr
5729entry:
5730  %conv = zext i32 %str to i64
5731  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
5732  store i64 %conv, ptr %add.ptr, align 8
5733  ret void
5734}
5735
5736; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5737define dso_local void @st_or1_uint32_t_uint64_t(i64 %ptr, i8 zeroext %off, i32 zeroext %str) {
5738; CHECK-LABEL: st_or1_uint32_t_uint64_t:
5739; CHECK:       # %bb.0: # %entry
5740; CHECK-NEXT:    or r3, r4, r3
5741; CHECK-NEXT:    std r5, 0(r3)
5742; CHECK-NEXT:    blr
5743entry:
5744  %conv = zext i32 %str to i64
5745  %conv1 = zext i8 %off to i64
5746  %or = or i64 %conv1, %ptr
5747  %0 = inttoptr i64 %or to ptr
5748  store i64 %conv, ptr %0, align 8
5749  ret void
5750}
5751
5752; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5753define dso_local void @st_not_disjoint16_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
5754; CHECK-LABEL: st_not_disjoint16_uint32_t_uint64_t:
5755; CHECK:       # %bb.0: # %entry
5756; CHECK-NEXT:    ori r3, r3, 6
5757; CHECK-NEXT:    std r4, 0(r3)
5758; CHECK-NEXT:    blr
5759entry:
5760  %conv = zext i32 %str to i64
5761  %or = or i64 %ptr, 6
5762  %0 = inttoptr i64 %or to ptr
5763  store i64 %conv, ptr %0, align 8
5764  ret void
5765}
5766
5767; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5768define dso_local void @st_disjoint_align16_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
5769; CHECK-LABEL: st_disjoint_align16_uint32_t_uint64_t:
5770; CHECK:       # %bb.0: # %entry
5771; CHECK-NEXT:    rldicr r3, r3, 0, 51
5772; CHECK-NEXT:    std r4, 24(r3)
5773; CHECK-NEXT:    blr
5774entry:
5775  %and = and i64 %ptr, -4096
5776  %conv = zext i32 %str to i64
5777  %or = or i64 %and, 24
5778  %0 = inttoptr i64 %or to ptr
5779  store i64 %conv, ptr %0, align 8
5780  ret void
5781}
5782
5783; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5784define dso_local void @st_not_disjoint32_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
5785; CHECK-LABEL: st_not_disjoint32_uint32_t_uint64_t:
5786; CHECK:       # %bb.0: # %entry
5787; CHECK-NEXT:    ori r3, r3, 34463
5788; CHECK-NEXT:    oris r3, r3, 1
5789; CHECK-NEXT:    std r4, 0(r3)
5790; CHECK-NEXT:    blr
5791entry:
5792  %conv = zext i32 %str to i64
5793  %or = or i64 %ptr, 99999
5794  %0 = inttoptr i64 %or to ptr
5795  store i64 %conv, ptr %0, align 8
5796  ret void
5797}
5798
5799; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5800define dso_local void @st_disjoint_align32_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
5801; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_uint64_t:
5802; CHECK-P10:       # %bb.0: # %entry
5803; CHECK-P10-NEXT:    lis r5, -15264
5804; CHECK-P10-NEXT:    and r3, r3, r5
5805; CHECK-P10-NEXT:    pstd r4, 999990000(r3), 0
5806; CHECK-P10-NEXT:    blr
5807;
5808; CHECK-PREP10-LABEL: st_disjoint_align32_uint32_t_uint64_t:
5809; CHECK-PREP10:       # %bb.0: # %entry
5810; CHECK-PREP10-NEXT:    lis r5, -15264
5811; CHECK-PREP10-NEXT:    and r3, r3, r5
5812; CHECK-PREP10-NEXT:    lis r5, 15258
5813; CHECK-PREP10-NEXT:    ori r5, r5, 41712
5814; CHECK-PREP10-NEXT:    stdx r4, r3, r5
5815; CHECK-PREP10-NEXT:    blr
5816entry:
5817  %and = and i64 %ptr, -1000341504
5818  %conv = zext i32 %str to i64
5819  %or = or i64 %and, 999990000
5820  %0 = inttoptr i64 %or to ptr
5821  store i64 %conv, ptr %0, align 16
5822  ret void
5823}
5824
5825; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5826define dso_local void @st_not_disjoint64_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
5827; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_uint64_t:
5828; CHECK-P10:       # %bb.0: # %entry
5829; CHECK-P10-NEXT:    pli r5, 232
5830; CHECK-P10-NEXT:    pli r6, 3567587329
5831; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
5832; CHECK-P10-NEXT:    or r3, r3, r6
5833; CHECK-P10-NEXT:    std r4, 0(r3)
5834; CHECK-P10-NEXT:    blr
5835;
5836; CHECK-PREP10-LABEL: st_not_disjoint64_uint32_t_uint64_t:
5837; CHECK-PREP10:       # %bb.0: # %entry
5838; CHECK-PREP10-NEXT:    li r5, 29
5839; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
5840; CHECK-PREP10-NEXT:    oris r5, r5, 54437
5841; CHECK-PREP10-NEXT:    ori r5, r5, 4097
5842; CHECK-PREP10-NEXT:    or r3, r3, r5
5843; CHECK-PREP10-NEXT:    std r4, 0(r3)
5844; CHECK-PREP10-NEXT:    blr
5845entry:
5846  %conv = zext i32 %str to i64
5847  %or = or i64 %ptr, 1000000000001
5848  %0 = inttoptr i64 %or to ptr
5849  store i64 %conv, ptr %0, align 8
5850  ret void
5851}
5852
5853; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5854define dso_local void @st_disjoint_align64_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) {
5855; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_uint64_t:
5856; CHECK-P10:       # %bb.0: # %entry
5857; CHECK-P10-NEXT:    pli r5, 244140625
5858; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
5859; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
5860; CHECK-P10-NEXT:    stdx r4, r3, r5
5861; CHECK-P10-NEXT:    blr
5862;
5863; CHECK-PREP10-LABEL: st_disjoint_align64_uint32_t_uint64_t:
5864; CHECK-PREP10:       # %bb.0: # %entry
5865; CHECK-PREP10-NEXT:    lis r5, 3725
5866; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
5867; CHECK-PREP10-NEXT:    ori r5, r5, 19025
5868; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
5869; CHECK-PREP10-NEXT:    stdx r4, r3, r5
5870; CHECK-PREP10-NEXT:    blr
5871entry:
5872  %and = and i64 %ptr, -1099511627776
5873  %conv = zext i32 %str to i64
5874  %or = or i64 %and, 1000000000000
5875  %0 = inttoptr i64 %or to ptr
5876  store i64 %conv, ptr %0, align 4096
5877  ret void
5878}
5879
5880; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5881define dso_local void @st_cst_align16_uint32_t_uint64_t(i32 zeroext %str) {
5882; CHECK-LABEL: st_cst_align16_uint32_t_uint64_t:
5883; CHECK:       # %bb.0: # %entry
5884; CHECK-NEXT:    std r3, 4080(0)
5885; CHECK-NEXT:    blr
5886entry:
5887  %conv = zext i32 %str to i64
5888  store i64 %conv, ptr inttoptr (i64 4080 to ptr), align 16
5889  ret void
5890}
5891
5892; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5893define dso_local void @st_cst_align32_uint32_t_uint64_t(i32 zeroext %str) {
5894; CHECK-LABEL: st_cst_align32_uint32_t_uint64_t:
5895; CHECK:       # %bb.0: # %entry
5896; CHECK-NEXT:    lis r4, 153
5897; CHECK-NEXT:    std r3, -27108(r4)
5898; CHECK-NEXT:    blr
5899entry:
5900  %conv = zext i32 %str to i64
5901  store i64 %conv, ptr inttoptr (i64 9999900 to ptr), align 8
5902  ret void
5903}
5904
5905; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5906define dso_local void @st_cst_align64_uint32_t_uint64_t(i32 zeroext %str) {
5907; CHECK-P10-LABEL: st_cst_align64_uint32_t_uint64_t:
5908; CHECK-P10:       # %bb.0: # %entry
5909; CHECK-P10-NEXT:    pli r4, 244140625
5910; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5911; CHECK-P10-NEXT:    std r3, 0(r4)
5912; CHECK-P10-NEXT:    blr
5913;
5914; CHECK-PREP10-LABEL: st_cst_align64_uint32_t_uint64_t:
5915; CHECK-PREP10:       # %bb.0: # %entry
5916; CHECK-PREP10-NEXT:    lis r4, 3725
5917; CHECK-PREP10-NEXT:    ori r4, r4, 19025
5918; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
5919; CHECK-PREP10-NEXT:    std r3, 0(r4)
5920; CHECK-PREP10-NEXT:    blr
5921entry:
5922  %conv = zext i32 %str to i64
5923  store i64 %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
5924  ret void
5925}
5926
5927; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5928define dso_local void @st_0_uint32_t_float(i64 %ptr, i32 zeroext %str) {
5929; CHECK-LABEL: st_0_uint32_t_float:
5930; CHECK:       # %bb.0: # %entry
5931; CHECK-NEXT:    mtfprwz f0, r4
5932; CHECK-NEXT:    xscvuxdsp f0, f0
5933; CHECK-NEXT:    stfs f0, 0(r3)
5934; CHECK-NEXT:    blr
5935entry:
5936  %conv = uitofp i32 %str to float
5937  %0 = inttoptr i64 %ptr to ptr
5938  store float %conv, ptr %0, align 4
5939  ret void
5940}
5941
5942; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5943define dso_local void @st_align16_uint32_t_float(ptr nocapture %ptr, i32 zeroext %str) {
5944; CHECK-LABEL: st_align16_uint32_t_float:
5945; CHECK:       # %bb.0: # %entry
5946; CHECK-NEXT:    mtfprwz f0, r4
5947; CHECK-NEXT:    xscvuxdsp f0, f0
5948; CHECK-NEXT:    stfs f0, 8(r3)
5949; CHECK-NEXT:    blr
5950entry:
5951  %conv = uitofp i32 %str to float
5952  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
5953  store float %conv, ptr %add.ptr, align 4
5954  ret void
5955}
5956
5957; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5958define dso_local void @st_align32_uint32_t_float(ptr nocapture %ptr, i32 zeroext %str) {
5959; CHECK-P10-LABEL: st_align32_uint32_t_float:
5960; CHECK-P10:       # %bb.0: # %entry
5961; CHECK-P10-NEXT:    mtfprwz f0, r4
5962; CHECK-P10-NEXT:    xscvuxdsp f0, f0
5963; CHECK-P10-NEXT:    pstfs f0, 99999000(r3), 0
5964; CHECK-P10-NEXT:    blr
5965;
5966; CHECK-P9-LABEL: st_align32_uint32_t_float:
5967; CHECK-P9:       # %bb.0: # %entry
5968; CHECK-P9-NEXT:    mtfprwz f0, r4
5969; CHECK-P9-NEXT:    lis r4, 1525
5970; CHECK-P9-NEXT:    xscvuxdsp f0, f0
5971; CHECK-P9-NEXT:    ori r4, r4, 56600
5972; CHECK-P9-NEXT:    stfsx f0, r3, r4
5973; CHECK-P9-NEXT:    blr
5974;
5975; CHECK-P8-LABEL: st_align32_uint32_t_float:
5976; CHECK-P8:       # %bb.0: # %entry
5977; CHECK-P8-NEXT:    mtfprwz f0, r4
5978; CHECK-P8-NEXT:    lis r4, 1525
5979; CHECK-P8-NEXT:    ori r4, r4, 56600
5980; CHECK-P8-NEXT:    xscvuxdsp f0, f0
5981; CHECK-P8-NEXT:    stfsx f0, r3, r4
5982; CHECK-P8-NEXT:    blr
5983entry:
5984  %conv = uitofp i32 %str to float
5985  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
5986  store float %conv, ptr %add.ptr, align 4
5987  ret void
5988}
5989
5990; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5991define dso_local void @st_align64_uint32_t_float(ptr nocapture %ptr, i32 zeroext %str) {
5992; CHECK-P10-LABEL: st_align64_uint32_t_float:
5993; CHECK-P10:       # %bb.0: # %entry
5994; CHECK-P10-NEXT:    mtfprwz f0, r4
5995; CHECK-P10-NEXT:    pli r4, 244140625
5996; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5997; CHECK-P10-NEXT:    xscvuxdsp f0, f0
5998; CHECK-P10-NEXT:    stfsx f0, r3, r4
5999; CHECK-P10-NEXT:    blr
6000;
6001; CHECK-P9-LABEL: st_align64_uint32_t_float:
6002; CHECK-P9:       # %bb.0: # %entry
6003; CHECK-P9-NEXT:    mtfprwz f0, r4
6004; CHECK-P9-NEXT:    lis r4, 3725
6005; CHECK-P9-NEXT:    xscvuxdsp f0, f0
6006; CHECK-P9-NEXT:    ori r4, r4, 19025
6007; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
6008; CHECK-P9-NEXT:    stfsx f0, r3, r4
6009; CHECK-P9-NEXT:    blr
6010;
6011; CHECK-P8-LABEL: st_align64_uint32_t_float:
6012; CHECK-P8:       # %bb.0: # %entry
6013; CHECK-P8-NEXT:    mtfprwz f0, r4
6014; CHECK-P8-NEXT:    lis r4, 3725
6015; CHECK-P8-NEXT:    ori r4, r4, 19025
6016; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
6017; CHECK-P8-NEXT:    xscvuxdsp f0, f0
6018; CHECK-P8-NEXT:    stfsx f0, r3, r4
6019; CHECK-P8-NEXT:    blr
6020entry:
6021  %conv = uitofp i32 %str to float
6022  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
6023  store float %conv, ptr %add.ptr, align 4
6024  ret void
6025}
6026
6027; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6028define dso_local void @st_reg_uint32_t_float(ptr nocapture %ptr, i64 %off, i32 zeroext %str) {
6029; CHECK-LABEL: st_reg_uint32_t_float:
6030; CHECK:       # %bb.0: # %entry
6031; CHECK-NEXT:    mtfprwz f0, r5
6032; CHECK-NEXT:    xscvuxdsp f0, f0
6033; CHECK-NEXT:    stfsx f0, r3, r4
6034; CHECK-NEXT:    blr
6035entry:
6036  %conv = uitofp i32 %str to float
6037  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
6038  store float %conv, ptr %add.ptr, align 4
6039  ret void
6040}
6041
6042; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6043define dso_local void @st_or1_uint32_t_float(i64 %ptr, i8 zeroext %off, i32 zeroext %str) {
6044; CHECK-LABEL: st_or1_uint32_t_float:
6045; CHECK:       # %bb.0: # %entry
6046; CHECK-NEXT:    mtfprwz f0, r5
6047; CHECK-NEXT:    or r3, r4, r3
6048; CHECK-NEXT:    xscvuxdsp f0, f0
6049; CHECK-NEXT:    stfs f0, 0(r3)
6050; CHECK-NEXT:    blr
6051entry:
6052  %conv = uitofp i32 %str to float
6053  %conv1 = zext i8 %off to i64
6054  %or = or i64 %conv1, %ptr
6055  %0 = inttoptr i64 %or to ptr
6056  store float %conv, ptr %0, align 4
6057  ret void
6058}
6059
6060; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6061define dso_local void @st_not_disjoint16_uint32_t_float(i64 %ptr, i32 zeroext %str) {
6062; CHECK-LABEL: st_not_disjoint16_uint32_t_float:
6063; CHECK:       # %bb.0: # %entry
6064; CHECK-NEXT:    mtfprwz f0, r4
6065; CHECK-NEXT:    ori r3, r3, 6
6066; CHECK-NEXT:    xscvuxdsp f0, f0
6067; CHECK-NEXT:    stfs f0, 0(r3)
6068; CHECK-NEXT:    blr
6069entry:
6070  %conv = uitofp i32 %str to float
6071  %or = or i64 %ptr, 6
6072  %0 = inttoptr i64 %or to ptr
6073  store float %conv, ptr %0, align 4
6074  ret void
6075}
6076
6077; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6078define dso_local void @st_disjoint_align16_uint32_t_float(i64 %ptr, i32 zeroext %str) {
6079; CHECK-LABEL: st_disjoint_align16_uint32_t_float:
6080; CHECK:       # %bb.0: # %entry
6081; CHECK-NEXT:    mtfprwz f0, r4
6082; CHECK-NEXT:    rldicr r3, r3, 0, 51
6083; CHECK-NEXT:    xscvuxdsp f0, f0
6084; CHECK-NEXT:    stfs f0, 24(r3)
6085; CHECK-NEXT:    blr
6086entry:
6087  %and = and i64 %ptr, -4096
6088  %conv = uitofp i32 %str to float
6089  %or = or i64 %and, 24
6090  %0 = inttoptr i64 %or to ptr
6091  store float %conv, ptr %0, align 8
6092  ret void
6093}
6094
6095; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6096define dso_local void @st_not_disjoint32_uint32_t_float(i64 %ptr, i32 zeroext %str) {
6097; CHECK-P10-LABEL: st_not_disjoint32_uint32_t_float:
6098; CHECK-P10:       # %bb.0: # %entry
6099; CHECK-P10-NEXT:    mtfprwz f0, r4
6100; CHECK-P10-NEXT:    ori r3, r3, 34463
6101; CHECK-P10-NEXT:    oris r3, r3, 1
6102; CHECK-P10-NEXT:    xscvuxdsp f0, f0
6103; CHECK-P10-NEXT:    stfs f0, 0(r3)
6104; CHECK-P10-NEXT:    blr
6105;
6106; CHECK-P9-LABEL: st_not_disjoint32_uint32_t_float:
6107; CHECK-P9:       # %bb.0: # %entry
6108; CHECK-P9-NEXT:    mtfprwz f0, r4
6109; CHECK-P9-NEXT:    ori r3, r3, 34463
6110; CHECK-P9-NEXT:    xscvuxdsp f0, f0
6111; CHECK-P9-NEXT:    oris r3, r3, 1
6112; CHECK-P9-NEXT:    stfs f0, 0(r3)
6113; CHECK-P9-NEXT:    blr
6114;
6115; CHECK-P8-LABEL: st_not_disjoint32_uint32_t_float:
6116; CHECK-P8:       # %bb.0: # %entry
6117; CHECK-P8-NEXT:    mtfprwz f0, r4
6118; CHECK-P8-NEXT:    ori r3, r3, 34463
6119; CHECK-P8-NEXT:    oris r3, r3, 1
6120; CHECK-P8-NEXT:    xscvuxdsp f0, f0
6121; CHECK-P8-NEXT:    stfs f0, 0(r3)
6122; CHECK-P8-NEXT:    blr
6123entry:
6124  %conv = uitofp i32 %str to float
6125  %or = or i64 %ptr, 99999
6126  %0 = inttoptr i64 %or to ptr
6127  store float %conv, ptr %0, align 4
6128  ret void
6129}
6130
6131; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6132define dso_local void @st_disjoint_align32_uint32_t_float(i64 %ptr, i32 zeroext %str) {
6133; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_float:
6134; CHECK-P10:       # %bb.0: # %entry
6135; CHECK-P10-NEXT:    mtfprwz f0, r4
6136; CHECK-P10-NEXT:    lis r5, -15264
6137; CHECK-P10-NEXT:    and r3, r3, r5
6138; CHECK-P10-NEXT:    xscvuxdsp f0, f0
6139; CHECK-P10-NEXT:    pstfs f0, 999990000(r3), 0
6140; CHECK-P10-NEXT:    blr
6141;
6142; CHECK-P9-LABEL: st_disjoint_align32_uint32_t_float:
6143; CHECK-P9:       # %bb.0: # %entry
6144; CHECK-P9-NEXT:    mtfprwz f0, r4
6145; CHECK-P9-NEXT:    lis r5, -15264
6146; CHECK-P9-NEXT:    lis r4, 15258
6147; CHECK-P9-NEXT:    xscvuxdsp f0, f0
6148; CHECK-P9-NEXT:    and r3, r3, r5
6149; CHECK-P9-NEXT:    ori r4, r4, 41712
6150; CHECK-P9-NEXT:    stfsx f0, r3, r4
6151; CHECK-P9-NEXT:    blr
6152;
6153; CHECK-P8-LABEL: st_disjoint_align32_uint32_t_float:
6154; CHECK-P8:       # %bb.0: # %entry
6155; CHECK-P8-NEXT:    mtfprwz f0, r4
6156; CHECK-P8-NEXT:    lis r5, -15264
6157; CHECK-P8-NEXT:    lis r4, 15258
6158; CHECK-P8-NEXT:    and r3, r3, r5
6159; CHECK-P8-NEXT:    ori r4, r4, 41712
6160; CHECK-P8-NEXT:    xscvuxdsp f0, f0
6161; CHECK-P8-NEXT:    stfsx f0, r3, r4
6162; CHECK-P8-NEXT:    blr
6163entry:
6164  %and = and i64 %ptr, -1000341504
6165  %conv = uitofp i32 %str to float
6166  %or = or i64 %and, 999990000
6167  %0 = inttoptr i64 %or to ptr
6168  store float %conv, ptr %0, align 16
6169  ret void
6170}
6171
6172; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6173define dso_local void @st_not_disjoint64_uint32_t_float(i64 %ptr, i32 zeroext %str) {
6174; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_float:
6175; CHECK-P10:       # %bb.0: # %entry
6176; CHECK-P10-NEXT:    mtfprwz f0, r4
6177; CHECK-P10-NEXT:    pli r4, 232
6178; CHECK-P10-NEXT:    pli r5, 3567587329
6179; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
6180; CHECK-P10-NEXT:    xscvuxdsp f0, f0
6181; CHECK-P10-NEXT:    or r3, r3, r5
6182; CHECK-P10-NEXT:    stfs f0, 0(r3)
6183; CHECK-P10-NEXT:    blr
6184;
6185; CHECK-P9-LABEL: st_not_disjoint64_uint32_t_float:
6186; CHECK-P9:       # %bb.0: # %entry
6187; CHECK-P9-NEXT:    mtfprwz f0, r4
6188; CHECK-P9-NEXT:    li r4, 29
6189; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
6190; CHECK-P9-NEXT:    xscvuxdsp f0, f0
6191; CHECK-P9-NEXT:    oris r4, r4, 54437
6192; CHECK-P9-NEXT:    ori r4, r4, 4097
6193; CHECK-P9-NEXT:    or r3, r3, r4
6194; CHECK-P9-NEXT:    stfs f0, 0(r3)
6195; CHECK-P9-NEXT:    blr
6196;
6197; CHECK-P8-LABEL: st_not_disjoint64_uint32_t_float:
6198; CHECK-P8:       # %bb.0: # %entry
6199; CHECK-P8-NEXT:    mtfprwz f0, r4
6200; CHECK-P8-NEXT:    li r4, 29
6201; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
6202; CHECK-P8-NEXT:    oris r4, r4, 54437
6203; CHECK-P8-NEXT:    xscvuxdsp f0, f0
6204; CHECK-P8-NEXT:    ori r4, r4, 4097
6205; CHECK-P8-NEXT:    or r3, r3, r4
6206; CHECK-P8-NEXT:    stfs f0, 0(r3)
6207; CHECK-P8-NEXT:    blr
6208entry:
6209  %conv = uitofp i32 %str to float
6210  %or = or i64 %ptr, 1000000000001
6211  %0 = inttoptr i64 %or to ptr
6212  store float %conv, ptr %0, align 4
6213  ret void
6214}
6215
6216; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6217define dso_local void @st_disjoint_align64_uint32_t_float(i64 %ptr, i32 zeroext %str) {
6218; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_float:
6219; CHECK-P10:       # %bb.0: # %entry
6220; CHECK-P10-NEXT:    mtfprwz f0, r4
6221; CHECK-P10-NEXT:    pli r4, 244140625
6222; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
6223; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
6224; CHECK-P10-NEXT:    xscvuxdsp f0, f0
6225; CHECK-P10-NEXT:    stfsx f0, r3, r4
6226; CHECK-P10-NEXT:    blr
6227;
6228; CHECK-P9-LABEL: st_disjoint_align64_uint32_t_float:
6229; CHECK-P9:       # %bb.0: # %entry
6230; CHECK-P9-NEXT:    mtfprwz f0, r4
6231; CHECK-P9-NEXT:    lis r4, 3725
6232; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
6233; CHECK-P9-NEXT:    xscvuxdsp f0, f0
6234; CHECK-P9-NEXT:    ori r4, r4, 19025
6235; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
6236; CHECK-P9-NEXT:    stfsx f0, r3, r4
6237; CHECK-P9-NEXT:    blr
6238;
6239; CHECK-P8-LABEL: st_disjoint_align64_uint32_t_float:
6240; CHECK-P8:       # %bb.0: # %entry
6241; CHECK-P8-NEXT:    mtfprwz f0, r4
6242; CHECK-P8-NEXT:    lis r4, 3725
6243; CHECK-P8-NEXT:    rldicr r3, r3, 0, 23
6244; CHECK-P8-NEXT:    ori r4, r4, 19025
6245; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
6246; CHECK-P8-NEXT:    xscvuxdsp f0, f0
6247; CHECK-P8-NEXT:    stfsx f0, r3, r4
6248; CHECK-P8-NEXT:    blr
6249entry:
6250  %and = and i64 %ptr, -1099511627776
6251  %conv = uitofp i32 %str to float
6252  %or = or i64 %and, 1000000000000
6253  %0 = inttoptr i64 %or to ptr
6254  store float %conv, ptr %0, align 4096
6255  ret void
6256}
6257
6258; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6259define dso_local void @st_cst_align16_uint32_t_float(i32 zeroext %str) {
6260; CHECK-LABEL: st_cst_align16_uint32_t_float:
6261; CHECK:       # %bb.0: # %entry
6262; CHECK-NEXT:    mtfprwz f0, r3
6263; CHECK-NEXT:    xscvuxdsp f0, f0
6264; CHECK-NEXT:    stfs f0, 4080(0)
6265; CHECK-NEXT:    blr
6266entry:
6267  %conv = uitofp i32 %str to float
6268  store float %conv, ptr inttoptr (i64 4080 to ptr), align 16
6269  ret void
6270}
6271
6272; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6273define dso_local void @st_cst_align32_uint32_t_float(i32 zeroext %str) {
6274; CHECK-LABEL: st_cst_align32_uint32_t_float:
6275; CHECK:       # %bb.0: # %entry
6276; CHECK-NEXT:    mtfprwz f0, r3
6277; CHECK-NEXT:    lis r3, 153
6278; CHECK-NEXT:    xscvuxdsp f0, f0
6279; CHECK-NEXT:    stfs f0, -27108(r3)
6280; CHECK-NEXT:    blr
6281entry:
6282  %conv = uitofp i32 %str to float
6283  store float %conv, ptr inttoptr (i64 9999900 to ptr), align 4
6284  ret void
6285}
6286
6287; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6288define dso_local void @st_cst_align64_uint32_t_float(i32 zeroext %str) {
6289; CHECK-P10-LABEL: st_cst_align64_uint32_t_float:
6290; CHECK-P10:       # %bb.0: # %entry
6291; CHECK-P10-NEXT:    mtfprwz f0, r3
6292; CHECK-P10-NEXT:    pli r3, 244140625
6293; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
6294; CHECK-P10-NEXT:    xscvuxdsp f0, f0
6295; CHECK-P10-NEXT:    stfs f0, 0(r3)
6296; CHECK-P10-NEXT:    blr
6297;
6298; CHECK-P9-LABEL: st_cst_align64_uint32_t_float:
6299; CHECK-P9:       # %bb.0: # %entry
6300; CHECK-P9-NEXT:    mtfprwz f0, r3
6301; CHECK-P9-NEXT:    lis r3, 3725
6302; CHECK-P9-NEXT:    xscvuxdsp f0, f0
6303; CHECK-P9-NEXT:    ori r3, r3, 19025
6304; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
6305; CHECK-P9-NEXT:    stfs f0, 0(r3)
6306; CHECK-P9-NEXT:    blr
6307;
6308; CHECK-P8-LABEL: st_cst_align64_uint32_t_float:
6309; CHECK-P8:       # %bb.0: # %entry
6310; CHECK-P8-NEXT:    mtfprwz f0, r3
6311; CHECK-P8-NEXT:    lis r3, 3725
6312; CHECK-P8-NEXT:    ori r3, r3, 19025
6313; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
6314; CHECK-P8-NEXT:    xscvuxdsp f0, f0
6315; CHECK-P8-NEXT:    stfs f0, 0(r3)
6316; CHECK-P8-NEXT:    blr
6317entry:
6318  %conv = uitofp i32 %str to float
6319  store float %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
6320  ret void
6321}
6322
6323; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6324define dso_local void @st_0_uint32_t_double(i64 %ptr, i32 zeroext %str) {
6325; CHECK-LABEL: st_0_uint32_t_double:
6326; CHECK:       # %bb.0: # %entry
6327; CHECK-NEXT:    mtfprwz f0, r4
6328; CHECK-NEXT:    xscvuxddp f0, f0
6329; CHECK-NEXT:    stfd f0, 0(r3)
6330; CHECK-NEXT:    blr
6331entry:
6332  %conv = uitofp i32 %str to double
6333  %0 = inttoptr i64 %ptr to ptr
6334  store double %conv, ptr %0, align 8
6335  ret void
6336}
6337
6338; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6339define dso_local void @st_align16_uint32_t_double(ptr nocapture %ptr, i32 zeroext %str) {
6340; CHECK-LABEL: st_align16_uint32_t_double:
6341; CHECK:       # %bb.0: # %entry
6342; CHECK-NEXT:    mtfprwz f0, r4
6343; CHECK-NEXT:    xscvuxddp f0, f0
6344; CHECK-NEXT:    stfd f0, 8(r3)
6345; CHECK-NEXT:    blr
6346entry:
6347  %conv = uitofp i32 %str to double
6348  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
6349  store double %conv, ptr %add.ptr, align 8
6350  ret void
6351}
6352
6353; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6354define dso_local void @st_align32_uint32_t_double(ptr nocapture %ptr, i32 zeroext %str) {
6355; CHECK-P10-LABEL: st_align32_uint32_t_double:
6356; CHECK-P10:       # %bb.0: # %entry
6357; CHECK-P10-NEXT:    mtfprwz f0, r4
6358; CHECK-P10-NEXT:    xscvuxddp f0, f0
6359; CHECK-P10-NEXT:    pstfd f0, 99999000(r3), 0
6360; CHECK-P10-NEXT:    blr
6361;
6362; CHECK-P9-LABEL: st_align32_uint32_t_double:
6363; CHECK-P9:       # %bb.0: # %entry
6364; CHECK-P9-NEXT:    mtfprwz f0, r4
6365; CHECK-P9-NEXT:    lis r4, 1525
6366; CHECK-P9-NEXT:    xscvuxddp f0, f0
6367; CHECK-P9-NEXT:    ori r4, r4, 56600
6368; CHECK-P9-NEXT:    stfdx f0, r3, r4
6369; CHECK-P9-NEXT:    blr
6370;
6371; CHECK-P8-LABEL: st_align32_uint32_t_double:
6372; CHECK-P8:       # %bb.0: # %entry
6373; CHECK-P8-NEXT:    mtfprwz f0, r4
6374; CHECK-P8-NEXT:    lis r4, 1525
6375; CHECK-P8-NEXT:    ori r4, r4, 56600
6376; CHECK-P8-NEXT:    xscvuxddp f0, f0
6377; CHECK-P8-NEXT:    stfdx f0, r3, r4
6378; CHECK-P8-NEXT:    blr
6379entry:
6380  %conv = uitofp i32 %str to double
6381  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
6382  store double %conv, ptr %add.ptr, align 8
6383  ret void
6384}
6385
6386; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6387define dso_local void @st_align64_uint32_t_double(ptr nocapture %ptr, i32 zeroext %str) {
6388; CHECK-P10-LABEL: st_align64_uint32_t_double:
6389; CHECK-P10:       # %bb.0: # %entry
6390; CHECK-P10-NEXT:    mtfprwz f0, r4
6391; CHECK-P10-NEXT:    pli r4, 244140625
6392; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
6393; CHECK-P10-NEXT:    xscvuxddp f0, f0
6394; CHECK-P10-NEXT:    stfdx f0, r3, r4
6395; CHECK-P10-NEXT:    blr
6396;
6397; CHECK-P9-LABEL: st_align64_uint32_t_double:
6398; CHECK-P9:       # %bb.0: # %entry
6399; CHECK-P9-NEXT:    mtfprwz f0, r4
6400; CHECK-P9-NEXT:    lis r4, 3725
6401; CHECK-P9-NEXT:    xscvuxddp f0, f0
6402; CHECK-P9-NEXT:    ori r4, r4, 19025
6403; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
6404; CHECK-P9-NEXT:    stfdx f0, r3, r4
6405; CHECK-P9-NEXT:    blr
6406;
6407; CHECK-P8-LABEL: st_align64_uint32_t_double:
6408; CHECK-P8:       # %bb.0: # %entry
6409; CHECK-P8-NEXT:    mtfprwz f0, r4
6410; CHECK-P8-NEXT:    lis r4, 3725
6411; CHECK-P8-NEXT:    ori r4, r4, 19025
6412; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
6413; CHECK-P8-NEXT:    xscvuxddp f0, f0
6414; CHECK-P8-NEXT:    stfdx f0, r3, r4
6415; CHECK-P8-NEXT:    blr
6416entry:
6417  %conv = uitofp i32 %str to double
6418  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
6419  store double %conv, ptr %add.ptr, align 8
6420  ret void
6421}
6422
6423; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6424define dso_local void @st_reg_uint32_t_double(ptr nocapture %ptr, i64 %off, i32 zeroext %str) {
6425; CHECK-LABEL: st_reg_uint32_t_double:
6426; CHECK:       # %bb.0: # %entry
6427; CHECK-NEXT:    mtfprwz f0, r5
6428; CHECK-NEXT:    xscvuxddp f0, f0
6429; CHECK-NEXT:    stfdx f0, r3, r4
6430; CHECK-NEXT:    blr
6431entry:
6432  %conv = uitofp i32 %str to double
6433  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
6434  store double %conv, ptr %add.ptr, align 8
6435  ret void
6436}
6437
6438; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6439define dso_local void @st_or1_uint32_t_double(i64 %ptr, i8 zeroext %off, i32 zeroext %str) {
6440; CHECK-LABEL: st_or1_uint32_t_double:
6441; CHECK:       # %bb.0: # %entry
6442; CHECK-NEXT:    mtfprwz f0, r5
6443; CHECK-NEXT:    or r3, r4, r3
6444; CHECK-NEXT:    xscvuxddp f0, f0
6445; CHECK-NEXT:    stfd f0, 0(r3)
6446; CHECK-NEXT:    blr
6447entry:
6448  %conv = uitofp i32 %str to double
6449  %conv1 = zext i8 %off to i64
6450  %or = or i64 %conv1, %ptr
6451  %0 = inttoptr i64 %or to ptr
6452  store double %conv, ptr %0, align 8
6453  ret void
6454}
6455
6456; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6457define dso_local void @st_not_disjoint16_uint32_t_double(i64 %ptr, i32 zeroext %str) {
6458; CHECK-LABEL: st_not_disjoint16_uint32_t_double:
6459; CHECK:       # %bb.0: # %entry
6460; CHECK-NEXT:    mtfprwz f0, r4
6461; CHECK-NEXT:    ori r3, r3, 6
6462; CHECK-NEXT:    xscvuxddp f0, f0
6463; CHECK-NEXT:    stfd f0, 0(r3)
6464; CHECK-NEXT:    blr
6465entry:
6466  %conv = uitofp i32 %str to double
6467  %or = or i64 %ptr, 6
6468  %0 = inttoptr i64 %or to ptr
6469  store double %conv, ptr %0, align 8
6470  ret void
6471}
6472
6473; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6474define dso_local void @st_disjoint_align16_uint32_t_double(i64 %ptr, i32 zeroext %str) {
6475; CHECK-LABEL: st_disjoint_align16_uint32_t_double:
6476; CHECK:       # %bb.0: # %entry
6477; CHECK-NEXT:    mtfprwz f0, r4
6478; CHECK-NEXT:    rldicr r3, r3, 0, 51
6479; CHECK-NEXT:    xscvuxddp f0, f0
6480; CHECK-NEXT:    stfd f0, 24(r3)
6481; CHECK-NEXT:    blr
6482entry:
6483  %and = and i64 %ptr, -4096
6484  %conv = uitofp i32 %str to double
6485  %or = or i64 %and, 24
6486  %0 = inttoptr i64 %or to ptr
6487  store double %conv, ptr %0, align 8
6488  ret void
6489}
6490
6491; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6492define dso_local void @st_not_disjoint32_uint32_t_double(i64 %ptr, i32 zeroext %str) {
6493; CHECK-P10-LABEL: st_not_disjoint32_uint32_t_double:
6494; CHECK-P10:       # %bb.0: # %entry
6495; CHECK-P10-NEXT:    mtfprwz f0, r4
6496; CHECK-P10-NEXT:    ori r3, r3, 34463
6497; CHECK-P10-NEXT:    oris r3, r3, 1
6498; CHECK-P10-NEXT:    xscvuxddp f0, f0
6499; CHECK-P10-NEXT:    stfd f0, 0(r3)
6500; CHECK-P10-NEXT:    blr
6501;
6502; CHECK-P9-LABEL: st_not_disjoint32_uint32_t_double:
6503; CHECK-P9:       # %bb.0: # %entry
6504; CHECK-P9-NEXT:    mtfprwz f0, r4
6505; CHECK-P9-NEXT:    ori r3, r3, 34463
6506; CHECK-P9-NEXT:    xscvuxddp f0, f0
6507; CHECK-P9-NEXT:    oris r3, r3, 1
6508; CHECK-P9-NEXT:    stfd f0, 0(r3)
6509; CHECK-P9-NEXT:    blr
6510;
6511; CHECK-P8-LABEL: st_not_disjoint32_uint32_t_double:
6512; CHECK-P8:       # %bb.0: # %entry
6513; CHECK-P8-NEXT:    mtfprwz f0, r4
6514; CHECK-P8-NEXT:    ori r3, r3, 34463
6515; CHECK-P8-NEXT:    oris r3, r3, 1
6516; CHECK-P8-NEXT:    xscvuxddp f0, f0
6517; CHECK-P8-NEXT:    stfd f0, 0(r3)
6518; CHECK-P8-NEXT:    blr
6519entry:
6520  %conv = uitofp i32 %str to double
6521  %or = or i64 %ptr, 99999
6522  %0 = inttoptr i64 %or to ptr
6523  store double %conv, ptr %0, align 8
6524  ret void
6525}
6526
6527; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6528define dso_local void @st_disjoint_align32_uint32_t_double(i64 %ptr, i32 zeroext %str) {
6529; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_double:
6530; CHECK-P10:       # %bb.0: # %entry
6531; CHECK-P10-NEXT:    mtfprwz f0, r4
6532; CHECK-P10-NEXT:    lis r5, -15264
6533; CHECK-P10-NEXT:    and r3, r3, r5
6534; CHECK-P10-NEXT:    xscvuxddp f0, f0
6535; CHECK-P10-NEXT:    pstfd f0, 999990000(r3), 0
6536; CHECK-P10-NEXT:    blr
6537;
6538; CHECK-P9-LABEL: st_disjoint_align32_uint32_t_double:
6539; CHECK-P9:       # %bb.0: # %entry
6540; CHECK-P9-NEXT:    mtfprwz f0, r4
6541; CHECK-P9-NEXT:    lis r5, -15264
6542; CHECK-P9-NEXT:    lis r4, 15258
6543; CHECK-P9-NEXT:    xscvuxddp f0, f0
6544; CHECK-P9-NEXT:    and r3, r3, r5
6545; CHECK-P9-NEXT:    ori r4, r4, 41712
6546; CHECK-P9-NEXT:    stfdx f0, r3, r4
6547; CHECK-P9-NEXT:    blr
6548;
6549; CHECK-P8-LABEL: st_disjoint_align32_uint32_t_double:
6550; CHECK-P8:       # %bb.0: # %entry
6551; CHECK-P8-NEXT:    mtfprwz f0, r4
6552; CHECK-P8-NEXT:    lis r5, -15264
6553; CHECK-P8-NEXT:    lis r4, 15258
6554; CHECK-P8-NEXT:    and r3, r3, r5
6555; CHECK-P8-NEXT:    ori r4, r4, 41712
6556; CHECK-P8-NEXT:    xscvuxddp f0, f0
6557; CHECK-P8-NEXT:    stfdx f0, r3, r4
6558; CHECK-P8-NEXT:    blr
6559entry:
6560  %and = and i64 %ptr, -1000341504
6561  %conv = uitofp i32 %str to double
6562  %or = or i64 %and, 999990000
6563  %0 = inttoptr i64 %or to ptr
6564  store double %conv, ptr %0, align 16
6565  ret void
6566}
6567
6568; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6569define dso_local void @st_not_disjoint64_uint32_t_double(i64 %ptr, i32 zeroext %str) {
6570; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_double:
6571; CHECK-P10:       # %bb.0: # %entry
6572; CHECK-P10-NEXT:    mtfprwz f0, r4
6573; CHECK-P10-NEXT:    pli r4, 232
6574; CHECK-P10-NEXT:    pli r5, 3567587329
6575; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
6576; CHECK-P10-NEXT:    xscvuxddp f0, f0
6577; CHECK-P10-NEXT:    or r3, r3, r5
6578; CHECK-P10-NEXT:    stfd f0, 0(r3)
6579; CHECK-P10-NEXT:    blr
6580;
6581; CHECK-P9-LABEL: st_not_disjoint64_uint32_t_double:
6582; CHECK-P9:       # %bb.0: # %entry
6583; CHECK-P9-NEXT:    mtfprwz f0, r4
6584; CHECK-P9-NEXT:    li r4, 29
6585; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
6586; CHECK-P9-NEXT:    xscvuxddp f0, f0
6587; CHECK-P9-NEXT:    oris r4, r4, 54437
6588; CHECK-P9-NEXT:    ori r4, r4, 4097
6589; CHECK-P9-NEXT:    or r3, r3, r4
6590; CHECK-P9-NEXT:    stfd f0, 0(r3)
6591; CHECK-P9-NEXT:    blr
6592;
6593; CHECK-P8-LABEL: st_not_disjoint64_uint32_t_double:
6594; CHECK-P8:       # %bb.0: # %entry
6595; CHECK-P8-NEXT:    mtfprwz f0, r4
6596; CHECK-P8-NEXT:    li r4, 29
6597; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
6598; CHECK-P8-NEXT:    oris r4, r4, 54437
6599; CHECK-P8-NEXT:    xscvuxddp f0, f0
6600; CHECK-P8-NEXT:    ori r4, r4, 4097
6601; CHECK-P8-NEXT:    or r3, r3, r4
6602; CHECK-P8-NEXT:    stfd f0, 0(r3)
6603; CHECK-P8-NEXT:    blr
6604entry:
6605  %conv = uitofp i32 %str to double
6606  %or = or i64 %ptr, 1000000000001
6607  %0 = inttoptr i64 %or to ptr
6608  store double %conv, ptr %0, align 8
6609  ret void
6610}
6611
6612; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6613define dso_local void @st_disjoint_align64_uint32_t_double(i64 %ptr, i32 zeroext %str) {
6614; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_double:
6615; CHECK-P10:       # %bb.0: # %entry
6616; CHECK-P10-NEXT:    mtfprwz f0, r4
6617; CHECK-P10-NEXT:    pli r4, 244140625
6618; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
6619; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
6620; CHECK-P10-NEXT:    xscvuxddp f0, f0
6621; CHECK-P10-NEXT:    stfdx f0, r3, r4
6622; CHECK-P10-NEXT:    blr
6623;
6624; CHECK-P9-LABEL: st_disjoint_align64_uint32_t_double:
6625; CHECK-P9:       # %bb.0: # %entry
6626; CHECK-P9-NEXT:    mtfprwz f0, r4
6627; CHECK-P9-NEXT:    lis r4, 3725
6628; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
6629; CHECK-P9-NEXT:    xscvuxddp f0, f0
6630; CHECK-P9-NEXT:    ori r4, r4, 19025
6631; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
6632; CHECK-P9-NEXT:    stfdx f0, r3, r4
6633; CHECK-P9-NEXT:    blr
6634;
6635; CHECK-P8-LABEL: st_disjoint_align64_uint32_t_double:
6636; CHECK-P8:       # %bb.0: # %entry
6637; CHECK-P8-NEXT:    mtfprwz f0, r4
6638; CHECK-P8-NEXT:    lis r4, 3725
6639; CHECK-P8-NEXT:    rldicr r3, r3, 0, 23
6640; CHECK-P8-NEXT:    ori r4, r4, 19025
6641; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
6642; CHECK-P8-NEXT:    xscvuxddp f0, f0
6643; CHECK-P8-NEXT:    stfdx f0, r3, r4
6644; CHECK-P8-NEXT:    blr
6645entry:
6646  %and = and i64 %ptr, -1099511627776
6647  %conv = uitofp i32 %str to double
6648  %or = or i64 %and, 1000000000000
6649  %0 = inttoptr i64 %or to ptr
6650  store double %conv, ptr %0, align 4096
6651  ret void
6652}
6653
6654; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6655define dso_local void @st_cst_align16_uint32_t_double(i32 zeroext %str) {
6656; CHECK-LABEL: st_cst_align16_uint32_t_double:
6657; CHECK:       # %bb.0: # %entry
6658; CHECK-NEXT:    mtfprwz f0, r3
6659; CHECK-NEXT:    xscvuxddp f0, f0
6660; CHECK-NEXT:    stfd f0, 4080(0)
6661; CHECK-NEXT:    blr
6662entry:
6663  %conv = uitofp i32 %str to double
6664  store double %conv, ptr inttoptr (i64 4080 to ptr), align 16
6665  ret void
6666}
6667
6668; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6669define dso_local void @st_cst_align32_uint32_t_double(i32 zeroext %str) {
6670; CHECK-LABEL: st_cst_align32_uint32_t_double:
6671; CHECK:       # %bb.0: # %entry
6672; CHECK-NEXT:    mtfprwz f0, r3
6673; CHECK-NEXT:    lis r3, 153
6674; CHECK-NEXT:    xscvuxddp f0, f0
6675; CHECK-NEXT:    stfd f0, -27108(r3)
6676; CHECK-NEXT:    blr
6677entry:
6678  %conv = uitofp i32 %str to double
6679  store double %conv, ptr inttoptr (i64 9999900 to ptr), align 8
6680  ret void
6681}
6682
6683; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6684define dso_local void @st_cst_align64_uint32_t_double(i32 zeroext %str) {
6685; CHECK-P10-LABEL: st_cst_align64_uint32_t_double:
6686; CHECK-P10:       # %bb.0: # %entry
6687; CHECK-P10-NEXT:    mtfprwz f0, r3
6688; CHECK-P10-NEXT:    pli r3, 244140625
6689; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
6690; CHECK-P10-NEXT:    xscvuxddp f0, f0
6691; CHECK-P10-NEXT:    stfd f0, 0(r3)
6692; CHECK-P10-NEXT:    blr
6693;
6694; CHECK-P9-LABEL: st_cst_align64_uint32_t_double:
6695; CHECK-P9:       # %bb.0: # %entry
6696; CHECK-P9-NEXT:    mtfprwz f0, r3
6697; CHECK-P9-NEXT:    lis r3, 3725
6698; CHECK-P9-NEXT:    xscvuxddp f0, f0
6699; CHECK-P9-NEXT:    ori r3, r3, 19025
6700; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
6701; CHECK-P9-NEXT:    stfd f0, 0(r3)
6702; CHECK-P9-NEXT:    blr
6703;
6704; CHECK-P8-LABEL: st_cst_align64_uint32_t_double:
6705; CHECK-P8:       # %bb.0: # %entry
6706; CHECK-P8-NEXT:    mtfprwz f0, r3
6707; CHECK-P8-NEXT:    lis r3, 3725
6708; CHECK-P8-NEXT:    ori r3, r3, 19025
6709; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
6710; CHECK-P8-NEXT:    xscvuxddp f0, f0
6711; CHECK-P8-NEXT:    stfd f0, 0(r3)
6712; CHECK-P8-NEXT:    blr
6713entry:
6714  %conv = uitofp i32 %str to double
6715  store double %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
6716  ret void
6717}
6718
6719; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6720define dso_local void @st_0_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
6721; CHECK-LABEL: st_0_int32_t_uint64_t:
6722; CHECK:       # %bb.0: # %entry
6723; CHECK-NEXT:    std r4, 0(r3)
6724; CHECK-NEXT:    blr
6725entry:
6726  %conv = sext i32 %str to i64
6727  %0 = inttoptr i64 %ptr to ptr
6728  store i64 %conv, ptr %0, align 8
6729  ret void
6730}
6731
6732; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6733define dso_local void @st_align16_int32_t_uint64_t(ptr nocapture %ptr, i32 signext %str) {
6734; CHECK-LABEL: st_align16_int32_t_uint64_t:
6735; CHECK:       # %bb.0: # %entry
6736; CHECK-NEXT:    std r4, 8(r3)
6737; CHECK-NEXT:    blr
6738entry:
6739  %conv = sext i32 %str to i64
6740  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
6741  store i64 %conv, ptr %add.ptr, align 8
6742  ret void
6743}
6744
6745; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6746define dso_local void @st_align32_int32_t_uint64_t(ptr nocapture %ptr, i32 signext %str) {
6747; CHECK-P10-LABEL: st_align32_int32_t_uint64_t:
6748; CHECK-P10:       # %bb.0: # %entry
6749; CHECK-P10-NEXT:    pstd r4, 99999000(r3), 0
6750; CHECK-P10-NEXT:    blr
6751;
6752; CHECK-PREP10-LABEL: st_align32_int32_t_uint64_t:
6753; CHECK-PREP10:       # %bb.0: # %entry
6754; CHECK-PREP10-NEXT:    lis r5, 1525
6755; CHECK-PREP10-NEXT:    ori r5, r5, 56600
6756; CHECK-PREP10-NEXT:    stdx r4, r3, r5
6757; CHECK-PREP10-NEXT:    blr
6758entry:
6759  %conv = sext i32 %str to i64
6760  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
6761  store i64 %conv, ptr %add.ptr, align 8
6762  ret void
6763}
6764
6765; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6766define dso_local void @st_align64_int32_t_uint64_t(ptr nocapture %ptr, i32 signext %str) {
6767; CHECK-P10-LABEL: st_align64_int32_t_uint64_t:
6768; CHECK-P10:       # %bb.0: # %entry
6769; CHECK-P10-NEXT:    pli r5, 244140625
6770; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
6771; CHECK-P10-NEXT:    stdx r4, r3, r5
6772; CHECK-P10-NEXT:    blr
6773;
6774; CHECK-PREP10-LABEL: st_align64_int32_t_uint64_t:
6775; CHECK-PREP10:       # %bb.0: # %entry
6776; CHECK-PREP10-NEXT:    lis r5, 3725
6777; CHECK-PREP10-NEXT:    ori r5, r5, 19025
6778; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
6779; CHECK-PREP10-NEXT:    stdx r4, r3, r5
6780; CHECK-PREP10-NEXT:    blr
6781entry:
6782  %conv = sext i32 %str to i64
6783  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
6784  store i64 %conv, ptr %add.ptr, align 8
6785  ret void
6786}
6787
6788; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6789define dso_local void @st_reg_int32_t_uint64_t(ptr nocapture %ptr, i64 %off, i32 signext %str) {
6790; CHECK-LABEL: st_reg_int32_t_uint64_t:
6791; CHECK:       # %bb.0: # %entry
6792; CHECK-NEXT:    stdx r5, r3, r4
6793; CHECK-NEXT:    blr
6794entry:
6795  %conv = sext i32 %str to i64
6796  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
6797  store i64 %conv, ptr %add.ptr, align 8
6798  ret void
6799}
6800
6801; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6802define dso_local void @st_or1_int32_t_uint64_t(i64 %ptr, i8 zeroext %off, i32 signext %str) {
6803; CHECK-LABEL: st_or1_int32_t_uint64_t:
6804; CHECK:       # %bb.0: # %entry
6805; CHECK-NEXT:    or r3, r4, r3
6806; CHECK-NEXT:    std r5, 0(r3)
6807; CHECK-NEXT:    blr
6808entry:
6809  %conv = sext i32 %str to i64
6810  %conv1 = zext i8 %off to i64
6811  %or = or i64 %conv1, %ptr
6812  %0 = inttoptr i64 %or to ptr
6813  store i64 %conv, ptr %0, align 8
6814  ret void
6815}
6816
6817; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6818define dso_local void @st_not_disjoint16_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
6819; CHECK-LABEL: st_not_disjoint16_int32_t_uint64_t:
6820; CHECK:       # %bb.0: # %entry
6821; CHECK-NEXT:    ori r3, r3, 6
6822; CHECK-NEXT:    std r4, 0(r3)
6823; CHECK-NEXT:    blr
6824entry:
6825  %conv = sext i32 %str to i64
6826  %or = or i64 %ptr, 6
6827  %0 = inttoptr i64 %or to ptr
6828  store i64 %conv, ptr %0, align 8
6829  ret void
6830}
6831
6832; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6833define dso_local void @st_disjoint_align16_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
6834; CHECK-LABEL: st_disjoint_align16_int32_t_uint64_t:
6835; CHECK:       # %bb.0: # %entry
6836; CHECK-NEXT:    rldicr r3, r3, 0, 51
6837; CHECK-NEXT:    std r4, 24(r3)
6838; CHECK-NEXT:    blr
6839entry:
6840  %and = and i64 %ptr, -4096
6841  %conv = sext i32 %str to i64
6842  %or = or i64 %and, 24
6843  %0 = inttoptr i64 %or to ptr
6844  store i64 %conv, ptr %0, align 8
6845  ret void
6846}
6847
6848; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6849define dso_local void @st_not_disjoint32_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
6850; CHECK-LABEL: st_not_disjoint32_int32_t_uint64_t:
6851; CHECK:       # %bb.0: # %entry
6852; CHECK-NEXT:    ori r3, r3, 34463
6853; CHECK-NEXT:    oris r3, r3, 1
6854; CHECK-NEXT:    std r4, 0(r3)
6855; CHECK-NEXT:    blr
6856entry:
6857  %conv = sext i32 %str to i64
6858  %or = or i64 %ptr, 99999
6859  %0 = inttoptr i64 %or to ptr
6860  store i64 %conv, ptr %0, align 8
6861  ret void
6862}
6863
6864; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6865define dso_local void @st_disjoint_align32_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
6866; CHECK-P10-LABEL: st_disjoint_align32_int32_t_uint64_t:
6867; CHECK-P10:       # %bb.0: # %entry
6868; CHECK-P10-NEXT:    lis r5, -15264
6869; CHECK-P10-NEXT:    and r3, r3, r5
6870; CHECK-P10-NEXT:    pstd r4, 999990000(r3), 0
6871; CHECK-P10-NEXT:    blr
6872;
6873; CHECK-PREP10-LABEL: st_disjoint_align32_int32_t_uint64_t:
6874; CHECK-PREP10:       # %bb.0: # %entry
6875; CHECK-PREP10-NEXT:    lis r5, -15264
6876; CHECK-PREP10-NEXT:    and r3, r3, r5
6877; CHECK-PREP10-NEXT:    lis r5, 15258
6878; CHECK-PREP10-NEXT:    ori r5, r5, 41712
6879; CHECK-PREP10-NEXT:    stdx r4, r3, r5
6880; CHECK-PREP10-NEXT:    blr
6881entry:
6882  %and = and i64 %ptr, -1000341504
6883  %conv = sext i32 %str to i64
6884  %or = or i64 %and, 999990000
6885  %0 = inttoptr i64 %or to ptr
6886  store i64 %conv, ptr %0, align 16
6887  ret void
6888}
6889
6890; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6891define dso_local void @st_not_disjoint64_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
6892; CHECK-P10-LABEL: st_not_disjoint64_int32_t_uint64_t:
6893; CHECK-P10:       # %bb.0: # %entry
6894; CHECK-P10-NEXT:    pli r5, 232
6895; CHECK-P10-NEXT:    pli r6, 3567587329
6896; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
6897; CHECK-P10-NEXT:    or r3, r3, r6
6898; CHECK-P10-NEXT:    std r4, 0(r3)
6899; CHECK-P10-NEXT:    blr
6900;
6901; CHECK-PREP10-LABEL: st_not_disjoint64_int32_t_uint64_t:
6902; CHECK-PREP10:       # %bb.0: # %entry
6903; CHECK-PREP10-NEXT:    li r5, 29
6904; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
6905; CHECK-PREP10-NEXT:    oris r5, r5, 54437
6906; CHECK-PREP10-NEXT:    ori r5, r5, 4097
6907; CHECK-PREP10-NEXT:    or r3, r3, r5
6908; CHECK-PREP10-NEXT:    std r4, 0(r3)
6909; CHECK-PREP10-NEXT:    blr
6910entry:
6911  %conv = sext i32 %str to i64
6912  %or = or i64 %ptr, 1000000000001
6913  %0 = inttoptr i64 %or to ptr
6914  store i64 %conv, ptr %0, align 8
6915  ret void
6916}
6917
6918; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6919define dso_local void @st_disjoint_align64_int32_t_uint64_t(i64 %ptr, i32 signext %str) {
6920; CHECK-P10-LABEL: st_disjoint_align64_int32_t_uint64_t:
6921; CHECK-P10:       # %bb.0: # %entry
6922; CHECK-P10-NEXT:    pli r5, 244140625
6923; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
6924; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
6925; CHECK-P10-NEXT:    stdx r4, r3, r5
6926; CHECK-P10-NEXT:    blr
6927;
6928; CHECK-PREP10-LABEL: st_disjoint_align64_int32_t_uint64_t:
6929; CHECK-PREP10:       # %bb.0: # %entry
6930; CHECK-PREP10-NEXT:    lis r5, 3725
6931; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
6932; CHECK-PREP10-NEXT:    ori r5, r5, 19025
6933; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
6934; CHECK-PREP10-NEXT:    stdx r4, r3, r5
6935; CHECK-PREP10-NEXT:    blr
6936entry:
6937  %and = and i64 %ptr, -1099511627776
6938  %conv = sext i32 %str to i64
6939  %or = or i64 %and, 1000000000000
6940  %0 = inttoptr i64 %or to ptr
6941  store i64 %conv, ptr %0, align 4096
6942  ret void
6943}
6944
6945; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6946define dso_local void @st_cst_align16_int32_t_uint64_t(i32 signext %str) {
6947; CHECK-LABEL: st_cst_align16_int32_t_uint64_t:
6948; CHECK:       # %bb.0: # %entry
6949; CHECK-NEXT:    std r3, 4080(0)
6950; CHECK-NEXT:    blr
6951entry:
6952  %conv = sext i32 %str to i64
6953  store i64 %conv, ptr inttoptr (i64 4080 to ptr), align 16
6954  ret void
6955}
6956
6957; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6958define dso_local void @st_cst_align32_int32_t_uint64_t(i32 signext %str) {
6959; CHECK-LABEL: st_cst_align32_int32_t_uint64_t:
6960; CHECK:       # %bb.0: # %entry
6961; CHECK-NEXT:    lis r4, 153
6962; CHECK-NEXT:    std r3, -27108(r4)
6963; CHECK-NEXT:    blr
6964entry:
6965  %conv = sext i32 %str to i64
6966  store i64 %conv, ptr inttoptr (i64 9999900 to ptr), align 8
6967  ret void
6968}
6969
6970; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6971define dso_local void @st_cst_align64_int32_t_uint64_t(i32 signext %str) {
6972; CHECK-P10-LABEL: st_cst_align64_int32_t_uint64_t:
6973; CHECK-P10:       # %bb.0: # %entry
6974; CHECK-P10-NEXT:    pli r4, 244140625
6975; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
6976; CHECK-P10-NEXT:    std r3, 0(r4)
6977; CHECK-P10-NEXT:    blr
6978;
6979; CHECK-PREP10-LABEL: st_cst_align64_int32_t_uint64_t:
6980; CHECK-PREP10:       # %bb.0: # %entry
6981; CHECK-PREP10-NEXT:    lis r4, 3725
6982; CHECK-PREP10-NEXT:    ori r4, r4, 19025
6983; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
6984; CHECK-PREP10-NEXT:    std r3, 0(r4)
6985; CHECK-PREP10-NEXT:    blr
6986entry:
6987  %conv = sext i32 %str to i64
6988  store i64 %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
6989  ret void
6990}
6991
6992; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6993define dso_local void @st_0_int32_t_float(i64 %ptr, i32 signext %str) {
6994; CHECK-LABEL: st_0_int32_t_float:
6995; CHECK:       # %bb.0: # %entry
6996; CHECK-NEXT:    mtfprwa f0, r4
6997; CHECK-NEXT:    xscvsxdsp f0, f0
6998; CHECK-NEXT:    stfs f0, 0(r3)
6999; CHECK-NEXT:    blr
7000entry:
7001  %conv = sitofp i32 %str to float
7002  %0 = inttoptr i64 %ptr to ptr
7003  store float %conv, ptr %0, align 4
7004  ret void
7005}
7006
7007; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7008define dso_local void @st_align16_int32_t_float(ptr nocapture %ptr, i32 signext %str) {
7009; CHECK-LABEL: st_align16_int32_t_float:
7010; CHECK:       # %bb.0: # %entry
7011; CHECK-NEXT:    mtfprwa f0, r4
7012; CHECK-NEXT:    xscvsxdsp f0, f0
7013; CHECK-NEXT:    stfs f0, 8(r3)
7014; CHECK-NEXT:    blr
7015entry:
7016  %conv = sitofp i32 %str to float
7017  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
7018  store float %conv, ptr %add.ptr, align 4
7019  ret void
7020}
7021
7022; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7023define dso_local void @st_align32_int32_t_float(ptr nocapture %ptr, i32 signext %str) {
7024; CHECK-P10-LABEL: st_align32_int32_t_float:
7025; CHECK-P10:       # %bb.0: # %entry
7026; CHECK-P10-NEXT:    mtfprwa f0, r4
7027; CHECK-P10-NEXT:    xscvsxdsp f0, f0
7028; CHECK-P10-NEXT:    pstfs f0, 99999000(r3), 0
7029; CHECK-P10-NEXT:    blr
7030;
7031; CHECK-P9-LABEL: st_align32_int32_t_float:
7032; CHECK-P9:       # %bb.0: # %entry
7033; CHECK-P9-NEXT:    mtfprwa f0, r4
7034; CHECK-P9-NEXT:    lis r4, 1525
7035; CHECK-P9-NEXT:    xscvsxdsp f0, f0
7036; CHECK-P9-NEXT:    ori r4, r4, 56600
7037; CHECK-P9-NEXT:    stfsx f0, r3, r4
7038; CHECK-P9-NEXT:    blr
7039;
7040; CHECK-P8-LABEL: st_align32_int32_t_float:
7041; CHECK-P8:       # %bb.0: # %entry
7042; CHECK-P8-NEXT:    mtfprwa f0, r4
7043; CHECK-P8-NEXT:    lis r4, 1525
7044; CHECK-P8-NEXT:    ori r4, r4, 56600
7045; CHECK-P8-NEXT:    xscvsxdsp f0, f0
7046; CHECK-P8-NEXT:    stfsx f0, r3, r4
7047; CHECK-P8-NEXT:    blr
7048entry:
7049  %conv = sitofp i32 %str to float
7050  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
7051  store float %conv, ptr %add.ptr, align 4
7052  ret void
7053}
7054
7055; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7056define dso_local void @st_align64_int32_t_float(ptr nocapture %ptr, i32 signext %str) {
7057; CHECK-P10-LABEL: st_align64_int32_t_float:
7058; CHECK-P10:       # %bb.0: # %entry
7059; CHECK-P10-NEXT:    mtfprwa f0, r4
7060; CHECK-P10-NEXT:    pli r4, 244140625
7061; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
7062; CHECK-P10-NEXT:    xscvsxdsp f0, f0
7063; CHECK-P10-NEXT:    stfsx f0, r3, r4
7064; CHECK-P10-NEXT:    blr
7065;
7066; CHECK-P9-LABEL: st_align64_int32_t_float:
7067; CHECK-P9:       # %bb.0: # %entry
7068; CHECK-P9-NEXT:    mtfprwa f0, r4
7069; CHECK-P9-NEXT:    lis r4, 3725
7070; CHECK-P9-NEXT:    xscvsxdsp f0, f0
7071; CHECK-P9-NEXT:    ori r4, r4, 19025
7072; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
7073; CHECK-P9-NEXT:    stfsx f0, r3, r4
7074; CHECK-P9-NEXT:    blr
7075;
7076; CHECK-P8-LABEL: st_align64_int32_t_float:
7077; CHECK-P8:       # %bb.0: # %entry
7078; CHECK-P8-NEXT:    mtfprwa f0, r4
7079; CHECK-P8-NEXT:    lis r4, 3725
7080; CHECK-P8-NEXT:    ori r4, r4, 19025
7081; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
7082; CHECK-P8-NEXT:    xscvsxdsp f0, f0
7083; CHECK-P8-NEXT:    stfsx f0, r3, r4
7084; CHECK-P8-NEXT:    blr
7085entry:
7086  %conv = sitofp i32 %str to float
7087  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
7088  store float %conv, ptr %add.ptr, align 4
7089  ret void
7090}
7091
7092; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7093define dso_local void @st_reg_int32_t_float(ptr nocapture %ptr, i64 %off, i32 signext %str) {
7094; CHECK-LABEL: st_reg_int32_t_float:
7095; CHECK:       # %bb.0: # %entry
7096; CHECK-NEXT:    mtfprwa f0, r5
7097; CHECK-NEXT:    xscvsxdsp f0, f0
7098; CHECK-NEXT:    stfsx f0, r3, r4
7099; CHECK-NEXT:    blr
7100entry:
7101  %conv = sitofp i32 %str to float
7102  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
7103  store float %conv, ptr %add.ptr, align 4
7104  ret void
7105}
7106
7107; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7108define dso_local void @st_or1_int32_t_float(i64 %ptr, i8 zeroext %off, i32 signext %str) {
7109; CHECK-LABEL: st_or1_int32_t_float:
7110; CHECK:       # %bb.0: # %entry
7111; CHECK-NEXT:    mtfprwa f0, r5
7112; CHECK-NEXT:    or r3, r4, r3
7113; CHECK-NEXT:    xscvsxdsp f0, f0
7114; CHECK-NEXT:    stfs f0, 0(r3)
7115; CHECK-NEXT:    blr
7116entry:
7117  %conv = sitofp i32 %str to float
7118  %conv1 = zext i8 %off to i64
7119  %or = or i64 %conv1, %ptr
7120  %0 = inttoptr i64 %or to ptr
7121  store float %conv, ptr %0, align 4
7122  ret void
7123}
7124
7125; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7126define dso_local void @st_not_disjoint16_int32_t_float(i64 %ptr, i32 signext %str) {
7127; CHECK-LABEL: st_not_disjoint16_int32_t_float:
7128; CHECK:       # %bb.0: # %entry
7129; CHECK-NEXT:    mtfprwa f0, r4
7130; CHECK-NEXT:    ori r3, r3, 6
7131; CHECK-NEXT:    xscvsxdsp f0, f0
7132; CHECK-NEXT:    stfs f0, 0(r3)
7133; CHECK-NEXT:    blr
7134entry:
7135  %conv = sitofp i32 %str to float
7136  %or = or i64 %ptr, 6
7137  %0 = inttoptr i64 %or to ptr
7138  store float %conv, ptr %0, align 4
7139  ret void
7140}
7141
7142; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7143define dso_local void @st_disjoint_align16_int32_t_float(i64 %ptr, i32 signext %str) {
7144; CHECK-LABEL: st_disjoint_align16_int32_t_float:
7145; CHECK:       # %bb.0: # %entry
7146; CHECK-NEXT:    mtfprwa f0, r4
7147; CHECK-NEXT:    rldicr r3, r3, 0, 51
7148; CHECK-NEXT:    xscvsxdsp f0, f0
7149; CHECK-NEXT:    stfs f0, 24(r3)
7150; CHECK-NEXT:    blr
7151entry:
7152  %and = and i64 %ptr, -4096
7153  %conv = sitofp i32 %str to float
7154  %or = or i64 %and, 24
7155  %0 = inttoptr i64 %or to ptr
7156  store float %conv, ptr %0, align 8
7157  ret void
7158}
7159
7160; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7161define dso_local void @st_not_disjoint32_int32_t_float(i64 %ptr, i32 signext %str) {
7162; CHECK-P10-LABEL: st_not_disjoint32_int32_t_float:
7163; CHECK-P10:       # %bb.0: # %entry
7164; CHECK-P10-NEXT:    mtfprwa f0, r4
7165; CHECK-P10-NEXT:    ori r3, r3, 34463
7166; CHECK-P10-NEXT:    oris r3, r3, 1
7167; CHECK-P10-NEXT:    xscvsxdsp f0, f0
7168; CHECK-P10-NEXT:    stfs f0, 0(r3)
7169; CHECK-P10-NEXT:    blr
7170;
7171; CHECK-P9-LABEL: st_not_disjoint32_int32_t_float:
7172; CHECK-P9:       # %bb.0: # %entry
7173; CHECK-P9-NEXT:    mtfprwa f0, r4
7174; CHECK-P9-NEXT:    ori r3, r3, 34463
7175; CHECK-P9-NEXT:    xscvsxdsp f0, f0
7176; CHECK-P9-NEXT:    oris r3, r3, 1
7177; CHECK-P9-NEXT:    stfs f0, 0(r3)
7178; CHECK-P9-NEXT:    blr
7179;
7180; CHECK-P8-LABEL: st_not_disjoint32_int32_t_float:
7181; CHECK-P8:       # %bb.0: # %entry
7182; CHECK-P8-NEXT:    mtfprwa f0, r4
7183; CHECK-P8-NEXT:    ori r3, r3, 34463
7184; CHECK-P8-NEXT:    oris r3, r3, 1
7185; CHECK-P8-NEXT:    xscvsxdsp f0, f0
7186; CHECK-P8-NEXT:    stfs f0, 0(r3)
7187; CHECK-P8-NEXT:    blr
7188entry:
7189  %conv = sitofp i32 %str to float
7190  %or = or i64 %ptr, 99999
7191  %0 = inttoptr i64 %or to ptr
7192  store float %conv, ptr %0, align 4
7193  ret void
7194}
7195
7196; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7197define dso_local void @st_disjoint_align32_int32_t_float(i64 %ptr, i32 signext %str) {
7198; CHECK-P10-LABEL: st_disjoint_align32_int32_t_float:
7199; CHECK-P10:       # %bb.0: # %entry
7200; CHECK-P10-NEXT:    mtfprwa f0, r4
7201; CHECK-P10-NEXT:    lis r5, -15264
7202; CHECK-P10-NEXT:    and r3, r3, r5
7203; CHECK-P10-NEXT:    xscvsxdsp f0, f0
7204; CHECK-P10-NEXT:    pstfs f0, 999990000(r3), 0
7205; CHECK-P10-NEXT:    blr
7206;
7207; CHECK-P9-LABEL: st_disjoint_align32_int32_t_float:
7208; CHECK-P9:       # %bb.0: # %entry
7209; CHECK-P9-NEXT:    mtfprwa f0, r4
7210; CHECK-P9-NEXT:    lis r5, -15264
7211; CHECK-P9-NEXT:    lis r4, 15258
7212; CHECK-P9-NEXT:    xscvsxdsp f0, f0
7213; CHECK-P9-NEXT:    and r3, r3, r5
7214; CHECK-P9-NEXT:    ori r4, r4, 41712
7215; CHECK-P9-NEXT:    stfsx f0, r3, r4
7216; CHECK-P9-NEXT:    blr
7217;
7218; CHECK-P8-LABEL: st_disjoint_align32_int32_t_float:
7219; CHECK-P8:       # %bb.0: # %entry
7220; CHECK-P8-NEXT:    mtfprwa f0, r4
7221; CHECK-P8-NEXT:    lis r5, -15264
7222; CHECK-P8-NEXT:    lis r4, 15258
7223; CHECK-P8-NEXT:    and r3, r3, r5
7224; CHECK-P8-NEXT:    ori r4, r4, 41712
7225; CHECK-P8-NEXT:    xscvsxdsp f0, f0
7226; CHECK-P8-NEXT:    stfsx f0, r3, r4
7227; CHECK-P8-NEXT:    blr
7228entry:
7229  %and = and i64 %ptr, -1000341504
7230  %conv = sitofp i32 %str to float
7231  %or = or i64 %and, 999990000
7232  %0 = inttoptr i64 %or to ptr
7233  store float %conv, ptr %0, align 16
7234  ret void
7235}
7236
7237; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7238define dso_local void @st_not_disjoint64_int32_t_float(i64 %ptr, i32 signext %str) {
7239; CHECK-P10-LABEL: st_not_disjoint64_int32_t_float:
7240; CHECK-P10:       # %bb.0: # %entry
7241; CHECK-P10-NEXT:    mtfprwa f0, r4
7242; CHECK-P10-NEXT:    pli r4, 232
7243; CHECK-P10-NEXT:    pli r5, 3567587329
7244; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
7245; CHECK-P10-NEXT:    xscvsxdsp f0, f0
7246; CHECK-P10-NEXT:    or r3, r3, r5
7247; CHECK-P10-NEXT:    stfs f0, 0(r3)
7248; CHECK-P10-NEXT:    blr
7249;
7250; CHECK-P9-LABEL: st_not_disjoint64_int32_t_float:
7251; CHECK-P9:       # %bb.0: # %entry
7252; CHECK-P9-NEXT:    mtfprwa f0, r4
7253; CHECK-P9-NEXT:    li r4, 29
7254; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
7255; CHECK-P9-NEXT:    xscvsxdsp f0, f0
7256; CHECK-P9-NEXT:    oris r4, r4, 54437
7257; CHECK-P9-NEXT:    ori r4, r4, 4097
7258; CHECK-P9-NEXT:    or r3, r3, r4
7259; CHECK-P9-NEXT:    stfs f0, 0(r3)
7260; CHECK-P9-NEXT:    blr
7261;
7262; CHECK-P8-LABEL: st_not_disjoint64_int32_t_float:
7263; CHECK-P8:       # %bb.0: # %entry
7264; CHECK-P8-NEXT:    mtfprwa f0, r4
7265; CHECK-P8-NEXT:    li r4, 29
7266; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
7267; CHECK-P8-NEXT:    oris r4, r4, 54437
7268; CHECK-P8-NEXT:    xscvsxdsp f0, f0
7269; CHECK-P8-NEXT:    ori r4, r4, 4097
7270; CHECK-P8-NEXT:    or r3, r3, r4
7271; CHECK-P8-NEXT:    stfs f0, 0(r3)
7272; CHECK-P8-NEXT:    blr
7273entry:
7274  %conv = sitofp i32 %str to float
7275  %or = or i64 %ptr, 1000000000001
7276  %0 = inttoptr i64 %or to ptr
7277  store float %conv, ptr %0, align 4
7278  ret void
7279}
7280
7281; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7282define dso_local void @st_disjoint_align64_int32_t_float(i64 %ptr, i32 signext %str) {
7283; CHECK-P10-LABEL: st_disjoint_align64_int32_t_float:
7284; CHECK-P10:       # %bb.0: # %entry
7285; CHECK-P10-NEXT:    mtfprwa f0, r4
7286; CHECK-P10-NEXT:    pli r4, 244140625
7287; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
7288; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
7289; CHECK-P10-NEXT:    xscvsxdsp f0, f0
7290; CHECK-P10-NEXT:    stfsx f0, r3, r4
7291; CHECK-P10-NEXT:    blr
7292;
7293; CHECK-P9-LABEL: st_disjoint_align64_int32_t_float:
7294; CHECK-P9:       # %bb.0: # %entry
7295; CHECK-P9-NEXT:    mtfprwa f0, r4
7296; CHECK-P9-NEXT:    lis r4, 3725
7297; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
7298; CHECK-P9-NEXT:    xscvsxdsp f0, f0
7299; CHECK-P9-NEXT:    ori r4, r4, 19025
7300; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
7301; CHECK-P9-NEXT:    stfsx f0, r3, r4
7302; CHECK-P9-NEXT:    blr
7303;
7304; CHECK-P8-LABEL: st_disjoint_align64_int32_t_float:
7305; CHECK-P8:       # %bb.0: # %entry
7306; CHECK-P8-NEXT:    mtfprwa f0, r4
7307; CHECK-P8-NEXT:    lis r4, 3725
7308; CHECK-P8-NEXT:    rldicr r3, r3, 0, 23
7309; CHECK-P8-NEXT:    ori r4, r4, 19025
7310; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
7311; CHECK-P8-NEXT:    xscvsxdsp f0, f0
7312; CHECK-P8-NEXT:    stfsx f0, r3, r4
7313; CHECK-P8-NEXT:    blr
7314entry:
7315  %and = and i64 %ptr, -1099511627776
7316  %conv = sitofp i32 %str to float
7317  %or = or i64 %and, 1000000000000
7318  %0 = inttoptr i64 %or to ptr
7319  store float %conv, ptr %0, align 4096
7320  ret void
7321}
7322
7323; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7324define dso_local void @st_cst_align16_int32_t_float(i32 signext %str) {
7325; CHECK-LABEL: st_cst_align16_int32_t_float:
7326; CHECK:       # %bb.0: # %entry
7327; CHECK-NEXT:    mtfprwa f0, r3
7328; CHECK-NEXT:    xscvsxdsp f0, f0
7329; CHECK-NEXT:    stfs f0, 4080(0)
7330; CHECK-NEXT:    blr
7331entry:
7332  %conv = sitofp i32 %str to float
7333  store float %conv, ptr inttoptr (i64 4080 to ptr), align 16
7334  ret void
7335}
7336
7337; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7338define dso_local void @st_cst_align32_int32_t_float(i32 signext %str) {
7339; CHECK-LABEL: st_cst_align32_int32_t_float:
7340; CHECK:       # %bb.0: # %entry
7341; CHECK-NEXT:    mtfprwa f0, r3
7342; CHECK-NEXT:    lis r3, 153
7343; CHECK-NEXT:    xscvsxdsp f0, f0
7344; CHECK-NEXT:    stfs f0, -27108(r3)
7345; CHECK-NEXT:    blr
7346entry:
7347  %conv = sitofp i32 %str to float
7348  store float %conv, ptr inttoptr (i64 9999900 to ptr), align 4
7349  ret void
7350}
7351
7352; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7353define dso_local void @st_cst_align64_int32_t_float(i32 signext %str) {
7354; CHECK-P10-LABEL: st_cst_align64_int32_t_float:
7355; CHECK-P10:       # %bb.0: # %entry
7356; CHECK-P10-NEXT:    mtfprwa f0, r3
7357; CHECK-P10-NEXT:    pli r3, 244140625
7358; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
7359; CHECK-P10-NEXT:    xscvsxdsp f0, f0
7360; CHECK-P10-NEXT:    stfs f0, 0(r3)
7361; CHECK-P10-NEXT:    blr
7362;
7363; CHECK-P9-LABEL: st_cst_align64_int32_t_float:
7364; CHECK-P9:       # %bb.0: # %entry
7365; CHECK-P9-NEXT:    mtfprwa f0, r3
7366; CHECK-P9-NEXT:    lis r3, 3725
7367; CHECK-P9-NEXT:    xscvsxdsp f0, f0
7368; CHECK-P9-NEXT:    ori r3, r3, 19025
7369; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
7370; CHECK-P9-NEXT:    stfs f0, 0(r3)
7371; CHECK-P9-NEXT:    blr
7372;
7373; CHECK-P8-LABEL: st_cst_align64_int32_t_float:
7374; CHECK-P8:       # %bb.0: # %entry
7375; CHECK-P8-NEXT:    mtfprwa f0, r3
7376; CHECK-P8-NEXT:    lis r3, 3725
7377; CHECK-P8-NEXT:    ori r3, r3, 19025
7378; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
7379; CHECK-P8-NEXT:    xscvsxdsp f0, f0
7380; CHECK-P8-NEXT:    stfs f0, 0(r3)
7381; CHECK-P8-NEXT:    blr
7382entry:
7383  %conv = sitofp i32 %str to float
7384  store float %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
7385  ret void
7386}
7387
7388; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7389define dso_local void @st_0_int32_t_double(i64 %ptr, i32 signext %str) {
7390; CHECK-LABEL: st_0_int32_t_double:
7391; CHECK:       # %bb.0: # %entry
7392; CHECK-NEXT:    mtfprwa f0, r4
7393; CHECK-NEXT:    xscvsxddp f0, f0
7394; CHECK-NEXT:    stfd f0, 0(r3)
7395; CHECK-NEXT:    blr
7396entry:
7397  %conv = sitofp i32 %str to double
7398  %0 = inttoptr i64 %ptr to ptr
7399  store double %conv, ptr %0, align 8
7400  ret void
7401}
7402
7403; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7404define dso_local void @st_align16_int32_t_double(ptr nocapture %ptr, i32 signext %str) {
7405; CHECK-LABEL: st_align16_int32_t_double:
7406; CHECK:       # %bb.0: # %entry
7407; CHECK-NEXT:    mtfprwa f0, r4
7408; CHECK-NEXT:    xscvsxddp f0, f0
7409; CHECK-NEXT:    stfd f0, 8(r3)
7410; CHECK-NEXT:    blr
7411entry:
7412  %conv = sitofp i32 %str to double
7413  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
7414  store double %conv, ptr %add.ptr, align 8
7415  ret void
7416}
7417
7418; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7419define dso_local void @st_align32_int32_t_double(ptr nocapture %ptr, i32 signext %str) {
7420; CHECK-P10-LABEL: st_align32_int32_t_double:
7421; CHECK-P10:       # %bb.0: # %entry
7422; CHECK-P10-NEXT:    mtfprwa f0, r4
7423; CHECK-P10-NEXT:    xscvsxddp f0, f0
7424; CHECK-P10-NEXT:    pstfd f0, 99999000(r3), 0
7425; CHECK-P10-NEXT:    blr
7426;
7427; CHECK-P9-LABEL: st_align32_int32_t_double:
7428; CHECK-P9:       # %bb.0: # %entry
7429; CHECK-P9-NEXT:    mtfprwa f0, r4
7430; CHECK-P9-NEXT:    lis r4, 1525
7431; CHECK-P9-NEXT:    xscvsxddp f0, f0
7432; CHECK-P9-NEXT:    ori r4, r4, 56600
7433; CHECK-P9-NEXT:    stfdx f0, r3, r4
7434; CHECK-P9-NEXT:    blr
7435;
7436; CHECK-P8-LABEL: st_align32_int32_t_double:
7437; CHECK-P8:       # %bb.0: # %entry
7438; CHECK-P8-NEXT:    mtfprwa f0, r4
7439; CHECK-P8-NEXT:    lis r4, 1525
7440; CHECK-P8-NEXT:    ori r4, r4, 56600
7441; CHECK-P8-NEXT:    xscvsxddp f0, f0
7442; CHECK-P8-NEXT:    stfdx f0, r3, r4
7443; CHECK-P8-NEXT:    blr
7444entry:
7445  %conv = sitofp i32 %str to double
7446  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
7447  store double %conv, ptr %add.ptr, align 8
7448  ret void
7449}
7450
7451; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7452define dso_local void @st_align64_int32_t_double(ptr nocapture %ptr, i32 signext %str) {
7453; CHECK-P10-LABEL: st_align64_int32_t_double:
7454; CHECK-P10:       # %bb.0: # %entry
7455; CHECK-P10-NEXT:    mtfprwa f0, r4
7456; CHECK-P10-NEXT:    pli r4, 244140625
7457; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
7458; CHECK-P10-NEXT:    xscvsxddp f0, f0
7459; CHECK-P10-NEXT:    stfdx f0, r3, r4
7460; CHECK-P10-NEXT:    blr
7461;
7462; CHECK-P9-LABEL: st_align64_int32_t_double:
7463; CHECK-P9:       # %bb.0: # %entry
7464; CHECK-P9-NEXT:    mtfprwa f0, r4
7465; CHECK-P9-NEXT:    lis r4, 3725
7466; CHECK-P9-NEXT:    xscvsxddp f0, f0
7467; CHECK-P9-NEXT:    ori r4, r4, 19025
7468; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
7469; CHECK-P9-NEXT:    stfdx f0, r3, r4
7470; CHECK-P9-NEXT:    blr
7471;
7472; CHECK-P8-LABEL: st_align64_int32_t_double:
7473; CHECK-P8:       # %bb.0: # %entry
7474; CHECK-P8-NEXT:    mtfprwa f0, r4
7475; CHECK-P8-NEXT:    lis r4, 3725
7476; CHECK-P8-NEXT:    ori r4, r4, 19025
7477; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
7478; CHECK-P8-NEXT:    xscvsxddp f0, f0
7479; CHECK-P8-NEXT:    stfdx f0, r3, r4
7480; CHECK-P8-NEXT:    blr
7481entry:
7482  %conv = sitofp i32 %str to double
7483  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
7484  store double %conv, ptr %add.ptr, align 8
7485  ret void
7486}
7487
7488; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7489define dso_local void @st_reg_int32_t_double(ptr nocapture %ptr, i64 %off, i32 signext %str) {
7490; CHECK-LABEL: st_reg_int32_t_double:
7491; CHECK:       # %bb.0: # %entry
7492; CHECK-NEXT:    mtfprwa f0, r5
7493; CHECK-NEXT:    xscvsxddp f0, f0
7494; CHECK-NEXT:    stfdx f0, r3, r4
7495; CHECK-NEXT:    blr
7496entry:
7497  %conv = sitofp i32 %str to double
7498  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
7499  store double %conv, ptr %add.ptr, align 8
7500  ret void
7501}
7502
7503; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7504define dso_local void @st_or1_int32_t_double(i64 %ptr, i8 zeroext %off, i32 signext %str) {
7505; CHECK-LABEL: st_or1_int32_t_double:
7506; CHECK:       # %bb.0: # %entry
7507; CHECK-NEXT:    mtfprwa f0, r5
7508; CHECK-NEXT:    or r3, r4, r3
7509; CHECK-NEXT:    xscvsxddp f0, f0
7510; CHECK-NEXT:    stfd f0, 0(r3)
7511; CHECK-NEXT:    blr
7512entry:
7513  %conv = sitofp i32 %str to double
7514  %conv1 = zext i8 %off to i64
7515  %or = or i64 %conv1, %ptr
7516  %0 = inttoptr i64 %or to ptr
7517  store double %conv, ptr %0, align 8
7518  ret void
7519}
7520
7521; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7522define dso_local void @st_not_disjoint16_int32_t_double(i64 %ptr, i32 signext %str) {
7523; CHECK-LABEL: st_not_disjoint16_int32_t_double:
7524; CHECK:       # %bb.0: # %entry
7525; CHECK-NEXT:    mtfprwa f0, r4
7526; CHECK-NEXT:    ori r3, r3, 6
7527; CHECK-NEXT:    xscvsxddp f0, f0
7528; CHECK-NEXT:    stfd f0, 0(r3)
7529; CHECK-NEXT:    blr
7530entry:
7531  %conv = sitofp i32 %str to double
7532  %or = or i64 %ptr, 6
7533  %0 = inttoptr i64 %or to ptr
7534  store double %conv, ptr %0, align 8
7535  ret void
7536}
7537
7538; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7539define dso_local void @st_disjoint_align16_int32_t_double(i64 %ptr, i32 signext %str) {
7540; CHECK-LABEL: st_disjoint_align16_int32_t_double:
7541; CHECK:       # %bb.0: # %entry
7542; CHECK-NEXT:    mtfprwa f0, r4
7543; CHECK-NEXT:    rldicr r3, r3, 0, 51
7544; CHECK-NEXT:    xscvsxddp f0, f0
7545; CHECK-NEXT:    stfd f0, 24(r3)
7546; CHECK-NEXT:    blr
7547entry:
7548  %and = and i64 %ptr, -4096
7549  %conv = sitofp i32 %str to double
7550  %or = or i64 %and, 24
7551  %0 = inttoptr i64 %or to ptr
7552  store double %conv, ptr %0, align 8
7553  ret void
7554}
7555
7556; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7557define dso_local void @st_not_disjoint32_int32_t_double(i64 %ptr, i32 signext %str) {
7558; CHECK-P10-LABEL: st_not_disjoint32_int32_t_double:
7559; CHECK-P10:       # %bb.0: # %entry
7560; CHECK-P10-NEXT:    mtfprwa f0, r4
7561; CHECK-P10-NEXT:    ori r3, r3, 34463
7562; CHECK-P10-NEXT:    oris r3, r3, 1
7563; CHECK-P10-NEXT:    xscvsxddp f0, f0
7564; CHECK-P10-NEXT:    stfd f0, 0(r3)
7565; CHECK-P10-NEXT:    blr
7566;
7567; CHECK-P9-LABEL: st_not_disjoint32_int32_t_double:
7568; CHECK-P9:       # %bb.0: # %entry
7569; CHECK-P9-NEXT:    mtfprwa f0, r4
7570; CHECK-P9-NEXT:    ori r3, r3, 34463
7571; CHECK-P9-NEXT:    xscvsxddp f0, f0
7572; CHECK-P9-NEXT:    oris r3, r3, 1
7573; CHECK-P9-NEXT:    stfd f0, 0(r3)
7574; CHECK-P9-NEXT:    blr
7575;
7576; CHECK-P8-LABEL: st_not_disjoint32_int32_t_double:
7577; CHECK-P8:       # %bb.0: # %entry
7578; CHECK-P8-NEXT:    mtfprwa f0, r4
7579; CHECK-P8-NEXT:    ori r3, r3, 34463
7580; CHECK-P8-NEXT:    oris r3, r3, 1
7581; CHECK-P8-NEXT:    xscvsxddp f0, f0
7582; CHECK-P8-NEXT:    stfd f0, 0(r3)
7583; CHECK-P8-NEXT:    blr
7584entry:
7585  %conv = sitofp i32 %str to double
7586  %or = or i64 %ptr, 99999
7587  %0 = inttoptr i64 %or to ptr
7588  store double %conv, ptr %0, align 8
7589  ret void
7590}
7591
7592; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7593define dso_local void @st_disjoint_align32_int32_t_double(i64 %ptr, i32 signext %str) {
7594; CHECK-P10-LABEL: st_disjoint_align32_int32_t_double:
7595; CHECK-P10:       # %bb.0: # %entry
7596; CHECK-P10-NEXT:    mtfprwa f0, r4
7597; CHECK-P10-NEXT:    lis r5, -15264
7598; CHECK-P10-NEXT:    and r3, r3, r5
7599; CHECK-P10-NEXT:    xscvsxddp f0, f0
7600; CHECK-P10-NEXT:    pstfd f0, 999990000(r3), 0
7601; CHECK-P10-NEXT:    blr
7602;
7603; CHECK-P9-LABEL: st_disjoint_align32_int32_t_double:
7604; CHECK-P9:       # %bb.0: # %entry
7605; CHECK-P9-NEXT:    mtfprwa f0, r4
7606; CHECK-P9-NEXT:    lis r5, -15264
7607; CHECK-P9-NEXT:    lis r4, 15258
7608; CHECK-P9-NEXT:    xscvsxddp f0, f0
7609; CHECK-P9-NEXT:    and r3, r3, r5
7610; CHECK-P9-NEXT:    ori r4, r4, 41712
7611; CHECK-P9-NEXT:    stfdx f0, r3, r4
7612; CHECK-P9-NEXT:    blr
7613;
7614; CHECK-P8-LABEL: st_disjoint_align32_int32_t_double:
7615; CHECK-P8:       # %bb.0: # %entry
7616; CHECK-P8-NEXT:    mtfprwa f0, r4
7617; CHECK-P8-NEXT:    lis r5, -15264
7618; CHECK-P8-NEXT:    lis r4, 15258
7619; CHECK-P8-NEXT:    and r3, r3, r5
7620; CHECK-P8-NEXT:    ori r4, r4, 41712
7621; CHECK-P8-NEXT:    xscvsxddp f0, f0
7622; CHECK-P8-NEXT:    stfdx f0, r3, r4
7623; CHECK-P8-NEXT:    blr
7624entry:
7625  %and = and i64 %ptr, -1000341504
7626  %conv = sitofp i32 %str to double
7627  %or = or i64 %and, 999990000
7628  %0 = inttoptr i64 %or to ptr
7629  store double %conv, ptr %0, align 16
7630  ret void
7631}
7632
7633; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7634define dso_local void @st_not_disjoint64_int32_t_double(i64 %ptr, i32 signext %str) {
7635; CHECK-P10-LABEL: st_not_disjoint64_int32_t_double:
7636; CHECK-P10:       # %bb.0: # %entry
7637; CHECK-P10-NEXT:    mtfprwa f0, r4
7638; CHECK-P10-NEXT:    pli r4, 232
7639; CHECK-P10-NEXT:    pli r5, 3567587329
7640; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
7641; CHECK-P10-NEXT:    xscvsxddp f0, f0
7642; CHECK-P10-NEXT:    or r3, r3, r5
7643; CHECK-P10-NEXT:    stfd f0, 0(r3)
7644; CHECK-P10-NEXT:    blr
7645;
7646; CHECK-P9-LABEL: st_not_disjoint64_int32_t_double:
7647; CHECK-P9:       # %bb.0: # %entry
7648; CHECK-P9-NEXT:    mtfprwa f0, r4
7649; CHECK-P9-NEXT:    li r4, 29
7650; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
7651; CHECK-P9-NEXT:    xscvsxddp f0, f0
7652; CHECK-P9-NEXT:    oris r4, r4, 54437
7653; CHECK-P9-NEXT:    ori r4, r4, 4097
7654; CHECK-P9-NEXT:    or r3, r3, r4
7655; CHECK-P9-NEXT:    stfd f0, 0(r3)
7656; CHECK-P9-NEXT:    blr
7657;
7658; CHECK-P8-LABEL: st_not_disjoint64_int32_t_double:
7659; CHECK-P8:       # %bb.0: # %entry
7660; CHECK-P8-NEXT:    mtfprwa f0, r4
7661; CHECK-P8-NEXT:    li r4, 29
7662; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
7663; CHECK-P8-NEXT:    oris r4, r4, 54437
7664; CHECK-P8-NEXT:    xscvsxddp f0, f0
7665; CHECK-P8-NEXT:    ori r4, r4, 4097
7666; CHECK-P8-NEXT:    or r3, r3, r4
7667; CHECK-P8-NEXT:    stfd f0, 0(r3)
7668; CHECK-P8-NEXT:    blr
7669entry:
7670  %conv = sitofp i32 %str to double
7671  %or = or i64 %ptr, 1000000000001
7672  %0 = inttoptr i64 %or to ptr
7673  store double %conv, ptr %0, align 8
7674  ret void
7675}
7676
7677; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7678define dso_local void @st_disjoint_align64_int32_t_double(i64 %ptr, i32 signext %str) {
7679; CHECK-P10-LABEL: st_disjoint_align64_int32_t_double:
7680; CHECK-P10:       # %bb.0: # %entry
7681; CHECK-P10-NEXT:    mtfprwa f0, r4
7682; CHECK-P10-NEXT:    pli r4, 244140625
7683; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
7684; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
7685; CHECK-P10-NEXT:    xscvsxddp f0, f0
7686; CHECK-P10-NEXT:    stfdx f0, r3, r4
7687; CHECK-P10-NEXT:    blr
7688;
7689; CHECK-P9-LABEL: st_disjoint_align64_int32_t_double:
7690; CHECK-P9:       # %bb.0: # %entry
7691; CHECK-P9-NEXT:    mtfprwa f0, r4
7692; CHECK-P9-NEXT:    lis r4, 3725
7693; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
7694; CHECK-P9-NEXT:    xscvsxddp f0, f0
7695; CHECK-P9-NEXT:    ori r4, r4, 19025
7696; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
7697; CHECK-P9-NEXT:    stfdx f0, r3, r4
7698; CHECK-P9-NEXT:    blr
7699;
7700; CHECK-P8-LABEL: st_disjoint_align64_int32_t_double:
7701; CHECK-P8:       # %bb.0: # %entry
7702; CHECK-P8-NEXT:    mtfprwa f0, r4
7703; CHECK-P8-NEXT:    lis r4, 3725
7704; CHECK-P8-NEXT:    rldicr r3, r3, 0, 23
7705; CHECK-P8-NEXT:    ori r4, r4, 19025
7706; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
7707; CHECK-P8-NEXT:    xscvsxddp f0, f0
7708; CHECK-P8-NEXT:    stfdx f0, r3, r4
7709; CHECK-P8-NEXT:    blr
7710entry:
7711  %and = and i64 %ptr, -1099511627776
7712  %conv = sitofp i32 %str to double
7713  %or = or i64 %and, 1000000000000
7714  %0 = inttoptr i64 %or to ptr
7715  store double %conv, ptr %0, align 4096
7716  ret void
7717}
7718
7719; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7720define dso_local void @st_cst_align16_int32_t_double(i32 signext %str) {
7721; CHECK-LABEL: st_cst_align16_int32_t_double:
7722; CHECK:       # %bb.0: # %entry
7723; CHECK-NEXT:    mtfprwa f0, r3
7724; CHECK-NEXT:    xscvsxddp f0, f0
7725; CHECK-NEXT:    stfd f0, 4080(0)
7726; CHECK-NEXT:    blr
7727entry:
7728  %conv = sitofp i32 %str to double
7729  store double %conv, ptr inttoptr (i64 4080 to ptr), align 16
7730  ret void
7731}
7732
7733; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7734define dso_local void @st_cst_align32_int32_t_double(i32 signext %str) {
7735; CHECK-LABEL: st_cst_align32_int32_t_double:
7736; CHECK:       # %bb.0: # %entry
7737; CHECK-NEXT:    mtfprwa f0, r3
7738; CHECK-NEXT:    lis r3, 153
7739; CHECK-NEXT:    xscvsxddp f0, f0
7740; CHECK-NEXT:    stfd f0, -27108(r3)
7741; CHECK-NEXT:    blr
7742entry:
7743  %conv = sitofp i32 %str to double
7744  store double %conv, ptr inttoptr (i64 9999900 to ptr), align 8
7745  ret void
7746}
7747
7748; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7749define dso_local void @st_cst_align64_int32_t_double(i32 signext %str) {
7750; CHECK-P10-LABEL: st_cst_align64_int32_t_double:
7751; CHECK-P10:       # %bb.0: # %entry
7752; CHECK-P10-NEXT:    mtfprwa f0, r3
7753; CHECK-P10-NEXT:    pli r3, 244140625
7754; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
7755; CHECK-P10-NEXT:    xscvsxddp f0, f0
7756; CHECK-P10-NEXT:    stfd f0, 0(r3)
7757; CHECK-P10-NEXT:    blr
7758;
7759; CHECK-P9-LABEL: st_cst_align64_int32_t_double:
7760; CHECK-P9:       # %bb.0: # %entry
7761; CHECK-P9-NEXT:    mtfprwa f0, r3
7762; CHECK-P9-NEXT:    lis r3, 3725
7763; CHECK-P9-NEXT:    xscvsxddp f0, f0
7764; CHECK-P9-NEXT:    ori r3, r3, 19025
7765; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
7766; CHECK-P9-NEXT:    stfd f0, 0(r3)
7767; CHECK-P9-NEXT:    blr
7768;
7769; CHECK-P8-LABEL: st_cst_align64_int32_t_double:
7770; CHECK-P8:       # %bb.0: # %entry
7771; CHECK-P8-NEXT:    mtfprwa f0, r3
7772; CHECK-P8-NEXT:    lis r3, 3725
7773; CHECK-P8-NEXT:    ori r3, r3, 19025
7774; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
7775; CHECK-P8-NEXT:    xscvsxddp f0, f0
7776; CHECK-P8-NEXT:    stfd f0, 0(r3)
7777; CHECK-P8-NEXT:    blr
7778entry:
7779  %conv = sitofp i32 %str to double
7780  store double %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
7781  ret void
7782}
7783