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