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:    plfd f0, 99999000(r3), 0
2520; CHECK-P10-NEXT:    xscvuxdsp f1, f0
2521; CHECK-P10-NEXT:    blr
2522;
2523; CHECK-PREP10-LABEL: ld_align32_float_uint64_t:
2524; CHECK-PREP10:       # %bb.0: # %entry
2525; CHECK-PREP10-NEXT:    lis r4, 1525
2526; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2527; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
2528; CHECK-PREP10-NEXT:    xscvuxdsp f1, f0
2529; CHECK-PREP10-NEXT:    blr
2530entry:
2531  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
2532  %0 = bitcast i8* %add.ptr to i64*
2533  %1 = load i64, i64* %0, align 8
2534  %conv = uitofp i64 %1 to float
2535  ret float %conv
2536}
2537
2538; Function Attrs: norecurse nounwind readonly uwtable willreturn
2539define dso_local float @ld_align64_float_uint64_t(i8* nocapture readonly %ptr) {
2540; CHECK-P10-LABEL: ld_align64_float_uint64_t:
2541; CHECK-P10:       # %bb.0: # %entry
2542; CHECK-P10-NEXT:    pli r4, 244140625
2543; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2544; CHECK-P10-NEXT:    lfdx f0, r3, r4
2545; CHECK-P10-NEXT:    xscvuxdsp f1, f0
2546; CHECK-P10-NEXT:    blr
2547;
2548; CHECK-PREP10-LABEL: ld_align64_float_uint64_t:
2549; CHECK-PREP10:       # %bb.0: # %entry
2550; CHECK-PREP10-NEXT:    lis r4, 3725
2551; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2552; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2553; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
2554; CHECK-PREP10-NEXT:    xscvuxdsp f1, f0
2555; CHECK-PREP10-NEXT:    blr
2556entry:
2557  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
2558  %0 = bitcast i8* %add.ptr to i64*
2559  %1 = load i64, i64* %0, align 8
2560  %conv = uitofp i64 %1 to float
2561  ret float %conv
2562}
2563
2564; Function Attrs: norecurse nounwind readonly uwtable willreturn
2565define dso_local float @ld_reg_float_uint64_t(i8* nocapture readonly %ptr, i64 %off) {
2566; CHECK-LABEL: ld_reg_float_uint64_t:
2567; CHECK:       # %bb.0: # %entry
2568; CHECK-NEXT:    lfdx f0, r3, r4
2569; CHECK-NEXT:    xscvuxdsp f1, f0
2570; CHECK-NEXT:    blr
2571entry:
2572  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
2573  %0 = bitcast i8* %add.ptr to i64*
2574  %1 = load i64, i64* %0, align 8
2575  %conv = uitofp i64 %1 to float
2576  ret float %conv
2577}
2578
2579; Function Attrs: norecurse nounwind readonly uwtable willreturn
2580define dso_local float @ld_or_float_uint64_t(i64 %ptr, i8 zeroext %off) {
2581; CHECK-LABEL: ld_or_float_uint64_t:
2582; CHECK:       # %bb.0: # %entry
2583; CHECK-NEXT:    or r3, r4, r3
2584; CHECK-NEXT:    lfd f0, 0(r3)
2585; CHECK-NEXT:    xscvuxdsp f1, f0
2586; CHECK-NEXT:    blr
2587entry:
2588  %conv = zext i8 %off to i64
2589  %or = or i64 %conv, %ptr
2590  %0 = inttoptr i64 %or to i64*
2591  %1 = load i64, i64* %0, align 8
2592  %conv1 = uitofp i64 %1 to float
2593  ret float %conv1
2594}
2595
2596; Function Attrs: norecurse nounwind readonly uwtable willreturn
2597define dso_local float @ld_not_disjoint16_float_uint64_t(i64 %ptr) {
2598; CHECK-LABEL: ld_not_disjoint16_float_uint64_t:
2599; CHECK:       # %bb.0: # %entry
2600; CHECK-NEXT:    ori r3, r3, 6
2601; CHECK-NEXT:    lfd f0, 0(r3)
2602; CHECK-NEXT:    xscvuxdsp f1, f0
2603; CHECK-NEXT:    blr
2604entry:
2605  %or = or i64 %ptr, 6
2606  %0 = inttoptr i64 %or to i64*
2607  %1 = load i64, i64* %0, align 8
2608  %conv = uitofp i64 %1 to float
2609  ret float %conv
2610}
2611
2612; Function Attrs: norecurse nounwind readonly uwtable willreturn
2613define dso_local float @ld_disjoint_align16_float_uint64_t(i64 %ptr) {
2614; CHECK-LABEL: ld_disjoint_align16_float_uint64_t:
2615; CHECK:       # %bb.0: # %entry
2616; CHECK-NEXT:    rldicr r3, r3, 0, 51
2617; CHECK-NEXT:    lfd f0, 24(r3)
2618; CHECK-NEXT:    xscvuxdsp f1, f0
2619; CHECK-NEXT:    blr
2620entry:
2621  %and = and i64 %ptr, -4096
2622  %or = or i64 %and, 24
2623  %0 = inttoptr i64 %or to i64*
2624  %1 = load i64, i64* %0, align 8
2625  %conv = uitofp i64 %1 to float
2626  ret float %conv
2627}
2628
2629; Function Attrs: norecurse nounwind readonly uwtable willreturn
2630define dso_local float @ld_not_disjoint32_float_uint64_t(i64 %ptr) {
2631; CHECK-LABEL: ld_not_disjoint32_float_uint64_t:
2632; CHECK:       # %bb.0: # %entry
2633; CHECK-NEXT:    ori r3, r3, 34463
2634; CHECK-NEXT:    oris r3, r3, 1
2635; CHECK-NEXT:    lfd f0, 0(r3)
2636; CHECK-NEXT:    xscvuxdsp f1, f0
2637; CHECK-NEXT:    blr
2638entry:
2639  %or = or i64 %ptr, 99999
2640  %0 = inttoptr i64 %or to i64*
2641  %1 = load i64, i64* %0, align 8
2642  %conv = uitofp i64 %1 to float
2643  ret float %conv
2644}
2645
2646; Function Attrs: norecurse nounwind readonly uwtable willreturn
2647define dso_local float @ld_disjoint_align32_float_uint64_t(i64 %ptr) {
2648; CHECK-P10-LABEL: ld_disjoint_align32_float_uint64_t:
2649; CHECK-P10:       # %bb.0: # %entry
2650; CHECK-P10-NEXT:    lis r4, -15264
2651; CHECK-P10-NEXT:    and r3, r3, r4
2652; CHECK-P10-NEXT:    plfd f0, 999990000(r3), 0
2653; CHECK-P10-NEXT:    xscvuxdsp f1, f0
2654; CHECK-P10-NEXT:    blr
2655;
2656; CHECK-P9-LABEL: ld_disjoint_align32_float_uint64_t:
2657; CHECK-P9:       # %bb.0: # %entry
2658; CHECK-P9-NEXT:    lis r4, -15264
2659; CHECK-P9-NEXT:    and r3, r3, r4
2660; CHECK-P9-NEXT:    lis r4, 15258
2661; CHECK-P9-NEXT:    ori r4, r4, 41712
2662; CHECK-P9-NEXT:    lfdx f0, r3, r4
2663; CHECK-P9-NEXT:    xscvuxdsp f1, f0
2664; CHECK-P9-NEXT:    blr
2665;
2666; CHECK-P8-LABEL: ld_disjoint_align32_float_uint64_t:
2667; CHECK-P8:       # %bb.0: # %entry
2668; CHECK-P8-NEXT:    lis r4, -15264
2669; CHECK-P8-NEXT:    lis r5, 15258
2670; CHECK-P8-NEXT:    and r3, r3, r4
2671; CHECK-P8-NEXT:    ori r4, r5, 41712
2672; CHECK-P8-NEXT:    lfdx f0, r3, r4
2673; CHECK-P8-NEXT:    xscvuxdsp f1, f0
2674; CHECK-P8-NEXT:    blr
2675entry:
2676  %and = and i64 %ptr, -1000341504
2677  %or = or i64 %and, 999990000
2678  %0 = inttoptr i64 %or to i64*
2679  %1 = load i64, i64* %0, align 16
2680  %conv = uitofp i64 %1 to float
2681  ret float %conv
2682}
2683
2684; Function Attrs: norecurse nounwind readonly uwtable willreturn
2685define dso_local float @ld_not_disjoint64_float_uint64_t(i64 %ptr) {
2686; CHECK-P10-LABEL: ld_not_disjoint64_float_uint64_t:
2687; CHECK-P10:       # %bb.0: # %entry
2688; CHECK-P10-NEXT:    pli r4, 232
2689; CHECK-P10-NEXT:    pli r5, 3567587329
2690; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2691; CHECK-P10-NEXT:    or r3, r3, r5
2692; CHECK-P10-NEXT:    lfd f0, 0(r3)
2693; CHECK-P10-NEXT:    xscvuxdsp f1, f0
2694; CHECK-P10-NEXT:    blr
2695;
2696; CHECK-PREP10-LABEL: ld_not_disjoint64_float_uint64_t:
2697; CHECK-PREP10:       # %bb.0: # %entry
2698; CHECK-PREP10-NEXT:    li r4, 29
2699; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2700; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2701; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2702; CHECK-PREP10-NEXT:    or r3, r3, r4
2703; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
2704; CHECK-PREP10-NEXT:    xscvuxdsp f1, f0
2705; CHECK-PREP10-NEXT:    blr
2706entry:
2707  %or = or i64 %ptr, 1000000000001
2708  %0 = inttoptr i64 %or to i64*
2709  %1 = load i64, i64* %0, align 8
2710  %conv = uitofp i64 %1 to float
2711  ret float %conv
2712}
2713
2714; Function Attrs: norecurse nounwind readonly uwtable willreturn
2715define dso_local float @ld_disjoint_align64_float_uint64_t(i64 %ptr) {
2716; CHECK-P10-LABEL: ld_disjoint_align64_float_uint64_t:
2717; CHECK-P10:       # %bb.0: # %entry
2718; CHECK-P10-NEXT:    pli r4, 244140625
2719; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2720; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2721; CHECK-P10-NEXT:    lfdx f0, r3, r4
2722; CHECK-P10-NEXT:    xscvuxdsp f1, f0
2723; CHECK-P10-NEXT:    blr
2724;
2725; CHECK-PREP10-LABEL: ld_disjoint_align64_float_uint64_t:
2726; CHECK-PREP10:       # %bb.0: # %entry
2727; CHECK-PREP10-NEXT:    lis r4, 3725
2728; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2729; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2730; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2731; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
2732; CHECK-PREP10-NEXT:    xscvuxdsp f1, f0
2733; CHECK-PREP10-NEXT:    blr
2734entry:
2735  %and = and i64 %ptr, -1099511627776
2736  %or = or i64 %and, 1000000000000
2737  %0 = inttoptr i64 %or to i64*
2738  %1 = load i64, i64* %0, align 4096
2739  %conv = uitofp i64 %1 to float
2740  ret float %conv
2741}
2742
2743; Function Attrs: norecurse nounwind readonly uwtable willreturn
2744define dso_local float @ld_cst_align16_float_uint64_t() {
2745; CHECK-LABEL: ld_cst_align16_float_uint64_t:
2746; CHECK:       # %bb.0: # %entry
2747; CHECK-NEXT:    lfd f0, 4080(0)
2748; CHECK-NEXT:    xscvuxdsp f1, f0
2749; CHECK-NEXT:    blr
2750entry:
2751  %0 = load i64, i64* inttoptr (i64 4080 to i64*), align 16
2752  %conv = uitofp i64 %0 to float
2753  ret float %conv
2754}
2755
2756; Function Attrs: norecurse nounwind readonly uwtable willreturn
2757define dso_local float @ld_cst_align32_float_uint64_t() {
2758; CHECK-LABEL: ld_cst_align32_float_uint64_t:
2759; CHECK:       # %bb.0: # %entry
2760; CHECK-NEXT:    lis r3, 153
2761; CHECK-NEXT:    lfd f0, -27108(r3)
2762; CHECK-NEXT:    xscvuxdsp f1, f0
2763; CHECK-NEXT:    blr
2764entry:
2765  %0 = load i64, i64* inttoptr (i64 9999900 to i64*), align 8
2766  %conv = uitofp i64 %0 to float
2767  ret float %conv
2768}
2769
2770; Function Attrs: norecurse nounwind readonly uwtable willreturn
2771define dso_local float @ld_cst_align64_float_uint64_t() {
2772; CHECK-P10-LABEL: ld_cst_align64_float_uint64_t:
2773; CHECK-P10:       # %bb.0: # %entry
2774; CHECK-P10-NEXT:    pli r3, 244140625
2775; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2776; CHECK-P10-NEXT:    lfd f0, 0(r3)
2777; CHECK-P10-NEXT:    xscvuxdsp f1, f0
2778; CHECK-P10-NEXT:    blr
2779;
2780; CHECK-PREP10-LABEL: ld_cst_align64_float_uint64_t:
2781; CHECK-PREP10:       # %bb.0: # %entry
2782; CHECK-PREP10-NEXT:    lis r3, 3725
2783; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2784; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2785; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
2786; CHECK-PREP10-NEXT:    xscvuxdsp f1, f0
2787; CHECK-PREP10-NEXT:    blr
2788entry:
2789  %0 = load i64, i64* inttoptr (i64 1000000000000 to i64*), align 4096
2790  %conv = uitofp i64 %0 to float
2791  ret float %conv
2792}
2793
2794; Function Attrs: norecurse nounwind readonly uwtable willreturn
2795define dso_local float @ld_0_float_int64_t(i64 %ptr) {
2796; CHECK-LABEL: ld_0_float_int64_t:
2797; CHECK:       # %bb.0: # %entry
2798; CHECK-NEXT:    lfd f0, 0(r3)
2799; CHECK-NEXT:    xscvsxdsp f1, f0
2800; CHECK-NEXT:    blr
2801entry:
2802  %0 = inttoptr i64 %ptr to i64*
2803  %1 = load i64, i64* %0, align 8
2804  %conv = sitofp i64 %1 to float
2805  ret float %conv
2806}
2807
2808; Function Attrs: norecurse nounwind readonly uwtable willreturn
2809define dso_local float @ld_align16_float_int64_t(i8* nocapture readonly %ptr) {
2810; CHECK-LABEL: ld_align16_float_int64_t:
2811; CHECK:       # %bb.0: # %entry
2812; CHECK-NEXT:    lfd f0, 8(r3)
2813; CHECK-NEXT:    xscvsxdsp f1, f0
2814; CHECK-NEXT:    blr
2815entry:
2816  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
2817  %0 = bitcast i8* %add.ptr to i64*
2818  %1 = load i64, i64* %0, align 8
2819  %conv = sitofp i64 %1 to float
2820  ret float %conv
2821}
2822
2823; Function Attrs: norecurse nounwind readonly uwtable willreturn
2824define dso_local float @ld_align32_float_int64_t(i8* nocapture readonly %ptr) {
2825; CHECK-P10-LABEL: ld_align32_float_int64_t:
2826; CHECK-P10:       # %bb.0: # %entry
2827; CHECK-P10-NEXT:    plfd f0, 99999000(r3), 0
2828; CHECK-P10-NEXT:    xscvsxdsp f1, f0
2829; CHECK-P10-NEXT:    blr
2830;
2831; CHECK-PREP10-LABEL: ld_align32_float_int64_t:
2832; CHECK-PREP10:       # %bb.0: # %entry
2833; CHECK-PREP10-NEXT:    lis r4, 1525
2834; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2835; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
2836; CHECK-PREP10-NEXT:    xscvsxdsp f1, f0
2837; CHECK-PREP10-NEXT:    blr
2838entry:
2839  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
2840  %0 = bitcast i8* %add.ptr to i64*
2841  %1 = load i64, i64* %0, align 8
2842  %conv = sitofp i64 %1 to float
2843  ret float %conv
2844}
2845
2846; Function Attrs: norecurse nounwind readonly uwtable willreturn
2847define dso_local float @ld_align64_float_int64_t(i8* nocapture readonly %ptr) {
2848; CHECK-P10-LABEL: ld_align64_float_int64_t:
2849; CHECK-P10:       # %bb.0: # %entry
2850; CHECK-P10-NEXT:    pli r4, 244140625
2851; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2852; CHECK-P10-NEXT:    lfdx f0, r3, r4
2853; CHECK-P10-NEXT:    xscvsxdsp f1, f0
2854; CHECK-P10-NEXT:    blr
2855;
2856; CHECK-PREP10-LABEL: ld_align64_float_int64_t:
2857; CHECK-PREP10:       # %bb.0: # %entry
2858; CHECK-PREP10-NEXT:    lis r4, 3725
2859; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2860; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2861; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
2862; CHECK-PREP10-NEXT:    xscvsxdsp f1, f0
2863; CHECK-PREP10-NEXT:    blr
2864entry:
2865  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
2866  %0 = bitcast i8* %add.ptr to i64*
2867  %1 = load i64, i64* %0, align 8
2868  %conv = sitofp i64 %1 to float
2869  ret float %conv
2870}
2871
2872; Function Attrs: norecurse nounwind readonly uwtable willreturn
2873define dso_local float @ld_reg_float_int64_t(i8* nocapture readonly %ptr, i64 %off) {
2874; CHECK-LABEL: ld_reg_float_int64_t:
2875; CHECK:       # %bb.0: # %entry
2876; CHECK-NEXT:    lfdx f0, r3, r4
2877; CHECK-NEXT:    xscvsxdsp f1, f0
2878; CHECK-NEXT:    blr
2879entry:
2880  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
2881  %0 = bitcast i8* %add.ptr to i64*
2882  %1 = load i64, i64* %0, align 8
2883  %conv = sitofp i64 %1 to float
2884  ret float %conv
2885}
2886
2887; Function Attrs: norecurse nounwind readonly uwtable willreturn
2888define dso_local float @ld_or_float_int64_t(i64 %ptr, i8 zeroext %off) {
2889; CHECK-LABEL: ld_or_float_int64_t:
2890; CHECK:       # %bb.0: # %entry
2891; CHECK-NEXT:    or r3, r4, r3
2892; CHECK-NEXT:    lfd f0, 0(r3)
2893; CHECK-NEXT:    xscvsxdsp f1, f0
2894; CHECK-NEXT:    blr
2895entry:
2896  %conv = zext i8 %off to i64
2897  %or = or i64 %conv, %ptr
2898  %0 = inttoptr i64 %or to i64*
2899  %1 = load i64, i64* %0, align 8
2900  %conv1 = sitofp i64 %1 to float
2901  ret float %conv1
2902}
2903
2904; Function Attrs: norecurse nounwind readonly uwtable willreturn
2905define dso_local float @ld_not_disjoint16_float_int64_t(i64 %ptr) {
2906; CHECK-LABEL: ld_not_disjoint16_float_int64_t:
2907; CHECK:       # %bb.0: # %entry
2908; CHECK-NEXT:    ori r3, r3, 6
2909; CHECK-NEXT:    lfd f0, 0(r3)
2910; CHECK-NEXT:    xscvsxdsp f1, f0
2911; CHECK-NEXT:    blr
2912entry:
2913  %or = or i64 %ptr, 6
2914  %0 = inttoptr i64 %or to i64*
2915  %1 = load i64, i64* %0, align 8
2916  %conv = sitofp i64 %1 to float
2917  ret float %conv
2918}
2919
2920; Function Attrs: norecurse nounwind readonly uwtable willreturn
2921define dso_local float @ld_disjoint_align16_float_int64_t(i64 %ptr) {
2922; CHECK-LABEL: ld_disjoint_align16_float_int64_t:
2923; CHECK:       # %bb.0: # %entry
2924; CHECK-NEXT:    rldicr r3, r3, 0, 51
2925; CHECK-NEXT:    lfd f0, 24(r3)
2926; CHECK-NEXT:    xscvsxdsp f1, f0
2927; CHECK-NEXT:    blr
2928entry:
2929  %and = and i64 %ptr, -4096
2930  %or = or i64 %and, 24
2931  %0 = inttoptr i64 %or to i64*
2932  %1 = load i64, i64* %0, align 8
2933  %conv = sitofp i64 %1 to float
2934  ret float %conv
2935}
2936
2937; Function Attrs: norecurse nounwind readonly uwtable willreturn
2938define dso_local float @ld_not_disjoint32_float_int64_t(i64 %ptr) {
2939; CHECK-LABEL: ld_not_disjoint32_float_int64_t:
2940; CHECK:       # %bb.0: # %entry
2941; CHECK-NEXT:    ori r3, r3, 34463
2942; CHECK-NEXT:    oris r3, r3, 1
2943; CHECK-NEXT:    lfd f0, 0(r3)
2944; CHECK-NEXT:    xscvsxdsp f1, f0
2945; CHECK-NEXT:    blr
2946entry:
2947  %or = or i64 %ptr, 99999
2948  %0 = inttoptr i64 %or to i64*
2949  %1 = load i64, i64* %0, align 8
2950  %conv = sitofp i64 %1 to float
2951  ret float %conv
2952}
2953
2954; Function Attrs: norecurse nounwind readonly uwtable willreturn
2955define dso_local float @ld_disjoint_align32_float_int64_t(i64 %ptr) {
2956; CHECK-P10-LABEL: ld_disjoint_align32_float_int64_t:
2957; CHECK-P10:       # %bb.0: # %entry
2958; CHECK-P10-NEXT:    lis r4, -15264
2959; CHECK-P10-NEXT:    and r3, r3, r4
2960; CHECK-P10-NEXT:    plfd f0, 999990000(r3), 0
2961; CHECK-P10-NEXT:    xscvsxdsp f1, f0
2962; CHECK-P10-NEXT:    blr
2963;
2964; CHECK-P9-LABEL: ld_disjoint_align32_float_int64_t:
2965; CHECK-P9:       # %bb.0: # %entry
2966; CHECK-P9-NEXT:    lis r4, -15264
2967; CHECK-P9-NEXT:    and r3, r3, r4
2968; CHECK-P9-NEXT:    lis r4, 15258
2969; CHECK-P9-NEXT:    ori r4, r4, 41712
2970; CHECK-P9-NEXT:    lfdx f0, r3, r4
2971; CHECK-P9-NEXT:    xscvsxdsp f1, f0
2972; CHECK-P9-NEXT:    blr
2973;
2974; CHECK-P8-LABEL: ld_disjoint_align32_float_int64_t:
2975; CHECK-P8:       # %bb.0: # %entry
2976; CHECK-P8-NEXT:    lis r4, -15264
2977; CHECK-P8-NEXT:    lis r5, 15258
2978; CHECK-P8-NEXT:    and r3, r3, r4
2979; CHECK-P8-NEXT:    ori r4, r5, 41712
2980; CHECK-P8-NEXT:    lfdx f0, r3, r4
2981; CHECK-P8-NEXT:    xscvsxdsp f1, f0
2982; CHECK-P8-NEXT:    blr
2983entry:
2984  %and = and i64 %ptr, -1000341504
2985  %or = or i64 %and, 999990000
2986  %0 = inttoptr i64 %or to i64*
2987  %1 = load i64, i64* %0, align 16
2988  %conv = sitofp i64 %1 to float
2989  ret float %conv
2990}
2991
2992; Function Attrs: norecurse nounwind readonly uwtable willreturn
2993define dso_local float @ld_not_disjoint64_float_int64_t(i64 %ptr) {
2994; CHECK-P10-LABEL: ld_not_disjoint64_float_int64_t:
2995; CHECK-P10:       # %bb.0: # %entry
2996; CHECK-P10-NEXT:    pli r4, 232
2997; CHECK-P10-NEXT:    pli r5, 3567587329
2998; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2999; CHECK-P10-NEXT:    or r3, r3, r5
3000; CHECK-P10-NEXT:    lfd f0, 0(r3)
3001; CHECK-P10-NEXT:    xscvsxdsp f1, f0
3002; CHECK-P10-NEXT:    blr
3003;
3004; CHECK-PREP10-LABEL: ld_not_disjoint64_float_int64_t:
3005; CHECK-PREP10:       # %bb.0: # %entry
3006; CHECK-PREP10-NEXT:    li r4, 29
3007; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
3008; CHECK-PREP10-NEXT:    oris r4, r4, 54437
3009; CHECK-PREP10-NEXT:    ori r4, r4, 4097
3010; CHECK-PREP10-NEXT:    or r3, r3, r4
3011; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
3012; CHECK-PREP10-NEXT:    xscvsxdsp f1, f0
3013; CHECK-PREP10-NEXT:    blr
3014entry:
3015  %or = or i64 %ptr, 1000000000001
3016  %0 = inttoptr i64 %or to i64*
3017  %1 = load i64, i64* %0, align 8
3018  %conv = sitofp i64 %1 to float
3019  ret float %conv
3020}
3021
3022; Function Attrs: norecurse nounwind readonly uwtable willreturn
3023define dso_local float @ld_disjoint_align64_float_int64_t(i64 %ptr) {
3024; CHECK-P10-LABEL: ld_disjoint_align64_float_int64_t:
3025; CHECK-P10:       # %bb.0: # %entry
3026; CHECK-P10-NEXT:    pli r4, 244140625
3027; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3028; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3029; CHECK-P10-NEXT:    lfdx f0, r3, r4
3030; CHECK-P10-NEXT:    xscvsxdsp f1, f0
3031; CHECK-P10-NEXT:    blr
3032;
3033; CHECK-PREP10-LABEL: ld_disjoint_align64_float_int64_t:
3034; CHECK-PREP10:       # %bb.0: # %entry
3035; CHECK-PREP10-NEXT:    lis r4, 3725
3036; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3037; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3038; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3039; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
3040; CHECK-PREP10-NEXT:    xscvsxdsp f1, f0
3041; CHECK-PREP10-NEXT:    blr
3042entry:
3043  %and = and i64 %ptr, -1099511627776
3044  %or = or i64 %and, 1000000000000
3045  %0 = inttoptr i64 %or to i64*
3046  %1 = load i64, i64* %0, align 4096
3047  %conv = sitofp i64 %1 to float
3048  ret float %conv
3049}
3050
3051; Function Attrs: norecurse nounwind readonly uwtable willreturn
3052define dso_local float @ld_cst_align16_float_int64_t() {
3053; CHECK-LABEL: ld_cst_align16_float_int64_t:
3054; CHECK:       # %bb.0: # %entry
3055; CHECK-NEXT:    lfd f0, 4080(0)
3056; CHECK-NEXT:    xscvsxdsp f1, f0
3057; CHECK-NEXT:    blr
3058entry:
3059  %0 = load i64, i64* inttoptr (i64 4080 to i64*), align 16
3060  %conv = sitofp i64 %0 to float
3061  ret float %conv
3062}
3063
3064; Function Attrs: norecurse nounwind readonly uwtable willreturn
3065define dso_local float @ld_cst_align32_float_int64_t() {
3066; CHECK-LABEL: ld_cst_align32_float_int64_t:
3067; CHECK:       # %bb.0: # %entry
3068; CHECK-NEXT:    lis r3, 153
3069; CHECK-NEXT:    lfd f0, -27108(r3)
3070; CHECK-NEXT:    xscvsxdsp f1, f0
3071; CHECK-NEXT:    blr
3072entry:
3073  %0 = load i64, i64* inttoptr (i64 9999900 to i64*), align 8
3074  %conv = sitofp i64 %0 to float
3075  ret float %conv
3076}
3077
3078; Function Attrs: norecurse nounwind readonly uwtable willreturn
3079define dso_local float @ld_cst_align64_float_int64_t() {
3080; CHECK-P10-LABEL: ld_cst_align64_float_int64_t:
3081; CHECK-P10:       # %bb.0: # %entry
3082; CHECK-P10-NEXT:    pli r3, 244140625
3083; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
3084; CHECK-P10-NEXT:    lfd f0, 0(r3)
3085; CHECK-P10-NEXT:    xscvsxdsp f1, f0
3086; CHECK-P10-NEXT:    blr
3087;
3088; CHECK-PREP10-LABEL: ld_cst_align64_float_int64_t:
3089; CHECK-PREP10:       # %bb.0: # %entry
3090; CHECK-PREP10-NEXT:    lis r3, 3725
3091; CHECK-PREP10-NEXT:    ori r3, r3, 19025
3092; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
3093; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
3094; CHECK-PREP10-NEXT:    xscvsxdsp f1, f0
3095; CHECK-PREP10-NEXT:    blr
3096entry:
3097  %0 = load i64, i64* inttoptr (i64 1000000000000 to i64*), align 4096
3098  %conv = sitofp i64 %0 to float
3099  ret float %conv
3100}
3101
3102; Function Attrs: norecurse nounwind readonly uwtable willreturn
3103define dso_local float @ld_0_float_float(i64 %ptr) {
3104; CHECK-LABEL: ld_0_float_float:
3105; CHECK:       # %bb.0: # %entry
3106; CHECK-NEXT:    lfs f1, 0(r3)
3107; CHECK-NEXT:    blr
3108entry:
3109  %0 = inttoptr i64 %ptr to float*
3110  %1 = load float, float* %0, align 4
3111  ret float %1
3112}
3113
3114; Function Attrs: norecurse nounwind readonly uwtable willreturn
3115define dso_local float @ld_align16_float_float(i8* nocapture readonly %ptr) {
3116; CHECK-LABEL: ld_align16_float_float:
3117; CHECK:       # %bb.0: # %entry
3118; CHECK-NEXT:    lfs f1, 8(r3)
3119; CHECK-NEXT:    blr
3120entry:
3121  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
3122  %0 = bitcast i8* %add.ptr to float*
3123  %1 = load float, float* %0, align 4
3124  ret float %1
3125}
3126
3127; Function Attrs: norecurse nounwind readonly uwtable willreturn
3128define dso_local float @ld_align32_float_float(i8* nocapture readonly %ptr) {
3129; CHECK-P10-LABEL: ld_align32_float_float:
3130; CHECK-P10:       # %bb.0: # %entry
3131; CHECK-P10-NEXT:    plfs f1, 99999000(r3), 0
3132; CHECK-P10-NEXT:    blr
3133;
3134; CHECK-PREP10-LABEL: ld_align32_float_float:
3135; CHECK-PREP10:       # %bb.0: # %entry
3136; CHECK-PREP10-NEXT:    lis r4, 1525
3137; CHECK-PREP10-NEXT:    ori r4, r4, 56600
3138; CHECK-PREP10-NEXT:    lfsx f1, r3, r4
3139; CHECK-PREP10-NEXT:    blr
3140entry:
3141  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
3142  %0 = bitcast i8* %add.ptr to float*
3143  %1 = load float, float* %0, align 4
3144  ret float %1
3145}
3146
3147; Function Attrs: norecurse nounwind readonly uwtable willreturn
3148define dso_local float @ld_align64_float_float(i8* nocapture readonly %ptr) {
3149; CHECK-P10-LABEL: ld_align64_float_float:
3150; CHECK-P10:       # %bb.0: # %entry
3151; CHECK-P10-NEXT:    pli r4, 244140625
3152; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3153; CHECK-P10-NEXT:    lfsx f1, r3, r4
3154; CHECK-P10-NEXT:    blr
3155;
3156; CHECK-PREP10-LABEL: ld_align64_float_float:
3157; CHECK-PREP10:       # %bb.0: # %entry
3158; CHECK-PREP10-NEXT:    lis r4, 3725
3159; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3160; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3161; CHECK-PREP10-NEXT:    lfsx f1, r3, r4
3162; CHECK-PREP10-NEXT:    blr
3163entry:
3164  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
3165  %0 = bitcast i8* %add.ptr to float*
3166  %1 = load float, float* %0, align 4
3167  ret float %1
3168}
3169
3170; Function Attrs: norecurse nounwind readonly uwtable willreturn
3171define dso_local float @ld_reg_float_float(i8* nocapture readonly %ptr, i64 %off) {
3172; CHECK-LABEL: ld_reg_float_float:
3173; CHECK:       # %bb.0: # %entry
3174; CHECK-NEXT:    lfsx f1, r3, r4
3175; CHECK-NEXT:    blr
3176entry:
3177  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
3178  %0 = bitcast i8* %add.ptr to float*
3179  %1 = load float, float* %0, align 4
3180  ret float %1
3181}
3182
3183; Function Attrs: norecurse nounwind readonly uwtable willreturn
3184define dso_local float @ld_or_float_float(i64 %ptr, i8 zeroext %off) {
3185; CHECK-LABEL: ld_or_float_float:
3186; CHECK:       # %bb.0: # %entry
3187; CHECK-NEXT:    or r3, r4, r3
3188; CHECK-NEXT:    lfs f1, 0(r3)
3189; CHECK-NEXT:    blr
3190entry:
3191  %conv = zext i8 %off to i64
3192  %or = or i64 %conv, %ptr
3193  %0 = inttoptr i64 %or to float*
3194  %1 = load float, float* %0, align 4
3195  ret float %1
3196}
3197
3198; Function Attrs: norecurse nounwind readonly uwtable willreturn
3199define dso_local float @ld_not_disjoint16_float_float(i64 %ptr) {
3200; CHECK-LABEL: ld_not_disjoint16_float_float:
3201; CHECK:       # %bb.0: # %entry
3202; CHECK-NEXT:    ori r3, r3, 6
3203; CHECK-NEXT:    lfs f1, 0(r3)
3204; CHECK-NEXT:    blr
3205entry:
3206  %or = or i64 %ptr, 6
3207  %0 = inttoptr i64 %or to float*
3208  %1 = load float, float* %0, align 4
3209  ret float %1
3210}
3211
3212; Function Attrs: norecurse nounwind readonly uwtable willreturn
3213define dso_local float @ld_disjoint_align16_float_float(i64 %ptr) {
3214; CHECK-LABEL: ld_disjoint_align16_float_float:
3215; CHECK:       # %bb.0: # %entry
3216; CHECK-NEXT:    rldicr r3, r3, 0, 51
3217; CHECK-NEXT:    lfs f1, 24(r3)
3218; CHECK-NEXT:    blr
3219entry:
3220  %and = and i64 %ptr, -4096
3221  %or = or i64 %and, 24
3222  %0 = inttoptr i64 %or to float*
3223  %1 = load float, float* %0, align 8
3224  ret float %1
3225}
3226
3227; Function Attrs: norecurse nounwind readonly uwtable willreturn
3228define dso_local float @ld_not_disjoint32_float_float(i64 %ptr) {
3229; CHECK-LABEL: ld_not_disjoint32_float_float:
3230; CHECK:       # %bb.0: # %entry
3231; CHECK-NEXT:    ori r3, r3, 34463
3232; CHECK-NEXT:    oris r3, r3, 1
3233; CHECK-NEXT:    lfs f1, 0(r3)
3234; CHECK-NEXT:    blr
3235entry:
3236  %or = or i64 %ptr, 99999
3237  %0 = inttoptr i64 %or to float*
3238  %1 = load float, float* %0, align 4
3239  ret float %1
3240}
3241
3242; Function Attrs: norecurse nounwind readonly uwtable willreturn
3243define dso_local float @ld_disjoint_align32_float_float(i64 %ptr) {
3244; CHECK-P10-LABEL: ld_disjoint_align32_float_float:
3245; CHECK-P10:       # %bb.0: # %entry
3246; CHECK-P10-NEXT:    lis r4, -15264
3247; CHECK-P10-NEXT:    and r3, r3, r4
3248; CHECK-P10-NEXT:    plfs f1, 999990000(r3), 0
3249; CHECK-P10-NEXT:    blr
3250;
3251; CHECK-P9-LABEL: ld_disjoint_align32_float_float:
3252; CHECK-P9:       # %bb.0: # %entry
3253; CHECK-P9-NEXT:    lis r4, -15264
3254; CHECK-P9-NEXT:    and r3, r3, r4
3255; CHECK-P9-NEXT:    lis r4, 15258
3256; CHECK-P9-NEXT:    ori r4, r4, 41712
3257; CHECK-P9-NEXT:    lfsx f1, r3, r4
3258; CHECK-P9-NEXT:    blr
3259;
3260; CHECK-P8-LABEL: ld_disjoint_align32_float_float:
3261; CHECK-P8:       # %bb.0: # %entry
3262; CHECK-P8-NEXT:    lis r4, -15264
3263; CHECK-P8-NEXT:    lis r5, 15258
3264; CHECK-P8-NEXT:    and r3, r3, r4
3265; CHECK-P8-NEXT:    ori r4, r5, 41712
3266; CHECK-P8-NEXT:    lfsx f1, r3, r4
3267; CHECK-P8-NEXT:    blr
3268entry:
3269  %and = and i64 %ptr, -1000341504
3270  %or = or i64 %and, 999990000
3271  %0 = inttoptr i64 %or to float*
3272  %1 = load float, float* %0, align 16
3273  ret float %1
3274}
3275
3276; Function Attrs: norecurse nounwind readonly uwtable willreturn
3277define dso_local float @ld_not_disjoint64_float_float(i64 %ptr) {
3278; CHECK-P10-LABEL: ld_not_disjoint64_float_float:
3279; CHECK-P10:       # %bb.0: # %entry
3280; CHECK-P10-NEXT:    pli r4, 232
3281; CHECK-P10-NEXT:    pli r5, 3567587329
3282; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
3283; CHECK-P10-NEXT:    or r3, r3, r5
3284; CHECK-P10-NEXT:    lfs f1, 0(r3)
3285; CHECK-P10-NEXT:    blr
3286;
3287; CHECK-PREP10-LABEL: ld_not_disjoint64_float_float:
3288; CHECK-PREP10:       # %bb.0: # %entry
3289; CHECK-PREP10-NEXT:    li r4, 29
3290; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
3291; CHECK-PREP10-NEXT:    oris r4, r4, 54437
3292; CHECK-PREP10-NEXT:    ori r4, r4, 4097
3293; CHECK-PREP10-NEXT:    or r3, r3, r4
3294; CHECK-PREP10-NEXT:    lfs f1, 0(r3)
3295; CHECK-PREP10-NEXT:    blr
3296entry:
3297  %or = or i64 %ptr, 1000000000001
3298  %0 = inttoptr i64 %or to float*
3299  %1 = load float, float* %0, align 4
3300  ret float %1
3301}
3302
3303; Function Attrs: norecurse nounwind readonly uwtable willreturn
3304define dso_local float @ld_disjoint_align64_float_float(i64 %ptr) {
3305; CHECK-P10-LABEL: ld_disjoint_align64_float_float:
3306; CHECK-P10:       # %bb.0: # %entry
3307; CHECK-P10-NEXT:    pli r4, 244140625
3308; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3309; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3310; CHECK-P10-NEXT:    lfsx f1, r3, r4
3311; CHECK-P10-NEXT:    blr
3312;
3313; CHECK-PREP10-LABEL: ld_disjoint_align64_float_float:
3314; CHECK-PREP10:       # %bb.0: # %entry
3315; CHECK-PREP10-NEXT:    lis r4, 3725
3316; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3317; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3318; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3319; CHECK-PREP10-NEXT:    lfsx f1, r3, r4
3320; CHECK-PREP10-NEXT:    blr
3321entry:
3322  %and = and i64 %ptr, -1099511627776
3323  %or = or i64 %and, 1000000000000
3324  %0 = inttoptr i64 %or to float*
3325  %1 = load float, float* %0, align 4096
3326  ret float %1
3327}
3328
3329; Function Attrs: norecurse nounwind readonly uwtable willreturn
3330define dso_local float @ld_cst_align16_float_float() {
3331; CHECK-LABEL: ld_cst_align16_float_float:
3332; CHECK:       # %bb.0: # %entry
3333; CHECK-NEXT:    lfs f1, 4080(0)
3334; CHECK-NEXT:    blr
3335entry:
3336  %0 = load float, float* inttoptr (i64 4080 to float*), align 16
3337  ret float %0
3338}
3339
3340; Function Attrs: norecurse nounwind readonly uwtable willreturn
3341define dso_local float @ld_cst_align32_float_float() {
3342; CHECK-LABEL: ld_cst_align32_float_float:
3343; CHECK:       # %bb.0: # %entry
3344; CHECK-NEXT:    lis r3, 153
3345; CHECK-NEXT:    lfs f1, -27108(r3)
3346; CHECK-NEXT:    blr
3347entry:
3348  %0 = load float, float* inttoptr (i64 9999900 to float*), align 4
3349  ret float %0
3350}
3351
3352; Function Attrs: norecurse nounwind readonly uwtable willreturn
3353define dso_local float @ld_cst_align64_float_float() {
3354; CHECK-P10-LABEL: ld_cst_align64_float_float:
3355; CHECK-P10:       # %bb.0: # %entry
3356; CHECK-P10-NEXT:    pli r3, 244140625
3357; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
3358; CHECK-P10-NEXT:    lfs f1, 0(r3)
3359; CHECK-P10-NEXT:    blr
3360;
3361; CHECK-PREP10-LABEL: ld_cst_align64_float_float:
3362; CHECK-PREP10:       # %bb.0: # %entry
3363; CHECK-PREP10-NEXT:    lis r3, 3725
3364; CHECK-PREP10-NEXT:    ori r3, r3, 19025
3365; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
3366; CHECK-PREP10-NEXT:    lfs f1, 0(r3)
3367; CHECK-PREP10-NEXT:    blr
3368entry:
3369  %0 = load float, float* inttoptr (i64 1000000000000 to float*), align 4096
3370  ret float %0
3371}
3372
3373; Function Attrs: norecurse nounwind readonly uwtable willreturn
3374define dso_local float @ld_0_float_double(i64 %ptr) {
3375; CHECK-LABEL: ld_0_float_double:
3376; CHECK:       # %bb.0: # %entry
3377; CHECK-NEXT:    lfd f0, 0(r3)
3378; CHECK-NEXT:    xsrsp f1, f0
3379; CHECK-NEXT:    blr
3380entry:
3381  %0 = inttoptr i64 %ptr to double*
3382  %1 = load double, double* %0, align 8
3383  %conv = fptrunc double %1 to float
3384  ret float %conv
3385}
3386
3387; Function Attrs: norecurse nounwind readonly uwtable willreturn
3388define dso_local float @ld_align16_float_double(i8* nocapture readonly %ptr) {
3389; CHECK-LABEL: ld_align16_float_double:
3390; CHECK:       # %bb.0: # %entry
3391; CHECK-NEXT:    lfd f0, 8(r3)
3392; CHECK-NEXT:    xsrsp f1, f0
3393; CHECK-NEXT:    blr
3394entry:
3395  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
3396  %0 = bitcast i8* %add.ptr to double*
3397  %1 = load double, double* %0, align 8
3398  %conv = fptrunc double %1 to float
3399  ret float %conv
3400}
3401
3402; Function Attrs: norecurse nounwind readonly uwtable willreturn
3403define dso_local float @ld_align32_float_double(i8* nocapture readonly %ptr) {
3404; CHECK-P10-LABEL: ld_align32_float_double:
3405; CHECK-P10:       # %bb.0: # %entry
3406; CHECK-P10-NEXT:    plfd f0, 99999000(r3), 0
3407; CHECK-P10-NEXT:    xsrsp f1, f0
3408; CHECK-P10-NEXT:    blr
3409;
3410; CHECK-PREP10-LABEL: ld_align32_float_double:
3411; CHECK-PREP10:       # %bb.0: # %entry
3412; CHECK-PREP10-NEXT:    lis r4, 1525
3413; CHECK-PREP10-NEXT:    ori r4, r4, 56600
3414; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
3415; CHECK-PREP10-NEXT:    xsrsp f1, f0
3416; CHECK-PREP10-NEXT:    blr
3417entry:
3418  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
3419  %0 = bitcast i8* %add.ptr to double*
3420  %1 = load double, double* %0, align 8
3421  %conv = fptrunc double %1 to float
3422  ret float %conv
3423}
3424
3425; Function Attrs: norecurse nounwind readonly uwtable willreturn
3426define dso_local float @ld_align64_float_double(i8* nocapture readonly %ptr) {
3427; CHECK-P10-LABEL: ld_align64_float_double:
3428; CHECK-P10:       # %bb.0: # %entry
3429; CHECK-P10-NEXT:    pli r4, 244140625
3430; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3431; CHECK-P10-NEXT:    lfdx f0, r3, r4
3432; CHECK-P10-NEXT:    xsrsp f1, f0
3433; CHECK-P10-NEXT:    blr
3434;
3435; CHECK-PREP10-LABEL: ld_align64_float_double:
3436; CHECK-PREP10:       # %bb.0: # %entry
3437; CHECK-PREP10-NEXT:    lis r4, 3725
3438; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3439; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3440; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
3441; CHECK-PREP10-NEXT:    xsrsp f1, f0
3442; CHECK-PREP10-NEXT:    blr
3443entry:
3444  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
3445  %0 = bitcast i8* %add.ptr to double*
3446  %1 = load double, double* %0, align 8
3447  %conv = fptrunc double %1 to float
3448  ret float %conv
3449}
3450
3451; Function Attrs: norecurse nounwind readonly uwtable willreturn
3452define dso_local float @ld_reg_float_double(i8* nocapture readonly %ptr, i64 %off) {
3453; CHECK-LABEL: ld_reg_float_double:
3454; CHECK:       # %bb.0: # %entry
3455; CHECK-NEXT:    lfdx f0, r3, r4
3456; CHECK-NEXT:    xsrsp f1, f0
3457; CHECK-NEXT:    blr
3458entry:
3459  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
3460  %0 = bitcast i8* %add.ptr to double*
3461  %1 = load double, double* %0, align 8
3462  %conv = fptrunc double %1 to float
3463  ret float %conv
3464}
3465
3466; Function Attrs: norecurse nounwind readonly uwtable willreturn
3467define dso_local float @ld_or_float_double(i64 %ptr, i8 zeroext %off) {
3468; CHECK-LABEL: ld_or_float_double:
3469; CHECK:       # %bb.0: # %entry
3470; CHECK-NEXT:    or r3, r4, r3
3471; CHECK-NEXT:    lfd f0, 0(r3)
3472; CHECK-NEXT:    xsrsp f1, f0
3473; CHECK-NEXT:    blr
3474entry:
3475  %conv = zext i8 %off to i64
3476  %or = or i64 %conv, %ptr
3477  %0 = inttoptr i64 %or to double*
3478  %1 = load double, double* %0, align 8
3479  %conv1 = fptrunc double %1 to float
3480  ret float %conv1
3481}
3482
3483; Function Attrs: norecurse nounwind readonly uwtable willreturn
3484define dso_local float @ld_not_disjoint16_float_double(i64 %ptr) {
3485; CHECK-LABEL: ld_not_disjoint16_float_double:
3486; CHECK:       # %bb.0: # %entry
3487; CHECK-NEXT:    ori r3, r3, 6
3488; CHECK-NEXT:    lfd f0, 0(r3)
3489; CHECK-NEXT:    xsrsp f1, f0
3490; CHECK-NEXT:    blr
3491entry:
3492  %or = or i64 %ptr, 6
3493  %0 = inttoptr i64 %or to double*
3494  %1 = load double, double* %0, align 8
3495  %conv = fptrunc double %1 to float
3496  ret float %conv
3497}
3498
3499; Function Attrs: norecurse nounwind readonly uwtable willreturn
3500define dso_local float @ld_disjoint_align16_float_double(i64 %ptr) {
3501; CHECK-LABEL: ld_disjoint_align16_float_double:
3502; CHECK:       # %bb.0: # %entry
3503; CHECK-NEXT:    rldicr r3, r3, 0, 51
3504; CHECK-NEXT:    lfd f0, 24(r3)
3505; CHECK-NEXT:    xsrsp f1, f0
3506; CHECK-NEXT:    blr
3507entry:
3508  %and = and i64 %ptr, -4096
3509  %or = or i64 %and, 24
3510  %0 = inttoptr i64 %or to double*
3511  %1 = load double, double* %0, align 8
3512  %conv = fptrunc double %1 to float
3513  ret float %conv
3514}
3515
3516; Function Attrs: norecurse nounwind readonly uwtable willreturn
3517define dso_local float @ld_not_disjoint32_float_double(i64 %ptr) {
3518; CHECK-LABEL: ld_not_disjoint32_float_double:
3519; CHECK:       # %bb.0: # %entry
3520; CHECK-NEXT:    ori r3, r3, 34463
3521; CHECK-NEXT:    oris r3, r3, 1
3522; CHECK-NEXT:    lfd f0, 0(r3)
3523; CHECK-NEXT:    xsrsp f1, f0
3524; CHECK-NEXT:    blr
3525entry:
3526  %or = or i64 %ptr, 99999
3527  %0 = inttoptr i64 %or to double*
3528  %1 = load double, double* %0, align 8
3529  %conv = fptrunc double %1 to float
3530  ret float %conv
3531}
3532
3533; Function Attrs: norecurse nounwind readonly uwtable willreturn
3534define dso_local float @ld_disjoint_align32_float_double(i64 %ptr) {
3535; CHECK-P10-LABEL: ld_disjoint_align32_float_double:
3536; CHECK-P10:       # %bb.0: # %entry
3537; CHECK-P10-NEXT:    lis r4, -15264
3538; CHECK-P10-NEXT:    and r3, r3, r4
3539; CHECK-P10-NEXT:    plfd f0, 999990000(r3), 0
3540; CHECK-P10-NEXT:    xsrsp f1, f0
3541; CHECK-P10-NEXT:    blr
3542;
3543; CHECK-P9-LABEL: ld_disjoint_align32_float_double:
3544; CHECK-P9:       # %bb.0: # %entry
3545; CHECK-P9-NEXT:    lis r4, -15264
3546; CHECK-P9-NEXT:    and r3, r3, r4
3547; CHECK-P9-NEXT:    lis r4, 15258
3548; CHECK-P9-NEXT:    ori r4, r4, 41712
3549; CHECK-P9-NEXT:    lfdx f0, r3, r4
3550; CHECK-P9-NEXT:    xsrsp f1, f0
3551; CHECK-P9-NEXT:    blr
3552;
3553; CHECK-P8-LABEL: ld_disjoint_align32_float_double:
3554; CHECK-P8:       # %bb.0: # %entry
3555; CHECK-P8-NEXT:    lis r4, -15264
3556; CHECK-P8-NEXT:    lis r5, 15258
3557; CHECK-P8-NEXT:    and r3, r3, r4
3558; CHECK-P8-NEXT:    ori r4, r5, 41712
3559; CHECK-P8-NEXT:    lfdx f0, r3, r4
3560; CHECK-P8-NEXT:    xsrsp f1, f0
3561; CHECK-P8-NEXT:    blr
3562entry:
3563  %and = and i64 %ptr, -1000341504
3564  %or = or i64 %and, 999990000
3565  %0 = inttoptr i64 %or to double*
3566  %1 = load double, double* %0, align 16
3567  %conv = fptrunc double %1 to float
3568  ret float %conv
3569}
3570
3571; Function Attrs: norecurse nounwind readonly uwtable willreturn
3572define dso_local float @ld_not_disjoint64_float_double(i64 %ptr) {
3573; CHECK-P10-LABEL: ld_not_disjoint64_float_double:
3574; CHECK-P10:       # %bb.0: # %entry
3575; CHECK-P10-NEXT:    pli r4, 232
3576; CHECK-P10-NEXT:    pli r5, 3567587329
3577; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
3578; CHECK-P10-NEXT:    or r3, r3, r5
3579; CHECK-P10-NEXT:    lfd f0, 0(r3)
3580; CHECK-P10-NEXT:    xsrsp f1, f0
3581; CHECK-P10-NEXT:    blr
3582;
3583; CHECK-PREP10-LABEL: ld_not_disjoint64_float_double:
3584; CHECK-PREP10:       # %bb.0: # %entry
3585; CHECK-PREP10-NEXT:    li r4, 29
3586; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
3587; CHECK-PREP10-NEXT:    oris r4, r4, 54437
3588; CHECK-PREP10-NEXT:    ori r4, r4, 4097
3589; CHECK-PREP10-NEXT:    or r3, r3, r4
3590; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
3591; CHECK-PREP10-NEXT:    xsrsp f1, f0
3592; CHECK-PREP10-NEXT:    blr
3593entry:
3594  %or = or i64 %ptr, 1000000000001
3595  %0 = inttoptr i64 %or to double*
3596  %1 = load double, double* %0, align 8
3597  %conv = fptrunc double %1 to float
3598  ret float %conv
3599}
3600
3601; Function Attrs: norecurse nounwind readonly uwtable willreturn
3602define dso_local float @ld_disjoint_align64_float_double(i64 %ptr) {
3603; CHECK-P10-LABEL: ld_disjoint_align64_float_double:
3604; CHECK-P10:       # %bb.0: # %entry
3605; CHECK-P10-NEXT:    pli r4, 244140625
3606; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
3607; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3608; CHECK-P10-NEXT:    lfdx f0, r3, r4
3609; CHECK-P10-NEXT:    xsrsp f1, f0
3610; CHECK-P10-NEXT:    blr
3611;
3612; CHECK-PREP10-LABEL: ld_disjoint_align64_float_double:
3613; CHECK-PREP10:       # %bb.0: # %entry
3614; CHECK-PREP10-NEXT:    lis r4, 3725
3615; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
3616; CHECK-PREP10-NEXT:    ori r4, r4, 19025
3617; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
3618; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
3619; CHECK-PREP10-NEXT:    xsrsp f1, f0
3620; CHECK-PREP10-NEXT:    blr
3621entry:
3622  %and = and i64 %ptr, -1099511627776
3623  %or = or i64 %and, 1000000000000
3624  %0 = inttoptr i64 %or to double*
3625  %1 = load double, double* %0, align 4096
3626  %conv = fptrunc double %1 to float
3627  ret float %conv
3628}
3629
3630; Function Attrs: norecurse nounwind readonly uwtable willreturn
3631define dso_local float @ld_cst_align16_float_double() {
3632; CHECK-LABEL: ld_cst_align16_float_double:
3633; CHECK:       # %bb.0: # %entry
3634; CHECK-NEXT:    lfd f0, 4080(0)
3635; CHECK-NEXT:    xsrsp f1, f0
3636; CHECK-NEXT:    blr
3637entry:
3638  %0 = load double, double* inttoptr (i64 4080 to double*), align 16
3639  %conv = fptrunc double %0 to float
3640  ret float %conv
3641}
3642
3643; Function Attrs: norecurse nounwind readonly uwtable willreturn
3644define dso_local float @ld_cst_align32_float_double() {
3645; CHECK-LABEL: ld_cst_align32_float_double:
3646; CHECK:       # %bb.0: # %entry
3647; CHECK-NEXT:    lis r3, 153
3648; CHECK-NEXT:    lfd f0, -27108(r3)
3649; CHECK-NEXT:    xsrsp f1, f0
3650; CHECK-NEXT:    blr
3651entry:
3652  %0 = load double, double* inttoptr (i64 9999900 to double*), align 8
3653  %conv = fptrunc double %0 to float
3654  ret float %conv
3655}
3656
3657; Function Attrs: norecurse nounwind readonly uwtable willreturn
3658define dso_local float @ld_cst_align64_float_double() {
3659; CHECK-P10-LABEL: ld_cst_align64_float_double:
3660; CHECK-P10:       # %bb.0: # %entry
3661; CHECK-P10-NEXT:    pli r3, 244140625
3662; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
3663; CHECK-P10-NEXT:    lfd f0, 0(r3)
3664; CHECK-P10-NEXT:    xsrsp f1, f0
3665; CHECK-P10-NEXT:    blr
3666;
3667; CHECK-PREP10-LABEL: ld_cst_align64_float_double:
3668; CHECK-PREP10:       # %bb.0: # %entry
3669; CHECK-PREP10-NEXT:    lis r3, 3725
3670; CHECK-PREP10-NEXT:    ori r3, r3, 19025
3671; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
3672; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
3673; CHECK-PREP10-NEXT:    xsrsp f1, f0
3674; CHECK-PREP10-NEXT:    blr
3675entry:
3676  %0 = load double, double* inttoptr (i64 1000000000000 to double*), align 4096
3677  %conv = fptrunc double %0 to float
3678  ret float %conv
3679}
3680
3681; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
3682define dso_local void @st_0_float_uint8_t(i64 %ptr, float %str) {
3683; CHECK-POSTP8-LABEL: st_0_float_uint8_t:
3684; CHECK-POSTP8:       # %bb.0: # %entry
3685; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
3686; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
3687; CHECK-POSTP8-NEXT:    blr
3688;
3689; CHECK-P8-LABEL: st_0_float_uint8_t:
3690; CHECK-P8:       # %bb.0: # %entry
3691; CHECK-P8-NEXT:    xscvdpsxws f0, f1
3692; CHECK-P8-NEXT:    mffprwz r4, f0
3693; CHECK-P8-NEXT:    stb r4, 0(r3)
3694; CHECK-P8-NEXT:    blr
3695entry:
3696  %conv = fptoui float %str to i8
3697  %0 = inttoptr i64 %ptr to i8*
3698  store i8 %conv, i8* %0, align 1
3699  ret void
3700}
3701
3702; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
3703define dso_local void @st_align16_float_uint8_t(i8* nocapture %ptr, float %str) {
3704; CHECK-POSTP8-LABEL: st_align16_float_uint8_t:
3705; CHECK-POSTP8:       # %bb.0: # %entry
3706; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
3707; CHECK-POSTP8-NEXT:    addi r3, r3, 8
3708; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
3709; CHECK-POSTP8-NEXT:    blr
3710;
3711; CHECK-P8-LABEL: st_align16_float_uint8_t:
3712; CHECK-P8:       # %bb.0: # %entry
3713; CHECK-P8-NEXT:    xscvdpsxws f0, f1
3714; CHECK-P8-NEXT:    mffprwz r4, f0
3715; CHECK-P8-NEXT:    stb r4, 8(r3)
3716; CHECK-P8-NEXT:    blr
3717entry:
3718  %conv = fptoui float %str to i8
3719  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
3720  store i8 %conv, i8* %add.ptr, align 1
3721  ret void
3722}
3723
3724; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
3725define dso_local void @st_align32_float_uint8_t(i8* nocapture %ptr, float %str) {
3726; CHECK-P10-LABEL: st_align32_float_uint8_t:
3727; CHECK-P10:       # %bb.0: # %entry
3728; CHECK-P10-NEXT:    xscvdpuxws f0, f1
3729; CHECK-P10-NEXT:    pli r4, 99999000
3730; CHECK-P10-NEXT:    stxsibx f0, r3, r4
3731; CHECK-P10-NEXT:    blr
3732;
3733; CHECK-P9-LABEL: st_align32_float_uint8_t:
3734; CHECK-P9:       # %bb.0: # %entry
3735; CHECK-P9-NEXT:    xscvdpuxws f0, f1
3736; CHECK-P9-NEXT:    lis r4, 1525
3737; CHECK-P9-NEXT:    ori r4, r4, 56600
3738; CHECK-P9-NEXT:    stxsibx f0, r3, r4
3739; CHECK-P9-NEXT:    blr
3740;
3741; CHECK-P8-LABEL: st_align32_float_uint8_t:
3742; CHECK-P8:       # %bb.0: # %entry
3743; CHECK-P8-NEXT:    xscvdpsxws f0, f1
3744; CHECK-P8-NEXT:    lis r4, 1525
3745; CHECK-P8-NEXT:    ori r4, r4, 56600
3746; CHECK-P8-NEXT:    mffprwz r5, f0
3747; CHECK-P8-NEXT:    stbx r5, r3, r4
3748; CHECK-P8-NEXT:    blr
3749entry:
3750  %conv = fptoui float %str to i8
3751  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
3752  store i8 %conv, i8* %add.ptr, align 1
3753  ret void
3754}
3755
3756; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
3757define dso_local void @st_align64_float_uint8_t(i8* nocapture %ptr, float %str) {
3758; CHECK-P10-LABEL: st_align64_float_uint8_t:
3759; CHECK-P10:       # %bb.0: # %entry
3760; CHECK-P10-NEXT:    xscvdpuxws f0, f1
3761; CHECK-P10-NEXT:    pli r4, 244140625
3762; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
3763; CHECK-P10-NEXT:    stxsibx f0, r3, r4
3764; CHECK-P10-NEXT:    blr
3765;
3766; CHECK-P9-LABEL: st_align64_float_uint8_t:
3767; CHECK-P9:       # %bb.0: # %entry
3768; CHECK-P9-NEXT:    xscvdpuxws f0, f1
3769; CHECK-P9-NEXT:    lis r4, 3725
3770; CHECK-P9-NEXT:    ori r4, r4, 19025
3771; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
3772; CHECK-P9-NEXT:    stxsibx f0, r3, r4
3773; CHECK-P9-NEXT:    blr
3774;
3775; CHECK-P8-LABEL: st_align64_float_uint8_t:
3776; CHECK-P8:       # %bb.0: # %entry
3777; CHECK-P8-NEXT:    xscvdpsxws f0, f1
3778; CHECK-P8-NEXT:    lis r4, 3725
3779; CHECK-P8-NEXT:    ori r4, r4, 19025
3780; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
3781; CHECK-P8-NEXT:    mffprwz r5, f0
3782; CHECK-P8-NEXT:    stbx r5, r3, r4
3783; CHECK-P8-NEXT:    blr
3784entry:
3785  %conv = fptoui float %str to i8
3786  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
3787  store i8 %conv, i8* %add.ptr, align 1
3788  ret void
3789}
3790
3791; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
3792define dso_local void @st_reg_float_uint8_t(i8* nocapture %ptr, i64 %off, float %str) {
3793; CHECK-POSTP8-LABEL: st_reg_float_uint8_t:
3794; CHECK-POSTP8:       # %bb.0: # %entry
3795; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
3796; CHECK-POSTP8-NEXT:    stxsibx f0, r3, r4
3797; CHECK-POSTP8-NEXT:    blr
3798;
3799; CHECK-P8-LABEL: st_reg_float_uint8_t:
3800; CHECK-P8:       # %bb.0: # %entry
3801; CHECK-P8-NEXT:    xscvdpsxws f0, f1
3802; CHECK-P8-NEXT:    mffprwz r5, f0
3803; CHECK-P8-NEXT:    stbx r5, r3, r4
3804; CHECK-P8-NEXT:    blr
3805entry:
3806  %conv = fptoui float %str to i8
3807  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
3808  store i8 %conv, i8* %add.ptr, align 1
3809  ret void
3810}
3811
3812; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
3813define dso_local void @st_or1_float_uint8_t(i64 %ptr, i8 zeroext %off, float %str) {
3814; CHECK-POSTP8-LABEL: st_or1_float_uint8_t:
3815; CHECK-POSTP8:       # %bb.0: # %entry
3816; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
3817; CHECK-POSTP8-NEXT:    or r3, r4, r3
3818; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
3819; CHECK-POSTP8-NEXT:    blr
3820;
3821; CHECK-P8-LABEL: st_or1_float_uint8_t:
3822; CHECK-P8:       # %bb.0: # %entry
3823; CHECK-P8-NEXT:    xscvdpsxws f0, f1
3824; CHECK-P8-NEXT:    or r3, r4, r3
3825; CHECK-P8-NEXT:    mffprwz r5, f0
3826; CHECK-P8-NEXT:    stb r5, 0(r3)
3827; CHECK-P8-NEXT:    blr
3828entry:
3829  %conv = fptoui float %str to i8
3830  %conv1 = zext i8 %off to i64
3831  %or = or i64 %conv1, %ptr
3832  %0 = inttoptr i64 %or to i8*
3833  store i8 %conv, i8* %0, align 1
3834  ret void
3835}
3836
3837; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
3838define dso_local void @st_not_disjoint16_float_uint8_t(i64 %ptr, float %str) {
3839; CHECK-POSTP8-LABEL: st_not_disjoint16_float_uint8_t:
3840; CHECK-POSTP8:       # %bb.0: # %entry
3841; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
3842; CHECK-POSTP8-NEXT:    ori r3, r3, 6
3843; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
3844; CHECK-POSTP8-NEXT:    blr
3845;
3846; CHECK-P8-LABEL: st_not_disjoint16_float_uint8_t:
3847; CHECK-P8:       # %bb.0: # %entry
3848; CHECK-P8-NEXT:    xscvdpsxws f0, f1
3849; CHECK-P8-NEXT:    ori r3, r3, 6
3850; CHECK-P8-NEXT:    mffprwz r4, f0
3851; CHECK-P8-NEXT:    stb r4, 0(r3)
3852; CHECK-P8-NEXT:    blr
3853entry:
3854  %conv = fptoui float %str to i8
3855  %or = or i64 %ptr, 6
3856  %0 = inttoptr i64 %or to i8*
3857  store i8 %conv, i8* %0, align 1
3858  ret void
3859}
3860
3861; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
3862define dso_local void @st_disjoint_align16_float_uint8_t(i64 %ptr, float %str) {
3863; CHECK-POSTP8-LABEL: st_disjoint_align16_float_uint8_t:
3864; CHECK-POSTP8:       # %bb.0: # %entry
3865; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
3866; CHECK-POSTP8-NEXT:    rldicr r3, r3, 0, 51
3867; CHECK-POSTP8-NEXT:    ori r3, r3, 24
3868; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
3869; CHECK-POSTP8-NEXT:    blr
3870;
3871; CHECK-P8-LABEL: st_disjoint_align16_float_uint8_t:
3872; CHECK-P8:       # %bb.0: # %entry
3873; CHECK-P8-NEXT:    xscvdpsxws f0, f1
3874; CHECK-P8-NEXT:    rldicr r3, r3, 0, 51
3875; CHECK-P8-NEXT:    mffprwz r4, f0
3876; CHECK-P8-NEXT:    stb r4, 24(r3)
3877; CHECK-P8-NEXT:    blr
3878entry:
3879  %and = and i64 %ptr, -4096
3880  %conv = fptoui float %str to i8
3881  %or = or i64 %and, 24
3882  %0 = inttoptr i64 %or to i8*
3883  store i8 %conv, i8* %0, align 8
3884  ret void
3885}
3886
3887; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
3888define dso_local void @st_not_disjoint32_float_uint8_t(i64 %ptr, float %str) {
3889; CHECK-POSTP8-LABEL: st_not_disjoint32_float_uint8_t:
3890; CHECK-POSTP8:       # %bb.0: # %entry
3891; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
3892; CHECK-POSTP8-NEXT:    ori r3, r3, 34463
3893; CHECK-POSTP8-NEXT:    oris r3, r3, 1
3894; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
3895; CHECK-POSTP8-NEXT:    blr
3896;
3897; CHECK-P8-LABEL: st_not_disjoint32_float_uint8_t:
3898; CHECK-P8:       # %bb.0: # %entry
3899; CHECK-P8-NEXT:    xscvdpsxws f0, f1
3900; CHECK-P8-NEXT:    ori r3, r3, 34463
3901; CHECK-P8-NEXT:    oris r3, r3, 1
3902; CHECK-P8-NEXT:    mffprwz r4, f0
3903; CHECK-P8-NEXT:    stb r4, 0(r3)
3904; CHECK-P8-NEXT:    blr
3905entry:
3906  %conv = fptoui float %str to i8
3907  %or = or i64 %ptr, 99999
3908  %0 = inttoptr i64 %or to i8*
3909  store i8 %conv, i8* %0, align 1
3910  ret void
3911}
3912
3913; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
3914define dso_local void @st_disjoint_align32_float_uint8_t(i64 %ptr, float %str) {
3915; CHECK-P10-LABEL: st_disjoint_align32_float_uint8_t:
3916; CHECK-P10:       # %bb.0: # %entry
3917; CHECK-P10-NEXT:    xscvdpuxws f0, f1
3918; CHECK-P10-NEXT:    lis r4, -15264
3919; CHECK-P10-NEXT:    and r3, r3, r4
3920; CHECK-P10-NEXT:    pli r4, 999990000
3921; CHECK-P10-NEXT:    stxsibx f0, r3, r4
3922; CHECK-P10-NEXT:    blr
3923;
3924; CHECK-P9-LABEL: st_disjoint_align32_float_uint8_t:
3925; CHECK-P9:       # %bb.0: # %entry
3926; CHECK-P9-NEXT:    xscvdpuxws f0, f1
3927; CHECK-P9-NEXT:    lis r4, -15264
3928; CHECK-P9-NEXT:    and r3, r3, r4
3929; CHECK-P9-NEXT:    lis r4, 15258
3930; CHECK-P9-NEXT:    ori r4, r4, 41712
3931; CHECK-P9-NEXT:    stxsibx f0, r3, r4
3932; CHECK-P9-NEXT:    blr
3933;
3934; CHECK-P8-LABEL: st_disjoint_align32_float_uint8_t:
3935; CHECK-P8:       # %bb.0: # %entry
3936; CHECK-P8-NEXT:    xscvdpsxws f0, f1
3937; CHECK-P8-NEXT:    lis r4, -15264
3938; CHECK-P8-NEXT:    lis r6, 15258
3939; CHECK-P8-NEXT:    and r3, r3, r4
3940; CHECK-P8-NEXT:    ori r4, r6, 41712
3941; CHECK-P8-NEXT:    mffprwz r5, f0
3942; CHECK-P8-NEXT:    stbx r5, r3, r4
3943; CHECK-P8-NEXT:    blr
3944entry:
3945  %and = and i64 %ptr, -1000341504
3946  %conv = fptoui float %str to i8
3947  %or = or i64 %and, 999990000
3948  %0 = inttoptr i64 %or to i8*
3949  store i8 %conv, i8* %0, align 16
3950  ret void
3951}
3952
3953; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
3954define dso_local void @st_not_disjoint64_float_uint8_t(i64 %ptr, float %str) {
3955; CHECK-P10-LABEL: st_not_disjoint64_float_uint8_t:
3956; CHECK-P10:       # %bb.0: # %entry
3957; CHECK-P10-NEXT:    pli r4, 232
3958; CHECK-P10-NEXT:    pli r5, 3567587329
3959; CHECK-P10-NEXT:    xscvdpuxws f0, f1
3960; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
3961; CHECK-P10-NEXT:    or r3, r3, r5
3962; CHECK-P10-NEXT:    stxsibx f0, 0, r3
3963; CHECK-P10-NEXT:    blr
3964;
3965; CHECK-P9-LABEL: st_not_disjoint64_float_uint8_t:
3966; CHECK-P9:       # %bb.0: # %entry
3967; CHECK-P9-NEXT:    li r4, 29
3968; CHECK-P9-NEXT:    xscvdpuxws f0, f1
3969; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
3970; CHECK-P9-NEXT:    oris r4, r4, 54437
3971; CHECK-P9-NEXT:    ori r4, r4, 4097
3972; CHECK-P9-NEXT:    or r3, r3, r4
3973; CHECK-P9-NEXT:    stxsibx f0, 0, r3
3974; CHECK-P9-NEXT:    blr
3975;
3976; CHECK-P8-LABEL: st_not_disjoint64_float_uint8_t:
3977; CHECK-P8:       # %bb.0: # %entry
3978; CHECK-P8-NEXT:    xscvdpsxws f0, f1
3979; CHECK-P8-NEXT:    li r4, 29
3980; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
3981; CHECK-P8-NEXT:    oris r4, r4, 54437
3982; CHECK-P8-NEXT:    ori r4, r4, 4097
3983; CHECK-P8-NEXT:    or r3, r3, r4
3984; CHECK-P8-NEXT:    mffprwz r5, f0
3985; CHECK-P8-NEXT:    stb r5, 0(r3)
3986; CHECK-P8-NEXT:    blr
3987entry:
3988  %conv = fptoui float %str to i8
3989  %or = or i64 %ptr, 1000000000001
3990  %0 = inttoptr i64 %or to i8*
3991  store i8 %conv, i8* %0, align 1
3992  ret void
3993}
3994
3995; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
3996define dso_local void @st_disjoint_align64_float_uint8_t(i64 %ptr, float %str) {
3997; CHECK-P10-LABEL: st_disjoint_align64_float_uint8_t:
3998; CHECK-P10:       # %bb.0: # %entry
3999; CHECK-P10-NEXT:    xscvdpuxws f0, f1
4000; CHECK-P10-NEXT:    pli r4, 244140625
4001; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
4002; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4003; CHECK-P10-NEXT:    stxsibx f0, r3, r4
4004; CHECK-P10-NEXT:    blr
4005;
4006; CHECK-P9-LABEL: st_disjoint_align64_float_uint8_t:
4007; CHECK-P9:       # %bb.0: # %entry
4008; CHECK-P9-NEXT:    xscvdpuxws f0, f1
4009; CHECK-P9-NEXT:    lis r4, 3725
4010; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
4011; CHECK-P9-NEXT:    ori r4, r4, 19025
4012; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
4013; CHECK-P9-NEXT:    stxsibx f0, r3, r4
4014; CHECK-P9-NEXT:    blr
4015;
4016; CHECK-P8-LABEL: st_disjoint_align64_float_uint8_t:
4017; CHECK-P8:       # %bb.0: # %entry
4018; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4019; CHECK-P8-NEXT:    lis r4, 3725
4020; CHECK-P8-NEXT:    rldicr r3, r3, 0, 23
4021; CHECK-P8-NEXT:    ori r4, r4, 19025
4022; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
4023; CHECK-P8-NEXT:    mffprwz r5, f0
4024; CHECK-P8-NEXT:    stbx r5, r3, r4
4025; CHECK-P8-NEXT:    blr
4026entry:
4027  %and = and i64 %ptr, -1099511627776
4028  %conv = fptoui float %str to i8
4029  %or = or i64 %and, 1000000000000
4030  %0 = inttoptr i64 %or to i8*
4031  store i8 %conv, i8* %0, align 4096
4032  ret void
4033}
4034
4035; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4036define dso_local void @st_cst_align16_float_uint8_t(float %str) {
4037; CHECK-POSTP8-LABEL: st_cst_align16_float_uint8_t:
4038; CHECK-POSTP8:       # %bb.0: # %entry
4039; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
4040; CHECK-POSTP8-NEXT:    li r3, 4080
4041; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
4042; CHECK-POSTP8-NEXT:    blr
4043;
4044; CHECK-P8-LABEL: st_cst_align16_float_uint8_t:
4045; CHECK-P8:       # %bb.0: # %entry
4046; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4047; CHECK-P8-NEXT:    mffprwz r3, f0
4048; CHECK-P8-NEXT:    stb r3, 4080(0)
4049; CHECK-P8-NEXT:    blr
4050entry:
4051  %conv = fptoui float %str to i8
4052  store i8 %conv, i8* inttoptr (i64 4080 to i8*), align 16
4053  ret void
4054}
4055
4056; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4057define dso_local void @st_cst_align32_float_uint8_t(float %str) {
4058; CHECK-P10-LABEL: st_cst_align32_float_uint8_t:
4059; CHECK-P10:       # %bb.0: # %entry
4060; CHECK-P10-NEXT:    xscvdpuxws f0, f1
4061; CHECK-P10-NEXT:    pli r3, 9999900
4062; CHECK-P10-NEXT:    stxsibx f0, 0, r3
4063; CHECK-P10-NEXT:    blr
4064;
4065; CHECK-P9-LABEL: st_cst_align32_float_uint8_t:
4066; CHECK-P9:       # %bb.0: # %entry
4067; CHECK-P9-NEXT:    xscvdpuxws f0, f1
4068; CHECK-P9-NEXT:    lis r3, 152
4069; CHECK-P9-NEXT:    ori r3, r3, 38428
4070; CHECK-P9-NEXT:    stxsibx f0, 0, r3
4071; CHECK-P9-NEXT:    blr
4072;
4073; CHECK-P8-LABEL: st_cst_align32_float_uint8_t:
4074; CHECK-P8:       # %bb.0: # %entry
4075; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4076; CHECK-P8-NEXT:    lis r4, 153
4077; CHECK-P8-NEXT:    mffprwz r3, f0
4078; CHECK-P8-NEXT:    stb r3, -27108(r4)
4079; CHECK-P8-NEXT:    blr
4080entry:
4081  %conv = fptoui float %str to i8
4082  store i8 %conv, i8* inttoptr (i64 9999900 to i8*), align 4
4083  ret void
4084}
4085
4086; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4087define dso_local void @st_cst_align64_float_uint8_t(float %str) {
4088; CHECK-P10-LABEL: st_cst_align64_float_uint8_t:
4089; CHECK-P10:       # %bb.0: # %entry
4090; CHECK-P10-NEXT:    xscvdpuxws f0, f1
4091; CHECK-P10-NEXT:    pli r3, 244140625
4092; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
4093; CHECK-P10-NEXT:    stxsibx f0, 0, r3
4094; CHECK-P10-NEXT:    blr
4095;
4096; CHECK-P9-LABEL: st_cst_align64_float_uint8_t:
4097; CHECK-P9:       # %bb.0: # %entry
4098; CHECK-P9-NEXT:    xscvdpuxws f0, f1
4099; CHECK-P9-NEXT:    lis r3, 3725
4100; CHECK-P9-NEXT:    ori r3, r3, 19025
4101; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
4102; CHECK-P9-NEXT:    stxsibx f0, 0, r3
4103; CHECK-P9-NEXT:    blr
4104;
4105; CHECK-P8-LABEL: st_cst_align64_float_uint8_t:
4106; CHECK-P8:       # %bb.0: # %entry
4107; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4108; CHECK-P8-NEXT:    lis r3, 3725
4109; CHECK-P8-NEXT:    ori r3, r3, 19025
4110; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
4111; CHECK-P8-NEXT:    mffprwz r4, f0
4112; CHECK-P8-NEXT:    stb r4, 0(r3)
4113; CHECK-P8-NEXT:    blr
4114entry:
4115  %conv = fptoui float %str to i8
4116  store i8 %conv, i8* inttoptr (i64 1000000000000 to i8*), align 4096
4117  ret void
4118}
4119
4120; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4121define dso_local void @st_0_float_int8_t(i64 %ptr, float %str) {
4122; CHECK-POSTP8-LABEL: st_0_float_int8_t:
4123; CHECK-POSTP8:       # %bb.0: # %entry
4124; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
4125; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
4126; CHECK-POSTP8-NEXT:    blr
4127;
4128; CHECK-P8-LABEL: st_0_float_int8_t:
4129; CHECK-P8:       # %bb.0: # %entry
4130; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4131; CHECK-P8-NEXT:    mffprwz r4, f0
4132; CHECK-P8-NEXT:    stb r4, 0(r3)
4133; CHECK-P8-NEXT:    blr
4134entry:
4135  %conv = fptosi float %str to i8
4136  %0 = inttoptr i64 %ptr to i8*
4137  store i8 %conv, i8* %0, align 1
4138  ret void
4139}
4140
4141; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4142define dso_local void @st_align16_float_int8_t(i8* nocapture %ptr, float %str) {
4143; CHECK-POSTP8-LABEL: st_align16_float_int8_t:
4144; CHECK-POSTP8:       # %bb.0: # %entry
4145; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
4146; CHECK-POSTP8-NEXT:    addi r3, r3, 8
4147; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
4148; CHECK-POSTP8-NEXT:    blr
4149;
4150; CHECK-P8-LABEL: st_align16_float_int8_t:
4151; CHECK-P8:       # %bb.0: # %entry
4152; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4153; CHECK-P8-NEXT:    mffprwz r4, f0
4154; CHECK-P8-NEXT:    stb r4, 8(r3)
4155; CHECK-P8-NEXT:    blr
4156entry:
4157  %conv = fptosi float %str to i8
4158  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
4159  store i8 %conv, i8* %add.ptr, align 1
4160  ret void
4161}
4162
4163; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4164define dso_local void @st_align32_float_int8_t(i8* nocapture %ptr, float %str) {
4165; CHECK-P10-LABEL: st_align32_float_int8_t:
4166; CHECK-P10:       # %bb.0: # %entry
4167; CHECK-P10-NEXT:    xscvdpsxws f0, f1
4168; CHECK-P10-NEXT:    pli r4, 99999000
4169; CHECK-P10-NEXT:    stxsibx f0, r3, r4
4170; CHECK-P10-NEXT:    blr
4171;
4172; CHECK-P9-LABEL: st_align32_float_int8_t:
4173; CHECK-P9:       # %bb.0: # %entry
4174; CHECK-P9-NEXT:    xscvdpsxws f0, f1
4175; CHECK-P9-NEXT:    lis r4, 1525
4176; CHECK-P9-NEXT:    ori r4, r4, 56600
4177; CHECK-P9-NEXT:    stxsibx f0, r3, r4
4178; CHECK-P9-NEXT:    blr
4179;
4180; CHECK-P8-LABEL: st_align32_float_int8_t:
4181; CHECK-P8:       # %bb.0: # %entry
4182; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4183; CHECK-P8-NEXT:    lis r4, 1525
4184; CHECK-P8-NEXT:    ori r4, r4, 56600
4185; CHECK-P8-NEXT:    mffprwz r5, f0
4186; CHECK-P8-NEXT:    stbx r5, r3, r4
4187; CHECK-P8-NEXT:    blr
4188entry:
4189  %conv = fptosi float %str to i8
4190  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
4191  store i8 %conv, i8* %add.ptr, align 1
4192  ret void
4193}
4194
4195; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4196define dso_local void @st_align64_float_int8_t(i8* nocapture %ptr, float %str) {
4197; CHECK-P10-LABEL: st_align64_float_int8_t:
4198; CHECK-P10:       # %bb.0: # %entry
4199; CHECK-P10-NEXT:    xscvdpsxws f0, f1
4200; CHECK-P10-NEXT:    pli r4, 244140625
4201; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4202; CHECK-P10-NEXT:    stxsibx f0, r3, r4
4203; CHECK-P10-NEXT:    blr
4204;
4205; CHECK-P9-LABEL: st_align64_float_int8_t:
4206; CHECK-P9:       # %bb.0: # %entry
4207; CHECK-P9-NEXT:    xscvdpsxws f0, f1
4208; CHECK-P9-NEXT:    lis r4, 3725
4209; CHECK-P9-NEXT:    ori r4, r4, 19025
4210; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
4211; CHECK-P9-NEXT:    stxsibx f0, r3, r4
4212; CHECK-P9-NEXT:    blr
4213;
4214; CHECK-P8-LABEL: st_align64_float_int8_t:
4215; CHECK-P8:       # %bb.0: # %entry
4216; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4217; CHECK-P8-NEXT:    lis r4, 3725
4218; CHECK-P8-NEXT:    ori r4, r4, 19025
4219; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
4220; CHECK-P8-NEXT:    mffprwz r5, f0
4221; CHECK-P8-NEXT:    stbx r5, r3, r4
4222; CHECK-P8-NEXT:    blr
4223entry:
4224  %conv = fptosi float %str to i8
4225  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
4226  store i8 %conv, i8* %add.ptr, align 1
4227  ret void
4228}
4229
4230; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4231define dso_local void @st_reg_float_int8_t(i8* nocapture %ptr, i64 %off, float %str) {
4232; CHECK-POSTP8-LABEL: st_reg_float_int8_t:
4233; CHECK-POSTP8:       # %bb.0: # %entry
4234; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
4235; CHECK-POSTP8-NEXT:    stxsibx f0, r3, r4
4236; CHECK-POSTP8-NEXT:    blr
4237;
4238; CHECK-P8-LABEL: st_reg_float_int8_t:
4239; CHECK-P8:       # %bb.0: # %entry
4240; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4241; CHECK-P8-NEXT:    mffprwz r5, f0
4242; CHECK-P8-NEXT:    stbx r5, r3, r4
4243; CHECK-P8-NEXT:    blr
4244entry:
4245  %conv = fptosi float %str to i8
4246  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
4247  store i8 %conv, i8* %add.ptr, align 1
4248  ret void
4249}
4250
4251; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4252define dso_local void @st_or1_float_int8_t(i64 %ptr, i8 zeroext %off, float %str) {
4253; CHECK-POSTP8-LABEL: st_or1_float_int8_t:
4254; CHECK-POSTP8:       # %bb.0: # %entry
4255; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
4256; CHECK-POSTP8-NEXT:    or r3, r4, r3
4257; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
4258; CHECK-POSTP8-NEXT:    blr
4259;
4260; CHECK-P8-LABEL: st_or1_float_int8_t:
4261; CHECK-P8:       # %bb.0: # %entry
4262; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4263; CHECK-P8-NEXT:    or r3, r4, r3
4264; CHECK-P8-NEXT:    mffprwz r5, f0
4265; CHECK-P8-NEXT:    stb r5, 0(r3)
4266; CHECK-P8-NEXT:    blr
4267entry:
4268  %conv = fptosi float %str to i8
4269  %conv1 = zext i8 %off to i64
4270  %or = or i64 %conv1, %ptr
4271  %0 = inttoptr i64 %or to i8*
4272  store i8 %conv, i8* %0, align 1
4273  ret void
4274}
4275
4276; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4277define dso_local void @st_not_disjoint16_float_int8_t(i64 %ptr, float %str) {
4278; CHECK-POSTP8-LABEL: st_not_disjoint16_float_int8_t:
4279; CHECK-POSTP8:       # %bb.0: # %entry
4280; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
4281; CHECK-POSTP8-NEXT:    ori r3, r3, 6
4282; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
4283; CHECK-POSTP8-NEXT:    blr
4284;
4285; CHECK-P8-LABEL: st_not_disjoint16_float_int8_t:
4286; CHECK-P8:       # %bb.0: # %entry
4287; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4288; CHECK-P8-NEXT:    ori r3, r3, 6
4289; CHECK-P8-NEXT:    mffprwz r4, f0
4290; CHECK-P8-NEXT:    stb r4, 0(r3)
4291; CHECK-P8-NEXT:    blr
4292entry:
4293  %conv = fptosi float %str to i8
4294  %or = or i64 %ptr, 6
4295  %0 = inttoptr i64 %or to i8*
4296  store i8 %conv, i8* %0, align 1
4297  ret void
4298}
4299
4300; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4301define dso_local void @st_disjoint_align16_float_int8_t(i64 %ptr, float %str) {
4302; CHECK-POSTP8-LABEL: st_disjoint_align16_float_int8_t:
4303; CHECK-POSTP8:       # %bb.0: # %entry
4304; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
4305; CHECK-POSTP8-NEXT:    rldicr r3, r3, 0, 51
4306; CHECK-POSTP8-NEXT:    ori r3, r3, 24
4307; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
4308; CHECK-POSTP8-NEXT:    blr
4309;
4310; CHECK-P8-LABEL: st_disjoint_align16_float_int8_t:
4311; CHECK-P8:       # %bb.0: # %entry
4312; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4313; CHECK-P8-NEXT:    rldicr r3, r3, 0, 51
4314; CHECK-P8-NEXT:    mffprwz r4, f0
4315; CHECK-P8-NEXT:    stb r4, 24(r3)
4316; CHECK-P8-NEXT:    blr
4317entry:
4318  %and = and i64 %ptr, -4096
4319  %conv = fptosi float %str to i8
4320  %or = or i64 %and, 24
4321  %0 = inttoptr i64 %or to i8*
4322  store i8 %conv, i8* %0, align 8
4323  ret void
4324}
4325
4326; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4327define dso_local void @st_not_disjoint32_float_int8_t(i64 %ptr, float %str) {
4328; CHECK-POSTP8-LABEL: st_not_disjoint32_float_int8_t:
4329; CHECK-POSTP8:       # %bb.0: # %entry
4330; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
4331; CHECK-POSTP8-NEXT:    ori r3, r3, 34463
4332; CHECK-POSTP8-NEXT:    oris r3, r3, 1
4333; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
4334; CHECK-POSTP8-NEXT:    blr
4335;
4336; CHECK-P8-LABEL: st_not_disjoint32_float_int8_t:
4337; CHECK-P8:       # %bb.0: # %entry
4338; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4339; CHECK-P8-NEXT:    ori r3, r3, 34463
4340; CHECK-P8-NEXT:    oris r3, r3, 1
4341; CHECK-P8-NEXT:    mffprwz r4, f0
4342; CHECK-P8-NEXT:    stb r4, 0(r3)
4343; CHECK-P8-NEXT:    blr
4344entry:
4345  %conv = fptosi float %str to i8
4346  %or = or i64 %ptr, 99999
4347  %0 = inttoptr i64 %or to i8*
4348  store i8 %conv, i8* %0, align 1
4349  ret void
4350}
4351
4352; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4353define dso_local void @st_disjoint_align32_float_int8_t(i64 %ptr, float %str) {
4354; CHECK-P10-LABEL: st_disjoint_align32_float_int8_t:
4355; CHECK-P10:       # %bb.0: # %entry
4356; CHECK-P10-NEXT:    xscvdpsxws f0, f1
4357; CHECK-P10-NEXT:    lis r4, -15264
4358; CHECK-P10-NEXT:    and r3, r3, r4
4359; CHECK-P10-NEXT:    pli r4, 999990000
4360; CHECK-P10-NEXT:    stxsibx f0, r3, r4
4361; CHECK-P10-NEXT:    blr
4362;
4363; CHECK-P9-LABEL: st_disjoint_align32_float_int8_t:
4364; CHECK-P9:       # %bb.0: # %entry
4365; CHECK-P9-NEXT:    xscvdpsxws f0, f1
4366; CHECK-P9-NEXT:    lis r4, -15264
4367; CHECK-P9-NEXT:    and r3, r3, r4
4368; CHECK-P9-NEXT:    lis r4, 15258
4369; CHECK-P9-NEXT:    ori r4, r4, 41712
4370; CHECK-P9-NEXT:    stxsibx f0, r3, r4
4371; CHECK-P9-NEXT:    blr
4372;
4373; CHECK-P8-LABEL: st_disjoint_align32_float_int8_t:
4374; CHECK-P8:       # %bb.0: # %entry
4375; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4376; CHECK-P8-NEXT:    lis r4, -15264
4377; CHECK-P8-NEXT:    lis r6, 15258
4378; CHECK-P8-NEXT:    and r3, r3, r4
4379; CHECK-P8-NEXT:    ori r4, r6, 41712
4380; CHECK-P8-NEXT:    mffprwz r5, f0
4381; CHECK-P8-NEXT:    stbx r5, r3, r4
4382; CHECK-P8-NEXT:    blr
4383entry:
4384  %and = and i64 %ptr, -1000341504
4385  %conv = fptosi float %str to i8
4386  %or = or i64 %and, 999990000
4387  %0 = inttoptr i64 %or to i8*
4388  store i8 %conv, i8* %0, align 16
4389  ret void
4390}
4391
4392; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4393define dso_local void @st_not_disjoint64_float_int8_t(i64 %ptr, float %str) {
4394; CHECK-P10-LABEL: st_not_disjoint64_float_int8_t:
4395; CHECK-P10:       # %bb.0: # %entry
4396; CHECK-P10-NEXT:    pli r4, 232
4397; CHECK-P10-NEXT:    pli r5, 3567587329
4398; CHECK-P10-NEXT:    xscvdpsxws f0, f1
4399; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
4400; CHECK-P10-NEXT:    or r3, r3, r5
4401; CHECK-P10-NEXT:    stxsibx f0, 0, r3
4402; CHECK-P10-NEXT:    blr
4403;
4404; CHECK-P9-LABEL: st_not_disjoint64_float_int8_t:
4405; CHECK-P9:       # %bb.0: # %entry
4406; CHECK-P9-NEXT:    li r4, 29
4407; CHECK-P9-NEXT:    xscvdpsxws f0, f1
4408; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
4409; CHECK-P9-NEXT:    oris r4, r4, 54437
4410; CHECK-P9-NEXT:    ori r4, r4, 4097
4411; CHECK-P9-NEXT:    or r3, r3, r4
4412; CHECK-P9-NEXT:    stxsibx f0, 0, r3
4413; CHECK-P9-NEXT:    blr
4414;
4415; CHECK-P8-LABEL: st_not_disjoint64_float_int8_t:
4416; CHECK-P8:       # %bb.0: # %entry
4417; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4418; CHECK-P8-NEXT:    li r4, 29
4419; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
4420; CHECK-P8-NEXT:    oris r4, r4, 54437
4421; CHECK-P8-NEXT:    ori r4, r4, 4097
4422; CHECK-P8-NEXT:    or r3, r3, r4
4423; CHECK-P8-NEXT:    mffprwz r5, f0
4424; CHECK-P8-NEXT:    stb r5, 0(r3)
4425; CHECK-P8-NEXT:    blr
4426entry:
4427  %conv = fptosi float %str to i8
4428  %or = or i64 %ptr, 1000000000001
4429  %0 = inttoptr i64 %or to i8*
4430  store i8 %conv, i8* %0, align 1
4431  ret void
4432}
4433
4434; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4435define dso_local void @st_disjoint_align64_float_int8_t(i64 %ptr, float %str) {
4436; CHECK-P10-LABEL: st_disjoint_align64_float_int8_t:
4437; CHECK-P10:       # %bb.0: # %entry
4438; CHECK-P10-NEXT:    xscvdpsxws f0, f1
4439; CHECK-P10-NEXT:    pli r4, 244140625
4440; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
4441; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4442; CHECK-P10-NEXT:    stxsibx f0, r3, r4
4443; CHECK-P10-NEXT:    blr
4444;
4445; CHECK-P9-LABEL: st_disjoint_align64_float_int8_t:
4446; CHECK-P9:       # %bb.0: # %entry
4447; CHECK-P9-NEXT:    xscvdpsxws f0, f1
4448; CHECK-P9-NEXT:    lis r4, 3725
4449; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
4450; CHECK-P9-NEXT:    ori r4, r4, 19025
4451; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
4452; CHECK-P9-NEXT:    stxsibx f0, r3, r4
4453; CHECK-P9-NEXT:    blr
4454;
4455; CHECK-P8-LABEL: st_disjoint_align64_float_int8_t:
4456; CHECK-P8:       # %bb.0: # %entry
4457; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4458; CHECK-P8-NEXT:    lis r4, 3725
4459; CHECK-P8-NEXT:    rldicr r3, r3, 0, 23
4460; CHECK-P8-NEXT:    ori r4, r4, 19025
4461; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
4462; CHECK-P8-NEXT:    mffprwz r5, f0
4463; CHECK-P8-NEXT:    stbx r5, r3, r4
4464; CHECK-P8-NEXT:    blr
4465entry:
4466  %and = and i64 %ptr, -1099511627776
4467  %conv = fptosi float %str to i8
4468  %or = or i64 %and, 1000000000000
4469  %0 = inttoptr i64 %or to i8*
4470  store i8 %conv, i8* %0, align 4096
4471  ret void
4472}
4473
4474; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4475define dso_local void @st_cst_align16_float_int8_t(float %str) {
4476; CHECK-POSTP8-LABEL: st_cst_align16_float_int8_t:
4477; CHECK-POSTP8:       # %bb.0: # %entry
4478; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
4479; CHECK-POSTP8-NEXT:    li r3, 4080
4480; CHECK-POSTP8-NEXT:    stxsibx f0, 0, r3
4481; CHECK-POSTP8-NEXT:    blr
4482;
4483; CHECK-P8-LABEL: st_cst_align16_float_int8_t:
4484; CHECK-P8:       # %bb.0: # %entry
4485; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4486; CHECK-P8-NEXT:    mffprwz r3, f0
4487; CHECK-P8-NEXT:    stb r3, 4080(0)
4488; CHECK-P8-NEXT:    blr
4489entry:
4490  %conv = fptosi float %str to i8
4491  store i8 %conv, i8* inttoptr (i64 4080 to i8*), align 16
4492  ret void
4493}
4494
4495; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4496define dso_local void @st_cst_align32_float_int8_t(float %str) {
4497; CHECK-P10-LABEL: st_cst_align32_float_int8_t:
4498; CHECK-P10:       # %bb.0: # %entry
4499; CHECK-P10-NEXT:    xscvdpsxws f0, f1
4500; CHECK-P10-NEXT:    pli r3, 9999900
4501; CHECK-P10-NEXT:    stxsibx f0, 0, r3
4502; CHECK-P10-NEXT:    blr
4503;
4504; CHECK-P9-LABEL: st_cst_align32_float_int8_t:
4505; CHECK-P9:       # %bb.0: # %entry
4506; CHECK-P9-NEXT:    xscvdpsxws f0, f1
4507; CHECK-P9-NEXT:    lis r3, 152
4508; CHECK-P9-NEXT:    ori r3, r3, 38428
4509; CHECK-P9-NEXT:    stxsibx f0, 0, r3
4510; CHECK-P9-NEXT:    blr
4511;
4512; CHECK-P8-LABEL: st_cst_align32_float_int8_t:
4513; CHECK-P8:       # %bb.0: # %entry
4514; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4515; CHECK-P8-NEXT:    lis r4, 153
4516; CHECK-P8-NEXT:    mffprwz r3, f0
4517; CHECK-P8-NEXT:    stb r3, -27108(r4)
4518; CHECK-P8-NEXT:    blr
4519entry:
4520  %conv = fptosi float %str to i8
4521  store i8 %conv, i8* inttoptr (i64 9999900 to i8*), align 4
4522  ret void
4523}
4524
4525; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4526define dso_local void @st_cst_align64_float_int8_t(float %str) {
4527; CHECK-P10-LABEL: st_cst_align64_float_int8_t:
4528; CHECK-P10:       # %bb.0: # %entry
4529; CHECK-P10-NEXT:    xscvdpsxws f0, f1
4530; CHECK-P10-NEXT:    pli r3, 244140625
4531; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
4532; CHECK-P10-NEXT:    stxsibx f0, 0, r3
4533; CHECK-P10-NEXT:    blr
4534;
4535; CHECK-P9-LABEL: st_cst_align64_float_int8_t:
4536; CHECK-P9:       # %bb.0: # %entry
4537; CHECK-P9-NEXT:    xscvdpsxws f0, f1
4538; CHECK-P9-NEXT:    lis r3, 3725
4539; CHECK-P9-NEXT:    ori r3, r3, 19025
4540; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
4541; CHECK-P9-NEXT:    stxsibx f0, 0, r3
4542; CHECK-P9-NEXT:    blr
4543;
4544; CHECK-P8-LABEL: st_cst_align64_float_int8_t:
4545; CHECK-P8:       # %bb.0: # %entry
4546; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4547; CHECK-P8-NEXT:    lis r3, 3725
4548; CHECK-P8-NEXT:    ori r3, r3, 19025
4549; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
4550; CHECK-P8-NEXT:    mffprwz r4, f0
4551; CHECK-P8-NEXT:    stb r4, 0(r3)
4552; CHECK-P8-NEXT:    blr
4553entry:
4554  %conv = fptosi float %str to i8
4555  store i8 %conv, i8* inttoptr (i64 1000000000000 to i8*), align 4096
4556  ret void
4557}
4558
4559; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4560define dso_local void @st_0_float_uint16_t(i64 %ptr, float %str) {
4561; CHECK-POSTP8-LABEL: st_0_float_uint16_t:
4562; CHECK-POSTP8:       # %bb.0: # %entry
4563; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
4564; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
4565; CHECK-POSTP8-NEXT:    blr
4566;
4567; CHECK-P8-LABEL: st_0_float_uint16_t:
4568; CHECK-P8:       # %bb.0: # %entry
4569; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4570; CHECK-P8-NEXT:    mffprwz r4, f0
4571; CHECK-P8-NEXT:    sth r4, 0(r3)
4572; CHECK-P8-NEXT:    blr
4573entry:
4574  %conv = fptoui float %str to i16
4575  %0 = inttoptr i64 %ptr to i16*
4576  store i16 %conv, i16* %0, align 2
4577  ret void
4578}
4579
4580; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4581define dso_local void @st_align16_float_uint16_t(i8* nocapture %ptr, float %str) {
4582; CHECK-POSTP8-LABEL: st_align16_float_uint16_t:
4583; CHECK-POSTP8:       # %bb.0: # %entry
4584; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
4585; CHECK-POSTP8-NEXT:    addi r3, r3, 8
4586; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
4587; CHECK-POSTP8-NEXT:    blr
4588;
4589; CHECK-P8-LABEL: st_align16_float_uint16_t:
4590; CHECK-P8:       # %bb.0: # %entry
4591; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4592; CHECK-P8-NEXT:    mffprwz r4, f0
4593; CHECK-P8-NEXT:    sth r4, 8(r3)
4594; CHECK-P8-NEXT:    blr
4595entry:
4596  %conv = fptoui float %str to i16
4597  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
4598  %0 = bitcast i8* %add.ptr to i16*
4599  store i16 %conv, i16* %0, align 2
4600  ret void
4601}
4602
4603; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4604define dso_local void @st_align32_float_uint16_t(i8* nocapture %ptr, float %str) {
4605; CHECK-P10-LABEL: st_align32_float_uint16_t:
4606; CHECK-P10:       # %bb.0: # %entry
4607; CHECK-P10-NEXT:    xscvdpuxws f0, f1
4608; CHECK-P10-NEXT:    pli r4, 99999000
4609; CHECK-P10-NEXT:    stxsihx f0, r3, r4
4610; CHECK-P10-NEXT:    blr
4611;
4612; CHECK-P9-LABEL: st_align32_float_uint16_t:
4613; CHECK-P9:       # %bb.0: # %entry
4614; CHECK-P9-NEXT:    xscvdpuxws f0, f1
4615; CHECK-P9-NEXT:    lis r4, 1525
4616; CHECK-P9-NEXT:    ori r4, r4, 56600
4617; CHECK-P9-NEXT:    stxsihx f0, r3, r4
4618; CHECK-P9-NEXT:    blr
4619;
4620; CHECK-P8-LABEL: st_align32_float_uint16_t:
4621; CHECK-P8:       # %bb.0: # %entry
4622; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4623; CHECK-P8-NEXT:    lis r4, 1525
4624; CHECK-P8-NEXT:    ori r4, r4, 56600
4625; CHECK-P8-NEXT:    mffprwz r5, f0
4626; CHECK-P8-NEXT:    sthx r5, r3, r4
4627; CHECK-P8-NEXT:    blr
4628entry:
4629  %conv = fptoui float %str to i16
4630  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
4631  %0 = bitcast i8* %add.ptr to i16*
4632  store i16 %conv, i16* %0, align 2
4633  ret void
4634}
4635
4636; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4637define dso_local void @st_align64_float_uint16_t(i8* nocapture %ptr, float %str) {
4638; CHECK-P10-LABEL: st_align64_float_uint16_t:
4639; CHECK-P10:       # %bb.0: # %entry
4640; CHECK-P10-NEXT:    xscvdpuxws f0, f1
4641; CHECK-P10-NEXT:    pli r4, 244140625
4642; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4643; CHECK-P10-NEXT:    stxsihx f0, r3, r4
4644; CHECK-P10-NEXT:    blr
4645;
4646; CHECK-P9-LABEL: st_align64_float_uint16_t:
4647; CHECK-P9:       # %bb.0: # %entry
4648; CHECK-P9-NEXT:    xscvdpuxws f0, f1
4649; CHECK-P9-NEXT:    lis r4, 3725
4650; CHECK-P9-NEXT:    ori r4, r4, 19025
4651; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
4652; CHECK-P9-NEXT:    stxsihx f0, r3, r4
4653; CHECK-P9-NEXT:    blr
4654;
4655; CHECK-P8-LABEL: st_align64_float_uint16_t:
4656; CHECK-P8:       # %bb.0: # %entry
4657; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4658; CHECK-P8-NEXT:    lis r4, 3725
4659; CHECK-P8-NEXT:    ori r4, r4, 19025
4660; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
4661; CHECK-P8-NEXT:    mffprwz r5, f0
4662; CHECK-P8-NEXT:    sthx r5, r3, r4
4663; CHECK-P8-NEXT:    blr
4664entry:
4665  %conv = fptoui float %str to i16
4666  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
4667  %0 = bitcast i8* %add.ptr to i16*
4668  store i16 %conv, i16* %0, align 2
4669  ret void
4670}
4671
4672; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4673define dso_local void @st_reg_float_uint16_t(i8* nocapture %ptr, i64 %off, float %str) {
4674; CHECK-POSTP8-LABEL: st_reg_float_uint16_t:
4675; CHECK-POSTP8:       # %bb.0: # %entry
4676; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
4677; CHECK-POSTP8-NEXT:    stxsihx f0, r3, r4
4678; CHECK-POSTP8-NEXT:    blr
4679;
4680; CHECK-P8-LABEL: st_reg_float_uint16_t:
4681; CHECK-P8:       # %bb.0: # %entry
4682; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4683; CHECK-P8-NEXT:    mffprwz r5, f0
4684; CHECK-P8-NEXT:    sthx r5, r3, r4
4685; CHECK-P8-NEXT:    blr
4686entry:
4687  %conv = fptoui float %str to i16
4688  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
4689  %0 = bitcast i8* %add.ptr to i16*
4690  store i16 %conv, i16* %0, align 2
4691  ret void
4692}
4693
4694; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4695define dso_local void @st_or1_float_uint16_t(i64 %ptr, i8 zeroext %off, float %str) {
4696; CHECK-POSTP8-LABEL: st_or1_float_uint16_t:
4697; CHECK-POSTP8:       # %bb.0: # %entry
4698; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
4699; CHECK-POSTP8-NEXT:    or r3, r4, r3
4700; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
4701; CHECK-POSTP8-NEXT:    blr
4702;
4703; CHECK-P8-LABEL: st_or1_float_uint16_t:
4704; CHECK-P8:       # %bb.0: # %entry
4705; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4706; CHECK-P8-NEXT:    or r3, r4, r3
4707; CHECK-P8-NEXT:    mffprwz r5, f0
4708; CHECK-P8-NEXT:    sth r5, 0(r3)
4709; CHECK-P8-NEXT:    blr
4710entry:
4711  %conv = fptoui float %str to i16
4712  %conv1 = zext i8 %off to i64
4713  %or = or i64 %conv1, %ptr
4714  %0 = inttoptr i64 %or to i16*
4715  store i16 %conv, i16* %0, align 2
4716  ret void
4717}
4718
4719; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4720define dso_local void @st_not_disjoint16_float_uint16_t(i64 %ptr, float %str) {
4721; CHECK-POSTP8-LABEL: st_not_disjoint16_float_uint16_t:
4722; CHECK-POSTP8:       # %bb.0: # %entry
4723; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
4724; CHECK-POSTP8-NEXT:    ori r3, r3, 6
4725; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
4726; CHECK-POSTP8-NEXT:    blr
4727;
4728; CHECK-P8-LABEL: st_not_disjoint16_float_uint16_t:
4729; CHECK-P8:       # %bb.0: # %entry
4730; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4731; CHECK-P8-NEXT:    ori r3, r3, 6
4732; CHECK-P8-NEXT:    mffprwz r4, f0
4733; CHECK-P8-NEXT:    sth r4, 0(r3)
4734; CHECK-P8-NEXT:    blr
4735entry:
4736  %conv = fptoui float %str to i16
4737  %or = or i64 %ptr, 6
4738  %0 = inttoptr i64 %or to i16*
4739  store i16 %conv, i16* %0, align 2
4740  ret void
4741}
4742
4743; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4744define dso_local void @st_disjoint_align16_float_uint16_t(i64 %ptr, float %str) {
4745; CHECK-POSTP8-LABEL: st_disjoint_align16_float_uint16_t:
4746; CHECK-POSTP8:       # %bb.0: # %entry
4747; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
4748; CHECK-POSTP8-NEXT:    rldicr r3, r3, 0, 51
4749; CHECK-POSTP8-NEXT:    ori r3, r3, 24
4750; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
4751; CHECK-POSTP8-NEXT:    blr
4752;
4753; CHECK-P8-LABEL: st_disjoint_align16_float_uint16_t:
4754; CHECK-P8:       # %bb.0: # %entry
4755; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4756; CHECK-P8-NEXT:    rldicr r3, r3, 0, 51
4757; CHECK-P8-NEXT:    mffprwz r4, f0
4758; CHECK-P8-NEXT:    sth r4, 24(r3)
4759; CHECK-P8-NEXT:    blr
4760entry:
4761  %and = and i64 %ptr, -4096
4762  %conv = fptoui float %str to i16
4763  %or = or i64 %and, 24
4764  %0 = inttoptr i64 %or to i16*
4765  store i16 %conv, i16* %0, align 8
4766  ret void
4767}
4768
4769; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4770define dso_local void @st_not_disjoint32_float_uint16_t(i64 %ptr, float %str) {
4771; CHECK-POSTP8-LABEL: st_not_disjoint32_float_uint16_t:
4772; CHECK-POSTP8:       # %bb.0: # %entry
4773; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
4774; CHECK-POSTP8-NEXT:    ori r3, r3, 34463
4775; CHECK-POSTP8-NEXT:    oris r3, r3, 1
4776; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
4777; CHECK-POSTP8-NEXT:    blr
4778;
4779; CHECK-P8-LABEL: st_not_disjoint32_float_uint16_t:
4780; CHECK-P8:       # %bb.0: # %entry
4781; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4782; CHECK-P8-NEXT:    ori r3, r3, 34463
4783; CHECK-P8-NEXT:    oris r3, r3, 1
4784; CHECK-P8-NEXT:    mffprwz r4, f0
4785; CHECK-P8-NEXT:    sth r4, 0(r3)
4786; CHECK-P8-NEXT:    blr
4787entry:
4788  %conv = fptoui float %str to i16
4789  %or = or i64 %ptr, 99999
4790  %0 = inttoptr i64 %or to i16*
4791  store i16 %conv, i16* %0, align 2
4792  ret void
4793}
4794
4795; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4796define dso_local void @st_disjoint_align32_float_uint16_t(i64 %ptr, float %str) {
4797; CHECK-P10-LABEL: st_disjoint_align32_float_uint16_t:
4798; CHECK-P10:       # %bb.0: # %entry
4799; CHECK-P10-NEXT:    xscvdpuxws f0, f1
4800; CHECK-P10-NEXT:    lis r4, -15264
4801; CHECK-P10-NEXT:    and r3, r3, r4
4802; CHECK-P10-NEXT:    pli r4, 999990000
4803; CHECK-P10-NEXT:    stxsihx f0, r3, r4
4804; CHECK-P10-NEXT:    blr
4805;
4806; CHECK-P9-LABEL: st_disjoint_align32_float_uint16_t:
4807; CHECK-P9:       # %bb.0: # %entry
4808; CHECK-P9-NEXT:    xscvdpuxws f0, f1
4809; CHECK-P9-NEXT:    lis r4, -15264
4810; CHECK-P9-NEXT:    and r3, r3, r4
4811; CHECK-P9-NEXT:    lis r4, 15258
4812; CHECK-P9-NEXT:    ori r4, r4, 41712
4813; CHECK-P9-NEXT:    stxsihx f0, r3, r4
4814; CHECK-P9-NEXT:    blr
4815;
4816; CHECK-P8-LABEL: st_disjoint_align32_float_uint16_t:
4817; CHECK-P8:       # %bb.0: # %entry
4818; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4819; CHECK-P8-NEXT:    lis r4, -15264
4820; CHECK-P8-NEXT:    lis r6, 15258
4821; CHECK-P8-NEXT:    and r3, r3, r4
4822; CHECK-P8-NEXT:    ori r4, r6, 41712
4823; CHECK-P8-NEXT:    mffprwz r5, f0
4824; CHECK-P8-NEXT:    sthx r5, r3, r4
4825; CHECK-P8-NEXT:    blr
4826entry:
4827  %and = and i64 %ptr, -1000341504
4828  %conv = fptoui float %str to i16
4829  %or = or i64 %and, 999990000
4830  %0 = inttoptr i64 %or to i16*
4831  store i16 %conv, i16* %0, align 16
4832  ret void
4833}
4834
4835; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4836define dso_local void @st_not_disjoint64_float_uint16_t(i64 %ptr, float %str) {
4837; CHECK-P10-LABEL: st_not_disjoint64_float_uint16_t:
4838; CHECK-P10:       # %bb.0: # %entry
4839; CHECK-P10-NEXT:    pli r4, 232
4840; CHECK-P10-NEXT:    pli r5, 3567587329
4841; CHECK-P10-NEXT:    xscvdpuxws f0, f1
4842; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
4843; CHECK-P10-NEXT:    or r3, r3, r5
4844; CHECK-P10-NEXT:    stxsihx f0, 0, r3
4845; CHECK-P10-NEXT:    blr
4846;
4847; CHECK-P9-LABEL: st_not_disjoint64_float_uint16_t:
4848; CHECK-P9:       # %bb.0: # %entry
4849; CHECK-P9-NEXT:    li r4, 29
4850; CHECK-P9-NEXT:    xscvdpuxws f0, f1
4851; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
4852; CHECK-P9-NEXT:    oris r4, r4, 54437
4853; CHECK-P9-NEXT:    ori r4, r4, 4097
4854; CHECK-P9-NEXT:    or r3, r3, r4
4855; CHECK-P9-NEXT:    stxsihx f0, 0, r3
4856; CHECK-P9-NEXT:    blr
4857;
4858; CHECK-P8-LABEL: st_not_disjoint64_float_uint16_t:
4859; CHECK-P8:       # %bb.0: # %entry
4860; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4861; CHECK-P8-NEXT:    li r4, 29
4862; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
4863; CHECK-P8-NEXT:    oris r4, r4, 54437
4864; CHECK-P8-NEXT:    ori r4, r4, 4097
4865; CHECK-P8-NEXT:    or r3, r3, r4
4866; CHECK-P8-NEXT:    mffprwz r5, f0
4867; CHECK-P8-NEXT:    sth r5, 0(r3)
4868; CHECK-P8-NEXT:    blr
4869entry:
4870  %conv = fptoui float %str to i16
4871  %or = or i64 %ptr, 1000000000001
4872  %0 = inttoptr i64 %or to i16*
4873  store i16 %conv, i16* %0, align 2
4874  ret void
4875}
4876
4877; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4878define dso_local void @st_disjoint_align64_float_uint16_t(i64 %ptr, float %str) {
4879; CHECK-P10-LABEL: st_disjoint_align64_float_uint16_t:
4880; CHECK-P10:       # %bb.0: # %entry
4881; CHECK-P10-NEXT:    xscvdpuxws f0, f1
4882; CHECK-P10-NEXT:    pli r4, 244140625
4883; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
4884; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
4885; CHECK-P10-NEXT:    stxsihx f0, r3, r4
4886; CHECK-P10-NEXT:    blr
4887;
4888; CHECK-P9-LABEL: st_disjoint_align64_float_uint16_t:
4889; CHECK-P9:       # %bb.0: # %entry
4890; CHECK-P9-NEXT:    xscvdpuxws f0, f1
4891; CHECK-P9-NEXT:    lis r4, 3725
4892; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
4893; CHECK-P9-NEXT:    ori r4, r4, 19025
4894; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
4895; CHECK-P9-NEXT:    stxsihx f0, r3, r4
4896; CHECK-P9-NEXT:    blr
4897;
4898; CHECK-P8-LABEL: st_disjoint_align64_float_uint16_t:
4899; CHECK-P8:       # %bb.0: # %entry
4900; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4901; CHECK-P8-NEXT:    lis r4, 3725
4902; CHECK-P8-NEXT:    rldicr r3, r3, 0, 23
4903; CHECK-P8-NEXT:    ori r4, r4, 19025
4904; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
4905; CHECK-P8-NEXT:    mffprwz r5, f0
4906; CHECK-P8-NEXT:    sthx r5, r3, r4
4907; CHECK-P8-NEXT:    blr
4908entry:
4909  %and = and i64 %ptr, -1099511627776
4910  %conv = fptoui float %str to i16
4911  %or = or i64 %and, 1000000000000
4912  %0 = inttoptr i64 %or to i16*
4913  store i16 %conv, i16* %0, align 4096
4914  ret void
4915}
4916
4917; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4918define dso_local void @st_cst_align16_float_uint16_t(float %str) {
4919; CHECK-POSTP8-LABEL: st_cst_align16_float_uint16_t:
4920; CHECK-POSTP8:       # %bb.0: # %entry
4921; CHECK-POSTP8-NEXT:    xscvdpuxws f0, f1
4922; CHECK-POSTP8-NEXT:    li r3, 4080
4923; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
4924; CHECK-POSTP8-NEXT:    blr
4925;
4926; CHECK-P8-LABEL: st_cst_align16_float_uint16_t:
4927; CHECK-P8:       # %bb.0: # %entry
4928; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4929; CHECK-P8-NEXT:    mffprwz r3, f0
4930; CHECK-P8-NEXT:    sth r3, 4080(0)
4931; CHECK-P8-NEXT:    blr
4932entry:
4933  %conv = fptoui float %str to i16
4934  store i16 %conv, i16* inttoptr (i64 4080 to i16*), align 16
4935  ret void
4936}
4937
4938; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4939define dso_local void @st_cst_align32_float_uint16_t(float %str) {
4940; CHECK-P10-LABEL: st_cst_align32_float_uint16_t:
4941; CHECK-P10:       # %bb.0: # %entry
4942; CHECK-P10-NEXT:    xscvdpuxws f0, f1
4943; CHECK-P10-NEXT:    pli r3, 9999900
4944; CHECK-P10-NEXT:    stxsihx f0, 0, r3
4945; CHECK-P10-NEXT:    blr
4946;
4947; CHECK-P9-LABEL: st_cst_align32_float_uint16_t:
4948; CHECK-P9:       # %bb.0: # %entry
4949; CHECK-P9-NEXT:    xscvdpuxws f0, f1
4950; CHECK-P9-NEXT:    lis r3, 152
4951; CHECK-P9-NEXT:    ori r3, r3, 38428
4952; CHECK-P9-NEXT:    stxsihx f0, 0, r3
4953; CHECK-P9-NEXT:    blr
4954;
4955; CHECK-P8-LABEL: st_cst_align32_float_uint16_t:
4956; CHECK-P8:       # %bb.0: # %entry
4957; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4958; CHECK-P8-NEXT:    lis r4, 153
4959; CHECK-P8-NEXT:    mffprwz r3, f0
4960; CHECK-P8-NEXT:    sth r3, -27108(r4)
4961; CHECK-P8-NEXT:    blr
4962entry:
4963  %conv = fptoui float %str to i16
4964  store i16 %conv, i16* inttoptr (i64 9999900 to i16*), align 4
4965  ret void
4966}
4967
4968; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
4969define dso_local void @st_cst_align64_float_uint16_t(float %str) {
4970; CHECK-P10-LABEL: st_cst_align64_float_uint16_t:
4971; CHECK-P10:       # %bb.0: # %entry
4972; CHECK-P10-NEXT:    xscvdpuxws f0, f1
4973; CHECK-P10-NEXT:    pli r3, 244140625
4974; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
4975; CHECK-P10-NEXT:    stxsihx f0, 0, r3
4976; CHECK-P10-NEXT:    blr
4977;
4978; CHECK-P9-LABEL: st_cst_align64_float_uint16_t:
4979; CHECK-P9:       # %bb.0: # %entry
4980; CHECK-P9-NEXT:    xscvdpuxws f0, f1
4981; CHECK-P9-NEXT:    lis r3, 3725
4982; CHECK-P9-NEXT:    ori r3, r3, 19025
4983; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
4984; CHECK-P9-NEXT:    stxsihx f0, 0, r3
4985; CHECK-P9-NEXT:    blr
4986;
4987; CHECK-P8-LABEL: st_cst_align64_float_uint16_t:
4988; CHECK-P8:       # %bb.0: # %entry
4989; CHECK-P8-NEXT:    xscvdpsxws f0, f1
4990; CHECK-P8-NEXT:    lis r3, 3725
4991; CHECK-P8-NEXT:    ori r3, r3, 19025
4992; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
4993; CHECK-P8-NEXT:    mffprwz r4, f0
4994; CHECK-P8-NEXT:    sth r4, 0(r3)
4995; CHECK-P8-NEXT:    blr
4996entry:
4997  %conv = fptoui float %str to i16
4998  store i16 %conv, i16* inttoptr (i64 1000000000000 to i16*), align 4096
4999  ret void
5000}
5001
5002; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5003define dso_local void @st_0_float_int16_t(i64 %ptr, float %str) {
5004; CHECK-POSTP8-LABEL: st_0_float_int16_t:
5005; CHECK-POSTP8:       # %bb.0: # %entry
5006; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
5007; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
5008; CHECK-POSTP8-NEXT:    blr
5009;
5010; CHECK-P8-LABEL: st_0_float_int16_t:
5011; CHECK-P8:       # %bb.0: # %entry
5012; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5013; CHECK-P8-NEXT:    mffprwz r4, f0
5014; CHECK-P8-NEXT:    sth r4, 0(r3)
5015; CHECK-P8-NEXT:    blr
5016entry:
5017  %conv = fptosi float %str to i16
5018  %0 = inttoptr i64 %ptr to i16*
5019  store i16 %conv, i16* %0, align 2
5020  ret void
5021}
5022
5023; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5024define dso_local void @st_align16_float_int16_t(i8* nocapture %ptr, float %str) {
5025; CHECK-POSTP8-LABEL: st_align16_float_int16_t:
5026; CHECK-POSTP8:       # %bb.0: # %entry
5027; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
5028; CHECK-POSTP8-NEXT:    addi r3, r3, 8
5029; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
5030; CHECK-POSTP8-NEXT:    blr
5031;
5032; CHECK-P8-LABEL: st_align16_float_int16_t:
5033; CHECK-P8:       # %bb.0: # %entry
5034; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5035; CHECK-P8-NEXT:    mffprwz r4, f0
5036; CHECK-P8-NEXT:    sth r4, 8(r3)
5037; CHECK-P8-NEXT:    blr
5038entry:
5039  %conv = fptosi float %str to i16
5040  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
5041  %0 = bitcast i8* %add.ptr to i16*
5042  store i16 %conv, i16* %0, align 2
5043  ret void
5044}
5045
5046; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5047define dso_local void @st_align32_float_int16_t(i8* nocapture %ptr, float %str) {
5048; CHECK-P10-LABEL: st_align32_float_int16_t:
5049; CHECK-P10:       # %bb.0: # %entry
5050; CHECK-P10-NEXT:    xscvdpsxws f0, f1
5051; CHECK-P10-NEXT:    pli r4, 99999000
5052; CHECK-P10-NEXT:    stxsihx f0, r3, r4
5053; CHECK-P10-NEXT:    blr
5054;
5055; CHECK-P9-LABEL: st_align32_float_int16_t:
5056; CHECK-P9:       # %bb.0: # %entry
5057; CHECK-P9-NEXT:    xscvdpsxws f0, f1
5058; CHECK-P9-NEXT:    lis r4, 1525
5059; CHECK-P9-NEXT:    ori r4, r4, 56600
5060; CHECK-P9-NEXT:    stxsihx f0, r3, r4
5061; CHECK-P9-NEXT:    blr
5062;
5063; CHECK-P8-LABEL: st_align32_float_int16_t:
5064; CHECK-P8:       # %bb.0: # %entry
5065; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5066; CHECK-P8-NEXT:    lis r4, 1525
5067; CHECK-P8-NEXT:    ori r4, r4, 56600
5068; CHECK-P8-NEXT:    mffprwz r5, f0
5069; CHECK-P8-NEXT:    sthx r5, r3, r4
5070; CHECK-P8-NEXT:    blr
5071entry:
5072  %conv = fptosi float %str to i16
5073  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
5074  %0 = bitcast i8* %add.ptr to i16*
5075  store i16 %conv, i16* %0, align 2
5076  ret void
5077}
5078
5079; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5080define dso_local void @st_align64_float_int16_t(i8* nocapture %ptr, float %str) {
5081; CHECK-P10-LABEL: st_align64_float_int16_t:
5082; CHECK-P10:       # %bb.0: # %entry
5083; CHECK-P10-NEXT:    xscvdpsxws f0, f1
5084; CHECK-P10-NEXT:    pli r4, 244140625
5085; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5086; CHECK-P10-NEXT:    stxsihx f0, r3, r4
5087; CHECK-P10-NEXT:    blr
5088;
5089; CHECK-P9-LABEL: st_align64_float_int16_t:
5090; CHECK-P9:       # %bb.0: # %entry
5091; CHECK-P9-NEXT:    xscvdpsxws f0, f1
5092; CHECK-P9-NEXT:    lis r4, 3725
5093; CHECK-P9-NEXT:    ori r4, r4, 19025
5094; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
5095; CHECK-P9-NEXT:    stxsihx f0, r3, r4
5096; CHECK-P9-NEXT:    blr
5097;
5098; CHECK-P8-LABEL: st_align64_float_int16_t:
5099; CHECK-P8:       # %bb.0: # %entry
5100; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5101; CHECK-P8-NEXT:    lis r4, 3725
5102; CHECK-P8-NEXT:    ori r4, r4, 19025
5103; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
5104; CHECK-P8-NEXT:    mffprwz r5, f0
5105; CHECK-P8-NEXT:    sthx r5, r3, r4
5106; CHECK-P8-NEXT:    blr
5107entry:
5108  %conv = fptosi float %str to i16
5109  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
5110  %0 = bitcast i8* %add.ptr to i16*
5111  store i16 %conv, i16* %0, align 2
5112  ret void
5113}
5114
5115; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5116define dso_local void @st_reg_float_int16_t(i8* nocapture %ptr, i64 %off, float %str) {
5117; CHECK-POSTP8-LABEL: st_reg_float_int16_t:
5118; CHECK-POSTP8:       # %bb.0: # %entry
5119; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
5120; CHECK-POSTP8-NEXT:    stxsihx f0, r3, r4
5121; CHECK-POSTP8-NEXT:    blr
5122;
5123; CHECK-P8-LABEL: st_reg_float_int16_t:
5124; CHECK-P8:       # %bb.0: # %entry
5125; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5126; CHECK-P8-NEXT:    mffprwz r5, f0
5127; CHECK-P8-NEXT:    sthx r5, r3, r4
5128; CHECK-P8-NEXT:    blr
5129entry:
5130  %conv = fptosi float %str to i16
5131  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
5132  %0 = bitcast i8* %add.ptr to i16*
5133  store i16 %conv, i16* %0, align 2
5134  ret void
5135}
5136
5137; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5138define dso_local void @st_or1_float_int16_t(i64 %ptr, i8 zeroext %off, float %str) {
5139; CHECK-POSTP8-LABEL: st_or1_float_int16_t:
5140; CHECK-POSTP8:       # %bb.0: # %entry
5141; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
5142; CHECK-POSTP8-NEXT:    or r3, r4, r3
5143; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
5144; CHECK-POSTP8-NEXT:    blr
5145;
5146; CHECK-P8-LABEL: st_or1_float_int16_t:
5147; CHECK-P8:       # %bb.0: # %entry
5148; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5149; CHECK-P8-NEXT:    or r3, r4, r3
5150; CHECK-P8-NEXT:    mffprwz r5, f0
5151; CHECK-P8-NEXT:    sth r5, 0(r3)
5152; CHECK-P8-NEXT:    blr
5153entry:
5154  %conv = fptosi float %str to i16
5155  %conv1 = zext i8 %off to i64
5156  %or = or i64 %conv1, %ptr
5157  %0 = inttoptr i64 %or to i16*
5158  store i16 %conv, i16* %0, align 2
5159  ret void
5160}
5161
5162; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5163define dso_local void @st_not_disjoint16_float_int16_t(i64 %ptr, float %str) {
5164; CHECK-POSTP8-LABEL: st_not_disjoint16_float_int16_t:
5165; CHECK-POSTP8:       # %bb.0: # %entry
5166; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
5167; CHECK-POSTP8-NEXT:    ori r3, r3, 6
5168; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
5169; CHECK-POSTP8-NEXT:    blr
5170;
5171; CHECK-P8-LABEL: st_not_disjoint16_float_int16_t:
5172; CHECK-P8:       # %bb.0: # %entry
5173; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5174; CHECK-P8-NEXT:    ori r3, r3, 6
5175; CHECK-P8-NEXT:    mffprwz r4, f0
5176; CHECK-P8-NEXT:    sth r4, 0(r3)
5177; CHECK-P8-NEXT:    blr
5178entry:
5179  %conv = fptosi float %str to i16
5180  %or = or i64 %ptr, 6
5181  %0 = inttoptr i64 %or to i16*
5182  store i16 %conv, i16* %0, align 2
5183  ret void
5184}
5185
5186; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5187define dso_local void @st_disjoint_align16_float_int16_t(i64 %ptr, float %str) {
5188; CHECK-POSTP8-LABEL: st_disjoint_align16_float_int16_t:
5189; CHECK-POSTP8:       # %bb.0: # %entry
5190; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
5191; CHECK-POSTP8-NEXT:    rldicr r3, r3, 0, 51
5192; CHECK-POSTP8-NEXT:    ori r3, r3, 24
5193; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
5194; CHECK-POSTP8-NEXT:    blr
5195;
5196; CHECK-P8-LABEL: st_disjoint_align16_float_int16_t:
5197; CHECK-P8:       # %bb.0: # %entry
5198; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5199; CHECK-P8-NEXT:    rldicr r3, r3, 0, 51
5200; CHECK-P8-NEXT:    mffprwz r4, f0
5201; CHECK-P8-NEXT:    sth r4, 24(r3)
5202; CHECK-P8-NEXT:    blr
5203entry:
5204  %and = and i64 %ptr, -4096
5205  %conv = fptosi float %str to i16
5206  %or = or i64 %and, 24
5207  %0 = inttoptr i64 %or to i16*
5208  store i16 %conv, i16* %0, align 8
5209  ret void
5210}
5211
5212; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5213define dso_local void @st_not_disjoint32_float_int16_t(i64 %ptr, float %str) {
5214; CHECK-POSTP8-LABEL: st_not_disjoint32_float_int16_t:
5215; CHECK-POSTP8:       # %bb.0: # %entry
5216; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
5217; CHECK-POSTP8-NEXT:    ori r3, r3, 34463
5218; CHECK-POSTP8-NEXT:    oris r3, r3, 1
5219; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
5220; CHECK-POSTP8-NEXT:    blr
5221;
5222; CHECK-P8-LABEL: st_not_disjoint32_float_int16_t:
5223; CHECK-P8:       # %bb.0: # %entry
5224; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5225; CHECK-P8-NEXT:    ori r3, r3, 34463
5226; CHECK-P8-NEXT:    oris r3, r3, 1
5227; CHECK-P8-NEXT:    mffprwz r4, f0
5228; CHECK-P8-NEXT:    sth r4, 0(r3)
5229; CHECK-P8-NEXT:    blr
5230entry:
5231  %conv = fptosi float %str to i16
5232  %or = or i64 %ptr, 99999
5233  %0 = inttoptr i64 %or to i16*
5234  store i16 %conv, i16* %0, align 2
5235  ret void
5236}
5237
5238; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5239define dso_local void @st_disjoint_align32_float_int16_t(i64 %ptr, float %str) {
5240; CHECK-P10-LABEL: st_disjoint_align32_float_int16_t:
5241; CHECK-P10:       # %bb.0: # %entry
5242; CHECK-P10-NEXT:    xscvdpsxws f0, f1
5243; CHECK-P10-NEXT:    lis r4, -15264
5244; CHECK-P10-NEXT:    and r3, r3, r4
5245; CHECK-P10-NEXT:    pli r4, 999990000
5246; CHECK-P10-NEXT:    stxsihx f0, r3, r4
5247; CHECK-P10-NEXT:    blr
5248;
5249; CHECK-P9-LABEL: st_disjoint_align32_float_int16_t:
5250; CHECK-P9:       # %bb.0: # %entry
5251; CHECK-P9-NEXT:    xscvdpsxws f0, f1
5252; CHECK-P9-NEXT:    lis r4, -15264
5253; CHECK-P9-NEXT:    and r3, r3, r4
5254; CHECK-P9-NEXT:    lis r4, 15258
5255; CHECK-P9-NEXT:    ori r4, r4, 41712
5256; CHECK-P9-NEXT:    stxsihx f0, r3, r4
5257; CHECK-P9-NEXT:    blr
5258;
5259; CHECK-P8-LABEL: st_disjoint_align32_float_int16_t:
5260; CHECK-P8:       # %bb.0: # %entry
5261; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5262; CHECK-P8-NEXT:    lis r4, -15264
5263; CHECK-P8-NEXT:    lis r6, 15258
5264; CHECK-P8-NEXT:    and r3, r3, r4
5265; CHECK-P8-NEXT:    ori r4, r6, 41712
5266; CHECK-P8-NEXT:    mffprwz r5, f0
5267; CHECK-P8-NEXT:    sthx r5, r3, r4
5268; CHECK-P8-NEXT:    blr
5269entry:
5270  %and = and i64 %ptr, -1000341504
5271  %conv = fptosi float %str to i16
5272  %or = or i64 %and, 999990000
5273  %0 = inttoptr i64 %or to i16*
5274  store i16 %conv, i16* %0, align 16
5275  ret void
5276}
5277
5278; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5279define dso_local void @st_not_disjoint64_float_int16_t(i64 %ptr, float %str) {
5280; CHECK-P10-LABEL: st_not_disjoint64_float_int16_t:
5281; CHECK-P10:       # %bb.0: # %entry
5282; CHECK-P10-NEXT:    pli r4, 232
5283; CHECK-P10-NEXT:    pli r5, 3567587329
5284; CHECK-P10-NEXT:    xscvdpsxws f0, f1
5285; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
5286; CHECK-P10-NEXT:    or r3, r3, r5
5287; CHECK-P10-NEXT:    stxsihx f0, 0, r3
5288; CHECK-P10-NEXT:    blr
5289;
5290; CHECK-P9-LABEL: st_not_disjoint64_float_int16_t:
5291; CHECK-P9:       # %bb.0: # %entry
5292; CHECK-P9-NEXT:    li r4, 29
5293; CHECK-P9-NEXT:    xscvdpsxws f0, f1
5294; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
5295; CHECK-P9-NEXT:    oris r4, r4, 54437
5296; CHECK-P9-NEXT:    ori r4, r4, 4097
5297; CHECK-P9-NEXT:    or r3, r3, r4
5298; CHECK-P9-NEXT:    stxsihx f0, 0, r3
5299; CHECK-P9-NEXT:    blr
5300;
5301; CHECK-P8-LABEL: st_not_disjoint64_float_int16_t:
5302; CHECK-P8:       # %bb.0: # %entry
5303; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5304; CHECK-P8-NEXT:    li r4, 29
5305; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
5306; CHECK-P8-NEXT:    oris r4, r4, 54437
5307; CHECK-P8-NEXT:    ori r4, r4, 4097
5308; CHECK-P8-NEXT:    or r3, r3, r4
5309; CHECK-P8-NEXT:    mffprwz r5, f0
5310; CHECK-P8-NEXT:    sth r5, 0(r3)
5311; CHECK-P8-NEXT:    blr
5312entry:
5313  %conv = fptosi float %str to i16
5314  %or = or i64 %ptr, 1000000000001
5315  %0 = inttoptr i64 %or to i16*
5316  store i16 %conv, i16* %0, align 2
5317  ret void
5318}
5319
5320; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5321define dso_local void @st_disjoint_align64_float_int16_t(i64 %ptr, float %str) {
5322; CHECK-P10-LABEL: st_disjoint_align64_float_int16_t:
5323; CHECK-P10:       # %bb.0: # %entry
5324; CHECK-P10-NEXT:    xscvdpsxws f0, f1
5325; CHECK-P10-NEXT:    pli r4, 244140625
5326; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
5327; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5328; CHECK-P10-NEXT:    stxsihx f0, r3, r4
5329; CHECK-P10-NEXT:    blr
5330;
5331; CHECK-P9-LABEL: st_disjoint_align64_float_int16_t:
5332; CHECK-P9:       # %bb.0: # %entry
5333; CHECK-P9-NEXT:    xscvdpsxws f0, f1
5334; CHECK-P9-NEXT:    lis r4, 3725
5335; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
5336; CHECK-P9-NEXT:    ori r4, r4, 19025
5337; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
5338; CHECK-P9-NEXT:    stxsihx f0, r3, r4
5339; CHECK-P9-NEXT:    blr
5340;
5341; CHECK-P8-LABEL: st_disjoint_align64_float_int16_t:
5342; CHECK-P8:       # %bb.0: # %entry
5343; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5344; CHECK-P8-NEXT:    lis r4, 3725
5345; CHECK-P8-NEXT:    rldicr r3, r3, 0, 23
5346; CHECK-P8-NEXT:    ori r4, r4, 19025
5347; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
5348; CHECK-P8-NEXT:    mffprwz r5, f0
5349; CHECK-P8-NEXT:    sthx r5, r3, r4
5350; CHECK-P8-NEXT:    blr
5351entry:
5352  %and = and i64 %ptr, -1099511627776
5353  %conv = fptosi float %str to i16
5354  %or = or i64 %and, 1000000000000
5355  %0 = inttoptr i64 %or to i16*
5356  store i16 %conv, i16* %0, align 4096
5357  ret void
5358}
5359
5360; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5361define dso_local void @st_cst_align16_float_int16_t(float %str) {
5362; CHECK-POSTP8-LABEL: st_cst_align16_float_int16_t:
5363; CHECK-POSTP8:       # %bb.0: # %entry
5364; CHECK-POSTP8-NEXT:    xscvdpsxws f0, f1
5365; CHECK-POSTP8-NEXT:    li r3, 4080
5366; CHECK-POSTP8-NEXT:    stxsihx f0, 0, r3
5367; CHECK-POSTP8-NEXT:    blr
5368;
5369; CHECK-P8-LABEL: st_cst_align16_float_int16_t:
5370; CHECK-P8:       # %bb.0: # %entry
5371; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5372; CHECK-P8-NEXT:    mffprwz r3, f0
5373; CHECK-P8-NEXT:    sth r3, 4080(0)
5374; CHECK-P8-NEXT:    blr
5375entry:
5376  %conv = fptosi float %str to i16
5377  store i16 %conv, i16* inttoptr (i64 4080 to i16*), align 16
5378  ret void
5379}
5380
5381; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5382define dso_local void @st_cst_align32_float_int16_t(float %str) {
5383; CHECK-P10-LABEL: st_cst_align32_float_int16_t:
5384; CHECK-P10:       # %bb.0: # %entry
5385; CHECK-P10-NEXT:    xscvdpsxws f0, f1
5386; CHECK-P10-NEXT:    pli r3, 9999900
5387; CHECK-P10-NEXT:    stxsihx f0, 0, r3
5388; CHECK-P10-NEXT:    blr
5389;
5390; CHECK-P9-LABEL: st_cst_align32_float_int16_t:
5391; CHECK-P9:       # %bb.0: # %entry
5392; CHECK-P9-NEXT:    xscvdpsxws f0, f1
5393; CHECK-P9-NEXT:    lis r3, 152
5394; CHECK-P9-NEXT:    ori r3, r3, 38428
5395; CHECK-P9-NEXT:    stxsihx f0, 0, r3
5396; CHECK-P9-NEXT:    blr
5397;
5398; CHECK-P8-LABEL: st_cst_align32_float_int16_t:
5399; CHECK-P8:       # %bb.0: # %entry
5400; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5401; CHECK-P8-NEXT:    lis r4, 153
5402; CHECK-P8-NEXT:    mffprwz r3, f0
5403; CHECK-P8-NEXT:    sth r3, -27108(r4)
5404; CHECK-P8-NEXT:    blr
5405entry:
5406  %conv = fptosi float %str to i16
5407  store i16 %conv, i16* inttoptr (i64 9999900 to i16*), align 4
5408  ret void
5409}
5410
5411; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5412define dso_local void @st_cst_align64_float_int16_t(float %str) {
5413; CHECK-P10-LABEL: st_cst_align64_float_int16_t:
5414; CHECK-P10:       # %bb.0: # %entry
5415; CHECK-P10-NEXT:    xscvdpsxws f0, f1
5416; CHECK-P10-NEXT:    pli r3, 244140625
5417; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
5418; CHECK-P10-NEXT:    stxsihx f0, 0, r3
5419; CHECK-P10-NEXT:    blr
5420;
5421; CHECK-P9-LABEL: st_cst_align64_float_int16_t:
5422; CHECK-P9:       # %bb.0: # %entry
5423; CHECK-P9-NEXT:    xscvdpsxws f0, f1
5424; CHECK-P9-NEXT:    lis r3, 3725
5425; CHECK-P9-NEXT:    ori r3, r3, 19025
5426; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
5427; CHECK-P9-NEXT:    stxsihx f0, 0, r3
5428; CHECK-P9-NEXT:    blr
5429;
5430; CHECK-P8-LABEL: st_cst_align64_float_int16_t:
5431; CHECK-P8:       # %bb.0: # %entry
5432; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5433; CHECK-P8-NEXT:    lis r3, 3725
5434; CHECK-P8-NEXT:    ori r3, r3, 19025
5435; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
5436; CHECK-P8-NEXT:    mffprwz r4, f0
5437; CHECK-P8-NEXT:    sth r4, 0(r3)
5438; CHECK-P8-NEXT:    blr
5439entry:
5440  %conv = fptosi float %str to i16
5441  store i16 %conv, i16* inttoptr (i64 1000000000000 to i16*), align 4096
5442  ret void
5443}
5444
5445; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5446define dso_local void @st_0_float_uint32_t(i64 %ptr, float %str) {
5447; CHECK-LABEL: st_0_float_uint32_t:
5448; CHECK:       # %bb.0: # %entry
5449; CHECK-NEXT:    xscvdpuxws f0, f1
5450; CHECK-NEXT:    stfiwx f0, 0, r3
5451; CHECK-NEXT:    blr
5452entry:
5453  %conv = fptoui float %str to i32
5454  %0 = inttoptr i64 %ptr to i32*
5455  store i32 %conv, i32* %0, align 4
5456  ret void
5457}
5458
5459; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5460define dso_local void @st_align16_float_uint32_t(i8* nocapture %ptr, float %str) {
5461; CHECK-LABEL: st_align16_float_uint32_t:
5462; CHECK:       # %bb.0: # %entry
5463; CHECK-NEXT:    xscvdpuxws f0, f1
5464; CHECK-NEXT:    addi r3, r3, 8
5465; CHECK-NEXT:    stfiwx f0, 0, r3
5466; CHECK-NEXT:    blr
5467entry:
5468  %conv = fptoui float %str to i32
5469  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
5470  %0 = bitcast i8* %add.ptr to i32*
5471  store i32 %conv, i32* %0, align 4
5472  ret void
5473}
5474
5475; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5476define dso_local void @st_align32_float_uint32_t(i8* nocapture %ptr, float %str) {
5477; CHECK-P10-LABEL: st_align32_float_uint32_t:
5478; CHECK-P10:       # %bb.0: # %entry
5479; CHECK-P10-NEXT:    xscvdpuxws f0, f1
5480; CHECK-P10-NEXT:    pli r4, 99999000
5481; CHECK-P10-NEXT:    stfiwx f0, r3, r4
5482; CHECK-P10-NEXT:    blr
5483;
5484; CHECK-PREP10-LABEL: st_align32_float_uint32_t:
5485; CHECK-PREP10:       # %bb.0: # %entry
5486; CHECK-PREP10-NEXT:    xscvdpuxws f0, f1
5487; CHECK-PREP10-NEXT:    lis r4, 1525
5488; CHECK-PREP10-NEXT:    ori r4, r4, 56600
5489; CHECK-PREP10-NEXT:    stfiwx f0, r3, r4
5490; CHECK-PREP10-NEXT:    blr
5491entry:
5492  %conv = fptoui float %str to i32
5493  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
5494  %0 = bitcast i8* %add.ptr to i32*
5495  store i32 %conv, i32* %0, align 4
5496  ret void
5497}
5498
5499; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5500define dso_local void @st_align64_float_uint32_t(i8* nocapture %ptr, float %str) {
5501; CHECK-P10-LABEL: st_align64_float_uint32_t:
5502; CHECK-P10:       # %bb.0: # %entry
5503; CHECK-P10-NEXT:    xscvdpuxws f0, f1
5504; CHECK-P10-NEXT:    pli r4, 244140625
5505; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5506; CHECK-P10-NEXT:    stfiwx f0, r3, r4
5507; CHECK-P10-NEXT:    blr
5508;
5509; CHECK-PREP10-LABEL: st_align64_float_uint32_t:
5510; CHECK-PREP10:       # %bb.0: # %entry
5511; CHECK-PREP10-NEXT:    xscvdpuxws f0, f1
5512; CHECK-PREP10-NEXT:    lis r4, 3725
5513; CHECK-PREP10-NEXT:    ori r4, r4, 19025
5514; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
5515; CHECK-PREP10-NEXT:    stfiwx f0, r3, r4
5516; CHECK-PREP10-NEXT:    blr
5517entry:
5518  %conv = fptoui float %str to i32
5519  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
5520  %0 = bitcast i8* %add.ptr to i32*
5521  store i32 %conv, i32* %0, align 4
5522  ret void
5523}
5524
5525; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5526define dso_local void @st_reg_float_uint32_t(i8* nocapture %ptr, i64 %off, float %str) {
5527; CHECK-LABEL: st_reg_float_uint32_t:
5528; CHECK:       # %bb.0: # %entry
5529; CHECK-NEXT:    xscvdpuxws f0, f1
5530; CHECK-NEXT:    stfiwx f0, r3, r4
5531; CHECK-NEXT:    blr
5532entry:
5533  %conv = fptoui float %str to i32
5534  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
5535  %0 = bitcast i8* %add.ptr to i32*
5536  store i32 %conv, i32* %0, align 4
5537  ret void
5538}
5539
5540; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5541define dso_local void @st_or1_float_uint32_t(i64 %ptr, i8 zeroext %off, float %str) {
5542; CHECK-LABEL: st_or1_float_uint32_t:
5543; CHECK:       # %bb.0: # %entry
5544; CHECK-NEXT:    xscvdpuxws f0, f1
5545; CHECK-NEXT:    or r3, r4, r3
5546; CHECK-NEXT:    stfiwx f0, 0, r3
5547; CHECK-NEXT:    blr
5548entry:
5549  %conv = fptoui float %str to i32
5550  %conv1 = zext i8 %off to i64
5551  %or = or i64 %conv1, %ptr
5552  %0 = inttoptr i64 %or to i32*
5553  store i32 %conv, i32* %0, align 4
5554  ret void
5555}
5556
5557; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5558define dso_local void @st_not_disjoint16_float_uint32_t(i64 %ptr, float %str) {
5559; CHECK-LABEL: st_not_disjoint16_float_uint32_t:
5560; CHECK:       # %bb.0: # %entry
5561; CHECK-NEXT:    xscvdpuxws f0, f1
5562; CHECK-NEXT:    ori r3, r3, 6
5563; CHECK-NEXT:    stfiwx f0, 0, r3
5564; CHECK-NEXT:    blr
5565entry:
5566  %conv = fptoui float %str to i32
5567  %or = or i64 %ptr, 6
5568  %0 = inttoptr i64 %or to i32*
5569  store i32 %conv, i32* %0, align 4
5570  ret void
5571}
5572
5573; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5574define dso_local void @st_disjoint_align16_float_uint32_t(i64 %ptr, float %str) {
5575; CHECK-LABEL: st_disjoint_align16_float_uint32_t:
5576; CHECK:       # %bb.0: # %entry
5577; CHECK-NEXT:    xscvdpuxws f0, f1
5578; CHECK-NEXT:    rldicr r3, r3, 0, 51
5579; CHECK-NEXT:    ori r3, r3, 24
5580; CHECK-NEXT:    stfiwx f0, 0, r3
5581; CHECK-NEXT:    blr
5582entry:
5583  %and = and i64 %ptr, -4096
5584  %conv = fptoui float %str to i32
5585  %or = or i64 %and, 24
5586  %0 = inttoptr i64 %or to i32*
5587  store i32 %conv, i32* %0, align 8
5588  ret void
5589}
5590
5591; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5592define dso_local void @st_not_disjoint32_float_uint32_t(i64 %ptr, float %str) {
5593; CHECK-LABEL: st_not_disjoint32_float_uint32_t:
5594; CHECK:       # %bb.0: # %entry
5595; CHECK-NEXT:    xscvdpuxws f0, f1
5596; CHECK-NEXT:    ori r3, r3, 34463
5597; CHECK-NEXT:    oris r3, r3, 1
5598; CHECK-NEXT:    stfiwx f0, 0, r3
5599; CHECK-NEXT:    blr
5600entry:
5601  %conv = fptoui float %str to i32
5602  %or = or i64 %ptr, 99999
5603  %0 = inttoptr i64 %or to i32*
5604  store i32 %conv, i32* %0, align 4
5605  ret void
5606}
5607
5608; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5609define dso_local void @st_disjoint_align32_float_uint32_t(i64 %ptr, float %str) {
5610; CHECK-P10-LABEL: st_disjoint_align32_float_uint32_t:
5611; CHECK-P10:       # %bb.0: # %entry
5612; CHECK-P10-NEXT:    xscvdpuxws f0, f1
5613; CHECK-P10-NEXT:    lis r4, -15264
5614; CHECK-P10-NEXT:    and r3, r3, r4
5615; CHECK-P10-NEXT:    pli r4, 999990000
5616; CHECK-P10-NEXT:    stfiwx f0, r3, r4
5617; CHECK-P10-NEXT:    blr
5618;
5619; CHECK-P9-LABEL: st_disjoint_align32_float_uint32_t:
5620; CHECK-P9:       # %bb.0: # %entry
5621; CHECK-P9-NEXT:    xscvdpuxws f0, f1
5622; CHECK-P9-NEXT:    lis r4, -15264
5623; CHECK-P9-NEXT:    and r3, r3, r4
5624; CHECK-P9-NEXT:    lis r4, 15258
5625; CHECK-P9-NEXT:    ori r4, r4, 41712
5626; CHECK-P9-NEXT:    stfiwx f0, r3, r4
5627; CHECK-P9-NEXT:    blr
5628;
5629; CHECK-P8-LABEL: st_disjoint_align32_float_uint32_t:
5630; CHECK-P8:       # %bb.0: # %entry
5631; CHECK-P8-NEXT:    xscvdpuxws f0, f1
5632; CHECK-P8-NEXT:    lis r4, -15264
5633; CHECK-P8-NEXT:    lis r5, 15258
5634; CHECK-P8-NEXT:    and r3, r3, r4
5635; CHECK-P8-NEXT:    ori r4, r5, 41712
5636; CHECK-P8-NEXT:    stfiwx f0, r3, r4
5637; CHECK-P8-NEXT:    blr
5638entry:
5639  %and = and i64 %ptr, -1000341504
5640  %conv = fptoui float %str to i32
5641  %or = or i64 %and, 999990000
5642  %0 = inttoptr i64 %or to i32*
5643  store i32 %conv, i32* %0, align 16
5644  ret void
5645}
5646
5647; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5648define dso_local void @st_not_disjoint64_float_uint32_t(i64 %ptr, float %str) {
5649; CHECK-P10-LABEL: st_not_disjoint64_float_uint32_t:
5650; CHECK-P10:       # %bb.0: # %entry
5651; CHECK-P10-NEXT:    pli r4, 232
5652; CHECK-P10-NEXT:    pli r5, 3567587329
5653; CHECK-P10-NEXT:    xscvdpuxws f0, f1
5654; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
5655; CHECK-P10-NEXT:    or r3, r3, r5
5656; CHECK-P10-NEXT:    stfiwx f0, 0, r3
5657; CHECK-P10-NEXT:    blr
5658;
5659; CHECK-P9-LABEL: st_not_disjoint64_float_uint32_t:
5660; CHECK-P9:       # %bb.0: # %entry
5661; CHECK-P9-NEXT:    li r4, 29
5662; CHECK-P9-NEXT:    xscvdpuxws f0, f1
5663; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
5664; CHECK-P9-NEXT:    oris r4, r4, 54437
5665; CHECK-P9-NEXT:    ori r4, r4, 4097
5666; CHECK-P9-NEXT:    or r3, r3, r4
5667; CHECK-P9-NEXT:    stfiwx f0, 0, r3
5668; CHECK-P9-NEXT:    blr
5669;
5670; CHECK-P8-LABEL: st_not_disjoint64_float_uint32_t:
5671; CHECK-P8:       # %bb.0: # %entry
5672; CHECK-P8-NEXT:    xscvdpuxws f0, f1
5673; CHECK-P8-NEXT:    li r4, 29
5674; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
5675; CHECK-P8-NEXT:    oris r4, r4, 54437
5676; CHECK-P8-NEXT:    ori r4, r4, 4097
5677; CHECK-P8-NEXT:    or r3, r3, r4
5678; CHECK-P8-NEXT:    stfiwx f0, 0, r3
5679; CHECK-P8-NEXT:    blr
5680entry:
5681  %conv = fptoui float %str to i32
5682  %or = or i64 %ptr, 1000000000001
5683  %0 = inttoptr i64 %or to i32*
5684  store i32 %conv, i32* %0, align 4
5685  ret void
5686}
5687
5688; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5689define dso_local void @st_disjoint_align64_float_uint32_t(i64 %ptr, float %str) {
5690; CHECK-P10-LABEL: st_disjoint_align64_float_uint32_t:
5691; CHECK-P10:       # %bb.0: # %entry
5692; CHECK-P10-NEXT:    xscvdpuxws f0, f1
5693; CHECK-P10-NEXT:    pli r4, 244140625
5694; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
5695; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5696; CHECK-P10-NEXT:    stfiwx f0, r3, r4
5697; CHECK-P10-NEXT:    blr
5698;
5699; CHECK-PREP10-LABEL: st_disjoint_align64_float_uint32_t:
5700; CHECK-PREP10:       # %bb.0: # %entry
5701; CHECK-PREP10-NEXT:    xscvdpuxws f0, f1
5702; CHECK-PREP10-NEXT:    lis r4, 3725
5703; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
5704; CHECK-PREP10-NEXT:    ori r4, r4, 19025
5705; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
5706; CHECK-PREP10-NEXT:    stfiwx f0, r3, r4
5707; CHECK-PREP10-NEXT:    blr
5708entry:
5709  %and = and i64 %ptr, -1099511627776
5710  %conv = fptoui float %str to i32
5711  %or = or i64 %and, 1000000000000
5712  %0 = inttoptr i64 %or to i32*
5713  store i32 %conv, i32* %0, align 4096
5714  ret void
5715}
5716
5717; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5718define dso_local void @st_cst_align16_float_uint32_t(float %str) {
5719; CHECK-LABEL: st_cst_align16_float_uint32_t:
5720; CHECK:       # %bb.0: # %entry
5721; CHECK-NEXT:    xscvdpuxws f0, f1
5722; CHECK-NEXT:    li r3, 4080
5723; CHECK-NEXT:    stfiwx f0, 0, r3
5724; CHECK-NEXT:    blr
5725entry:
5726  %conv = fptoui float %str to i32
5727  store i32 %conv, i32* inttoptr (i64 4080 to i32*), align 16
5728  ret void
5729}
5730
5731; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5732define dso_local void @st_cst_align32_float_uint32_t(float %str) {
5733; CHECK-P10-LABEL: st_cst_align32_float_uint32_t:
5734; CHECK-P10:       # %bb.0: # %entry
5735; CHECK-P10-NEXT:    xscvdpuxws f0, f1
5736; CHECK-P10-NEXT:    pli r3, 9999900
5737; CHECK-P10-NEXT:    stfiwx f0, 0, r3
5738; CHECK-P10-NEXT:    blr
5739;
5740; CHECK-PREP10-LABEL: st_cst_align32_float_uint32_t:
5741; CHECK-PREP10:       # %bb.0: # %entry
5742; CHECK-PREP10-NEXT:    xscvdpuxws f0, f1
5743; CHECK-PREP10-NEXT:    lis r3, 152
5744; CHECK-PREP10-NEXT:    ori r3, r3, 38428
5745; CHECK-PREP10-NEXT:    stfiwx f0, 0, r3
5746; CHECK-PREP10-NEXT:    blr
5747entry:
5748  %conv = fptoui float %str to i32
5749  store i32 %conv, i32* inttoptr (i64 9999900 to i32*), align 4
5750  ret void
5751}
5752
5753; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5754define dso_local void @st_cst_align64_float_uint32_t(float %str) {
5755; CHECK-P10-LABEL: st_cst_align64_float_uint32_t:
5756; CHECK-P10:       # %bb.0: # %entry
5757; CHECK-P10-NEXT:    xscvdpuxws f0, f1
5758; CHECK-P10-NEXT:    pli r3, 244140625
5759; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
5760; CHECK-P10-NEXT:    stfiwx f0, 0, r3
5761; CHECK-P10-NEXT:    blr
5762;
5763; CHECK-PREP10-LABEL: st_cst_align64_float_uint32_t:
5764; CHECK-PREP10:       # %bb.0: # %entry
5765; CHECK-PREP10-NEXT:    xscvdpuxws f0, f1
5766; CHECK-PREP10-NEXT:    lis r3, 3725
5767; CHECK-PREP10-NEXT:    ori r3, r3, 19025
5768; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
5769; CHECK-PREP10-NEXT:    stfiwx f0, 0, r3
5770; CHECK-PREP10-NEXT:    blr
5771entry:
5772  %conv = fptoui float %str to i32
5773  store i32 %conv, i32* inttoptr (i64 1000000000000 to i32*), align 4096
5774  ret void
5775}
5776
5777; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5778define dso_local void @st_0_float_int32_t(i64 %ptr, float %str) {
5779; CHECK-LABEL: st_0_float_int32_t:
5780; CHECK:       # %bb.0: # %entry
5781; CHECK-NEXT:    xscvdpsxws f0, f1
5782; CHECK-NEXT:    stfiwx f0, 0, r3
5783; CHECK-NEXT:    blr
5784entry:
5785  %conv = fptosi float %str to i32
5786  %0 = inttoptr i64 %ptr to i32*
5787  store i32 %conv, i32* %0, align 4
5788  ret void
5789}
5790
5791; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5792define dso_local void @st_align16_float_int32_t(i8* nocapture %ptr, float %str) {
5793; CHECK-LABEL: st_align16_float_int32_t:
5794; CHECK:       # %bb.0: # %entry
5795; CHECK-NEXT:    xscvdpsxws f0, f1
5796; CHECK-NEXT:    addi r3, r3, 8
5797; CHECK-NEXT:    stfiwx f0, 0, r3
5798; CHECK-NEXT:    blr
5799entry:
5800  %conv = fptosi float %str to i32
5801  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
5802  %0 = bitcast i8* %add.ptr to i32*
5803  store i32 %conv, i32* %0, align 4
5804  ret void
5805}
5806
5807; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5808define dso_local void @st_align32_float_int32_t(i8* nocapture %ptr, float %str) {
5809; CHECK-P10-LABEL: st_align32_float_int32_t:
5810; CHECK-P10:       # %bb.0: # %entry
5811; CHECK-P10-NEXT:    xscvdpsxws f0, f1
5812; CHECK-P10-NEXT:    pli r4, 99999000
5813; CHECK-P10-NEXT:    stfiwx f0, r3, r4
5814; CHECK-P10-NEXT:    blr
5815;
5816; CHECK-PREP10-LABEL: st_align32_float_int32_t:
5817; CHECK-PREP10:       # %bb.0: # %entry
5818; CHECK-PREP10-NEXT:    xscvdpsxws f0, f1
5819; CHECK-PREP10-NEXT:    lis r4, 1525
5820; CHECK-PREP10-NEXT:    ori r4, r4, 56600
5821; CHECK-PREP10-NEXT:    stfiwx f0, r3, r4
5822; CHECK-PREP10-NEXT:    blr
5823entry:
5824  %conv = fptosi float %str to i32
5825  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
5826  %0 = bitcast i8* %add.ptr to i32*
5827  store i32 %conv, i32* %0, align 4
5828  ret void
5829}
5830
5831; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5832define dso_local void @st_align64_float_int32_t(i8* nocapture %ptr, float %str) {
5833; CHECK-P10-LABEL: st_align64_float_int32_t:
5834; CHECK-P10:       # %bb.0: # %entry
5835; CHECK-P10-NEXT:    xscvdpsxws f0, f1
5836; CHECK-P10-NEXT:    pli r4, 244140625
5837; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5838; CHECK-P10-NEXT:    stfiwx f0, r3, r4
5839; CHECK-P10-NEXT:    blr
5840;
5841; CHECK-PREP10-LABEL: st_align64_float_int32_t:
5842; CHECK-PREP10:       # %bb.0: # %entry
5843; CHECK-PREP10-NEXT:    xscvdpsxws f0, f1
5844; CHECK-PREP10-NEXT:    lis r4, 3725
5845; CHECK-PREP10-NEXT:    ori r4, r4, 19025
5846; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
5847; CHECK-PREP10-NEXT:    stfiwx f0, r3, r4
5848; CHECK-PREP10-NEXT:    blr
5849entry:
5850  %conv = fptosi float %str to i32
5851  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
5852  %0 = bitcast i8* %add.ptr to i32*
5853  store i32 %conv, i32* %0, align 4
5854  ret void
5855}
5856
5857; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5858define dso_local void @st_reg_float_int32_t(i8* nocapture %ptr, i64 %off, float %str) {
5859; CHECK-LABEL: st_reg_float_int32_t:
5860; CHECK:       # %bb.0: # %entry
5861; CHECK-NEXT:    xscvdpsxws f0, f1
5862; CHECK-NEXT:    stfiwx f0, r3, r4
5863; CHECK-NEXT:    blr
5864entry:
5865  %conv = fptosi float %str to i32
5866  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
5867  %0 = bitcast i8* %add.ptr to i32*
5868  store i32 %conv, i32* %0, align 4
5869  ret void
5870}
5871
5872; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5873define dso_local void @st_or1_float_int32_t(i64 %ptr, i8 zeroext %off, float %str) {
5874; CHECK-LABEL: st_or1_float_int32_t:
5875; CHECK:       # %bb.0: # %entry
5876; CHECK-NEXT:    xscvdpsxws f0, f1
5877; CHECK-NEXT:    or r3, r4, r3
5878; CHECK-NEXT:    stfiwx f0, 0, r3
5879; CHECK-NEXT:    blr
5880entry:
5881  %conv = fptosi float %str to i32
5882  %conv1 = zext i8 %off to i64
5883  %or = or i64 %conv1, %ptr
5884  %0 = inttoptr i64 %or to i32*
5885  store i32 %conv, i32* %0, align 4
5886  ret void
5887}
5888
5889; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5890define dso_local void @st_not_disjoint16_float_int32_t(i64 %ptr, float %str) {
5891; CHECK-LABEL: st_not_disjoint16_float_int32_t:
5892; CHECK:       # %bb.0: # %entry
5893; CHECK-NEXT:    xscvdpsxws f0, f1
5894; CHECK-NEXT:    ori r3, r3, 6
5895; CHECK-NEXT:    stfiwx f0, 0, r3
5896; CHECK-NEXT:    blr
5897entry:
5898  %conv = fptosi float %str to i32
5899  %or = or i64 %ptr, 6
5900  %0 = inttoptr i64 %or to i32*
5901  store i32 %conv, i32* %0, align 4
5902  ret void
5903}
5904
5905; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5906define dso_local void @st_disjoint_align16_float_int32_t(i64 %ptr, float %str) {
5907; CHECK-LABEL: st_disjoint_align16_float_int32_t:
5908; CHECK:       # %bb.0: # %entry
5909; CHECK-NEXT:    xscvdpsxws f0, f1
5910; CHECK-NEXT:    rldicr r3, r3, 0, 51
5911; CHECK-NEXT:    ori r3, r3, 24
5912; CHECK-NEXT:    stfiwx f0, 0, r3
5913; CHECK-NEXT:    blr
5914entry:
5915  %and = and i64 %ptr, -4096
5916  %conv = fptosi float %str to i32
5917  %or = or i64 %and, 24
5918  %0 = inttoptr i64 %or to i32*
5919  store i32 %conv, i32* %0, align 8
5920  ret void
5921}
5922
5923; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5924define dso_local void @st_not_disjoint32_float_int32_t(i64 %ptr, float %str) {
5925; CHECK-LABEL: st_not_disjoint32_float_int32_t:
5926; CHECK:       # %bb.0: # %entry
5927; CHECK-NEXT:    xscvdpsxws f0, f1
5928; CHECK-NEXT:    ori r3, r3, 34463
5929; CHECK-NEXT:    oris r3, r3, 1
5930; CHECK-NEXT:    stfiwx f0, 0, r3
5931; CHECK-NEXT:    blr
5932entry:
5933  %conv = fptosi float %str to i32
5934  %or = or i64 %ptr, 99999
5935  %0 = inttoptr i64 %or to i32*
5936  store i32 %conv, i32* %0, align 4
5937  ret void
5938}
5939
5940; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5941define dso_local void @st_disjoint_align32_float_int32_t(i64 %ptr, float %str) {
5942; CHECK-P10-LABEL: st_disjoint_align32_float_int32_t:
5943; CHECK-P10:       # %bb.0: # %entry
5944; CHECK-P10-NEXT:    xscvdpsxws f0, f1
5945; CHECK-P10-NEXT:    lis r4, -15264
5946; CHECK-P10-NEXT:    and r3, r3, r4
5947; CHECK-P10-NEXT:    pli r4, 999990000
5948; CHECK-P10-NEXT:    stfiwx f0, r3, r4
5949; CHECK-P10-NEXT:    blr
5950;
5951; CHECK-P9-LABEL: st_disjoint_align32_float_int32_t:
5952; CHECK-P9:       # %bb.0: # %entry
5953; CHECK-P9-NEXT:    xscvdpsxws f0, f1
5954; CHECK-P9-NEXT:    lis r4, -15264
5955; CHECK-P9-NEXT:    and r3, r3, r4
5956; CHECK-P9-NEXT:    lis r4, 15258
5957; CHECK-P9-NEXT:    ori r4, r4, 41712
5958; CHECK-P9-NEXT:    stfiwx f0, r3, r4
5959; CHECK-P9-NEXT:    blr
5960;
5961; CHECK-P8-LABEL: st_disjoint_align32_float_int32_t:
5962; CHECK-P8:       # %bb.0: # %entry
5963; CHECK-P8-NEXT:    xscvdpsxws f0, f1
5964; CHECK-P8-NEXT:    lis r4, -15264
5965; CHECK-P8-NEXT:    lis r5, 15258
5966; CHECK-P8-NEXT:    and r3, r3, r4
5967; CHECK-P8-NEXT:    ori r4, r5, 41712
5968; CHECK-P8-NEXT:    stfiwx f0, r3, r4
5969; CHECK-P8-NEXT:    blr
5970entry:
5971  %and = and i64 %ptr, -1000341504
5972  %conv = fptosi float %str to i32
5973  %or = or i64 %and, 999990000
5974  %0 = inttoptr i64 %or to i32*
5975  store i32 %conv, i32* %0, align 16
5976  ret void
5977}
5978
5979; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
5980define dso_local void @st_not_disjoint64_float_int32_t(i64 %ptr, float %str) {
5981; CHECK-P10-LABEL: st_not_disjoint64_float_int32_t:
5982; CHECK-P10:       # %bb.0: # %entry
5983; CHECK-P10-NEXT:    pli r4, 232
5984; CHECK-P10-NEXT:    pli r5, 3567587329
5985; CHECK-P10-NEXT:    xscvdpsxws f0, f1
5986; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
5987; CHECK-P10-NEXT:    or r3, r3, r5
5988; CHECK-P10-NEXT:    stfiwx f0, 0, r3
5989; CHECK-P10-NEXT:    blr
5990;
5991; CHECK-P9-LABEL: st_not_disjoint64_float_int32_t:
5992; CHECK-P9:       # %bb.0: # %entry
5993; CHECK-P9-NEXT:    li r4, 29
5994; CHECK-P9-NEXT:    xscvdpsxws f0, f1
5995; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
5996; CHECK-P9-NEXT:    oris r4, r4, 54437
5997; CHECK-P9-NEXT:    ori r4, r4, 4097
5998; CHECK-P9-NEXT:    or r3, r3, r4
5999; CHECK-P9-NEXT:    stfiwx f0, 0, r3
6000; CHECK-P9-NEXT:    blr
6001;
6002; CHECK-P8-LABEL: st_not_disjoint64_float_int32_t:
6003; CHECK-P8:       # %bb.0: # %entry
6004; CHECK-P8-NEXT:    xscvdpsxws f0, f1
6005; CHECK-P8-NEXT:    li r4, 29
6006; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
6007; CHECK-P8-NEXT:    oris r4, r4, 54437
6008; CHECK-P8-NEXT:    ori r4, r4, 4097
6009; CHECK-P8-NEXT:    or r3, r3, r4
6010; CHECK-P8-NEXT:    stfiwx f0, 0, r3
6011; CHECK-P8-NEXT:    blr
6012entry:
6013  %conv = fptosi float %str to i32
6014  %or = or i64 %ptr, 1000000000001
6015  %0 = inttoptr i64 %or to i32*
6016  store i32 %conv, i32* %0, align 4
6017  ret void
6018}
6019
6020; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6021define dso_local void @st_disjoint_align64_float_int32_t(i64 %ptr, float %str) {
6022; CHECK-P10-LABEL: st_disjoint_align64_float_int32_t:
6023; CHECK-P10:       # %bb.0: # %entry
6024; CHECK-P10-NEXT:    xscvdpsxws f0, f1
6025; CHECK-P10-NEXT:    pli r4, 244140625
6026; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
6027; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
6028; CHECK-P10-NEXT:    stfiwx f0, r3, r4
6029; CHECK-P10-NEXT:    blr
6030;
6031; CHECK-PREP10-LABEL: st_disjoint_align64_float_int32_t:
6032; CHECK-PREP10:       # %bb.0: # %entry
6033; CHECK-PREP10-NEXT:    xscvdpsxws f0, f1
6034; CHECK-PREP10-NEXT:    lis r4, 3725
6035; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
6036; CHECK-PREP10-NEXT:    ori r4, r4, 19025
6037; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
6038; CHECK-PREP10-NEXT:    stfiwx f0, r3, r4
6039; CHECK-PREP10-NEXT:    blr
6040entry:
6041  %and = and i64 %ptr, -1099511627776
6042  %conv = fptosi float %str to i32
6043  %or = or i64 %and, 1000000000000
6044  %0 = inttoptr i64 %or to i32*
6045  store i32 %conv, i32* %0, align 4096
6046  ret void
6047}
6048
6049; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6050define dso_local void @st_cst_align16_float_int32_t(float %str) {
6051; CHECK-LABEL: st_cst_align16_float_int32_t:
6052; CHECK:       # %bb.0: # %entry
6053; CHECK-NEXT:    xscvdpsxws f0, f1
6054; CHECK-NEXT:    li r3, 4080
6055; CHECK-NEXT:    stfiwx f0, 0, r3
6056; CHECK-NEXT:    blr
6057entry:
6058  %conv = fptosi float %str to i32
6059  store i32 %conv, i32* inttoptr (i64 4080 to i32*), align 16
6060  ret void
6061}
6062
6063; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6064define dso_local void @st_cst_align32_float_int32_t(float %str) {
6065; CHECK-P10-LABEL: st_cst_align32_float_int32_t:
6066; CHECK-P10:       # %bb.0: # %entry
6067; CHECK-P10-NEXT:    xscvdpsxws f0, f1
6068; CHECK-P10-NEXT:    pli r3, 9999900
6069; CHECK-P10-NEXT:    stfiwx f0, 0, r3
6070; CHECK-P10-NEXT:    blr
6071;
6072; CHECK-PREP10-LABEL: st_cst_align32_float_int32_t:
6073; CHECK-PREP10:       # %bb.0: # %entry
6074; CHECK-PREP10-NEXT:    xscvdpsxws f0, f1
6075; CHECK-PREP10-NEXT:    lis r3, 152
6076; CHECK-PREP10-NEXT:    ori r3, r3, 38428
6077; CHECK-PREP10-NEXT:    stfiwx f0, 0, r3
6078; CHECK-PREP10-NEXT:    blr
6079entry:
6080  %conv = fptosi float %str to i32
6081  store i32 %conv, i32* inttoptr (i64 9999900 to i32*), align 4
6082  ret void
6083}
6084
6085; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6086define dso_local void @st_cst_align64_float_int32_t(float %str) {
6087; CHECK-P10-LABEL: st_cst_align64_float_int32_t:
6088; CHECK-P10:       # %bb.0: # %entry
6089; CHECK-P10-NEXT:    xscvdpsxws f0, f1
6090; CHECK-P10-NEXT:    pli r3, 244140625
6091; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
6092; CHECK-P10-NEXT:    stfiwx f0, 0, r3
6093; CHECK-P10-NEXT:    blr
6094;
6095; CHECK-PREP10-LABEL: st_cst_align64_float_int32_t:
6096; CHECK-PREP10:       # %bb.0: # %entry
6097; CHECK-PREP10-NEXT:    xscvdpsxws f0, f1
6098; CHECK-PREP10-NEXT:    lis r3, 3725
6099; CHECK-PREP10-NEXT:    ori r3, r3, 19025
6100; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
6101; CHECK-PREP10-NEXT:    stfiwx f0, 0, r3
6102; CHECK-PREP10-NEXT:    blr
6103entry:
6104  %conv = fptosi float %str to i32
6105  store i32 %conv, i32* inttoptr (i64 1000000000000 to i32*), align 4096
6106  ret void
6107}
6108
6109; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6110define dso_local void @st_0_float_uint64_t(i64 %ptr, float %str) {
6111; CHECK-POSTP8-LABEL: st_0_float_uint64_t:
6112; CHECK-POSTP8:       # %bb.0: # %entry
6113; CHECK-POSTP8-NEXT:    xscvdpuxds v2, f1
6114; CHECK-POSTP8-NEXT:    stxsd v2, 0(r3)
6115; CHECK-POSTP8-NEXT:    blr
6116;
6117; CHECK-P8-LABEL: st_0_float_uint64_t:
6118; CHECK-P8:       # %bb.0: # %entry
6119; CHECK-P8-NEXT:    xscvdpuxds f0, f1
6120; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6121; CHECK-P8-NEXT:    blr
6122entry:
6123  %conv = fptoui float %str to i64
6124  %0 = inttoptr i64 %ptr to i64*
6125  store i64 %conv, i64* %0, align 8
6126  ret void
6127}
6128
6129; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6130define dso_local void @st_align16_float_uint64_t(i8* nocapture %ptr, float %str) {
6131; CHECK-POSTP8-LABEL: st_align16_float_uint64_t:
6132; CHECK-POSTP8:       # %bb.0: # %entry
6133; CHECK-POSTP8-NEXT:    xscvdpuxds v2, f1
6134; CHECK-POSTP8-NEXT:    stxsd v2, 8(r3)
6135; CHECK-POSTP8-NEXT:    blr
6136;
6137; CHECK-P8-LABEL: st_align16_float_uint64_t:
6138; CHECK-P8:       # %bb.0: # %entry
6139; CHECK-P8-NEXT:    xscvdpuxds f0, f1
6140; CHECK-P8-NEXT:    li r4, 8
6141; CHECK-P8-NEXT:    stxsdx f0, r3, r4
6142; CHECK-P8-NEXT:    blr
6143entry:
6144  %conv = fptoui float %str to i64
6145  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
6146  %0 = bitcast i8* %add.ptr to i64*
6147  store i64 %conv, i64* %0, align 8
6148  ret void
6149}
6150
6151; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6152define dso_local void @st_align32_float_uint64_t(i8* nocapture %ptr, float %str) {
6153; CHECK-P10-LABEL: st_align32_float_uint64_t:
6154; CHECK-P10:       # %bb.0: # %entry
6155; CHECK-P10-NEXT:    xscvdpuxds v2, f1
6156; CHECK-P10-NEXT:    pstxsd v2, 99999000(r3), 0
6157; CHECK-P10-NEXT:    blr
6158;
6159; CHECK-PREP10-LABEL: st_align32_float_uint64_t:
6160; CHECK-PREP10:       # %bb.0: # %entry
6161; CHECK-PREP10-NEXT:    xscvdpuxds f0, f1
6162; CHECK-PREP10-NEXT:    lis r4, 1525
6163; CHECK-PREP10-NEXT:    ori r4, r4, 56600
6164; CHECK-PREP10-NEXT:    stxsdx f0, r3, r4
6165; CHECK-PREP10-NEXT:    blr
6166entry:
6167  %conv = fptoui float %str to i64
6168  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
6169  %0 = bitcast i8* %add.ptr to i64*
6170  store i64 %conv, i64* %0, align 8
6171  ret void
6172}
6173
6174; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6175define dso_local void @st_align64_float_uint64_t(i8* nocapture %ptr, float %str) {
6176; CHECK-P10-LABEL: st_align64_float_uint64_t:
6177; CHECK-P10:       # %bb.0: # %entry
6178; CHECK-P10-NEXT:    xscvdpuxds f0, f1
6179; CHECK-P10-NEXT:    pli r4, 244140625
6180; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
6181; CHECK-P10-NEXT:    stxsdx f0, r3, r4
6182; CHECK-P10-NEXT:    blr
6183;
6184; CHECK-PREP10-LABEL: st_align64_float_uint64_t:
6185; CHECK-PREP10:       # %bb.0: # %entry
6186; CHECK-PREP10-NEXT:    xscvdpuxds f0, f1
6187; CHECK-PREP10-NEXT:    lis r4, 3725
6188; CHECK-PREP10-NEXT:    ori r4, r4, 19025
6189; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
6190; CHECK-PREP10-NEXT:    stxsdx f0, r3, r4
6191; CHECK-PREP10-NEXT:    blr
6192entry:
6193  %conv = fptoui float %str to i64
6194  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
6195  %0 = bitcast i8* %add.ptr to i64*
6196  store i64 %conv, i64* %0, align 8
6197  ret void
6198}
6199
6200; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6201define dso_local void @st_reg_float_uint64_t(i8* nocapture %ptr, i64 %off, float %str) {
6202; CHECK-LABEL: st_reg_float_uint64_t:
6203; CHECK:       # %bb.0: # %entry
6204; CHECK-NEXT:    xscvdpuxds f0, f1
6205; CHECK-NEXT:    stxsdx f0, r3, r4
6206; CHECK-NEXT:    blr
6207entry:
6208  %conv = fptoui float %str to i64
6209  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
6210  %0 = bitcast i8* %add.ptr to i64*
6211  store i64 %conv, i64* %0, align 8
6212  ret void
6213}
6214
6215; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6216define dso_local void @st_or1_float_uint64_t(i64 %ptr, i8 zeroext %off, float %str) {
6217; CHECK-POSTP8-LABEL: st_or1_float_uint64_t:
6218; CHECK-POSTP8:       # %bb.0: # %entry
6219; CHECK-POSTP8-NEXT:    xscvdpuxds v2, f1
6220; CHECK-POSTP8-NEXT:    or r3, r4, r3
6221; CHECK-POSTP8-NEXT:    stxsd v2, 0(r3)
6222; CHECK-POSTP8-NEXT:    blr
6223;
6224; CHECK-P8-LABEL: st_or1_float_uint64_t:
6225; CHECK-P8:       # %bb.0: # %entry
6226; CHECK-P8-NEXT:    xscvdpuxds f0, f1
6227; CHECK-P8-NEXT:    or r3, r4, r3
6228; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6229; CHECK-P8-NEXT:    blr
6230entry:
6231  %conv = fptoui float %str to i64
6232  %conv1 = zext i8 %off to i64
6233  %or = or i64 %conv1, %ptr
6234  %0 = inttoptr i64 %or to i64*
6235  store i64 %conv, i64* %0, align 8
6236  ret void
6237}
6238
6239; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6240define dso_local void @st_not_disjoint16_float_uint64_t(i64 %ptr, float %str) {
6241; CHECK-POSTP8-LABEL: st_not_disjoint16_float_uint64_t:
6242; CHECK-POSTP8:       # %bb.0: # %entry
6243; CHECK-POSTP8-NEXT:    xscvdpuxds v2, f1
6244; CHECK-POSTP8-NEXT:    ori r3, r3, 6
6245; CHECK-POSTP8-NEXT:    stxsd v2, 0(r3)
6246; CHECK-POSTP8-NEXT:    blr
6247;
6248; CHECK-P8-LABEL: st_not_disjoint16_float_uint64_t:
6249; CHECK-P8:       # %bb.0: # %entry
6250; CHECK-P8-NEXT:    xscvdpuxds f0, f1
6251; CHECK-P8-NEXT:    ori r3, r3, 6
6252; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6253; CHECK-P8-NEXT:    blr
6254entry:
6255  %conv = fptoui float %str to i64
6256  %or = or i64 %ptr, 6
6257  %0 = inttoptr i64 %or to i64*
6258  store i64 %conv, i64* %0, align 8
6259  ret void
6260}
6261
6262; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6263define dso_local void @st_disjoint_align16_float_uint64_t(i64 %ptr, float %str) {
6264; CHECK-POSTP8-LABEL: st_disjoint_align16_float_uint64_t:
6265; CHECK-POSTP8:       # %bb.0: # %entry
6266; CHECK-POSTP8-NEXT:    xscvdpuxds v2, f1
6267; CHECK-POSTP8-NEXT:    rldicr r3, r3, 0, 51
6268; CHECK-POSTP8-NEXT:    stxsd v2, 24(r3)
6269; CHECK-POSTP8-NEXT:    blr
6270;
6271; CHECK-P8-LABEL: st_disjoint_align16_float_uint64_t:
6272; CHECK-P8:       # %bb.0: # %entry
6273; CHECK-P8-NEXT:    xscvdpuxds f0, f1
6274; CHECK-P8-NEXT:    rldicr r3, r3, 0, 51
6275; CHECK-P8-NEXT:    ori r3, r3, 24
6276; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6277; CHECK-P8-NEXT:    blr
6278entry:
6279  %and = and i64 %ptr, -4096
6280  %conv = fptoui float %str to i64
6281  %or = or i64 %and, 24
6282  %0 = inttoptr i64 %or to i64*
6283  store i64 %conv, i64* %0, align 8
6284  ret void
6285}
6286
6287; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6288define dso_local void @st_not_disjoint32_float_uint64_t(i64 %ptr, float %str) {
6289; CHECK-POSTP8-LABEL: st_not_disjoint32_float_uint64_t:
6290; CHECK-POSTP8:       # %bb.0: # %entry
6291; CHECK-POSTP8-NEXT:    xscvdpuxds v2, f1
6292; CHECK-POSTP8-NEXT:    ori r3, r3, 34463
6293; CHECK-POSTP8-NEXT:    oris r3, r3, 1
6294; CHECK-POSTP8-NEXT:    stxsd v2, 0(r3)
6295; CHECK-POSTP8-NEXT:    blr
6296;
6297; CHECK-P8-LABEL: st_not_disjoint32_float_uint64_t:
6298; CHECK-P8:       # %bb.0: # %entry
6299; CHECK-P8-NEXT:    xscvdpuxds f0, f1
6300; CHECK-P8-NEXT:    ori r3, r3, 34463
6301; CHECK-P8-NEXT:    oris r3, r3, 1
6302; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6303; CHECK-P8-NEXT:    blr
6304entry:
6305  %conv = fptoui float %str to i64
6306  %or = or i64 %ptr, 99999
6307  %0 = inttoptr i64 %or to i64*
6308  store i64 %conv, i64* %0, align 8
6309  ret void
6310}
6311
6312; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6313define dso_local void @st_disjoint_align32_float_uint64_t(i64 %ptr, float %str) {
6314; CHECK-P10-LABEL: st_disjoint_align32_float_uint64_t:
6315; CHECK-P10:       # %bb.0: # %entry
6316; CHECK-P10-NEXT:    xscvdpuxds v2, f1
6317; CHECK-P10-NEXT:    lis r4, -15264
6318; CHECK-P10-NEXT:    and r3, r3, r4
6319; CHECK-P10-NEXT:    pstxsd v2, 999990000(r3), 0
6320; CHECK-P10-NEXT:    blr
6321;
6322; CHECK-P9-LABEL: st_disjoint_align32_float_uint64_t:
6323; CHECK-P9:       # %bb.0: # %entry
6324; CHECK-P9-NEXT:    xscvdpuxds f0, f1
6325; CHECK-P9-NEXT:    lis r4, -15264
6326; CHECK-P9-NEXT:    and r3, r3, r4
6327; CHECK-P9-NEXT:    lis r4, 15258
6328; CHECK-P9-NEXT:    ori r4, r4, 41712
6329; CHECK-P9-NEXT:    stxsdx f0, r3, r4
6330; CHECK-P9-NEXT:    blr
6331;
6332; CHECK-P8-LABEL: st_disjoint_align32_float_uint64_t:
6333; CHECK-P8:       # %bb.0: # %entry
6334; CHECK-P8-NEXT:    xscvdpuxds f0, f1
6335; CHECK-P8-NEXT:    lis r4, -15264
6336; CHECK-P8-NEXT:    lis r5, 15258
6337; CHECK-P8-NEXT:    and r3, r3, r4
6338; CHECK-P8-NEXT:    ori r4, r5, 41712
6339; CHECK-P8-NEXT:    stxsdx f0, r3, r4
6340; CHECK-P8-NEXT:    blr
6341entry:
6342  %and = and i64 %ptr, -1000341504
6343  %conv = fptoui float %str to i64
6344  %or = or i64 %and, 999990000
6345  %0 = inttoptr i64 %or to i64*
6346  store i64 %conv, i64* %0, align 16
6347  ret void
6348}
6349
6350; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6351define dso_local void @st_not_disjoint64_float_uint64_t(i64 %ptr, float %str) {
6352; CHECK-P10-LABEL: st_not_disjoint64_float_uint64_t:
6353; CHECK-P10:       # %bb.0: # %entry
6354; CHECK-P10-NEXT:    xscvdpuxds v2, f1
6355; CHECK-P10-NEXT:    pli r4, 232
6356; CHECK-P10-NEXT:    pli r5, 3567587329
6357; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
6358; CHECK-P10-NEXT:    or r3, r3, r5
6359; CHECK-P10-NEXT:    stxsd v2, 0(r3)
6360; CHECK-P10-NEXT:    blr
6361;
6362; CHECK-P9-LABEL: st_not_disjoint64_float_uint64_t:
6363; CHECK-P9:       # %bb.0: # %entry
6364; CHECK-P9-NEXT:    li r4, 29
6365; CHECK-P9-NEXT:    xscvdpuxds v2, f1
6366; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
6367; CHECK-P9-NEXT:    oris r4, r4, 54437
6368; CHECK-P9-NEXT:    ori r4, r4, 4097
6369; CHECK-P9-NEXT:    or r3, r3, r4
6370; CHECK-P9-NEXT:    stxsd v2, 0(r3)
6371; CHECK-P9-NEXT:    blr
6372;
6373; CHECK-P8-LABEL: st_not_disjoint64_float_uint64_t:
6374; CHECK-P8:       # %bb.0: # %entry
6375; CHECK-P8-NEXT:    xscvdpuxds f0, f1
6376; CHECK-P8-NEXT:    li r4, 29
6377; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
6378; CHECK-P8-NEXT:    oris r4, r4, 54437
6379; CHECK-P8-NEXT:    ori r4, r4, 4097
6380; CHECK-P8-NEXT:    or r3, r3, r4
6381; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6382; CHECK-P8-NEXT:    blr
6383entry:
6384  %conv = fptoui float %str to i64
6385  %or = or i64 %ptr, 1000000000001
6386  %0 = inttoptr i64 %or to i64*
6387  store i64 %conv, i64* %0, align 8
6388  ret void
6389}
6390
6391; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6392define dso_local void @st_disjoint_align64_float_uint64_t(i64 %ptr, float %str) {
6393; CHECK-P10-LABEL: st_disjoint_align64_float_uint64_t:
6394; CHECK-P10:       # %bb.0: # %entry
6395; CHECK-P10-NEXT:    xscvdpuxds f0, f1
6396; CHECK-P10-NEXT:    pli r4, 244140625
6397; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
6398; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
6399; CHECK-P10-NEXT:    stxsdx f0, r3, r4
6400; CHECK-P10-NEXT:    blr
6401;
6402; CHECK-PREP10-LABEL: st_disjoint_align64_float_uint64_t:
6403; CHECK-PREP10:       # %bb.0: # %entry
6404; CHECK-PREP10-NEXT:    xscvdpuxds f0, f1
6405; CHECK-PREP10-NEXT:    lis r4, 3725
6406; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
6407; CHECK-PREP10-NEXT:    ori r4, r4, 19025
6408; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
6409; CHECK-PREP10-NEXT:    stxsdx f0, r3, r4
6410; CHECK-PREP10-NEXT:    blr
6411entry:
6412  %and = and i64 %ptr, -1099511627776
6413  %conv = fptoui float %str to i64
6414  %or = or i64 %and, 1000000000000
6415  %0 = inttoptr i64 %or to i64*
6416  store i64 %conv, i64* %0, align 4096
6417  ret void
6418}
6419
6420; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6421define dso_local void @st_cst_align16_float_uint64_t(float %str) {
6422; CHECK-POSTP8-LABEL: st_cst_align16_float_uint64_t:
6423; CHECK-POSTP8:       # %bb.0: # %entry
6424; CHECK-POSTP8-NEXT:    xscvdpuxds v2, f1
6425; CHECK-POSTP8-NEXT:    stxsd v2, 4080(0)
6426; CHECK-POSTP8-NEXT:    blr
6427;
6428; CHECK-P8-LABEL: st_cst_align16_float_uint64_t:
6429; CHECK-P8:       # %bb.0: # %entry
6430; CHECK-P8-NEXT:    xscvdpuxds f0, f1
6431; CHECK-P8-NEXT:    li r3, 4080
6432; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6433; CHECK-P8-NEXT:    blr
6434entry:
6435  %conv = fptoui float %str to i64
6436  store i64 %conv, i64* inttoptr (i64 4080 to i64*), align 16
6437  ret void
6438}
6439
6440; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6441define dso_local void @st_cst_align32_float_uint64_t(float %str) {
6442; CHECK-POSTP8-LABEL: st_cst_align32_float_uint64_t:
6443; CHECK-POSTP8:       # %bb.0: # %entry
6444; CHECK-POSTP8-NEXT:    xscvdpuxds v2, f1
6445; CHECK-POSTP8-NEXT:    lis r3, 153
6446; CHECK-POSTP8-NEXT:    stxsd v2, -27108(r3)
6447; CHECK-POSTP8-NEXT:    blr
6448;
6449; CHECK-P8-LABEL: st_cst_align32_float_uint64_t:
6450; CHECK-P8:       # %bb.0: # %entry
6451; CHECK-P8-NEXT:    xscvdpuxds f0, f1
6452; CHECK-P8-NEXT:    lis r3, 152
6453; CHECK-P8-NEXT:    ori r3, r3, 38428
6454; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6455; CHECK-P8-NEXT:    blr
6456entry:
6457  %conv = fptoui float %str to i64
6458  store i64 %conv, i64* inttoptr (i64 9999900 to i64*), align 8
6459  ret void
6460}
6461
6462; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6463define dso_local void @st_cst_align64_float_uint64_t(float %str) {
6464; CHECK-P10-LABEL: st_cst_align64_float_uint64_t:
6465; CHECK-P10:       # %bb.0: # %entry
6466; CHECK-P10-NEXT:    xscvdpuxds v2, f1
6467; CHECK-P10-NEXT:    pli r3, 244140625
6468; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
6469; CHECK-P10-NEXT:    stxsd v2, 0(r3)
6470; CHECK-P10-NEXT:    blr
6471;
6472; CHECK-P9-LABEL: st_cst_align64_float_uint64_t:
6473; CHECK-P9:       # %bb.0: # %entry
6474; CHECK-P9-NEXT:    xscvdpuxds v2, f1
6475; CHECK-P9-NEXT:    lis r3, 3725
6476; CHECK-P9-NEXT:    ori r3, r3, 19025
6477; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
6478; CHECK-P9-NEXT:    stxsd v2, 0(r3)
6479; CHECK-P9-NEXT:    blr
6480;
6481; CHECK-P8-LABEL: st_cst_align64_float_uint64_t:
6482; CHECK-P8:       # %bb.0: # %entry
6483; CHECK-P8-NEXT:    xscvdpuxds f0, f1
6484; CHECK-P8-NEXT:    lis r3, 3725
6485; CHECK-P8-NEXT:    ori r3, r3, 19025
6486; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
6487; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6488; CHECK-P8-NEXT:    blr
6489entry:
6490  %conv = fptoui float %str to i64
6491  store i64 %conv, i64* inttoptr (i64 1000000000000 to i64*), align 4096
6492  ret void
6493}
6494
6495; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6496define dso_local void @st_0_float_int64_t(i64 %ptr, float %str) {
6497; CHECK-POSTP8-LABEL: st_0_float_int64_t:
6498; CHECK-POSTP8:       # %bb.0: # %entry
6499; CHECK-POSTP8-NEXT:    xscvdpsxds v2, f1
6500; CHECK-POSTP8-NEXT:    stxsd v2, 0(r3)
6501; CHECK-POSTP8-NEXT:    blr
6502;
6503; CHECK-P8-LABEL: st_0_float_int64_t:
6504; CHECK-P8:       # %bb.0: # %entry
6505; CHECK-P8-NEXT:    xscvdpsxds f0, f1
6506; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6507; CHECK-P8-NEXT:    blr
6508entry:
6509  %conv = fptosi float %str to i64
6510  %0 = inttoptr i64 %ptr to i64*
6511  store i64 %conv, i64* %0, align 8
6512  ret void
6513}
6514
6515; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6516define dso_local void @st_align16_float_int64_t(i8* nocapture %ptr, float %str) {
6517; CHECK-POSTP8-LABEL: st_align16_float_int64_t:
6518; CHECK-POSTP8:       # %bb.0: # %entry
6519; CHECK-POSTP8-NEXT:    xscvdpsxds v2, f1
6520; CHECK-POSTP8-NEXT:    stxsd v2, 8(r3)
6521; CHECK-POSTP8-NEXT:    blr
6522;
6523; CHECK-P8-LABEL: st_align16_float_int64_t:
6524; CHECK-P8:       # %bb.0: # %entry
6525; CHECK-P8-NEXT:    xscvdpsxds f0, f1
6526; CHECK-P8-NEXT:    li r4, 8
6527; CHECK-P8-NEXT:    stxsdx f0, r3, r4
6528; CHECK-P8-NEXT:    blr
6529entry:
6530  %conv = fptosi float %str to i64
6531  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
6532  %0 = bitcast i8* %add.ptr to i64*
6533  store i64 %conv, i64* %0, align 8
6534  ret void
6535}
6536
6537; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6538define dso_local void @st_align32_float_int64_t(i8* nocapture %ptr, float %str) {
6539; CHECK-P10-LABEL: st_align32_float_int64_t:
6540; CHECK-P10:       # %bb.0: # %entry
6541; CHECK-P10-NEXT:    xscvdpsxds v2, f1
6542; CHECK-P10-NEXT:    pstxsd v2, 99999000(r3), 0
6543; CHECK-P10-NEXT:    blr
6544;
6545; CHECK-PREP10-LABEL: st_align32_float_int64_t:
6546; CHECK-PREP10:       # %bb.0: # %entry
6547; CHECK-PREP10-NEXT:    xscvdpsxds f0, f1
6548; CHECK-PREP10-NEXT:    lis r4, 1525
6549; CHECK-PREP10-NEXT:    ori r4, r4, 56600
6550; CHECK-PREP10-NEXT:    stxsdx f0, r3, r4
6551; CHECK-PREP10-NEXT:    blr
6552entry:
6553  %conv = fptosi float %str to i64
6554  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
6555  %0 = bitcast i8* %add.ptr to i64*
6556  store i64 %conv, i64* %0, align 8
6557  ret void
6558}
6559
6560; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6561define dso_local void @st_align64_float_int64_t(i8* nocapture %ptr, float %str) {
6562; CHECK-P10-LABEL: st_align64_float_int64_t:
6563; CHECK-P10:       # %bb.0: # %entry
6564; CHECK-P10-NEXT:    xscvdpsxds f0, f1
6565; CHECK-P10-NEXT:    pli r4, 244140625
6566; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
6567; CHECK-P10-NEXT:    stxsdx f0, r3, r4
6568; CHECK-P10-NEXT:    blr
6569;
6570; CHECK-PREP10-LABEL: st_align64_float_int64_t:
6571; CHECK-PREP10:       # %bb.0: # %entry
6572; CHECK-PREP10-NEXT:    xscvdpsxds f0, f1
6573; CHECK-PREP10-NEXT:    lis r4, 3725
6574; CHECK-PREP10-NEXT:    ori r4, r4, 19025
6575; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
6576; CHECK-PREP10-NEXT:    stxsdx f0, r3, r4
6577; CHECK-PREP10-NEXT:    blr
6578entry:
6579  %conv = fptosi float %str to i64
6580  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
6581  %0 = bitcast i8* %add.ptr to i64*
6582  store i64 %conv, i64* %0, align 8
6583  ret void
6584}
6585
6586; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6587define dso_local void @st_reg_float_int64_t(i8* nocapture %ptr, i64 %off, float %str) {
6588; CHECK-LABEL: st_reg_float_int64_t:
6589; CHECK:       # %bb.0: # %entry
6590; CHECK-NEXT:    xscvdpsxds f0, f1
6591; CHECK-NEXT:    stxsdx f0, r3, r4
6592; CHECK-NEXT:    blr
6593entry:
6594  %conv = fptosi float %str to i64
6595  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
6596  %0 = bitcast i8* %add.ptr to i64*
6597  store i64 %conv, i64* %0, align 8
6598  ret void
6599}
6600
6601; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6602define dso_local void @st_or1_float_int64_t(i64 %ptr, i8 zeroext %off, float %str) {
6603; CHECK-POSTP8-LABEL: st_or1_float_int64_t:
6604; CHECK-POSTP8:       # %bb.0: # %entry
6605; CHECK-POSTP8-NEXT:    xscvdpsxds v2, f1
6606; CHECK-POSTP8-NEXT:    or r3, r4, r3
6607; CHECK-POSTP8-NEXT:    stxsd v2, 0(r3)
6608; CHECK-POSTP8-NEXT:    blr
6609;
6610; CHECK-P8-LABEL: st_or1_float_int64_t:
6611; CHECK-P8:       # %bb.0: # %entry
6612; CHECK-P8-NEXT:    xscvdpsxds f0, f1
6613; CHECK-P8-NEXT:    or r3, r4, r3
6614; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6615; CHECK-P8-NEXT:    blr
6616entry:
6617  %conv = fptosi float %str to i64
6618  %conv1 = zext i8 %off to i64
6619  %or = or i64 %conv1, %ptr
6620  %0 = inttoptr i64 %or to i64*
6621  store i64 %conv, i64* %0, align 8
6622  ret void
6623}
6624
6625; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6626define dso_local void @st_not_disjoint16_float_int64_t(i64 %ptr, float %str) {
6627; CHECK-POSTP8-LABEL: st_not_disjoint16_float_int64_t:
6628; CHECK-POSTP8:       # %bb.0: # %entry
6629; CHECK-POSTP8-NEXT:    xscvdpsxds v2, f1
6630; CHECK-POSTP8-NEXT:    ori r3, r3, 6
6631; CHECK-POSTP8-NEXT:    stxsd v2, 0(r3)
6632; CHECK-POSTP8-NEXT:    blr
6633;
6634; CHECK-P8-LABEL: st_not_disjoint16_float_int64_t:
6635; CHECK-P8:       # %bb.0: # %entry
6636; CHECK-P8-NEXT:    xscvdpsxds f0, f1
6637; CHECK-P8-NEXT:    ori r3, r3, 6
6638; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6639; CHECK-P8-NEXT:    blr
6640entry:
6641  %conv = fptosi float %str to i64
6642  %or = or i64 %ptr, 6
6643  %0 = inttoptr i64 %or to i64*
6644  store i64 %conv, i64* %0, align 8
6645  ret void
6646}
6647
6648; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6649define dso_local void @st_disjoint_align16_float_int64_t(i64 %ptr, float %str) {
6650; CHECK-POSTP8-LABEL: st_disjoint_align16_float_int64_t:
6651; CHECK-POSTP8:       # %bb.0: # %entry
6652; CHECK-POSTP8-NEXT:    xscvdpsxds v2, f1
6653; CHECK-POSTP8-NEXT:    rldicr r3, r3, 0, 51
6654; CHECK-POSTP8-NEXT:    stxsd v2, 24(r3)
6655; CHECK-POSTP8-NEXT:    blr
6656;
6657; CHECK-P8-LABEL: st_disjoint_align16_float_int64_t:
6658; CHECK-P8:       # %bb.0: # %entry
6659; CHECK-P8-NEXT:    xscvdpsxds f0, f1
6660; CHECK-P8-NEXT:    rldicr r3, r3, 0, 51
6661; CHECK-P8-NEXT:    ori r3, r3, 24
6662; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6663; CHECK-P8-NEXT:    blr
6664entry:
6665  %and = and i64 %ptr, -4096
6666  %conv = fptosi float %str to i64
6667  %or = or i64 %and, 24
6668  %0 = inttoptr i64 %or to i64*
6669  store i64 %conv, i64* %0, align 8
6670  ret void
6671}
6672
6673; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6674define dso_local void @st_not_disjoint32_float_int64_t(i64 %ptr, float %str) {
6675; CHECK-POSTP8-LABEL: st_not_disjoint32_float_int64_t:
6676; CHECK-POSTP8:       # %bb.0: # %entry
6677; CHECK-POSTP8-NEXT:    xscvdpsxds v2, f1
6678; CHECK-POSTP8-NEXT:    ori r3, r3, 34463
6679; CHECK-POSTP8-NEXT:    oris r3, r3, 1
6680; CHECK-POSTP8-NEXT:    stxsd v2, 0(r3)
6681; CHECK-POSTP8-NEXT:    blr
6682;
6683; CHECK-P8-LABEL: st_not_disjoint32_float_int64_t:
6684; CHECK-P8:       # %bb.0: # %entry
6685; CHECK-P8-NEXT:    xscvdpsxds f0, f1
6686; CHECK-P8-NEXT:    ori r3, r3, 34463
6687; CHECK-P8-NEXT:    oris r3, r3, 1
6688; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6689; CHECK-P8-NEXT:    blr
6690entry:
6691  %conv = fptosi float %str to i64
6692  %or = or i64 %ptr, 99999
6693  %0 = inttoptr i64 %or to i64*
6694  store i64 %conv, i64* %0, align 8
6695  ret void
6696}
6697
6698; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6699define dso_local void @st_disjoint_align32_float_int64_t(i64 %ptr, float %str) {
6700; CHECK-P10-LABEL: st_disjoint_align32_float_int64_t:
6701; CHECK-P10:       # %bb.0: # %entry
6702; CHECK-P10-NEXT:    xscvdpsxds v2, f1
6703; CHECK-P10-NEXT:    lis r4, -15264
6704; CHECK-P10-NEXT:    and r3, r3, r4
6705; CHECK-P10-NEXT:    pstxsd v2, 999990000(r3), 0
6706; CHECK-P10-NEXT:    blr
6707;
6708; CHECK-P9-LABEL: st_disjoint_align32_float_int64_t:
6709; CHECK-P9:       # %bb.0: # %entry
6710; CHECK-P9-NEXT:    xscvdpsxds f0, f1
6711; CHECK-P9-NEXT:    lis r4, -15264
6712; CHECK-P9-NEXT:    and r3, r3, r4
6713; CHECK-P9-NEXT:    lis r4, 15258
6714; CHECK-P9-NEXT:    ori r4, r4, 41712
6715; CHECK-P9-NEXT:    stxsdx f0, r3, r4
6716; CHECK-P9-NEXT:    blr
6717;
6718; CHECK-P8-LABEL: st_disjoint_align32_float_int64_t:
6719; CHECK-P8:       # %bb.0: # %entry
6720; CHECK-P8-NEXT:    xscvdpsxds f0, f1
6721; CHECK-P8-NEXT:    lis r4, -15264
6722; CHECK-P8-NEXT:    lis r5, 15258
6723; CHECK-P8-NEXT:    and r3, r3, r4
6724; CHECK-P8-NEXT:    ori r4, r5, 41712
6725; CHECK-P8-NEXT:    stxsdx f0, r3, r4
6726; CHECK-P8-NEXT:    blr
6727entry:
6728  %and = and i64 %ptr, -1000341504
6729  %conv = fptosi float %str to i64
6730  %or = or i64 %and, 999990000
6731  %0 = inttoptr i64 %or to i64*
6732  store i64 %conv, i64* %0, align 16
6733  ret void
6734}
6735
6736; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6737define dso_local void @st_not_disjoint64_float_int64_t(i64 %ptr, float %str) {
6738; CHECK-P10-LABEL: st_not_disjoint64_float_int64_t:
6739; CHECK-P10:       # %bb.0: # %entry
6740; CHECK-P10-NEXT:    xscvdpsxds v2, f1
6741; CHECK-P10-NEXT:    pli r4, 232
6742; CHECK-P10-NEXT:    pli r5, 3567587329
6743; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
6744; CHECK-P10-NEXT:    or r3, r3, r5
6745; CHECK-P10-NEXT:    stxsd v2, 0(r3)
6746; CHECK-P10-NEXT:    blr
6747;
6748; CHECK-P9-LABEL: st_not_disjoint64_float_int64_t:
6749; CHECK-P9:       # %bb.0: # %entry
6750; CHECK-P9-NEXT:    li r4, 29
6751; CHECK-P9-NEXT:    xscvdpsxds v2, f1
6752; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
6753; CHECK-P9-NEXT:    oris r4, r4, 54437
6754; CHECK-P9-NEXT:    ori r4, r4, 4097
6755; CHECK-P9-NEXT:    or r3, r3, r4
6756; CHECK-P9-NEXT:    stxsd v2, 0(r3)
6757; CHECK-P9-NEXT:    blr
6758;
6759; CHECK-P8-LABEL: st_not_disjoint64_float_int64_t:
6760; CHECK-P8:       # %bb.0: # %entry
6761; CHECK-P8-NEXT:    xscvdpsxds f0, f1
6762; CHECK-P8-NEXT:    li r4, 29
6763; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
6764; CHECK-P8-NEXT:    oris r4, r4, 54437
6765; CHECK-P8-NEXT:    ori r4, r4, 4097
6766; CHECK-P8-NEXT:    or r3, r3, r4
6767; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6768; CHECK-P8-NEXT:    blr
6769entry:
6770  %conv = fptosi float %str to i64
6771  %or = or i64 %ptr, 1000000000001
6772  %0 = inttoptr i64 %or to i64*
6773  store i64 %conv, i64* %0, align 8
6774  ret void
6775}
6776
6777; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6778define dso_local void @st_disjoint_align64_float_int64_t(i64 %ptr, float %str) {
6779; CHECK-P10-LABEL: st_disjoint_align64_float_int64_t:
6780; CHECK-P10:       # %bb.0: # %entry
6781; CHECK-P10-NEXT:    xscvdpsxds f0, f1
6782; CHECK-P10-NEXT:    pli r4, 244140625
6783; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
6784; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
6785; CHECK-P10-NEXT:    stxsdx f0, r3, r4
6786; CHECK-P10-NEXT:    blr
6787;
6788; CHECK-PREP10-LABEL: st_disjoint_align64_float_int64_t:
6789; CHECK-PREP10:       # %bb.0: # %entry
6790; CHECK-PREP10-NEXT:    xscvdpsxds f0, f1
6791; CHECK-PREP10-NEXT:    lis r4, 3725
6792; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
6793; CHECK-PREP10-NEXT:    ori r4, r4, 19025
6794; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
6795; CHECK-PREP10-NEXT:    stxsdx f0, r3, r4
6796; CHECK-PREP10-NEXT:    blr
6797entry:
6798  %and = and i64 %ptr, -1099511627776
6799  %conv = fptosi float %str to i64
6800  %or = or i64 %and, 1000000000000
6801  %0 = inttoptr i64 %or to i64*
6802  store i64 %conv, i64* %0, align 4096
6803  ret void
6804}
6805
6806; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6807define dso_local void @st_cst_align16_float_int64_t(float %str) {
6808; CHECK-POSTP8-LABEL: st_cst_align16_float_int64_t:
6809; CHECK-POSTP8:       # %bb.0: # %entry
6810; CHECK-POSTP8-NEXT:    xscvdpsxds v2, f1
6811; CHECK-POSTP8-NEXT:    stxsd v2, 4080(0)
6812; CHECK-POSTP8-NEXT:    blr
6813;
6814; CHECK-P8-LABEL: st_cst_align16_float_int64_t:
6815; CHECK-P8:       # %bb.0: # %entry
6816; CHECK-P8-NEXT:    xscvdpsxds f0, f1
6817; CHECK-P8-NEXT:    li r3, 4080
6818; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6819; CHECK-P8-NEXT:    blr
6820entry:
6821  %conv = fptosi float %str to i64
6822  store i64 %conv, i64* inttoptr (i64 4080 to i64*), align 16
6823  ret void
6824}
6825
6826; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6827define dso_local void @st_cst_align32_float_int64_t(float %str) {
6828; CHECK-POSTP8-LABEL: st_cst_align32_float_int64_t:
6829; CHECK-POSTP8:       # %bb.0: # %entry
6830; CHECK-POSTP8-NEXT:    xscvdpsxds v2, f1
6831; CHECK-POSTP8-NEXT:    lis r3, 153
6832; CHECK-POSTP8-NEXT:    stxsd v2, -27108(r3)
6833; CHECK-POSTP8-NEXT:    blr
6834;
6835; CHECK-P8-LABEL: st_cst_align32_float_int64_t:
6836; CHECK-P8:       # %bb.0: # %entry
6837; CHECK-P8-NEXT:    xscvdpsxds f0, f1
6838; CHECK-P8-NEXT:    lis r3, 152
6839; CHECK-P8-NEXT:    ori r3, r3, 38428
6840; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6841; CHECK-P8-NEXT:    blr
6842entry:
6843  %conv = fptosi float %str to i64
6844  store i64 %conv, i64* inttoptr (i64 9999900 to i64*), align 8
6845  ret void
6846}
6847
6848; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6849define dso_local void @st_cst_align64_float_int64_t(float %str) {
6850; CHECK-P10-LABEL: st_cst_align64_float_int64_t:
6851; CHECK-P10:       # %bb.0: # %entry
6852; CHECK-P10-NEXT:    xscvdpsxds v2, f1
6853; CHECK-P10-NEXT:    pli r3, 244140625
6854; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
6855; CHECK-P10-NEXT:    stxsd v2, 0(r3)
6856; CHECK-P10-NEXT:    blr
6857;
6858; CHECK-P9-LABEL: st_cst_align64_float_int64_t:
6859; CHECK-P9:       # %bb.0: # %entry
6860; CHECK-P9-NEXT:    xscvdpsxds v2, f1
6861; CHECK-P9-NEXT:    lis r3, 3725
6862; CHECK-P9-NEXT:    ori r3, r3, 19025
6863; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
6864; CHECK-P9-NEXT:    stxsd v2, 0(r3)
6865; CHECK-P9-NEXT:    blr
6866;
6867; CHECK-P8-LABEL: st_cst_align64_float_int64_t:
6868; CHECK-P8:       # %bb.0: # %entry
6869; CHECK-P8-NEXT:    xscvdpsxds f0, f1
6870; CHECK-P8-NEXT:    lis r3, 3725
6871; CHECK-P8-NEXT:    ori r3, r3, 19025
6872; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
6873; CHECK-P8-NEXT:    stxsdx f0, 0, r3
6874; CHECK-P8-NEXT:    blr
6875entry:
6876  %conv = fptosi float %str to i64
6877  store i64 %conv, i64* inttoptr (i64 1000000000000 to i64*), align 4096
6878  ret void
6879}
6880
6881; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6882define dso_local void @st_0_float_float(i64 %ptr, float %str) {
6883; CHECK-LABEL: st_0_float_float:
6884; CHECK:       # %bb.0: # %entry
6885; CHECK-NEXT:    stfs f1, 0(r3)
6886; CHECK-NEXT:    blr
6887entry:
6888  %0 = inttoptr i64 %ptr to float*
6889  store float %str, float* %0, align 4
6890  ret void
6891}
6892
6893; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6894define dso_local void @st_align16_float_float(i8* nocapture %ptr, float %str) {
6895; CHECK-LABEL: st_align16_float_float:
6896; CHECK:       # %bb.0: # %entry
6897; CHECK-NEXT:    stfs f1, 8(r3)
6898; CHECK-NEXT:    blr
6899entry:
6900  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
6901  %0 = bitcast i8* %add.ptr to float*
6902  store float %str, float* %0, align 4
6903  ret void
6904}
6905
6906; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6907define dso_local void @st_align32_float_float(i8* nocapture %ptr, float %str) {
6908; CHECK-P10-LABEL: st_align32_float_float:
6909; CHECK-P10:       # %bb.0: # %entry
6910; CHECK-P10-NEXT:    pstfs f1, 99999000(r3), 0
6911; CHECK-P10-NEXT:    blr
6912;
6913; CHECK-PREP10-LABEL: st_align32_float_float:
6914; CHECK-PREP10:       # %bb.0: # %entry
6915; CHECK-PREP10-NEXT:    lis r4, 1525
6916; CHECK-PREP10-NEXT:    ori r4, r4, 56600
6917; CHECK-PREP10-NEXT:    stfsx f1, r3, r4
6918; CHECK-PREP10-NEXT:    blr
6919entry:
6920  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
6921  %0 = bitcast i8* %add.ptr to float*
6922  store float %str, float* %0, align 4
6923  ret void
6924}
6925
6926; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6927define dso_local void @st_align64_float_float(i8* nocapture %ptr, float %str) {
6928; CHECK-P10-LABEL: st_align64_float_float:
6929; CHECK-P10:       # %bb.0: # %entry
6930; CHECK-P10-NEXT:    pli r4, 244140625
6931; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
6932; CHECK-P10-NEXT:    stfsx f1, r3, r4
6933; CHECK-P10-NEXT:    blr
6934;
6935; CHECK-PREP10-LABEL: st_align64_float_float:
6936; CHECK-PREP10:       # %bb.0: # %entry
6937; CHECK-PREP10-NEXT:    lis r4, 3725
6938; CHECK-PREP10-NEXT:    ori r4, r4, 19025
6939; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
6940; CHECK-PREP10-NEXT:    stfsx f1, r3, r4
6941; CHECK-PREP10-NEXT:    blr
6942entry:
6943  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
6944  %0 = bitcast i8* %add.ptr to float*
6945  store float %str, float* %0, align 4
6946  ret void
6947}
6948
6949; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6950define dso_local void @st_reg_float_float(i8* nocapture %ptr, i64 %off, float %str) {
6951; CHECK-LABEL: st_reg_float_float:
6952; CHECK:       # %bb.0: # %entry
6953; CHECK-NEXT:    stfsx f1, r3, r4
6954; CHECK-NEXT:    blr
6955entry:
6956  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
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_or1_float_float(i64 %ptr, i8 zeroext %off, float %str) {
6964; CHECK-LABEL: st_or1_float_float:
6965; CHECK:       # %bb.0: # %entry
6966; CHECK-NEXT:    or r3, r4, r3
6967; CHECK-NEXT:    stfs f1, 0(r3)
6968; CHECK-NEXT:    blr
6969entry:
6970  %conv = zext i8 %off to i64
6971  %or = or i64 %conv, %ptr
6972  %0 = inttoptr i64 %or to float*
6973  store float %str, float* %0, align 4
6974  ret void
6975}
6976
6977; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6978define dso_local void @st_not_disjoint16_float_float(i64 %ptr, float %str) {
6979; CHECK-LABEL: st_not_disjoint16_float_float:
6980; CHECK:       # %bb.0: # %entry
6981; CHECK-NEXT:    ori r3, r3, 6
6982; CHECK-NEXT:    stfs f1, 0(r3)
6983; CHECK-NEXT:    blr
6984entry:
6985  %or = or i64 %ptr, 6
6986  %0 = inttoptr i64 %or to float*
6987  store float %str, float* %0, align 4
6988  ret void
6989}
6990
6991; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6992define dso_local void @st_disjoint_align16_float_float(i64 %ptr, float %str) {
6993; CHECK-LABEL: st_disjoint_align16_float_float:
6994; CHECK:       # %bb.0: # %entry
6995; CHECK-NEXT:    rldicr r3, r3, 0, 51
6996; CHECK-NEXT:    stfs f1, 24(r3)
6997; CHECK-NEXT:    blr
6998entry:
6999  %and = and i64 %ptr, -4096
7000  %or = or i64 %and, 24
7001  %0 = inttoptr i64 %or to float*
7002  store float %str, float* %0, align 8
7003  ret void
7004}
7005
7006; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7007define dso_local void @st_not_disjoint32_float_float(i64 %ptr, float %str) {
7008; CHECK-LABEL: st_not_disjoint32_float_float:
7009; CHECK:       # %bb.0: # %entry
7010; CHECK-NEXT:    ori r3, r3, 34463
7011; CHECK-NEXT:    oris r3, r3, 1
7012; CHECK-NEXT:    stfs f1, 0(r3)
7013; CHECK-NEXT:    blr
7014entry:
7015  %or = or i64 %ptr, 99999
7016  %0 = inttoptr i64 %or to float*
7017  store float %str, float* %0, align 4
7018  ret void
7019}
7020
7021; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7022define dso_local void @st_disjoint_align32_float_float(i64 %ptr, float %str) {
7023; CHECK-P10-LABEL: st_disjoint_align32_float_float:
7024; CHECK-P10:       # %bb.0: # %entry
7025; CHECK-P10-NEXT:    lis r4, -15264
7026; CHECK-P10-NEXT:    and r3, r3, r4
7027; CHECK-P10-NEXT:    pstfs f1, 999990000(r3), 0
7028; CHECK-P10-NEXT:    blr
7029;
7030; CHECK-P9-LABEL: st_disjoint_align32_float_float:
7031; CHECK-P9:       # %bb.0: # %entry
7032; CHECK-P9-NEXT:    lis r4, -15264
7033; CHECK-P9-NEXT:    and r3, r3, r4
7034; CHECK-P9-NEXT:    lis r4, 15258
7035; CHECK-P9-NEXT:    ori r4, r4, 41712
7036; CHECK-P9-NEXT:    stfsx f1, r3, r4
7037; CHECK-P9-NEXT:    blr
7038;
7039; CHECK-P8-LABEL: st_disjoint_align32_float_float:
7040; CHECK-P8:       # %bb.0: # %entry
7041; CHECK-P8-NEXT:    lis r4, -15264
7042; CHECK-P8-NEXT:    lis r5, 15258
7043; CHECK-P8-NEXT:    and r3, r3, r4
7044; CHECK-P8-NEXT:    ori r4, r5, 41712
7045; CHECK-P8-NEXT:    stfsx f1, r3, r4
7046; CHECK-P8-NEXT:    blr
7047entry:
7048  %and = and i64 %ptr, -1000341504
7049  %or = or i64 %and, 999990000
7050  %0 = inttoptr i64 %or to float*
7051  store float %str, float* %0, align 16
7052  ret void
7053}
7054
7055; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7056define dso_local void @st_not_disjoint64_float_float(i64 %ptr, float %str) {
7057; CHECK-P10-LABEL: st_not_disjoint64_float_float:
7058; CHECK-P10:       # %bb.0: # %entry
7059; CHECK-P10-NEXT:    pli r4, 232
7060; CHECK-P10-NEXT:    pli r5, 3567587329
7061; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
7062; CHECK-P10-NEXT:    or r3, r3, r5
7063; CHECK-P10-NEXT:    stfs f1, 0(r3)
7064; CHECK-P10-NEXT:    blr
7065;
7066; CHECK-PREP10-LABEL: st_not_disjoint64_float_float:
7067; CHECK-PREP10:       # %bb.0: # %entry
7068; CHECK-PREP10-NEXT:    li r4, 29
7069; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
7070; CHECK-PREP10-NEXT:    oris r4, r4, 54437
7071; CHECK-PREP10-NEXT:    ori r4, r4, 4097
7072; CHECK-PREP10-NEXT:    or r3, r3, r4
7073; CHECK-PREP10-NEXT:    stfs f1, 0(r3)
7074; CHECK-PREP10-NEXT:    blr
7075entry:
7076  %or = or i64 %ptr, 1000000000001
7077  %0 = inttoptr i64 %or to float*
7078  store float %str, float* %0, align 4
7079  ret void
7080}
7081
7082; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7083define dso_local void @st_disjoint_align64_float_float(i64 %ptr, float %str) {
7084; CHECK-P10-LABEL: st_disjoint_align64_float_float:
7085; CHECK-P10:       # %bb.0: # %entry
7086; CHECK-P10-NEXT:    pli r4, 244140625
7087; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
7088; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
7089; CHECK-P10-NEXT:    stfsx f1, r3, r4
7090; CHECK-P10-NEXT:    blr
7091;
7092; CHECK-PREP10-LABEL: st_disjoint_align64_float_float:
7093; CHECK-PREP10:       # %bb.0: # %entry
7094; CHECK-PREP10-NEXT:    lis r4, 3725
7095; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
7096; CHECK-PREP10-NEXT:    ori r4, r4, 19025
7097; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
7098; CHECK-PREP10-NEXT:    stfsx f1, r3, r4
7099; CHECK-PREP10-NEXT:    blr
7100entry:
7101  %and = and i64 %ptr, -1099511627776
7102  %or = or i64 %and, 1000000000000
7103  %0 = inttoptr i64 %or to float*
7104  store float %str, float* %0, align 4096
7105  ret void
7106}
7107
7108; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7109define dso_local void @st_cst_align16_float_float(float %str) {
7110; CHECK-LABEL: st_cst_align16_float_float:
7111; CHECK:       # %bb.0: # %entry
7112; CHECK-NEXT:    stfs f1, 4080(0)
7113; CHECK-NEXT:    blr
7114entry:
7115  store float %str, float* inttoptr (i64 4080 to float*), align 16
7116  ret void
7117}
7118
7119; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7120define dso_local void @st_cst_align32_float_float(float %str) {
7121; CHECK-LABEL: st_cst_align32_float_float:
7122; CHECK:       # %bb.0: # %entry
7123; CHECK-NEXT:    lis r3, 153
7124; CHECK-NEXT:    stfs f1, -27108(r3)
7125; CHECK-NEXT:    blr
7126entry:
7127  store float %str, float* inttoptr (i64 9999900 to float*), align 4
7128  ret void
7129}
7130
7131; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7132define dso_local void @st_cst_align64_float_float(float %str) {
7133; CHECK-P10-LABEL: st_cst_align64_float_float:
7134; CHECK-P10:       # %bb.0: # %entry
7135; CHECK-P10-NEXT:    pli r3, 244140625
7136; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
7137; CHECK-P10-NEXT:    stfs f1, 0(r3)
7138; CHECK-P10-NEXT:    blr
7139;
7140; CHECK-PREP10-LABEL: st_cst_align64_float_float:
7141; CHECK-PREP10:       # %bb.0: # %entry
7142; CHECK-PREP10-NEXT:    lis r3, 3725
7143; CHECK-PREP10-NEXT:    ori r3, r3, 19025
7144; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
7145; CHECK-PREP10-NEXT:    stfs f1, 0(r3)
7146; CHECK-PREP10-NEXT:    blr
7147entry:
7148  store float %str, float* inttoptr (i64 1000000000000 to float*), align 4096
7149  ret void
7150}
7151
7152; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7153define dso_local void @st_0_float_double(i64 %ptr, float %str) {
7154; CHECK-LABEL: st_0_float_double:
7155; CHECK:       # %bb.0: # %entry
7156; CHECK-NEXT:    stfd f1, 0(r3)
7157; CHECK-NEXT:    blr
7158entry:
7159  %conv = fpext float %str to double
7160  %0 = inttoptr i64 %ptr to double*
7161  store double %conv, double* %0, align 8
7162  ret void
7163}
7164
7165; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7166define dso_local void @st_align16_float_double(i8* nocapture %ptr, float %str) {
7167; CHECK-LABEL: st_align16_float_double:
7168; CHECK:       # %bb.0: # %entry
7169; CHECK-NEXT:    stfd f1, 8(r3)
7170; CHECK-NEXT:    blr
7171entry:
7172  %conv = fpext float %str to double
7173  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
7174  %0 = bitcast i8* %add.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_align32_float_double(i8* nocapture %ptr, float %str) {
7181; CHECK-P10-LABEL: st_align32_float_double:
7182; CHECK-P10:       # %bb.0: # %entry
7183; CHECK-P10-NEXT:    pstfd f1, 99999000(r3), 0
7184; CHECK-P10-NEXT:    blr
7185;
7186; CHECK-PREP10-LABEL: st_align32_float_double:
7187; CHECK-PREP10:       # %bb.0: # %entry
7188; CHECK-PREP10-NEXT:    lis r4, 1525
7189; CHECK-PREP10-NEXT:    ori r4, r4, 56600
7190; CHECK-PREP10-NEXT:    stfdx f1, r3, r4
7191; CHECK-PREP10-NEXT:    blr
7192entry:
7193  %conv = fpext float %str to double
7194  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
7195  %0 = bitcast i8* %add.ptr to double*
7196  store double %conv, double* %0, align 8
7197  ret void
7198}
7199
7200; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7201define dso_local void @st_align64_float_double(i8* nocapture %ptr, float %str) {
7202; CHECK-P10-LABEL: st_align64_float_double:
7203; CHECK-P10:       # %bb.0: # %entry
7204; CHECK-P10-NEXT:    pli r4, 244140625
7205; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
7206; CHECK-P10-NEXT:    stfdx f1, r3, r4
7207; CHECK-P10-NEXT:    blr
7208;
7209; CHECK-PREP10-LABEL: st_align64_float_double:
7210; CHECK-PREP10:       # %bb.0: # %entry
7211; CHECK-PREP10-NEXT:    lis r4, 3725
7212; CHECK-PREP10-NEXT:    ori r4, r4, 19025
7213; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
7214; CHECK-PREP10-NEXT:    stfdx f1, r3, r4
7215; CHECK-PREP10-NEXT:    blr
7216entry:
7217  %conv = fpext float %str to double
7218  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
7219  %0 = bitcast i8* %add.ptr to double*
7220  store double %conv, double* %0, align 8
7221  ret void
7222}
7223
7224; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7225define dso_local void @st_reg_float_double(i8* nocapture %ptr, i64 %off, float %str) {
7226; CHECK-LABEL: st_reg_float_double:
7227; CHECK:       # %bb.0: # %entry
7228; CHECK-NEXT:    stfdx f1, r3, r4
7229; CHECK-NEXT:    blr
7230entry:
7231  %conv = fpext float %str to double
7232  %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
7233  %0 = bitcast i8* %add.ptr to double*
7234  store double %conv, double* %0, align 8
7235  ret void
7236}
7237
7238; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7239define dso_local void @st_or1_float_double(i64 %ptr, i8 zeroext %off, float %str) {
7240; CHECK-LABEL: st_or1_float_double:
7241; CHECK:       # %bb.0: # %entry
7242; CHECK-NEXT:    or r3, r4, r3
7243; CHECK-NEXT:    stfd f1, 0(r3)
7244; CHECK-NEXT:    blr
7245entry:
7246  %conv = fpext float %str to double
7247  %conv1 = zext i8 %off to i64
7248  %or = or i64 %conv1, %ptr
7249  %0 = inttoptr i64 %or to double*
7250  store double %conv, double* %0, align 8
7251  ret void
7252}
7253
7254; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7255define dso_local void @st_not_disjoint16_float_double(i64 %ptr, float %str) {
7256; CHECK-LABEL: st_not_disjoint16_float_double:
7257; CHECK:       # %bb.0: # %entry
7258; CHECK-NEXT:    ori r3, r3, 6
7259; CHECK-NEXT:    stfd f1, 0(r3)
7260; CHECK-NEXT:    blr
7261entry:
7262  %conv = fpext float %str to double
7263  %or = or i64 %ptr, 6
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_disjoint_align16_float_double(i64 %ptr, float %str) {
7271; CHECK-LABEL: st_disjoint_align16_float_double:
7272; CHECK:       # %bb.0: # %entry
7273; CHECK-NEXT:    rldicr r3, r3, 0, 51
7274; CHECK-NEXT:    stfd f1, 24(r3)
7275; CHECK-NEXT:    blr
7276entry:
7277  %and = and i64 %ptr, -4096
7278  %conv = fpext float %str to double
7279  %or = or i64 %and, 24
7280  %0 = inttoptr i64 %or to double*
7281  store double %conv, double* %0, align 8
7282  ret void
7283}
7284
7285; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7286define dso_local void @st_not_disjoint32_float_double(i64 %ptr, float %str) {
7287; CHECK-LABEL: st_not_disjoint32_float_double:
7288; CHECK:       # %bb.0: # %entry
7289; CHECK-NEXT:    ori r3, r3, 34463
7290; CHECK-NEXT:    oris r3, r3, 1
7291; CHECK-NEXT:    stfd f1, 0(r3)
7292; CHECK-NEXT:    blr
7293entry:
7294  %conv = fpext float %str to double
7295  %or = or i64 %ptr, 99999
7296  %0 = inttoptr i64 %or to double*
7297  store double %conv, double* %0, align 8
7298  ret void
7299}
7300
7301; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7302define dso_local void @st_disjoint_align32_float_double(i64 %ptr, float %str) {
7303; CHECK-P10-LABEL: st_disjoint_align32_float_double:
7304; CHECK-P10:       # %bb.0: # %entry
7305; CHECK-P10-NEXT:    lis r4, -15264
7306; CHECK-P10-NEXT:    and r3, r3, r4
7307; CHECK-P10-NEXT:    pstfd f1, 999990000(r3), 0
7308; CHECK-P10-NEXT:    blr
7309;
7310; CHECK-P9-LABEL: st_disjoint_align32_float_double:
7311; CHECK-P9:       # %bb.0: # %entry
7312; CHECK-P9-NEXT:    lis r4, -15264
7313; CHECK-P9-NEXT:    and r3, r3, r4
7314; CHECK-P9-NEXT:    lis r4, 15258
7315; CHECK-P9-NEXT:    ori r4, r4, 41712
7316; CHECK-P9-NEXT:    stfdx f1, r3, r4
7317; CHECK-P9-NEXT:    blr
7318;
7319; CHECK-P8-LABEL: st_disjoint_align32_float_double:
7320; CHECK-P8:       # %bb.0: # %entry
7321; CHECK-P8-NEXT:    lis r4, -15264
7322; CHECK-P8-NEXT:    lis r5, 15258
7323; CHECK-P8-NEXT:    and r3, r3, r4
7324; CHECK-P8-NEXT:    ori r4, r5, 41712
7325; CHECK-P8-NEXT:    stfdx f1, r3, r4
7326; CHECK-P8-NEXT:    blr
7327entry:
7328  %and = and i64 %ptr, -1000341504
7329  %conv = fpext float %str to double
7330  %or = or i64 %and, 999990000
7331  %0 = inttoptr i64 %or to double*
7332  store double %conv, double* %0, align 16
7333  ret void
7334}
7335
7336; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7337define dso_local void @st_not_disjoint64_float_double(i64 %ptr, float %str) {
7338; CHECK-P10-LABEL: st_not_disjoint64_float_double:
7339; CHECK-P10:       # %bb.0: # %entry
7340; CHECK-P10-NEXT:    pli r4, 232
7341; CHECK-P10-NEXT:    pli r5, 3567587329
7342; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
7343; CHECK-P10-NEXT:    or r3, r3, r5
7344; CHECK-P10-NEXT:    stfd f1, 0(r3)
7345; CHECK-P10-NEXT:    blr
7346;
7347; CHECK-PREP10-LABEL: st_not_disjoint64_float_double:
7348; CHECK-PREP10:       # %bb.0: # %entry
7349; CHECK-PREP10-NEXT:    li r4, 29
7350; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
7351; CHECK-PREP10-NEXT:    oris r4, r4, 54437
7352; CHECK-PREP10-NEXT:    ori r4, r4, 4097
7353; CHECK-PREP10-NEXT:    or r3, r3, r4
7354; CHECK-PREP10-NEXT:    stfd f1, 0(r3)
7355; CHECK-PREP10-NEXT:    blr
7356entry:
7357  %conv = fpext float %str to double
7358  %or = or i64 %ptr, 1000000000001
7359  %0 = inttoptr i64 %or to double*
7360  store double %conv, double* %0, align 8
7361  ret void
7362}
7363
7364; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7365define dso_local void @st_disjoint_align64_float_double(i64 %ptr, float %str) {
7366; CHECK-P10-LABEL: st_disjoint_align64_float_double:
7367; CHECK-P10:       # %bb.0: # %entry
7368; CHECK-P10-NEXT:    pli r4, 244140625
7369; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
7370; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
7371; CHECK-P10-NEXT:    stfdx f1, r3, r4
7372; CHECK-P10-NEXT:    blr
7373;
7374; CHECK-PREP10-LABEL: st_disjoint_align64_float_double:
7375; CHECK-PREP10:       # %bb.0: # %entry
7376; CHECK-PREP10-NEXT:    lis r4, 3725
7377; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
7378; CHECK-PREP10-NEXT:    ori r4, r4, 19025
7379; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
7380; CHECK-PREP10-NEXT:    stfdx f1, r3, r4
7381; CHECK-PREP10-NEXT:    blr
7382entry:
7383  %and = and i64 %ptr, -1099511627776
7384  %conv = fpext float %str to double
7385  %or = or i64 %and, 1000000000000
7386  %0 = inttoptr i64 %or to double*
7387  store double %conv, double* %0, align 4096
7388  ret void
7389}
7390
7391; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7392define dso_local void @st_cst_align16_float_double(float %str) {
7393; CHECK-LABEL: st_cst_align16_float_double:
7394; CHECK:       # %bb.0: # %entry
7395; CHECK-NEXT:    stfd f1, 4080(0)
7396; CHECK-NEXT:    blr
7397entry:
7398  %conv = fpext float %str to double
7399  store double %conv, double* inttoptr (i64 4080 to double*), align 16
7400  ret void
7401}
7402
7403; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7404define dso_local void @st_cst_align32_float_double(float %str) {
7405; CHECK-LABEL: st_cst_align32_float_double:
7406; CHECK:       # %bb.0: # %entry
7407; CHECK-NEXT:    lis r3, 153
7408; CHECK-NEXT:    stfd f1, -27108(r3)
7409; CHECK-NEXT:    blr
7410entry:
7411  %conv = fpext float %str to double
7412  store double %conv, double* inttoptr (i64 9999900 to double*), align 8
7413  ret void
7414}
7415
7416; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7417define dso_local void @st_cst_align64_float_double(float %str) {
7418; CHECK-P10-LABEL: st_cst_align64_float_double:
7419; CHECK-P10:       # %bb.0: # %entry
7420; CHECK-P10-NEXT:    pli r3, 244140625
7421; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
7422; CHECK-P10-NEXT:    stfd f1, 0(r3)
7423; CHECK-P10-NEXT:    blr
7424;
7425; CHECK-PREP10-LABEL: st_cst_align64_float_double:
7426; CHECK-PREP10:       # %bb.0: # %entry
7427; CHECK-PREP10-NEXT:    lis r3, 3725
7428; CHECK-PREP10-NEXT:    ori r3, r3, 19025
7429; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
7430; CHECK-PREP10-NEXT:    stfd f1, 0(r3)
7431; CHECK-PREP10-NEXT:    blr
7432entry:
7433  %conv = fpext float %str to double
7434  store double %conv, double* inttoptr (i64 1000000000000 to double*), align 4096
7435  ret void
7436}
7437