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