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