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