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