xref: /llvm-project/llvm/test/CodeGen/PowerPC/scalar-i8-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 i8 @ld_0_int8_t_uint8_t(i64 %ptr) {
23; CHECK-LABEL: ld_0_int8_t_uint8_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  ret i8 %1
32}
33
34; Function Attrs: norecurse nounwind readonly uwtable willreturn
35define dso_local signext i8 @ld_align16_int8_t_uint8_t(ptr nocapture readonly %ptr) {
36; CHECK-LABEL: ld_align16_int8_t_uint8_t:
37; CHECK:       # %bb.0: # %entry
38; CHECK-NEXT:    lbz r3, 8(r3)
39; CHECK-NEXT:    extsb r3, r3
40; CHECK-NEXT:    blr
41entry:
42  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
43  %0 = load i8, ptr %add.ptr, align 1
44  ret i8 %0
45}
46
47; Function Attrs: norecurse nounwind readonly uwtable willreturn
48define dso_local signext i8 @ld_align32_int8_t_uint8_t(ptr nocapture readonly %ptr) {
49; CHECK-P10-LABEL: ld_align32_int8_t_uint8_t:
50; CHECK-P10:       # %bb.0: # %entry
51; CHECK-P10-NEXT:    plbz r3, 99999000(r3), 0
52; CHECK-P10-NEXT:    extsb r3, r3
53; CHECK-P10-NEXT:    blr
54;
55; CHECK-PREP10-LABEL: ld_align32_int8_t_uint8_t:
56; CHECK-PREP10:       # %bb.0: # %entry
57; CHECK-PREP10-NEXT:    lis r4, 1525
58; CHECK-PREP10-NEXT:    ori r4, r4, 56600
59; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
60; CHECK-PREP10-NEXT:    extsb r3, r3
61; CHECK-PREP10-NEXT:    blr
62entry:
63  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
64  %0 = load i8, ptr %add.ptr, align 1
65  ret i8 %0
66}
67
68; Function Attrs: norecurse nounwind readonly uwtable willreturn
69define dso_local signext i8 @ld_align64_int8_t_uint8_t(ptr nocapture readonly %ptr) {
70; CHECK-P10-LABEL: ld_align64_int8_t_uint8_t:
71; CHECK-P10:       # %bb.0: # %entry
72; CHECK-P10-NEXT:    pli r4, 244140625
73; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
74; CHECK-P10-NEXT:    lbzx r3, r3, r4
75; CHECK-P10-NEXT:    extsb r3, r3
76; CHECK-P10-NEXT:    blr
77;
78; CHECK-PREP10-LABEL: ld_align64_int8_t_uint8_t:
79; CHECK-PREP10:       # %bb.0: # %entry
80; CHECK-PREP10-NEXT:    lis r4, 3725
81; CHECK-PREP10-NEXT:    ori r4, r4, 19025
82; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
83; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
84; CHECK-PREP10-NEXT:    extsb r3, r3
85; CHECK-PREP10-NEXT:    blr
86entry:
87  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
88  %0 = load i8, ptr %add.ptr, align 1
89  ret i8 %0
90}
91
92; Function Attrs: norecurse nounwind readonly uwtable willreturn
93define dso_local signext i8 @ld_reg_int8_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) {
94; CHECK-LABEL: ld_reg_int8_t_uint8_t:
95; CHECK:       # %bb.0: # %entry
96; CHECK-NEXT:    lbzx r3, r3, r4
97; CHECK-NEXT:    extsb r3, r3
98; CHECK-NEXT:    blr
99entry:
100  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
101  %0 = load i8, ptr %add.ptr, align 1
102  ret i8 %0
103}
104
105; Function Attrs: norecurse nounwind readonly uwtable willreturn
106define dso_local signext i8 @ld_or_int8_t_uint8_t(i64 %ptr, i8 zeroext %off) {
107; CHECK-LABEL: ld_or_int8_t_uint8_t:
108; CHECK:       # %bb.0: # %entry
109; CHECK-NEXT:    or r3, r4, r3
110; CHECK-NEXT:    lbz r3, 0(r3)
111; CHECK-NEXT:    extsb r3, r3
112; CHECK-NEXT:    blr
113entry:
114  %conv = zext i8 %off to i64
115  %or = or i64 %conv, %ptr
116  %0 = inttoptr i64 %or to ptr
117  %1 = load i8, ptr %0, align 1
118  ret i8 %1
119}
120
121; Function Attrs: norecurse nounwind readonly uwtable willreturn
122define dso_local signext i8 @ld_not_disjoint16_int8_t_uint8_t(i64 %ptr) {
123; CHECK-LABEL: ld_not_disjoint16_int8_t_uint8_t:
124; CHECK:       # %bb.0: # %entry
125; CHECK-NEXT:    ori r3, r3, 6
126; CHECK-NEXT:    lbz r3, 0(r3)
127; CHECK-NEXT:    extsb r3, r3
128; CHECK-NEXT:    blr
129entry:
130  %or = or i64 %ptr, 6
131  %0 = inttoptr i64 %or to ptr
132  %1 = load i8, ptr %0, align 1
133  ret i8 %1
134}
135
136; Function Attrs: norecurse nounwind readonly uwtable willreturn
137define dso_local signext i8 @ld_disjoint_align16_int8_t_uint8_t(i64 %ptr) {
138; CHECK-LABEL: ld_disjoint_align16_int8_t_uint8_t:
139; CHECK:       # %bb.0: # %entry
140; CHECK-NEXT:    rldicr r3, r3, 0, 51
141; CHECK-NEXT:    lbz r3, 24(r3)
142; CHECK-NEXT:    extsb r3, r3
143; CHECK-NEXT:    blr
144entry:
145  %and = and i64 %ptr, -4096
146  %or = or i64 %and, 24
147  %0 = inttoptr i64 %or to ptr
148  %1 = load i8, ptr %0, align 8
149  ret i8 %1
150}
151
152; Function Attrs: norecurse nounwind readonly uwtable willreturn
153define dso_local signext i8 @ld_not_disjoint32_int8_t_uint8_t(i64 %ptr) {
154; CHECK-LABEL: ld_not_disjoint32_int8_t_uint8_t:
155; CHECK:       # %bb.0: # %entry
156; CHECK-NEXT:    ori r3, r3, 34463
157; CHECK-NEXT:    oris r3, r3, 1
158; CHECK-NEXT:    lbz r3, 0(r3)
159; CHECK-NEXT:    extsb r3, r3
160; CHECK-NEXT:    blr
161entry:
162  %or = or i64 %ptr, 99999
163  %0 = inttoptr i64 %or to ptr
164  %1 = load i8, ptr %0, align 1
165  ret i8 %1
166}
167
168; Function Attrs: norecurse nounwind readonly uwtable willreturn
169define dso_local signext i8 @ld_disjoint_align32_int8_t_uint8_t(i64 %ptr) {
170; CHECK-P10-LABEL: ld_disjoint_align32_int8_t_uint8_t:
171; CHECK-P10:       # %bb.0: # %entry
172; CHECK-P10-NEXT:    lis r4, -15264
173; CHECK-P10-NEXT:    and r3, r3, r4
174; CHECK-P10-NEXT:    plbz r3, 999990000(r3), 0
175; CHECK-P10-NEXT:    extsb r3, r3
176; CHECK-P10-NEXT:    blr
177;
178; CHECK-PREP10-LABEL: ld_disjoint_align32_int8_t_uint8_t:
179; CHECK-PREP10:       # %bb.0: # %entry
180; CHECK-PREP10-NEXT:    lis r4, -15264
181; CHECK-PREP10-NEXT:    and r3, r3, r4
182; CHECK-PREP10-NEXT:    lis r4, 15258
183; CHECK-PREP10-NEXT:    ori r4, r4, 41712
184; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
185; CHECK-PREP10-NEXT:    extsb r3, r3
186; CHECK-PREP10-NEXT:    blr
187entry:
188  %and = and i64 %ptr, -1000341504
189  %or = or i64 %and, 999990000
190  %0 = inttoptr i64 %or to ptr
191  %1 = load i8, ptr %0, align 16
192  ret i8 %1
193}
194
195; Function Attrs: norecurse nounwind readonly uwtable willreturn
196define dso_local signext i8 @ld_not_disjoint64_int8_t_uint8_t(i64 %ptr) {
197; CHECK-P10-LABEL: ld_not_disjoint64_int8_t_uint8_t:
198; CHECK-P10:       # %bb.0: # %entry
199; CHECK-P10-NEXT:    pli r4, 232
200; CHECK-P10-NEXT:    pli r5, 3567587329
201; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
202; CHECK-P10-NEXT:    or r3, r3, r5
203; CHECK-P10-NEXT:    lbz r3, 0(r3)
204; CHECK-P10-NEXT:    extsb r3, r3
205; CHECK-P10-NEXT:    blr
206;
207; CHECK-PREP10-LABEL: ld_not_disjoint64_int8_t_uint8_t:
208; CHECK-PREP10:       # %bb.0: # %entry
209; CHECK-PREP10-NEXT:    li r4, 29
210; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
211; CHECK-PREP10-NEXT:    oris r4, r4, 54437
212; CHECK-PREP10-NEXT:    ori r4, r4, 4097
213; CHECK-PREP10-NEXT:    or r3, r3, r4
214; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
215; CHECK-PREP10-NEXT:    extsb r3, r3
216; CHECK-PREP10-NEXT:    blr
217entry:
218  %or = or i64 %ptr, 1000000000001
219  %0 = inttoptr i64 %or to ptr
220  %1 = load i8, ptr %0, align 1
221  ret i8 %1
222}
223
224; Function Attrs: norecurse nounwind readonly uwtable willreturn
225define dso_local signext i8 @ld_disjoint_align64_int8_t_uint8_t(i64 %ptr) {
226; CHECK-P10-LABEL: ld_disjoint_align64_int8_t_uint8_t:
227; CHECK-P10:       # %bb.0: # %entry
228; CHECK-P10-NEXT:    pli r4, 244140625
229; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
230; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
231; CHECK-P10-NEXT:    lbzx r3, r3, r4
232; CHECK-P10-NEXT:    extsb r3, r3
233; CHECK-P10-NEXT:    blr
234;
235; CHECK-PREP10-LABEL: ld_disjoint_align64_int8_t_uint8_t:
236; CHECK-PREP10:       # %bb.0: # %entry
237; CHECK-PREP10-NEXT:    lis r4, 3725
238; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
239; CHECK-PREP10-NEXT:    ori r4, r4, 19025
240; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
241; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
242; CHECK-PREP10-NEXT:    extsb r3, r3
243; CHECK-PREP10-NEXT:    blr
244entry:
245  %and = and i64 %ptr, -1099511627776
246  %or = or i64 %and, 1000000000000
247  %0 = inttoptr i64 %or to ptr
248  %1 = load i8, ptr %0, align 4096
249  ret i8 %1
250}
251
252; Function Attrs: norecurse nounwind readonly uwtable willreturn
253define dso_local signext i8 @ld_cst_align16_int8_t_uint8_t() {
254; CHECK-LABEL: ld_cst_align16_int8_t_uint8_t:
255; CHECK:       # %bb.0: # %entry
256; CHECK-NEXT:    lbz r3, 4080(0)
257; CHECK-NEXT:    extsb r3, r3
258; CHECK-NEXT:    blr
259entry:
260  %0 = load i8, ptr inttoptr (i64 4080 to ptr), align 16
261  ret i8 %0
262}
263
264; Function Attrs: norecurse nounwind readonly uwtable willreturn
265define dso_local signext i8 @ld_cst_align32_int8_t_uint8_t() {
266; CHECK-LABEL: ld_cst_align32_int8_t_uint8_t:
267; CHECK:       # %bb.0: # %entry
268; CHECK-NEXT:    lis r3, 153
269; CHECK-NEXT:    lbz r3, -27108(r3)
270; CHECK-NEXT:    extsb r3, r3
271; CHECK-NEXT:    blr
272entry:
273  %0 = load i8, ptr inttoptr (i64 9999900 to ptr), align 4
274  ret i8 %0
275}
276
277; Function Attrs: norecurse nounwind readonly uwtable willreturn
278define dso_local signext i8 @ld_cst_align64_int8_t_uint8_t() {
279; CHECK-P10-LABEL: ld_cst_align64_int8_t_uint8_t:
280; CHECK-P10:       # %bb.0: # %entry
281; CHECK-P10-NEXT:    pli r3, 244140625
282; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
283; CHECK-P10-NEXT:    lbz r3, 0(r3)
284; CHECK-P10-NEXT:    extsb r3, r3
285; CHECK-P10-NEXT:    blr
286;
287; CHECK-PREP10-LABEL: ld_cst_align64_int8_t_uint8_t:
288; CHECK-PREP10:       # %bb.0: # %entry
289; CHECK-PREP10-NEXT:    lis r3, 3725
290; CHECK-PREP10-NEXT:    ori r3, r3, 19025
291; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
292; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
293; CHECK-PREP10-NEXT:    extsb r3, r3
294; CHECK-PREP10-NEXT:    blr
295entry:
296  %0 = load i8, ptr inttoptr (i64 1000000000000 to ptr), align 4096
297  ret i8 %0
298}
299
300; Function Attrs: norecurse nounwind readonly uwtable willreturn
301define dso_local signext i8 @ld_0_int8_t_uint16_t(i64 %ptr) {
302; CHECK-LE-LABEL: ld_0_int8_t_uint16_t:
303; CHECK-LE:       # %bb.0: # %entry
304; CHECK-LE-NEXT:    lbz r3, 0(r3)
305; CHECK-LE-NEXT:    extsb r3, r3
306; CHECK-LE-NEXT:    blr
307;
308; CHECK-BE-LABEL: ld_0_int8_t_uint16_t:
309; CHECK-BE:       # %bb.0: # %entry
310; CHECK-BE-NEXT:    lbz r3, 1(r3)
311; CHECK-BE-NEXT:    extsb r3, r3
312; CHECK-BE-NEXT:    blr
313entry:
314  %0 = inttoptr i64 %ptr to ptr
315  %1 = load i16, ptr %0, align 2
316  %conv = trunc i16 %1 to i8
317  ret i8 %conv
318}
319
320; Function Attrs: norecurse nounwind readonly uwtable willreturn
321define dso_local signext i8 @ld_align16_int8_t_uint16_t(ptr nocapture readonly %ptr) {
322; CHECK-LE-LABEL: ld_align16_int8_t_uint16_t:
323; CHECK-LE:       # %bb.0: # %entry
324; CHECK-LE-NEXT:    lbz r3, 8(r3)
325; CHECK-LE-NEXT:    extsb r3, r3
326; CHECK-LE-NEXT:    blr
327;
328; CHECK-BE-LABEL: ld_align16_int8_t_uint16_t:
329; CHECK-BE:       # %bb.0: # %entry
330; CHECK-BE-NEXT:    lbz r3, 9(r3)
331; CHECK-BE-NEXT:    extsb r3, r3
332; CHECK-BE-NEXT:    blr
333entry:
334  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
335  %0 = load i16, ptr %add.ptr, align 2
336  %conv = trunc i16 %0 to i8
337  ret i8 %conv
338}
339
340; Function Attrs: norecurse nounwind readonly uwtable willreturn
341define dso_local signext i8 @ld_align32_int8_t_uint16_t(ptr nocapture readonly %ptr) {
342; CHECK-P10-LE-LABEL: ld_align32_int8_t_uint16_t:
343; CHECK-P10-LE:       # %bb.0: # %entry
344; CHECK-P10-LE-NEXT:    plbz r3, 99999000(r3), 0
345; CHECK-P10-LE-NEXT:    extsb r3, r3
346; CHECK-P10-LE-NEXT:    blr
347;
348; CHECK-P10-BE-LABEL: ld_align32_int8_t_uint16_t:
349; CHECK-P10-BE:       # %bb.0: # %entry
350; CHECK-P10-BE-NEXT:    plbz r3, 99999001(r3), 0
351; CHECK-P10-BE-NEXT:    extsb r3, r3
352; CHECK-P10-BE-NEXT:    blr
353;
354; CHECK-P9-LE-LABEL: ld_align32_int8_t_uint16_t:
355; CHECK-P9-LE:       # %bb.0: # %entry
356; CHECK-P9-LE-NEXT:    lis r4, 1525
357; CHECK-P9-LE-NEXT:    ori r4, r4, 56600
358; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
359; CHECK-P9-LE-NEXT:    extsb r3, r3
360; CHECK-P9-LE-NEXT:    blr
361;
362; CHECK-P9-BE-LABEL: ld_align32_int8_t_uint16_t:
363; CHECK-P9-BE:       # %bb.0: # %entry
364; CHECK-P9-BE-NEXT:    lis r4, 1525
365; CHECK-P9-BE-NEXT:    ori r4, r4, 56601
366; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
367; CHECK-P9-BE-NEXT:    extsb r3, r3
368; CHECK-P9-BE-NEXT:    blr
369;
370; CHECK-P8-LE-LABEL: ld_align32_int8_t_uint16_t:
371; CHECK-P8-LE:       # %bb.0: # %entry
372; CHECK-P8-LE-NEXT:    lis r4, 1525
373; CHECK-P8-LE-NEXT:    ori r4, r4, 56600
374; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
375; CHECK-P8-LE-NEXT:    extsb r3, r3
376; CHECK-P8-LE-NEXT:    blr
377;
378; CHECK-P8-BE-LABEL: ld_align32_int8_t_uint16_t:
379; CHECK-P8-BE:       # %bb.0: # %entry
380; CHECK-P8-BE-NEXT:    lis r4, 1525
381; CHECK-P8-BE-NEXT:    ori r4, r4, 56601
382; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
383; CHECK-P8-BE-NEXT:    extsb r3, r3
384; CHECK-P8-BE-NEXT:    blr
385entry:
386  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
387  %0 = load i16, ptr %add.ptr, align 2
388  %conv = trunc i16 %0 to i8
389  ret i8 %conv
390}
391
392; Function Attrs: norecurse nounwind readonly uwtable willreturn
393define dso_local signext i8 @ld_align64_int8_t_uint16_t(ptr nocapture readonly %ptr) {
394; CHECK-P10-LE-LABEL: ld_align64_int8_t_uint16_t:
395; CHECK-P10-LE:       # %bb.0: # %entry
396; CHECK-P10-LE-NEXT:    pli r4, 244140625
397; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
398; CHECK-P10-LE-NEXT:    lbzx r3, r3, r4
399; CHECK-P10-LE-NEXT:    extsb r3, r3
400; CHECK-P10-LE-NEXT:    blr
401;
402; CHECK-P10-BE-LABEL: ld_align64_int8_t_uint16_t:
403; CHECK-P10-BE:       # %bb.0: # %entry
404; CHECK-P10-BE-NEXT:    pli r4, 232
405; CHECK-P10-BE-NEXT:    pli r5, 3567587329
406; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
407; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
408; CHECK-P10-BE-NEXT:    extsb r3, r3
409; CHECK-P10-BE-NEXT:    blr
410;
411; CHECK-P9-LE-LABEL: ld_align64_int8_t_uint16_t:
412; CHECK-P9-LE:       # %bb.0: # %entry
413; CHECK-P9-LE-NEXT:    lis r4, 3725
414; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
415; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
416; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
417; CHECK-P9-LE-NEXT:    extsb r3, r3
418; CHECK-P9-LE-NEXT:    blr
419;
420; CHECK-P9-BE-LABEL: ld_align64_int8_t_uint16_t:
421; CHECK-P9-BE:       # %bb.0: # %entry
422; CHECK-P9-BE-NEXT:    li r4, 29
423; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
424; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
425; CHECK-P9-BE-NEXT:    ori r4, r4, 4097
426; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
427; CHECK-P9-BE-NEXT:    extsb r3, r3
428; CHECK-P9-BE-NEXT:    blr
429;
430; CHECK-P8-LE-LABEL: ld_align64_int8_t_uint16_t:
431; CHECK-P8-LE:       # %bb.0: # %entry
432; CHECK-P8-LE-NEXT:    lis r4, 3725
433; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
434; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
435; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
436; CHECK-P8-LE-NEXT:    extsb r3, r3
437; CHECK-P8-LE-NEXT:    blr
438;
439; CHECK-P8-BE-LABEL: ld_align64_int8_t_uint16_t:
440; CHECK-P8-BE:       # %bb.0: # %entry
441; CHECK-P8-BE-NEXT:    li r4, 29
442; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
443; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
444; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
445; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
446; CHECK-P8-BE-NEXT:    extsb r3, r3
447; CHECK-P8-BE-NEXT:    blr
448entry:
449  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
450  %0 = load i16, ptr %add.ptr, align 2
451  %conv = trunc i16 %0 to i8
452  ret i8 %conv
453}
454
455; Function Attrs: norecurse nounwind readonly uwtable willreturn
456define dso_local signext i8 @ld_reg_int8_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) {
457; CHECK-LE-LABEL: ld_reg_int8_t_uint16_t:
458; CHECK-LE:       # %bb.0: # %entry
459; CHECK-LE-NEXT:    lbzx r3, r3, r4
460; CHECK-LE-NEXT:    extsb r3, r3
461; CHECK-LE-NEXT:    blr
462;
463; CHECK-BE-LABEL: ld_reg_int8_t_uint16_t:
464; CHECK-BE:       # %bb.0: # %entry
465; CHECK-BE-NEXT:    add r3, r3, r4
466; CHECK-BE-NEXT:    lbz r3, 1(r3)
467; CHECK-BE-NEXT:    extsb r3, r3
468; CHECK-BE-NEXT:    blr
469entry:
470  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
471  %0 = load i16, ptr %add.ptr, align 2
472  %conv = trunc i16 %0 to i8
473  ret i8 %conv
474}
475
476; Function Attrs: norecurse nounwind readonly uwtable willreturn
477define dso_local signext i8 @ld_or_int8_t_uint16_t(i64 %ptr, i8 zeroext %off) {
478; CHECK-LE-LABEL: ld_or_int8_t_uint16_t:
479; CHECK-LE:       # %bb.0: # %entry
480; CHECK-LE-NEXT:    or r3, r4, r3
481; CHECK-LE-NEXT:    lbz r3, 0(r3)
482; CHECK-LE-NEXT:    extsb r3, r3
483; CHECK-LE-NEXT:    blr
484;
485; CHECK-BE-LABEL: ld_or_int8_t_uint16_t:
486; CHECK-BE:       # %bb.0: # %entry
487; CHECK-BE-NEXT:    or r3, r4, r3
488; CHECK-BE-NEXT:    lbz r3, 1(r3)
489; CHECK-BE-NEXT:    extsb r3, r3
490; CHECK-BE-NEXT:    blr
491entry:
492  %conv = zext i8 %off to i64
493  %or = or i64 %conv, %ptr
494  %0 = inttoptr i64 %or to ptr
495  %1 = load i16, ptr %0, align 2
496  %conv1 = trunc i16 %1 to i8
497  ret i8 %conv1
498}
499
500; Function Attrs: norecurse nounwind readonly uwtable willreturn
501define dso_local signext i8 @ld_not_disjoint16_int8_t_uint16_t(i64 %ptr) {
502; CHECK-LE-LABEL: ld_not_disjoint16_int8_t_uint16_t:
503; CHECK-LE:       # %bb.0: # %entry
504; CHECK-LE-NEXT:    ori r3, r3, 6
505; CHECK-LE-NEXT:    lbz r3, 0(r3)
506; CHECK-LE-NEXT:    extsb r3, r3
507; CHECK-LE-NEXT:    blr
508;
509; CHECK-BE-LABEL: ld_not_disjoint16_int8_t_uint16_t:
510; CHECK-BE:       # %bb.0: # %entry
511; CHECK-BE-NEXT:    ori r3, r3, 6
512; CHECK-BE-NEXT:    lbz r3, 1(r3)
513; CHECK-BE-NEXT:    extsb r3, r3
514; CHECK-BE-NEXT:    blr
515entry:
516  %or = or i64 %ptr, 6
517  %0 = inttoptr i64 %or to ptr
518  %1 = load i16, ptr %0, align 2
519  %conv = trunc i16 %1 to i8
520  ret i8 %conv
521}
522
523; Function Attrs: norecurse nounwind readonly uwtable willreturn
524define dso_local signext i8 @ld_disjoint_align16_int8_t_uint16_t(i64 %ptr) {
525; CHECK-LE-LABEL: ld_disjoint_align16_int8_t_uint16_t:
526; CHECK-LE:       # %bb.0: # %entry
527; CHECK-LE-NEXT:    rldicr r3, r3, 0, 51
528; CHECK-LE-NEXT:    lbz r3, 24(r3)
529; CHECK-LE-NEXT:    extsb r3, r3
530; CHECK-LE-NEXT:    blr
531;
532; CHECK-BE-LABEL: ld_disjoint_align16_int8_t_uint16_t:
533; CHECK-BE:       # %bb.0: # %entry
534; CHECK-BE-NEXT:    rldicr r3, r3, 0, 51
535; CHECK-BE-NEXT:    lbz r3, 25(r3)
536; CHECK-BE-NEXT:    extsb r3, r3
537; CHECK-BE-NEXT:    blr
538entry:
539  %and = and i64 %ptr, -4096
540  %or = or i64 %and, 24
541  %0 = inttoptr i64 %or to ptr
542  %1 = load i16, ptr %0, align 8
543  %conv = trunc i16 %1 to i8
544  ret i8 %conv
545}
546
547; Function Attrs: norecurse nounwind readonly uwtable willreturn
548define dso_local signext i8 @ld_not_disjoint32_int8_t_uint16_t(i64 %ptr) {
549; CHECK-LE-LABEL: ld_not_disjoint32_int8_t_uint16_t:
550; CHECK-LE:       # %bb.0: # %entry
551; CHECK-LE-NEXT:    ori r3, r3, 34463
552; CHECK-LE-NEXT:    oris r3, r3, 1
553; CHECK-LE-NEXT:    lbz r3, 0(r3)
554; CHECK-LE-NEXT:    extsb r3, r3
555; CHECK-LE-NEXT:    blr
556;
557; CHECK-BE-LABEL: ld_not_disjoint32_int8_t_uint16_t:
558; CHECK-BE:       # %bb.0: # %entry
559; CHECK-BE-NEXT:    ori r3, r3, 34463
560; CHECK-BE-NEXT:    oris r3, r3, 1
561; CHECK-BE-NEXT:    lbz r3, 1(r3)
562; CHECK-BE-NEXT:    extsb r3, r3
563; CHECK-BE-NEXT:    blr
564entry:
565  %or = or i64 %ptr, 99999
566  %0 = inttoptr i64 %or to ptr
567  %1 = load i16, ptr %0, align 2
568  %conv = trunc i16 %1 to i8
569  ret i8 %conv
570}
571
572; Function Attrs: norecurse nounwind readonly uwtable willreturn
573define dso_local signext i8 @ld_disjoint_align32_int8_t_uint16_t(i64 %ptr) {
574; CHECK-P10-LE-LABEL: ld_disjoint_align32_int8_t_uint16_t:
575; CHECK-P10-LE:       # %bb.0: # %entry
576; CHECK-P10-LE-NEXT:    lis r4, -15264
577; CHECK-P10-LE-NEXT:    and r3, r3, r4
578; CHECK-P10-LE-NEXT:    plbz r3, 999990000(r3), 0
579; CHECK-P10-LE-NEXT:    extsb r3, r3
580; CHECK-P10-LE-NEXT:    blr
581;
582; CHECK-P10-BE-LABEL: ld_disjoint_align32_int8_t_uint16_t:
583; CHECK-P10-BE:       # %bb.0: # %entry
584; CHECK-P10-BE-NEXT:    lis r4, -15264
585; CHECK-P10-BE-NEXT:    and r3, r3, r4
586; CHECK-P10-BE-NEXT:    plbz r3, 999990001(r3), 0
587; CHECK-P10-BE-NEXT:    extsb r3, r3
588; CHECK-P10-BE-NEXT:    blr
589;
590; CHECK-P9-LE-LABEL: ld_disjoint_align32_int8_t_uint16_t:
591; CHECK-P9-LE:       # %bb.0: # %entry
592; CHECK-P9-LE-NEXT:    lis r4, -15264
593; CHECK-P9-LE-NEXT:    and r3, r3, r4
594; CHECK-P9-LE-NEXT:    lis r4, 15258
595; CHECK-P9-LE-NEXT:    ori r4, r4, 41712
596; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
597; CHECK-P9-LE-NEXT:    extsb r3, r3
598; CHECK-P9-LE-NEXT:    blr
599;
600; CHECK-P9-BE-LABEL: ld_disjoint_align32_int8_t_uint16_t:
601; CHECK-P9-BE:       # %bb.0: # %entry
602; CHECK-P9-BE-NEXT:    lis r4, -15264
603; CHECK-P9-BE-NEXT:    and r3, r3, r4
604; CHECK-P9-BE-NEXT:    lis r4, 15258
605; CHECK-P9-BE-NEXT:    ori r4, r4, 41713
606; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
607; CHECK-P9-BE-NEXT:    extsb r3, r3
608; CHECK-P9-BE-NEXT:    blr
609;
610; CHECK-P8-LE-LABEL: ld_disjoint_align32_int8_t_uint16_t:
611; CHECK-P8-LE:       # %bb.0: # %entry
612; CHECK-P8-LE-NEXT:    lis r4, -15264
613; CHECK-P8-LE-NEXT:    and r3, r3, r4
614; CHECK-P8-LE-NEXT:    lis r4, 15258
615; CHECK-P8-LE-NEXT:    ori r4, r4, 41712
616; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
617; CHECK-P8-LE-NEXT:    extsb r3, r3
618; CHECK-P8-LE-NEXT:    blr
619;
620; CHECK-P8-BE-LABEL: ld_disjoint_align32_int8_t_uint16_t:
621; CHECK-P8-BE:       # %bb.0: # %entry
622; CHECK-P8-BE-NEXT:    lis r4, -15264
623; CHECK-P8-BE-NEXT:    and r3, r3, r4
624; CHECK-P8-BE-NEXT:    lis r4, 15258
625; CHECK-P8-BE-NEXT:    ori r4, r4, 41713
626; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
627; CHECK-P8-BE-NEXT:    extsb r3, r3
628; CHECK-P8-BE-NEXT:    blr
629entry:
630  %and = and i64 %ptr, -1000341504
631  %or = or i64 %and, 999990000
632  %0 = inttoptr i64 %or to ptr
633  %1 = load i16, ptr %0, align 16
634  %conv = trunc i16 %1 to i8
635  ret i8 %conv
636}
637
638; Function Attrs: norecurse nounwind readonly uwtable willreturn
639define dso_local signext i8 @ld_not_disjoint64_int8_t_uint16_t(i64 %ptr) {
640; CHECK-P10-LE-LABEL: ld_not_disjoint64_int8_t_uint16_t:
641; CHECK-P10-LE:       # %bb.0: # %entry
642; CHECK-P10-LE-NEXT:    pli r4, 232
643; CHECK-P10-LE-NEXT:    pli r5, 3567587329
644; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
645; CHECK-P10-LE-NEXT:    or r3, r3, r5
646; CHECK-P10-LE-NEXT:    lbz r3, 0(r3)
647; CHECK-P10-LE-NEXT:    extsb r3, r3
648; CHECK-P10-LE-NEXT:    blr
649;
650; CHECK-P10-BE-LABEL: ld_not_disjoint64_int8_t_uint16_t:
651; CHECK-P10-BE:       # %bb.0: # %entry
652; CHECK-P10-BE-NEXT:    pli r4, 232
653; CHECK-P10-BE-NEXT:    pli r5, 3567587329
654; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
655; CHECK-P10-BE-NEXT:    or r3, r3, r5
656; CHECK-P10-BE-NEXT:    lbz r3, 1(r3)
657; CHECK-P10-BE-NEXT:    extsb r3, r3
658; CHECK-P10-BE-NEXT:    blr
659;
660; CHECK-P9-LE-LABEL: ld_not_disjoint64_int8_t_uint16_t:
661; CHECK-P9-LE:       # %bb.0: # %entry
662; CHECK-P9-LE-NEXT:    li r4, 29
663; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
664; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
665; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
666; CHECK-P9-LE-NEXT:    or r3, r3, r4
667; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
668; CHECK-P9-LE-NEXT:    extsb r3, r3
669; CHECK-P9-LE-NEXT:    blr
670;
671; CHECK-P9-BE-LABEL: ld_not_disjoint64_int8_t_uint16_t:
672; CHECK-P9-BE:       # %bb.0: # %entry
673; CHECK-P9-BE-NEXT:    li r4, 29
674; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
675; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
676; CHECK-P9-BE-NEXT:    ori r4, r4, 4097
677; CHECK-P9-BE-NEXT:    or r3, r3, r4
678; CHECK-P9-BE-NEXT:    lbz r3, 1(r3)
679; CHECK-P9-BE-NEXT:    extsb r3, r3
680; CHECK-P9-BE-NEXT:    blr
681;
682; CHECK-P8-LE-LABEL: ld_not_disjoint64_int8_t_uint16_t:
683; CHECK-P8-LE:       # %bb.0: # %entry
684; CHECK-P8-LE-NEXT:    li r4, 29
685; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
686; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
687; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
688; CHECK-P8-LE-NEXT:    or r3, r3, r4
689; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
690; CHECK-P8-LE-NEXT:    extsb r3, r3
691; CHECK-P8-LE-NEXT:    blr
692;
693; CHECK-P8-BE-LABEL: ld_not_disjoint64_int8_t_uint16_t:
694; CHECK-P8-BE:       # %bb.0: # %entry
695; CHECK-P8-BE-NEXT:    li r4, 29
696; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
697; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
698; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
699; CHECK-P8-BE-NEXT:    or r3, r3, r4
700; CHECK-P8-BE-NEXT:    lbz r3, 1(r3)
701; CHECK-P8-BE-NEXT:    extsb r3, r3
702; CHECK-P8-BE-NEXT:    blr
703entry:
704  %or = or i64 %ptr, 1000000000001
705  %0 = inttoptr i64 %or to ptr
706  %1 = load i16, ptr %0, align 2
707  %conv = trunc i16 %1 to i8
708  ret i8 %conv
709}
710
711; Function Attrs: norecurse nounwind readonly uwtable willreturn
712define dso_local signext i8 @ld_disjoint_align64_int8_t_uint16_t(i64 %ptr) {
713; CHECK-P10-LE-LABEL: ld_disjoint_align64_int8_t_uint16_t:
714; CHECK-P10-LE:       # %bb.0: # %entry
715; CHECK-P10-LE-NEXT:    pli r4, 244140625
716; CHECK-P10-LE-NEXT:    rldicr r3, r3, 0, 23
717; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
718; CHECK-P10-LE-NEXT:    lbzx r3, r3, r4
719; CHECK-P10-LE-NEXT:    extsb r3, r3
720; CHECK-P10-LE-NEXT:    blr
721;
722; CHECK-P10-BE-LABEL: ld_disjoint_align64_int8_t_uint16_t:
723; CHECK-P10-BE:       # %bb.0: # %entry
724; CHECK-P10-BE-NEXT:    pli r4, 232
725; CHECK-P10-BE-NEXT:    pli r5, 3567587329
726; CHECK-P10-BE-NEXT:    rldicr r3, r3, 0, 23
727; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
728; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
729; CHECK-P10-BE-NEXT:    extsb r3, r3
730; CHECK-P10-BE-NEXT:    blr
731;
732; CHECK-P9-LE-LABEL: ld_disjoint_align64_int8_t_uint16_t:
733; CHECK-P9-LE:       # %bb.0: # %entry
734; CHECK-P9-LE-NEXT:    lis r4, 3725
735; CHECK-P9-LE-NEXT:    rldicr r3, r3, 0, 23
736; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
737; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
738; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
739; CHECK-P9-LE-NEXT:    extsb r3, r3
740; CHECK-P9-LE-NEXT:    blr
741;
742; CHECK-P9-BE-LABEL: ld_disjoint_align64_int8_t_uint16_t:
743; CHECK-P9-BE:       # %bb.0: # %entry
744; CHECK-P9-BE-NEXT:    li r4, 29
745; CHECK-P9-BE-NEXT:    rldicr r3, r3, 0, 23
746; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
747; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
748; CHECK-P9-BE-NEXT:    ori r4, r4, 4097
749; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
750; CHECK-P9-BE-NEXT:    extsb r3, r3
751; CHECK-P9-BE-NEXT:    blr
752;
753; CHECK-P8-LE-LABEL: ld_disjoint_align64_int8_t_uint16_t:
754; CHECK-P8-LE:       # %bb.0: # %entry
755; CHECK-P8-LE-NEXT:    lis r4, 3725
756; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
757; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
758; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
759; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
760; CHECK-P8-LE-NEXT:    extsb r3, r3
761; CHECK-P8-LE-NEXT:    blr
762;
763; CHECK-P8-BE-LABEL: ld_disjoint_align64_int8_t_uint16_t:
764; CHECK-P8-BE:       # %bb.0: # %entry
765; CHECK-P8-BE-NEXT:    li r4, 29
766; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
767; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
768; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
769; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
770; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
771; CHECK-P8-BE-NEXT:    extsb r3, r3
772; CHECK-P8-BE-NEXT:    blr
773entry:
774  %and = and i64 %ptr, -1099511627776
775  %or = or i64 %and, 1000000000000
776  %0 = inttoptr i64 %or to ptr
777  %1 = load i16, ptr %0, align 4096
778  %conv = trunc i16 %1 to i8
779  ret i8 %conv
780}
781
782; Function Attrs: norecurse nounwind readonly uwtable willreturn
783define dso_local signext i8 @ld_cst_align16_int8_t_uint16_t() {
784; CHECK-LE-LABEL: ld_cst_align16_int8_t_uint16_t:
785; CHECK-LE:       # %bb.0: # %entry
786; CHECK-LE-NEXT:    lbz r3, 4080(0)
787; CHECK-LE-NEXT:    extsb r3, r3
788; CHECK-LE-NEXT:    blr
789;
790; CHECK-BE-LABEL: ld_cst_align16_int8_t_uint16_t:
791; CHECK-BE:       # %bb.0: # %entry
792; CHECK-BE-NEXT:    lbz r3, 4081(0)
793; CHECK-BE-NEXT:    extsb r3, r3
794; CHECK-BE-NEXT:    blr
795entry:
796  %0 = load i16, ptr inttoptr (i64 4080 to ptr), align 16
797  %conv = trunc i16 %0 to i8
798  ret i8 %conv
799}
800
801; Function Attrs: norecurse nounwind readonly uwtable willreturn
802define dso_local signext i8 @ld_cst_align32_int8_t_uint16_t() {
803; CHECK-LE-LABEL: ld_cst_align32_int8_t_uint16_t:
804; CHECK-LE:       # %bb.0: # %entry
805; CHECK-LE-NEXT:    lis r3, 153
806; CHECK-LE-NEXT:    lbz r3, -27108(r3)
807; CHECK-LE-NEXT:    extsb r3, r3
808; CHECK-LE-NEXT:    blr
809;
810; CHECK-BE-LABEL: ld_cst_align32_int8_t_uint16_t:
811; CHECK-BE:       # %bb.0: # %entry
812; CHECK-BE-NEXT:    lis r3, 153
813; CHECK-BE-NEXT:    lbz r3, -27107(r3)
814; CHECK-BE-NEXT:    extsb r3, r3
815; CHECK-BE-NEXT:    blr
816entry:
817  %0 = load i16, ptr inttoptr (i64 9999900 to ptr), align 4
818  %conv = trunc i16 %0 to i8
819  ret i8 %conv
820}
821
822; Function Attrs: norecurse nounwind readonly uwtable willreturn
823define dso_local signext i8 @ld_cst_align64_int8_t_uint16_t() {
824; CHECK-P10-LE-LABEL: ld_cst_align64_int8_t_uint16_t:
825; CHECK-P10-LE:       # %bb.0: # %entry
826; CHECK-P10-LE-NEXT:    pli r3, 244140625
827; CHECK-P10-LE-NEXT:    rldic r3, r3, 12, 24
828; CHECK-P10-LE-NEXT:    lbz r3, 0(r3)
829; CHECK-P10-LE-NEXT:    extsb r3, r3
830; CHECK-P10-LE-NEXT:    blr
831;
832; CHECK-P10-BE-LABEL: ld_cst_align64_int8_t_uint16_t:
833; CHECK-P10-BE:       # %bb.0: # %entry
834; CHECK-P10-BE-NEXT:    pli r3, 232
835; CHECK-P10-BE-NEXT:    pli r4, 3567587329
836; CHECK-P10-BE-NEXT:    rldimi r4, r3, 32, 0
837; CHECK-P10-BE-NEXT:    lbz r3, 0(r4)
838; CHECK-P10-BE-NEXT:    extsb r3, r3
839; CHECK-P10-BE-NEXT:    blr
840;
841; CHECK-P9-LE-LABEL: ld_cst_align64_int8_t_uint16_t:
842; CHECK-P9-LE:       # %bb.0: # %entry
843; CHECK-P9-LE-NEXT:    lis r3, 3725
844; CHECK-P9-LE-NEXT:    ori r3, r3, 19025
845; CHECK-P9-LE-NEXT:    rldic r3, r3, 12, 24
846; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
847; CHECK-P9-LE-NEXT:    extsb r3, r3
848; CHECK-P9-LE-NEXT:    blr
849;
850; CHECK-P9-BE-LABEL: ld_cst_align64_int8_t_uint16_t:
851; CHECK-P9-BE:       # %bb.0: # %entry
852; CHECK-P9-BE-NEXT:    li r3, 29
853; CHECK-P9-BE-NEXT:    rldic r3, r3, 35, 24
854; CHECK-P9-BE-NEXT:    oris r3, r3, 54437
855; CHECK-P9-BE-NEXT:    ori r3, r3, 4097
856; CHECK-P9-BE-NEXT:    lbz r3, 0(r3)
857; CHECK-P9-BE-NEXT:    extsb r3, r3
858; CHECK-P9-BE-NEXT:    blr
859;
860; CHECK-P8-LE-LABEL: ld_cst_align64_int8_t_uint16_t:
861; CHECK-P8-LE:       # %bb.0: # %entry
862; CHECK-P8-LE-NEXT:    lis r3, 3725
863; CHECK-P8-LE-NEXT:    ori r3, r3, 19025
864; CHECK-P8-LE-NEXT:    rldic r3, r3, 12, 24
865; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
866; CHECK-P8-LE-NEXT:    extsb r3, r3
867; CHECK-P8-LE-NEXT:    blr
868;
869; CHECK-P8-BE-LABEL: ld_cst_align64_int8_t_uint16_t:
870; CHECK-P8-BE:       # %bb.0: # %entry
871; CHECK-P8-BE-NEXT:    li r3, 29
872; CHECK-P8-BE-NEXT:    rldic r3, r3, 35, 24
873; CHECK-P8-BE-NEXT:    oris r3, r3, 54437
874; CHECK-P8-BE-NEXT:    ori r3, r3, 4097
875; CHECK-P8-BE-NEXT:    lbz r3, 0(r3)
876; CHECK-P8-BE-NEXT:    extsb r3, r3
877; CHECK-P8-BE-NEXT:    blr
878entry:
879  %0 = load i16, ptr inttoptr (i64 1000000000000 to ptr), align 4096
880  %conv = trunc i16 %0 to i8
881  ret i8 %conv
882}
883
884; Function Attrs: norecurse nounwind readonly uwtable willreturn
885define dso_local signext i8 @ld_0_int8_t_uint32_t(i64 %ptr) {
886; CHECK-LE-LABEL: ld_0_int8_t_uint32_t:
887; CHECK-LE:       # %bb.0: # %entry
888; CHECK-LE-NEXT:    lbz r3, 0(r3)
889; CHECK-LE-NEXT:    extsb r3, r3
890; CHECK-LE-NEXT:    blr
891;
892; CHECK-BE-LABEL: ld_0_int8_t_uint32_t:
893; CHECK-BE:       # %bb.0: # %entry
894; CHECK-BE-NEXT:    lbz r3, 3(r3)
895; CHECK-BE-NEXT:    extsb r3, r3
896; CHECK-BE-NEXT:    blr
897entry:
898  %0 = inttoptr i64 %ptr to ptr
899  %1 = load i32, ptr %0, align 4
900  %conv = trunc i32 %1 to i8
901  ret i8 %conv
902}
903
904; Function Attrs: norecurse nounwind readonly uwtable willreturn
905define dso_local signext i8 @ld_align16_int8_t_uint32_t(ptr nocapture readonly %ptr) {
906; CHECK-LE-LABEL: ld_align16_int8_t_uint32_t:
907; CHECK-LE:       # %bb.0: # %entry
908; CHECK-LE-NEXT:    lbz r3, 8(r3)
909; CHECK-LE-NEXT:    extsb r3, r3
910; CHECK-LE-NEXT:    blr
911;
912; CHECK-BE-LABEL: ld_align16_int8_t_uint32_t:
913; CHECK-BE:       # %bb.0: # %entry
914; CHECK-BE-NEXT:    lbz r3, 11(r3)
915; CHECK-BE-NEXT:    extsb r3, r3
916; CHECK-BE-NEXT:    blr
917entry:
918  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
919  %0 = load i32, ptr %add.ptr, align 4
920  %conv = trunc i32 %0 to i8
921  ret i8 %conv
922}
923
924; Function Attrs: norecurse nounwind readonly uwtable willreturn
925define dso_local signext i8 @ld_align32_int8_t_uint32_t(ptr nocapture readonly %ptr) {
926; CHECK-P10-LE-LABEL: ld_align32_int8_t_uint32_t:
927; CHECK-P10-LE:       # %bb.0: # %entry
928; CHECK-P10-LE-NEXT:    plbz r3, 99999000(r3), 0
929; CHECK-P10-LE-NEXT:    extsb r3, r3
930; CHECK-P10-LE-NEXT:    blr
931;
932; CHECK-P10-BE-LABEL: ld_align32_int8_t_uint32_t:
933; CHECK-P10-BE:       # %bb.0: # %entry
934; CHECK-P10-BE-NEXT:    plbz r3, 99999003(r3), 0
935; CHECK-P10-BE-NEXT:    extsb r3, r3
936; CHECK-P10-BE-NEXT:    blr
937;
938; CHECK-P9-LE-LABEL: ld_align32_int8_t_uint32_t:
939; CHECK-P9-LE:       # %bb.0: # %entry
940; CHECK-P9-LE-NEXT:    lis r4, 1525
941; CHECK-P9-LE-NEXT:    ori r4, r4, 56600
942; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
943; CHECK-P9-LE-NEXT:    extsb r3, r3
944; CHECK-P9-LE-NEXT:    blr
945;
946; CHECK-P9-BE-LABEL: ld_align32_int8_t_uint32_t:
947; CHECK-P9-BE:       # %bb.0: # %entry
948; CHECK-P9-BE-NEXT:    lis r4, 1525
949; CHECK-P9-BE-NEXT:    ori r4, r4, 56603
950; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
951; CHECK-P9-BE-NEXT:    extsb r3, r3
952; CHECK-P9-BE-NEXT:    blr
953;
954; CHECK-P8-LE-LABEL: ld_align32_int8_t_uint32_t:
955; CHECK-P8-LE:       # %bb.0: # %entry
956; CHECK-P8-LE-NEXT:    lis r4, 1525
957; CHECK-P8-LE-NEXT:    ori r4, r4, 56600
958; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
959; CHECK-P8-LE-NEXT:    extsb r3, r3
960; CHECK-P8-LE-NEXT:    blr
961;
962; CHECK-P8-BE-LABEL: ld_align32_int8_t_uint32_t:
963; CHECK-P8-BE:       # %bb.0: # %entry
964; CHECK-P8-BE-NEXT:    lis r4, 1525
965; CHECK-P8-BE-NEXT:    ori r4, r4, 56603
966; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
967; CHECK-P8-BE-NEXT:    extsb r3, r3
968; CHECK-P8-BE-NEXT:    blr
969entry:
970  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
971  %0 = load i32, ptr %add.ptr, align 4
972  %conv = trunc i32 %0 to i8
973  ret i8 %conv
974}
975
976; Function Attrs: norecurse nounwind readonly uwtable willreturn
977define dso_local signext i8 @ld_align64_int8_t_uint32_t(ptr nocapture readonly %ptr) {
978; CHECK-P10-LE-LABEL: ld_align64_int8_t_uint32_t:
979; CHECK-P10-LE:       # %bb.0: # %entry
980; CHECK-P10-LE-NEXT:    pli r4, 244140625
981; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
982; CHECK-P10-LE-NEXT:    lbzx r3, r3, r4
983; CHECK-P10-LE-NEXT:    extsb r3, r3
984; CHECK-P10-LE-NEXT:    blr
985;
986; CHECK-P10-BE-LABEL: ld_align64_int8_t_uint32_t:
987; CHECK-P10-BE:       # %bb.0: # %entry
988; CHECK-P10-BE-NEXT:    pli r4, 232
989; CHECK-P10-BE-NEXT:    pli r5, 3567587331
990; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
991; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
992; CHECK-P10-BE-NEXT:    extsb r3, r3
993; CHECK-P10-BE-NEXT:    blr
994;
995; CHECK-P9-LE-LABEL: ld_align64_int8_t_uint32_t:
996; CHECK-P9-LE:       # %bb.0: # %entry
997; CHECK-P9-LE-NEXT:    lis r4, 3725
998; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
999; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
1000; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
1001; CHECK-P9-LE-NEXT:    extsb r3, r3
1002; CHECK-P9-LE-NEXT:    blr
1003;
1004; CHECK-P9-BE-LABEL: ld_align64_int8_t_uint32_t:
1005; CHECK-P9-BE:       # %bb.0: # %entry
1006; CHECK-P9-BE-NEXT:    li r4, 29
1007; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
1008; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
1009; CHECK-P9-BE-NEXT:    ori r4, r4, 4099
1010; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
1011; CHECK-P9-BE-NEXT:    extsb r3, r3
1012; CHECK-P9-BE-NEXT:    blr
1013;
1014; CHECK-P8-LE-LABEL: ld_align64_int8_t_uint32_t:
1015; CHECK-P8-LE:       # %bb.0: # %entry
1016; CHECK-P8-LE-NEXT:    lis r4, 3725
1017; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
1018; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
1019; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
1020; CHECK-P8-LE-NEXT:    extsb r3, r3
1021; CHECK-P8-LE-NEXT:    blr
1022;
1023; CHECK-P8-BE-LABEL: ld_align64_int8_t_uint32_t:
1024; CHECK-P8-BE:       # %bb.0: # %entry
1025; CHECK-P8-BE-NEXT:    li r4, 29
1026; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
1027; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
1028; CHECK-P8-BE-NEXT:    ori r4, r4, 4099
1029; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
1030; CHECK-P8-BE-NEXT:    extsb r3, r3
1031; CHECK-P8-BE-NEXT:    blr
1032entry:
1033  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
1034  %0 = load i32, ptr %add.ptr, align 4
1035  %conv = trunc i32 %0 to i8
1036  ret i8 %conv
1037}
1038
1039; Function Attrs: norecurse nounwind readonly uwtable willreturn
1040define dso_local signext i8 @ld_reg_int8_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) {
1041; CHECK-LE-LABEL: ld_reg_int8_t_uint32_t:
1042; CHECK-LE:       # %bb.0: # %entry
1043; CHECK-LE-NEXT:    lbzx r3, r3, r4
1044; CHECK-LE-NEXT:    extsb r3, r3
1045; CHECK-LE-NEXT:    blr
1046;
1047; CHECK-BE-LABEL: ld_reg_int8_t_uint32_t:
1048; CHECK-BE:       # %bb.0: # %entry
1049; CHECK-BE-NEXT:    add r3, r3, r4
1050; CHECK-BE-NEXT:    lbz r3, 3(r3)
1051; CHECK-BE-NEXT:    extsb r3, r3
1052; CHECK-BE-NEXT:    blr
1053entry:
1054  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
1055  %0 = load i32, ptr %add.ptr, align 4
1056  %conv = trunc i32 %0 to i8
1057  ret i8 %conv
1058}
1059
1060; Function Attrs: norecurse nounwind readonly uwtable willreturn
1061define dso_local signext i8 @ld_or_int8_t_uint32_t(i64 %ptr, i8 zeroext %off) {
1062; CHECK-LE-LABEL: ld_or_int8_t_uint32_t:
1063; CHECK-LE:       # %bb.0: # %entry
1064; CHECK-LE-NEXT:    or r3, r4, r3
1065; CHECK-LE-NEXT:    lbz r3, 0(r3)
1066; CHECK-LE-NEXT:    extsb r3, r3
1067; CHECK-LE-NEXT:    blr
1068;
1069; CHECK-BE-LABEL: ld_or_int8_t_uint32_t:
1070; CHECK-BE:       # %bb.0: # %entry
1071; CHECK-BE-NEXT:    or r3, r4, r3
1072; CHECK-BE-NEXT:    lbz r3, 3(r3)
1073; CHECK-BE-NEXT:    extsb r3, r3
1074; CHECK-BE-NEXT:    blr
1075entry:
1076  %conv = zext i8 %off to i64
1077  %or = or i64 %conv, %ptr
1078  %0 = inttoptr i64 %or to ptr
1079  %1 = load i32, ptr %0, align 4
1080  %conv1 = trunc i32 %1 to i8
1081  ret i8 %conv1
1082}
1083
1084; Function Attrs: norecurse nounwind readonly uwtable willreturn
1085define dso_local signext i8 @ld_not_disjoint16_int8_t_uint32_t(i64 %ptr) {
1086; CHECK-LE-LABEL: ld_not_disjoint16_int8_t_uint32_t:
1087; CHECK-LE:       # %bb.0: # %entry
1088; CHECK-LE-NEXT:    ori r3, r3, 6
1089; CHECK-LE-NEXT:    lbz r3, 0(r3)
1090; CHECK-LE-NEXT:    extsb r3, r3
1091; CHECK-LE-NEXT:    blr
1092;
1093; CHECK-BE-LABEL: ld_not_disjoint16_int8_t_uint32_t:
1094; CHECK-BE:       # %bb.0: # %entry
1095; CHECK-BE-NEXT:    ori r3, r3, 6
1096; CHECK-BE-NEXT:    lbz r3, 3(r3)
1097; CHECK-BE-NEXT:    extsb r3, r3
1098; CHECK-BE-NEXT:    blr
1099entry:
1100  %or = or i64 %ptr, 6
1101  %0 = inttoptr i64 %or to ptr
1102  %1 = load i32, ptr %0, align 4
1103  %conv = trunc i32 %1 to i8
1104  ret i8 %conv
1105}
1106
1107; Function Attrs: norecurse nounwind readonly uwtable willreturn
1108define dso_local signext i8 @ld_disjoint_align16_int8_t_uint32_t(i64 %ptr) {
1109; CHECK-LE-LABEL: ld_disjoint_align16_int8_t_uint32_t:
1110; CHECK-LE:       # %bb.0: # %entry
1111; CHECK-LE-NEXT:    rldicr r3, r3, 0, 51
1112; CHECK-LE-NEXT:    lbz r3, 24(r3)
1113; CHECK-LE-NEXT:    extsb r3, r3
1114; CHECK-LE-NEXT:    blr
1115;
1116; CHECK-BE-LABEL: ld_disjoint_align16_int8_t_uint32_t:
1117; CHECK-BE:       # %bb.0: # %entry
1118; CHECK-BE-NEXT:    rldicr r3, r3, 0, 51
1119; CHECK-BE-NEXT:    lbz r3, 27(r3)
1120; CHECK-BE-NEXT:    extsb r3, r3
1121; CHECK-BE-NEXT:    blr
1122entry:
1123  %and = and i64 %ptr, -4096
1124  %or = or i64 %and, 24
1125  %0 = inttoptr i64 %or to ptr
1126  %1 = load i32, ptr %0, align 8
1127  %conv = trunc i32 %1 to i8
1128  ret i8 %conv
1129}
1130
1131; Function Attrs: norecurse nounwind readonly uwtable willreturn
1132define dso_local signext i8 @ld_not_disjoint32_int8_t_uint32_t(i64 %ptr) {
1133; CHECK-LE-LABEL: ld_not_disjoint32_int8_t_uint32_t:
1134; CHECK-LE:       # %bb.0: # %entry
1135; CHECK-LE-NEXT:    ori r3, r3, 34463
1136; CHECK-LE-NEXT:    oris r3, r3, 1
1137; CHECK-LE-NEXT:    lbz r3, 0(r3)
1138; CHECK-LE-NEXT:    extsb r3, r3
1139; CHECK-LE-NEXT:    blr
1140;
1141; CHECK-BE-LABEL: ld_not_disjoint32_int8_t_uint32_t:
1142; CHECK-BE:       # %bb.0: # %entry
1143; CHECK-BE-NEXT:    ori r3, r3, 34463
1144; CHECK-BE-NEXT:    oris r3, r3, 1
1145; CHECK-BE-NEXT:    lbz r3, 3(r3)
1146; CHECK-BE-NEXT:    extsb r3, r3
1147; CHECK-BE-NEXT:    blr
1148entry:
1149  %or = or i64 %ptr, 99999
1150  %0 = inttoptr i64 %or to ptr
1151  %1 = load i32, ptr %0, align 4
1152  %conv = trunc i32 %1 to i8
1153  ret i8 %conv
1154}
1155
1156; Function Attrs: norecurse nounwind readonly uwtable willreturn
1157define dso_local signext i8 @ld_disjoint_align32_int8_t_uint32_t(i64 %ptr) {
1158; CHECK-P10-LE-LABEL: ld_disjoint_align32_int8_t_uint32_t:
1159; CHECK-P10-LE:       # %bb.0: # %entry
1160; CHECK-P10-LE-NEXT:    lis r4, -15264
1161; CHECK-P10-LE-NEXT:    and r3, r3, r4
1162; CHECK-P10-LE-NEXT:    plbz r3, 999990000(r3), 0
1163; CHECK-P10-LE-NEXT:    extsb r3, r3
1164; CHECK-P10-LE-NEXT:    blr
1165;
1166; CHECK-P10-BE-LABEL: ld_disjoint_align32_int8_t_uint32_t:
1167; CHECK-P10-BE:       # %bb.0: # %entry
1168; CHECK-P10-BE-NEXT:    lis r4, -15264
1169; CHECK-P10-BE-NEXT:    and r3, r3, r4
1170; CHECK-P10-BE-NEXT:    plbz r3, 999990003(r3), 0
1171; CHECK-P10-BE-NEXT:    extsb r3, r3
1172; CHECK-P10-BE-NEXT:    blr
1173;
1174; CHECK-P9-LE-LABEL: ld_disjoint_align32_int8_t_uint32_t:
1175; CHECK-P9-LE:       # %bb.0: # %entry
1176; CHECK-P9-LE-NEXT:    lis r4, -15264
1177; CHECK-P9-LE-NEXT:    and r3, r3, r4
1178; CHECK-P9-LE-NEXT:    lis r4, 15258
1179; CHECK-P9-LE-NEXT:    ori r4, r4, 41712
1180; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
1181; CHECK-P9-LE-NEXT:    extsb r3, r3
1182; CHECK-P9-LE-NEXT:    blr
1183;
1184; CHECK-P9-BE-LABEL: ld_disjoint_align32_int8_t_uint32_t:
1185; CHECK-P9-BE:       # %bb.0: # %entry
1186; CHECK-P9-BE-NEXT:    lis r4, -15264
1187; CHECK-P9-BE-NEXT:    and r3, r3, r4
1188; CHECK-P9-BE-NEXT:    lis r4, 15258
1189; CHECK-P9-BE-NEXT:    ori r4, r4, 41715
1190; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
1191; CHECK-P9-BE-NEXT:    extsb r3, r3
1192; CHECK-P9-BE-NEXT:    blr
1193;
1194; CHECK-P8-LE-LABEL: ld_disjoint_align32_int8_t_uint32_t:
1195; CHECK-P8-LE:       # %bb.0: # %entry
1196; CHECK-P8-LE-NEXT:    lis r4, -15264
1197; CHECK-P8-LE-NEXT:    and r3, r3, r4
1198; CHECK-P8-LE-NEXT:    lis r4, 15258
1199; CHECK-P8-LE-NEXT:    ori r4, r4, 41712
1200; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
1201; CHECK-P8-LE-NEXT:    extsb r3, r3
1202; CHECK-P8-LE-NEXT:    blr
1203;
1204; CHECK-P8-BE-LABEL: ld_disjoint_align32_int8_t_uint32_t:
1205; CHECK-P8-BE:       # %bb.0: # %entry
1206; CHECK-P8-BE-NEXT:    lis r4, -15264
1207; CHECK-P8-BE-NEXT:    and r3, r3, r4
1208; CHECK-P8-BE-NEXT:    lis r4, 15258
1209; CHECK-P8-BE-NEXT:    ori r4, r4, 41715
1210; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
1211; CHECK-P8-BE-NEXT:    extsb r3, r3
1212; CHECK-P8-BE-NEXT:    blr
1213entry:
1214  %and = and i64 %ptr, -1000341504
1215  %or = or i64 %and, 999990000
1216  %0 = inttoptr i64 %or to ptr
1217  %1 = load i32, ptr %0, align 16
1218  %conv = trunc i32 %1 to i8
1219  ret i8 %conv
1220}
1221
1222; Function Attrs: norecurse nounwind readonly uwtable willreturn
1223define dso_local signext i8 @ld_not_disjoint64_int8_t_uint32_t(i64 %ptr) {
1224; CHECK-P10-LE-LABEL: ld_not_disjoint64_int8_t_uint32_t:
1225; CHECK-P10-LE:       # %bb.0: # %entry
1226; CHECK-P10-LE-NEXT:    pli r4, 232
1227; CHECK-P10-LE-NEXT:    pli r5, 3567587329
1228; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
1229; CHECK-P10-LE-NEXT:    or r3, r3, r5
1230; CHECK-P10-LE-NEXT:    lbz r3, 0(r3)
1231; CHECK-P10-LE-NEXT:    extsb r3, r3
1232; CHECK-P10-LE-NEXT:    blr
1233;
1234; CHECK-P10-BE-LABEL: ld_not_disjoint64_int8_t_uint32_t:
1235; CHECK-P10-BE:       # %bb.0: # %entry
1236; CHECK-P10-BE-NEXT:    pli r4, 232
1237; CHECK-P10-BE-NEXT:    pli r5, 3567587329
1238; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
1239; CHECK-P10-BE-NEXT:    or r3, r3, r5
1240; CHECK-P10-BE-NEXT:    lbz r3, 3(r3)
1241; CHECK-P10-BE-NEXT:    extsb r3, r3
1242; CHECK-P10-BE-NEXT:    blr
1243;
1244; CHECK-P9-LE-LABEL: ld_not_disjoint64_int8_t_uint32_t:
1245; CHECK-P9-LE:       # %bb.0: # %entry
1246; CHECK-P9-LE-NEXT:    li r4, 29
1247; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
1248; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
1249; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
1250; CHECK-P9-LE-NEXT:    or r3, r3, r4
1251; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
1252; CHECK-P9-LE-NEXT:    extsb r3, r3
1253; CHECK-P9-LE-NEXT:    blr
1254;
1255; CHECK-P9-BE-LABEL: ld_not_disjoint64_int8_t_uint32_t:
1256; CHECK-P9-BE:       # %bb.0: # %entry
1257; CHECK-P9-BE-NEXT:    li r4, 29
1258; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
1259; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
1260; CHECK-P9-BE-NEXT:    ori r4, r4, 4097
1261; CHECK-P9-BE-NEXT:    or r3, r3, r4
1262; CHECK-P9-BE-NEXT:    lbz r3, 3(r3)
1263; CHECK-P9-BE-NEXT:    extsb r3, r3
1264; CHECK-P9-BE-NEXT:    blr
1265;
1266; CHECK-P8-LE-LABEL: ld_not_disjoint64_int8_t_uint32_t:
1267; CHECK-P8-LE:       # %bb.0: # %entry
1268; CHECK-P8-LE-NEXT:    li r4, 29
1269; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
1270; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
1271; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
1272; CHECK-P8-LE-NEXT:    or r3, r3, r4
1273; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
1274; CHECK-P8-LE-NEXT:    extsb r3, r3
1275; CHECK-P8-LE-NEXT:    blr
1276;
1277; CHECK-P8-BE-LABEL: ld_not_disjoint64_int8_t_uint32_t:
1278; CHECK-P8-BE:       # %bb.0: # %entry
1279; CHECK-P8-BE-NEXT:    li r4, 29
1280; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
1281; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
1282; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
1283; CHECK-P8-BE-NEXT:    or r3, r3, r4
1284; CHECK-P8-BE-NEXT:    lbz r3, 3(r3)
1285; CHECK-P8-BE-NEXT:    extsb r3, r3
1286; CHECK-P8-BE-NEXT:    blr
1287entry:
1288  %or = or i64 %ptr, 1000000000001
1289  %0 = inttoptr i64 %or to ptr
1290  %1 = load i32, ptr %0, align 4
1291  %conv = trunc i32 %1 to i8
1292  ret i8 %conv
1293}
1294
1295; Function Attrs: norecurse nounwind readonly uwtable willreturn
1296define dso_local signext i8 @ld_disjoint_align64_int8_t_uint32_t(i64 %ptr) {
1297; CHECK-P10-LE-LABEL: ld_disjoint_align64_int8_t_uint32_t:
1298; CHECK-P10-LE:       # %bb.0: # %entry
1299; CHECK-P10-LE-NEXT:    pli r4, 244140625
1300; CHECK-P10-LE-NEXT:    rldicr r3, r3, 0, 23
1301; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
1302; CHECK-P10-LE-NEXT:    lbzx r3, r3, r4
1303; CHECK-P10-LE-NEXT:    extsb r3, r3
1304; CHECK-P10-LE-NEXT:    blr
1305;
1306; CHECK-P10-BE-LABEL: ld_disjoint_align64_int8_t_uint32_t:
1307; CHECK-P10-BE:       # %bb.0: # %entry
1308; CHECK-P10-BE-NEXT:    pli r4, 232
1309; CHECK-P10-BE-NEXT:    pli r5, 3567587331
1310; CHECK-P10-BE-NEXT:    rldicr r3, r3, 0, 23
1311; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
1312; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
1313; CHECK-P10-BE-NEXT:    extsb r3, r3
1314; CHECK-P10-BE-NEXT:    blr
1315;
1316; CHECK-P9-LE-LABEL: ld_disjoint_align64_int8_t_uint32_t:
1317; CHECK-P9-LE:       # %bb.0: # %entry
1318; CHECK-P9-LE-NEXT:    lis r4, 3725
1319; CHECK-P9-LE-NEXT:    rldicr r3, r3, 0, 23
1320; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
1321; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
1322; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
1323; CHECK-P9-LE-NEXT:    extsb r3, r3
1324; CHECK-P9-LE-NEXT:    blr
1325;
1326; CHECK-P9-BE-LABEL: ld_disjoint_align64_int8_t_uint32_t:
1327; CHECK-P9-BE:       # %bb.0: # %entry
1328; CHECK-P9-BE-NEXT:    li r4, 29
1329; CHECK-P9-BE-NEXT:    rldicr r3, r3, 0, 23
1330; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
1331; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
1332; CHECK-P9-BE-NEXT:    ori r4, r4, 4099
1333; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
1334; CHECK-P9-BE-NEXT:    extsb r3, r3
1335; CHECK-P9-BE-NEXT:    blr
1336;
1337; CHECK-P8-LE-LABEL: ld_disjoint_align64_int8_t_uint32_t:
1338; CHECK-P8-LE:       # %bb.0: # %entry
1339; CHECK-P8-LE-NEXT:    lis r4, 3725
1340; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
1341; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
1342; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
1343; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
1344; CHECK-P8-LE-NEXT:    extsb r3, r3
1345; CHECK-P8-LE-NEXT:    blr
1346;
1347; CHECK-P8-BE-LABEL: ld_disjoint_align64_int8_t_uint32_t:
1348; CHECK-P8-BE:       # %bb.0: # %entry
1349; CHECK-P8-BE-NEXT:    li r4, 29
1350; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
1351; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
1352; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
1353; CHECK-P8-BE-NEXT:    ori r4, r4, 4099
1354; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
1355; CHECK-P8-BE-NEXT:    extsb r3, r3
1356; CHECK-P8-BE-NEXT:    blr
1357entry:
1358  %and = and i64 %ptr, -1099511627776
1359  %or = or i64 %and, 1000000000000
1360  %0 = inttoptr i64 %or to ptr
1361  %1 = load i32, ptr %0, align 4096
1362  %conv = trunc i32 %1 to i8
1363  ret i8 %conv
1364}
1365
1366; Function Attrs: norecurse nounwind readonly uwtable willreturn
1367define dso_local signext i8 @ld_cst_align16_int8_t_uint32_t() {
1368; CHECK-LE-LABEL: ld_cst_align16_int8_t_uint32_t:
1369; CHECK-LE:       # %bb.0: # %entry
1370; CHECK-LE-NEXT:    lbz r3, 4080(0)
1371; CHECK-LE-NEXT:    extsb r3, r3
1372; CHECK-LE-NEXT:    blr
1373;
1374; CHECK-BE-LABEL: ld_cst_align16_int8_t_uint32_t:
1375; CHECK-BE:       # %bb.0: # %entry
1376; CHECK-BE-NEXT:    lbz r3, 4083(0)
1377; CHECK-BE-NEXT:    extsb r3, r3
1378; CHECK-BE-NEXT:    blr
1379entry:
1380  %0 = load i32, ptr inttoptr (i64 4080 to ptr), align 16
1381  %conv = trunc i32 %0 to i8
1382  ret i8 %conv
1383}
1384
1385; Function Attrs: norecurse nounwind readonly uwtable willreturn
1386define dso_local signext i8 @ld_cst_align32_int8_t_uint32_t() {
1387; CHECK-LE-LABEL: ld_cst_align32_int8_t_uint32_t:
1388; CHECK-LE:       # %bb.0: # %entry
1389; CHECK-LE-NEXT:    lis r3, 153
1390; CHECK-LE-NEXT:    lbz r3, -27108(r3)
1391; CHECK-LE-NEXT:    extsb r3, r3
1392; CHECK-LE-NEXT:    blr
1393;
1394; CHECK-BE-LABEL: ld_cst_align32_int8_t_uint32_t:
1395; CHECK-BE:       # %bb.0: # %entry
1396; CHECK-BE-NEXT:    lis r3, 153
1397; CHECK-BE-NEXT:    lbz r3, -27105(r3)
1398; CHECK-BE-NEXT:    extsb r3, r3
1399; CHECK-BE-NEXT:    blr
1400entry:
1401  %0 = load i32, ptr inttoptr (i64 9999900 to ptr), align 4
1402  %conv = trunc i32 %0 to i8
1403  ret i8 %conv
1404}
1405
1406; Function Attrs: norecurse nounwind readonly uwtable willreturn
1407define dso_local signext i8 @ld_cst_align64_int8_t_uint32_t() {
1408; CHECK-P10-LE-LABEL: ld_cst_align64_int8_t_uint32_t:
1409; CHECK-P10-LE:       # %bb.0: # %entry
1410; CHECK-P10-LE-NEXT:    pli r3, 244140625
1411; CHECK-P10-LE-NEXT:    rldic r3, r3, 12, 24
1412; CHECK-P10-LE-NEXT:    lbz r3, 0(r3)
1413; CHECK-P10-LE-NEXT:    extsb r3, r3
1414; CHECK-P10-LE-NEXT:    blr
1415;
1416; CHECK-P10-BE-LABEL: ld_cst_align64_int8_t_uint32_t:
1417; CHECK-P10-BE:       # %bb.0: # %entry
1418; CHECK-P10-BE-NEXT:    pli r3, 232
1419; CHECK-P10-BE-NEXT:    pli r4, 3567587331
1420; CHECK-P10-BE-NEXT:    rldimi r4, r3, 32, 0
1421; CHECK-P10-BE-NEXT:    lbz r3, 0(r4)
1422; CHECK-P10-BE-NEXT:    extsb r3, r3
1423; CHECK-P10-BE-NEXT:    blr
1424;
1425; CHECK-P9-LE-LABEL: ld_cst_align64_int8_t_uint32_t:
1426; CHECK-P9-LE:       # %bb.0: # %entry
1427; CHECK-P9-LE-NEXT:    lis r3, 3725
1428; CHECK-P9-LE-NEXT:    ori r3, r3, 19025
1429; CHECK-P9-LE-NEXT:    rldic r3, r3, 12, 24
1430; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
1431; CHECK-P9-LE-NEXT:    extsb r3, r3
1432; CHECK-P9-LE-NEXT:    blr
1433;
1434; CHECK-P9-BE-LABEL: ld_cst_align64_int8_t_uint32_t:
1435; CHECK-P9-BE:       # %bb.0: # %entry
1436; CHECK-P9-BE-NEXT:    li r3, 29
1437; CHECK-P9-BE-NEXT:    rldic r3, r3, 35, 24
1438; CHECK-P9-BE-NEXT:    oris r3, r3, 54437
1439; CHECK-P9-BE-NEXT:    ori r3, r3, 4099
1440; CHECK-P9-BE-NEXT:    lbz r3, 0(r3)
1441; CHECK-P9-BE-NEXT:    extsb r3, r3
1442; CHECK-P9-BE-NEXT:    blr
1443;
1444; CHECK-P8-LE-LABEL: ld_cst_align64_int8_t_uint32_t:
1445; CHECK-P8-LE:       # %bb.0: # %entry
1446; CHECK-P8-LE-NEXT:    lis r3, 3725
1447; CHECK-P8-LE-NEXT:    ori r3, r3, 19025
1448; CHECK-P8-LE-NEXT:    rldic r3, r3, 12, 24
1449; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
1450; CHECK-P8-LE-NEXT:    extsb r3, r3
1451; CHECK-P8-LE-NEXT:    blr
1452;
1453; CHECK-P8-BE-LABEL: ld_cst_align64_int8_t_uint32_t:
1454; CHECK-P8-BE:       # %bb.0: # %entry
1455; CHECK-P8-BE-NEXT:    li r3, 29
1456; CHECK-P8-BE-NEXT:    rldic r3, r3, 35, 24
1457; CHECK-P8-BE-NEXT:    oris r3, r3, 54437
1458; CHECK-P8-BE-NEXT:    ori r3, r3, 4099
1459; CHECK-P8-BE-NEXT:    lbz r3, 0(r3)
1460; CHECK-P8-BE-NEXT:    extsb r3, r3
1461; CHECK-P8-BE-NEXT:    blr
1462entry:
1463  %0 = load i32, ptr inttoptr (i64 1000000000000 to ptr), align 4096
1464  %conv = trunc i32 %0 to i8
1465  ret i8 %conv
1466}
1467
1468; Function Attrs: norecurse nounwind readonly uwtable willreturn
1469define dso_local signext i8 @ld_0_int8_t_uint64_t(i64 %ptr) {
1470; CHECK-LE-LABEL: ld_0_int8_t_uint64_t:
1471; CHECK-LE:       # %bb.0: # %entry
1472; CHECK-LE-NEXT:    lbz r3, 0(r3)
1473; CHECK-LE-NEXT:    extsb r3, r3
1474; CHECK-LE-NEXT:    blr
1475;
1476; CHECK-BE-LABEL: ld_0_int8_t_uint64_t:
1477; CHECK-BE:       # %bb.0: # %entry
1478; CHECK-BE-NEXT:    lbz r3, 7(r3)
1479; CHECK-BE-NEXT:    extsb r3, r3
1480; CHECK-BE-NEXT:    blr
1481entry:
1482  %0 = inttoptr i64 %ptr to ptr
1483  %1 = load i64, ptr %0, align 8
1484  %conv = trunc i64 %1 to i8
1485  ret i8 %conv
1486}
1487
1488; Function Attrs: norecurse nounwind readonly uwtable willreturn
1489define dso_local signext i8 @ld_align16_int8_t_uint64_t(ptr nocapture readonly %ptr) {
1490; CHECK-LE-LABEL: ld_align16_int8_t_uint64_t:
1491; CHECK-LE:       # %bb.0: # %entry
1492; CHECK-LE-NEXT:    lbz r3, 8(r3)
1493; CHECK-LE-NEXT:    extsb r3, r3
1494; CHECK-LE-NEXT:    blr
1495;
1496; CHECK-BE-LABEL: ld_align16_int8_t_uint64_t:
1497; CHECK-BE:       # %bb.0: # %entry
1498; CHECK-BE-NEXT:    lbz r3, 15(r3)
1499; CHECK-BE-NEXT:    extsb r3, r3
1500; CHECK-BE-NEXT:    blr
1501entry:
1502  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
1503  %0 = load i64, ptr %add.ptr, align 8
1504  %conv = trunc i64 %0 to i8
1505  ret i8 %conv
1506}
1507
1508; Function Attrs: norecurse nounwind readonly uwtable willreturn
1509define dso_local signext i8 @ld_align32_int8_t_uint64_t(ptr nocapture readonly %ptr) {
1510; CHECK-P10-LE-LABEL: ld_align32_int8_t_uint64_t:
1511; CHECK-P10-LE:       # %bb.0: # %entry
1512; CHECK-P10-LE-NEXT:    plbz r3, 99999000(r3), 0
1513; CHECK-P10-LE-NEXT:    extsb r3, r3
1514; CHECK-P10-LE-NEXT:    blr
1515;
1516; CHECK-P10-BE-LABEL: ld_align32_int8_t_uint64_t:
1517; CHECK-P10-BE:       # %bb.0: # %entry
1518; CHECK-P10-BE-NEXT:    plbz r3, 99999007(r3), 0
1519; CHECK-P10-BE-NEXT:    extsb r3, r3
1520; CHECK-P10-BE-NEXT:    blr
1521;
1522; CHECK-P9-LE-LABEL: ld_align32_int8_t_uint64_t:
1523; CHECK-P9-LE:       # %bb.0: # %entry
1524; CHECK-P9-LE-NEXT:    lis r4, 1525
1525; CHECK-P9-LE-NEXT:    ori r4, r4, 56600
1526; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
1527; CHECK-P9-LE-NEXT:    extsb r3, r3
1528; CHECK-P9-LE-NEXT:    blr
1529;
1530; CHECK-P9-BE-LABEL: ld_align32_int8_t_uint64_t:
1531; CHECK-P9-BE:       # %bb.0: # %entry
1532; CHECK-P9-BE-NEXT:    lis r4, 1525
1533; CHECK-P9-BE-NEXT:    ori r4, r4, 56607
1534; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
1535; CHECK-P9-BE-NEXT:    extsb r3, r3
1536; CHECK-P9-BE-NEXT:    blr
1537;
1538; CHECK-P8-LE-LABEL: ld_align32_int8_t_uint64_t:
1539; CHECK-P8-LE:       # %bb.0: # %entry
1540; CHECK-P8-LE-NEXT:    lis r4, 1525
1541; CHECK-P8-LE-NEXT:    ori r4, r4, 56600
1542; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
1543; CHECK-P8-LE-NEXT:    extsb r3, r3
1544; CHECK-P8-LE-NEXT:    blr
1545;
1546; CHECK-P8-BE-LABEL: ld_align32_int8_t_uint64_t:
1547; CHECK-P8-BE:       # %bb.0: # %entry
1548; CHECK-P8-BE-NEXT:    lis r4, 1525
1549; CHECK-P8-BE-NEXT:    ori r4, r4, 56607
1550; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
1551; CHECK-P8-BE-NEXT:    extsb r3, r3
1552; CHECK-P8-BE-NEXT:    blr
1553entry:
1554  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
1555  %0 = load i64, ptr %add.ptr, align 8
1556  %conv = trunc i64 %0 to i8
1557  ret i8 %conv
1558}
1559
1560; Function Attrs: norecurse nounwind readonly uwtable willreturn
1561define dso_local signext i8 @ld_align64_int8_t_uint64_t(ptr nocapture readonly %ptr) {
1562; CHECK-P10-LE-LABEL: ld_align64_int8_t_uint64_t:
1563; CHECK-P10-LE:       # %bb.0: # %entry
1564; CHECK-P10-LE-NEXT:    pli r4, 244140625
1565; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
1566; CHECK-P10-LE-NEXT:    lbzx r3, r3, r4
1567; CHECK-P10-LE-NEXT:    extsb r3, r3
1568; CHECK-P10-LE-NEXT:    blr
1569;
1570; CHECK-P10-BE-LABEL: ld_align64_int8_t_uint64_t:
1571; CHECK-P10-BE:       # %bb.0: # %entry
1572; CHECK-P10-BE-NEXT:    pli r4, 232
1573; CHECK-P10-BE-NEXT:    pli r5, 3567587335
1574; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
1575; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
1576; CHECK-P10-BE-NEXT:    extsb r3, r3
1577; CHECK-P10-BE-NEXT:    blr
1578;
1579; CHECK-P9-LE-LABEL: ld_align64_int8_t_uint64_t:
1580; CHECK-P9-LE:       # %bb.0: # %entry
1581; CHECK-P9-LE-NEXT:    lis r4, 3725
1582; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
1583; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
1584; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
1585; CHECK-P9-LE-NEXT:    extsb r3, r3
1586; CHECK-P9-LE-NEXT:    blr
1587;
1588; CHECK-P9-BE-LABEL: ld_align64_int8_t_uint64_t:
1589; CHECK-P9-BE:       # %bb.0: # %entry
1590; CHECK-P9-BE-NEXT:    li r4, 29
1591; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
1592; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
1593; CHECK-P9-BE-NEXT:    ori r4, r4, 4103
1594; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
1595; CHECK-P9-BE-NEXT:    extsb r3, r3
1596; CHECK-P9-BE-NEXT:    blr
1597;
1598; CHECK-P8-LE-LABEL: ld_align64_int8_t_uint64_t:
1599; CHECK-P8-LE:       # %bb.0: # %entry
1600; CHECK-P8-LE-NEXT:    lis r4, 3725
1601; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
1602; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
1603; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
1604; CHECK-P8-LE-NEXT:    extsb r3, r3
1605; CHECK-P8-LE-NEXT:    blr
1606;
1607; CHECK-P8-BE-LABEL: ld_align64_int8_t_uint64_t:
1608; CHECK-P8-BE:       # %bb.0: # %entry
1609; CHECK-P8-BE-NEXT:    li r4, 29
1610; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
1611; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
1612; CHECK-P8-BE-NEXT:    ori r4, r4, 4103
1613; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
1614; CHECK-P8-BE-NEXT:    extsb r3, r3
1615; CHECK-P8-BE-NEXT:    blr
1616entry:
1617  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
1618  %0 = load i64, ptr %add.ptr, align 8
1619  %conv = trunc i64 %0 to i8
1620  ret i8 %conv
1621}
1622
1623; Function Attrs: norecurse nounwind readonly uwtable willreturn
1624define dso_local signext i8 @ld_reg_int8_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) {
1625; CHECK-LE-LABEL: ld_reg_int8_t_uint64_t:
1626; CHECK-LE:       # %bb.0: # %entry
1627; CHECK-LE-NEXT:    lbzx r3, r3, r4
1628; CHECK-LE-NEXT:    extsb r3, r3
1629; CHECK-LE-NEXT:    blr
1630;
1631; CHECK-BE-LABEL: ld_reg_int8_t_uint64_t:
1632; CHECK-BE:       # %bb.0: # %entry
1633; CHECK-BE-NEXT:    add r3, r3, r4
1634; CHECK-BE-NEXT:    lbz r3, 7(r3)
1635; CHECK-BE-NEXT:    extsb r3, r3
1636; CHECK-BE-NEXT:    blr
1637entry:
1638  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
1639  %0 = load i64, ptr %add.ptr, align 8
1640  %conv = trunc i64 %0 to i8
1641  ret i8 %conv
1642}
1643
1644; Function Attrs: norecurse nounwind readonly uwtable willreturn
1645define dso_local signext i8 @ld_or_int8_t_uint64_t(i64 %ptr, i8 zeroext %off) {
1646; CHECK-LE-LABEL: ld_or_int8_t_uint64_t:
1647; CHECK-LE:       # %bb.0: # %entry
1648; CHECK-LE-NEXT:    or r3, r4, r3
1649; CHECK-LE-NEXT:    lbz r3, 0(r3)
1650; CHECK-LE-NEXT:    extsb r3, r3
1651; CHECK-LE-NEXT:    blr
1652;
1653; CHECK-BE-LABEL: ld_or_int8_t_uint64_t:
1654; CHECK-BE:       # %bb.0: # %entry
1655; CHECK-BE-NEXT:    or r3, r4, r3
1656; CHECK-BE-NEXT:    lbz r3, 7(r3)
1657; CHECK-BE-NEXT:    extsb r3, r3
1658; CHECK-BE-NEXT:    blr
1659entry:
1660  %conv = zext i8 %off to i64
1661  %or = or i64 %conv, %ptr
1662  %0 = inttoptr i64 %or to ptr
1663  %1 = load i64, ptr %0, align 8
1664  %conv1 = trunc i64 %1 to i8
1665  ret i8 %conv1
1666}
1667
1668; Function Attrs: norecurse nounwind readonly uwtable willreturn
1669define dso_local signext i8 @ld_not_disjoint16_int8_t_uint64_t(i64 %ptr) {
1670; CHECK-LE-LABEL: ld_not_disjoint16_int8_t_uint64_t:
1671; CHECK-LE:       # %bb.0: # %entry
1672; CHECK-LE-NEXT:    ori r3, r3, 6
1673; CHECK-LE-NEXT:    lbz r3, 0(r3)
1674; CHECK-LE-NEXT:    extsb r3, r3
1675; CHECK-LE-NEXT:    blr
1676;
1677; CHECK-BE-LABEL: ld_not_disjoint16_int8_t_uint64_t:
1678; CHECK-BE:       # %bb.0: # %entry
1679; CHECK-BE-NEXT:    ori r3, r3, 6
1680; CHECK-BE-NEXT:    lbz r3, 7(r3)
1681; CHECK-BE-NEXT:    extsb r3, r3
1682; CHECK-BE-NEXT:    blr
1683entry:
1684  %or = or i64 %ptr, 6
1685  %0 = inttoptr i64 %or to ptr
1686  %1 = load i64, ptr %0, align 8
1687  %conv = trunc i64 %1 to i8
1688  ret i8 %conv
1689}
1690
1691; Function Attrs: norecurse nounwind readonly uwtable willreturn
1692define dso_local signext i8 @ld_disjoint_align16_int8_t_uint64_t(i64 %ptr) {
1693; CHECK-LE-LABEL: ld_disjoint_align16_int8_t_uint64_t:
1694; CHECK-LE:       # %bb.0: # %entry
1695; CHECK-LE-NEXT:    rldicr r3, r3, 0, 51
1696; CHECK-LE-NEXT:    lbz r3, 24(r3)
1697; CHECK-LE-NEXT:    extsb r3, r3
1698; CHECK-LE-NEXT:    blr
1699;
1700; CHECK-BE-LABEL: ld_disjoint_align16_int8_t_uint64_t:
1701; CHECK-BE:       # %bb.0: # %entry
1702; CHECK-BE-NEXT:    rldicr r3, r3, 0, 51
1703; CHECK-BE-NEXT:    lbz r3, 31(r3)
1704; CHECK-BE-NEXT:    extsb r3, r3
1705; CHECK-BE-NEXT:    blr
1706entry:
1707  %and = and i64 %ptr, -4096
1708  %or = or i64 %and, 24
1709  %0 = inttoptr i64 %or to ptr
1710  %1 = load i64, ptr %0, align 8
1711  %conv = trunc i64 %1 to i8
1712  ret i8 %conv
1713}
1714
1715; Function Attrs: norecurse nounwind readonly uwtable willreturn
1716define dso_local signext i8 @ld_not_disjoint32_int8_t_uint64_t(i64 %ptr) {
1717; CHECK-LE-LABEL: ld_not_disjoint32_int8_t_uint64_t:
1718; CHECK-LE:       # %bb.0: # %entry
1719; CHECK-LE-NEXT:    ori r3, r3, 34463
1720; CHECK-LE-NEXT:    oris r3, r3, 1
1721; CHECK-LE-NEXT:    lbz r3, 0(r3)
1722; CHECK-LE-NEXT:    extsb r3, r3
1723; CHECK-LE-NEXT:    blr
1724;
1725; CHECK-BE-LABEL: ld_not_disjoint32_int8_t_uint64_t:
1726; CHECK-BE:       # %bb.0: # %entry
1727; CHECK-BE-NEXT:    ori r3, r3, 34463
1728; CHECK-BE-NEXT:    oris r3, r3, 1
1729; CHECK-BE-NEXT:    lbz r3, 7(r3)
1730; CHECK-BE-NEXT:    extsb r3, r3
1731; CHECK-BE-NEXT:    blr
1732entry:
1733  %or = or i64 %ptr, 99999
1734  %0 = inttoptr i64 %or to ptr
1735  %1 = load i64, ptr %0, align 8
1736  %conv = trunc i64 %1 to i8
1737  ret i8 %conv
1738}
1739
1740; Function Attrs: norecurse nounwind readonly uwtable willreturn
1741define dso_local signext i8 @ld_disjoint_align32_int8_t_uint64_t(i64 %ptr) {
1742; CHECK-P10-LE-LABEL: ld_disjoint_align32_int8_t_uint64_t:
1743; CHECK-P10-LE:       # %bb.0: # %entry
1744; CHECK-P10-LE-NEXT:    lis r4, -15264
1745; CHECK-P10-LE-NEXT:    and r3, r3, r4
1746; CHECK-P10-LE-NEXT:    plbz r3, 999990000(r3), 0
1747; CHECK-P10-LE-NEXT:    extsb r3, r3
1748; CHECK-P10-LE-NEXT:    blr
1749;
1750; CHECK-P10-BE-LABEL: ld_disjoint_align32_int8_t_uint64_t:
1751; CHECK-P10-BE:       # %bb.0: # %entry
1752; CHECK-P10-BE-NEXT:    lis r4, -15264
1753; CHECK-P10-BE-NEXT:    and r3, r3, r4
1754; CHECK-P10-BE-NEXT:    plbz r3, 999990007(r3), 0
1755; CHECK-P10-BE-NEXT:    extsb r3, r3
1756; CHECK-P10-BE-NEXT:    blr
1757;
1758; CHECK-P9-LE-LABEL: ld_disjoint_align32_int8_t_uint64_t:
1759; CHECK-P9-LE:       # %bb.0: # %entry
1760; CHECK-P9-LE-NEXT:    lis r4, -15264
1761; CHECK-P9-LE-NEXT:    and r3, r3, r4
1762; CHECK-P9-LE-NEXT:    lis r4, 15258
1763; CHECK-P9-LE-NEXT:    ori r4, r4, 41712
1764; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
1765; CHECK-P9-LE-NEXT:    extsb r3, r3
1766; CHECK-P9-LE-NEXT:    blr
1767;
1768; CHECK-P9-BE-LABEL: ld_disjoint_align32_int8_t_uint64_t:
1769; CHECK-P9-BE:       # %bb.0: # %entry
1770; CHECK-P9-BE-NEXT:    lis r4, -15264
1771; CHECK-P9-BE-NEXT:    and r3, r3, r4
1772; CHECK-P9-BE-NEXT:    lis r4, 15258
1773; CHECK-P9-BE-NEXT:    ori r4, r4, 41719
1774; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
1775; CHECK-P9-BE-NEXT:    extsb r3, r3
1776; CHECK-P9-BE-NEXT:    blr
1777;
1778; CHECK-P8-LE-LABEL: ld_disjoint_align32_int8_t_uint64_t:
1779; CHECK-P8-LE:       # %bb.0: # %entry
1780; CHECK-P8-LE-NEXT:    lis r4, -15264
1781; CHECK-P8-LE-NEXT:    and r3, r3, r4
1782; CHECK-P8-LE-NEXT:    lis r4, 15258
1783; CHECK-P8-LE-NEXT:    ori r4, r4, 41712
1784; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
1785; CHECK-P8-LE-NEXT:    extsb r3, r3
1786; CHECK-P8-LE-NEXT:    blr
1787;
1788; CHECK-P8-BE-LABEL: ld_disjoint_align32_int8_t_uint64_t:
1789; CHECK-P8-BE:       # %bb.0: # %entry
1790; CHECK-P8-BE-NEXT:    lis r4, -15264
1791; CHECK-P8-BE-NEXT:    and r3, r3, r4
1792; CHECK-P8-BE-NEXT:    lis r4, 15258
1793; CHECK-P8-BE-NEXT:    ori r4, r4, 41719
1794; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
1795; CHECK-P8-BE-NEXT:    extsb r3, r3
1796; CHECK-P8-BE-NEXT:    blr
1797entry:
1798  %and = and i64 %ptr, -1000341504
1799  %or = or i64 %and, 999990000
1800  %0 = inttoptr i64 %or to ptr
1801  %1 = load i64, ptr %0, align 16
1802  %conv = trunc i64 %1 to i8
1803  ret i8 %conv
1804}
1805
1806; Function Attrs: norecurse nounwind readonly uwtable willreturn
1807define dso_local signext i8 @ld_not_disjoint64_int8_t_uint64_t(i64 %ptr) {
1808; CHECK-P10-LE-LABEL: ld_not_disjoint64_int8_t_uint64_t:
1809; CHECK-P10-LE:       # %bb.0: # %entry
1810; CHECK-P10-LE-NEXT:    pli r4, 232
1811; CHECK-P10-LE-NEXT:    pli r5, 3567587329
1812; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
1813; CHECK-P10-LE-NEXT:    or r3, r3, r5
1814; CHECK-P10-LE-NEXT:    lbz r3, 0(r3)
1815; CHECK-P10-LE-NEXT:    extsb r3, r3
1816; CHECK-P10-LE-NEXT:    blr
1817;
1818; CHECK-P10-BE-LABEL: ld_not_disjoint64_int8_t_uint64_t:
1819; CHECK-P10-BE:       # %bb.0: # %entry
1820; CHECK-P10-BE-NEXT:    pli r4, 232
1821; CHECK-P10-BE-NEXT:    pli r5, 3567587329
1822; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
1823; CHECK-P10-BE-NEXT:    or r3, r3, r5
1824; CHECK-P10-BE-NEXT:    lbz r3, 7(r3)
1825; CHECK-P10-BE-NEXT:    extsb r3, r3
1826; CHECK-P10-BE-NEXT:    blr
1827;
1828; CHECK-P9-LE-LABEL: ld_not_disjoint64_int8_t_uint64_t:
1829; CHECK-P9-LE:       # %bb.0: # %entry
1830; CHECK-P9-LE-NEXT:    li r4, 29
1831; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
1832; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
1833; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
1834; CHECK-P9-LE-NEXT:    or r3, r3, r4
1835; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
1836; CHECK-P9-LE-NEXT:    extsb r3, r3
1837; CHECK-P9-LE-NEXT:    blr
1838;
1839; CHECK-P9-BE-LABEL: ld_not_disjoint64_int8_t_uint64_t:
1840; CHECK-P9-BE:       # %bb.0: # %entry
1841; CHECK-P9-BE-NEXT:    li r4, 29
1842; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
1843; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
1844; CHECK-P9-BE-NEXT:    ori r4, r4, 4097
1845; CHECK-P9-BE-NEXT:    or r3, r3, r4
1846; CHECK-P9-BE-NEXT:    lbz r3, 7(r3)
1847; CHECK-P9-BE-NEXT:    extsb r3, r3
1848; CHECK-P9-BE-NEXT:    blr
1849;
1850; CHECK-P8-LE-LABEL: ld_not_disjoint64_int8_t_uint64_t:
1851; CHECK-P8-LE:       # %bb.0: # %entry
1852; CHECK-P8-LE-NEXT:    li r4, 29
1853; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
1854; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
1855; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
1856; CHECK-P8-LE-NEXT:    or r3, r3, r4
1857; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
1858; CHECK-P8-LE-NEXT:    extsb r3, r3
1859; CHECK-P8-LE-NEXT:    blr
1860;
1861; CHECK-P8-BE-LABEL: ld_not_disjoint64_int8_t_uint64_t:
1862; CHECK-P8-BE:       # %bb.0: # %entry
1863; CHECK-P8-BE-NEXT:    li r4, 29
1864; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
1865; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
1866; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
1867; CHECK-P8-BE-NEXT:    or r3, r3, r4
1868; CHECK-P8-BE-NEXT:    lbz r3, 7(r3)
1869; CHECK-P8-BE-NEXT:    extsb r3, r3
1870; CHECK-P8-BE-NEXT:    blr
1871entry:
1872  %or = or i64 %ptr, 1000000000001
1873  %0 = inttoptr i64 %or to ptr
1874  %1 = load i64, ptr %0, align 8
1875  %conv = trunc i64 %1 to i8
1876  ret i8 %conv
1877}
1878
1879; Function Attrs: norecurse nounwind readonly uwtable willreturn
1880define dso_local signext i8 @ld_disjoint_align64_int8_t_uint64_t(i64 %ptr) {
1881; CHECK-P10-LE-LABEL: ld_disjoint_align64_int8_t_uint64_t:
1882; CHECK-P10-LE:       # %bb.0: # %entry
1883; CHECK-P10-LE-NEXT:    pli r4, 244140625
1884; CHECK-P10-LE-NEXT:    rldicr r3, r3, 0, 23
1885; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
1886; CHECK-P10-LE-NEXT:    lbzx r3, r3, r4
1887; CHECK-P10-LE-NEXT:    extsb r3, r3
1888; CHECK-P10-LE-NEXT:    blr
1889;
1890; CHECK-P10-BE-LABEL: ld_disjoint_align64_int8_t_uint64_t:
1891; CHECK-P10-BE:       # %bb.0: # %entry
1892; CHECK-P10-BE-NEXT:    pli r4, 232
1893; CHECK-P10-BE-NEXT:    pli r5, 3567587335
1894; CHECK-P10-BE-NEXT:    rldicr r3, r3, 0, 23
1895; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
1896; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
1897; CHECK-P10-BE-NEXT:    extsb r3, r3
1898; CHECK-P10-BE-NEXT:    blr
1899;
1900; CHECK-P9-LE-LABEL: ld_disjoint_align64_int8_t_uint64_t:
1901; CHECK-P9-LE:       # %bb.0: # %entry
1902; CHECK-P9-LE-NEXT:    lis r4, 3725
1903; CHECK-P9-LE-NEXT:    rldicr r3, r3, 0, 23
1904; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
1905; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
1906; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
1907; CHECK-P9-LE-NEXT:    extsb r3, r3
1908; CHECK-P9-LE-NEXT:    blr
1909;
1910; CHECK-P9-BE-LABEL: ld_disjoint_align64_int8_t_uint64_t:
1911; CHECK-P9-BE:       # %bb.0: # %entry
1912; CHECK-P9-BE-NEXT:    li r4, 29
1913; CHECK-P9-BE-NEXT:    rldicr r3, r3, 0, 23
1914; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
1915; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
1916; CHECK-P9-BE-NEXT:    ori r4, r4, 4103
1917; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
1918; CHECK-P9-BE-NEXT:    extsb r3, r3
1919; CHECK-P9-BE-NEXT:    blr
1920;
1921; CHECK-P8-LE-LABEL: ld_disjoint_align64_int8_t_uint64_t:
1922; CHECK-P8-LE:       # %bb.0: # %entry
1923; CHECK-P8-LE-NEXT:    lis r4, 3725
1924; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
1925; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
1926; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
1927; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
1928; CHECK-P8-LE-NEXT:    extsb r3, r3
1929; CHECK-P8-LE-NEXT:    blr
1930;
1931; CHECK-P8-BE-LABEL: ld_disjoint_align64_int8_t_uint64_t:
1932; CHECK-P8-BE:       # %bb.0: # %entry
1933; CHECK-P8-BE-NEXT:    li r4, 29
1934; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
1935; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
1936; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
1937; CHECK-P8-BE-NEXT:    ori r4, r4, 4103
1938; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
1939; CHECK-P8-BE-NEXT:    extsb r3, r3
1940; CHECK-P8-BE-NEXT:    blr
1941entry:
1942  %and = and i64 %ptr, -1099511627776
1943  %or = or i64 %and, 1000000000000
1944  %0 = inttoptr i64 %or to ptr
1945  %1 = load i64, ptr %0, align 4096
1946  %conv = trunc i64 %1 to i8
1947  ret i8 %conv
1948}
1949
1950; Function Attrs: norecurse nounwind readonly uwtable willreturn
1951define dso_local signext i8 @ld_cst_align16_int8_t_uint64_t() {
1952; CHECK-LE-LABEL: ld_cst_align16_int8_t_uint64_t:
1953; CHECK-LE:       # %bb.0: # %entry
1954; CHECK-LE-NEXT:    lbz r3, 4080(0)
1955; CHECK-LE-NEXT:    extsb r3, r3
1956; CHECK-LE-NEXT:    blr
1957;
1958; CHECK-BE-LABEL: ld_cst_align16_int8_t_uint64_t:
1959; CHECK-BE:       # %bb.0: # %entry
1960; CHECK-BE-NEXT:    lbz r3, 4087(0)
1961; CHECK-BE-NEXT:    extsb r3, r3
1962; CHECK-BE-NEXT:    blr
1963entry:
1964  %0 = load i64, ptr inttoptr (i64 4080 to ptr), align 16
1965  %conv = trunc i64 %0 to i8
1966  ret i8 %conv
1967}
1968
1969; Function Attrs: norecurse nounwind readonly uwtable willreturn
1970define dso_local signext i8 @ld_cst_align32_int8_t_uint64_t() {
1971; CHECK-LE-LABEL: ld_cst_align32_int8_t_uint64_t:
1972; CHECK-LE:       # %bb.0: # %entry
1973; CHECK-LE-NEXT:    lis r3, 153
1974; CHECK-LE-NEXT:    lbz r3, -27108(r3)
1975; CHECK-LE-NEXT:    extsb r3, r3
1976; CHECK-LE-NEXT:    blr
1977;
1978; CHECK-BE-LABEL: ld_cst_align32_int8_t_uint64_t:
1979; CHECK-BE:       # %bb.0: # %entry
1980; CHECK-BE-NEXT:    lis r3, 153
1981; CHECK-BE-NEXT:    lbz r3, -27101(r3)
1982; CHECK-BE-NEXT:    extsb r3, r3
1983; CHECK-BE-NEXT:    blr
1984entry:
1985  %0 = load i64, ptr inttoptr (i64 9999900 to ptr), align 8
1986  %conv = trunc i64 %0 to i8
1987  ret i8 %conv
1988}
1989
1990; Function Attrs: norecurse nounwind readonly uwtable willreturn
1991define dso_local signext i8 @ld_cst_align64_int8_t_uint64_t() {
1992; CHECK-P10-LE-LABEL: ld_cst_align64_int8_t_uint64_t:
1993; CHECK-P10-LE:       # %bb.0: # %entry
1994; CHECK-P10-LE-NEXT:    pli r3, 244140625
1995; CHECK-P10-LE-NEXT:    rldic r3, r3, 12, 24
1996; CHECK-P10-LE-NEXT:    lbz r3, 0(r3)
1997; CHECK-P10-LE-NEXT:    extsb r3, r3
1998; CHECK-P10-LE-NEXT:    blr
1999;
2000; CHECK-P10-BE-LABEL: ld_cst_align64_int8_t_uint64_t:
2001; CHECK-P10-BE:       # %bb.0: # %entry
2002; CHECK-P10-BE-NEXT:    pli r3, 232
2003; CHECK-P10-BE-NEXT:    pli r4, 3567587335
2004; CHECK-P10-BE-NEXT:    rldimi r4, r3, 32, 0
2005; CHECK-P10-BE-NEXT:    lbz r3, 0(r4)
2006; CHECK-P10-BE-NEXT:    extsb r3, r3
2007; CHECK-P10-BE-NEXT:    blr
2008;
2009; CHECK-P9-LE-LABEL: ld_cst_align64_int8_t_uint64_t:
2010; CHECK-P9-LE:       # %bb.0: # %entry
2011; CHECK-P9-LE-NEXT:    lis r3, 3725
2012; CHECK-P9-LE-NEXT:    ori r3, r3, 19025
2013; CHECK-P9-LE-NEXT:    rldic r3, r3, 12, 24
2014; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
2015; CHECK-P9-LE-NEXT:    extsb r3, r3
2016; CHECK-P9-LE-NEXT:    blr
2017;
2018; CHECK-P9-BE-LABEL: ld_cst_align64_int8_t_uint64_t:
2019; CHECK-P9-BE:       # %bb.0: # %entry
2020; CHECK-P9-BE-NEXT:    li r3, 29
2021; CHECK-P9-BE-NEXT:    rldic r3, r3, 35, 24
2022; CHECK-P9-BE-NEXT:    oris r3, r3, 54437
2023; CHECK-P9-BE-NEXT:    ori r3, r3, 4103
2024; CHECK-P9-BE-NEXT:    lbz r3, 0(r3)
2025; CHECK-P9-BE-NEXT:    extsb r3, r3
2026; CHECK-P9-BE-NEXT:    blr
2027;
2028; CHECK-P8-LE-LABEL: ld_cst_align64_int8_t_uint64_t:
2029; CHECK-P8-LE:       # %bb.0: # %entry
2030; CHECK-P8-LE-NEXT:    lis r3, 3725
2031; CHECK-P8-LE-NEXT:    ori r3, r3, 19025
2032; CHECK-P8-LE-NEXT:    rldic r3, r3, 12, 24
2033; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
2034; CHECK-P8-LE-NEXT:    extsb r3, r3
2035; CHECK-P8-LE-NEXT:    blr
2036;
2037; CHECK-P8-BE-LABEL: ld_cst_align64_int8_t_uint64_t:
2038; CHECK-P8-BE:       # %bb.0: # %entry
2039; CHECK-P8-BE-NEXT:    li r3, 29
2040; CHECK-P8-BE-NEXT:    rldic r3, r3, 35, 24
2041; CHECK-P8-BE-NEXT:    oris r3, r3, 54437
2042; CHECK-P8-BE-NEXT:    ori r3, r3, 4103
2043; CHECK-P8-BE-NEXT:    lbz r3, 0(r3)
2044; CHECK-P8-BE-NEXT:    extsb r3, r3
2045; CHECK-P8-BE-NEXT:    blr
2046entry:
2047  %0 = load i64, ptr inttoptr (i64 1000000000000 to ptr), align 4096
2048  %conv = trunc i64 %0 to i8
2049  ret i8 %conv
2050}
2051
2052; Function Attrs: norecurse nounwind readonly uwtable willreturn
2053define dso_local signext i8 @ld_0_int8_t_float(i64 %ptr) {
2054; CHECK-LABEL: ld_0_int8_t_float:
2055; CHECK:       # %bb.0: # %entry
2056; CHECK-NEXT:    lfs f0, 0(r3)
2057; CHECK-NEXT:    xscvdpsxws f0, f0
2058; CHECK-NEXT:    mffprwz r3, f0
2059; CHECK-NEXT:    extsw r3, r3
2060; CHECK-NEXT:    blr
2061entry:
2062  %0 = inttoptr i64 %ptr to ptr
2063  %1 = load float, ptr %0, align 4
2064  %conv = fptosi float %1 to i8
2065  ret i8 %conv
2066}
2067
2068; Function Attrs: norecurse nounwind readonly uwtable willreturn
2069define dso_local signext i8 @ld_align16_int8_t_float(ptr nocapture readonly %ptr) {
2070; CHECK-LABEL: ld_align16_int8_t_float:
2071; CHECK:       # %bb.0: # %entry
2072; CHECK-NEXT:    lfs f0, 8(r3)
2073; CHECK-NEXT:    xscvdpsxws f0, f0
2074; CHECK-NEXT:    mffprwz r3, f0
2075; CHECK-NEXT:    extsw r3, r3
2076; CHECK-NEXT:    blr
2077entry:
2078  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2079  %0 = load float, ptr %add.ptr, align 4
2080  %conv = fptosi float %0 to i8
2081  ret i8 %conv
2082}
2083
2084; Function Attrs: norecurse nounwind readonly uwtable willreturn
2085define dso_local signext i8 @ld_align32_int8_t_float(ptr nocapture readonly %ptr) {
2086; CHECK-P10-LABEL: ld_align32_int8_t_float:
2087; CHECK-P10:       # %bb.0: # %entry
2088; CHECK-P10-NEXT:    plfs f0, 99999000(r3), 0
2089; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2090; CHECK-P10-NEXT:    mffprwz r3, f0
2091; CHECK-P10-NEXT:    extsw r3, r3
2092; CHECK-P10-NEXT:    blr
2093;
2094; CHECK-PREP10-LABEL: ld_align32_int8_t_float:
2095; CHECK-PREP10:       # %bb.0: # %entry
2096; CHECK-PREP10-NEXT:    lis r4, 1525
2097; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2098; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
2099; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2100; CHECK-PREP10-NEXT:    mffprwz r3, f0
2101; CHECK-PREP10-NEXT:    extsw r3, r3
2102; CHECK-PREP10-NEXT:    blr
2103entry:
2104  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2105  %0 = load float, ptr %add.ptr, align 4
2106  %conv = fptosi float %0 to i8
2107  ret i8 %conv
2108}
2109
2110; Function Attrs: norecurse nounwind readonly uwtable willreturn
2111define dso_local signext i8 @ld_align64_int8_t_float(ptr nocapture readonly %ptr) {
2112; CHECK-P10-LABEL: ld_align64_int8_t_float:
2113; CHECK-P10:       # %bb.0: # %entry
2114; CHECK-P10-NEXT:    pli r4, 244140625
2115; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2116; CHECK-P10-NEXT:    lfsx f0, r3, r4
2117; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2118; CHECK-P10-NEXT:    mffprwz r3, f0
2119; CHECK-P10-NEXT:    extsw r3, r3
2120; CHECK-P10-NEXT:    blr
2121;
2122; CHECK-PREP10-LABEL: ld_align64_int8_t_float:
2123; CHECK-PREP10:       # %bb.0: # %entry
2124; CHECK-PREP10-NEXT:    lis r4, 3725
2125; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2126; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2127; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
2128; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2129; CHECK-PREP10-NEXT:    mffprwz r3, f0
2130; CHECK-PREP10-NEXT:    extsw r3, r3
2131; CHECK-PREP10-NEXT:    blr
2132entry:
2133  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2134  %0 = load float, ptr %add.ptr, align 4
2135  %conv = fptosi float %0 to i8
2136  ret i8 %conv
2137}
2138
2139; Function Attrs: norecurse nounwind readonly uwtable willreturn
2140define dso_local signext i8 @ld_reg_int8_t_float(ptr nocapture readonly %ptr, i64 %off) {
2141; CHECK-LABEL: ld_reg_int8_t_float:
2142; CHECK:       # %bb.0: # %entry
2143; CHECK-NEXT:    lfsx f0, r3, r4
2144; CHECK-NEXT:    xscvdpsxws f0, f0
2145; CHECK-NEXT:    mffprwz r3, f0
2146; CHECK-NEXT:    extsw r3, r3
2147; CHECK-NEXT:    blr
2148entry:
2149  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2150  %0 = load float, ptr %add.ptr, align 4
2151  %conv = fptosi float %0 to i8
2152  ret i8 %conv
2153}
2154
2155; Function Attrs: norecurse nounwind readonly uwtable willreturn
2156define dso_local signext i8 @ld_or_int8_t_float(i64 %ptr, i8 zeroext %off) {
2157; CHECK-LABEL: ld_or_int8_t_float:
2158; CHECK:       # %bb.0: # %entry
2159; CHECK-NEXT:    or r3, r4, r3
2160; CHECK-NEXT:    lfs f0, 0(r3)
2161; CHECK-NEXT:    xscvdpsxws f0, f0
2162; CHECK-NEXT:    mffprwz r3, f0
2163; CHECK-NEXT:    extsw r3, r3
2164; CHECK-NEXT:    blr
2165entry:
2166  %conv = zext i8 %off to i64
2167  %or = or i64 %conv, %ptr
2168  %0 = inttoptr i64 %or to ptr
2169  %1 = load float, ptr %0, align 4
2170  %conv1 = fptosi float %1 to i8
2171  ret i8 %conv1
2172}
2173
2174; Function Attrs: norecurse nounwind readonly uwtable willreturn
2175define dso_local signext i8 @ld_not_disjoint16_int8_t_float(i64 %ptr) {
2176; CHECK-LABEL: ld_not_disjoint16_int8_t_float:
2177; CHECK:       # %bb.0: # %entry
2178; CHECK-NEXT:    ori r3, r3, 6
2179; CHECK-NEXT:    lfs f0, 0(r3)
2180; CHECK-NEXT:    xscvdpsxws f0, f0
2181; CHECK-NEXT:    mffprwz r3, f0
2182; CHECK-NEXT:    extsw r3, r3
2183; CHECK-NEXT:    blr
2184entry:
2185  %or = or i64 %ptr, 6
2186  %0 = inttoptr i64 %or to ptr
2187  %1 = load float, ptr %0, align 4
2188  %conv = fptosi float %1 to i8
2189  ret i8 %conv
2190}
2191
2192; Function Attrs: norecurse nounwind readonly uwtable willreturn
2193define dso_local signext i8 @ld_disjoint_align16_int8_t_float(i64 %ptr) {
2194; CHECK-LABEL: ld_disjoint_align16_int8_t_float:
2195; CHECK:       # %bb.0: # %entry
2196; CHECK-NEXT:    rldicr r3, r3, 0, 51
2197; CHECK-NEXT:    lfs f0, 24(r3)
2198; CHECK-NEXT:    xscvdpsxws f0, f0
2199; CHECK-NEXT:    mffprwz r3, f0
2200; CHECK-NEXT:    extsw r3, r3
2201; CHECK-NEXT:    blr
2202entry:
2203  %and = and i64 %ptr, -4096
2204  %or = or i64 %and, 24
2205  %0 = inttoptr i64 %or to ptr
2206  %1 = load float, ptr %0, align 8
2207  %conv = fptosi float %1 to i8
2208  ret i8 %conv
2209}
2210
2211; Function Attrs: norecurse nounwind readonly uwtable willreturn
2212define dso_local signext i8 @ld_not_disjoint32_int8_t_float(i64 %ptr) {
2213; CHECK-LABEL: ld_not_disjoint32_int8_t_float:
2214; CHECK:       # %bb.0: # %entry
2215; CHECK-NEXT:    ori r3, r3, 34463
2216; CHECK-NEXT:    oris r3, r3, 1
2217; CHECK-NEXT:    lfs f0, 0(r3)
2218; CHECK-NEXT:    xscvdpsxws f0, f0
2219; CHECK-NEXT:    mffprwz r3, f0
2220; CHECK-NEXT:    extsw r3, r3
2221; CHECK-NEXT:    blr
2222entry:
2223  %or = or i64 %ptr, 99999
2224  %0 = inttoptr i64 %or to ptr
2225  %1 = load float, ptr %0, align 4
2226  %conv = fptosi float %1 to i8
2227  ret i8 %conv
2228}
2229
2230; Function Attrs: norecurse nounwind readonly uwtable willreturn
2231define dso_local signext i8 @ld_disjoint_align32_int8_t_float(i64 %ptr) {
2232; CHECK-P10-LABEL: ld_disjoint_align32_int8_t_float:
2233; CHECK-P10:       # %bb.0: # %entry
2234; CHECK-P10-NEXT:    lis r4, -15264
2235; CHECK-P10-NEXT:    and r3, r3, r4
2236; CHECK-P10-NEXT:    plfs f0, 999990000(r3), 0
2237; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2238; CHECK-P10-NEXT:    mffprwz r3, f0
2239; CHECK-P10-NEXT:    extsw r3, r3
2240; CHECK-P10-NEXT:    blr
2241;
2242; CHECK-PREP10-LABEL: ld_disjoint_align32_int8_t_float:
2243; CHECK-PREP10:       # %bb.0: # %entry
2244; CHECK-PREP10-NEXT:    lis r4, -15264
2245; CHECK-PREP10-NEXT:    and r3, r3, r4
2246; CHECK-PREP10-NEXT:    lis r4, 15258
2247; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2248; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
2249; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2250; CHECK-PREP10-NEXT:    mffprwz r3, f0
2251; CHECK-PREP10-NEXT:    extsw r3, r3
2252; CHECK-PREP10-NEXT:    blr
2253entry:
2254  %and = and i64 %ptr, -1000341504
2255  %or = or i64 %and, 999990000
2256  %0 = inttoptr i64 %or to ptr
2257  %1 = load float, ptr %0, align 16
2258  %conv = fptosi float %1 to i8
2259  ret i8 %conv
2260}
2261
2262; Function Attrs: norecurse nounwind readonly uwtable willreturn
2263define dso_local signext i8 @ld_not_disjoint64_int8_t_float(i64 %ptr) {
2264; CHECK-P10-LABEL: ld_not_disjoint64_int8_t_float:
2265; CHECK-P10:       # %bb.0: # %entry
2266; CHECK-P10-NEXT:    pli r4, 232
2267; CHECK-P10-NEXT:    pli r5, 3567587329
2268; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2269; CHECK-P10-NEXT:    or r3, r3, r5
2270; CHECK-P10-NEXT:    lfs f0, 0(r3)
2271; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2272; CHECK-P10-NEXT:    mffprwz r3, f0
2273; CHECK-P10-NEXT:    extsw r3, r3
2274; CHECK-P10-NEXT:    blr
2275;
2276; CHECK-PREP10-LABEL: ld_not_disjoint64_int8_t_float:
2277; CHECK-PREP10:       # %bb.0: # %entry
2278; CHECK-PREP10-NEXT:    li r4, 29
2279; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2280; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2281; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2282; CHECK-PREP10-NEXT:    or r3, r3, r4
2283; CHECK-PREP10-NEXT:    lfs f0, 0(r3)
2284; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2285; CHECK-PREP10-NEXT:    mffprwz r3, f0
2286; CHECK-PREP10-NEXT:    extsw r3, r3
2287; CHECK-PREP10-NEXT:    blr
2288entry:
2289  %or = or i64 %ptr, 1000000000001
2290  %0 = inttoptr i64 %or to ptr
2291  %1 = load float, ptr %0, align 4
2292  %conv = fptosi float %1 to i8
2293  ret i8 %conv
2294}
2295
2296; Function Attrs: norecurse nounwind readonly uwtable willreturn
2297define dso_local signext i8 @ld_disjoint_align64_int8_t_float(i64 %ptr) {
2298; CHECK-P10-LABEL: ld_disjoint_align64_int8_t_float:
2299; CHECK-P10:       # %bb.0: # %entry
2300; CHECK-P10-NEXT:    pli r4, 244140625
2301; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2302; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2303; CHECK-P10-NEXT:    lfsx f0, r3, r4
2304; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2305; CHECK-P10-NEXT:    mffprwz r3, f0
2306; CHECK-P10-NEXT:    extsw r3, r3
2307; CHECK-P10-NEXT:    blr
2308;
2309; CHECK-PREP10-LABEL: ld_disjoint_align64_int8_t_float:
2310; CHECK-PREP10:       # %bb.0: # %entry
2311; CHECK-PREP10-NEXT:    lis r4, 3725
2312; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2313; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2314; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2315; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
2316; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2317; CHECK-PREP10-NEXT:    mffprwz r3, f0
2318; CHECK-PREP10-NEXT:    extsw r3, r3
2319; CHECK-PREP10-NEXT:    blr
2320entry:
2321  %and = and i64 %ptr, -1099511627776
2322  %or = or i64 %and, 1000000000000
2323  %0 = inttoptr i64 %or to ptr
2324  %1 = load float, ptr %0, align 4096
2325  %conv = fptosi float %1 to i8
2326  ret i8 %conv
2327}
2328
2329; Function Attrs: norecurse nounwind readonly uwtable willreturn
2330define dso_local signext i8 @ld_cst_align16_int8_t_float() {
2331; CHECK-LABEL: ld_cst_align16_int8_t_float:
2332; CHECK:       # %bb.0: # %entry
2333; CHECK-NEXT:    lfs f0, 4080(0)
2334; CHECK-NEXT:    xscvdpsxws f0, f0
2335; CHECK-NEXT:    mffprwz r3, f0
2336; CHECK-NEXT:    extsw r3, r3
2337; CHECK-NEXT:    blr
2338entry:
2339  %0 = load float, ptr inttoptr (i64 4080 to ptr), align 16
2340  %conv = fptosi float %0 to i8
2341  ret i8 %conv
2342}
2343
2344; Function Attrs: norecurse nounwind readonly uwtable willreturn
2345define dso_local signext i8 @ld_cst_align32_int8_t_float() {
2346; CHECK-LABEL: ld_cst_align32_int8_t_float:
2347; CHECK:       # %bb.0: # %entry
2348; CHECK-NEXT:    lis r3, 153
2349; CHECK-NEXT:    lfs f0, -27108(r3)
2350; CHECK-NEXT:    xscvdpsxws f0, f0
2351; CHECK-NEXT:    mffprwz r3, f0
2352; CHECK-NEXT:    extsw r3, r3
2353; CHECK-NEXT:    blr
2354entry:
2355  %0 = load float, ptr inttoptr (i64 9999900 to ptr), align 4
2356  %conv = fptosi float %0 to i8
2357  ret i8 %conv
2358}
2359
2360; Function Attrs: norecurse nounwind readonly uwtable willreturn
2361define dso_local signext i8 @ld_cst_align64_int8_t_float() {
2362; CHECK-P10-LABEL: ld_cst_align64_int8_t_float:
2363; CHECK-P10:       # %bb.0: # %entry
2364; CHECK-P10-NEXT:    pli r3, 244140625
2365; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2366; CHECK-P10-NEXT:    lfs f0, 0(r3)
2367; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2368; CHECK-P10-NEXT:    mffprwz r3, f0
2369; CHECK-P10-NEXT:    extsw r3, r3
2370; CHECK-P10-NEXT:    blr
2371;
2372; CHECK-PREP10-LABEL: ld_cst_align64_int8_t_float:
2373; CHECK-PREP10:       # %bb.0: # %entry
2374; CHECK-PREP10-NEXT:    lis r3, 3725
2375; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2376; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2377; CHECK-PREP10-NEXT:    lfs f0, 0(r3)
2378; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2379; CHECK-PREP10-NEXT:    mffprwz r3, f0
2380; CHECK-PREP10-NEXT:    extsw r3, r3
2381; CHECK-PREP10-NEXT:    blr
2382entry:
2383  %0 = load float, ptr inttoptr (i64 1000000000000 to ptr), align 4096
2384  %conv = fptosi float %0 to i8
2385  ret i8 %conv
2386}
2387
2388; Function Attrs: norecurse nounwind readonly uwtable willreturn
2389define dso_local signext i8 @ld_0_int8_t_double(i64 %ptr) {
2390; CHECK-LABEL: ld_0_int8_t_double:
2391; CHECK:       # %bb.0: # %entry
2392; CHECK-NEXT:    lfd f0, 0(r3)
2393; CHECK-NEXT:    xscvdpsxws f0, f0
2394; CHECK-NEXT:    mffprwz r3, f0
2395; CHECK-NEXT:    extsw r3, r3
2396; CHECK-NEXT:    blr
2397entry:
2398  %0 = inttoptr i64 %ptr to ptr
2399  %1 = load double, ptr %0, align 8
2400  %conv = fptosi double %1 to i8
2401  ret i8 %conv
2402}
2403
2404; Function Attrs: norecurse nounwind readonly uwtable willreturn
2405define dso_local signext i8 @ld_align16_int8_t_double(ptr nocapture readonly %ptr) {
2406; CHECK-LABEL: ld_align16_int8_t_double:
2407; CHECK:       # %bb.0: # %entry
2408; CHECK-NEXT:    lfd f0, 8(r3)
2409; CHECK-NEXT:    xscvdpsxws f0, f0
2410; CHECK-NEXT:    mffprwz r3, f0
2411; CHECK-NEXT:    extsw r3, r3
2412; CHECK-NEXT:    blr
2413entry:
2414  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2415  %0 = load double, ptr %add.ptr, align 8
2416  %conv = fptosi double %0 to i8
2417  ret i8 %conv
2418}
2419
2420; Function Attrs: norecurse nounwind readonly uwtable willreturn
2421define dso_local signext i8 @ld_align32_int8_t_double(ptr nocapture readonly %ptr) {
2422; CHECK-P10-LABEL: ld_align32_int8_t_double:
2423; CHECK-P10:       # %bb.0: # %entry
2424; CHECK-P10-NEXT:    plfd f0, 99999000(r3), 0
2425; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2426; CHECK-P10-NEXT:    mffprwz r3, f0
2427; CHECK-P10-NEXT:    extsw r3, r3
2428; CHECK-P10-NEXT:    blr
2429;
2430; CHECK-PREP10-LABEL: ld_align32_int8_t_double:
2431; CHECK-PREP10:       # %bb.0: # %entry
2432; CHECK-PREP10-NEXT:    lis r4, 1525
2433; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2434; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
2435; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2436; CHECK-PREP10-NEXT:    mffprwz r3, f0
2437; CHECK-PREP10-NEXT:    extsw r3, r3
2438; CHECK-PREP10-NEXT:    blr
2439entry:
2440  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2441  %0 = load double, ptr %add.ptr, align 8
2442  %conv = fptosi double %0 to i8
2443  ret i8 %conv
2444}
2445
2446; Function Attrs: norecurse nounwind readonly uwtable willreturn
2447define dso_local signext i8 @ld_align64_int8_t_double(ptr nocapture readonly %ptr) {
2448; CHECK-P10-LABEL: ld_align64_int8_t_double:
2449; CHECK-P10:       # %bb.0: # %entry
2450; CHECK-P10-NEXT:    pli r4, 244140625
2451; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2452; CHECK-P10-NEXT:    lfdx f0, r3, r4
2453; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2454; CHECK-P10-NEXT:    mffprwz r3, f0
2455; CHECK-P10-NEXT:    extsw r3, r3
2456; CHECK-P10-NEXT:    blr
2457;
2458; CHECK-PREP10-LABEL: ld_align64_int8_t_double:
2459; CHECK-PREP10:       # %bb.0: # %entry
2460; CHECK-PREP10-NEXT:    lis r4, 3725
2461; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2462; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2463; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
2464; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2465; CHECK-PREP10-NEXT:    mffprwz r3, f0
2466; CHECK-PREP10-NEXT:    extsw r3, r3
2467; CHECK-PREP10-NEXT:    blr
2468entry:
2469  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2470  %0 = load double, ptr %add.ptr, align 8
2471  %conv = fptosi double %0 to i8
2472  ret i8 %conv
2473}
2474
2475; Function Attrs: norecurse nounwind readonly uwtable willreturn
2476define dso_local signext i8 @ld_reg_int8_t_double(ptr nocapture readonly %ptr, i64 %off) {
2477; CHECK-LABEL: ld_reg_int8_t_double:
2478; CHECK:       # %bb.0: # %entry
2479; CHECK-NEXT:    lfdx f0, r3, r4
2480; CHECK-NEXT:    xscvdpsxws f0, f0
2481; CHECK-NEXT:    mffprwz r3, f0
2482; CHECK-NEXT:    extsw r3, r3
2483; CHECK-NEXT:    blr
2484entry:
2485  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2486  %0 = load double, ptr %add.ptr, align 8
2487  %conv = fptosi double %0 to i8
2488  ret i8 %conv
2489}
2490
2491; Function Attrs: norecurse nounwind readonly uwtable willreturn
2492define dso_local signext i8 @ld_or_int8_t_double(i64 %ptr, i8 zeroext %off) {
2493; CHECK-LABEL: ld_or_int8_t_double:
2494; CHECK:       # %bb.0: # %entry
2495; CHECK-NEXT:    or r3, r4, r3
2496; CHECK-NEXT:    lfd f0, 0(r3)
2497; CHECK-NEXT:    xscvdpsxws f0, f0
2498; CHECK-NEXT:    mffprwz r3, f0
2499; CHECK-NEXT:    extsw r3, r3
2500; CHECK-NEXT:    blr
2501entry:
2502  %conv = zext i8 %off to i64
2503  %or = or i64 %conv, %ptr
2504  %0 = inttoptr i64 %or to ptr
2505  %1 = load double, ptr %0, align 8
2506  %conv1 = fptosi double %1 to i8
2507  ret i8 %conv1
2508}
2509
2510; Function Attrs: norecurse nounwind readonly uwtable willreturn
2511define dso_local signext i8 @ld_not_disjoint16_int8_t_double(i64 %ptr) {
2512; CHECK-LABEL: ld_not_disjoint16_int8_t_double:
2513; CHECK:       # %bb.0: # %entry
2514; CHECK-NEXT:    ori r3, r3, 6
2515; CHECK-NEXT:    lfd f0, 0(r3)
2516; CHECK-NEXT:    xscvdpsxws f0, f0
2517; CHECK-NEXT:    mffprwz r3, f0
2518; CHECK-NEXT:    extsw r3, r3
2519; CHECK-NEXT:    blr
2520entry:
2521  %or = or i64 %ptr, 6
2522  %0 = inttoptr i64 %or to ptr
2523  %1 = load double, ptr %0, align 8
2524  %conv = fptosi double %1 to i8
2525  ret i8 %conv
2526}
2527
2528; Function Attrs: norecurse nounwind readonly uwtable willreturn
2529define dso_local signext i8 @ld_disjoint_align16_int8_t_double(i64 %ptr) {
2530; CHECK-LABEL: ld_disjoint_align16_int8_t_double:
2531; CHECK:       # %bb.0: # %entry
2532; CHECK-NEXT:    rldicr r3, r3, 0, 51
2533; CHECK-NEXT:    lfd f0, 24(r3)
2534; CHECK-NEXT:    xscvdpsxws f0, f0
2535; CHECK-NEXT:    mffprwz r3, f0
2536; CHECK-NEXT:    extsw r3, r3
2537; CHECK-NEXT:    blr
2538entry:
2539  %and = and i64 %ptr, -4096
2540  %or = or i64 %and, 24
2541  %0 = inttoptr i64 %or to ptr
2542  %1 = load double, ptr %0, align 8
2543  %conv = fptosi double %1 to i8
2544  ret i8 %conv
2545}
2546
2547; Function Attrs: norecurse nounwind readonly uwtable willreturn
2548define dso_local signext i8 @ld_not_disjoint32_int8_t_double(i64 %ptr) {
2549; CHECK-LABEL: ld_not_disjoint32_int8_t_double:
2550; CHECK:       # %bb.0: # %entry
2551; CHECK-NEXT:    ori r3, r3, 34463
2552; CHECK-NEXT:    oris r3, r3, 1
2553; CHECK-NEXT:    lfd f0, 0(r3)
2554; CHECK-NEXT:    xscvdpsxws f0, f0
2555; CHECK-NEXT:    mffprwz r3, f0
2556; CHECK-NEXT:    extsw r3, r3
2557; CHECK-NEXT:    blr
2558entry:
2559  %or = or i64 %ptr, 99999
2560  %0 = inttoptr i64 %or to ptr
2561  %1 = load double, ptr %0, align 8
2562  %conv = fptosi double %1 to i8
2563  ret i8 %conv
2564}
2565
2566; Function Attrs: norecurse nounwind readonly uwtable willreturn
2567define dso_local signext i8 @ld_disjoint_align32_int8_t_double(i64 %ptr) {
2568; CHECK-P10-LABEL: ld_disjoint_align32_int8_t_double:
2569; CHECK-P10:       # %bb.0: # %entry
2570; CHECK-P10-NEXT:    lis r4, -15264
2571; CHECK-P10-NEXT:    and r3, r3, r4
2572; CHECK-P10-NEXT:    plfd f0, 999990000(r3), 0
2573; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2574; CHECK-P10-NEXT:    mffprwz r3, f0
2575; CHECK-P10-NEXT:    extsw r3, r3
2576; CHECK-P10-NEXT:    blr
2577;
2578; CHECK-PREP10-LABEL: ld_disjoint_align32_int8_t_double:
2579; CHECK-PREP10:       # %bb.0: # %entry
2580; CHECK-PREP10-NEXT:    lis r4, -15264
2581; CHECK-PREP10-NEXT:    and r3, r3, r4
2582; CHECK-PREP10-NEXT:    lis r4, 15258
2583; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2584; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
2585; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2586; CHECK-PREP10-NEXT:    mffprwz r3, f0
2587; CHECK-PREP10-NEXT:    extsw r3, r3
2588; CHECK-PREP10-NEXT:    blr
2589entry:
2590  %and = and i64 %ptr, -1000341504
2591  %or = or i64 %and, 999990000
2592  %0 = inttoptr i64 %or to ptr
2593  %1 = load double, ptr %0, align 16
2594  %conv = fptosi double %1 to i8
2595  ret i8 %conv
2596}
2597
2598; Function Attrs: norecurse nounwind readonly uwtable willreturn
2599define dso_local signext i8 @ld_not_disjoint64_int8_t_double(i64 %ptr) {
2600; CHECK-P10-LABEL: ld_not_disjoint64_int8_t_double:
2601; CHECK-P10:       # %bb.0: # %entry
2602; CHECK-P10-NEXT:    pli r4, 232
2603; CHECK-P10-NEXT:    pli r5, 3567587329
2604; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2605; CHECK-P10-NEXT:    or r3, r3, r5
2606; CHECK-P10-NEXT:    lfd f0, 0(r3)
2607; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2608; CHECK-P10-NEXT:    mffprwz r3, f0
2609; CHECK-P10-NEXT:    extsw r3, r3
2610; CHECK-P10-NEXT:    blr
2611;
2612; CHECK-PREP10-LABEL: ld_not_disjoint64_int8_t_double:
2613; CHECK-PREP10:       # %bb.0: # %entry
2614; CHECK-PREP10-NEXT:    li r4, 29
2615; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2616; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2617; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2618; CHECK-PREP10-NEXT:    or r3, r3, r4
2619; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
2620; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2621; CHECK-PREP10-NEXT:    mffprwz r3, f0
2622; CHECK-PREP10-NEXT:    extsw r3, r3
2623; CHECK-PREP10-NEXT:    blr
2624entry:
2625  %or = or i64 %ptr, 1000000000001
2626  %0 = inttoptr i64 %or to ptr
2627  %1 = load double, ptr %0, align 8
2628  %conv = fptosi double %1 to i8
2629  ret i8 %conv
2630}
2631
2632; Function Attrs: norecurse nounwind readonly uwtable willreturn
2633define dso_local signext i8 @ld_disjoint_align64_int8_t_double(i64 %ptr) {
2634; CHECK-P10-LABEL: ld_disjoint_align64_int8_t_double:
2635; CHECK-P10:       # %bb.0: # %entry
2636; CHECK-P10-NEXT:    pli r4, 244140625
2637; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2638; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2639; CHECK-P10-NEXT:    lfdx f0, r3, r4
2640; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2641; CHECK-P10-NEXT:    mffprwz r3, f0
2642; CHECK-P10-NEXT:    extsw r3, r3
2643; CHECK-P10-NEXT:    blr
2644;
2645; CHECK-PREP10-LABEL: ld_disjoint_align64_int8_t_double:
2646; CHECK-PREP10:       # %bb.0: # %entry
2647; CHECK-PREP10-NEXT:    lis r4, 3725
2648; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2649; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2650; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2651; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
2652; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2653; CHECK-PREP10-NEXT:    mffprwz r3, f0
2654; CHECK-PREP10-NEXT:    extsw r3, r3
2655; CHECK-PREP10-NEXT:    blr
2656entry:
2657  %and = and i64 %ptr, -1099511627776
2658  %or = or i64 %and, 1000000000000
2659  %0 = inttoptr i64 %or to ptr
2660  %1 = load double, ptr %0, align 4096
2661  %conv = fptosi double %1 to i8
2662  ret i8 %conv
2663}
2664
2665; Function Attrs: norecurse nounwind readonly uwtable willreturn
2666define dso_local signext i8 @ld_cst_align16_int8_t_double() {
2667; CHECK-LABEL: ld_cst_align16_int8_t_double:
2668; CHECK:       # %bb.0: # %entry
2669; CHECK-NEXT:    lfd f0, 4080(0)
2670; CHECK-NEXT:    xscvdpsxws f0, f0
2671; CHECK-NEXT:    mffprwz r3, f0
2672; CHECK-NEXT:    extsw r3, r3
2673; CHECK-NEXT:    blr
2674entry:
2675  %0 = load double, ptr inttoptr (i64 4080 to ptr), align 16
2676  %conv = fptosi double %0 to i8
2677  ret i8 %conv
2678}
2679
2680; Function Attrs: norecurse nounwind readonly uwtable willreturn
2681define dso_local signext i8 @ld_cst_align32_int8_t_double() {
2682; CHECK-LABEL: ld_cst_align32_int8_t_double:
2683; CHECK:       # %bb.0: # %entry
2684; CHECK-NEXT:    lis r3, 153
2685; CHECK-NEXT:    lfd f0, -27108(r3)
2686; CHECK-NEXT:    xscvdpsxws f0, f0
2687; CHECK-NEXT:    mffprwz r3, f0
2688; CHECK-NEXT:    extsw r3, r3
2689; CHECK-NEXT:    blr
2690entry:
2691  %0 = load double, ptr inttoptr (i64 9999900 to ptr), align 8
2692  %conv = fptosi double %0 to i8
2693  ret i8 %conv
2694}
2695
2696; Function Attrs: norecurse nounwind readonly uwtable willreturn
2697define dso_local signext i8 @ld_cst_align64_int8_t_double() {
2698; CHECK-P10-LABEL: ld_cst_align64_int8_t_double:
2699; CHECK-P10:       # %bb.0: # %entry
2700; CHECK-P10-NEXT:    pli r3, 244140625
2701; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
2702; CHECK-P10-NEXT:    lfd f0, 0(r3)
2703; CHECK-P10-NEXT:    xscvdpsxws f0, f0
2704; CHECK-P10-NEXT:    mffprwz r3, f0
2705; CHECK-P10-NEXT:    extsw r3, r3
2706; CHECK-P10-NEXT:    blr
2707;
2708; CHECK-PREP10-LABEL: ld_cst_align64_int8_t_double:
2709; CHECK-PREP10:       # %bb.0: # %entry
2710; CHECK-PREP10-NEXT:    lis r3, 3725
2711; CHECK-PREP10-NEXT:    ori r3, r3, 19025
2712; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
2713; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
2714; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
2715; CHECK-PREP10-NEXT:    mffprwz r3, f0
2716; CHECK-PREP10-NEXT:    extsw r3, r3
2717; CHECK-PREP10-NEXT:    blr
2718entry:
2719  %0 = load double, ptr inttoptr (i64 1000000000000 to ptr), align 4096
2720  %conv = fptosi double %0 to i8
2721  ret i8 %conv
2722}
2723
2724; Function Attrs: norecurse nounwind readonly uwtable willreturn
2725define dso_local zeroext i8 @ld_0_uint8_t_uint8_t(i64 %ptr) {
2726; CHECK-LABEL: ld_0_uint8_t_uint8_t:
2727; CHECK:       # %bb.0: # %entry
2728; CHECK-NEXT:    lbz r3, 0(r3)
2729; CHECK-NEXT:    blr
2730entry:
2731  %0 = inttoptr i64 %ptr to ptr
2732  %1 = load i8, ptr %0, align 1
2733  ret i8 %1
2734}
2735
2736; Function Attrs: norecurse nounwind readonly uwtable willreturn
2737define dso_local zeroext i8 @ld_align16_uint8_t_uint8_t(ptr nocapture readonly %ptr) {
2738; CHECK-LABEL: ld_align16_uint8_t_uint8_t:
2739; CHECK:       # %bb.0: # %entry
2740; CHECK-NEXT:    lbz r3, 8(r3)
2741; CHECK-NEXT:    blr
2742entry:
2743  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
2744  %0 = load i8, ptr %add.ptr, align 1
2745  ret i8 %0
2746}
2747
2748; Function Attrs: norecurse nounwind readonly uwtable willreturn
2749define dso_local zeroext i8 @ld_align32_uint8_t_uint8_t(ptr nocapture readonly %ptr) {
2750; CHECK-P10-LABEL: ld_align32_uint8_t_uint8_t:
2751; CHECK-P10:       # %bb.0: # %entry
2752; CHECK-P10-NEXT:    plbz r3, 99999000(r3), 0
2753; CHECK-P10-NEXT:    blr
2754;
2755; CHECK-PREP10-LABEL: ld_align32_uint8_t_uint8_t:
2756; CHECK-PREP10:       # %bb.0: # %entry
2757; CHECK-PREP10-NEXT:    lis r4, 1525
2758; CHECK-PREP10-NEXT:    ori r4, r4, 56600
2759; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2760; CHECK-PREP10-NEXT:    blr
2761entry:
2762  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
2763  %0 = load i8, ptr %add.ptr, align 1
2764  ret i8 %0
2765}
2766
2767; Function Attrs: norecurse nounwind readonly uwtable willreturn
2768define dso_local zeroext i8 @ld_unalign64_uint8_t_uint8_t(ptr nocapture readonly %ptr) {
2769; CHECK-P10-LABEL: ld_unalign64_uint8_t_uint8_t:
2770; CHECK-P10:       # %bb.0: # %entry
2771; CHECK-P10-NEXT:    pli r4, 232
2772; CHECK-P10-NEXT:    pli r5, 3567587329
2773; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2774; CHECK-P10-NEXT:    lbzx r3, r3, r5
2775; CHECK-P10-NEXT:    blr
2776;
2777; CHECK-PREP10-LABEL: ld_unalign64_uint8_t_uint8_t:
2778; CHECK-PREP10:       # %bb.0: # %entry
2779; CHECK-PREP10-NEXT:    li r4, 29
2780; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2781; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2782; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2783; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2784; CHECK-PREP10-NEXT:    blr
2785entry:
2786  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000001
2787  %0 = load i8, ptr %add.ptr, align 1
2788  ret i8 %0
2789}
2790
2791; Function Attrs: norecurse nounwind readonly uwtable willreturn
2792define dso_local zeroext i8 @ld_align64_uint8_t_uint8_t(ptr nocapture readonly %ptr) {
2793; CHECK-P10-LABEL: ld_align64_uint8_t_uint8_t:
2794; CHECK-P10:       # %bb.0: # %entry
2795; CHECK-P10-NEXT:    pli r4, 244140625
2796; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2797; CHECK-P10-NEXT:    lbzx r3, r3, r4
2798; CHECK-P10-NEXT:    blr
2799;
2800; CHECK-PREP10-LABEL: ld_align64_uint8_t_uint8_t:
2801; CHECK-PREP10:       # %bb.0: # %entry
2802; CHECK-PREP10-NEXT:    lis r4, 3725
2803; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2804; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2805; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2806; CHECK-PREP10-NEXT:    blr
2807entry:
2808  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
2809  %0 = load i8, ptr %add.ptr, align 1
2810  ret i8 %0
2811}
2812
2813; Function Attrs: norecurse nounwind readonly uwtable willreturn
2814define dso_local zeroext i8 @ld_reg_uint8_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) {
2815; CHECK-LABEL: ld_reg_uint8_t_uint8_t:
2816; CHECK:       # %bb.0: # %entry
2817; CHECK-NEXT:    lbzx r3, r3, r4
2818; CHECK-NEXT:    blr
2819entry:
2820  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
2821  %0 = load i8, ptr %add.ptr, align 1
2822  ret i8 %0
2823}
2824
2825; Function Attrs: norecurse nounwind readonly uwtable willreturn
2826define dso_local zeroext i8 @ld_or_uint8_t_uint8_t(i64 %ptr, i8 zeroext %off) {
2827; CHECK-LABEL: ld_or_uint8_t_uint8_t:
2828; CHECK:       # %bb.0: # %entry
2829; CHECK-NEXT:    or r3, r4, r3
2830; CHECK-NEXT:    lbz r3, 0(r3)
2831; CHECK-NEXT:    blr
2832entry:
2833  %conv = zext i8 %off to i64
2834  %or = or i64 %conv, %ptr
2835  %0 = inttoptr i64 %or to ptr
2836  %1 = load i8, ptr %0, align 1
2837  ret i8 %1
2838}
2839
2840; Function Attrs: norecurse nounwind readonly uwtable willreturn
2841define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_uint8_t(i64 %ptr) {
2842; CHECK-LABEL: ld_not_disjoint16_uint8_t_uint8_t:
2843; CHECK:       # %bb.0: # %entry
2844; CHECK-NEXT:    ori r3, r3, 6
2845; CHECK-NEXT:    lbz r3, 0(r3)
2846; CHECK-NEXT:    blr
2847entry:
2848  %or = or i64 %ptr, 6
2849  %0 = inttoptr i64 %or to ptr
2850  %1 = load i8, ptr %0, align 1
2851  ret i8 %1
2852}
2853
2854; Function Attrs: norecurse nounwind readonly uwtable willreturn
2855define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_uint8_t(i64 %ptr) {
2856; CHECK-LABEL: ld_disjoint_align16_uint8_t_uint8_t:
2857; CHECK:       # %bb.0: # %entry
2858; CHECK-NEXT:    rldicr r3, r3, 0, 51
2859; CHECK-NEXT:    lbz r3, 24(r3)
2860; CHECK-NEXT:    blr
2861entry:
2862  %and = and i64 %ptr, -4096
2863  %or = or i64 %and, 24
2864  %0 = inttoptr i64 %or to ptr
2865  %1 = load i8, ptr %0, align 8
2866  ret i8 %1
2867}
2868
2869; Function Attrs: norecurse nounwind readonly uwtable willreturn
2870define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_uint8_t(i64 %ptr) {
2871; CHECK-LABEL: ld_not_disjoint32_uint8_t_uint8_t:
2872; CHECK:       # %bb.0: # %entry
2873; CHECK-NEXT:    ori r3, r3, 34463
2874; CHECK-NEXT:    oris r3, r3, 1
2875; CHECK-NEXT:    lbz r3, 0(r3)
2876; CHECK-NEXT:    blr
2877entry:
2878  %or = or i64 %ptr, 99999
2879  %0 = inttoptr i64 %or to ptr
2880  %1 = load i8, ptr %0, align 1
2881  ret i8 %1
2882}
2883
2884; Function Attrs: norecurse nounwind readonly uwtable willreturn
2885define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_uint8_t(i64 %ptr) {
2886; CHECK-P10-LABEL: ld_disjoint_align32_uint8_t_uint8_t:
2887; CHECK-P10:       # %bb.0: # %entry
2888; CHECK-P10-NEXT:    lis r4, -15264
2889; CHECK-P10-NEXT:    and r3, r3, r4
2890; CHECK-P10-NEXT:    plbz r3, 999990000(r3), 0
2891; CHECK-P10-NEXT:    blr
2892;
2893; CHECK-PREP10-LABEL: ld_disjoint_align32_uint8_t_uint8_t:
2894; CHECK-PREP10:       # %bb.0: # %entry
2895; CHECK-PREP10-NEXT:    lis r4, -15264
2896; CHECK-PREP10-NEXT:    and r3, r3, r4
2897; CHECK-PREP10-NEXT:    lis r4, 15258
2898; CHECK-PREP10-NEXT:    ori r4, r4, 41712
2899; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2900; CHECK-PREP10-NEXT:    blr
2901entry:
2902  %and = and i64 %ptr, -1000341504
2903  %or = or i64 %and, 999990000
2904  %0 = inttoptr i64 %or to ptr
2905  %1 = load i8, ptr %0, align 16
2906  ret i8 %1
2907}
2908
2909; Function Attrs: norecurse nounwind readonly uwtable willreturn
2910define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_uint8_t(i64 %ptr) {
2911; CHECK-P10-LABEL: ld_not_disjoint64_uint8_t_uint8_t:
2912; CHECK-P10:       # %bb.0: # %entry
2913; CHECK-P10-NEXT:    pli r4, 232
2914; CHECK-P10-NEXT:    pli r5, 3567587329
2915; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2916; CHECK-P10-NEXT:    or r3, r3, r5
2917; CHECK-P10-NEXT:    lbz r3, 0(r3)
2918; CHECK-P10-NEXT:    blr
2919;
2920; CHECK-PREP10-LABEL: ld_not_disjoint64_uint8_t_uint8_t:
2921; CHECK-PREP10:       # %bb.0: # %entry
2922; CHECK-PREP10-NEXT:    li r4, 29
2923; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2924; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2925; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2926; CHECK-PREP10-NEXT:    or r3, r3, r4
2927; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
2928; CHECK-PREP10-NEXT:    blr
2929entry:
2930  %or = or i64 %ptr, 1000000000001
2931  %0 = inttoptr i64 %or to ptr
2932  %1 = load i8, ptr %0, align 1
2933  ret i8 %1
2934}
2935
2936; Function Attrs: norecurse nounwind readonly uwtable willreturn
2937define dso_local zeroext i8 @ld_disjoint_unalign64_uint8_t_uint8_t(i64 %ptr) {
2938; CHECK-P10-LABEL: ld_disjoint_unalign64_uint8_t_uint8_t:
2939; CHECK-P10:       # %bb.0: # %entry
2940; CHECK-P10-NEXT:    pli r4, 232
2941; CHECK-P10-NEXT:    pli r5, 3567587329
2942; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2943; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
2944; CHECK-P10-NEXT:    lbzx r3, r3, r5
2945; CHECK-P10-NEXT:    blr
2946;
2947; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint8_t_uint8_t:
2948; CHECK-PREP10:       # %bb.0: # %entry
2949; CHECK-PREP10-NEXT:    li r4, 29
2950; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2951; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
2952; CHECK-PREP10-NEXT:    oris r4, r4, 54437
2953; CHECK-PREP10-NEXT:    ori r4, r4, 4097
2954; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2955; CHECK-PREP10-NEXT:    blr
2956entry:
2957  %and = and i64 %ptr, -1099511627776
2958  %or = or i64 %and, 1000000000001
2959  %0 = inttoptr i64 %or to ptr
2960  %1 = load i8, ptr %0, align 1
2961  ret i8 %1
2962}
2963
2964; Function Attrs: norecurse nounwind readonly uwtable willreturn
2965define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_uint8_t(i64 %ptr) {
2966; CHECK-P10-LABEL: ld_disjoint_align64_uint8_t_uint8_t:
2967; CHECK-P10:       # %bb.0: # %entry
2968; CHECK-P10-NEXT:    pli r4, 244140625
2969; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
2970; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
2971; CHECK-P10-NEXT:    lbzx r3, r3, r4
2972; CHECK-P10-NEXT:    blr
2973;
2974; CHECK-PREP10-LABEL: ld_disjoint_align64_uint8_t_uint8_t:
2975; CHECK-PREP10:       # %bb.0: # %entry
2976; CHECK-PREP10-NEXT:    lis r4, 3725
2977; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
2978; CHECK-PREP10-NEXT:    ori r4, r4, 19025
2979; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
2980; CHECK-PREP10-NEXT:    lbzx r3, r3, r4
2981; CHECK-PREP10-NEXT:    blr
2982entry:
2983  %and = and i64 %ptr, -1099511627776
2984  %or = or i64 %and, 1000000000000
2985  %0 = inttoptr i64 %or to ptr
2986  %1 = load i8, ptr %0, align 4096
2987  ret i8 %1
2988}
2989
2990; Function Attrs: norecurse nounwind readonly uwtable willreturn
2991define dso_local zeroext i8 @ld_cst_align16_uint8_t_uint8_t() {
2992; CHECK-LABEL: ld_cst_align16_uint8_t_uint8_t:
2993; CHECK:       # %bb.0: # %entry
2994; CHECK-NEXT:    lbz r3, 4080(0)
2995; CHECK-NEXT:    blr
2996entry:
2997  %0 = load i8, ptr inttoptr (i64 4080 to ptr), align 16
2998  ret i8 %0
2999}
3000
3001; Function Attrs: norecurse nounwind readonly uwtable willreturn
3002define dso_local zeroext i8 @ld_cst_align32_uint8_t_uint8_t() {
3003; CHECK-LABEL: ld_cst_align32_uint8_t_uint8_t:
3004; CHECK:       # %bb.0: # %entry
3005; CHECK-NEXT:    lis r3, 153
3006; CHECK-NEXT:    lbz r3, -27108(r3)
3007; CHECK-NEXT:    blr
3008entry:
3009  %0 = load i8, ptr inttoptr (i64 9999900 to ptr), align 4
3010  ret i8 %0
3011}
3012
3013; Function Attrs: norecurse nounwind readonly uwtable willreturn
3014define dso_local zeroext i8 @ld_cst_unalign64_uint8_t_uint8_t() {
3015; CHECK-P10-LABEL: ld_cst_unalign64_uint8_t_uint8_t:
3016; CHECK-P10:       # %bb.0: # %entry
3017; CHECK-P10-NEXT:    pli r3, 232
3018; CHECK-P10-NEXT:    pli r4, 3567587329
3019; CHECK-P10-NEXT:    rldimi r4, r3, 32, 0
3020; CHECK-P10-NEXT:    lbz r3, 0(r4)
3021; CHECK-P10-NEXT:    blr
3022;
3023; CHECK-PREP10-LABEL: ld_cst_unalign64_uint8_t_uint8_t:
3024; CHECK-PREP10:       # %bb.0: # %entry
3025; CHECK-PREP10-NEXT:    li r3, 29
3026; CHECK-PREP10-NEXT:    rldic r3, r3, 35, 24
3027; CHECK-PREP10-NEXT:    oris r3, r3, 54437
3028; CHECK-PREP10-NEXT:    ori r3, r3, 4097
3029; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
3030; CHECK-PREP10-NEXT:    blr
3031entry:
3032  %0 = load i8, ptr inttoptr (i64 1000000000001 to ptr), align 1
3033  ret i8 %0
3034}
3035
3036; Function Attrs: norecurse nounwind readonly uwtable willreturn
3037define dso_local zeroext i8 @ld_cst_align64_uint8_t_uint8_t() {
3038; CHECK-P10-LABEL: ld_cst_align64_uint8_t_uint8_t:
3039; CHECK-P10:       # %bb.0: # %entry
3040; CHECK-P10-NEXT:    pli r3, 244140625
3041; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
3042; CHECK-P10-NEXT:    lbz r3, 0(r3)
3043; CHECK-P10-NEXT:    blr
3044;
3045; CHECK-PREP10-LABEL: ld_cst_align64_uint8_t_uint8_t:
3046; CHECK-PREP10:       # %bb.0: # %entry
3047; CHECK-PREP10-NEXT:    lis r3, 3725
3048; CHECK-PREP10-NEXT:    ori r3, r3, 19025
3049; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
3050; CHECK-PREP10-NEXT:    lbz r3, 0(r3)
3051; CHECK-PREP10-NEXT:    blr
3052entry:
3053  %0 = load i8, ptr inttoptr (i64 1000000000000 to ptr), align 4096
3054  ret i8 %0
3055}
3056
3057; Function Attrs: norecurse nounwind readonly uwtable willreturn
3058define dso_local zeroext i8 @ld_0_uint8_t_uint16_t(i64 %ptr) {
3059; CHECK-LE-LABEL: ld_0_uint8_t_uint16_t:
3060; CHECK-LE:       # %bb.0: # %entry
3061; CHECK-LE-NEXT:    lbz r3, 0(r3)
3062; CHECK-LE-NEXT:    blr
3063;
3064; CHECK-BE-LABEL: ld_0_uint8_t_uint16_t:
3065; CHECK-BE:       # %bb.0: # %entry
3066; CHECK-BE-NEXT:    lbz r3, 1(r3)
3067; CHECK-BE-NEXT:    blr
3068entry:
3069  %0 = inttoptr i64 %ptr to ptr
3070  %1 = load i16, ptr %0, align 2
3071  %conv = trunc i16 %1 to i8
3072  ret i8 %conv
3073}
3074
3075; Function Attrs: norecurse nounwind readonly uwtable willreturn
3076define dso_local zeroext i8 @ld_align16_uint8_t_uint16_t(ptr nocapture readonly %ptr) {
3077; CHECK-LE-LABEL: ld_align16_uint8_t_uint16_t:
3078; CHECK-LE:       # %bb.0: # %entry
3079; CHECK-LE-NEXT:    lbz r3, 8(r3)
3080; CHECK-LE-NEXT:    blr
3081;
3082; CHECK-BE-LABEL: ld_align16_uint8_t_uint16_t:
3083; CHECK-BE:       # %bb.0: # %entry
3084; CHECK-BE-NEXT:    lbz r3, 9(r3)
3085; CHECK-BE-NEXT:    blr
3086entry:
3087  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3088  %0 = load i16, ptr %add.ptr, align 2
3089  %conv = trunc i16 %0 to i8
3090  ret i8 %conv
3091}
3092
3093; Function Attrs: norecurse nounwind readonly uwtable willreturn
3094define dso_local zeroext i8 @ld_align32_uint8_t_uint16_t(ptr nocapture readonly %ptr) {
3095; CHECK-P10-LE-LABEL: ld_align32_uint8_t_uint16_t:
3096; CHECK-P10-LE:       # %bb.0: # %entry
3097; CHECK-P10-LE-NEXT:    plbz r3, 99999000(r3), 0
3098; CHECK-P10-LE-NEXT:    blr
3099;
3100; CHECK-P10-BE-LABEL: ld_align32_uint8_t_uint16_t:
3101; CHECK-P10-BE:       # %bb.0: # %entry
3102; CHECK-P10-BE-NEXT:    plbz r3, 99999001(r3), 0
3103; CHECK-P10-BE-NEXT:    blr
3104;
3105; CHECK-P9-LE-LABEL: ld_align32_uint8_t_uint16_t:
3106; CHECK-P9-LE:       # %bb.0: # %entry
3107; CHECK-P9-LE-NEXT:    lis r4, 1525
3108; CHECK-P9-LE-NEXT:    ori r4, r4, 56600
3109; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
3110; CHECK-P9-LE-NEXT:    blr
3111;
3112; CHECK-P9-BE-LABEL: ld_align32_uint8_t_uint16_t:
3113; CHECK-P9-BE:       # %bb.0: # %entry
3114; CHECK-P9-BE-NEXT:    lis r4, 1525
3115; CHECK-P9-BE-NEXT:    ori r4, r4, 56601
3116; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
3117; CHECK-P9-BE-NEXT:    blr
3118;
3119; CHECK-P8-LE-LABEL: ld_align32_uint8_t_uint16_t:
3120; CHECK-P8-LE:       # %bb.0: # %entry
3121; CHECK-P8-LE-NEXT:    lis r4, 1525
3122; CHECK-P8-LE-NEXT:    ori r4, r4, 56600
3123; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
3124; CHECK-P8-LE-NEXT:    blr
3125;
3126; CHECK-P8-BE-LABEL: ld_align32_uint8_t_uint16_t:
3127; CHECK-P8-BE:       # %bb.0: # %entry
3128; CHECK-P8-BE-NEXT:    lis r4, 1525
3129; CHECK-P8-BE-NEXT:    ori r4, r4, 56601
3130; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
3131; CHECK-P8-BE-NEXT:    blr
3132entry:
3133  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3134  %0 = load i16, ptr %add.ptr, align 2
3135  %conv = trunc i16 %0 to i8
3136  ret i8 %conv
3137}
3138
3139; Function Attrs: norecurse nounwind readonly uwtable willreturn
3140define dso_local zeroext i8 @ld_unalign64_uint8_t_uint16_t(ptr nocapture readonly %ptr) {
3141; CHECK-P10-LE-LABEL: ld_unalign64_uint8_t_uint16_t:
3142; CHECK-P10-LE:       # %bb.0: # %entry
3143; CHECK-P10-LE-NEXT:    pli r4, 232
3144; CHECK-P10-LE-NEXT:    pli r5, 3567587329
3145; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
3146; CHECK-P10-LE-NEXT:    lbzx r3, r3, r5
3147; CHECK-P10-LE-NEXT:    blr
3148;
3149; CHECK-P10-BE-LABEL: ld_unalign64_uint8_t_uint16_t:
3150; CHECK-P10-BE:       # %bb.0: # %entry
3151; CHECK-P10-BE-NEXT:    pli r4, 232
3152; CHECK-P10-BE-NEXT:    pli r5, 3567587330
3153; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
3154; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
3155; CHECK-P10-BE-NEXT:    blr
3156;
3157; CHECK-P9-LE-LABEL: ld_unalign64_uint8_t_uint16_t:
3158; CHECK-P9-LE:       # %bb.0: # %entry
3159; CHECK-P9-LE-NEXT:    li r4, 29
3160; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
3161; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
3162; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
3163; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
3164; CHECK-P9-LE-NEXT:    blr
3165;
3166; CHECK-P9-BE-LABEL: ld_unalign64_uint8_t_uint16_t:
3167; CHECK-P9-BE:       # %bb.0: # %entry
3168; CHECK-P9-BE-NEXT:    li r4, 29
3169; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
3170; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
3171; CHECK-P9-BE-NEXT:    ori r4, r4, 4098
3172; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
3173; CHECK-P9-BE-NEXT:    blr
3174;
3175; CHECK-P8-LE-LABEL: ld_unalign64_uint8_t_uint16_t:
3176; CHECK-P8-LE:       # %bb.0: # %entry
3177; CHECK-P8-LE-NEXT:    li r4, 29
3178; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
3179; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
3180; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
3181; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
3182; CHECK-P8-LE-NEXT:    blr
3183;
3184; CHECK-P8-BE-LABEL: ld_unalign64_uint8_t_uint16_t:
3185; CHECK-P8-BE:       # %bb.0: # %entry
3186; CHECK-P8-BE-NEXT:    li r4, 29
3187; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
3188; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
3189; CHECK-P8-BE-NEXT:    ori r4, r4, 4098
3190; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
3191; CHECK-P8-BE-NEXT:    blr
3192entry:
3193  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000001
3194  %0 = load i16, ptr %add.ptr, align 2
3195  %conv = trunc i16 %0 to i8
3196  ret i8 %conv
3197}
3198
3199; Function Attrs: norecurse nounwind readonly uwtable willreturn
3200define dso_local zeroext i8 @ld_align64_uint8_t_uint16_t(ptr nocapture readonly %ptr) {
3201; CHECK-P10-LE-LABEL: ld_align64_uint8_t_uint16_t:
3202; CHECK-P10-LE:       # %bb.0: # %entry
3203; CHECK-P10-LE-NEXT:    pli r4, 244140625
3204; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
3205; CHECK-P10-LE-NEXT:    lbzx r3, r3, r4
3206; CHECK-P10-LE-NEXT:    blr
3207;
3208; CHECK-P10-BE-LABEL: ld_align64_uint8_t_uint16_t:
3209; CHECK-P10-BE:       # %bb.0: # %entry
3210; CHECK-P10-BE-NEXT:    pli r4, 232
3211; CHECK-P10-BE-NEXT:    pli r5, 3567587329
3212; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
3213; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
3214; CHECK-P10-BE-NEXT:    blr
3215;
3216; CHECK-P9-LE-LABEL: ld_align64_uint8_t_uint16_t:
3217; CHECK-P9-LE:       # %bb.0: # %entry
3218; CHECK-P9-LE-NEXT:    lis r4, 3725
3219; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
3220; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
3221; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
3222; CHECK-P9-LE-NEXT:    blr
3223;
3224; CHECK-P9-BE-LABEL: ld_align64_uint8_t_uint16_t:
3225; CHECK-P9-BE:       # %bb.0: # %entry
3226; CHECK-P9-BE-NEXT:    li r4, 29
3227; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
3228; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
3229; CHECK-P9-BE-NEXT:    ori r4, r4, 4097
3230; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
3231; CHECK-P9-BE-NEXT:    blr
3232;
3233; CHECK-P8-LE-LABEL: ld_align64_uint8_t_uint16_t:
3234; CHECK-P8-LE:       # %bb.0: # %entry
3235; CHECK-P8-LE-NEXT:    lis r4, 3725
3236; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
3237; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
3238; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
3239; CHECK-P8-LE-NEXT:    blr
3240;
3241; CHECK-P8-BE-LABEL: ld_align64_uint8_t_uint16_t:
3242; CHECK-P8-BE:       # %bb.0: # %entry
3243; CHECK-P8-BE-NEXT:    li r4, 29
3244; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
3245; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
3246; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
3247; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
3248; CHECK-P8-BE-NEXT:    blr
3249entry:
3250  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3251  %0 = load i16, ptr %add.ptr, align 2
3252  %conv = trunc i16 %0 to i8
3253  ret i8 %conv
3254}
3255
3256; Function Attrs: norecurse nounwind readonly uwtable willreturn
3257define dso_local zeroext i8 @ld_reg_uint8_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) {
3258; CHECK-LE-LABEL: ld_reg_uint8_t_uint16_t:
3259; CHECK-LE:       # %bb.0: # %entry
3260; CHECK-LE-NEXT:    lbzx r3, r3, r4
3261; CHECK-LE-NEXT:    blr
3262;
3263; CHECK-BE-LABEL: ld_reg_uint8_t_uint16_t:
3264; CHECK-BE:       # %bb.0: # %entry
3265; CHECK-BE-NEXT:    add r3, r3, r4
3266; CHECK-BE-NEXT:    lbz r3, 1(r3)
3267; CHECK-BE-NEXT:    blr
3268entry:
3269  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3270  %0 = load i16, ptr %add.ptr, align 2
3271  %conv = trunc i16 %0 to i8
3272  ret i8 %conv
3273}
3274
3275; Function Attrs: norecurse nounwind readonly uwtable willreturn
3276define dso_local zeroext i8 @ld_or_uint8_t_uint16_t(i64 %ptr, i8 zeroext %off) {
3277; CHECK-LE-LABEL: ld_or_uint8_t_uint16_t:
3278; CHECK-LE:       # %bb.0: # %entry
3279; CHECK-LE-NEXT:    or r3, r4, r3
3280; CHECK-LE-NEXT:    lbz r3, 0(r3)
3281; CHECK-LE-NEXT:    blr
3282;
3283; CHECK-BE-LABEL: ld_or_uint8_t_uint16_t:
3284; CHECK-BE:       # %bb.0: # %entry
3285; CHECK-BE-NEXT:    or r3, r4, r3
3286; CHECK-BE-NEXT:    lbz r3, 1(r3)
3287; CHECK-BE-NEXT:    blr
3288entry:
3289  %conv = zext i8 %off to i64
3290  %or = or i64 %conv, %ptr
3291  %0 = inttoptr i64 %or to ptr
3292  %1 = load i16, ptr %0, align 2
3293  %conv1 = trunc i16 %1 to i8
3294  ret i8 %conv1
3295}
3296
3297; Function Attrs: norecurse nounwind readonly uwtable willreturn
3298define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_uint16_t(i64 %ptr) {
3299; CHECK-LE-LABEL: ld_not_disjoint16_uint8_t_uint16_t:
3300; CHECK-LE:       # %bb.0: # %entry
3301; CHECK-LE-NEXT:    ori r3, r3, 6
3302; CHECK-LE-NEXT:    lbz r3, 0(r3)
3303; CHECK-LE-NEXT:    blr
3304;
3305; CHECK-BE-LABEL: ld_not_disjoint16_uint8_t_uint16_t:
3306; CHECK-BE:       # %bb.0: # %entry
3307; CHECK-BE-NEXT:    ori r3, r3, 6
3308; CHECK-BE-NEXT:    lbz r3, 1(r3)
3309; CHECK-BE-NEXT:    blr
3310entry:
3311  %or = or i64 %ptr, 6
3312  %0 = inttoptr i64 %or to ptr
3313  %1 = load i16, ptr %0, align 2
3314  %conv = trunc i16 %1 to i8
3315  ret i8 %conv
3316}
3317
3318; Function Attrs: norecurse nounwind readonly uwtable willreturn
3319define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_uint16_t(i64 %ptr) {
3320; CHECK-LE-LABEL: ld_disjoint_align16_uint8_t_uint16_t:
3321; CHECK-LE:       # %bb.0: # %entry
3322; CHECK-LE-NEXT:    rldicr r3, r3, 0, 51
3323; CHECK-LE-NEXT:    lbz r3, 24(r3)
3324; CHECK-LE-NEXT:    blr
3325;
3326; CHECK-BE-LABEL: ld_disjoint_align16_uint8_t_uint16_t:
3327; CHECK-BE:       # %bb.0: # %entry
3328; CHECK-BE-NEXT:    rldicr r3, r3, 0, 51
3329; CHECK-BE-NEXT:    lbz r3, 25(r3)
3330; CHECK-BE-NEXT:    blr
3331entry:
3332  %and = and i64 %ptr, -4096
3333  %or = or i64 %and, 24
3334  %0 = inttoptr i64 %or to ptr
3335  %1 = load i16, ptr %0, align 8
3336  %conv = trunc i16 %1 to i8
3337  ret i8 %conv
3338}
3339
3340; Function Attrs: norecurse nounwind readonly uwtable willreturn
3341define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_uint16_t(i64 %ptr) {
3342; CHECK-LE-LABEL: ld_not_disjoint32_uint8_t_uint16_t:
3343; CHECK-LE:       # %bb.0: # %entry
3344; CHECK-LE-NEXT:    ori r3, r3, 34463
3345; CHECK-LE-NEXT:    oris r3, r3, 1
3346; CHECK-LE-NEXT:    lbz r3, 0(r3)
3347; CHECK-LE-NEXT:    blr
3348;
3349; CHECK-BE-LABEL: ld_not_disjoint32_uint8_t_uint16_t:
3350; CHECK-BE:       # %bb.0: # %entry
3351; CHECK-BE-NEXT:    ori r3, r3, 34463
3352; CHECK-BE-NEXT:    oris r3, r3, 1
3353; CHECK-BE-NEXT:    lbz r3, 1(r3)
3354; CHECK-BE-NEXT:    blr
3355entry:
3356  %or = or i64 %ptr, 99999
3357  %0 = inttoptr i64 %or to ptr
3358  %1 = load i16, ptr %0, align 2
3359  %conv = trunc i16 %1 to i8
3360  ret i8 %conv
3361}
3362
3363; Function Attrs: norecurse nounwind readonly uwtable willreturn
3364define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_uint16_t(i64 %ptr) {
3365; CHECK-P10-LE-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
3366; CHECK-P10-LE:       # %bb.0: # %entry
3367; CHECK-P10-LE-NEXT:    lis r4, -15264
3368; CHECK-P10-LE-NEXT:    and r3, r3, r4
3369; CHECK-P10-LE-NEXT:    plbz r3, 999990000(r3), 0
3370; CHECK-P10-LE-NEXT:    blr
3371;
3372; CHECK-P10-BE-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
3373; CHECK-P10-BE:       # %bb.0: # %entry
3374; CHECK-P10-BE-NEXT:    lis r4, -15264
3375; CHECK-P10-BE-NEXT:    and r3, r3, r4
3376; CHECK-P10-BE-NEXT:    plbz r3, 999990001(r3), 0
3377; CHECK-P10-BE-NEXT:    blr
3378;
3379; CHECK-P9-LE-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
3380; CHECK-P9-LE:       # %bb.0: # %entry
3381; CHECK-P9-LE-NEXT:    lis r4, -15264
3382; CHECK-P9-LE-NEXT:    and r3, r3, r4
3383; CHECK-P9-LE-NEXT:    lis r4, 15258
3384; CHECK-P9-LE-NEXT:    ori r4, r4, 41712
3385; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
3386; CHECK-P9-LE-NEXT:    blr
3387;
3388; CHECK-P9-BE-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
3389; CHECK-P9-BE:       # %bb.0: # %entry
3390; CHECK-P9-BE-NEXT:    lis r4, -15264
3391; CHECK-P9-BE-NEXT:    and r3, r3, r4
3392; CHECK-P9-BE-NEXT:    lis r4, 15258
3393; CHECK-P9-BE-NEXT:    ori r4, r4, 41713
3394; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
3395; CHECK-P9-BE-NEXT:    blr
3396;
3397; CHECK-P8-LE-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
3398; CHECK-P8-LE:       # %bb.0: # %entry
3399; CHECK-P8-LE-NEXT:    lis r4, -15264
3400; CHECK-P8-LE-NEXT:    and r3, r3, r4
3401; CHECK-P8-LE-NEXT:    lis r4, 15258
3402; CHECK-P8-LE-NEXT:    ori r4, r4, 41712
3403; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
3404; CHECK-P8-LE-NEXT:    blr
3405;
3406; CHECK-P8-BE-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
3407; CHECK-P8-BE:       # %bb.0: # %entry
3408; CHECK-P8-BE-NEXT:    lis r4, -15264
3409; CHECK-P8-BE-NEXT:    and r3, r3, r4
3410; CHECK-P8-BE-NEXT:    lis r4, 15258
3411; CHECK-P8-BE-NEXT:    ori r4, r4, 41713
3412; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
3413; CHECK-P8-BE-NEXT:    blr
3414entry:
3415  %and = and i64 %ptr, -1000341504
3416  %or = or i64 %and, 999990000
3417  %0 = inttoptr i64 %or to ptr
3418  %1 = load i16, ptr %0, align 16
3419  %conv = trunc i16 %1 to i8
3420  ret i8 %conv
3421}
3422
3423; Function Attrs: norecurse nounwind readonly uwtable willreturn
3424define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_uint16_t(i64 %ptr) {
3425; CHECK-P10-LE-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
3426; CHECK-P10-LE:       # %bb.0: # %entry
3427; CHECK-P10-LE-NEXT:    pli r4, 232
3428; CHECK-P10-LE-NEXT:    pli r5, 3567587329
3429; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
3430; CHECK-P10-LE-NEXT:    or r3, r3, r5
3431; CHECK-P10-LE-NEXT:    lbz r3, 0(r3)
3432; CHECK-P10-LE-NEXT:    blr
3433;
3434; CHECK-P10-BE-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
3435; CHECK-P10-BE:       # %bb.0: # %entry
3436; CHECK-P10-BE-NEXT:    pli r4, 232
3437; CHECK-P10-BE-NEXT:    pli r5, 3567587329
3438; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
3439; CHECK-P10-BE-NEXT:    or r3, r3, r5
3440; CHECK-P10-BE-NEXT:    lbz r3, 1(r3)
3441; CHECK-P10-BE-NEXT:    blr
3442;
3443; CHECK-P9-LE-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
3444; CHECK-P9-LE:       # %bb.0: # %entry
3445; CHECK-P9-LE-NEXT:    li r4, 29
3446; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
3447; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
3448; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
3449; CHECK-P9-LE-NEXT:    or r3, r3, r4
3450; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
3451; CHECK-P9-LE-NEXT:    blr
3452;
3453; CHECK-P9-BE-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
3454; CHECK-P9-BE:       # %bb.0: # %entry
3455; CHECK-P9-BE-NEXT:    li r4, 29
3456; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
3457; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
3458; CHECK-P9-BE-NEXT:    ori r4, r4, 4097
3459; CHECK-P9-BE-NEXT:    or r3, r3, r4
3460; CHECK-P9-BE-NEXT:    lbz r3, 1(r3)
3461; CHECK-P9-BE-NEXT:    blr
3462;
3463; CHECK-P8-LE-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
3464; CHECK-P8-LE:       # %bb.0: # %entry
3465; CHECK-P8-LE-NEXT:    li r4, 29
3466; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
3467; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
3468; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
3469; CHECK-P8-LE-NEXT:    or r3, r3, r4
3470; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
3471; CHECK-P8-LE-NEXT:    blr
3472;
3473; CHECK-P8-BE-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
3474; CHECK-P8-BE:       # %bb.0: # %entry
3475; CHECK-P8-BE-NEXT:    li r4, 29
3476; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
3477; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
3478; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
3479; CHECK-P8-BE-NEXT:    or r3, r3, r4
3480; CHECK-P8-BE-NEXT:    lbz r3, 1(r3)
3481; CHECK-P8-BE-NEXT:    blr
3482entry:
3483  %or = or i64 %ptr, 1000000000001
3484  %0 = inttoptr i64 %or to ptr
3485  %1 = load i16, ptr %0, align 2
3486  %conv = trunc i16 %1 to i8
3487  ret i8 %conv
3488}
3489
3490; Function Attrs: norecurse nounwind readonly uwtable willreturn
3491define dso_local zeroext i8 @ld_disjoint_unalign64_uint8_t_uint16_t(i64 %ptr) {
3492; CHECK-P10-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint16_t:
3493; CHECK-P10-LE:       # %bb.0: # %entry
3494; CHECK-P10-LE-NEXT:    pli r4, 232
3495; CHECK-P10-LE-NEXT:    pli r5, 3567587329
3496; CHECK-P10-LE-NEXT:    rldicr r3, r3, 0, 23
3497; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
3498; CHECK-P10-LE-NEXT:    lbzx r3, r3, r5
3499; CHECK-P10-LE-NEXT:    blr
3500;
3501; CHECK-P10-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint16_t:
3502; CHECK-P10-BE:       # %bb.0: # %entry
3503; CHECK-P10-BE-NEXT:    pli r4, 232
3504; CHECK-P10-BE-NEXT:    pli r5, 3567587330
3505; CHECK-P10-BE-NEXT:    rldicr r3, r3, 0, 23
3506; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
3507; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
3508; CHECK-P10-BE-NEXT:    blr
3509;
3510; CHECK-P9-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint16_t:
3511; CHECK-P9-LE:       # %bb.0: # %entry
3512; CHECK-P9-LE-NEXT:    li r4, 29
3513; CHECK-P9-LE-NEXT:    rldicr r3, r3, 0, 23
3514; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
3515; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
3516; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
3517; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
3518; CHECK-P9-LE-NEXT:    blr
3519;
3520; CHECK-P9-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint16_t:
3521; CHECK-P9-BE:       # %bb.0: # %entry
3522; CHECK-P9-BE-NEXT:    li r4, 29
3523; CHECK-P9-BE-NEXT:    rldicr r3, r3, 0, 23
3524; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
3525; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
3526; CHECK-P9-BE-NEXT:    ori r4, r4, 4098
3527; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
3528; CHECK-P9-BE-NEXT:    blr
3529;
3530; CHECK-P8-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint16_t:
3531; CHECK-P8-LE:       # %bb.0: # %entry
3532; CHECK-P8-LE-NEXT:    li r4, 29
3533; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
3534; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
3535; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
3536; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
3537; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
3538; CHECK-P8-LE-NEXT:    blr
3539;
3540; CHECK-P8-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint16_t:
3541; CHECK-P8-BE:       # %bb.0: # %entry
3542; CHECK-P8-BE-NEXT:    li r4, 29
3543; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
3544; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
3545; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
3546; CHECK-P8-BE-NEXT:    ori r4, r4, 4098
3547; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
3548; CHECK-P8-BE-NEXT:    blr
3549entry:
3550  %and = and i64 %ptr, -1099511627776
3551  %or = or i64 %and, 1000000000001
3552  %0 = inttoptr i64 %or to ptr
3553  %1 = load i16, ptr %0, align 2
3554  %conv = trunc i16 %1 to i8
3555  ret i8 %conv
3556}
3557
3558; Function Attrs: norecurse nounwind readonly uwtable willreturn
3559define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_uint16_t(i64 %ptr) {
3560; CHECK-P10-LE-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
3561; CHECK-P10-LE:       # %bb.0: # %entry
3562; CHECK-P10-LE-NEXT:    pli r4, 244140625
3563; CHECK-P10-LE-NEXT:    rldicr r3, r3, 0, 23
3564; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
3565; CHECK-P10-LE-NEXT:    lbzx r3, r3, r4
3566; CHECK-P10-LE-NEXT:    blr
3567;
3568; CHECK-P10-BE-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
3569; CHECK-P10-BE:       # %bb.0: # %entry
3570; CHECK-P10-BE-NEXT:    pli r4, 232
3571; CHECK-P10-BE-NEXT:    pli r5, 3567587329
3572; CHECK-P10-BE-NEXT:    rldicr r3, r3, 0, 23
3573; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
3574; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
3575; CHECK-P10-BE-NEXT:    blr
3576;
3577; CHECK-P9-LE-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
3578; CHECK-P9-LE:       # %bb.0: # %entry
3579; CHECK-P9-LE-NEXT:    lis r4, 3725
3580; CHECK-P9-LE-NEXT:    rldicr r3, r3, 0, 23
3581; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
3582; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
3583; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
3584; CHECK-P9-LE-NEXT:    blr
3585;
3586; CHECK-P9-BE-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
3587; CHECK-P9-BE:       # %bb.0: # %entry
3588; CHECK-P9-BE-NEXT:    li r4, 29
3589; CHECK-P9-BE-NEXT:    rldicr r3, r3, 0, 23
3590; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
3591; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
3592; CHECK-P9-BE-NEXT:    ori r4, r4, 4097
3593; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
3594; CHECK-P9-BE-NEXT:    blr
3595;
3596; CHECK-P8-LE-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
3597; CHECK-P8-LE:       # %bb.0: # %entry
3598; CHECK-P8-LE-NEXT:    lis r4, 3725
3599; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
3600; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
3601; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
3602; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
3603; CHECK-P8-LE-NEXT:    blr
3604;
3605; CHECK-P8-BE-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
3606; CHECK-P8-BE:       # %bb.0: # %entry
3607; CHECK-P8-BE-NEXT:    li r4, 29
3608; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
3609; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
3610; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
3611; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
3612; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
3613; CHECK-P8-BE-NEXT:    blr
3614entry:
3615  %and = and i64 %ptr, -1099511627776
3616  %or = or i64 %and, 1000000000000
3617  %0 = inttoptr i64 %or to ptr
3618  %1 = load i16, ptr %0, align 4096
3619  %conv = trunc i16 %1 to i8
3620  ret i8 %conv
3621}
3622
3623; Function Attrs: norecurse nounwind readonly uwtable willreturn
3624define dso_local zeroext i8 @ld_cst_align16_uint8_t_uint16_t() {
3625; CHECK-LE-LABEL: ld_cst_align16_uint8_t_uint16_t:
3626; CHECK-LE:       # %bb.0: # %entry
3627; CHECK-LE-NEXT:    lbz r3, 4080(0)
3628; CHECK-LE-NEXT:    blr
3629;
3630; CHECK-BE-LABEL: ld_cst_align16_uint8_t_uint16_t:
3631; CHECK-BE:       # %bb.0: # %entry
3632; CHECK-BE-NEXT:    lbz r3, 4081(0)
3633; CHECK-BE-NEXT:    blr
3634entry:
3635  %0 = load i16, ptr inttoptr (i64 4080 to ptr), align 16
3636  %conv = trunc i16 %0 to i8
3637  ret i8 %conv
3638}
3639
3640; Function Attrs: norecurse nounwind readonly uwtable willreturn
3641define dso_local zeroext i8 @ld_cst_align32_uint8_t_uint16_t() {
3642; CHECK-LE-LABEL: ld_cst_align32_uint8_t_uint16_t:
3643; CHECK-LE:       # %bb.0: # %entry
3644; CHECK-LE-NEXT:    lis r3, 153
3645; CHECK-LE-NEXT:    lbz r3, -27108(r3)
3646; CHECK-LE-NEXT:    blr
3647;
3648; CHECK-BE-LABEL: ld_cst_align32_uint8_t_uint16_t:
3649; CHECK-BE:       # %bb.0: # %entry
3650; CHECK-BE-NEXT:    lis r3, 153
3651; CHECK-BE-NEXT:    lbz r3, -27107(r3)
3652; CHECK-BE-NEXT:    blr
3653entry:
3654  %0 = load i16, ptr inttoptr (i64 9999900 to ptr), align 4
3655  %conv = trunc i16 %0 to i8
3656  ret i8 %conv
3657}
3658
3659; Function Attrs: norecurse nounwind readonly uwtable willreturn
3660define dso_local zeroext i8 @ld_cst_unalign64_uint8_t_uint16_t() {
3661; CHECK-P10-LE-LABEL: ld_cst_unalign64_uint8_t_uint16_t:
3662; CHECK-P10-LE:       # %bb.0: # %entry
3663; CHECK-P10-LE-NEXT:    pli r3, 232
3664; CHECK-P10-LE-NEXT:    pli r4, 3567587329
3665; CHECK-P10-LE-NEXT:    rldimi r4, r3, 32, 0
3666; CHECK-P10-LE-NEXT:    lbz r3, 0(r4)
3667; CHECK-P10-LE-NEXT:    blr
3668;
3669; CHECK-P10-BE-LABEL: ld_cst_unalign64_uint8_t_uint16_t:
3670; CHECK-P10-BE:       # %bb.0: # %entry
3671; CHECK-P10-BE-NEXT:    pli r3, 232
3672; CHECK-P10-BE-NEXT:    pli r4, 3567587330
3673; CHECK-P10-BE-NEXT:    rldimi r4, r3, 32, 0
3674; CHECK-P10-BE-NEXT:    lbz r3, 0(r4)
3675; CHECK-P10-BE-NEXT:    blr
3676;
3677; CHECK-P9-LE-LABEL: ld_cst_unalign64_uint8_t_uint16_t:
3678; CHECK-P9-LE:       # %bb.0: # %entry
3679; CHECK-P9-LE-NEXT:    li r3, 29
3680; CHECK-P9-LE-NEXT:    rldic r3, r3, 35, 24
3681; CHECK-P9-LE-NEXT:    oris r3, r3, 54437
3682; CHECK-P9-LE-NEXT:    ori r3, r3, 4097
3683; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
3684; CHECK-P9-LE-NEXT:    blr
3685;
3686; CHECK-P9-BE-LABEL: ld_cst_unalign64_uint8_t_uint16_t:
3687; CHECK-P9-BE:       # %bb.0: # %entry
3688; CHECK-P9-BE-NEXT:    li r3, 29
3689; CHECK-P9-BE-NEXT:    rldic r3, r3, 35, 24
3690; CHECK-P9-BE-NEXT:    oris r3, r3, 54437
3691; CHECK-P9-BE-NEXT:    ori r3, r3, 4098
3692; CHECK-P9-BE-NEXT:    lbz r3, 0(r3)
3693; CHECK-P9-BE-NEXT:    blr
3694;
3695; CHECK-P8-LE-LABEL: ld_cst_unalign64_uint8_t_uint16_t:
3696; CHECK-P8-LE:       # %bb.0: # %entry
3697; CHECK-P8-LE-NEXT:    li r3, 29
3698; CHECK-P8-LE-NEXT:    rldic r3, r3, 35, 24
3699; CHECK-P8-LE-NEXT:    oris r3, r3, 54437
3700; CHECK-P8-LE-NEXT:    ori r3, r3, 4097
3701; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
3702; CHECK-P8-LE-NEXT:    blr
3703;
3704; CHECK-P8-BE-LABEL: ld_cst_unalign64_uint8_t_uint16_t:
3705; CHECK-P8-BE:       # %bb.0: # %entry
3706; CHECK-P8-BE-NEXT:    li r3, 29
3707; CHECK-P8-BE-NEXT:    rldic r3, r3, 35, 24
3708; CHECK-P8-BE-NEXT:    oris r3, r3, 54437
3709; CHECK-P8-BE-NEXT:    ori r3, r3, 4098
3710; CHECK-P8-BE-NEXT:    lbz r3, 0(r3)
3711; CHECK-P8-BE-NEXT:    blr
3712entry:
3713  %0 = load i16, ptr inttoptr (i64 1000000000001 to ptr), align 2
3714  %conv = trunc i16 %0 to i8
3715  ret i8 %conv
3716}
3717
3718; Function Attrs: norecurse nounwind readonly uwtable willreturn
3719define dso_local zeroext i8 @ld_cst_align64_uint8_t_uint16_t() {
3720; CHECK-P10-LE-LABEL: ld_cst_align64_uint8_t_uint16_t:
3721; CHECK-P10-LE:       # %bb.0: # %entry
3722; CHECK-P10-LE-NEXT:    pli r3, 244140625
3723; CHECK-P10-LE-NEXT:    rldic r3, r3, 12, 24
3724; CHECK-P10-LE-NEXT:    lbz r3, 0(r3)
3725; CHECK-P10-LE-NEXT:    blr
3726;
3727; CHECK-P10-BE-LABEL: ld_cst_align64_uint8_t_uint16_t:
3728; CHECK-P10-BE:       # %bb.0: # %entry
3729; CHECK-P10-BE-NEXT:    pli r3, 232
3730; CHECK-P10-BE-NEXT:    pli r4, 3567587329
3731; CHECK-P10-BE-NEXT:    rldimi r4, r3, 32, 0
3732; CHECK-P10-BE-NEXT:    lbz r3, 0(r4)
3733; CHECK-P10-BE-NEXT:    blr
3734;
3735; CHECK-P9-LE-LABEL: ld_cst_align64_uint8_t_uint16_t:
3736; CHECK-P9-LE:       # %bb.0: # %entry
3737; CHECK-P9-LE-NEXT:    lis r3, 3725
3738; CHECK-P9-LE-NEXT:    ori r3, r3, 19025
3739; CHECK-P9-LE-NEXT:    rldic r3, r3, 12, 24
3740; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
3741; CHECK-P9-LE-NEXT:    blr
3742;
3743; CHECK-P9-BE-LABEL: ld_cst_align64_uint8_t_uint16_t:
3744; CHECK-P9-BE:       # %bb.0: # %entry
3745; CHECK-P9-BE-NEXT:    li r3, 29
3746; CHECK-P9-BE-NEXT:    rldic r3, r3, 35, 24
3747; CHECK-P9-BE-NEXT:    oris r3, r3, 54437
3748; CHECK-P9-BE-NEXT:    ori r3, r3, 4097
3749; CHECK-P9-BE-NEXT:    lbz r3, 0(r3)
3750; CHECK-P9-BE-NEXT:    blr
3751;
3752; CHECK-P8-LE-LABEL: ld_cst_align64_uint8_t_uint16_t:
3753; CHECK-P8-LE:       # %bb.0: # %entry
3754; CHECK-P8-LE-NEXT:    lis r3, 3725
3755; CHECK-P8-LE-NEXT:    ori r3, r3, 19025
3756; CHECK-P8-LE-NEXT:    rldic r3, r3, 12, 24
3757; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
3758; CHECK-P8-LE-NEXT:    blr
3759;
3760; CHECK-P8-BE-LABEL: ld_cst_align64_uint8_t_uint16_t:
3761; CHECK-P8-BE:       # %bb.0: # %entry
3762; CHECK-P8-BE-NEXT:    li r3, 29
3763; CHECK-P8-BE-NEXT:    rldic r3, r3, 35, 24
3764; CHECK-P8-BE-NEXT:    oris r3, r3, 54437
3765; CHECK-P8-BE-NEXT:    ori r3, r3, 4097
3766; CHECK-P8-BE-NEXT:    lbz r3, 0(r3)
3767; CHECK-P8-BE-NEXT:    blr
3768entry:
3769  %0 = load i16, ptr inttoptr (i64 1000000000000 to ptr), align 4096
3770  %conv = trunc i16 %0 to i8
3771  ret i8 %conv
3772}
3773
3774; Function Attrs: norecurse nounwind readonly uwtable willreturn
3775define dso_local zeroext i8 @ld_0_uint8_t_uint32_t(i64 %ptr) {
3776; CHECK-LE-LABEL: ld_0_uint8_t_uint32_t:
3777; CHECK-LE:       # %bb.0: # %entry
3778; CHECK-LE-NEXT:    lbz r3, 0(r3)
3779; CHECK-LE-NEXT:    blr
3780;
3781; CHECK-BE-LABEL: ld_0_uint8_t_uint32_t:
3782; CHECK-BE:       # %bb.0: # %entry
3783; CHECK-BE-NEXT:    lbz r3, 3(r3)
3784; CHECK-BE-NEXT:    blr
3785entry:
3786  %0 = inttoptr i64 %ptr to ptr
3787  %1 = load i32, ptr %0, align 4
3788  %conv = trunc i32 %1 to i8
3789  ret i8 %conv
3790}
3791
3792; Function Attrs: norecurse nounwind readonly uwtable willreturn
3793define dso_local zeroext i8 @ld_align16_uint8_t_uint32_t(ptr nocapture readonly %ptr) {
3794; CHECK-LE-LABEL: ld_align16_uint8_t_uint32_t:
3795; CHECK-LE:       # %bb.0: # %entry
3796; CHECK-LE-NEXT:    lbz r3, 8(r3)
3797; CHECK-LE-NEXT:    blr
3798;
3799; CHECK-BE-LABEL: ld_align16_uint8_t_uint32_t:
3800; CHECK-BE:       # %bb.0: # %entry
3801; CHECK-BE-NEXT:    lbz r3, 11(r3)
3802; CHECK-BE-NEXT:    blr
3803entry:
3804  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
3805  %0 = load i32, ptr %add.ptr, align 4
3806  %conv = trunc i32 %0 to i8
3807  ret i8 %conv
3808}
3809
3810; Function Attrs: norecurse nounwind readonly uwtable willreturn
3811define dso_local zeroext i8 @ld_align32_uint8_t_uint32_t(ptr nocapture readonly %ptr) {
3812; CHECK-P10-LE-LABEL: ld_align32_uint8_t_uint32_t:
3813; CHECK-P10-LE:       # %bb.0: # %entry
3814; CHECK-P10-LE-NEXT:    plbz r3, 99999000(r3), 0
3815; CHECK-P10-LE-NEXT:    blr
3816;
3817; CHECK-P10-BE-LABEL: ld_align32_uint8_t_uint32_t:
3818; CHECK-P10-BE:       # %bb.0: # %entry
3819; CHECK-P10-BE-NEXT:    plbz r3, 99999003(r3), 0
3820; CHECK-P10-BE-NEXT:    blr
3821;
3822; CHECK-P9-LE-LABEL: ld_align32_uint8_t_uint32_t:
3823; CHECK-P9-LE:       # %bb.0: # %entry
3824; CHECK-P9-LE-NEXT:    lis r4, 1525
3825; CHECK-P9-LE-NEXT:    ori r4, r4, 56600
3826; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
3827; CHECK-P9-LE-NEXT:    blr
3828;
3829; CHECK-P9-BE-LABEL: ld_align32_uint8_t_uint32_t:
3830; CHECK-P9-BE:       # %bb.0: # %entry
3831; CHECK-P9-BE-NEXT:    lis r4, 1525
3832; CHECK-P9-BE-NEXT:    ori r4, r4, 56603
3833; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
3834; CHECK-P9-BE-NEXT:    blr
3835;
3836; CHECK-P8-LE-LABEL: ld_align32_uint8_t_uint32_t:
3837; CHECK-P8-LE:       # %bb.0: # %entry
3838; CHECK-P8-LE-NEXT:    lis r4, 1525
3839; CHECK-P8-LE-NEXT:    ori r4, r4, 56600
3840; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
3841; CHECK-P8-LE-NEXT:    blr
3842;
3843; CHECK-P8-BE-LABEL: ld_align32_uint8_t_uint32_t:
3844; CHECK-P8-BE:       # %bb.0: # %entry
3845; CHECK-P8-BE-NEXT:    lis r4, 1525
3846; CHECK-P8-BE-NEXT:    ori r4, r4, 56603
3847; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
3848; CHECK-P8-BE-NEXT:    blr
3849entry:
3850  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
3851  %0 = load i32, ptr %add.ptr, align 4
3852  %conv = trunc i32 %0 to i8
3853  ret i8 %conv
3854}
3855
3856; Function Attrs: norecurse nounwind readonly uwtable willreturn
3857define dso_local zeroext i8 @ld_unalign64_uint8_t_uint32_t(ptr nocapture readonly %ptr) {
3858; CHECK-P10-LE-LABEL: ld_unalign64_uint8_t_uint32_t:
3859; CHECK-P10-LE:       # %bb.0: # %entry
3860; CHECK-P10-LE-NEXT:    pli r4, 232
3861; CHECK-P10-LE-NEXT:    pli r5, 3567587329
3862; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
3863; CHECK-P10-LE-NEXT:    lbzx r3, r3, r5
3864; CHECK-P10-LE-NEXT:    blr
3865;
3866; CHECK-P10-BE-LABEL: ld_unalign64_uint8_t_uint32_t:
3867; CHECK-P10-BE:       # %bb.0: # %entry
3868; CHECK-P10-BE-NEXT:    pli r4, 232
3869; CHECK-P10-BE-NEXT:    pli r5, 3567587332
3870; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
3871; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
3872; CHECK-P10-BE-NEXT:    blr
3873;
3874; CHECK-P9-LE-LABEL: ld_unalign64_uint8_t_uint32_t:
3875; CHECK-P9-LE:       # %bb.0: # %entry
3876; CHECK-P9-LE-NEXT:    li r4, 29
3877; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
3878; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
3879; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
3880; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
3881; CHECK-P9-LE-NEXT:    blr
3882;
3883; CHECK-P9-BE-LABEL: ld_unalign64_uint8_t_uint32_t:
3884; CHECK-P9-BE:       # %bb.0: # %entry
3885; CHECK-P9-BE-NEXT:    li r4, 29
3886; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
3887; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
3888; CHECK-P9-BE-NEXT:    ori r4, r4, 4100
3889; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
3890; CHECK-P9-BE-NEXT:    blr
3891;
3892; CHECK-P8-LE-LABEL: ld_unalign64_uint8_t_uint32_t:
3893; CHECK-P8-LE:       # %bb.0: # %entry
3894; CHECK-P8-LE-NEXT:    li r4, 29
3895; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
3896; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
3897; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
3898; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
3899; CHECK-P8-LE-NEXT:    blr
3900;
3901; CHECK-P8-BE-LABEL: ld_unalign64_uint8_t_uint32_t:
3902; CHECK-P8-BE:       # %bb.0: # %entry
3903; CHECK-P8-BE-NEXT:    li r4, 29
3904; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
3905; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
3906; CHECK-P8-BE-NEXT:    ori r4, r4, 4100
3907; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
3908; CHECK-P8-BE-NEXT:    blr
3909entry:
3910  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000001
3911  %0 = load i32, ptr %add.ptr, align 4
3912  %conv = trunc i32 %0 to i8
3913  ret i8 %conv
3914}
3915
3916; Function Attrs: norecurse nounwind readonly uwtable willreturn
3917define dso_local zeroext i8 @ld_align64_uint8_t_uint32_t(ptr nocapture readonly %ptr) {
3918; CHECK-P10-LE-LABEL: ld_align64_uint8_t_uint32_t:
3919; CHECK-P10-LE:       # %bb.0: # %entry
3920; CHECK-P10-LE-NEXT:    pli r4, 244140625
3921; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
3922; CHECK-P10-LE-NEXT:    lbzx r3, r3, r4
3923; CHECK-P10-LE-NEXT:    blr
3924;
3925; CHECK-P10-BE-LABEL: ld_align64_uint8_t_uint32_t:
3926; CHECK-P10-BE:       # %bb.0: # %entry
3927; CHECK-P10-BE-NEXT:    pli r4, 232
3928; CHECK-P10-BE-NEXT:    pli r5, 3567587331
3929; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
3930; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
3931; CHECK-P10-BE-NEXT:    blr
3932;
3933; CHECK-P9-LE-LABEL: ld_align64_uint8_t_uint32_t:
3934; CHECK-P9-LE:       # %bb.0: # %entry
3935; CHECK-P9-LE-NEXT:    lis r4, 3725
3936; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
3937; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
3938; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
3939; CHECK-P9-LE-NEXT:    blr
3940;
3941; CHECK-P9-BE-LABEL: ld_align64_uint8_t_uint32_t:
3942; CHECK-P9-BE:       # %bb.0: # %entry
3943; CHECK-P9-BE-NEXT:    li r4, 29
3944; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
3945; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
3946; CHECK-P9-BE-NEXT:    ori r4, r4, 4099
3947; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
3948; CHECK-P9-BE-NEXT:    blr
3949;
3950; CHECK-P8-LE-LABEL: ld_align64_uint8_t_uint32_t:
3951; CHECK-P8-LE:       # %bb.0: # %entry
3952; CHECK-P8-LE-NEXT:    lis r4, 3725
3953; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
3954; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
3955; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
3956; CHECK-P8-LE-NEXT:    blr
3957;
3958; CHECK-P8-BE-LABEL: ld_align64_uint8_t_uint32_t:
3959; CHECK-P8-BE:       # %bb.0: # %entry
3960; CHECK-P8-BE-NEXT:    li r4, 29
3961; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
3962; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
3963; CHECK-P8-BE-NEXT:    ori r4, r4, 4099
3964; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
3965; CHECK-P8-BE-NEXT:    blr
3966entry:
3967  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
3968  %0 = load i32, ptr %add.ptr, align 4
3969  %conv = trunc i32 %0 to i8
3970  ret i8 %conv
3971}
3972
3973; Function Attrs: norecurse nounwind readonly uwtable willreturn
3974define dso_local zeroext i8 @ld_reg_uint8_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) {
3975; CHECK-LE-LABEL: ld_reg_uint8_t_uint32_t:
3976; CHECK-LE:       # %bb.0: # %entry
3977; CHECK-LE-NEXT:    lbzx r3, r3, r4
3978; CHECK-LE-NEXT:    blr
3979;
3980; CHECK-BE-LABEL: ld_reg_uint8_t_uint32_t:
3981; CHECK-BE:       # %bb.0: # %entry
3982; CHECK-BE-NEXT:    add r3, r3, r4
3983; CHECK-BE-NEXT:    lbz r3, 3(r3)
3984; CHECK-BE-NEXT:    blr
3985entry:
3986  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
3987  %0 = load i32, ptr %add.ptr, align 4
3988  %conv = trunc i32 %0 to i8
3989  ret i8 %conv
3990}
3991
3992; Function Attrs: norecurse nounwind readonly uwtable willreturn
3993define dso_local zeroext i8 @ld_or_uint8_t_uint32_t(i64 %ptr, i8 zeroext %off) {
3994; CHECK-LE-LABEL: ld_or_uint8_t_uint32_t:
3995; CHECK-LE:       # %bb.0: # %entry
3996; CHECK-LE-NEXT:    or r3, r4, r3
3997; CHECK-LE-NEXT:    lbz r3, 0(r3)
3998; CHECK-LE-NEXT:    blr
3999;
4000; CHECK-BE-LABEL: ld_or_uint8_t_uint32_t:
4001; CHECK-BE:       # %bb.0: # %entry
4002; CHECK-BE-NEXT:    or r3, r4, r3
4003; CHECK-BE-NEXT:    lbz r3, 3(r3)
4004; CHECK-BE-NEXT:    blr
4005entry:
4006  %conv = zext i8 %off to i64
4007  %or = or i64 %conv, %ptr
4008  %0 = inttoptr i64 %or to ptr
4009  %1 = load i32, ptr %0, align 4
4010  %conv1 = trunc i32 %1 to i8
4011  ret i8 %conv1
4012}
4013
4014; Function Attrs: norecurse nounwind readonly uwtable willreturn
4015define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_uint32_t(i64 %ptr) {
4016; CHECK-LE-LABEL: ld_not_disjoint16_uint8_t_uint32_t:
4017; CHECK-LE:       # %bb.0: # %entry
4018; CHECK-LE-NEXT:    ori r3, r3, 6
4019; CHECK-LE-NEXT:    lbz r3, 0(r3)
4020; CHECK-LE-NEXT:    blr
4021;
4022; CHECK-BE-LABEL: ld_not_disjoint16_uint8_t_uint32_t:
4023; CHECK-BE:       # %bb.0: # %entry
4024; CHECK-BE-NEXT:    ori r3, r3, 6
4025; CHECK-BE-NEXT:    lbz r3, 3(r3)
4026; CHECK-BE-NEXT:    blr
4027entry:
4028  %or = or i64 %ptr, 6
4029  %0 = inttoptr i64 %or to ptr
4030  %1 = load i32, ptr %0, align 4
4031  %conv = trunc i32 %1 to i8
4032  ret i8 %conv
4033}
4034
4035; Function Attrs: norecurse nounwind readonly uwtable willreturn
4036define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_uint32_t(i64 %ptr) {
4037; CHECK-LE-LABEL: ld_disjoint_align16_uint8_t_uint32_t:
4038; CHECK-LE:       # %bb.0: # %entry
4039; CHECK-LE-NEXT:    rldicr r3, r3, 0, 51
4040; CHECK-LE-NEXT:    lbz r3, 24(r3)
4041; CHECK-LE-NEXT:    blr
4042;
4043; CHECK-BE-LABEL: ld_disjoint_align16_uint8_t_uint32_t:
4044; CHECK-BE:       # %bb.0: # %entry
4045; CHECK-BE-NEXT:    rldicr r3, r3, 0, 51
4046; CHECK-BE-NEXT:    lbz r3, 27(r3)
4047; CHECK-BE-NEXT:    blr
4048entry:
4049  %and = and i64 %ptr, -4096
4050  %or = or i64 %and, 24
4051  %0 = inttoptr i64 %or to ptr
4052  %1 = load i32, ptr %0, align 8
4053  %conv = trunc i32 %1 to i8
4054  ret i8 %conv
4055}
4056
4057; Function Attrs: norecurse nounwind readonly uwtable willreturn
4058define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_uint32_t(i64 %ptr) {
4059; CHECK-LE-LABEL: ld_not_disjoint32_uint8_t_uint32_t:
4060; CHECK-LE:       # %bb.0: # %entry
4061; CHECK-LE-NEXT:    ori r3, r3, 34463
4062; CHECK-LE-NEXT:    oris r3, r3, 1
4063; CHECK-LE-NEXT:    lbz r3, 0(r3)
4064; CHECK-LE-NEXT:    blr
4065;
4066; CHECK-BE-LABEL: ld_not_disjoint32_uint8_t_uint32_t:
4067; CHECK-BE:       # %bb.0: # %entry
4068; CHECK-BE-NEXT:    ori r3, r3, 34463
4069; CHECK-BE-NEXT:    oris r3, r3, 1
4070; CHECK-BE-NEXT:    lbz r3, 3(r3)
4071; CHECK-BE-NEXT:    blr
4072entry:
4073  %or = or i64 %ptr, 99999
4074  %0 = inttoptr i64 %or to ptr
4075  %1 = load i32, ptr %0, align 4
4076  %conv = trunc i32 %1 to i8
4077  ret i8 %conv
4078}
4079
4080; Function Attrs: norecurse nounwind readonly uwtable willreturn
4081define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_uint32_t(i64 %ptr) {
4082; CHECK-P10-LE-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
4083; CHECK-P10-LE:       # %bb.0: # %entry
4084; CHECK-P10-LE-NEXT:    lis r4, -15264
4085; CHECK-P10-LE-NEXT:    and r3, r3, r4
4086; CHECK-P10-LE-NEXT:    plbz r3, 999990000(r3), 0
4087; CHECK-P10-LE-NEXT:    blr
4088;
4089; CHECK-P10-BE-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
4090; CHECK-P10-BE:       # %bb.0: # %entry
4091; CHECK-P10-BE-NEXT:    lis r4, -15264
4092; CHECK-P10-BE-NEXT:    and r3, r3, r4
4093; CHECK-P10-BE-NEXT:    plbz r3, 999990003(r3), 0
4094; CHECK-P10-BE-NEXT:    blr
4095;
4096; CHECK-P9-LE-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
4097; CHECK-P9-LE:       # %bb.0: # %entry
4098; CHECK-P9-LE-NEXT:    lis r4, -15264
4099; CHECK-P9-LE-NEXT:    and r3, r3, r4
4100; CHECK-P9-LE-NEXT:    lis r4, 15258
4101; CHECK-P9-LE-NEXT:    ori r4, r4, 41712
4102; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
4103; CHECK-P9-LE-NEXT:    blr
4104;
4105; CHECK-P9-BE-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
4106; CHECK-P9-BE:       # %bb.0: # %entry
4107; CHECK-P9-BE-NEXT:    lis r4, -15264
4108; CHECK-P9-BE-NEXT:    and r3, r3, r4
4109; CHECK-P9-BE-NEXT:    lis r4, 15258
4110; CHECK-P9-BE-NEXT:    ori r4, r4, 41715
4111; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
4112; CHECK-P9-BE-NEXT:    blr
4113;
4114; CHECK-P8-LE-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
4115; CHECK-P8-LE:       # %bb.0: # %entry
4116; CHECK-P8-LE-NEXT:    lis r4, -15264
4117; CHECK-P8-LE-NEXT:    and r3, r3, r4
4118; CHECK-P8-LE-NEXT:    lis r4, 15258
4119; CHECK-P8-LE-NEXT:    ori r4, r4, 41712
4120; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
4121; CHECK-P8-LE-NEXT:    blr
4122;
4123; CHECK-P8-BE-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
4124; CHECK-P8-BE:       # %bb.0: # %entry
4125; CHECK-P8-BE-NEXT:    lis r4, -15264
4126; CHECK-P8-BE-NEXT:    and r3, r3, r4
4127; CHECK-P8-BE-NEXT:    lis r4, 15258
4128; CHECK-P8-BE-NEXT:    ori r4, r4, 41715
4129; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
4130; CHECK-P8-BE-NEXT:    blr
4131entry:
4132  %and = and i64 %ptr, -1000341504
4133  %or = or i64 %and, 999990000
4134  %0 = inttoptr i64 %or to ptr
4135  %1 = load i32, ptr %0, align 16
4136  %conv = trunc i32 %1 to i8
4137  ret i8 %conv
4138}
4139
4140; Function Attrs: norecurse nounwind readonly uwtable willreturn
4141define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_uint32_t(i64 %ptr) {
4142; CHECK-P10-LE-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
4143; CHECK-P10-LE:       # %bb.0: # %entry
4144; CHECK-P10-LE-NEXT:    pli r4, 232
4145; CHECK-P10-LE-NEXT:    pli r5, 3567587329
4146; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
4147; CHECK-P10-LE-NEXT:    or r3, r3, r5
4148; CHECK-P10-LE-NEXT:    lbz r3, 0(r3)
4149; CHECK-P10-LE-NEXT:    blr
4150;
4151; CHECK-P10-BE-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
4152; CHECK-P10-BE:       # %bb.0: # %entry
4153; CHECK-P10-BE-NEXT:    pli r4, 232
4154; CHECK-P10-BE-NEXT:    pli r5, 3567587329
4155; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
4156; CHECK-P10-BE-NEXT:    or r3, r3, r5
4157; CHECK-P10-BE-NEXT:    lbz r3, 3(r3)
4158; CHECK-P10-BE-NEXT:    blr
4159;
4160; CHECK-P9-LE-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
4161; CHECK-P9-LE:       # %bb.0: # %entry
4162; CHECK-P9-LE-NEXT:    li r4, 29
4163; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
4164; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
4165; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
4166; CHECK-P9-LE-NEXT:    or r3, r3, r4
4167; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
4168; CHECK-P9-LE-NEXT:    blr
4169;
4170; CHECK-P9-BE-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
4171; CHECK-P9-BE:       # %bb.0: # %entry
4172; CHECK-P9-BE-NEXT:    li r4, 29
4173; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
4174; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
4175; CHECK-P9-BE-NEXT:    ori r4, r4, 4097
4176; CHECK-P9-BE-NEXT:    or r3, r3, r4
4177; CHECK-P9-BE-NEXT:    lbz r3, 3(r3)
4178; CHECK-P9-BE-NEXT:    blr
4179;
4180; CHECK-P8-LE-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
4181; CHECK-P8-LE:       # %bb.0: # %entry
4182; CHECK-P8-LE-NEXT:    li r4, 29
4183; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
4184; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
4185; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
4186; CHECK-P8-LE-NEXT:    or r3, r3, r4
4187; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
4188; CHECK-P8-LE-NEXT:    blr
4189;
4190; CHECK-P8-BE-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
4191; CHECK-P8-BE:       # %bb.0: # %entry
4192; CHECK-P8-BE-NEXT:    li r4, 29
4193; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
4194; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
4195; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
4196; CHECK-P8-BE-NEXT:    or r3, r3, r4
4197; CHECK-P8-BE-NEXT:    lbz r3, 3(r3)
4198; CHECK-P8-BE-NEXT:    blr
4199entry:
4200  %or = or i64 %ptr, 1000000000001
4201  %0 = inttoptr i64 %or to ptr
4202  %1 = load i32, ptr %0, align 4
4203  %conv = trunc i32 %1 to i8
4204  ret i8 %conv
4205}
4206
4207; Function Attrs: norecurse nounwind readonly uwtable willreturn
4208define dso_local zeroext i8 @ld_disjoint_unalign64_uint8_t_uint32_t(i64 %ptr) {
4209; CHECK-P10-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint32_t:
4210; CHECK-P10-LE:       # %bb.0: # %entry
4211; CHECK-P10-LE-NEXT:    pli r4, 232
4212; CHECK-P10-LE-NEXT:    pli r5, 3567587329
4213; CHECK-P10-LE-NEXT:    rldicr r3, r3, 0, 23
4214; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
4215; CHECK-P10-LE-NEXT:    lbzx r3, r3, r5
4216; CHECK-P10-LE-NEXT:    blr
4217;
4218; CHECK-P10-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint32_t:
4219; CHECK-P10-BE:       # %bb.0: # %entry
4220; CHECK-P10-BE-NEXT:    pli r4, 232
4221; CHECK-P10-BE-NEXT:    pli r5, 3567587332
4222; CHECK-P10-BE-NEXT:    rldicr r3, r3, 0, 23
4223; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
4224; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
4225; CHECK-P10-BE-NEXT:    blr
4226;
4227; CHECK-P9-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint32_t:
4228; CHECK-P9-LE:       # %bb.0: # %entry
4229; CHECK-P9-LE-NEXT:    li r4, 29
4230; CHECK-P9-LE-NEXT:    rldicr r3, r3, 0, 23
4231; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
4232; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
4233; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
4234; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
4235; CHECK-P9-LE-NEXT:    blr
4236;
4237; CHECK-P9-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint32_t:
4238; CHECK-P9-BE:       # %bb.0: # %entry
4239; CHECK-P9-BE-NEXT:    li r4, 29
4240; CHECK-P9-BE-NEXT:    rldicr r3, r3, 0, 23
4241; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
4242; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
4243; CHECK-P9-BE-NEXT:    ori r4, r4, 4100
4244; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
4245; CHECK-P9-BE-NEXT:    blr
4246;
4247; CHECK-P8-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint32_t:
4248; CHECK-P8-LE:       # %bb.0: # %entry
4249; CHECK-P8-LE-NEXT:    li r4, 29
4250; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
4251; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
4252; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
4253; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
4254; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
4255; CHECK-P8-LE-NEXT:    blr
4256;
4257; CHECK-P8-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint32_t:
4258; CHECK-P8-BE:       # %bb.0: # %entry
4259; CHECK-P8-BE-NEXT:    li r4, 29
4260; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
4261; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
4262; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
4263; CHECK-P8-BE-NEXT:    ori r4, r4, 4100
4264; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
4265; CHECK-P8-BE-NEXT:    blr
4266entry:
4267  %and = and i64 %ptr, -1099511627776
4268  %or = or i64 %and, 1000000000001
4269  %0 = inttoptr i64 %or to ptr
4270  %1 = load i32, ptr %0, align 4
4271  %conv = trunc i32 %1 to i8
4272  ret i8 %conv
4273}
4274
4275; Function Attrs: norecurse nounwind readonly uwtable willreturn
4276define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_uint32_t(i64 %ptr) {
4277; CHECK-P10-LE-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
4278; CHECK-P10-LE:       # %bb.0: # %entry
4279; CHECK-P10-LE-NEXT:    pli r4, 244140625
4280; CHECK-P10-LE-NEXT:    rldicr r3, r3, 0, 23
4281; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
4282; CHECK-P10-LE-NEXT:    lbzx r3, r3, r4
4283; CHECK-P10-LE-NEXT:    blr
4284;
4285; CHECK-P10-BE-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
4286; CHECK-P10-BE:       # %bb.0: # %entry
4287; CHECK-P10-BE-NEXT:    pli r4, 232
4288; CHECK-P10-BE-NEXT:    pli r5, 3567587331
4289; CHECK-P10-BE-NEXT:    rldicr r3, r3, 0, 23
4290; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
4291; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
4292; CHECK-P10-BE-NEXT:    blr
4293;
4294; CHECK-P9-LE-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
4295; CHECK-P9-LE:       # %bb.0: # %entry
4296; CHECK-P9-LE-NEXT:    lis r4, 3725
4297; CHECK-P9-LE-NEXT:    rldicr r3, r3, 0, 23
4298; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
4299; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
4300; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
4301; CHECK-P9-LE-NEXT:    blr
4302;
4303; CHECK-P9-BE-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
4304; CHECK-P9-BE:       # %bb.0: # %entry
4305; CHECK-P9-BE-NEXT:    li r4, 29
4306; CHECK-P9-BE-NEXT:    rldicr r3, r3, 0, 23
4307; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
4308; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
4309; CHECK-P9-BE-NEXT:    ori r4, r4, 4099
4310; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
4311; CHECK-P9-BE-NEXT:    blr
4312;
4313; CHECK-P8-LE-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
4314; CHECK-P8-LE:       # %bb.0: # %entry
4315; CHECK-P8-LE-NEXT:    lis r4, 3725
4316; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
4317; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
4318; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
4319; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
4320; CHECK-P8-LE-NEXT:    blr
4321;
4322; CHECK-P8-BE-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
4323; CHECK-P8-BE:       # %bb.0: # %entry
4324; CHECK-P8-BE-NEXT:    li r4, 29
4325; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
4326; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
4327; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
4328; CHECK-P8-BE-NEXT:    ori r4, r4, 4099
4329; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
4330; CHECK-P8-BE-NEXT:    blr
4331entry:
4332  %and = and i64 %ptr, -1099511627776
4333  %or = or i64 %and, 1000000000000
4334  %0 = inttoptr i64 %or to ptr
4335  %1 = load i32, ptr %0, align 4096
4336  %conv = trunc i32 %1 to i8
4337  ret i8 %conv
4338}
4339
4340; Function Attrs: norecurse nounwind readonly uwtable willreturn
4341define dso_local zeroext i8 @ld_cst_align16_uint8_t_uint32_t() {
4342; CHECK-LE-LABEL: ld_cst_align16_uint8_t_uint32_t:
4343; CHECK-LE:       # %bb.0: # %entry
4344; CHECK-LE-NEXT:    lbz r3, 4080(0)
4345; CHECK-LE-NEXT:    blr
4346;
4347; CHECK-BE-LABEL: ld_cst_align16_uint8_t_uint32_t:
4348; CHECK-BE:       # %bb.0: # %entry
4349; CHECK-BE-NEXT:    lbz r3, 4083(0)
4350; CHECK-BE-NEXT:    blr
4351entry:
4352  %0 = load i32, ptr inttoptr (i64 4080 to ptr), align 16
4353  %conv = trunc i32 %0 to i8
4354  ret i8 %conv
4355}
4356
4357; Function Attrs: norecurse nounwind readonly uwtable willreturn
4358define dso_local zeroext i8 @ld_cst_align32_uint8_t_uint32_t() {
4359; CHECK-LE-LABEL: ld_cst_align32_uint8_t_uint32_t:
4360; CHECK-LE:       # %bb.0: # %entry
4361; CHECK-LE-NEXT:    lis r3, 153
4362; CHECK-LE-NEXT:    lbz r3, -27108(r3)
4363; CHECK-LE-NEXT:    blr
4364;
4365; CHECK-BE-LABEL: ld_cst_align32_uint8_t_uint32_t:
4366; CHECK-BE:       # %bb.0: # %entry
4367; CHECK-BE-NEXT:    lis r3, 153
4368; CHECK-BE-NEXT:    lbz r3, -27105(r3)
4369; CHECK-BE-NEXT:    blr
4370entry:
4371  %0 = load i32, ptr inttoptr (i64 9999900 to ptr), align 4
4372  %conv = trunc i32 %0 to i8
4373  ret i8 %conv
4374}
4375
4376; Function Attrs: norecurse nounwind readonly uwtable willreturn
4377define dso_local zeroext i8 @ld_cst_unalign64_uint8_t_uint32_t() {
4378; CHECK-P10-LE-LABEL: ld_cst_unalign64_uint8_t_uint32_t:
4379; CHECK-P10-LE:       # %bb.0: # %entry
4380; CHECK-P10-LE-NEXT:    pli r3, 232
4381; CHECK-P10-LE-NEXT:    pli r4, 3567587329
4382; CHECK-P10-LE-NEXT:    rldimi r4, r3, 32, 0
4383; CHECK-P10-LE-NEXT:    lbz r3, 0(r4)
4384; CHECK-P10-LE-NEXT:    blr
4385;
4386; CHECK-P10-BE-LABEL: ld_cst_unalign64_uint8_t_uint32_t:
4387; CHECK-P10-BE:       # %bb.0: # %entry
4388; CHECK-P10-BE-NEXT:    pli r3, 232
4389; CHECK-P10-BE-NEXT:    pli r4, 3567587332
4390; CHECK-P10-BE-NEXT:    rldimi r4, r3, 32, 0
4391; CHECK-P10-BE-NEXT:    lbz r3, 0(r4)
4392; CHECK-P10-BE-NEXT:    blr
4393;
4394; CHECK-P9-LE-LABEL: ld_cst_unalign64_uint8_t_uint32_t:
4395; CHECK-P9-LE:       # %bb.0: # %entry
4396; CHECK-P9-LE-NEXT:    li r3, 29
4397; CHECK-P9-LE-NEXT:    rldic r3, r3, 35, 24
4398; CHECK-P9-LE-NEXT:    oris r3, r3, 54437
4399; CHECK-P9-LE-NEXT:    ori r3, r3, 4097
4400; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
4401; CHECK-P9-LE-NEXT:    blr
4402;
4403; CHECK-P9-BE-LABEL: ld_cst_unalign64_uint8_t_uint32_t:
4404; CHECK-P9-BE:       # %bb.0: # %entry
4405; CHECK-P9-BE-NEXT:    li r3, 29
4406; CHECK-P9-BE-NEXT:    rldic r3, r3, 35, 24
4407; CHECK-P9-BE-NEXT:    oris r3, r3, 54437
4408; CHECK-P9-BE-NEXT:    ori r3, r3, 4100
4409; CHECK-P9-BE-NEXT:    lbz r3, 0(r3)
4410; CHECK-P9-BE-NEXT:    blr
4411;
4412; CHECK-P8-LE-LABEL: ld_cst_unalign64_uint8_t_uint32_t:
4413; CHECK-P8-LE:       # %bb.0: # %entry
4414; CHECK-P8-LE-NEXT:    li r3, 29
4415; CHECK-P8-LE-NEXT:    rldic r3, r3, 35, 24
4416; CHECK-P8-LE-NEXT:    oris r3, r3, 54437
4417; CHECK-P8-LE-NEXT:    ori r3, r3, 4097
4418; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
4419; CHECK-P8-LE-NEXT:    blr
4420;
4421; CHECK-P8-BE-LABEL: ld_cst_unalign64_uint8_t_uint32_t:
4422; CHECK-P8-BE:       # %bb.0: # %entry
4423; CHECK-P8-BE-NEXT:    li r3, 29
4424; CHECK-P8-BE-NEXT:    rldic r3, r3, 35, 24
4425; CHECK-P8-BE-NEXT:    oris r3, r3, 54437
4426; CHECK-P8-BE-NEXT:    ori r3, r3, 4100
4427; CHECK-P8-BE-NEXT:    lbz r3, 0(r3)
4428; CHECK-P8-BE-NEXT:    blr
4429entry:
4430  %0 = load i32, ptr inttoptr (i64 1000000000001 to ptr), align 4
4431  %conv = trunc i32 %0 to i8
4432  ret i8 %conv
4433}
4434
4435; Function Attrs: norecurse nounwind readonly uwtable willreturn
4436define dso_local zeroext i8 @ld_cst_align64_uint8_t_uint32_t() {
4437; CHECK-P10-LE-LABEL: ld_cst_align64_uint8_t_uint32_t:
4438; CHECK-P10-LE:       # %bb.0: # %entry
4439; CHECK-P10-LE-NEXT:    pli r3, 244140625
4440; CHECK-P10-LE-NEXT:    rldic r3, r3, 12, 24
4441; CHECK-P10-LE-NEXT:    lbz r3, 0(r3)
4442; CHECK-P10-LE-NEXT:    blr
4443;
4444; CHECK-P10-BE-LABEL: ld_cst_align64_uint8_t_uint32_t:
4445; CHECK-P10-BE:       # %bb.0: # %entry
4446; CHECK-P10-BE-NEXT:    pli r3, 232
4447; CHECK-P10-BE-NEXT:    pli r4, 3567587331
4448; CHECK-P10-BE-NEXT:    rldimi r4, r3, 32, 0
4449; CHECK-P10-BE-NEXT:    lbz r3, 0(r4)
4450; CHECK-P10-BE-NEXT:    blr
4451;
4452; CHECK-P9-LE-LABEL: ld_cst_align64_uint8_t_uint32_t:
4453; CHECK-P9-LE:       # %bb.0: # %entry
4454; CHECK-P9-LE-NEXT:    lis r3, 3725
4455; CHECK-P9-LE-NEXT:    ori r3, r3, 19025
4456; CHECK-P9-LE-NEXT:    rldic r3, r3, 12, 24
4457; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
4458; CHECK-P9-LE-NEXT:    blr
4459;
4460; CHECK-P9-BE-LABEL: ld_cst_align64_uint8_t_uint32_t:
4461; CHECK-P9-BE:       # %bb.0: # %entry
4462; CHECK-P9-BE-NEXT:    li r3, 29
4463; CHECK-P9-BE-NEXT:    rldic r3, r3, 35, 24
4464; CHECK-P9-BE-NEXT:    oris r3, r3, 54437
4465; CHECK-P9-BE-NEXT:    ori r3, r3, 4099
4466; CHECK-P9-BE-NEXT:    lbz r3, 0(r3)
4467; CHECK-P9-BE-NEXT:    blr
4468;
4469; CHECK-P8-LE-LABEL: ld_cst_align64_uint8_t_uint32_t:
4470; CHECK-P8-LE:       # %bb.0: # %entry
4471; CHECK-P8-LE-NEXT:    lis r3, 3725
4472; CHECK-P8-LE-NEXT:    ori r3, r3, 19025
4473; CHECK-P8-LE-NEXT:    rldic r3, r3, 12, 24
4474; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
4475; CHECK-P8-LE-NEXT:    blr
4476;
4477; CHECK-P8-BE-LABEL: ld_cst_align64_uint8_t_uint32_t:
4478; CHECK-P8-BE:       # %bb.0: # %entry
4479; CHECK-P8-BE-NEXT:    li r3, 29
4480; CHECK-P8-BE-NEXT:    rldic r3, r3, 35, 24
4481; CHECK-P8-BE-NEXT:    oris r3, r3, 54437
4482; CHECK-P8-BE-NEXT:    ori r3, r3, 4099
4483; CHECK-P8-BE-NEXT:    lbz r3, 0(r3)
4484; CHECK-P8-BE-NEXT:    blr
4485entry:
4486  %0 = load i32, ptr inttoptr (i64 1000000000000 to ptr), align 4096
4487  %conv = trunc i32 %0 to i8
4488  ret i8 %conv
4489}
4490
4491; Function Attrs: norecurse nounwind readonly uwtable willreturn
4492define dso_local zeroext i8 @ld_0_uint8_t_uint64_t(i64 %ptr) {
4493; CHECK-LE-LABEL: ld_0_uint8_t_uint64_t:
4494; CHECK-LE:       # %bb.0: # %entry
4495; CHECK-LE-NEXT:    lbz r3, 0(r3)
4496; CHECK-LE-NEXT:    blr
4497;
4498; CHECK-BE-LABEL: ld_0_uint8_t_uint64_t:
4499; CHECK-BE:       # %bb.0: # %entry
4500; CHECK-BE-NEXT:    lbz r3, 7(r3)
4501; CHECK-BE-NEXT:    blr
4502entry:
4503  %0 = inttoptr i64 %ptr to ptr
4504  %1 = load i64, ptr %0, align 8
4505  %conv = trunc i64 %1 to i8
4506  ret i8 %conv
4507}
4508
4509; Function Attrs: norecurse nounwind readonly uwtable willreturn
4510define dso_local zeroext i8 @ld_align16_uint8_t_uint64_t(ptr nocapture readonly %ptr) {
4511; CHECK-LE-LABEL: ld_align16_uint8_t_uint64_t:
4512; CHECK-LE:       # %bb.0: # %entry
4513; CHECK-LE-NEXT:    lbz r3, 8(r3)
4514; CHECK-LE-NEXT:    blr
4515;
4516; CHECK-BE-LABEL: ld_align16_uint8_t_uint64_t:
4517; CHECK-BE:       # %bb.0: # %entry
4518; CHECK-BE-NEXT:    lbz r3, 15(r3)
4519; CHECK-BE-NEXT:    blr
4520entry:
4521  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
4522  %0 = load i64, ptr %add.ptr, align 8
4523  %conv = trunc i64 %0 to i8
4524  ret i8 %conv
4525}
4526
4527; Function Attrs: norecurse nounwind readonly uwtable willreturn
4528define dso_local zeroext i8 @ld_align32_uint8_t_uint64_t(ptr nocapture readonly %ptr) {
4529; CHECK-P10-LE-LABEL: ld_align32_uint8_t_uint64_t:
4530; CHECK-P10-LE:       # %bb.0: # %entry
4531; CHECK-P10-LE-NEXT:    plbz r3, 99999000(r3), 0
4532; CHECK-P10-LE-NEXT:    blr
4533;
4534; CHECK-P10-BE-LABEL: ld_align32_uint8_t_uint64_t:
4535; CHECK-P10-BE:       # %bb.0: # %entry
4536; CHECK-P10-BE-NEXT:    plbz r3, 99999007(r3), 0
4537; CHECK-P10-BE-NEXT:    blr
4538;
4539; CHECK-P9-LE-LABEL: ld_align32_uint8_t_uint64_t:
4540; CHECK-P9-LE:       # %bb.0: # %entry
4541; CHECK-P9-LE-NEXT:    lis r4, 1525
4542; CHECK-P9-LE-NEXT:    ori r4, r4, 56600
4543; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
4544; CHECK-P9-LE-NEXT:    blr
4545;
4546; CHECK-P9-BE-LABEL: ld_align32_uint8_t_uint64_t:
4547; CHECK-P9-BE:       # %bb.0: # %entry
4548; CHECK-P9-BE-NEXT:    lis r4, 1525
4549; CHECK-P9-BE-NEXT:    ori r4, r4, 56607
4550; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
4551; CHECK-P9-BE-NEXT:    blr
4552;
4553; CHECK-P8-LE-LABEL: ld_align32_uint8_t_uint64_t:
4554; CHECK-P8-LE:       # %bb.0: # %entry
4555; CHECK-P8-LE-NEXT:    lis r4, 1525
4556; CHECK-P8-LE-NEXT:    ori r4, r4, 56600
4557; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
4558; CHECK-P8-LE-NEXT:    blr
4559;
4560; CHECK-P8-BE-LABEL: ld_align32_uint8_t_uint64_t:
4561; CHECK-P8-BE:       # %bb.0: # %entry
4562; CHECK-P8-BE-NEXT:    lis r4, 1525
4563; CHECK-P8-BE-NEXT:    ori r4, r4, 56607
4564; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
4565; CHECK-P8-BE-NEXT:    blr
4566entry:
4567  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
4568  %0 = load i64, ptr %add.ptr, align 8
4569  %conv = trunc i64 %0 to i8
4570  ret i8 %conv
4571}
4572
4573; Function Attrs: norecurse nounwind readonly uwtable willreturn
4574define dso_local zeroext i8 @ld_unalign64_uint8_t_uint64_t(ptr nocapture readonly %ptr) {
4575; CHECK-P10-LE-LABEL: ld_unalign64_uint8_t_uint64_t:
4576; CHECK-P10-LE:       # %bb.0: # %entry
4577; CHECK-P10-LE-NEXT:    pli r4, 232
4578; CHECK-P10-LE-NEXT:    pli r5, 3567587329
4579; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
4580; CHECK-P10-LE-NEXT:    lbzx r3, r3, r5
4581; CHECK-P10-LE-NEXT:    blr
4582;
4583; CHECK-P10-BE-LABEL: ld_unalign64_uint8_t_uint64_t:
4584; CHECK-P10-BE:       # %bb.0: # %entry
4585; CHECK-P10-BE-NEXT:    pli r4, 232
4586; CHECK-P10-BE-NEXT:    pli r5, 3567587336
4587; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
4588; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
4589; CHECK-P10-BE-NEXT:    blr
4590;
4591; CHECK-P9-LE-LABEL: ld_unalign64_uint8_t_uint64_t:
4592; CHECK-P9-LE:       # %bb.0: # %entry
4593; CHECK-P9-LE-NEXT:    li r4, 29
4594; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
4595; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
4596; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
4597; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
4598; CHECK-P9-LE-NEXT:    blr
4599;
4600; CHECK-P9-BE-LABEL: ld_unalign64_uint8_t_uint64_t:
4601; CHECK-P9-BE:       # %bb.0: # %entry
4602; CHECK-P9-BE-NEXT:    li r4, 29
4603; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
4604; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
4605; CHECK-P9-BE-NEXT:    ori r4, r4, 4104
4606; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
4607; CHECK-P9-BE-NEXT:    blr
4608;
4609; CHECK-P8-LE-LABEL: ld_unalign64_uint8_t_uint64_t:
4610; CHECK-P8-LE:       # %bb.0: # %entry
4611; CHECK-P8-LE-NEXT:    li r4, 29
4612; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
4613; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
4614; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
4615; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
4616; CHECK-P8-LE-NEXT:    blr
4617;
4618; CHECK-P8-BE-LABEL: ld_unalign64_uint8_t_uint64_t:
4619; CHECK-P8-BE:       # %bb.0: # %entry
4620; CHECK-P8-BE-NEXT:    li r4, 29
4621; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
4622; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
4623; CHECK-P8-BE-NEXT:    ori r4, r4, 4104
4624; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
4625; CHECK-P8-BE-NEXT:    blr
4626entry:
4627  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000001
4628  %0 = load i64, ptr %add.ptr, align 8
4629  %conv = trunc i64 %0 to i8
4630  ret i8 %conv
4631}
4632
4633; Function Attrs: norecurse nounwind readonly uwtable willreturn
4634define dso_local zeroext i8 @ld_align64_uint8_t_uint64_t(ptr nocapture readonly %ptr) {
4635; CHECK-P10-LE-LABEL: ld_align64_uint8_t_uint64_t:
4636; CHECK-P10-LE:       # %bb.0: # %entry
4637; CHECK-P10-LE-NEXT:    pli r4, 244140625
4638; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
4639; CHECK-P10-LE-NEXT:    lbzx r3, r3, r4
4640; CHECK-P10-LE-NEXT:    blr
4641;
4642; CHECK-P10-BE-LABEL: ld_align64_uint8_t_uint64_t:
4643; CHECK-P10-BE:       # %bb.0: # %entry
4644; CHECK-P10-BE-NEXT:    pli r4, 232
4645; CHECK-P10-BE-NEXT:    pli r5, 3567587335
4646; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
4647; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
4648; CHECK-P10-BE-NEXT:    blr
4649;
4650; CHECK-P9-LE-LABEL: ld_align64_uint8_t_uint64_t:
4651; CHECK-P9-LE:       # %bb.0: # %entry
4652; CHECK-P9-LE-NEXT:    lis r4, 3725
4653; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
4654; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
4655; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
4656; CHECK-P9-LE-NEXT:    blr
4657;
4658; CHECK-P9-BE-LABEL: ld_align64_uint8_t_uint64_t:
4659; CHECK-P9-BE:       # %bb.0: # %entry
4660; CHECK-P9-BE-NEXT:    li r4, 29
4661; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
4662; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
4663; CHECK-P9-BE-NEXT:    ori r4, r4, 4103
4664; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
4665; CHECK-P9-BE-NEXT:    blr
4666;
4667; CHECK-P8-LE-LABEL: ld_align64_uint8_t_uint64_t:
4668; CHECK-P8-LE:       # %bb.0: # %entry
4669; CHECK-P8-LE-NEXT:    lis r4, 3725
4670; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
4671; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
4672; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
4673; CHECK-P8-LE-NEXT:    blr
4674;
4675; CHECK-P8-BE-LABEL: ld_align64_uint8_t_uint64_t:
4676; CHECK-P8-BE:       # %bb.0: # %entry
4677; CHECK-P8-BE-NEXT:    li r4, 29
4678; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
4679; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
4680; CHECK-P8-BE-NEXT:    ori r4, r4, 4103
4681; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
4682; CHECK-P8-BE-NEXT:    blr
4683entry:
4684  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
4685  %0 = load i64, ptr %add.ptr, align 8
4686  %conv = trunc i64 %0 to i8
4687  ret i8 %conv
4688}
4689
4690; Function Attrs: norecurse nounwind readonly uwtable willreturn
4691define dso_local zeroext i8 @ld_reg_uint8_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) {
4692; CHECK-LE-LABEL: ld_reg_uint8_t_uint64_t:
4693; CHECK-LE:       # %bb.0: # %entry
4694; CHECK-LE-NEXT:    lbzx r3, r3, r4
4695; CHECK-LE-NEXT:    blr
4696;
4697; CHECK-BE-LABEL: ld_reg_uint8_t_uint64_t:
4698; CHECK-BE:       # %bb.0: # %entry
4699; CHECK-BE-NEXT:    add r3, r3, r4
4700; CHECK-BE-NEXT:    lbz r3, 7(r3)
4701; CHECK-BE-NEXT:    blr
4702entry:
4703  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
4704  %0 = load i64, ptr %add.ptr, align 8
4705  %conv = trunc i64 %0 to i8
4706  ret i8 %conv
4707}
4708
4709; Function Attrs: norecurse nounwind readonly uwtable willreturn
4710define dso_local zeroext i8 @ld_or_uint8_t_uint64_t(i64 %ptr, i8 zeroext %off) {
4711; CHECK-LE-LABEL: ld_or_uint8_t_uint64_t:
4712; CHECK-LE:       # %bb.0: # %entry
4713; CHECK-LE-NEXT:    or r3, r4, r3
4714; CHECK-LE-NEXT:    lbz r3, 0(r3)
4715; CHECK-LE-NEXT:    blr
4716;
4717; CHECK-BE-LABEL: ld_or_uint8_t_uint64_t:
4718; CHECK-BE:       # %bb.0: # %entry
4719; CHECK-BE-NEXT:    or r3, r4, r3
4720; CHECK-BE-NEXT:    lbz r3, 7(r3)
4721; CHECK-BE-NEXT:    blr
4722entry:
4723  %conv = zext i8 %off to i64
4724  %or = or i64 %conv, %ptr
4725  %0 = inttoptr i64 %or to ptr
4726  %1 = load i64, ptr %0, align 8
4727  %conv1 = trunc i64 %1 to i8
4728  ret i8 %conv1
4729}
4730
4731; Function Attrs: norecurse nounwind readonly uwtable willreturn
4732define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_uint64_t(i64 %ptr) {
4733; CHECK-LE-LABEL: ld_not_disjoint16_uint8_t_uint64_t:
4734; CHECK-LE:       # %bb.0: # %entry
4735; CHECK-LE-NEXT:    ori r3, r3, 6
4736; CHECK-LE-NEXT:    lbz r3, 0(r3)
4737; CHECK-LE-NEXT:    blr
4738;
4739; CHECK-BE-LABEL: ld_not_disjoint16_uint8_t_uint64_t:
4740; CHECK-BE:       # %bb.0: # %entry
4741; CHECK-BE-NEXT:    ori r3, r3, 6
4742; CHECK-BE-NEXT:    lbz r3, 7(r3)
4743; CHECK-BE-NEXT:    blr
4744entry:
4745  %or = or i64 %ptr, 6
4746  %0 = inttoptr i64 %or to ptr
4747  %1 = load i64, ptr %0, align 8
4748  %conv = trunc i64 %1 to i8
4749  ret i8 %conv
4750}
4751
4752; Function Attrs: norecurse nounwind readonly uwtable willreturn
4753define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_uint64_t(i64 %ptr) {
4754; CHECK-LE-LABEL: ld_disjoint_align16_uint8_t_uint64_t:
4755; CHECK-LE:       # %bb.0: # %entry
4756; CHECK-LE-NEXT:    rldicr r3, r3, 0, 51
4757; CHECK-LE-NEXT:    lbz r3, 24(r3)
4758; CHECK-LE-NEXT:    blr
4759;
4760; CHECK-BE-LABEL: ld_disjoint_align16_uint8_t_uint64_t:
4761; CHECK-BE:       # %bb.0: # %entry
4762; CHECK-BE-NEXT:    rldicr r3, r3, 0, 51
4763; CHECK-BE-NEXT:    lbz r3, 31(r3)
4764; CHECK-BE-NEXT:    blr
4765entry:
4766  %and = and i64 %ptr, -4096
4767  %or = or i64 %and, 24
4768  %0 = inttoptr i64 %or to ptr
4769  %1 = load i64, ptr %0, align 8
4770  %conv = trunc i64 %1 to i8
4771  ret i8 %conv
4772}
4773
4774; Function Attrs: norecurse nounwind readonly uwtable willreturn
4775define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_uint64_t(i64 %ptr) {
4776; CHECK-LE-LABEL: ld_not_disjoint32_uint8_t_uint64_t:
4777; CHECK-LE:       # %bb.0: # %entry
4778; CHECK-LE-NEXT:    ori r3, r3, 34463
4779; CHECK-LE-NEXT:    oris r3, r3, 1
4780; CHECK-LE-NEXT:    lbz r3, 0(r3)
4781; CHECK-LE-NEXT:    blr
4782;
4783; CHECK-BE-LABEL: ld_not_disjoint32_uint8_t_uint64_t:
4784; CHECK-BE:       # %bb.0: # %entry
4785; CHECK-BE-NEXT:    ori r3, r3, 34463
4786; CHECK-BE-NEXT:    oris r3, r3, 1
4787; CHECK-BE-NEXT:    lbz r3, 7(r3)
4788; CHECK-BE-NEXT:    blr
4789entry:
4790  %or = or i64 %ptr, 99999
4791  %0 = inttoptr i64 %or to ptr
4792  %1 = load i64, ptr %0, align 8
4793  %conv = trunc i64 %1 to i8
4794  ret i8 %conv
4795}
4796
4797; Function Attrs: norecurse nounwind readonly uwtable willreturn
4798define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_uint64_t(i64 %ptr) {
4799; CHECK-P10-LE-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
4800; CHECK-P10-LE:       # %bb.0: # %entry
4801; CHECK-P10-LE-NEXT:    lis r4, -15264
4802; CHECK-P10-LE-NEXT:    and r3, r3, r4
4803; CHECK-P10-LE-NEXT:    plbz r3, 999990000(r3), 0
4804; CHECK-P10-LE-NEXT:    blr
4805;
4806; CHECK-P10-BE-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
4807; CHECK-P10-BE:       # %bb.0: # %entry
4808; CHECK-P10-BE-NEXT:    lis r4, -15264
4809; CHECK-P10-BE-NEXT:    and r3, r3, r4
4810; CHECK-P10-BE-NEXT:    plbz r3, 999990007(r3), 0
4811; CHECK-P10-BE-NEXT:    blr
4812;
4813; CHECK-P9-LE-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
4814; CHECK-P9-LE:       # %bb.0: # %entry
4815; CHECK-P9-LE-NEXT:    lis r4, -15264
4816; CHECK-P9-LE-NEXT:    and r3, r3, r4
4817; CHECK-P9-LE-NEXT:    lis r4, 15258
4818; CHECK-P9-LE-NEXT:    ori r4, r4, 41712
4819; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
4820; CHECK-P9-LE-NEXT:    blr
4821;
4822; CHECK-P9-BE-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
4823; CHECK-P9-BE:       # %bb.0: # %entry
4824; CHECK-P9-BE-NEXT:    lis r4, -15264
4825; CHECK-P9-BE-NEXT:    and r3, r3, r4
4826; CHECK-P9-BE-NEXT:    lis r4, 15258
4827; CHECK-P9-BE-NEXT:    ori r4, r4, 41719
4828; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
4829; CHECK-P9-BE-NEXT:    blr
4830;
4831; CHECK-P8-LE-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
4832; CHECK-P8-LE:       # %bb.0: # %entry
4833; CHECK-P8-LE-NEXT:    lis r4, -15264
4834; CHECK-P8-LE-NEXT:    and r3, r3, r4
4835; CHECK-P8-LE-NEXT:    lis r4, 15258
4836; CHECK-P8-LE-NEXT:    ori r4, r4, 41712
4837; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
4838; CHECK-P8-LE-NEXT:    blr
4839;
4840; CHECK-P8-BE-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
4841; CHECK-P8-BE:       # %bb.0: # %entry
4842; CHECK-P8-BE-NEXT:    lis r4, -15264
4843; CHECK-P8-BE-NEXT:    and r3, r3, r4
4844; CHECK-P8-BE-NEXT:    lis r4, 15258
4845; CHECK-P8-BE-NEXT:    ori r4, r4, 41719
4846; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
4847; CHECK-P8-BE-NEXT:    blr
4848entry:
4849  %and = and i64 %ptr, -1000341504
4850  %or = or i64 %and, 999990000
4851  %0 = inttoptr i64 %or to ptr
4852  %1 = load i64, ptr %0, align 16
4853  %conv = trunc i64 %1 to i8
4854  ret i8 %conv
4855}
4856
4857; Function Attrs: norecurse nounwind readonly uwtable willreturn
4858define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_uint64_t(i64 %ptr) {
4859; CHECK-P10-LE-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
4860; CHECK-P10-LE:       # %bb.0: # %entry
4861; CHECK-P10-LE-NEXT:    pli r4, 232
4862; CHECK-P10-LE-NEXT:    pli r5, 3567587329
4863; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
4864; CHECK-P10-LE-NEXT:    or r3, r3, r5
4865; CHECK-P10-LE-NEXT:    lbz r3, 0(r3)
4866; CHECK-P10-LE-NEXT:    blr
4867;
4868; CHECK-P10-BE-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
4869; CHECK-P10-BE:       # %bb.0: # %entry
4870; CHECK-P10-BE-NEXT:    pli r4, 232
4871; CHECK-P10-BE-NEXT:    pli r5, 3567587329
4872; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
4873; CHECK-P10-BE-NEXT:    or r3, r3, r5
4874; CHECK-P10-BE-NEXT:    lbz r3, 7(r3)
4875; CHECK-P10-BE-NEXT:    blr
4876;
4877; CHECK-P9-LE-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
4878; CHECK-P9-LE:       # %bb.0: # %entry
4879; CHECK-P9-LE-NEXT:    li r4, 29
4880; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
4881; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
4882; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
4883; CHECK-P9-LE-NEXT:    or r3, r3, r4
4884; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
4885; CHECK-P9-LE-NEXT:    blr
4886;
4887; CHECK-P9-BE-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
4888; CHECK-P9-BE:       # %bb.0: # %entry
4889; CHECK-P9-BE-NEXT:    li r4, 29
4890; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
4891; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
4892; CHECK-P9-BE-NEXT:    ori r4, r4, 4097
4893; CHECK-P9-BE-NEXT:    or r3, r3, r4
4894; CHECK-P9-BE-NEXT:    lbz r3, 7(r3)
4895; CHECK-P9-BE-NEXT:    blr
4896;
4897; CHECK-P8-LE-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
4898; CHECK-P8-LE:       # %bb.0: # %entry
4899; CHECK-P8-LE-NEXT:    li r4, 29
4900; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
4901; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
4902; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
4903; CHECK-P8-LE-NEXT:    or r3, r3, r4
4904; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
4905; CHECK-P8-LE-NEXT:    blr
4906;
4907; CHECK-P8-BE-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
4908; CHECK-P8-BE:       # %bb.0: # %entry
4909; CHECK-P8-BE-NEXT:    li r4, 29
4910; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
4911; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
4912; CHECK-P8-BE-NEXT:    ori r4, r4, 4097
4913; CHECK-P8-BE-NEXT:    or r3, r3, r4
4914; CHECK-P8-BE-NEXT:    lbz r3, 7(r3)
4915; CHECK-P8-BE-NEXT:    blr
4916entry:
4917  %or = or i64 %ptr, 1000000000001
4918  %0 = inttoptr i64 %or to ptr
4919  %1 = load i64, ptr %0, align 8
4920  %conv = trunc i64 %1 to i8
4921  ret i8 %conv
4922}
4923
4924; Function Attrs: norecurse nounwind readonly uwtable willreturn
4925define dso_local zeroext i8 @ld_disjoint_unalign64_uint8_t_uint64_t(i64 %ptr) {
4926; CHECK-P10-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint64_t:
4927; CHECK-P10-LE:       # %bb.0: # %entry
4928; CHECK-P10-LE-NEXT:    pli r4, 232
4929; CHECK-P10-LE-NEXT:    pli r5, 3567587329
4930; CHECK-P10-LE-NEXT:    rldicr r3, r3, 0, 23
4931; CHECK-P10-LE-NEXT:    rldimi r5, r4, 32, 0
4932; CHECK-P10-LE-NEXT:    lbzx r3, r3, r5
4933; CHECK-P10-LE-NEXT:    blr
4934;
4935; CHECK-P10-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint64_t:
4936; CHECK-P10-BE:       # %bb.0: # %entry
4937; CHECK-P10-BE-NEXT:    pli r4, 232
4938; CHECK-P10-BE-NEXT:    pli r5, 3567587336
4939; CHECK-P10-BE-NEXT:    rldicr r3, r3, 0, 23
4940; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
4941; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
4942; CHECK-P10-BE-NEXT:    blr
4943;
4944; CHECK-P9-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint64_t:
4945; CHECK-P9-LE:       # %bb.0: # %entry
4946; CHECK-P9-LE-NEXT:    li r4, 29
4947; CHECK-P9-LE-NEXT:    rldicr r3, r3, 0, 23
4948; CHECK-P9-LE-NEXT:    rldic r4, r4, 35, 24
4949; CHECK-P9-LE-NEXT:    oris r4, r4, 54437
4950; CHECK-P9-LE-NEXT:    ori r4, r4, 4097
4951; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
4952; CHECK-P9-LE-NEXT:    blr
4953;
4954; CHECK-P9-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint64_t:
4955; CHECK-P9-BE:       # %bb.0: # %entry
4956; CHECK-P9-BE-NEXT:    li r4, 29
4957; CHECK-P9-BE-NEXT:    rldicr r3, r3, 0, 23
4958; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
4959; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
4960; CHECK-P9-BE-NEXT:    ori r4, r4, 4104
4961; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
4962; CHECK-P9-BE-NEXT:    blr
4963;
4964; CHECK-P8-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint64_t:
4965; CHECK-P8-LE:       # %bb.0: # %entry
4966; CHECK-P8-LE-NEXT:    li r4, 29
4967; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
4968; CHECK-P8-LE-NEXT:    rldic r4, r4, 35, 24
4969; CHECK-P8-LE-NEXT:    oris r4, r4, 54437
4970; CHECK-P8-LE-NEXT:    ori r4, r4, 4097
4971; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
4972; CHECK-P8-LE-NEXT:    blr
4973;
4974; CHECK-P8-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint64_t:
4975; CHECK-P8-BE:       # %bb.0: # %entry
4976; CHECK-P8-BE-NEXT:    li r4, 29
4977; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
4978; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
4979; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
4980; CHECK-P8-BE-NEXT:    ori r4, r4, 4104
4981; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
4982; CHECK-P8-BE-NEXT:    blr
4983entry:
4984  %and = and i64 %ptr, -1099511627776
4985  %or = or i64 %and, 1000000000001
4986  %0 = inttoptr i64 %or to ptr
4987  %1 = load i64, ptr %0, align 8
4988  %conv = trunc i64 %1 to i8
4989  ret i8 %conv
4990}
4991
4992; Function Attrs: norecurse nounwind readonly uwtable willreturn
4993define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_uint64_t(i64 %ptr) {
4994; CHECK-P10-LE-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
4995; CHECK-P10-LE:       # %bb.0: # %entry
4996; CHECK-P10-LE-NEXT:    pli r4, 244140625
4997; CHECK-P10-LE-NEXT:    rldicr r3, r3, 0, 23
4998; CHECK-P10-LE-NEXT:    rldic r4, r4, 12, 24
4999; CHECK-P10-LE-NEXT:    lbzx r3, r3, r4
5000; CHECK-P10-LE-NEXT:    blr
5001;
5002; CHECK-P10-BE-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
5003; CHECK-P10-BE:       # %bb.0: # %entry
5004; CHECK-P10-BE-NEXT:    pli r4, 232
5005; CHECK-P10-BE-NEXT:    pli r5, 3567587335
5006; CHECK-P10-BE-NEXT:    rldicr r3, r3, 0, 23
5007; CHECK-P10-BE-NEXT:    rldimi r5, r4, 32, 0
5008; CHECK-P10-BE-NEXT:    lbzx r3, r3, r5
5009; CHECK-P10-BE-NEXT:    blr
5010;
5011; CHECK-P9-LE-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
5012; CHECK-P9-LE:       # %bb.0: # %entry
5013; CHECK-P9-LE-NEXT:    lis r4, 3725
5014; CHECK-P9-LE-NEXT:    rldicr r3, r3, 0, 23
5015; CHECK-P9-LE-NEXT:    ori r4, r4, 19025
5016; CHECK-P9-LE-NEXT:    rldic r4, r4, 12, 24
5017; CHECK-P9-LE-NEXT:    lbzx r3, r3, r4
5018; CHECK-P9-LE-NEXT:    blr
5019;
5020; CHECK-P9-BE-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
5021; CHECK-P9-BE:       # %bb.0: # %entry
5022; CHECK-P9-BE-NEXT:    li r4, 29
5023; CHECK-P9-BE-NEXT:    rldicr r3, r3, 0, 23
5024; CHECK-P9-BE-NEXT:    rldic r4, r4, 35, 24
5025; CHECK-P9-BE-NEXT:    oris r4, r4, 54437
5026; CHECK-P9-BE-NEXT:    ori r4, r4, 4103
5027; CHECK-P9-BE-NEXT:    lbzx r3, r3, r4
5028; CHECK-P9-BE-NEXT:    blr
5029;
5030; CHECK-P8-LE-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
5031; CHECK-P8-LE:       # %bb.0: # %entry
5032; CHECK-P8-LE-NEXT:    lis r4, 3725
5033; CHECK-P8-LE-NEXT:    rldicr r3, r3, 0, 23
5034; CHECK-P8-LE-NEXT:    ori r4, r4, 19025
5035; CHECK-P8-LE-NEXT:    rldic r4, r4, 12, 24
5036; CHECK-P8-LE-NEXT:    lbzx r3, r3, r4
5037; CHECK-P8-LE-NEXT:    blr
5038;
5039; CHECK-P8-BE-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
5040; CHECK-P8-BE:       # %bb.0: # %entry
5041; CHECK-P8-BE-NEXT:    li r4, 29
5042; CHECK-P8-BE-NEXT:    rldicr r3, r3, 0, 23
5043; CHECK-P8-BE-NEXT:    rldic r4, r4, 35, 24
5044; CHECK-P8-BE-NEXT:    oris r4, r4, 54437
5045; CHECK-P8-BE-NEXT:    ori r4, r4, 4103
5046; CHECK-P8-BE-NEXT:    lbzx r3, r3, r4
5047; CHECK-P8-BE-NEXT:    blr
5048entry:
5049  %and = and i64 %ptr, -1099511627776
5050  %or = or i64 %and, 1000000000000
5051  %0 = inttoptr i64 %or to ptr
5052  %1 = load i64, ptr %0, align 4096
5053  %conv = trunc i64 %1 to i8
5054  ret i8 %conv
5055}
5056
5057; Function Attrs: norecurse nounwind readonly uwtable willreturn
5058define dso_local zeroext i8 @ld_cst_align16_uint8_t_uint64_t() {
5059; CHECK-LE-LABEL: ld_cst_align16_uint8_t_uint64_t:
5060; CHECK-LE:       # %bb.0: # %entry
5061; CHECK-LE-NEXT:    lbz r3, 4080(0)
5062; CHECK-LE-NEXT:    blr
5063;
5064; CHECK-BE-LABEL: ld_cst_align16_uint8_t_uint64_t:
5065; CHECK-BE:       # %bb.0: # %entry
5066; CHECK-BE-NEXT:    lbz r3, 4087(0)
5067; CHECK-BE-NEXT:    blr
5068entry:
5069  %0 = load i64, ptr inttoptr (i64 4080 to ptr), align 16
5070  %conv = trunc i64 %0 to i8
5071  ret i8 %conv
5072}
5073
5074; Function Attrs: norecurse nounwind readonly uwtable willreturn
5075define dso_local zeroext i8 @ld_cst_align32_uint8_t_uint64_t() {
5076; CHECK-LE-LABEL: ld_cst_align32_uint8_t_uint64_t:
5077; CHECK-LE:       # %bb.0: # %entry
5078; CHECK-LE-NEXT:    lis r3, 153
5079; CHECK-LE-NEXT:    lbz r3, -27108(r3)
5080; CHECK-LE-NEXT:    blr
5081;
5082; CHECK-BE-LABEL: ld_cst_align32_uint8_t_uint64_t:
5083; CHECK-BE:       # %bb.0: # %entry
5084; CHECK-BE-NEXT:    lis r3, 153
5085; CHECK-BE-NEXT:    lbz r3, -27101(r3)
5086; CHECK-BE-NEXT:    blr
5087entry:
5088  %0 = load i64, ptr inttoptr (i64 9999900 to ptr), align 8
5089  %conv = trunc i64 %0 to i8
5090  ret i8 %conv
5091}
5092
5093; Function Attrs: norecurse nounwind readonly uwtable willreturn
5094define dso_local zeroext i8 @ld_cst_unalign64_uint8_t_uint64_t() {
5095; CHECK-P10-LE-LABEL: ld_cst_unalign64_uint8_t_uint64_t:
5096; CHECK-P10-LE:       # %bb.0: # %entry
5097; CHECK-P10-LE-NEXT:    pli r3, 232
5098; CHECK-P10-LE-NEXT:    pli r4, 3567587329
5099; CHECK-P10-LE-NEXT:    rldimi r4, r3, 32, 0
5100; CHECK-P10-LE-NEXT:    lbz r3, 0(r4)
5101; CHECK-P10-LE-NEXT:    blr
5102;
5103; CHECK-P10-BE-LABEL: ld_cst_unalign64_uint8_t_uint64_t:
5104; CHECK-P10-BE:       # %bb.0: # %entry
5105; CHECK-P10-BE-NEXT:    pli r3, 232
5106; CHECK-P10-BE-NEXT:    pli r4, 3567587336
5107; CHECK-P10-BE-NEXT:    rldimi r4, r3, 32, 0
5108; CHECK-P10-BE-NEXT:    lbz r3, 0(r4)
5109; CHECK-P10-BE-NEXT:    blr
5110;
5111; CHECK-P9-LE-LABEL: ld_cst_unalign64_uint8_t_uint64_t:
5112; CHECK-P9-LE:       # %bb.0: # %entry
5113; CHECK-P9-LE-NEXT:    li r3, 29
5114; CHECK-P9-LE-NEXT:    rldic r3, r3, 35, 24
5115; CHECK-P9-LE-NEXT:    oris r3, r3, 54437
5116; CHECK-P9-LE-NEXT:    ori r3, r3, 4097
5117; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
5118; CHECK-P9-LE-NEXT:    blr
5119;
5120; CHECK-P9-BE-LABEL: ld_cst_unalign64_uint8_t_uint64_t:
5121; CHECK-P9-BE:       # %bb.0: # %entry
5122; CHECK-P9-BE-NEXT:    li r3, 29
5123; CHECK-P9-BE-NEXT:    rldic r3, r3, 35, 24
5124; CHECK-P9-BE-NEXT:    oris r3, r3, 54437
5125; CHECK-P9-BE-NEXT:    ori r3, r3, 4104
5126; CHECK-P9-BE-NEXT:    lbz r3, 0(r3)
5127; CHECK-P9-BE-NEXT:    blr
5128;
5129; CHECK-P8-LE-LABEL: ld_cst_unalign64_uint8_t_uint64_t:
5130; CHECK-P8-LE:       # %bb.0: # %entry
5131; CHECK-P8-LE-NEXT:    li r3, 29
5132; CHECK-P8-LE-NEXT:    rldic r3, r3, 35, 24
5133; CHECK-P8-LE-NEXT:    oris r3, r3, 54437
5134; CHECK-P8-LE-NEXT:    ori r3, r3, 4097
5135; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
5136; CHECK-P8-LE-NEXT:    blr
5137;
5138; CHECK-P8-BE-LABEL: ld_cst_unalign64_uint8_t_uint64_t:
5139; CHECK-P8-BE:       # %bb.0: # %entry
5140; CHECK-P8-BE-NEXT:    li r3, 29
5141; CHECK-P8-BE-NEXT:    rldic r3, r3, 35, 24
5142; CHECK-P8-BE-NEXT:    oris r3, r3, 54437
5143; CHECK-P8-BE-NEXT:    ori r3, r3, 4104
5144; CHECK-P8-BE-NEXT:    lbz r3, 0(r3)
5145; CHECK-P8-BE-NEXT:    blr
5146entry:
5147  %0 = load i64, ptr inttoptr (i64 1000000000001 to ptr), align 8
5148  %conv = trunc i64 %0 to i8
5149  ret i8 %conv
5150}
5151
5152; Function Attrs: norecurse nounwind readonly uwtable willreturn
5153define dso_local zeroext i8 @ld_cst_align64_uint8_t_uint64_t() {
5154; CHECK-P10-LE-LABEL: ld_cst_align64_uint8_t_uint64_t:
5155; CHECK-P10-LE:       # %bb.0: # %entry
5156; CHECK-P10-LE-NEXT:    pli r3, 244140625
5157; CHECK-P10-LE-NEXT:    rldic r3, r3, 12, 24
5158; CHECK-P10-LE-NEXT:    lbz r3, 0(r3)
5159; CHECK-P10-LE-NEXT:    blr
5160;
5161; CHECK-P10-BE-LABEL: ld_cst_align64_uint8_t_uint64_t:
5162; CHECK-P10-BE:       # %bb.0: # %entry
5163; CHECK-P10-BE-NEXT:    pli r3, 232
5164; CHECK-P10-BE-NEXT:    pli r4, 3567587335
5165; CHECK-P10-BE-NEXT:    rldimi r4, r3, 32, 0
5166; CHECK-P10-BE-NEXT:    lbz r3, 0(r4)
5167; CHECK-P10-BE-NEXT:    blr
5168;
5169; CHECK-P9-LE-LABEL: ld_cst_align64_uint8_t_uint64_t:
5170; CHECK-P9-LE:       # %bb.0: # %entry
5171; CHECK-P9-LE-NEXT:    lis r3, 3725
5172; CHECK-P9-LE-NEXT:    ori r3, r3, 19025
5173; CHECK-P9-LE-NEXT:    rldic r3, r3, 12, 24
5174; CHECK-P9-LE-NEXT:    lbz r3, 0(r3)
5175; CHECK-P9-LE-NEXT:    blr
5176;
5177; CHECK-P9-BE-LABEL: ld_cst_align64_uint8_t_uint64_t:
5178; CHECK-P9-BE:       # %bb.0: # %entry
5179; CHECK-P9-BE-NEXT:    li r3, 29
5180; CHECK-P9-BE-NEXT:    rldic r3, r3, 35, 24
5181; CHECK-P9-BE-NEXT:    oris r3, r3, 54437
5182; CHECK-P9-BE-NEXT:    ori r3, r3, 4103
5183; CHECK-P9-BE-NEXT:    lbz r3, 0(r3)
5184; CHECK-P9-BE-NEXT:    blr
5185;
5186; CHECK-P8-LE-LABEL: ld_cst_align64_uint8_t_uint64_t:
5187; CHECK-P8-LE:       # %bb.0: # %entry
5188; CHECK-P8-LE-NEXT:    lis r3, 3725
5189; CHECK-P8-LE-NEXT:    ori r3, r3, 19025
5190; CHECK-P8-LE-NEXT:    rldic r3, r3, 12, 24
5191; CHECK-P8-LE-NEXT:    lbz r3, 0(r3)
5192; CHECK-P8-LE-NEXT:    blr
5193;
5194; CHECK-P8-BE-LABEL: ld_cst_align64_uint8_t_uint64_t:
5195; CHECK-P8-BE:       # %bb.0: # %entry
5196; CHECK-P8-BE-NEXT:    li r3, 29
5197; CHECK-P8-BE-NEXT:    rldic r3, r3, 35, 24
5198; CHECK-P8-BE-NEXT:    oris r3, r3, 54437
5199; CHECK-P8-BE-NEXT:    ori r3, r3, 4103
5200; CHECK-P8-BE-NEXT:    lbz r3, 0(r3)
5201; CHECK-P8-BE-NEXT:    blr
5202entry:
5203  %0 = load i64, ptr inttoptr (i64 1000000000000 to ptr), align 4096
5204  %conv = trunc i64 %0 to i8
5205  ret i8 %conv
5206}
5207
5208; Function Attrs: norecurse nounwind readonly uwtable willreturn
5209define dso_local zeroext i8 @ld_0_uint8_t_float(i64 %ptr) {
5210; CHECK-LABEL: ld_0_uint8_t_float:
5211; CHECK:       # %bb.0: # %entry
5212; CHECK-NEXT:    lfs f0, 0(r3)
5213; CHECK-NEXT:    xscvdpsxws f0, f0
5214; CHECK-NEXT:    mffprwz r3, f0
5215; CHECK-NEXT:    blr
5216entry:
5217  %0 = inttoptr i64 %ptr to ptr
5218  %1 = load float, ptr %0, align 4
5219  %conv = fptoui float %1 to i8
5220  ret i8 %conv
5221}
5222
5223; Function Attrs: norecurse nounwind readonly uwtable willreturn
5224define dso_local zeroext i8 @ld_align16_uint8_t_float(ptr nocapture readonly %ptr) {
5225; CHECK-LABEL: ld_align16_uint8_t_float:
5226; CHECK:       # %bb.0: # %entry
5227; CHECK-NEXT:    lfs f0, 8(r3)
5228; CHECK-NEXT:    xscvdpsxws f0, f0
5229; CHECK-NEXT:    mffprwz r3, f0
5230; CHECK-NEXT:    blr
5231entry:
5232  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
5233  %0 = load float, ptr %add.ptr, align 4
5234  %conv = fptoui float %0 to i8
5235  ret i8 %conv
5236}
5237
5238; Function Attrs: norecurse nounwind readonly uwtable willreturn
5239define dso_local zeroext i8 @ld_align32_uint8_t_float(ptr nocapture readonly %ptr) {
5240; CHECK-P10-LABEL: ld_align32_uint8_t_float:
5241; CHECK-P10:       # %bb.0: # %entry
5242; CHECK-P10-NEXT:    plfs f0, 99999000(r3), 0
5243; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5244; CHECK-P10-NEXT:    mffprwz r3, f0
5245; CHECK-P10-NEXT:    blr
5246;
5247; CHECK-PREP10-LABEL: ld_align32_uint8_t_float:
5248; CHECK-PREP10:       # %bb.0: # %entry
5249; CHECK-PREP10-NEXT:    lis r4, 1525
5250; CHECK-PREP10-NEXT:    ori r4, r4, 56600
5251; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
5252; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5253; CHECK-PREP10-NEXT:    mffprwz r3, f0
5254; CHECK-PREP10-NEXT:    blr
5255entry:
5256  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
5257  %0 = load float, ptr %add.ptr, align 4
5258  %conv = fptoui float %0 to i8
5259  ret i8 %conv
5260}
5261
5262; Function Attrs: norecurse nounwind readonly uwtable willreturn
5263define dso_local zeroext i8 @ld_unalign64_uint8_t_float(ptr nocapture readonly %ptr) {
5264; CHECK-P10-LABEL: ld_unalign64_uint8_t_float:
5265; CHECK-P10:       # %bb.0: # %entry
5266; CHECK-P10-NEXT:    pli r4, 232
5267; CHECK-P10-NEXT:    pli r5, 3567587329
5268; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
5269; CHECK-P10-NEXT:    lfsx f0, r3, r5
5270; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5271; CHECK-P10-NEXT:    mffprwz r3, f0
5272; CHECK-P10-NEXT:    blr
5273;
5274; CHECK-PREP10-LABEL: ld_unalign64_uint8_t_float:
5275; CHECK-PREP10:       # %bb.0: # %entry
5276; CHECK-PREP10-NEXT:    li r4, 29
5277; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
5278; CHECK-PREP10-NEXT:    oris r4, r4, 54437
5279; CHECK-PREP10-NEXT:    ori r4, r4, 4097
5280; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
5281; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5282; CHECK-PREP10-NEXT:    mffprwz r3, f0
5283; CHECK-PREP10-NEXT:    blr
5284entry:
5285  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000001
5286  %0 = load float, ptr %add.ptr, align 4
5287  %conv = fptoui float %0 to i8
5288  ret i8 %conv
5289}
5290
5291; Function Attrs: norecurse nounwind readonly uwtable willreturn
5292define dso_local zeroext i8 @ld_align64_uint8_t_float(ptr nocapture readonly %ptr) {
5293; CHECK-P10-LABEL: ld_align64_uint8_t_float:
5294; CHECK-P10:       # %bb.0: # %entry
5295; CHECK-P10-NEXT:    pli r4, 244140625
5296; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5297; CHECK-P10-NEXT:    lfsx f0, r3, r4
5298; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5299; CHECK-P10-NEXT:    mffprwz r3, f0
5300; CHECK-P10-NEXT:    blr
5301;
5302; CHECK-PREP10-LABEL: ld_align64_uint8_t_float:
5303; CHECK-PREP10:       # %bb.0: # %entry
5304; CHECK-PREP10-NEXT:    lis r4, 3725
5305; CHECK-PREP10-NEXT:    ori r4, r4, 19025
5306; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
5307; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
5308; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5309; CHECK-PREP10-NEXT:    mffprwz r3, f0
5310; CHECK-PREP10-NEXT:    blr
5311entry:
5312  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
5313  %0 = load float, ptr %add.ptr, align 4
5314  %conv = fptoui float %0 to i8
5315  ret i8 %conv
5316}
5317
5318; Function Attrs: norecurse nounwind readonly uwtable willreturn
5319define dso_local zeroext i8 @ld_reg_uint8_t_float(ptr nocapture readonly %ptr, i64 %off) {
5320; CHECK-LABEL: ld_reg_uint8_t_float:
5321; CHECK:       # %bb.0: # %entry
5322; CHECK-NEXT:    lfsx f0, r3, r4
5323; CHECK-NEXT:    xscvdpsxws f0, f0
5324; CHECK-NEXT:    mffprwz r3, f0
5325; CHECK-NEXT:    blr
5326entry:
5327  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
5328  %0 = load float, ptr %add.ptr, align 4
5329  %conv = fptoui float %0 to i8
5330  ret i8 %conv
5331}
5332
5333; Function Attrs: norecurse nounwind readonly uwtable willreturn
5334define dso_local zeroext i8 @ld_or_uint8_t_float(i64 %ptr, i8 zeroext %off) {
5335; CHECK-LABEL: ld_or_uint8_t_float:
5336; CHECK:       # %bb.0: # %entry
5337; CHECK-NEXT:    or r3, r4, r3
5338; CHECK-NEXT:    lfs f0, 0(r3)
5339; CHECK-NEXT:    xscvdpsxws f0, f0
5340; CHECK-NEXT:    mffprwz r3, f0
5341; CHECK-NEXT:    blr
5342entry:
5343  %conv = zext i8 %off to i64
5344  %or = or i64 %conv, %ptr
5345  %0 = inttoptr i64 %or to ptr
5346  %1 = load float, ptr %0, align 4
5347  %conv1 = fptoui float %1 to i8
5348  ret i8 %conv1
5349}
5350
5351; Function Attrs: norecurse nounwind readonly uwtable willreturn
5352define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_float(i64 %ptr) {
5353; CHECK-LABEL: ld_not_disjoint16_uint8_t_float:
5354; CHECK:       # %bb.0: # %entry
5355; CHECK-NEXT:    ori r3, r3, 6
5356; CHECK-NEXT:    lfs f0, 0(r3)
5357; CHECK-NEXT:    xscvdpsxws f0, f0
5358; CHECK-NEXT:    mffprwz r3, f0
5359; CHECK-NEXT:    blr
5360entry:
5361  %or = or i64 %ptr, 6
5362  %0 = inttoptr i64 %or to ptr
5363  %1 = load float, ptr %0, align 4
5364  %conv = fptoui float %1 to i8
5365  ret i8 %conv
5366}
5367
5368; Function Attrs: norecurse nounwind readonly uwtable willreturn
5369define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_float(i64 %ptr) {
5370; CHECK-LABEL: ld_disjoint_align16_uint8_t_float:
5371; CHECK:       # %bb.0: # %entry
5372; CHECK-NEXT:    rldicr r3, r3, 0, 51
5373; CHECK-NEXT:    lfs f0, 24(r3)
5374; CHECK-NEXT:    xscvdpsxws f0, f0
5375; CHECK-NEXT:    mffprwz r3, f0
5376; CHECK-NEXT:    blr
5377entry:
5378  %and = and i64 %ptr, -4096
5379  %or = or i64 %and, 24
5380  %0 = inttoptr i64 %or to ptr
5381  %1 = load float, ptr %0, align 8
5382  %conv = fptoui float %1 to i8
5383  ret i8 %conv
5384}
5385
5386; Function Attrs: norecurse nounwind readonly uwtable willreturn
5387define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_float(i64 %ptr) {
5388; CHECK-LABEL: ld_not_disjoint32_uint8_t_float:
5389; CHECK:       # %bb.0: # %entry
5390; CHECK-NEXT:    ori r3, r3, 34463
5391; CHECK-NEXT:    oris r3, r3, 1
5392; CHECK-NEXT:    lfs f0, 0(r3)
5393; CHECK-NEXT:    xscvdpsxws f0, f0
5394; CHECK-NEXT:    mffprwz r3, f0
5395; CHECK-NEXT:    blr
5396entry:
5397  %or = or i64 %ptr, 99999
5398  %0 = inttoptr i64 %or to ptr
5399  %1 = load float, ptr %0, align 4
5400  %conv = fptoui float %1 to i8
5401  ret i8 %conv
5402}
5403
5404; Function Attrs: norecurse nounwind readonly uwtable willreturn
5405define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_float(i64 %ptr) {
5406; CHECK-P10-LABEL: ld_disjoint_align32_uint8_t_float:
5407; CHECK-P10:       # %bb.0: # %entry
5408; CHECK-P10-NEXT:    lis r4, -15264
5409; CHECK-P10-NEXT:    and r3, r3, r4
5410; CHECK-P10-NEXT:    plfs f0, 999990000(r3), 0
5411; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5412; CHECK-P10-NEXT:    mffprwz r3, f0
5413; CHECK-P10-NEXT:    blr
5414;
5415; CHECK-PREP10-LABEL: ld_disjoint_align32_uint8_t_float:
5416; CHECK-PREP10:       # %bb.0: # %entry
5417; CHECK-PREP10-NEXT:    lis r4, -15264
5418; CHECK-PREP10-NEXT:    and r3, r3, r4
5419; CHECK-PREP10-NEXT:    lis r4, 15258
5420; CHECK-PREP10-NEXT:    ori r4, r4, 41712
5421; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
5422; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5423; CHECK-PREP10-NEXT:    mffprwz r3, f0
5424; CHECK-PREP10-NEXT:    blr
5425entry:
5426  %and = and i64 %ptr, -1000341504
5427  %or = or i64 %and, 999990000
5428  %0 = inttoptr i64 %or to ptr
5429  %1 = load float, ptr %0, align 16
5430  %conv = fptoui float %1 to i8
5431  ret i8 %conv
5432}
5433
5434; Function Attrs: norecurse nounwind readonly uwtable willreturn
5435define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_float(i64 %ptr) {
5436; CHECK-P10-LABEL: ld_not_disjoint64_uint8_t_float:
5437; CHECK-P10:       # %bb.0: # %entry
5438; CHECK-P10-NEXT:    pli r4, 232
5439; CHECK-P10-NEXT:    pli r5, 3567587329
5440; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
5441; CHECK-P10-NEXT:    or r3, r3, r5
5442; CHECK-P10-NEXT:    lfs f0, 0(r3)
5443; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5444; CHECK-P10-NEXT:    mffprwz r3, f0
5445; CHECK-P10-NEXT:    blr
5446;
5447; CHECK-PREP10-LABEL: ld_not_disjoint64_uint8_t_float:
5448; CHECK-PREP10:       # %bb.0: # %entry
5449; CHECK-PREP10-NEXT:    li r4, 29
5450; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
5451; CHECK-PREP10-NEXT:    oris r4, r4, 54437
5452; CHECK-PREP10-NEXT:    ori r4, r4, 4097
5453; CHECK-PREP10-NEXT:    or r3, r3, r4
5454; CHECK-PREP10-NEXT:    lfs f0, 0(r3)
5455; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5456; CHECK-PREP10-NEXT:    mffprwz r3, f0
5457; CHECK-PREP10-NEXT:    blr
5458entry:
5459  %or = or i64 %ptr, 1000000000001
5460  %0 = inttoptr i64 %or to ptr
5461  %1 = load float, ptr %0, align 4
5462  %conv = fptoui float %1 to i8
5463  ret i8 %conv
5464}
5465
5466; Function Attrs: norecurse nounwind readonly uwtable willreturn
5467define dso_local zeroext i8 @ld_disjoint_unalign64_uint8_t_float(i64 %ptr) {
5468; CHECK-P10-LABEL: ld_disjoint_unalign64_uint8_t_float:
5469; CHECK-P10:       # %bb.0: # %entry
5470; CHECK-P10-NEXT:    pli r4, 232
5471; CHECK-P10-NEXT:    pli r5, 3567587329
5472; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
5473; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
5474; CHECK-P10-NEXT:    lfsx f0, r3, r5
5475; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5476; CHECK-P10-NEXT:    mffprwz r3, f0
5477; CHECK-P10-NEXT:    blr
5478;
5479; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint8_t_float:
5480; CHECK-PREP10:       # %bb.0: # %entry
5481; CHECK-PREP10-NEXT:    li r4, 29
5482; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
5483; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
5484; CHECK-PREP10-NEXT:    oris r4, r4, 54437
5485; CHECK-PREP10-NEXT:    ori r4, r4, 4097
5486; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
5487; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5488; CHECK-PREP10-NEXT:    mffprwz r3, f0
5489; CHECK-PREP10-NEXT:    blr
5490entry:
5491  %and = and i64 %ptr, -1099511627776
5492  %or = or i64 %and, 1000000000001
5493  %0 = inttoptr i64 %or to ptr
5494  %1 = load float, ptr %0, align 4
5495  %conv = fptoui float %1 to i8
5496  ret i8 %conv
5497}
5498
5499; Function Attrs: norecurse nounwind readonly uwtable willreturn
5500define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_float(i64 %ptr) {
5501; CHECK-P10-LABEL: ld_disjoint_align64_uint8_t_float:
5502; CHECK-P10:       # %bb.0: # %entry
5503; CHECK-P10-NEXT:    pli r4, 244140625
5504; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
5505; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5506; CHECK-P10-NEXT:    lfsx f0, r3, r4
5507; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5508; CHECK-P10-NEXT:    mffprwz r3, f0
5509; CHECK-P10-NEXT:    blr
5510;
5511; CHECK-PREP10-LABEL: ld_disjoint_align64_uint8_t_float:
5512; CHECK-PREP10:       # %bb.0: # %entry
5513; CHECK-PREP10-NEXT:    lis r4, 3725
5514; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
5515; CHECK-PREP10-NEXT:    ori r4, r4, 19025
5516; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
5517; CHECK-PREP10-NEXT:    lfsx f0, r3, r4
5518; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5519; CHECK-PREP10-NEXT:    mffprwz r3, f0
5520; CHECK-PREP10-NEXT:    blr
5521entry:
5522  %and = and i64 %ptr, -1099511627776
5523  %or = or i64 %and, 1000000000000
5524  %0 = inttoptr i64 %or to ptr
5525  %1 = load float, ptr %0, align 4096
5526  %conv = fptoui float %1 to i8
5527  ret i8 %conv
5528}
5529
5530; Function Attrs: norecurse nounwind readonly uwtable willreturn
5531define dso_local zeroext i8 @ld_cst_align16_uint8_t_float() {
5532; CHECK-LABEL: ld_cst_align16_uint8_t_float:
5533; CHECK:       # %bb.0: # %entry
5534; CHECK-NEXT:    lfs f0, 4080(0)
5535; CHECK-NEXT:    xscvdpsxws f0, f0
5536; CHECK-NEXT:    mffprwz r3, f0
5537; CHECK-NEXT:    blr
5538entry:
5539  %0 = load float, ptr inttoptr (i64 4080 to ptr), align 16
5540  %conv = fptoui float %0 to i8
5541  ret i8 %conv
5542}
5543
5544; Function Attrs: norecurse nounwind readonly uwtable willreturn
5545define dso_local zeroext i8 @ld_cst_align32_uint8_t_float() {
5546; CHECK-LABEL: ld_cst_align32_uint8_t_float:
5547; CHECK:       # %bb.0: # %entry
5548; CHECK-NEXT:    lis r3, 153
5549; CHECK-NEXT:    lfs f0, -27108(r3)
5550; CHECK-NEXT:    xscvdpsxws f0, f0
5551; CHECK-NEXT:    mffprwz r3, f0
5552; CHECK-NEXT:    blr
5553entry:
5554  %0 = load float, ptr inttoptr (i64 9999900 to ptr), align 4
5555  %conv = fptoui float %0 to i8
5556  ret i8 %conv
5557}
5558
5559; Function Attrs: norecurse nounwind readonly uwtable willreturn
5560define dso_local zeroext i8 @ld_cst_unalign64_uint8_t_float() {
5561; CHECK-P10-LABEL: ld_cst_unalign64_uint8_t_float:
5562; CHECK-P10:       # %bb.0: # %entry
5563; CHECK-P10-NEXT:    pli r3, 232
5564; CHECK-P10-NEXT:    pli r4, 3567587329
5565; CHECK-P10-NEXT:    rldimi r4, r3, 32, 0
5566; CHECK-P10-NEXT:    lfs f0, 0(r4)
5567; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5568; CHECK-P10-NEXT:    mffprwz r3, f0
5569; CHECK-P10-NEXT:    blr
5570;
5571; CHECK-PREP10-LABEL: ld_cst_unalign64_uint8_t_float:
5572; CHECK-PREP10:       # %bb.0: # %entry
5573; CHECK-PREP10-NEXT:    li r3, 29
5574; CHECK-PREP10-NEXT:    rldic r3, r3, 35, 24
5575; CHECK-PREP10-NEXT:    oris r3, r3, 54437
5576; CHECK-PREP10-NEXT:    ori r3, r3, 4097
5577; CHECK-PREP10-NEXT:    lfs f0, 0(r3)
5578; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5579; CHECK-PREP10-NEXT:    mffprwz r3, f0
5580; CHECK-PREP10-NEXT:    blr
5581entry:
5582  %0 = load float, ptr inttoptr (i64 1000000000001 to ptr), align 4
5583  %conv = fptoui float %0 to i8
5584  ret i8 %conv
5585}
5586
5587; Function Attrs: norecurse nounwind readonly uwtable willreturn
5588define dso_local zeroext i8 @ld_cst_align64_uint8_t_float() {
5589; CHECK-P10-LABEL: ld_cst_align64_uint8_t_float:
5590; CHECK-P10:       # %bb.0: # %entry
5591; CHECK-P10-NEXT:    pli r3, 244140625
5592; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
5593; CHECK-P10-NEXT:    lfs f0, 0(r3)
5594; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5595; CHECK-P10-NEXT:    mffprwz r3, f0
5596; CHECK-P10-NEXT:    blr
5597;
5598; CHECK-PREP10-LABEL: ld_cst_align64_uint8_t_float:
5599; CHECK-PREP10:       # %bb.0: # %entry
5600; CHECK-PREP10-NEXT:    lis r3, 3725
5601; CHECK-PREP10-NEXT:    ori r3, r3, 19025
5602; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
5603; CHECK-PREP10-NEXT:    lfs f0, 0(r3)
5604; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5605; CHECK-PREP10-NEXT:    mffprwz r3, f0
5606; CHECK-PREP10-NEXT:    blr
5607entry:
5608  %0 = load float, ptr inttoptr (i64 1000000000000 to ptr), align 4096
5609  %conv = fptoui float %0 to i8
5610  ret i8 %conv
5611}
5612
5613; Function Attrs: norecurse nounwind readonly uwtable willreturn
5614define dso_local zeroext i8 @ld_0_uint8_t_double(i64 %ptr) {
5615; CHECK-LABEL: ld_0_uint8_t_double:
5616; CHECK:       # %bb.0: # %entry
5617; CHECK-NEXT:    lfd f0, 0(r3)
5618; CHECK-NEXT:    xscvdpsxws f0, f0
5619; CHECK-NEXT:    mffprwz r3, f0
5620; CHECK-NEXT:    blr
5621entry:
5622  %0 = inttoptr i64 %ptr to ptr
5623  %1 = load double, ptr %0, align 8
5624  %conv = fptoui double %1 to i8
5625  ret i8 %conv
5626}
5627
5628; Function Attrs: norecurse nounwind readonly uwtable willreturn
5629define dso_local zeroext i8 @ld_align16_uint8_t_double(ptr nocapture readonly %ptr) {
5630; CHECK-LABEL: ld_align16_uint8_t_double:
5631; CHECK:       # %bb.0: # %entry
5632; CHECK-NEXT:    lfd f0, 8(r3)
5633; CHECK-NEXT:    xscvdpsxws f0, f0
5634; CHECK-NEXT:    mffprwz r3, f0
5635; CHECK-NEXT:    blr
5636entry:
5637  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
5638  %0 = load double, ptr %add.ptr, align 8
5639  %conv = fptoui double %0 to i8
5640  ret i8 %conv
5641}
5642
5643; Function Attrs: norecurse nounwind readonly uwtable willreturn
5644define dso_local zeroext i8 @ld_align32_uint8_t_double(ptr nocapture readonly %ptr) {
5645; CHECK-P10-LABEL: ld_align32_uint8_t_double:
5646; CHECK-P10:       # %bb.0: # %entry
5647; CHECK-P10-NEXT:    plfd f0, 99999000(r3), 0
5648; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5649; CHECK-P10-NEXT:    mffprwz r3, f0
5650; CHECK-P10-NEXT:    blr
5651;
5652; CHECK-PREP10-LABEL: ld_align32_uint8_t_double:
5653; CHECK-PREP10:       # %bb.0: # %entry
5654; CHECK-PREP10-NEXT:    lis r4, 1525
5655; CHECK-PREP10-NEXT:    ori r4, r4, 56600
5656; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
5657; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5658; CHECK-PREP10-NEXT:    mffprwz r3, f0
5659; CHECK-PREP10-NEXT:    blr
5660entry:
5661  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
5662  %0 = load double, ptr %add.ptr, align 8
5663  %conv = fptoui double %0 to i8
5664  ret i8 %conv
5665}
5666
5667; Function Attrs: norecurse nounwind readonly uwtable willreturn
5668define dso_local zeroext i8 @ld_unalign64_uint8_t_double(ptr nocapture readonly %ptr) {
5669; CHECK-P10-LABEL: ld_unalign64_uint8_t_double:
5670; CHECK-P10:       # %bb.0: # %entry
5671; CHECK-P10-NEXT:    pli r4, 232
5672; CHECK-P10-NEXT:    pli r5, 3567587329
5673; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
5674; CHECK-P10-NEXT:    lfdx f0, r3, r5
5675; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5676; CHECK-P10-NEXT:    mffprwz r3, f0
5677; CHECK-P10-NEXT:    blr
5678;
5679; CHECK-PREP10-LABEL: ld_unalign64_uint8_t_double:
5680; CHECK-PREP10:       # %bb.0: # %entry
5681; CHECK-PREP10-NEXT:    li r4, 29
5682; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
5683; CHECK-PREP10-NEXT:    oris r4, r4, 54437
5684; CHECK-PREP10-NEXT:    ori r4, r4, 4097
5685; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
5686; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5687; CHECK-PREP10-NEXT:    mffprwz r3, f0
5688; CHECK-PREP10-NEXT:    blr
5689entry:
5690  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000001
5691  %0 = load double, ptr %add.ptr, align 8
5692  %conv = fptoui double %0 to i8
5693  ret i8 %conv
5694}
5695
5696; Function Attrs: norecurse nounwind readonly uwtable willreturn
5697define dso_local zeroext i8 @ld_align64_uint8_t_double(ptr nocapture readonly %ptr) {
5698; CHECK-P10-LABEL: ld_align64_uint8_t_double:
5699; CHECK-P10:       # %bb.0: # %entry
5700; CHECK-P10-NEXT:    pli r4, 244140625
5701; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5702; CHECK-P10-NEXT:    lfdx f0, r3, r4
5703; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5704; CHECK-P10-NEXT:    mffprwz r3, f0
5705; CHECK-P10-NEXT:    blr
5706;
5707; CHECK-PREP10-LABEL: ld_align64_uint8_t_double:
5708; CHECK-PREP10:       # %bb.0: # %entry
5709; CHECK-PREP10-NEXT:    lis r4, 3725
5710; CHECK-PREP10-NEXT:    ori r4, r4, 19025
5711; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
5712; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
5713; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5714; CHECK-PREP10-NEXT:    mffprwz r3, f0
5715; CHECK-PREP10-NEXT:    blr
5716entry:
5717  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
5718  %0 = load double, ptr %add.ptr, align 8
5719  %conv = fptoui double %0 to i8
5720  ret i8 %conv
5721}
5722
5723; Function Attrs: norecurse nounwind readonly uwtable willreturn
5724define dso_local zeroext i8 @ld_reg_uint8_t_double(ptr nocapture readonly %ptr, i64 %off) {
5725; CHECK-LABEL: ld_reg_uint8_t_double:
5726; CHECK:       # %bb.0: # %entry
5727; CHECK-NEXT:    lfdx f0, r3, r4
5728; CHECK-NEXT:    xscvdpsxws f0, f0
5729; CHECK-NEXT:    mffprwz r3, f0
5730; CHECK-NEXT:    blr
5731entry:
5732  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
5733  %0 = load double, ptr %add.ptr, align 8
5734  %conv = fptoui double %0 to i8
5735  ret i8 %conv
5736}
5737
5738; Function Attrs: norecurse nounwind readonly uwtable willreturn
5739define dso_local zeroext i8 @ld_or_uint8_t_double(i64 %ptr, i8 zeroext %off) {
5740; CHECK-LABEL: ld_or_uint8_t_double:
5741; CHECK:       # %bb.0: # %entry
5742; CHECK-NEXT:    or r3, r4, r3
5743; CHECK-NEXT:    lfd f0, 0(r3)
5744; CHECK-NEXT:    xscvdpsxws f0, f0
5745; CHECK-NEXT:    mffprwz r3, f0
5746; CHECK-NEXT:    blr
5747entry:
5748  %conv = zext i8 %off to i64
5749  %or = or i64 %conv, %ptr
5750  %0 = inttoptr i64 %or to ptr
5751  %1 = load double, ptr %0, align 8
5752  %conv1 = fptoui double %1 to i8
5753  ret i8 %conv1
5754}
5755
5756; Function Attrs: norecurse nounwind readonly uwtable willreturn
5757define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_double(i64 %ptr) {
5758; CHECK-LABEL: ld_not_disjoint16_uint8_t_double:
5759; CHECK:       # %bb.0: # %entry
5760; CHECK-NEXT:    ori r3, r3, 6
5761; CHECK-NEXT:    lfd f0, 0(r3)
5762; CHECK-NEXT:    xscvdpsxws f0, f0
5763; CHECK-NEXT:    mffprwz r3, f0
5764; CHECK-NEXT:    blr
5765entry:
5766  %or = or i64 %ptr, 6
5767  %0 = inttoptr i64 %or to ptr
5768  %1 = load double, ptr %0, align 8
5769  %conv = fptoui double %1 to i8
5770  ret i8 %conv
5771}
5772
5773; Function Attrs: norecurse nounwind readonly uwtable willreturn
5774define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_double(i64 %ptr) {
5775; CHECK-LABEL: ld_disjoint_align16_uint8_t_double:
5776; CHECK:       # %bb.0: # %entry
5777; CHECK-NEXT:    rldicr r3, r3, 0, 51
5778; CHECK-NEXT:    lfd f0, 24(r3)
5779; CHECK-NEXT:    xscvdpsxws f0, f0
5780; CHECK-NEXT:    mffprwz r3, f0
5781; CHECK-NEXT:    blr
5782entry:
5783  %and = and i64 %ptr, -4096
5784  %or = or i64 %and, 24
5785  %0 = inttoptr i64 %or to ptr
5786  %1 = load double, ptr %0, align 8
5787  %conv = fptoui double %1 to i8
5788  ret i8 %conv
5789}
5790
5791; Function Attrs: norecurse nounwind readonly uwtable willreturn
5792define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_double(i64 %ptr) {
5793; CHECK-LABEL: ld_not_disjoint32_uint8_t_double:
5794; CHECK:       # %bb.0: # %entry
5795; CHECK-NEXT:    ori r3, r3, 34463
5796; CHECK-NEXT:    oris r3, r3, 1
5797; CHECK-NEXT:    lfd f0, 0(r3)
5798; CHECK-NEXT:    xscvdpsxws f0, f0
5799; CHECK-NEXT:    mffprwz r3, f0
5800; CHECK-NEXT:    blr
5801entry:
5802  %or = or i64 %ptr, 99999
5803  %0 = inttoptr i64 %or to ptr
5804  %1 = load double, ptr %0, align 8
5805  %conv = fptoui double %1 to i8
5806  ret i8 %conv
5807}
5808
5809; Function Attrs: norecurse nounwind readonly uwtable willreturn
5810define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_double(i64 %ptr) {
5811; CHECK-P10-LABEL: ld_disjoint_align32_uint8_t_double:
5812; CHECK-P10:       # %bb.0: # %entry
5813; CHECK-P10-NEXT:    lis r4, -15264
5814; CHECK-P10-NEXT:    and r3, r3, r4
5815; CHECK-P10-NEXT:    plfd f0, 999990000(r3), 0
5816; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5817; CHECK-P10-NEXT:    mffprwz r3, f0
5818; CHECK-P10-NEXT:    blr
5819;
5820; CHECK-PREP10-LABEL: ld_disjoint_align32_uint8_t_double:
5821; CHECK-PREP10:       # %bb.0: # %entry
5822; CHECK-PREP10-NEXT:    lis r4, -15264
5823; CHECK-PREP10-NEXT:    and r3, r3, r4
5824; CHECK-PREP10-NEXT:    lis r4, 15258
5825; CHECK-PREP10-NEXT:    ori r4, r4, 41712
5826; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
5827; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5828; CHECK-PREP10-NEXT:    mffprwz r3, f0
5829; CHECK-PREP10-NEXT:    blr
5830entry:
5831  %and = and i64 %ptr, -1000341504
5832  %or = or i64 %and, 999990000
5833  %0 = inttoptr i64 %or to ptr
5834  %1 = load double, ptr %0, align 16
5835  %conv = fptoui double %1 to i8
5836  ret i8 %conv
5837}
5838
5839; Function Attrs: norecurse nounwind readonly uwtable willreturn
5840define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_double(i64 %ptr) {
5841; CHECK-P10-LABEL: ld_not_disjoint64_uint8_t_double:
5842; CHECK-P10:       # %bb.0: # %entry
5843; CHECK-P10-NEXT:    pli r4, 232
5844; CHECK-P10-NEXT:    pli r5, 3567587329
5845; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
5846; CHECK-P10-NEXT:    or r3, r3, r5
5847; CHECK-P10-NEXT:    lfd f0, 0(r3)
5848; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5849; CHECK-P10-NEXT:    mffprwz r3, f0
5850; CHECK-P10-NEXT:    blr
5851;
5852; CHECK-PREP10-LABEL: ld_not_disjoint64_uint8_t_double:
5853; CHECK-PREP10:       # %bb.0: # %entry
5854; CHECK-PREP10-NEXT:    li r4, 29
5855; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
5856; CHECK-PREP10-NEXT:    oris r4, r4, 54437
5857; CHECK-PREP10-NEXT:    ori r4, r4, 4097
5858; CHECK-PREP10-NEXT:    or r3, r3, r4
5859; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
5860; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5861; CHECK-PREP10-NEXT:    mffprwz r3, f0
5862; CHECK-PREP10-NEXT:    blr
5863entry:
5864  %or = or i64 %ptr, 1000000000001
5865  %0 = inttoptr i64 %or to ptr
5866  %1 = load double, ptr %0, align 8
5867  %conv = fptoui double %1 to i8
5868  ret i8 %conv
5869}
5870
5871; Function Attrs: norecurse nounwind readonly uwtable willreturn
5872define dso_local zeroext i8 @ld_disjoint_unalign64_uint8_t_double(i64 %ptr) {
5873; CHECK-P10-LABEL: ld_disjoint_unalign64_uint8_t_double:
5874; CHECK-P10:       # %bb.0: # %entry
5875; CHECK-P10-NEXT:    pli r4, 232
5876; CHECK-P10-NEXT:    pli r5, 3567587329
5877; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
5878; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
5879; CHECK-P10-NEXT:    lfdx f0, r3, r5
5880; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5881; CHECK-P10-NEXT:    mffprwz r3, f0
5882; CHECK-P10-NEXT:    blr
5883;
5884; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint8_t_double:
5885; CHECK-PREP10:       # %bb.0: # %entry
5886; CHECK-PREP10-NEXT:    li r4, 29
5887; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
5888; CHECK-PREP10-NEXT:    rldic r4, r4, 35, 24
5889; CHECK-PREP10-NEXT:    oris r4, r4, 54437
5890; CHECK-PREP10-NEXT:    ori r4, r4, 4097
5891; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
5892; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5893; CHECK-PREP10-NEXT:    mffprwz r3, f0
5894; CHECK-PREP10-NEXT:    blr
5895entry:
5896  %and = and i64 %ptr, -1099511627776
5897  %or = or i64 %and, 1000000000001
5898  %0 = inttoptr i64 %or to ptr
5899  %1 = load double, ptr %0, align 8
5900  %conv = fptoui double %1 to i8
5901  ret i8 %conv
5902}
5903
5904; Function Attrs: norecurse nounwind readonly uwtable willreturn
5905define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_double(i64 %ptr) {
5906; CHECK-P10-LABEL: ld_disjoint_align64_uint8_t_double:
5907; CHECK-P10:       # %bb.0: # %entry
5908; CHECK-P10-NEXT:    pli r4, 244140625
5909; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
5910; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
5911; CHECK-P10-NEXT:    lfdx f0, r3, r4
5912; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5913; CHECK-P10-NEXT:    mffprwz r3, f0
5914; CHECK-P10-NEXT:    blr
5915;
5916; CHECK-PREP10-LABEL: ld_disjoint_align64_uint8_t_double:
5917; CHECK-PREP10:       # %bb.0: # %entry
5918; CHECK-PREP10-NEXT:    lis r4, 3725
5919; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
5920; CHECK-PREP10-NEXT:    ori r4, r4, 19025
5921; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
5922; CHECK-PREP10-NEXT:    lfdx f0, r3, r4
5923; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5924; CHECK-PREP10-NEXT:    mffprwz r3, f0
5925; CHECK-PREP10-NEXT:    blr
5926entry:
5927  %and = and i64 %ptr, -1099511627776
5928  %or = or i64 %and, 1000000000000
5929  %0 = inttoptr i64 %or to ptr
5930  %1 = load double, ptr %0, align 4096
5931  %conv = fptoui double %1 to i8
5932  ret i8 %conv
5933}
5934
5935; Function Attrs: norecurse nounwind readonly uwtable willreturn
5936define dso_local zeroext i8 @ld_cst_align16_uint8_t_double() {
5937; CHECK-LABEL: ld_cst_align16_uint8_t_double:
5938; CHECK:       # %bb.0: # %entry
5939; CHECK-NEXT:    lfd f0, 4080(0)
5940; CHECK-NEXT:    xscvdpsxws f0, f0
5941; CHECK-NEXT:    mffprwz r3, f0
5942; CHECK-NEXT:    blr
5943entry:
5944  %0 = load double, ptr inttoptr (i64 4080 to ptr), align 16
5945  %conv = fptoui double %0 to i8
5946  ret i8 %conv
5947}
5948
5949; Function Attrs: norecurse nounwind readonly uwtable willreturn
5950define dso_local zeroext i8 @ld_cst_align32_uint8_t_double() {
5951; CHECK-LABEL: ld_cst_align32_uint8_t_double:
5952; CHECK:       # %bb.0: # %entry
5953; CHECK-NEXT:    lis r3, 153
5954; CHECK-NEXT:    lfd f0, -27108(r3)
5955; CHECK-NEXT:    xscvdpsxws f0, f0
5956; CHECK-NEXT:    mffprwz r3, f0
5957; CHECK-NEXT:    blr
5958entry:
5959  %0 = load double, ptr inttoptr (i64 9999900 to ptr), align 8
5960  %conv = fptoui double %0 to i8
5961  ret i8 %conv
5962}
5963
5964; Function Attrs: norecurse nounwind readonly uwtable willreturn
5965define dso_local zeroext i8 @ld_cst_unalign64_uint8_t_double() {
5966; CHECK-P10-LABEL: ld_cst_unalign64_uint8_t_double:
5967; CHECK-P10:       # %bb.0: # %entry
5968; CHECK-P10-NEXT:    pli r3, 232
5969; CHECK-P10-NEXT:    pli r4, 3567587329
5970; CHECK-P10-NEXT:    rldimi r4, r3, 32, 0
5971; CHECK-P10-NEXT:    lfd f0, 0(r4)
5972; CHECK-P10-NEXT:    xscvdpsxws f0, f0
5973; CHECK-P10-NEXT:    mffprwz r3, f0
5974; CHECK-P10-NEXT:    blr
5975;
5976; CHECK-PREP10-LABEL: ld_cst_unalign64_uint8_t_double:
5977; CHECK-PREP10:       # %bb.0: # %entry
5978; CHECK-PREP10-NEXT:    li r3, 29
5979; CHECK-PREP10-NEXT:    rldic r3, r3, 35, 24
5980; CHECK-PREP10-NEXT:    oris r3, r3, 54437
5981; CHECK-PREP10-NEXT:    ori r3, r3, 4097
5982; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
5983; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
5984; CHECK-PREP10-NEXT:    mffprwz r3, f0
5985; CHECK-PREP10-NEXT:    blr
5986entry:
5987  %0 = load double, ptr inttoptr (i64 1000000000001 to ptr), align 8
5988  %conv = fptoui double %0 to i8
5989  ret i8 %conv
5990}
5991
5992; Function Attrs: norecurse nounwind readonly uwtable willreturn
5993define dso_local zeroext i8 @ld_cst_align64_uint8_t_double() {
5994; CHECK-P10-LABEL: ld_cst_align64_uint8_t_double:
5995; CHECK-P10:       # %bb.0: # %entry
5996; CHECK-P10-NEXT:    pli r3, 244140625
5997; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
5998; CHECK-P10-NEXT:    lfd f0, 0(r3)
5999; CHECK-P10-NEXT:    xscvdpsxws f0, f0
6000; CHECK-P10-NEXT:    mffprwz r3, f0
6001; CHECK-P10-NEXT:    blr
6002;
6003; CHECK-PREP10-LABEL: ld_cst_align64_uint8_t_double:
6004; CHECK-PREP10:       # %bb.0: # %entry
6005; CHECK-PREP10-NEXT:    lis r3, 3725
6006; CHECK-PREP10-NEXT:    ori r3, r3, 19025
6007; CHECK-PREP10-NEXT:    rldic r3, r3, 12, 24
6008; CHECK-PREP10-NEXT:    lfd f0, 0(r3)
6009; CHECK-PREP10-NEXT:    xscvdpsxws f0, f0
6010; CHECK-PREP10-NEXT:    mffprwz r3, f0
6011; CHECK-PREP10-NEXT:    blr
6012entry:
6013  %0 = load double, ptr inttoptr (i64 1000000000000 to ptr), align 4096
6014  %conv = fptoui double %0 to i8
6015  ret i8 %conv
6016}
6017
6018; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6019define dso_local void @st_0_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
6020; CHECK-LABEL: st_0_uint8_t_uint8_t:
6021; CHECK:       # %bb.0: # %entry
6022; CHECK-NEXT:    stb r4, 0(r3)
6023; CHECK-NEXT:    blr
6024entry:
6025  %0 = inttoptr i64 %ptr to ptr
6026  store i8 %str, ptr %0, align 1
6027  ret void
6028}
6029
6030; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6031define dso_local void @st_align16_uint8_t_uint8_t(ptr nocapture %ptr, i8 zeroext %str) {
6032; CHECK-LABEL: st_align16_uint8_t_uint8_t:
6033; CHECK:       # %bb.0: # %entry
6034; CHECK-NEXT:    stb r4, 8(r3)
6035; CHECK-NEXT:    blr
6036entry:
6037  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
6038  store i8 %str, ptr %add.ptr, align 1
6039  ret void
6040}
6041
6042; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6043define dso_local void @st_align32_uint8_t_uint8_t(ptr nocapture %ptr, i8 zeroext %str) {
6044; CHECK-P10-LABEL: st_align32_uint8_t_uint8_t:
6045; CHECK-P10:       # %bb.0: # %entry
6046; CHECK-P10-NEXT:    pstb r4, 99999000(r3), 0
6047; CHECK-P10-NEXT:    blr
6048;
6049; CHECK-PREP10-LABEL: st_align32_uint8_t_uint8_t:
6050; CHECK-PREP10:       # %bb.0: # %entry
6051; CHECK-PREP10-NEXT:    lis r5, 1525
6052; CHECK-PREP10-NEXT:    ori r5, r5, 56600
6053; CHECK-PREP10-NEXT:    stbx r4, r3, r5
6054; CHECK-PREP10-NEXT:    blr
6055entry:
6056  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
6057  store i8 %str, ptr %add.ptr, align 1
6058  ret void
6059}
6060
6061; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6062define dso_local void @st_align64_uint8_t_uint8_t(ptr nocapture %ptr, i8 zeroext %str) {
6063; CHECK-P10-LABEL: st_align64_uint8_t_uint8_t:
6064; CHECK-P10:       # %bb.0: # %entry
6065; CHECK-P10-NEXT:    pli r5, 244140625
6066; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
6067; CHECK-P10-NEXT:    stbx r4, r3, r5
6068; CHECK-P10-NEXT:    blr
6069;
6070; CHECK-PREP10-LABEL: st_align64_uint8_t_uint8_t:
6071; CHECK-PREP10:       # %bb.0: # %entry
6072; CHECK-PREP10-NEXT:    lis r5, 3725
6073; CHECK-PREP10-NEXT:    ori r5, r5, 19025
6074; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
6075; CHECK-PREP10-NEXT:    stbx r4, r3, r5
6076; CHECK-PREP10-NEXT:    blr
6077entry:
6078  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
6079  store i8 %str, ptr %add.ptr, align 1
6080  ret void
6081}
6082
6083; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6084define dso_local void @st_reg_uint8_t_uint8_t(ptr nocapture %ptr, i64 %off, i8 zeroext %str) {
6085; CHECK-LABEL: st_reg_uint8_t_uint8_t:
6086; CHECK:       # %bb.0: # %entry
6087; CHECK-NEXT:    stbx r5, r3, r4
6088; CHECK-NEXT:    blr
6089entry:
6090  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
6091  store i8 %str, ptr %add.ptr, align 1
6092  ret void
6093}
6094
6095; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6096define dso_local void @st_or1_uint8_t_uint8_t(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
6097; CHECK-LABEL: st_or1_uint8_t_uint8_t:
6098; CHECK:       # %bb.0: # %entry
6099; CHECK-NEXT:    or r3, r4, r3
6100; CHECK-NEXT:    stb r5, 0(r3)
6101; CHECK-NEXT:    blr
6102entry:
6103  %conv = zext i8 %off to i64
6104  %or = or i64 %conv, %ptr
6105  %0 = inttoptr i64 %or to ptr
6106  store i8 %str, ptr %0, align 1
6107  ret void
6108}
6109
6110; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6111define dso_local void @st_not_disjoint16_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
6112; CHECK-LABEL: st_not_disjoint16_uint8_t_uint8_t:
6113; CHECK:       # %bb.0: # %entry
6114; CHECK-NEXT:    ori r3, r3, 6
6115; CHECK-NEXT:    stb r4, 0(r3)
6116; CHECK-NEXT:    blr
6117entry:
6118  %or = or i64 %ptr, 6
6119  %0 = inttoptr i64 %or to ptr
6120  store i8 %str, ptr %0, align 1
6121  ret void
6122}
6123
6124; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6125define dso_local void @st_disjoint_align16_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
6126; CHECK-LABEL: st_disjoint_align16_uint8_t_uint8_t:
6127; CHECK:       # %bb.0: # %entry
6128; CHECK-NEXT:    rldicr r3, r3, 0, 51
6129; CHECK-NEXT:    stb r4, 24(r3)
6130; CHECK-NEXT:    blr
6131entry:
6132  %and = and i64 %ptr, -4096
6133  %or = or i64 %and, 24
6134  %0 = inttoptr i64 %or to ptr
6135  store i8 %str, ptr %0, align 8
6136  ret void
6137}
6138
6139; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6140define dso_local void @st_not_disjoint32_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
6141; CHECK-LABEL: st_not_disjoint32_uint8_t_uint8_t:
6142; CHECK:       # %bb.0: # %entry
6143; CHECK-NEXT:    ori r3, r3, 34463
6144; CHECK-NEXT:    oris r3, r3, 1
6145; CHECK-NEXT:    stb r4, 0(r3)
6146; CHECK-NEXT:    blr
6147entry:
6148  %or = or i64 %ptr, 99999
6149  %0 = inttoptr i64 %or to ptr
6150  store i8 %str, ptr %0, align 1
6151  ret void
6152}
6153
6154; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6155define dso_local void @st_disjoint_align32_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
6156; CHECK-P10-LABEL: st_disjoint_align32_uint8_t_uint8_t:
6157; CHECK-P10:       # %bb.0: # %entry
6158; CHECK-P10-NEXT:    lis r5, -15264
6159; CHECK-P10-NEXT:    and r3, r3, r5
6160; CHECK-P10-NEXT:    pstb r4, 999990000(r3), 0
6161; CHECK-P10-NEXT:    blr
6162;
6163; CHECK-PREP10-LABEL: st_disjoint_align32_uint8_t_uint8_t:
6164; CHECK-PREP10:       # %bb.0: # %entry
6165; CHECK-PREP10-NEXT:    lis r5, -15264
6166; CHECK-PREP10-NEXT:    and r3, r3, r5
6167; CHECK-PREP10-NEXT:    lis r5, 15258
6168; CHECK-PREP10-NEXT:    ori r5, r5, 41712
6169; CHECK-PREP10-NEXT:    stbx r4, r3, r5
6170; CHECK-PREP10-NEXT:    blr
6171entry:
6172  %and = and i64 %ptr, -1000341504
6173  %or = or i64 %and, 999990000
6174  %0 = inttoptr i64 %or to ptr
6175  store i8 %str, ptr %0, align 16
6176  ret void
6177}
6178
6179; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6180define dso_local void @st_not_disjoint64_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
6181; CHECK-P10-LABEL: st_not_disjoint64_uint8_t_uint8_t:
6182; CHECK-P10:       # %bb.0: # %entry
6183; CHECK-P10-NEXT:    pli r5, 232
6184; CHECK-P10-NEXT:    pli r6, 3567587329
6185; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
6186; CHECK-P10-NEXT:    or r3, r3, r6
6187; CHECK-P10-NEXT:    stb r4, 0(r3)
6188; CHECK-P10-NEXT:    blr
6189;
6190; CHECK-PREP10-LABEL: st_not_disjoint64_uint8_t_uint8_t:
6191; CHECK-PREP10:       # %bb.0: # %entry
6192; CHECK-PREP10-NEXT:    li r5, 29
6193; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
6194; CHECK-PREP10-NEXT:    oris r5, r5, 54437
6195; CHECK-PREP10-NEXT:    ori r5, r5, 4097
6196; CHECK-PREP10-NEXT:    or r3, r3, r5
6197; CHECK-PREP10-NEXT:    stb r4, 0(r3)
6198; CHECK-PREP10-NEXT:    blr
6199entry:
6200  %or = or i64 %ptr, 1000000000001
6201  %0 = inttoptr i64 %or to ptr
6202  store i8 %str, ptr %0, align 1
6203  ret void
6204}
6205
6206; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6207define dso_local void @st_disjoint_align64_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
6208; CHECK-P10-LABEL: st_disjoint_align64_uint8_t_uint8_t:
6209; CHECK-P10:       # %bb.0: # %entry
6210; CHECK-P10-NEXT:    pli r5, 244140625
6211; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
6212; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
6213; CHECK-P10-NEXT:    stbx r4, r3, r5
6214; CHECK-P10-NEXT:    blr
6215;
6216; CHECK-PREP10-LABEL: st_disjoint_align64_uint8_t_uint8_t:
6217; CHECK-PREP10:       # %bb.0: # %entry
6218; CHECK-PREP10-NEXT:    lis r5, 3725
6219; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
6220; CHECK-PREP10-NEXT:    ori r5, r5, 19025
6221; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
6222; CHECK-PREP10-NEXT:    stbx r4, r3, r5
6223; CHECK-PREP10-NEXT:    blr
6224entry:
6225  %and = and i64 %ptr, -1099511627776
6226  %or = or i64 %and, 1000000000000
6227  %0 = inttoptr i64 %or to ptr
6228  store i8 %str, ptr %0, align 4096
6229  ret void
6230}
6231
6232; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6233define dso_local void @st_cst_align16_uint8_t_uint8_t(i8 zeroext %str) {
6234; CHECK-LABEL: st_cst_align16_uint8_t_uint8_t:
6235; CHECK:       # %bb.0: # %entry
6236; CHECK-NEXT:    stb r3, 4080(0)
6237; CHECK-NEXT:    blr
6238entry:
6239  store i8 %str, ptr inttoptr (i64 4080 to ptr), align 16
6240  ret void
6241}
6242
6243; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6244define dso_local void @st_cst_align32_uint8_t_uint8_t(i8 zeroext %str) {
6245; CHECK-LABEL: st_cst_align32_uint8_t_uint8_t:
6246; CHECK:       # %bb.0: # %entry
6247; CHECK-NEXT:    lis r4, 153
6248; CHECK-NEXT:    stb r3, -27108(r4)
6249; CHECK-NEXT:    blr
6250entry:
6251  store i8 %str, ptr inttoptr (i64 9999900 to ptr), align 4
6252  ret void
6253}
6254
6255; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6256define dso_local void @st_cst_align64_uint8_t_uint8_t(i8 zeroext %str) {
6257; CHECK-P10-LABEL: st_cst_align64_uint8_t_uint8_t:
6258; CHECK-P10:       # %bb.0: # %entry
6259; CHECK-P10-NEXT:    pli r4, 244140625
6260; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
6261; CHECK-P10-NEXT:    stb r3, 0(r4)
6262; CHECK-P10-NEXT:    blr
6263;
6264; CHECK-PREP10-LABEL: st_cst_align64_uint8_t_uint8_t:
6265; CHECK-PREP10:       # %bb.0: # %entry
6266; CHECK-PREP10-NEXT:    lis r4, 3725
6267; CHECK-PREP10-NEXT:    ori r4, r4, 19025
6268; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
6269; CHECK-PREP10-NEXT:    stb r3, 0(r4)
6270; CHECK-PREP10-NEXT:    blr
6271entry:
6272  store i8 %str, ptr inttoptr (i64 1000000000000 to ptr), align 4096
6273  ret void
6274}
6275
6276; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6277define dso_local void @st_0_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
6278; CHECK-LABEL: st_0_uint8_t_uint16_t:
6279; CHECK:       # %bb.0: # %entry
6280; CHECK-NEXT:    sth r4, 0(r3)
6281; CHECK-NEXT:    blr
6282entry:
6283  %conv = zext i8 %str to i16
6284  %0 = inttoptr i64 %ptr to ptr
6285  store i16 %conv, ptr %0, align 2
6286  ret void
6287}
6288
6289; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6290define dso_local void @st_align16_uint8_t_uint16_t(ptr nocapture %ptr, i8 zeroext %str) {
6291; CHECK-LABEL: st_align16_uint8_t_uint16_t:
6292; CHECK:       # %bb.0: # %entry
6293; CHECK-NEXT:    sth r4, 8(r3)
6294; CHECK-NEXT:    blr
6295entry:
6296  %conv = zext i8 %str to i16
6297  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
6298  store i16 %conv, ptr %add.ptr, align 2
6299  ret void
6300}
6301
6302; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6303define dso_local void @st_align32_uint8_t_uint16_t(ptr nocapture %ptr, i8 zeroext %str) {
6304; CHECK-P10-LABEL: st_align32_uint8_t_uint16_t:
6305; CHECK-P10:       # %bb.0: # %entry
6306; CHECK-P10-NEXT:    psth r4, 99999000(r3), 0
6307; CHECK-P10-NEXT:    blr
6308;
6309; CHECK-PREP10-LABEL: st_align32_uint8_t_uint16_t:
6310; CHECK-PREP10:       # %bb.0: # %entry
6311; CHECK-PREP10-NEXT:    lis r5, 1525
6312; CHECK-PREP10-NEXT:    ori r5, r5, 56600
6313; CHECK-PREP10-NEXT:    sthx r4, r3, r5
6314; CHECK-PREP10-NEXT:    blr
6315entry:
6316  %conv = zext i8 %str to i16
6317  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
6318  store i16 %conv, ptr %add.ptr, align 2
6319  ret void
6320}
6321
6322; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6323define dso_local void @st_align64_uint8_t_uint16_t(ptr nocapture %ptr, i8 zeroext %str) {
6324; CHECK-P10-LABEL: st_align64_uint8_t_uint16_t:
6325; CHECK-P10:       # %bb.0: # %entry
6326; CHECK-P10-NEXT:    pli r5, 244140625
6327; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
6328; CHECK-P10-NEXT:    sthx r4, r3, r5
6329; CHECK-P10-NEXT:    blr
6330;
6331; CHECK-PREP10-LABEL: st_align64_uint8_t_uint16_t:
6332; CHECK-PREP10:       # %bb.0: # %entry
6333; CHECK-PREP10-NEXT:    lis r5, 3725
6334; CHECK-PREP10-NEXT:    ori r5, r5, 19025
6335; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
6336; CHECK-PREP10-NEXT:    sthx r4, r3, r5
6337; CHECK-PREP10-NEXT:    blr
6338entry:
6339  %conv = zext i8 %str to i16
6340  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
6341  store i16 %conv, ptr %add.ptr, align 2
6342  ret void
6343}
6344
6345; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6346define dso_local void @st_reg_uint8_t_uint16_t(ptr nocapture %ptr, i64 %off, i8 zeroext %str) {
6347; CHECK-LABEL: st_reg_uint8_t_uint16_t:
6348; CHECK:       # %bb.0: # %entry
6349; CHECK-NEXT:    sthx r5, r3, r4
6350; CHECK-NEXT:    blr
6351entry:
6352  %conv = zext i8 %str to i16
6353  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
6354  store i16 %conv, ptr %add.ptr, align 2
6355  ret void
6356}
6357
6358; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6359define dso_local void @st_or1_uint8_t_uint16_t(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
6360; CHECK-LABEL: st_or1_uint8_t_uint16_t:
6361; CHECK:       # %bb.0: # %entry
6362; CHECK-NEXT:    or r3, r4, r3
6363; CHECK-NEXT:    sth r5, 0(r3)
6364; CHECK-NEXT:    blr
6365entry:
6366  %conv = zext i8 %str to i16
6367  %conv1 = zext i8 %off to i64
6368  %or = or i64 %conv1, %ptr
6369  %0 = inttoptr i64 %or to ptr
6370  store i16 %conv, ptr %0, align 2
6371  ret void
6372}
6373
6374; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6375define dso_local void @st_not_disjoint16_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
6376; CHECK-LABEL: st_not_disjoint16_uint8_t_uint16_t:
6377; CHECK:       # %bb.0: # %entry
6378; CHECK-NEXT:    ori r3, r3, 6
6379; CHECK-NEXT:    sth r4, 0(r3)
6380; CHECK-NEXT:    blr
6381entry:
6382  %conv = zext i8 %str to i16
6383  %or = or i64 %ptr, 6
6384  %0 = inttoptr i64 %or to ptr
6385  store i16 %conv, ptr %0, align 2
6386  ret void
6387}
6388
6389; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6390define dso_local void @st_disjoint_align16_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
6391; CHECK-LABEL: st_disjoint_align16_uint8_t_uint16_t:
6392; CHECK:       # %bb.0: # %entry
6393; CHECK-NEXT:    rldicr r3, r3, 0, 51
6394; CHECK-NEXT:    sth r4, 24(r3)
6395; CHECK-NEXT:    blr
6396entry:
6397  %and = and i64 %ptr, -4096
6398  %conv = zext i8 %str to i16
6399  %or = or i64 %and, 24
6400  %0 = inttoptr i64 %or to ptr
6401  store i16 %conv, ptr %0, align 8
6402  ret void
6403}
6404
6405; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6406define dso_local void @st_not_disjoint32_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
6407; CHECK-LABEL: st_not_disjoint32_uint8_t_uint16_t:
6408; CHECK:       # %bb.0: # %entry
6409; CHECK-NEXT:    ori r3, r3, 34463
6410; CHECK-NEXT:    oris r3, r3, 1
6411; CHECK-NEXT:    sth r4, 0(r3)
6412; CHECK-NEXT:    blr
6413entry:
6414  %conv = zext i8 %str to i16
6415  %or = or i64 %ptr, 99999
6416  %0 = inttoptr i64 %or to ptr
6417  store i16 %conv, ptr %0, align 2
6418  ret void
6419}
6420
6421; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6422define dso_local void @st_disjoint_align32_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
6423; CHECK-P10-LABEL: st_disjoint_align32_uint8_t_uint16_t:
6424; CHECK-P10:       # %bb.0: # %entry
6425; CHECK-P10-NEXT:    lis r5, -15264
6426; CHECK-P10-NEXT:    and r3, r3, r5
6427; CHECK-P10-NEXT:    psth r4, 999990000(r3), 0
6428; CHECK-P10-NEXT:    blr
6429;
6430; CHECK-PREP10-LABEL: st_disjoint_align32_uint8_t_uint16_t:
6431; CHECK-PREP10:       # %bb.0: # %entry
6432; CHECK-PREP10-NEXT:    lis r5, -15264
6433; CHECK-PREP10-NEXT:    and r3, r3, r5
6434; CHECK-PREP10-NEXT:    lis r5, 15258
6435; CHECK-PREP10-NEXT:    ori r5, r5, 41712
6436; CHECK-PREP10-NEXT:    sthx r4, r3, r5
6437; CHECK-PREP10-NEXT:    blr
6438entry:
6439  %and = and i64 %ptr, -1000341504
6440  %conv = zext i8 %str to i16
6441  %or = or i64 %and, 999990000
6442  %0 = inttoptr i64 %or to ptr
6443  store i16 %conv, ptr %0, align 16
6444  ret void
6445}
6446
6447; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6448define dso_local void @st_not_disjoint64_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
6449; CHECK-P10-LABEL: st_not_disjoint64_uint8_t_uint16_t:
6450; CHECK-P10:       # %bb.0: # %entry
6451; CHECK-P10-NEXT:    pli r5, 232
6452; CHECK-P10-NEXT:    pli r6, 3567587329
6453; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
6454; CHECK-P10-NEXT:    or r3, r3, r6
6455; CHECK-P10-NEXT:    sth r4, 0(r3)
6456; CHECK-P10-NEXT:    blr
6457;
6458; CHECK-PREP10-LABEL: st_not_disjoint64_uint8_t_uint16_t:
6459; CHECK-PREP10:       # %bb.0: # %entry
6460; CHECK-PREP10-NEXT:    li r5, 29
6461; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
6462; CHECK-PREP10-NEXT:    oris r5, r5, 54437
6463; CHECK-PREP10-NEXT:    ori r5, r5, 4097
6464; CHECK-PREP10-NEXT:    or r3, r3, r5
6465; CHECK-PREP10-NEXT:    sth r4, 0(r3)
6466; CHECK-PREP10-NEXT:    blr
6467entry:
6468  %conv = zext i8 %str to i16
6469  %or = or i64 %ptr, 1000000000001
6470  %0 = inttoptr i64 %or to ptr
6471  store i16 %conv, ptr %0, align 2
6472  ret void
6473}
6474
6475; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6476define dso_local void @st_disjoint_align64_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
6477; CHECK-P10-LABEL: st_disjoint_align64_uint8_t_uint16_t:
6478; CHECK-P10:       # %bb.0: # %entry
6479; CHECK-P10-NEXT:    pli r5, 244140625
6480; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
6481; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
6482; CHECK-P10-NEXT:    sthx r4, r3, r5
6483; CHECK-P10-NEXT:    blr
6484;
6485; CHECK-PREP10-LABEL: st_disjoint_align64_uint8_t_uint16_t:
6486; CHECK-PREP10:       # %bb.0: # %entry
6487; CHECK-PREP10-NEXT:    lis r5, 3725
6488; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
6489; CHECK-PREP10-NEXT:    ori r5, r5, 19025
6490; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
6491; CHECK-PREP10-NEXT:    sthx r4, r3, r5
6492; CHECK-PREP10-NEXT:    blr
6493entry:
6494  %and = and i64 %ptr, -1099511627776
6495  %conv = zext i8 %str to i16
6496  %or = or i64 %and, 1000000000000
6497  %0 = inttoptr i64 %or to ptr
6498  store i16 %conv, ptr %0, align 4096
6499  ret void
6500}
6501
6502; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6503define dso_local void @st_cst_align16_uint8_t_uint16_t(i8 zeroext %str) {
6504; CHECK-LABEL: st_cst_align16_uint8_t_uint16_t:
6505; CHECK:       # %bb.0: # %entry
6506; CHECK-NEXT:    sth r3, 4080(0)
6507; CHECK-NEXT:    blr
6508entry:
6509  %conv = zext i8 %str to i16
6510  store i16 %conv, ptr inttoptr (i64 4080 to ptr), align 16
6511  ret void
6512}
6513
6514; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6515define dso_local void @st_cst_align32_uint8_t_uint16_t(i8 zeroext %str) {
6516; CHECK-LABEL: st_cst_align32_uint8_t_uint16_t:
6517; CHECK:       # %bb.0: # %entry
6518; CHECK-NEXT:    lis r4, 153
6519; CHECK-NEXT:    sth r3, -27108(r4)
6520; CHECK-NEXT:    blr
6521entry:
6522  %conv = zext i8 %str to i16
6523  store i16 %conv, ptr inttoptr (i64 9999900 to ptr), align 4
6524  ret void
6525}
6526
6527; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6528define dso_local void @st_cst_align64_uint8_t_uint16_t(i8 zeroext %str) {
6529; CHECK-P10-LABEL: st_cst_align64_uint8_t_uint16_t:
6530; CHECK-P10:       # %bb.0: # %entry
6531; CHECK-P10-NEXT:    pli r4, 244140625
6532; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
6533; CHECK-P10-NEXT:    sth r3, 0(r4)
6534; CHECK-P10-NEXT:    blr
6535;
6536; CHECK-PREP10-LABEL: st_cst_align64_uint8_t_uint16_t:
6537; CHECK-PREP10:       # %bb.0: # %entry
6538; CHECK-PREP10-NEXT:    lis r4, 3725
6539; CHECK-PREP10-NEXT:    ori r4, r4, 19025
6540; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
6541; CHECK-PREP10-NEXT:    sth r3, 0(r4)
6542; CHECK-PREP10-NEXT:    blr
6543entry:
6544  %conv = zext i8 %str to i16
6545  store i16 %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
6546  ret void
6547}
6548
6549; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6550define dso_local void @st_0_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
6551; CHECK-LABEL: st_0_uint8_t_uint32_t:
6552; CHECK:       # %bb.0: # %entry
6553; CHECK-NEXT:    stw r4, 0(r3)
6554; CHECK-NEXT:    blr
6555entry:
6556  %conv = zext i8 %str to i32
6557  %0 = inttoptr i64 %ptr to ptr
6558  store i32 %conv, ptr %0, align 4
6559  ret void
6560}
6561
6562; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6563define dso_local void @st_align16_uint8_t_uint32_t(ptr nocapture %ptr, i8 zeroext %str) {
6564; CHECK-LABEL: st_align16_uint8_t_uint32_t:
6565; CHECK:       # %bb.0: # %entry
6566; CHECK-NEXT:    stw r4, 8(r3)
6567; CHECK-NEXT:    blr
6568entry:
6569  %conv = zext i8 %str to i32
6570  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
6571  store i32 %conv, ptr %add.ptr, align 4
6572  ret void
6573}
6574
6575; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6576define dso_local void @st_align32_uint8_t_uint32_t(ptr nocapture %ptr, i8 zeroext %str) {
6577; CHECK-P10-LABEL: st_align32_uint8_t_uint32_t:
6578; CHECK-P10:       # %bb.0: # %entry
6579; CHECK-P10-NEXT:    pstw r4, 99999000(r3), 0
6580; CHECK-P10-NEXT:    blr
6581;
6582; CHECK-PREP10-LABEL: st_align32_uint8_t_uint32_t:
6583; CHECK-PREP10:       # %bb.0: # %entry
6584; CHECK-PREP10-NEXT:    lis r5, 1525
6585; CHECK-PREP10-NEXT:    ori r5, r5, 56600
6586; CHECK-PREP10-NEXT:    stwx r4, r3, r5
6587; CHECK-PREP10-NEXT:    blr
6588entry:
6589  %conv = zext i8 %str to i32
6590  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
6591  store i32 %conv, ptr %add.ptr, align 4
6592  ret void
6593}
6594
6595; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6596define dso_local void @st_align64_uint8_t_uint32_t(ptr nocapture %ptr, i8 zeroext %str) {
6597; CHECK-P10-LABEL: st_align64_uint8_t_uint32_t:
6598; CHECK-P10:       # %bb.0: # %entry
6599; CHECK-P10-NEXT:    pli r5, 244140625
6600; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
6601; CHECK-P10-NEXT:    stwx r4, r3, r5
6602; CHECK-P10-NEXT:    blr
6603;
6604; CHECK-PREP10-LABEL: st_align64_uint8_t_uint32_t:
6605; CHECK-PREP10:       # %bb.0: # %entry
6606; CHECK-PREP10-NEXT:    lis r5, 3725
6607; CHECK-PREP10-NEXT:    ori r5, r5, 19025
6608; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
6609; CHECK-PREP10-NEXT:    stwx r4, r3, r5
6610; CHECK-PREP10-NEXT:    blr
6611entry:
6612  %conv = zext i8 %str to i32
6613  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
6614  store i32 %conv, ptr %add.ptr, align 4
6615  ret void
6616}
6617
6618; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6619define dso_local void @st_reg_uint8_t_uint32_t(ptr nocapture %ptr, i64 %off, i8 zeroext %str) {
6620; CHECK-LABEL: st_reg_uint8_t_uint32_t:
6621; CHECK:       # %bb.0: # %entry
6622; CHECK-NEXT:    stwx r5, r3, r4
6623; CHECK-NEXT:    blr
6624entry:
6625  %conv = zext i8 %str to i32
6626  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
6627  store i32 %conv, ptr %add.ptr, align 4
6628  ret void
6629}
6630
6631; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6632define dso_local void @st_or1_uint8_t_uint32_t(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
6633; CHECK-LABEL: st_or1_uint8_t_uint32_t:
6634; CHECK:       # %bb.0: # %entry
6635; CHECK-NEXT:    or r3, r4, r3
6636; CHECK-NEXT:    stw r5, 0(r3)
6637; CHECK-NEXT:    blr
6638entry:
6639  %conv = zext i8 %str to i32
6640  %conv1 = zext i8 %off to i64
6641  %or = or i64 %conv1, %ptr
6642  %0 = inttoptr i64 %or to ptr
6643  store i32 %conv, ptr %0, align 4
6644  ret void
6645}
6646
6647; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6648define dso_local void @st_not_disjoint16_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
6649; CHECK-LABEL: st_not_disjoint16_uint8_t_uint32_t:
6650; CHECK:       # %bb.0: # %entry
6651; CHECK-NEXT:    ori r3, r3, 6
6652; CHECK-NEXT:    stw r4, 0(r3)
6653; CHECK-NEXT:    blr
6654entry:
6655  %conv = zext i8 %str to i32
6656  %or = or i64 %ptr, 6
6657  %0 = inttoptr i64 %or to ptr
6658  store i32 %conv, ptr %0, align 4
6659  ret void
6660}
6661
6662; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6663define dso_local void @st_disjoint_align16_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
6664; CHECK-LABEL: st_disjoint_align16_uint8_t_uint32_t:
6665; CHECK:       # %bb.0: # %entry
6666; CHECK-NEXT:    rldicr r3, r3, 0, 51
6667; CHECK-NEXT:    stw r4, 24(r3)
6668; CHECK-NEXT:    blr
6669entry:
6670  %and = and i64 %ptr, -4096
6671  %conv = zext i8 %str to i32
6672  %or = or i64 %and, 24
6673  %0 = inttoptr i64 %or to ptr
6674  store i32 %conv, ptr %0, align 8
6675  ret void
6676}
6677
6678; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6679define dso_local void @st_not_disjoint32_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
6680; CHECK-LABEL: st_not_disjoint32_uint8_t_uint32_t:
6681; CHECK:       # %bb.0: # %entry
6682; CHECK-NEXT:    ori r3, r3, 34463
6683; CHECK-NEXT:    oris r3, r3, 1
6684; CHECK-NEXT:    stw r4, 0(r3)
6685; CHECK-NEXT:    blr
6686entry:
6687  %conv = zext i8 %str to i32
6688  %or = or i64 %ptr, 99999
6689  %0 = inttoptr i64 %or to ptr
6690  store i32 %conv, ptr %0, align 4
6691  ret void
6692}
6693
6694; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6695define dso_local void @st_disjoint_align32_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
6696; CHECK-P10-LABEL: st_disjoint_align32_uint8_t_uint32_t:
6697; CHECK-P10:       # %bb.0: # %entry
6698; CHECK-P10-NEXT:    lis r5, -15264
6699; CHECK-P10-NEXT:    and r3, r3, r5
6700; CHECK-P10-NEXT:    pstw r4, 999990000(r3), 0
6701; CHECK-P10-NEXT:    blr
6702;
6703; CHECK-PREP10-LABEL: st_disjoint_align32_uint8_t_uint32_t:
6704; CHECK-PREP10:       # %bb.0: # %entry
6705; CHECK-PREP10-NEXT:    lis r5, -15264
6706; CHECK-PREP10-NEXT:    and r3, r3, r5
6707; CHECK-PREP10-NEXT:    lis r5, 15258
6708; CHECK-PREP10-NEXT:    ori r5, r5, 41712
6709; CHECK-PREP10-NEXT:    stwx r4, r3, r5
6710; CHECK-PREP10-NEXT:    blr
6711entry:
6712  %and = and i64 %ptr, -1000341504
6713  %conv = zext i8 %str to i32
6714  %or = or i64 %and, 999990000
6715  %0 = inttoptr i64 %or to ptr
6716  store i32 %conv, ptr %0, align 16
6717  ret void
6718}
6719
6720; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6721define dso_local void @st_not_disjoint64_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
6722; CHECK-P10-LABEL: st_not_disjoint64_uint8_t_uint32_t:
6723; CHECK-P10:       # %bb.0: # %entry
6724; CHECK-P10-NEXT:    pli r5, 232
6725; CHECK-P10-NEXT:    pli r6, 3567587329
6726; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
6727; CHECK-P10-NEXT:    or r3, r3, r6
6728; CHECK-P10-NEXT:    stw r4, 0(r3)
6729; CHECK-P10-NEXT:    blr
6730;
6731; CHECK-PREP10-LABEL: st_not_disjoint64_uint8_t_uint32_t:
6732; CHECK-PREP10:       # %bb.0: # %entry
6733; CHECK-PREP10-NEXT:    li r5, 29
6734; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
6735; CHECK-PREP10-NEXT:    oris r5, r5, 54437
6736; CHECK-PREP10-NEXT:    ori r5, r5, 4097
6737; CHECK-PREP10-NEXT:    or r3, r3, r5
6738; CHECK-PREP10-NEXT:    stw r4, 0(r3)
6739; CHECK-PREP10-NEXT:    blr
6740entry:
6741  %conv = zext i8 %str to i32
6742  %or = or i64 %ptr, 1000000000001
6743  %0 = inttoptr i64 %or to ptr
6744  store i32 %conv, ptr %0, align 4
6745  ret void
6746}
6747
6748; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6749define dso_local void @st_disjoint_align64_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
6750; CHECK-P10-LABEL: st_disjoint_align64_uint8_t_uint32_t:
6751; CHECK-P10:       # %bb.0: # %entry
6752; CHECK-P10-NEXT:    pli r5, 244140625
6753; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
6754; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
6755; CHECK-P10-NEXT:    stwx r4, r3, r5
6756; CHECK-P10-NEXT:    blr
6757;
6758; CHECK-PREP10-LABEL: st_disjoint_align64_uint8_t_uint32_t:
6759; CHECK-PREP10:       # %bb.0: # %entry
6760; CHECK-PREP10-NEXT:    lis r5, 3725
6761; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
6762; CHECK-PREP10-NEXT:    ori r5, r5, 19025
6763; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
6764; CHECK-PREP10-NEXT:    stwx r4, r3, r5
6765; CHECK-PREP10-NEXT:    blr
6766entry:
6767  %and = and i64 %ptr, -1099511627776
6768  %conv = zext i8 %str to i32
6769  %or = or i64 %and, 1000000000000
6770  %0 = inttoptr i64 %or to ptr
6771  store i32 %conv, ptr %0, align 4096
6772  ret void
6773}
6774
6775; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6776define dso_local void @st_cst_align16_uint8_t_uint32_t(i8 zeroext %str) {
6777; CHECK-LABEL: st_cst_align16_uint8_t_uint32_t:
6778; CHECK:       # %bb.0: # %entry
6779; CHECK-NEXT:    stw r3, 4080(0)
6780; CHECK-NEXT:    blr
6781entry:
6782  %conv = zext i8 %str to i32
6783  store i32 %conv, ptr inttoptr (i64 4080 to ptr), align 16
6784  ret void
6785}
6786
6787; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6788define dso_local void @st_cst_align32_uint8_t_uint32_t(i8 zeroext %str) {
6789; CHECK-LABEL: st_cst_align32_uint8_t_uint32_t:
6790; CHECK:       # %bb.0: # %entry
6791; CHECK-NEXT:    lis r4, 153
6792; CHECK-NEXT:    stw r3, -27108(r4)
6793; CHECK-NEXT:    blr
6794entry:
6795  %conv = zext i8 %str to i32
6796  store i32 %conv, ptr inttoptr (i64 9999900 to ptr), align 4
6797  ret void
6798}
6799
6800; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6801define dso_local void @st_cst_align64_uint8_t_uint32_t(i8 zeroext %str) {
6802; CHECK-P10-LABEL: st_cst_align64_uint8_t_uint32_t:
6803; CHECK-P10:       # %bb.0: # %entry
6804; CHECK-P10-NEXT:    pli r4, 244140625
6805; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
6806; CHECK-P10-NEXT:    stw r3, 0(r4)
6807; CHECK-P10-NEXT:    blr
6808;
6809; CHECK-PREP10-LABEL: st_cst_align64_uint8_t_uint32_t:
6810; CHECK-PREP10:       # %bb.0: # %entry
6811; CHECK-PREP10-NEXT:    lis r4, 3725
6812; CHECK-PREP10-NEXT:    ori r4, r4, 19025
6813; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
6814; CHECK-PREP10-NEXT:    stw r3, 0(r4)
6815; CHECK-PREP10-NEXT:    blr
6816entry:
6817  %conv = zext i8 %str to i32
6818  store i32 %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
6819  ret void
6820}
6821
6822; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6823define dso_local void @st_0_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
6824; CHECK-LABEL: st_0_uint8_t_uint64_t:
6825; CHECK:       # %bb.0: # %entry
6826; CHECK-NEXT:    std r4, 0(r3)
6827; CHECK-NEXT:    blr
6828entry:
6829  %conv = zext i8 %str to i64
6830  %0 = inttoptr i64 %ptr to ptr
6831  store i64 %conv, ptr %0, align 8
6832  ret void
6833}
6834
6835; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6836define dso_local void @st_align16_uint8_t_uint64_t(ptr nocapture %ptr, i8 zeroext %str) {
6837; CHECK-LABEL: st_align16_uint8_t_uint64_t:
6838; CHECK:       # %bb.0: # %entry
6839; CHECK-NEXT:    std r4, 8(r3)
6840; CHECK-NEXT:    blr
6841entry:
6842  %conv = zext i8 %str to i64
6843  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
6844  store i64 %conv, ptr %add.ptr, align 8
6845  ret void
6846}
6847
6848; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6849define dso_local void @st_align32_uint8_t_uint64_t(ptr nocapture %ptr, i8 zeroext %str) {
6850; CHECK-P10-LABEL: st_align32_uint8_t_uint64_t:
6851; CHECK-P10:       # %bb.0: # %entry
6852; CHECK-P10-NEXT:    pstd r4, 99999000(r3), 0
6853; CHECK-P10-NEXT:    blr
6854;
6855; CHECK-PREP10-LABEL: st_align32_uint8_t_uint64_t:
6856; CHECK-PREP10:       # %bb.0: # %entry
6857; CHECK-PREP10-NEXT:    lis r5, 1525
6858; CHECK-PREP10-NEXT:    ori r5, r5, 56600
6859; CHECK-PREP10-NEXT:    stdx r4, r3, r5
6860; CHECK-PREP10-NEXT:    blr
6861entry:
6862  %conv = zext i8 %str to i64
6863  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
6864  store i64 %conv, ptr %add.ptr, align 8
6865  ret void
6866}
6867
6868; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6869define dso_local void @st_align64_uint8_t_uint64_t(ptr nocapture %ptr, i8 zeroext %str) {
6870; CHECK-P10-LABEL: st_align64_uint8_t_uint64_t:
6871; CHECK-P10:       # %bb.0: # %entry
6872; CHECK-P10-NEXT:    pli r5, 244140625
6873; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
6874; CHECK-P10-NEXT:    stdx r4, r3, r5
6875; CHECK-P10-NEXT:    blr
6876;
6877; CHECK-PREP10-LABEL: st_align64_uint8_t_uint64_t:
6878; CHECK-PREP10:       # %bb.0: # %entry
6879; CHECK-PREP10-NEXT:    lis r5, 3725
6880; CHECK-PREP10-NEXT:    ori r5, r5, 19025
6881; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
6882; CHECK-PREP10-NEXT:    stdx r4, r3, r5
6883; CHECK-PREP10-NEXT:    blr
6884entry:
6885  %conv = zext i8 %str to i64
6886  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
6887  store i64 %conv, ptr %add.ptr, align 8
6888  ret void
6889}
6890
6891; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6892define dso_local void @st_reg_uint8_t_uint64_t(ptr nocapture %ptr, i64 %off, i8 zeroext %str) {
6893; CHECK-LABEL: st_reg_uint8_t_uint64_t:
6894; CHECK:       # %bb.0: # %entry
6895; CHECK-NEXT:    stdx r5, r3, r4
6896; CHECK-NEXT:    blr
6897entry:
6898  %conv = zext i8 %str to i64
6899  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
6900  store i64 %conv, ptr %add.ptr, align 8
6901  ret void
6902}
6903
6904; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6905define dso_local void @st_or1_uint8_t_uint64_t(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
6906; CHECK-LABEL: st_or1_uint8_t_uint64_t:
6907; CHECK:       # %bb.0: # %entry
6908; CHECK-NEXT:    or r3, r4, r3
6909; CHECK-NEXT:    std r5, 0(r3)
6910; CHECK-NEXT:    blr
6911entry:
6912  %conv = zext i8 %str to i64
6913  %conv1 = zext i8 %off to i64
6914  %or = or i64 %conv1, %ptr
6915  %0 = inttoptr i64 %or to ptr
6916  store i64 %conv, ptr %0, align 8
6917  ret void
6918}
6919
6920; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6921define dso_local void @st_not_disjoint16_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
6922; CHECK-LABEL: st_not_disjoint16_uint8_t_uint64_t:
6923; CHECK:       # %bb.0: # %entry
6924; CHECK-NEXT:    ori r3, r3, 6
6925; CHECK-NEXT:    std r4, 0(r3)
6926; CHECK-NEXT:    blr
6927entry:
6928  %conv = zext i8 %str to i64
6929  %or = or i64 %ptr, 6
6930  %0 = inttoptr i64 %or to ptr
6931  store i64 %conv, ptr %0, align 8
6932  ret void
6933}
6934
6935; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6936define dso_local void @st_disjoint_align16_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
6937; CHECK-LABEL: st_disjoint_align16_uint8_t_uint64_t:
6938; CHECK:       # %bb.0: # %entry
6939; CHECK-NEXT:    rldicr r3, r3, 0, 51
6940; CHECK-NEXT:    std r4, 24(r3)
6941; CHECK-NEXT:    blr
6942entry:
6943  %and = and i64 %ptr, -4096
6944  %conv = zext i8 %str to i64
6945  %or = or i64 %and, 24
6946  %0 = inttoptr i64 %or to ptr
6947  store i64 %conv, ptr %0, align 8
6948  ret void
6949}
6950
6951; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6952define dso_local void @st_not_disjoint32_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
6953; CHECK-LABEL: st_not_disjoint32_uint8_t_uint64_t:
6954; CHECK:       # %bb.0: # %entry
6955; CHECK-NEXT:    ori r3, r3, 34463
6956; CHECK-NEXT:    oris r3, r3, 1
6957; CHECK-NEXT:    std r4, 0(r3)
6958; CHECK-NEXT:    blr
6959entry:
6960  %conv = zext i8 %str to i64
6961  %or = or i64 %ptr, 99999
6962  %0 = inttoptr i64 %or to ptr
6963  store i64 %conv, ptr %0, align 8
6964  ret void
6965}
6966
6967; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6968define dso_local void @st_disjoint_align32_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
6969; CHECK-P10-LABEL: st_disjoint_align32_uint8_t_uint64_t:
6970; CHECK-P10:       # %bb.0: # %entry
6971; CHECK-P10-NEXT:    lis r5, -15264
6972; CHECK-P10-NEXT:    and r3, r3, r5
6973; CHECK-P10-NEXT:    pstd r4, 999990000(r3), 0
6974; CHECK-P10-NEXT:    blr
6975;
6976; CHECK-PREP10-LABEL: st_disjoint_align32_uint8_t_uint64_t:
6977; CHECK-PREP10:       # %bb.0: # %entry
6978; CHECK-PREP10-NEXT:    lis r5, -15264
6979; CHECK-PREP10-NEXT:    and r3, r3, r5
6980; CHECK-PREP10-NEXT:    lis r5, 15258
6981; CHECK-PREP10-NEXT:    ori r5, r5, 41712
6982; CHECK-PREP10-NEXT:    stdx r4, r3, r5
6983; CHECK-PREP10-NEXT:    blr
6984entry:
6985  %and = and i64 %ptr, -1000341504
6986  %conv = zext i8 %str to i64
6987  %or = or i64 %and, 999990000
6988  %0 = inttoptr i64 %or to ptr
6989  store i64 %conv, ptr %0, align 16
6990  ret void
6991}
6992
6993; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
6994define dso_local void @st_not_disjoint64_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
6995; CHECK-P10-LABEL: st_not_disjoint64_uint8_t_uint64_t:
6996; CHECK-P10:       # %bb.0: # %entry
6997; CHECK-P10-NEXT:    pli r5, 232
6998; CHECK-P10-NEXT:    pli r6, 3567587329
6999; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
7000; CHECK-P10-NEXT:    or r3, r3, r6
7001; CHECK-P10-NEXT:    std r4, 0(r3)
7002; CHECK-P10-NEXT:    blr
7003;
7004; CHECK-PREP10-LABEL: st_not_disjoint64_uint8_t_uint64_t:
7005; CHECK-PREP10:       # %bb.0: # %entry
7006; CHECK-PREP10-NEXT:    li r5, 29
7007; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
7008; CHECK-PREP10-NEXT:    oris r5, r5, 54437
7009; CHECK-PREP10-NEXT:    ori r5, r5, 4097
7010; CHECK-PREP10-NEXT:    or r3, r3, r5
7011; CHECK-PREP10-NEXT:    std r4, 0(r3)
7012; CHECK-PREP10-NEXT:    blr
7013entry:
7014  %conv = zext i8 %str to i64
7015  %or = or i64 %ptr, 1000000000001
7016  %0 = inttoptr i64 %or to ptr
7017  store i64 %conv, ptr %0, align 8
7018  ret void
7019}
7020
7021; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7022define dso_local void @st_disjoint_align64_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
7023; CHECK-P10-LABEL: st_disjoint_align64_uint8_t_uint64_t:
7024; CHECK-P10:       # %bb.0: # %entry
7025; CHECK-P10-NEXT:    pli r5, 244140625
7026; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
7027; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
7028; CHECK-P10-NEXT:    stdx r4, r3, r5
7029; CHECK-P10-NEXT:    blr
7030;
7031; CHECK-PREP10-LABEL: st_disjoint_align64_uint8_t_uint64_t:
7032; CHECK-PREP10:       # %bb.0: # %entry
7033; CHECK-PREP10-NEXT:    lis r5, 3725
7034; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
7035; CHECK-PREP10-NEXT:    ori r5, r5, 19025
7036; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
7037; CHECK-PREP10-NEXT:    stdx r4, r3, r5
7038; CHECK-PREP10-NEXT:    blr
7039entry:
7040  %and = and i64 %ptr, -1099511627776
7041  %conv = zext i8 %str to i64
7042  %or = or i64 %and, 1000000000000
7043  %0 = inttoptr i64 %or to ptr
7044  store i64 %conv, ptr %0, align 4096
7045  ret void
7046}
7047
7048; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7049define dso_local void @st_cst_align16_uint8_t_uint64_t(i8 zeroext %str) {
7050; CHECK-LABEL: st_cst_align16_uint8_t_uint64_t:
7051; CHECK:       # %bb.0: # %entry
7052; CHECK-NEXT:    std r3, 4080(0)
7053; CHECK-NEXT:    blr
7054entry:
7055  %conv = zext i8 %str to i64
7056  store i64 %conv, ptr inttoptr (i64 4080 to ptr), align 16
7057  ret void
7058}
7059
7060; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7061define dso_local void @st_cst_align32_uint8_t_uint64_t(i8 zeroext %str) {
7062; CHECK-LABEL: st_cst_align32_uint8_t_uint64_t:
7063; CHECK:       # %bb.0: # %entry
7064; CHECK-NEXT:    lis r4, 153
7065; CHECK-NEXT:    std r3, -27108(r4)
7066; CHECK-NEXT:    blr
7067entry:
7068  %conv = zext i8 %str to i64
7069  store i64 %conv, ptr inttoptr (i64 9999900 to ptr), align 8
7070  ret void
7071}
7072
7073; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7074define dso_local void @st_cst_align64_uint8_t_uint64_t(i8 zeroext %str) {
7075; CHECK-P10-LABEL: st_cst_align64_uint8_t_uint64_t:
7076; CHECK-P10:       # %bb.0: # %entry
7077; CHECK-P10-NEXT:    pli r4, 244140625
7078; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
7079; CHECK-P10-NEXT:    std r3, 0(r4)
7080; CHECK-P10-NEXT:    blr
7081;
7082; CHECK-PREP10-LABEL: st_cst_align64_uint8_t_uint64_t:
7083; CHECK-PREP10:       # %bb.0: # %entry
7084; CHECK-PREP10-NEXT:    lis r4, 3725
7085; CHECK-PREP10-NEXT:    ori r4, r4, 19025
7086; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
7087; CHECK-PREP10-NEXT:    std r3, 0(r4)
7088; CHECK-PREP10-NEXT:    blr
7089entry:
7090  %conv = zext i8 %str to i64
7091  store i64 %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
7092  ret void
7093}
7094
7095; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7096define dso_local void @st_0_uint8_t_float(i64 %ptr, i8 zeroext %str) {
7097; CHECK-LABEL: st_0_uint8_t_float:
7098; CHECK:       # %bb.0: # %entry
7099; CHECK-NEXT:    mtfprwz f0, r4
7100; CHECK-NEXT:    xscvuxdsp f0, f0
7101; CHECK-NEXT:    stfs f0, 0(r3)
7102; CHECK-NEXT:    blr
7103entry:
7104  %conv = uitofp i8 %str to float
7105  %0 = inttoptr i64 %ptr to ptr
7106  store float %conv, ptr %0, align 4
7107  ret void
7108}
7109
7110; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7111define dso_local void @st_align16_uint8_t_float(ptr nocapture %ptr, i8 zeroext %str) {
7112; CHECK-LABEL: st_align16_uint8_t_float:
7113; CHECK:       # %bb.0: # %entry
7114; CHECK-NEXT:    mtfprwz f0, r4
7115; CHECK-NEXT:    xscvuxdsp f0, f0
7116; CHECK-NEXT:    stfs f0, 8(r3)
7117; CHECK-NEXT:    blr
7118entry:
7119  %conv = uitofp i8 %str to float
7120  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
7121  store float %conv, ptr %add.ptr, align 4
7122  ret void
7123}
7124
7125; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7126define dso_local void @st_align32_uint8_t_float(ptr nocapture %ptr, i8 zeroext %str) {
7127; CHECK-P10-LABEL: st_align32_uint8_t_float:
7128; CHECK-P10:       # %bb.0: # %entry
7129; CHECK-P10-NEXT:    mtfprwz f0, r4
7130; CHECK-P10-NEXT:    xscvuxdsp f0, f0
7131; CHECK-P10-NEXT:    pstfs f0, 99999000(r3), 0
7132; CHECK-P10-NEXT:    blr
7133;
7134; CHECK-P9-LABEL: st_align32_uint8_t_float:
7135; CHECK-P9:       # %bb.0: # %entry
7136; CHECK-P9-NEXT:    mtfprwz f0, r4
7137; CHECK-P9-NEXT:    lis r4, 1525
7138; CHECK-P9-NEXT:    xscvuxdsp f0, f0
7139; CHECK-P9-NEXT:    ori r4, r4, 56600
7140; CHECK-P9-NEXT:    stfsx f0, r3, r4
7141; CHECK-P9-NEXT:    blr
7142;
7143; CHECK-P8-LABEL: st_align32_uint8_t_float:
7144; CHECK-P8:       # %bb.0: # %entry
7145; CHECK-P8-NEXT:    mtfprwz f0, r4
7146; CHECK-P8-NEXT:    lis r4, 1525
7147; CHECK-P8-NEXT:    ori r4, r4, 56600
7148; CHECK-P8-NEXT:    xscvuxdsp f0, f0
7149; CHECK-P8-NEXT:    stfsx f0, r3, r4
7150; CHECK-P8-NEXT:    blr
7151entry:
7152  %conv = uitofp i8 %str to float
7153  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
7154  store float %conv, ptr %add.ptr, align 4
7155  ret void
7156}
7157
7158; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7159define dso_local void @st_align64_uint8_t_float(ptr nocapture %ptr, i8 zeroext %str) {
7160; CHECK-P10-LABEL: st_align64_uint8_t_float:
7161; CHECK-P10:       # %bb.0: # %entry
7162; CHECK-P10-NEXT:    mtfprwz f0, r4
7163; CHECK-P10-NEXT:    pli r4, 244140625
7164; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
7165; CHECK-P10-NEXT:    xscvuxdsp f0, f0
7166; CHECK-P10-NEXT:    stfsx f0, r3, r4
7167; CHECK-P10-NEXT:    blr
7168;
7169; CHECK-P9-LABEL: st_align64_uint8_t_float:
7170; CHECK-P9:       # %bb.0: # %entry
7171; CHECK-P9-NEXT:    mtfprwz f0, r4
7172; CHECK-P9-NEXT:    lis r4, 3725
7173; CHECK-P9-NEXT:    xscvuxdsp f0, f0
7174; CHECK-P9-NEXT:    ori r4, r4, 19025
7175; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
7176; CHECK-P9-NEXT:    stfsx f0, r3, r4
7177; CHECK-P9-NEXT:    blr
7178;
7179; CHECK-P8-LABEL: st_align64_uint8_t_float:
7180; CHECK-P8:       # %bb.0: # %entry
7181; CHECK-P8-NEXT:    mtfprwz f0, r4
7182; CHECK-P8-NEXT:    lis r4, 3725
7183; CHECK-P8-NEXT:    ori r4, r4, 19025
7184; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
7185; CHECK-P8-NEXT:    xscvuxdsp f0, f0
7186; CHECK-P8-NEXT:    stfsx f0, r3, r4
7187; CHECK-P8-NEXT:    blr
7188entry:
7189  %conv = uitofp i8 %str to float
7190  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
7191  store float %conv, ptr %add.ptr, align 4
7192  ret void
7193}
7194
7195; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7196define dso_local void @st_reg_uint8_t_float(ptr nocapture %ptr, i64 %off, i8 zeroext %str) {
7197; CHECK-LABEL: st_reg_uint8_t_float:
7198; CHECK:       # %bb.0: # %entry
7199; CHECK-NEXT:    mtfprwz f0, r5
7200; CHECK-NEXT:    xscvuxdsp f0, f0
7201; CHECK-NEXT:    stfsx f0, r3, r4
7202; CHECK-NEXT:    blr
7203entry:
7204  %conv = uitofp i8 %str to float
7205  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
7206  store float %conv, ptr %add.ptr, align 4
7207  ret void
7208}
7209
7210; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7211define dso_local void @st_or1_uint8_t_float(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
7212; CHECK-LABEL: st_or1_uint8_t_float:
7213; CHECK:       # %bb.0: # %entry
7214; CHECK-NEXT:    mtfprwz f0, r5
7215; CHECK-NEXT:    or r3, r4, r3
7216; CHECK-NEXT:    xscvuxdsp f0, f0
7217; CHECK-NEXT:    stfs f0, 0(r3)
7218; CHECK-NEXT:    blr
7219entry:
7220  %conv = uitofp i8 %str to float
7221  %conv1 = zext i8 %off to i64
7222  %or = or i64 %conv1, %ptr
7223  %0 = inttoptr i64 %or to ptr
7224  store float %conv, ptr %0, align 4
7225  ret void
7226}
7227
7228; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7229define dso_local void @st_not_disjoint16_uint8_t_float(i64 %ptr, i8 zeroext %str) {
7230; CHECK-LABEL: st_not_disjoint16_uint8_t_float:
7231; CHECK:       # %bb.0: # %entry
7232; CHECK-NEXT:    mtfprwz f0, r4
7233; CHECK-NEXT:    ori r3, r3, 6
7234; CHECK-NEXT:    xscvuxdsp f0, f0
7235; CHECK-NEXT:    stfs f0, 0(r3)
7236; CHECK-NEXT:    blr
7237entry:
7238  %conv = uitofp i8 %str to float
7239  %or = or i64 %ptr, 6
7240  %0 = inttoptr i64 %or to ptr
7241  store float %conv, ptr %0, align 4
7242  ret void
7243}
7244
7245; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7246define dso_local void @st_disjoint_align16_uint8_t_float(i64 %ptr, i8 zeroext %str) {
7247; CHECK-LABEL: st_disjoint_align16_uint8_t_float:
7248; CHECK:       # %bb.0: # %entry
7249; CHECK-NEXT:    mtfprwz f0, r4
7250; CHECK-NEXT:    rldicr r3, r3, 0, 51
7251; CHECK-NEXT:    xscvuxdsp f0, f0
7252; CHECK-NEXT:    stfs f0, 24(r3)
7253; CHECK-NEXT:    blr
7254entry:
7255  %and = and i64 %ptr, -4096
7256  %conv = uitofp i8 %str to float
7257  %or = or i64 %and, 24
7258  %0 = inttoptr i64 %or to ptr
7259  store float %conv, ptr %0, align 8
7260  ret void
7261}
7262
7263; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7264define dso_local void @st_not_disjoint32_uint8_t_float(i64 %ptr, i8 zeroext %str) {
7265; CHECK-P10-LABEL: st_not_disjoint32_uint8_t_float:
7266; CHECK-P10:       # %bb.0: # %entry
7267; CHECK-P10-NEXT:    mtfprwz f0, r4
7268; CHECK-P10-NEXT:    ori r3, r3, 34463
7269; CHECK-P10-NEXT:    oris r3, r3, 1
7270; CHECK-P10-NEXT:    xscvuxdsp f0, f0
7271; CHECK-P10-NEXT:    stfs f0, 0(r3)
7272; CHECK-P10-NEXT:    blr
7273;
7274; CHECK-P9-LABEL: st_not_disjoint32_uint8_t_float:
7275; CHECK-P9:       # %bb.0: # %entry
7276; CHECK-P9-NEXT:    mtfprwz f0, r4
7277; CHECK-P9-NEXT:    ori r3, r3, 34463
7278; CHECK-P9-NEXT:    xscvuxdsp f0, f0
7279; CHECK-P9-NEXT:    oris r3, r3, 1
7280; CHECK-P9-NEXT:    stfs f0, 0(r3)
7281; CHECK-P9-NEXT:    blr
7282;
7283; CHECK-P8-LABEL: st_not_disjoint32_uint8_t_float:
7284; CHECK-P8:       # %bb.0: # %entry
7285; CHECK-P8-NEXT:    mtfprwz f0, r4
7286; CHECK-P8-NEXT:    ori r3, r3, 34463
7287; CHECK-P8-NEXT:    oris r3, r3, 1
7288; CHECK-P8-NEXT:    xscvuxdsp f0, f0
7289; CHECK-P8-NEXT:    stfs f0, 0(r3)
7290; CHECK-P8-NEXT:    blr
7291entry:
7292  %conv = uitofp i8 %str to float
7293  %or = or i64 %ptr, 99999
7294  %0 = inttoptr i64 %or to ptr
7295  store float %conv, ptr %0, align 4
7296  ret void
7297}
7298
7299; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7300define dso_local void @st_disjoint_align32_uint8_t_float(i64 %ptr, i8 zeroext %str) {
7301; CHECK-P10-LABEL: st_disjoint_align32_uint8_t_float:
7302; CHECK-P10:       # %bb.0: # %entry
7303; CHECK-P10-NEXT:    mtfprwz f0, r4
7304; CHECK-P10-NEXT:    lis r5, -15264
7305; CHECK-P10-NEXT:    and r3, r3, r5
7306; CHECK-P10-NEXT:    xscvuxdsp f0, f0
7307; CHECK-P10-NEXT:    pstfs f0, 999990000(r3), 0
7308; CHECK-P10-NEXT:    blr
7309;
7310; CHECK-P9-LABEL: st_disjoint_align32_uint8_t_float:
7311; CHECK-P9:       # %bb.0: # %entry
7312; CHECK-P9-NEXT:    mtfprwz f0, r4
7313; CHECK-P9-NEXT:    lis r5, -15264
7314; CHECK-P9-NEXT:    lis r4, 15258
7315; CHECK-P9-NEXT:    xscvuxdsp f0, f0
7316; CHECK-P9-NEXT:    and r3, r3, r5
7317; CHECK-P9-NEXT:    ori r4, r4, 41712
7318; CHECK-P9-NEXT:    stfsx f0, r3, r4
7319; CHECK-P9-NEXT:    blr
7320;
7321; CHECK-P8-LABEL: st_disjoint_align32_uint8_t_float:
7322; CHECK-P8:       # %bb.0: # %entry
7323; CHECK-P8-NEXT:    mtfprwz f0, r4
7324; CHECK-P8-NEXT:    lis r5, -15264
7325; CHECK-P8-NEXT:    lis r4, 15258
7326; CHECK-P8-NEXT:    and r3, r3, r5
7327; CHECK-P8-NEXT:    ori r4, r4, 41712
7328; CHECK-P8-NEXT:    xscvuxdsp f0, f0
7329; CHECK-P8-NEXT:    stfsx f0, r3, r4
7330; CHECK-P8-NEXT:    blr
7331entry:
7332  %and = and i64 %ptr, -1000341504
7333  %conv = uitofp i8 %str to float
7334  %or = or i64 %and, 999990000
7335  %0 = inttoptr i64 %or to ptr
7336  store float %conv, ptr %0, align 16
7337  ret void
7338}
7339
7340; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7341define dso_local void @st_not_disjoint64_uint8_t_float(i64 %ptr, i8 zeroext %str) {
7342; CHECK-P10-LABEL: st_not_disjoint64_uint8_t_float:
7343; CHECK-P10:       # %bb.0: # %entry
7344; CHECK-P10-NEXT:    mtfprwz f0, r4
7345; CHECK-P10-NEXT:    pli r4, 232
7346; CHECK-P10-NEXT:    pli r5, 3567587329
7347; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
7348; CHECK-P10-NEXT:    xscvuxdsp f0, f0
7349; CHECK-P10-NEXT:    or r3, r3, r5
7350; CHECK-P10-NEXT:    stfs f0, 0(r3)
7351; CHECK-P10-NEXT:    blr
7352;
7353; CHECK-P9-LABEL: st_not_disjoint64_uint8_t_float:
7354; CHECK-P9:       # %bb.0: # %entry
7355; CHECK-P9-NEXT:    mtfprwz f0, r4
7356; CHECK-P9-NEXT:    li r4, 29
7357; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
7358; CHECK-P9-NEXT:    xscvuxdsp f0, f0
7359; CHECK-P9-NEXT:    oris r4, r4, 54437
7360; CHECK-P9-NEXT:    ori r4, r4, 4097
7361; CHECK-P9-NEXT:    or r3, r3, r4
7362; CHECK-P9-NEXT:    stfs f0, 0(r3)
7363; CHECK-P9-NEXT:    blr
7364;
7365; CHECK-P8-LABEL: st_not_disjoint64_uint8_t_float:
7366; CHECK-P8:       # %bb.0: # %entry
7367; CHECK-P8-NEXT:    mtfprwz f0, r4
7368; CHECK-P8-NEXT:    li r4, 29
7369; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
7370; CHECK-P8-NEXT:    oris r4, r4, 54437
7371; CHECK-P8-NEXT:    xscvuxdsp f0, f0
7372; CHECK-P8-NEXT:    ori r4, r4, 4097
7373; CHECK-P8-NEXT:    or r3, r3, r4
7374; CHECK-P8-NEXT:    stfs f0, 0(r3)
7375; CHECK-P8-NEXT:    blr
7376entry:
7377  %conv = uitofp i8 %str to float
7378  %or = or i64 %ptr, 1000000000001
7379  %0 = inttoptr i64 %or to ptr
7380  store float %conv, ptr %0, align 4
7381  ret void
7382}
7383
7384; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7385define dso_local void @st_disjoint_align64_uint8_t_float(i64 %ptr, i8 zeroext %str) {
7386; CHECK-P10-LABEL: st_disjoint_align64_uint8_t_float:
7387; CHECK-P10:       # %bb.0: # %entry
7388; CHECK-P10-NEXT:    mtfprwz f0, r4
7389; CHECK-P10-NEXT:    pli r4, 244140625
7390; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
7391; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
7392; CHECK-P10-NEXT:    xscvuxdsp f0, f0
7393; CHECK-P10-NEXT:    stfsx f0, r3, r4
7394; CHECK-P10-NEXT:    blr
7395;
7396; CHECK-P9-LABEL: st_disjoint_align64_uint8_t_float:
7397; CHECK-P9:       # %bb.0: # %entry
7398; CHECK-P9-NEXT:    mtfprwz f0, r4
7399; CHECK-P9-NEXT:    lis r4, 3725
7400; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
7401; CHECK-P9-NEXT:    xscvuxdsp f0, f0
7402; CHECK-P9-NEXT:    ori r4, r4, 19025
7403; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
7404; CHECK-P9-NEXT:    stfsx f0, r3, r4
7405; CHECK-P9-NEXT:    blr
7406;
7407; CHECK-P8-LABEL: st_disjoint_align64_uint8_t_float:
7408; CHECK-P8:       # %bb.0: # %entry
7409; CHECK-P8-NEXT:    mtfprwz f0, r4
7410; CHECK-P8-NEXT:    lis r4, 3725
7411; CHECK-P8-NEXT:    rldicr r3, r3, 0, 23
7412; CHECK-P8-NEXT:    ori r4, r4, 19025
7413; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
7414; CHECK-P8-NEXT:    xscvuxdsp f0, f0
7415; CHECK-P8-NEXT:    stfsx f0, r3, r4
7416; CHECK-P8-NEXT:    blr
7417entry:
7418  %and = and i64 %ptr, -1099511627776
7419  %conv = uitofp i8 %str to float
7420  %or = or i64 %and, 1000000000000
7421  %0 = inttoptr i64 %or to ptr
7422  store float %conv, ptr %0, align 4096
7423  ret void
7424}
7425
7426; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7427define dso_local void @st_cst_align16_uint8_t_float(i8 zeroext %str) {
7428; CHECK-LABEL: st_cst_align16_uint8_t_float:
7429; CHECK:       # %bb.0: # %entry
7430; CHECK-NEXT:    mtfprwz f0, r3
7431; CHECK-NEXT:    xscvuxdsp f0, f0
7432; CHECK-NEXT:    stfs f0, 4080(0)
7433; CHECK-NEXT:    blr
7434entry:
7435  %conv = uitofp i8 %str to float
7436  store float %conv, ptr inttoptr (i64 4080 to ptr), align 16
7437  ret void
7438}
7439
7440; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7441define dso_local void @st_cst_align32_uint8_t_float(i8 zeroext %str) {
7442; CHECK-LABEL: st_cst_align32_uint8_t_float:
7443; CHECK:       # %bb.0: # %entry
7444; CHECK-NEXT:    mtfprwz f0, r3
7445; CHECK-NEXT:    lis r3, 153
7446; CHECK-NEXT:    xscvuxdsp f0, f0
7447; CHECK-NEXT:    stfs f0, -27108(r3)
7448; CHECK-NEXT:    blr
7449entry:
7450  %conv = uitofp i8 %str to float
7451  store float %conv, ptr inttoptr (i64 9999900 to ptr), align 4
7452  ret void
7453}
7454
7455; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7456define dso_local void @st_cst_align64_uint8_t_float(i8 zeroext %str) {
7457; CHECK-P10-LABEL: st_cst_align64_uint8_t_float:
7458; CHECK-P10:       # %bb.0: # %entry
7459; CHECK-P10-NEXT:    mtfprwz f0, r3
7460; CHECK-P10-NEXT:    pli r3, 244140625
7461; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
7462; CHECK-P10-NEXT:    xscvuxdsp f0, f0
7463; CHECK-P10-NEXT:    stfs f0, 0(r3)
7464; CHECK-P10-NEXT:    blr
7465;
7466; CHECK-P9-LABEL: st_cst_align64_uint8_t_float:
7467; CHECK-P9:       # %bb.0: # %entry
7468; CHECK-P9-NEXT:    mtfprwz f0, r3
7469; CHECK-P9-NEXT:    lis r3, 3725
7470; CHECK-P9-NEXT:    xscvuxdsp f0, f0
7471; CHECK-P9-NEXT:    ori r3, r3, 19025
7472; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
7473; CHECK-P9-NEXT:    stfs f0, 0(r3)
7474; CHECK-P9-NEXT:    blr
7475;
7476; CHECK-P8-LABEL: st_cst_align64_uint8_t_float:
7477; CHECK-P8:       # %bb.0: # %entry
7478; CHECK-P8-NEXT:    mtfprwz f0, r3
7479; CHECK-P8-NEXT:    lis r3, 3725
7480; CHECK-P8-NEXT:    ori r3, r3, 19025
7481; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
7482; CHECK-P8-NEXT:    xscvuxdsp f0, f0
7483; CHECK-P8-NEXT:    stfs f0, 0(r3)
7484; CHECK-P8-NEXT:    blr
7485entry:
7486  %conv = uitofp i8 %str to float
7487  store float %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
7488  ret void
7489}
7490
7491; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7492define dso_local void @st_0_uint8_t_double(i64 %ptr, i8 zeroext %str) {
7493; CHECK-LABEL: st_0_uint8_t_double:
7494; CHECK:       # %bb.0: # %entry
7495; CHECK-NEXT:    mtfprwz f0, r4
7496; CHECK-NEXT:    xscvuxddp f0, f0
7497; CHECK-NEXT:    stfd f0, 0(r3)
7498; CHECK-NEXT:    blr
7499entry:
7500  %conv = uitofp i8 %str to double
7501  %0 = inttoptr i64 %ptr to ptr
7502  store double %conv, ptr %0, align 8
7503  ret void
7504}
7505
7506; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7507define dso_local void @st_align16_uint8_t_double(ptr nocapture %ptr, i8 zeroext %str) {
7508; CHECK-LABEL: st_align16_uint8_t_double:
7509; CHECK:       # %bb.0: # %entry
7510; CHECK-NEXT:    mtfprwz f0, r4
7511; CHECK-NEXT:    xscvuxddp f0, f0
7512; CHECK-NEXT:    stfd f0, 8(r3)
7513; CHECK-NEXT:    blr
7514entry:
7515  %conv = uitofp i8 %str to double
7516  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
7517  store double %conv, ptr %add.ptr, align 8
7518  ret void
7519}
7520
7521; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7522define dso_local void @st_align32_uint8_t_double(ptr nocapture %ptr, i8 zeroext %str) {
7523; CHECK-P10-LABEL: st_align32_uint8_t_double:
7524; CHECK-P10:       # %bb.0: # %entry
7525; CHECK-P10-NEXT:    mtfprwz f0, r4
7526; CHECK-P10-NEXT:    xscvuxddp f0, f0
7527; CHECK-P10-NEXT:    pstfd f0, 99999000(r3), 0
7528; CHECK-P10-NEXT:    blr
7529;
7530; CHECK-P9-LABEL: st_align32_uint8_t_double:
7531; CHECK-P9:       # %bb.0: # %entry
7532; CHECK-P9-NEXT:    mtfprwz f0, r4
7533; CHECK-P9-NEXT:    lis r4, 1525
7534; CHECK-P9-NEXT:    xscvuxddp f0, f0
7535; CHECK-P9-NEXT:    ori r4, r4, 56600
7536; CHECK-P9-NEXT:    stfdx f0, r3, r4
7537; CHECK-P9-NEXT:    blr
7538;
7539; CHECK-P8-LABEL: st_align32_uint8_t_double:
7540; CHECK-P8:       # %bb.0: # %entry
7541; CHECK-P8-NEXT:    mtfprwz f0, r4
7542; CHECK-P8-NEXT:    lis r4, 1525
7543; CHECK-P8-NEXT:    ori r4, r4, 56600
7544; CHECK-P8-NEXT:    xscvuxddp f0, f0
7545; CHECK-P8-NEXT:    stfdx f0, r3, r4
7546; CHECK-P8-NEXT:    blr
7547entry:
7548  %conv = uitofp i8 %str to double
7549  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
7550  store double %conv, ptr %add.ptr, align 8
7551  ret void
7552}
7553
7554; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7555define dso_local void @st_align64_uint8_t_double(ptr nocapture %ptr, i8 zeroext %str) {
7556; CHECK-P10-LABEL: st_align64_uint8_t_double:
7557; CHECK-P10:       # %bb.0: # %entry
7558; CHECK-P10-NEXT:    mtfprwz f0, r4
7559; CHECK-P10-NEXT:    pli r4, 244140625
7560; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
7561; CHECK-P10-NEXT:    xscvuxddp f0, f0
7562; CHECK-P10-NEXT:    stfdx f0, r3, r4
7563; CHECK-P10-NEXT:    blr
7564;
7565; CHECK-P9-LABEL: st_align64_uint8_t_double:
7566; CHECK-P9:       # %bb.0: # %entry
7567; CHECK-P9-NEXT:    mtfprwz f0, r4
7568; CHECK-P9-NEXT:    lis r4, 3725
7569; CHECK-P9-NEXT:    xscvuxddp f0, f0
7570; CHECK-P9-NEXT:    ori r4, r4, 19025
7571; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
7572; CHECK-P9-NEXT:    stfdx f0, r3, r4
7573; CHECK-P9-NEXT:    blr
7574;
7575; CHECK-P8-LABEL: st_align64_uint8_t_double:
7576; CHECK-P8:       # %bb.0: # %entry
7577; CHECK-P8-NEXT:    mtfprwz f0, r4
7578; CHECK-P8-NEXT:    lis r4, 3725
7579; CHECK-P8-NEXT:    ori r4, r4, 19025
7580; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
7581; CHECK-P8-NEXT:    xscvuxddp f0, f0
7582; CHECK-P8-NEXT:    stfdx f0, r3, r4
7583; CHECK-P8-NEXT:    blr
7584entry:
7585  %conv = uitofp i8 %str to double
7586  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
7587  store double %conv, ptr %add.ptr, align 8
7588  ret void
7589}
7590
7591; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7592define dso_local void @st_reg_uint8_t_double(ptr nocapture %ptr, i64 %off, i8 zeroext %str) {
7593; CHECK-LABEL: st_reg_uint8_t_double:
7594; CHECK:       # %bb.0: # %entry
7595; CHECK-NEXT:    mtfprwz f0, r5
7596; CHECK-NEXT:    xscvuxddp f0, f0
7597; CHECK-NEXT:    stfdx f0, r3, r4
7598; CHECK-NEXT:    blr
7599entry:
7600  %conv = uitofp i8 %str to double
7601  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
7602  store double %conv, ptr %add.ptr, align 8
7603  ret void
7604}
7605
7606; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7607define dso_local void @st_or1_uint8_t_double(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
7608; CHECK-LABEL: st_or1_uint8_t_double:
7609; CHECK:       # %bb.0: # %entry
7610; CHECK-NEXT:    mtfprwz f0, r5
7611; CHECK-NEXT:    or r3, r4, r3
7612; CHECK-NEXT:    xscvuxddp f0, f0
7613; CHECK-NEXT:    stfd f0, 0(r3)
7614; CHECK-NEXT:    blr
7615entry:
7616  %conv = uitofp i8 %str to double
7617  %conv1 = zext i8 %off to i64
7618  %or = or i64 %conv1, %ptr
7619  %0 = inttoptr i64 %or to ptr
7620  store double %conv, ptr %0, align 8
7621  ret void
7622}
7623
7624; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7625define dso_local void @st_not_disjoint16_uint8_t_double(i64 %ptr, i8 zeroext %str) {
7626; CHECK-LABEL: st_not_disjoint16_uint8_t_double:
7627; CHECK:       # %bb.0: # %entry
7628; CHECK-NEXT:    mtfprwz f0, r4
7629; CHECK-NEXT:    ori r3, r3, 6
7630; CHECK-NEXT:    xscvuxddp f0, f0
7631; CHECK-NEXT:    stfd f0, 0(r3)
7632; CHECK-NEXT:    blr
7633entry:
7634  %conv = uitofp i8 %str to double
7635  %or = or i64 %ptr, 6
7636  %0 = inttoptr i64 %or to ptr
7637  store double %conv, ptr %0, align 8
7638  ret void
7639}
7640
7641; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7642define dso_local void @st_disjoint_align16_uint8_t_double(i64 %ptr, i8 zeroext %str) {
7643; CHECK-LABEL: st_disjoint_align16_uint8_t_double:
7644; CHECK:       # %bb.0: # %entry
7645; CHECK-NEXT:    mtfprwz f0, r4
7646; CHECK-NEXT:    rldicr r3, r3, 0, 51
7647; CHECK-NEXT:    xscvuxddp f0, f0
7648; CHECK-NEXT:    stfd f0, 24(r3)
7649; CHECK-NEXT:    blr
7650entry:
7651  %and = and i64 %ptr, -4096
7652  %conv = uitofp i8 %str to double
7653  %or = or i64 %and, 24
7654  %0 = inttoptr i64 %or to ptr
7655  store double %conv, ptr %0, align 8
7656  ret void
7657}
7658
7659; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7660define dso_local void @st_not_disjoint32_uint8_t_double(i64 %ptr, i8 zeroext %str) {
7661; CHECK-P10-LABEL: st_not_disjoint32_uint8_t_double:
7662; CHECK-P10:       # %bb.0: # %entry
7663; CHECK-P10-NEXT:    mtfprwz f0, r4
7664; CHECK-P10-NEXT:    ori r3, r3, 34463
7665; CHECK-P10-NEXT:    oris r3, r3, 1
7666; CHECK-P10-NEXT:    xscvuxddp f0, f0
7667; CHECK-P10-NEXT:    stfd f0, 0(r3)
7668; CHECK-P10-NEXT:    blr
7669;
7670; CHECK-P9-LABEL: st_not_disjoint32_uint8_t_double:
7671; CHECK-P9:       # %bb.0: # %entry
7672; CHECK-P9-NEXT:    mtfprwz f0, r4
7673; CHECK-P9-NEXT:    ori r3, r3, 34463
7674; CHECK-P9-NEXT:    xscvuxddp f0, f0
7675; CHECK-P9-NEXT:    oris r3, r3, 1
7676; CHECK-P9-NEXT:    stfd f0, 0(r3)
7677; CHECK-P9-NEXT:    blr
7678;
7679; CHECK-P8-LABEL: st_not_disjoint32_uint8_t_double:
7680; CHECK-P8:       # %bb.0: # %entry
7681; CHECK-P8-NEXT:    mtfprwz f0, r4
7682; CHECK-P8-NEXT:    ori r3, r3, 34463
7683; CHECK-P8-NEXT:    oris r3, r3, 1
7684; CHECK-P8-NEXT:    xscvuxddp f0, f0
7685; CHECK-P8-NEXT:    stfd f0, 0(r3)
7686; CHECK-P8-NEXT:    blr
7687entry:
7688  %conv = uitofp i8 %str to double
7689  %or = or i64 %ptr, 99999
7690  %0 = inttoptr i64 %or to ptr
7691  store double %conv, ptr %0, align 8
7692  ret void
7693}
7694
7695; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7696define dso_local void @st_disjoint_align32_uint8_t_double(i64 %ptr, i8 zeroext %str) {
7697; CHECK-P10-LABEL: st_disjoint_align32_uint8_t_double:
7698; CHECK-P10:       # %bb.0: # %entry
7699; CHECK-P10-NEXT:    mtfprwz f0, r4
7700; CHECK-P10-NEXT:    lis r5, -15264
7701; CHECK-P10-NEXT:    and r3, r3, r5
7702; CHECK-P10-NEXT:    xscvuxddp f0, f0
7703; CHECK-P10-NEXT:    pstfd f0, 999990000(r3), 0
7704; CHECK-P10-NEXT:    blr
7705;
7706; CHECK-P9-LABEL: st_disjoint_align32_uint8_t_double:
7707; CHECK-P9:       # %bb.0: # %entry
7708; CHECK-P9-NEXT:    mtfprwz f0, r4
7709; CHECK-P9-NEXT:    lis r5, -15264
7710; CHECK-P9-NEXT:    lis r4, 15258
7711; CHECK-P9-NEXT:    xscvuxddp f0, f0
7712; CHECK-P9-NEXT:    and r3, r3, r5
7713; CHECK-P9-NEXT:    ori r4, r4, 41712
7714; CHECK-P9-NEXT:    stfdx f0, r3, r4
7715; CHECK-P9-NEXT:    blr
7716;
7717; CHECK-P8-LABEL: st_disjoint_align32_uint8_t_double:
7718; CHECK-P8:       # %bb.0: # %entry
7719; CHECK-P8-NEXT:    mtfprwz f0, r4
7720; CHECK-P8-NEXT:    lis r5, -15264
7721; CHECK-P8-NEXT:    lis r4, 15258
7722; CHECK-P8-NEXT:    and r3, r3, r5
7723; CHECK-P8-NEXT:    ori r4, r4, 41712
7724; CHECK-P8-NEXT:    xscvuxddp f0, f0
7725; CHECK-P8-NEXT:    stfdx f0, r3, r4
7726; CHECK-P8-NEXT:    blr
7727entry:
7728  %and = and i64 %ptr, -1000341504
7729  %conv = uitofp i8 %str to double
7730  %or = or i64 %and, 999990000
7731  %0 = inttoptr i64 %or to ptr
7732  store double %conv, ptr %0, align 16
7733  ret void
7734}
7735
7736; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7737define dso_local void @st_not_disjoint64_uint8_t_double(i64 %ptr, i8 zeroext %str) {
7738; CHECK-P10-LABEL: st_not_disjoint64_uint8_t_double:
7739; CHECK-P10:       # %bb.0: # %entry
7740; CHECK-P10-NEXT:    mtfprwz f0, r4
7741; CHECK-P10-NEXT:    pli r4, 232
7742; CHECK-P10-NEXT:    pli r5, 3567587329
7743; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
7744; CHECK-P10-NEXT:    xscvuxddp f0, f0
7745; CHECK-P10-NEXT:    or r3, r3, r5
7746; CHECK-P10-NEXT:    stfd f0, 0(r3)
7747; CHECK-P10-NEXT:    blr
7748;
7749; CHECK-P9-LABEL: st_not_disjoint64_uint8_t_double:
7750; CHECK-P9:       # %bb.0: # %entry
7751; CHECK-P9-NEXT:    mtfprwz f0, r4
7752; CHECK-P9-NEXT:    li r4, 29
7753; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
7754; CHECK-P9-NEXT:    xscvuxddp f0, f0
7755; CHECK-P9-NEXT:    oris r4, r4, 54437
7756; CHECK-P9-NEXT:    ori r4, r4, 4097
7757; CHECK-P9-NEXT:    or r3, r3, r4
7758; CHECK-P9-NEXT:    stfd f0, 0(r3)
7759; CHECK-P9-NEXT:    blr
7760;
7761; CHECK-P8-LABEL: st_not_disjoint64_uint8_t_double:
7762; CHECK-P8:       # %bb.0: # %entry
7763; CHECK-P8-NEXT:    mtfprwz f0, r4
7764; CHECK-P8-NEXT:    li r4, 29
7765; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
7766; CHECK-P8-NEXT:    oris r4, r4, 54437
7767; CHECK-P8-NEXT:    xscvuxddp f0, f0
7768; CHECK-P8-NEXT:    ori r4, r4, 4097
7769; CHECK-P8-NEXT:    or r3, r3, r4
7770; CHECK-P8-NEXT:    stfd f0, 0(r3)
7771; CHECK-P8-NEXT:    blr
7772entry:
7773  %conv = uitofp i8 %str to double
7774  %or = or i64 %ptr, 1000000000001
7775  %0 = inttoptr i64 %or to ptr
7776  store double %conv, ptr %0, align 8
7777  ret void
7778}
7779
7780; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7781define dso_local void @st_disjoint_align64_uint8_t_double(i64 %ptr, i8 zeroext %str) {
7782; CHECK-P10-LABEL: st_disjoint_align64_uint8_t_double:
7783; CHECK-P10:       # %bb.0: # %entry
7784; CHECK-P10-NEXT:    mtfprwz f0, r4
7785; CHECK-P10-NEXT:    pli r4, 244140625
7786; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
7787; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
7788; CHECK-P10-NEXT:    xscvuxddp f0, f0
7789; CHECK-P10-NEXT:    stfdx f0, r3, r4
7790; CHECK-P10-NEXT:    blr
7791;
7792; CHECK-P9-LABEL: st_disjoint_align64_uint8_t_double:
7793; CHECK-P9:       # %bb.0: # %entry
7794; CHECK-P9-NEXT:    mtfprwz f0, r4
7795; CHECK-P9-NEXT:    lis r4, 3725
7796; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
7797; CHECK-P9-NEXT:    xscvuxddp f0, f0
7798; CHECK-P9-NEXT:    ori r4, r4, 19025
7799; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
7800; CHECK-P9-NEXT:    stfdx f0, r3, r4
7801; CHECK-P9-NEXT:    blr
7802;
7803; CHECK-P8-LABEL: st_disjoint_align64_uint8_t_double:
7804; CHECK-P8:       # %bb.0: # %entry
7805; CHECK-P8-NEXT:    mtfprwz f0, r4
7806; CHECK-P8-NEXT:    lis r4, 3725
7807; CHECK-P8-NEXT:    rldicr r3, r3, 0, 23
7808; CHECK-P8-NEXT:    ori r4, r4, 19025
7809; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
7810; CHECK-P8-NEXT:    xscvuxddp f0, f0
7811; CHECK-P8-NEXT:    stfdx f0, r3, r4
7812; CHECK-P8-NEXT:    blr
7813entry:
7814  %and = and i64 %ptr, -1099511627776
7815  %conv = uitofp i8 %str to double
7816  %or = or i64 %and, 1000000000000
7817  %0 = inttoptr i64 %or to ptr
7818  store double %conv, ptr %0, align 4096
7819  ret void
7820}
7821
7822; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7823define dso_local void @st_cst_align16_uint8_t_double(i8 zeroext %str) {
7824; CHECK-LABEL: st_cst_align16_uint8_t_double:
7825; CHECK:       # %bb.0: # %entry
7826; CHECK-NEXT:    mtfprwz f0, r3
7827; CHECK-NEXT:    xscvuxddp f0, f0
7828; CHECK-NEXT:    stfd f0, 4080(0)
7829; CHECK-NEXT:    blr
7830entry:
7831  %conv = uitofp i8 %str to double
7832  store double %conv, ptr inttoptr (i64 4080 to ptr), align 16
7833  ret void
7834}
7835
7836; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7837define dso_local void @st_cst_align32_uint8_t_double(i8 zeroext %str) {
7838; CHECK-LABEL: st_cst_align32_uint8_t_double:
7839; CHECK:       # %bb.0: # %entry
7840; CHECK-NEXT:    mtfprwz f0, r3
7841; CHECK-NEXT:    lis r3, 153
7842; CHECK-NEXT:    xscvuxddp f0, f0
7843; CHECK-NEXT:    stfd f0, -27108(r3)
7844; CHECK-NEXT:    blr
7845entry:
7846  %conv = uitofp i8 %str to double
7847  store double %conv, ptr inttoptr (i64 9999900 to ptr), align 8
7848  ret void
7849}
7850
7851; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7852define dso_local void @st_cst_align64_uint8_t_double(i8 zeroext %str) {
7853; CHECK-P10-LABEL: st_cst_align64_uint8_t_double:
7854; CHECK-P10:       # %bb.0: # %entry
7855; CHECK-P10-NEXT:    mtfprwz f0, r3
7856; CHECK-P10-NEXT:    pli r3, 244140625
7857; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
7858; CHECK-P10-NEXT:    xscvuxddp f0, f0
7859; CHECK-P10-NEXT:    stfd f0, 0(r3)
7860; CHECK-P10-NEXT:    blr
7861;
7862; CHECK-P9-LABEL: st_cst_align64_uint8_t_double:
7863; CHECK-P9:       # %bb.0: # %entry
7864; CHECK-P9-NEXT:    mtfprwz f0, r3
7865; CHECK-P9-NEXT:    lis r3, 3725
7866; CHECK-P9-NEXT:    xscvuxddp f0, f0
7867; CHECK-P9-NEXT:    ori r3, r3, 19025
7868; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
7869; CHECK-P9-NEXT:    stfd f0, 0(r3)
7870; CHECK-P9-NEXT:    blr
7871;
7872; CHECK-P8-LABEL: st_cst_align64_uint8_t_double:
7873; CHECK-P8:       # %bb.0: # %entry
7874; CHECK-P8-NEXT:    mtfprwz f0, r3
7875; CHECK-P8-NEXT:    lis r3, 3725
7876; CHECK-P8-NEXT:    ori r3, r3, 19025
7877; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
7878; CHECK-P8-NEXT:    xscvuxddp f0, f0
7879; CHECK-P8-NEXT:    stfd f0, 0(r3)
7880; CHECK-P8-NEXT:    blr
7881entry:
7882  %conv = uitofp i8 %str to double
7883  store double %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
7884  ret void
7885}
7886
7887; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7888define dso_local void @st_0_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
7889; CHECK-LABEL: st_0_int8_t_uint16_t:
7890; CHECK:       # %bb.0: # %entry
7891; CHECK-NEXT:    sth r4, 0(r3)
7892; CHECK-NEXT:    blr
7893entry:
7894  %conv = sext i8 %str to i16
7895  %0 = inttoptr i64 %ptr to ptr
7896  store i16 %conv, ptr %0, align 2
7897  ret void
7898}
7899
7900; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7901define dso_local void @st_align16_int8_t_uint16_t(ptr nocapture %ptr, i8 signext %str) {
7902; CHECK-LABEL: st_align16_int8_t_uint16_t:
7903; CHECK:       # %bb.0: # %entry
7904; CHECK-NEXT:    sth r4, 8(r3)
7905; CHECK-NEXT:    blr
7906entry:
7907  %conv = sext i8 %str to i16
7908  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
7909  store i16 %conv, ptr %add.ptr, align 2
7910  ret void
7911}
7912
7913; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7914define dso_local void @st_align32_int8_t_uint16_t(ptr nocapture %ptr, i8 signext %str) {
7915; CHECK-P10-LABEL: st_align32_int8_t_uint16_t:
7916; CHECK-P10:       # %bb.0: # %entry
7917; CHECK-P10-NEXT:    psth r4, 99999000(r3), 0
7918; CHECK-P10-NEXT:    blr
7919;
7920; CHECK-PREP10-LABEL: st_align32_int8_t_uint16_t:
7921; CHECK-PREP10:       # %bb.0: # %entry
7922; CHECK-PREP10-NEXT:    lis r5, 1525
7923; CHECK-PREP10-NEXT:    ori r5, r5, 56600
7924; CHECK-PREP10-NEXT:    sthx r4, r3, r5
7925; CHECK-PREP10-NEXT:    blr
7926entry:
7927  %conv = sext i8 %str to i16
7928  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
7929  store i16 %conv, ptr %add.ptr, align 2
7930  ret void
7931}
7932
7933; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7934define dso_local void @st_align64_int8_t_uint16_t(ptr nocapture %ptr, i8 signext %str) {
7935; CHECK-P10-LABEL: st_align64_int8_t_uint16_t:
7936; CHECK-P10:       # %bb.0: # %entry
7937; CHECK-P10-NEXT:    pli r5, 244140625
7938; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
7939; CHECK-P10-NEXT:    sthx r4, r3, r5
7940; CHECK-P10-NEXT:    blr
7941;
7942; CHECK-PREP10-LABEL: st_align64_int8_t_uint16_t:
7943; CHECK-PREP10:       # %bb.0: # %entry
7944; CHECK-PREP10-NEXT:    lis r5, 3725
7945; CHECK-PREP10-NEXT:    ori r5, r5, 19025
7946; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
7947; CHECK-PREP10-NEXT:    sthx r4, r3, r5
7948; CHECK-PREP10-NEXT:    blr
7949entry:
7950  %conv = sext i8 %str to i16
7951  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
7952  store i16 %conv, ptr %add.ptr, align 2
7953  ret void
7954}
7955
7956; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7957define dso_local void @st_reg_int8_t_uint16_t(ptr nocapture %ptr, i64 %off, i8 signext %str) {
7958; CHECK-LABEL: st_reg_int8_t_uint16_t:
7959; CHECK:       # %bb.0: # %entry
7960; CHECK-NEXT:    sthx r5, r3, r4
7961; CHECK-NEXT:    blr
7962entry:
7963  %conv = sext i8 %str to i16
7964  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
7965  store i16 %conv, ptr %add.ptr, align 2
7966  ret void
7967}
7968
7969; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7970define dso_local void @st_or1_int8_t_uint16_t(i64 %ptr, i8 zeroext %off, i8 signext %str) {
7971; CHECK-LABEL: st_or1_int8_t_uint16_t:
7972; CHECK:       # %bb.0: # %entry
7973; CHECK-NEXT:    or r3, r4, r3
7974; CHECK-NEXT:    sth r5, 0(r3)
7975; CHECK-NEXT:    blr
7976entry:
7977  %conv = sext i8 %str to i16
7978  %conv1 = zext i8 %off to i64
7979  %or = or i64 %conv1, %ptr
7980  %0 = inttoptr i64 %or to ptr
7981  store i16 %conv, ptr %0, align 2
7982  ret void
7983}
7984
7985; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
7986define dso_local void @st_not_disjoint16_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
7987; CHECK-LABEL: st_not_disjoint16_int8_t_uint16_t:
7988; CHECK:       # %bb.0: # %entry
7989; CHECK-NEXT:    ori r3, r3, 6
7990; CHECK-NEXT:    sth r4, 0(r3)
7991; CHECK-NEXT:    blr
7992entry:
7993  %conv = sext i8 %str to i16
7994  %or = or i64 %ptr, 6
7995  %0 = inttoptr i64 %or to ptr
7996  store i16 %conv, ptr %0, align 2
7997  ret void
7998}
7999
8000; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8001define dso_local void @st_disjoint_align16_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
8002; CHECK-LABEL: st_disjoint_align16_int8_t_uint16_t:
8003; CHECK:       # %bb.0: # %entry
8004; CHECK-NEXT:    rldicr r3, r3, 0, 51
8005; CHECK-NEXT:    sth r4, 24(r3)
8006; CHECK-NEXT:    blr
8007entry:
8008  %and = and i64 %ptr, -4096
8009  %conv = sext i8 %str to i16
8010  %or = or i64 %and, 24
8011  %0 = inttoptr i64 %or to ptr
8012  store i16 %conv, ptr %0, align 8
8013  ret void
8014}
8015
8016; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8017define dso_local void @st_not_disjoint32_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
8018; CHECK-LABEL: st_not_disjoint32_int8_t_uint16_t:
8019; CHECK:       # %bb.0: # %entry
8020; CHECK-NEXT:    ori r3, r3, 34463
8021; CHECK-NEXT:    oris r3, r3, 1
8022; CHECK-NEXT:    sth r4, 0(r3)
8023; CHECK-NEXT:    blr
8024entry:
8025  %conv = sext i8 %str to i16
8026  %or = or i64 %ptr, 99999
8027  %0 = inttoptr i64 %or to ptr
8028  store i16 %conv, ptr %0, align 2
8029  ret void
8030}
8031
8032; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8033define dso_local void @st_disjoint_align32_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
8034; CHECK-P10-LABEL: st_disjoint_align32_int8_t_uint16_t:
8035; CHECK-P10:       # %bb.0: # %entry
8036; CHECK-P10-NEXT:    lis r5, -15264
8037; CHECK-P10-NEXT:    and r3, r3, r5
8038; CHECK-P10-NEXT:    psth r4, 999990000(r3), 0
8039; CHECK-P10-NEXT:    blr
8040;
8041; CHECK-PREP10-LABEL: st_disjoint_align32_int8_t_uint16_t:
8042; CHECK-PREP10:       # %bb.0: # %entry
8043; CHECK-PREP10-NEXT:    lis r5, -15264
8044; CHECK-PREP10-NEXT:    and r3, r3, r5
8045; CHECK-PREP10-NEXT:    lis r5, 15258
8046; CHECK-PREP10-NEXT:    ori r5, r5, 41712
8047; CHECK-PREP10-NEXT:    sthx r4, r3, r5
8048; CHECK-PREP10-NEXT:    blr
8049entry:
8050  %and = and i64 %ptr, -1000341504
8051  %conv = sext i8 %str to i16
8052  %or = or i64 %and, 999990000
8053  %0 = inttoptr i64 %or to ptr
8054  store i16 %conv, ptr %0, align 16
8055  ret void
8056}
8057
8058; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8059define dso_local void @st_not_disjoint64_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
8060; CHECK-P10-LABEL: st_not_disjoint64_int8_t_uint16_t:
8061; CHECK-P10:       # %bb.0: # %entry
8062; CHECK-P10-NEXT:    pli r5, 232
8063; CHECK-P10-NEXT:    pli r6, 3567587329
8064; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
8065; CHECK-P10-NEXT:    or r3, r3, r6
8066; CHECK-P10-NEXT:    sth r4, 0(r3)
8067; CHECK-P10-NEXT:    blr
8068;
8069; CHECK-PREP10-LABEL: st_not_disjoint64_int8_t_uint16_t:
8070; CHECK-PREP10:       # %bb.0: # %entry
8071; CHECK-PREP10-NEXT:    li r5, 29
8072; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
8073; CHECK-PREP10-NEXT:    oris r5, r5, 54437
8074; CHECK-PREP10-NEXT:    ori r5, r5, 4097
8075; CHECK-PREP10-NEXT:    or r3, r3, r5
8076; CHECK-PREP10-NEXT:    sth r4, 0(r3)
8077; CHECK-PREP10-NEXT:    blr
8078entry:
8079  %conv = sext i8 %str to i16
8080  %or = or i64 %ptr, 1000000000001
8081  %0 = inttoptr i64 %or to ptr
8082  store i16 %conv, ptr %0, align 2
8083  ret void
8084}
8085
8086; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8087define dso_local void @st_disjoint_align64_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
8088; CHECK-P10-LABEL: st_disjoint_align64_int8_t_uint16_t:
8089; CHECK-P10:       # %bb.0: # %entry
8090; CHECK-P10-NEXT:    pli r5, 244140625
8091; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
8092; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
8093; CHECK-P10-NEXT:    sthx r4, r3, r5
8094; CHECK-P10-NEXT:    blr
8095;
8096; CHECK-PREP10-LABEL: st_disjoint_align64_int8_t_uint16_t:
8097; CHECK-PREP10:       # %bb.0: # %entry
8098; CHECK-PREP10-NEXT:    lis r5, 3725
8099; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
8100; CHECK-PREP10-NEXT:    ori r5, r5, 19025
8101; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
8102; CHECK-PREP10-NEXT:    sthx r4, r3, r5
8103; CHECK-PREP10-NEXT:    blr
8104entry:
8105  %and = and i64 %ptr, -1099511627776
8106  %conv = sext i8 %str to i16
8107  %or = or i64 %and, 1000000000000
8108  %0 = inttoptr i64 %or to ptr
8109  store i16 %conv, ptr %0, align 4096
8110  ret void
8111}
8112
8113; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8114define dso_local void @st_cst_align16_int8_t_uint16_t(i8 signext %str) {
8115; CHECK-LABEL: st_cst_align16_int8_t_uint16_t:
8116; CHECK:       # %bb.0: # %entry
8117; CHECK-NEXT:    sth r3, 4080(0)
8118; CHECK-NEXT:    blr
8119entry:
8120  %conv = sext i8 %str to i16
8121  store i16 %conv, ptr inttoptr (i64 4080 to ptr), align 16
8122  ret void
8123}
8124
8125; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8126define dso_local void @st_cst_align32_int8_t_uint16_t(i8 signext %str) {
8127; CHECK-LABEL: st_cst_align32_int8_t_uint16_t:
8128; CHECK:       # %bb.0: # %entry
8129; CHECK-NEXT:    lis r4, 153
8130; CHECK-NEXT:    sth r3, -27108(r4)
8131; CHECK-NEXT:    blr
8132entry:
8133  %conv = sext i8 %str to i16
8134  store i16 %conv, ptr inttoptr (i64 9999900 to ptr), align 4
8135  ret void
8136}
8137
8138; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8139define dso_local void @st_cst_align64_int8_t_uint16_t(i8 signext %str) {
8140; CHECK-P10-LABEL: st_cst_align64_int8_t_uint16_t:
8141; CHECK-P10:       # %bb.0: # %entry
8142; CHECK-P10-NEXT:    pli r4, 244140625
8143; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
8144; CHECK-P10-NEXT:    sth r3, 0(r4)
8145; CHECK-P10-NEXT:    blr
8146;
8147; CHECK-PREP10-LABEL: st_cst_align64_int8_t_uint16_t:
8148; CHECK-PREP10:       # %bb.0: # %entry
8149; CHECK-PREP10-NEXT:    lis r4, 3725
8150; CHECK-PREP10-NEXT:    ori r4, r4, 19025
8151; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
8152; CHECK-PREP10-NEXT:    sth r3, 0(r4)
8153; CHECK-PREP10-NEXT:    blr
8154entry:
8155  %conv = sext i8 %str to i16
8156  store i16 %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
8157  ret void
8158}
8159
8160; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8161define dso_local void @st_0_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
8162; CHECK-LABEL: st_0_int8_t_uint32_t:
8163; CHECK:       # %bb.0: # %entry
8164; CHECK-NEXT:    stw r4, 0(r3)
8165; CHECK-NEXT:    blr
8166entry:
8167  %conv = sext i8 %str to i32
8168  %0 = inttoptr i64 %ptr to ptr
8169  store i32 %conv, ptr %0, align 4
8170  ret void
8171}
8172
8173; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8174define dso_local void @st_align16_int8_t_uint32_t(ptr nocapture %ptr, i8 signext %str) {
8175; CHECK-LABEL: st_align16_int8_t_uint32_t:
8176; CHECK:       # %bb.0: # %entry
8177; CHECK-NEXT:    stw r4, 8(r3)
8178; CHECK-NEXT:    blr
8179entry:
8180  %conv = sext i8 %str to i32
8181  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
8182  store i32 %conv, ptr %add.ptr, align 4
8183  ret void
8184}
8185
8186; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8187define dso_local void @st_align32_int8_t_uint32_t(ptr nocapture %ptr, i8 signext %str) {
8188; CHECK-P10-LABEL: st_align32_int8_t_uint32_t:
8189; CHECK-P10:       # %bb.0: # %entry
8190; CHECK-P10-NEXT:    pstw r4, 99999000(r3), 0
8191; CHECK-P10-NEXT:    blr
8192;
8193; CHECK-PREP10-LABEL: st_align32_int8_t_uint32_t:
8194; CHECK-PREP10:       # %bb.0: # %entry
8195; CHECK-PREP10-NEXT:    lis r5, 1525
8196; CHECK-PREP10-NEXT:    ori r5, r5, 56600
8197; CHECK-PREP10-NEXT:    stwx r4, r3, r5
8198; CHECK-PREP10-NEXT:    blr
8199entry:
8200  %conv = sext i8 %str to i32
8201  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
8202  store i32 %conv, ptr %add.ptr, align 4
8203  ret void
8204}
8205
8206; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8207define dso_local void @st_align64_int8_t_uint32_t(ptr nocapture %ptr, i8 signext %str) {
8208; CHECK-P10-LABEL: st_align64_int8_t_uint32_t:
8209; CHECK-P10:       # %bb.0: # %entry
8210; CHECK-P10-NEXT:    pli r5, 244140625
8211; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
8212; CHECK-P10-NEXT:    stwx r4, r3, r5
8213; CHECK-P10-NEXT:    blr
8214;
8215; CHECK-PREP10-LABEL: st_align64_int8_t_uint32_t:
8216; CHECK-PREP10:       # %bb.0: # %entry
8217; CHECK-PREP10-NEXT:    lis r5, 3725
8218; CHECK-PREP10-NEXT:    ori r5, r5, 19025
8219; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
8220; CHECK-PREP10-NEXT:    stwx r4, r3, r5
8221; CHECK-PREP10-NEXT:    blr
8222entry:
8223  %conv = sext i8 %str to i32
8224  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
8225  store i32 %conv, ptr %add.ptr, align 4
8226  ret void
8227}
8228
8229; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8230define dso_local void @st_reg_int8_t_uint32_t(ptr nocapture %ptr, i64 %off, i8 signext %str) {
8231; CHECK-LABEL: st_reg_int8_t_uint32_t:
8232; CHECK:       # %bb.0: # %entry
8233; CHECK-NEXT:    stwx r5, r3, r4
8234; CHECK-NEXT:    blr
8235entry:
8236  %conv = sext i8 %str to i32
8237  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
8238  store i32 %conv, ptr %add.ptr, align 4
8239  ret void
8240}
8241
8242; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8243define dso_local void @st_or1_int8_t_uint32_t(i64 %ptr, i8 zeroext %off, i8 signext %str) {
8244; CHECK-LABEL: st_or1_int8_t_uint32_t:
8245; CHECK:       # %bb.0: # %entry
8246; CHECK-NEXT:    or r3, r4, r3
8247; CHECK-NEXT:    stw r5, 0(r3)
8248; CHECK-NEXT:    blr
8249entry:
8250  %conv = sext i8 %str to i32
8251  %conv1 = zext i8 %off to i64
8252  %or = or i64 %conv1, %ptr
8253  %0 = inttoptr i64 %or to ptr
8254  store i32 %conv, ptr %0, align 4
8255  ret void
8256}
8257
8258; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8259define dso_local void @st_not_disjoint16_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
8260; CHECK-LABEL: st_not_disjoint16_int8_t_uint32_t:
8261; CHECK:       # %bb.0: # %entry
8262; CHECK-NEXT:    ori r3, r3, 6
8263; CHECK-NEXT:    stw r4, 0(r3)
8264; CHECK-NEXT:    blr
8265entry:
8266  %conv = sext i8 %str to i32
8267  %or = or i64 %ptr, 6
8268  %0 = inttoptr i64 %or to ptr
8269  store i32 %conv, ptr %0, align 4
8270  ret void
8271}
8272
8273; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8274define dso_local void @st_disjoint_align16_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
8275; CHECK-LABEL: st_disjoint_align16_int8_t_uint32_t:
8276; CHECK:       # %bb.0: # %entry
8277; CHECK-NEXT:    rldicr r3, r3, 0, 51
8278; CHECK-NEXT:    stw r4, 24(r3)
8279; CHECK-NEXT:    blr
8280entry:
8281  %and = and i64 %ptr, -4096
8282  %conv = sext i8 %str to i32
8283  %or = or i64 %and, 24
8284  %0 = inttoptr i64 %or to ptr
8285  store i32 %conv, ptr %0, align 8
8286  ret void
8287}
8288
8289; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8290define dso_local void @st_not_disjoint32_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
8291; CHECK-LABEL: st_not_disjoint32_int8_t_uint32_t:
8292; CHECK:       # %bb.0: # %entry
8293; CHECK-NEXT:    ori r3, r3, 34463
8294; CHECK-NEXT:    oris r3, r3, 1
8295; CHECK-NEXT:    stw r4, 0(r3)
8296; CHECK-NEXT:    blr
8297entry:
8298  %conv = sext i8 %str to i32
8299  %or = or i64 %ptr, 99999
8300  %0 = inttoptr i64 %or to ptr
8301  store i32 %conv, ptr %0, align 4
8302  ret void
8303}
8304
8305; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8306define dso_local void @st_disjoint_align32_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
8307; CHECK-P10-LABEL: st_disjoint_align32_int8_t_uint32_t:
8308; CHECK-P10:       # %bb.0: # %entry
8309; CHECK-P10-NEXT:    lis r5, -15264
8310; CHECK-P10-NEXT:    and r3, r3, r5
8311; CHECK-P10-NEXT:    pstw r4, 999990000(r3), 0
8312; CHECK-P10-NEXT:    blr
8313;
8314; CHECK-PREP10-LABEL: st_disjoint_align32_int8_t_uint32_t:
8315; CHECK-PREP10:       # %bb.0: # %entry
8316; CHECK-PREP10-NEXT:    lis r5, -15264
8317; CHECK-PREP10-NEXT:    and r3, r3, r5
8318; CHECK-PREP10-NEXT:    lis r5, 15258
8319; CHECK-PREP10-NEXT:    ori r5, r5, 41712
8320; CHECK-PREP10-NEXT:    stwx r4, r3, r5
8321; CHECK-PREP10-NEXT:    blr
8322entry:
8323  %and = and i64 %ptr, -1000341504
8324  %conv = sext i8 %str to i32
8325  %or = or i64 %and, 999990000
8326  %0 = inttoptr i64 %or to ptr
8327  store i32 %conv, ptr %0, align 16
8328  ret void
8329}
8330
8331; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8332define dso_local void @st_not_disjoint64_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
8333; CHECK-P10-LABEL: st_not_disjoint64_int8_t_uint32_t:
8334; CHECK-P10:       # %bb.0: # %entry
8335; CHECK-P10-NEXT:    pli r5, 232
8336; CHECK-P10-NEXT:    pli r6, 3567587329
8337; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
8338; CHECK-P10-NEXT:    or r3, r3, r6
8339; CHECK-P10-NEXT:    stw r4, 0(r3)
8340; CHECK-P10-NEXT:    blr
8341;
8342; CHECK-PREP10-LABEL: st_not_disjoint64_int8_t_uint32_t:
8343; CHECK-PREP10:       # %bb.0: # %entry
8344; CHECK-PREP10-NEXT:    li r5, 29
8345; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
8346; CHECK-PREP10-NEXT:    oris r5, r5, 54437
8347; CHECK-PREP10-NEXT:    ori r5, r5, 4097
8348; CHECK-PREP10-NEXT:    or r3, r3, r5
8349; CHECK-PREP10-NEXT:    stw r4, 0(r3)
8350; CHECK-PREP10-NEXT:    blr
8351entry:
8352  %conv = sext i8 %str to i32
8353  %or = or i64 %ptr, 1000000000001
8354  %0 = inttoptr i64 %or to ptr
8355  store i32 %conv, ptr %0, align 4
8356  ret void
8357}
8358
8359; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8360define dso_local void @st_disjoint_align64_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
8361; CHECK-P10-LABEL: st_disjoint_align64_int8_t_uint32_t:
8362; CHECK-P10:       # %bb.0: # %entry
8363; CHECK-P10-NEXT:    pli r5, 244140625
8364; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
8365; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
8366; CHECK-P10-NEXT:    stwx r4, r3, r5
8367; CHECK-P10-NEXT:    blr
8368;
8369; CHECK-PREP10-LABEL: st_disjoint_align64_int8_t_uint32_t:
8370; CHECK-PREP10:       # %bb.0: # %entry
8371; CHECK-PREP10-NEXT:    lis r5, 3725
8372; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
8373; CHECK-PREP10-NEXT:    ori r5, r5, 19025
8374; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
8375; CHECK-PREP10-NEXT:    stwx r4, r3, r5
8376; CHECK-PREP10-NEXT:    blr
8377entry:
8378  %and = and i64 %ptr, -1099511627776
8379  %conv = sext i8 %str to i32
8380  %or = or i64 %and, 1000000000000
8381  %0 = inttoptr i64 %or to ptr
8382  store i32 %conv, ptr %0, align 4096
8383  ret void
8384}
8385
8386; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8387define dso_local void @st_cst_align16_int8_t_uint32_t(i8 signext %str) {
8388; CHECK-LABEL: st_cst_align16_int8_t_uint32_t:
8389; CHECK:       # %bb.0: # %entry
8390; CHECK-NEXT:    stw r3, 4080(0)
8391; CHECK-NEXT:    blr
8392entry:
8393  %conv = sext i8 %str to i32
8394  store i32 %conv, ptr inttoptr (i64 4080 to ptr), align 16
8395  ret void
8396}
8397
8398; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8399define dso_local void @st_cst_align32_int8_t_uint32_t(i8 signext %str) {
8400; CHECK-LABEL: st_cst_align32_int8_t_uint32_t:
8401; CHECK:       # %bb.0: # %entry
8402; CHECK-NEXT:    lis r4, 153
8403; CHECK-NEXT:    stw r3, -27108(r4)
8404; CHECK-NEXT:    blr
8405entry:
8406  %conv = sext i8 %str to i32
8407  store i32 %conv, ptr inttoptr (i64 9999900 to ptr), align 4
8408  ret void
8409}
8410
8411; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8412define dso_local void @st_cst_align64_int8_t_uint32_t(i8 signext %str) {
8413; CHECK-P10-LABEL: st_cst_align64_int8_t_uint32_t:
8414; CHECK-P10:       # %bb.0: # %entry
8415; CHECK-P10-NEXT:    pli r4, 244140625
8416; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
8417; CHECK-P10-NEXT:    stw r3, 0(r4)
8418; CHECK-P10-NEXT:    blr
8419;
8420; CHECK-PREP10-LABEL: st_cst_align64_int8_t_uint32_t:
8421; CHECK-PREP10:       # %bb.0: # %entry
8422; CHECK-PREP10-NEXT:    lis r4, 3725
8423; CHECK-PREP10-NEXT:    ori r4, r4, 19025
8424; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
8425; CHECK-PREP10-NEXT:    stw r3, 0(r4)
8426; CHECK-PREP10-NEXT:    blr
8427entry:
8428  %conv = sext i8 %str to i32
8429  store i32 %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
8430  ret void
8431}
8432
8433; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8434define dso_local void @st_0_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
8435; CHECK-LABEL: st_0_int8_t_uint64_t:
8436; CHECK:       # %bb.0: # %entry
8437; CHECK-NEXT:    std r4, 0(r3)
8438; CHECK-NEXT:    blr
8439entry:
8440  %conv = sext i8 %str to i64
8441  %0 = inttoptr i64 %ptr to ptr
8442  store i64 %conv, ptr %0, align 8
8443  ret void
8444}
8445
8446; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8447define dso_local void @st_align16_int8_t_uint64_t(ptr nocapture %ptr, i8 signext %str) {
8448; CHECK-LABEL: st_align16_int8_t_uint64_t:
8449; CHECK:       # %bb.0: # %entry
8450; CHECK-NEXT:    std r4, 8(r3)
8451; CHECK-NEXT:    blr
8452entry:
8453  %conv = sext i8 %str to i64
8454  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
8455  store i64 %conv, ptr %add.ptr, align 8
8456  ret void
8457}
8458
8459; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8460define dso_local void @st_align32_int8_t_uint64_t(ptr nocapture %ptr, i8 signext %str) {
8461; CHECK-P10-LABEL: st_align32_int8_t_uint64_t:
8462; CHECK-P10:       # %bb.0: # %entry
8463; CHECK-P10-NEXT:    pstd r4, 99999000(r3), 0
8464; CHECK-P10-NEXT:    blr
8465;
8466; CHECK-PREP10-LABEL: st_align32_int8_t_uint64_t:
8467; CHECK-PREP10:       # %bb.0: # %entry
8468; CHECK-PREP10-NEXT:    lis r5, 1525
8469; CHECK-PREP10-NEXT:    ori r5, r5, 56600
8470; CHECK-PREP10-NEXT:    stdx r4, r3, r5
8471; CHECK-PREP10-NEXT:    blr
8472entry:
8473  %conv = sext i8 %str to i64
8474  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
8475  store i64 %conv, ptr %add.ptr, align 8
8476  ret void
8477}
8478
8479; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8480define dso_local void @st_align64_int8_t_uint64_t(ptr nocapture %ptr, i8 signext %str) {
8481; CHECK-P10-LABEL: st_align64_int8_t_uint64_t:
8482; CHECK-P10:       # %bb.0: # %entry
8483; CHECK-P10-NEXT:    pli r5, 244140625
8484; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
8485; CHECK-P10-NEXT:    stdx r4, r3, r5
8486; CHECK-P10-NEXT:    blr
8487;
8488; CHECK-PREP10-LABEL: st_align64_int8_t_uint64_t:
8489; CHECK-PREP10:       # %bb.0: # %entry
8490; CHECK-PREP10-NEXT:    lis r5, 3725
8491; CHECK-PREP10-NEXT:    ori r5, r5, 19025
8492; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
8493; CHECK-PREP10-NEXT:    stdx r4, r3, r5
8494; CHECK-PREP10-NEXT:    blr
8495entry:
8496  %conv = sext i8 %str to i64
8497  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
8498  store i64 %conv, ptr %add.ptr, align 8
8499  ret void
8500}
8501
8502; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8503define dso_local void @st_reg_int8_t_uint64_t(ptr nocapture %ptr, i64 %off, i8 signext %str) {
8504; CHECK-LABEL: st_reg_int8_t_uint64_t:
8505; CHECK:       # %bb.0: # %entry
8506; CHECK-NEXT:    stdx r5, r3, r4
8507; CHECK-NEXT:    blr
8508entry:
8509  %conv = sext i8 %str to i64
8510  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
8511  store i64 %conv, ptr %add.ptr, align 8
8512  ret void
8513}
8514
8515; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8516define dso_local void @st_or1_int8_t_uint64_t(i64 %ptr, i8 zeroext %off, i8 signext %str) {
8517; CHECK-LABEL: st_or1_int8_t_uint64_t:
8518; CHECK:       # %bb.0: # %entry
8519; CHECK-NEXT:    or r3, r4, r3
8520; CHECK-NEXT:    std r5, 0(r3)
8521; CHECK-NEXT:    blr
8522entry:
8523  %conv = sext i8 %str to i64
8524  %conv1 = zext i8 %off to i64
8525  %or = or i64 %conv1, %ptr
8526  %0 = inttoptr i64 %or to ptr
8527  store i64 %conv, ptr %0, align 8
8528  ret void
8529}
8530
8531; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8532define dso_local void @st_not_disjoint16_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
8533; CHECK-LABEL: st_not_disjoint16_int8_t_uint64_t:
8534; CHECK:       # %bb.0: # %entry
8535; CHECK-NEXT:    ori r3, r3, 6
8536; CHECK-NEXT:    std r4, 0(r3)
8537; CHECK-NEXT:    blr
8538entry:
8539  %conv = sext i8 %str to i64
8540  %or = or i64 %ptr, 6
8541  %0 = inttoptr i64 %or to ptr
8542  store i64 %conv, ptr %0, align 8
8543  ret void
8544}
8545
8546; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8547define dso_local void @st_disjoint_align16_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
8548; CHECK-LABEL: st_disjoint_align16_int8_t_uint64_t:
8549; CHECK:       # %bb.0: # %entry
8550; CHECK-NEXT:    rldicr r3, r3, 0, 51
8551; CHECK-NEXT:    std r4, 24(r3)
8552; CHECK-NEXT:    blr
8553entry:
8554  %and = and i64 %ptr, -4096
8555  %conv = sext i8 %str to i64
8556  %or = or i64 %and, 24
8557  %0 = inttoptr i64 %or to ptr
8558  store i64 %conv, ptr %0, align 8
8559  ret void
8560}
8561
8562; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8563define dso_local void @st_not_disjoint32_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
8564; CHECK-LABEL: st_not_disjoint32_int8_t_uint64_t:
8565; CHECK:       # %bb.0: # %entry
8566; CHECK-NEXT:    ori r3, r3, 34463
8567; CHECK-NEXT:    oris r3, r3, 1
8568; CHECK-NEXT:    std r4, 0(r3)
8569; CHECK-NEXT:    blr
8570entry:
8571  %conv = sext i8 %str to i64
8572  %or = or i64 %ptr, 99999
8573  %0 = inttoptr i64 %or to ptr
8574  store i64 %conv, ptr %0, align 8
8575  ret void
8576}
8577
8578; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8579define dso_local void @st_disjoint_align32_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
8580; CHECK-P10-LABEL: st_disjoint_align32_int8_t_uint64_t:
8581; CHECK-P10:       # %bb.0: # %entry
8582; CHECK-P10-NEXT:    lis r5, -15264
8583; CHECK-P10-NEXT:    and r3, r3, r5
8584; CHECK-P10-NEXT:    pstd r4, 999990000(r3), 0
8585; CHECK-P10-NEXT:    blr
8586;
8587; CHECK-PREP10-LABEL: st_disjoint_align32_int8_t_uint64_t:
8588; CHECK-PREP10:       # %bb.0: # %entry
8589; CHECK-PREP10-NEXT:    lis r5, -15264
8590; CHECK-PREP10-NEXT:    and r3, r3, r5
8591; CHECK-PREP10-NEXT:    lis r5, 15258
8592; CHECK-PREP10-NEXT:    ori r5, r5, 41712
8593; CHECK-PREP10-NEXT:    stdx r4, r3, r5
8594; CHECK-PREP10-NEXT:    blr
8595entry:
8596  %and = and i64 %ptr, -1000341504
8597  %conv = sext i8 %str to i64
8598  %or = or i64 %and, 999990000
8599  %0 = inttoptr i64 %or to ptr
8600  store i64 %conv, ptr %0, align 16
8601  ret void
8602}
8603
8604; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8605define dso_local void @st_not_disjoint64_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
8606; CHECK-P10-LABEL: st_not_disjoint64_int8_t_uint64_t:
8607; CHECK-P10:       # %bb.0: # %entry
8608; CHECK-P10-NEXT:    pli r5, 232
8609; CHECK-P10-NEXT:    pli r6, 3567587329
8610; CHECK-P10-NEXT:    rldimi r6, r5, 32, 0
8611; CHECK-P10-NEXT:    or r3, r3, r6
8612; CHECK-P10-NEXT:    std r4, 0(r3)
8613; CHECK-P10-NEXT:    blr
8614;
8615; CHECK-PREP10-LABEL: st_not_disjoint64_int8_t_uint64_t:
8616; CHECK-PREP10:       # %bb.0: # %entry
8617; CHECK-PREP10-NEXT:    li r5, 29
8618; CHECK-PREP10-NEXT:    rldic r5, r5, 35, 24
8619; CHECK-PREP10-NEXT:    oris r5, r5, 54437
8620; CHECK-PREP10-NEXT:    ori r5, r5, 4097
8621; CHECK-PREP10-NEXT:    or r3, r3, r5
8622; CHECK-PREP10-NEXT:    std r4, 0(r3)
8623; CHECK-PREP10-NEXT:    blr
8624entry:
8625  %conv = sext i8 %str to i64
8626  %or = or i64 %ptr, 1000000000001
8627  %0 = inttoptr i64 %or to ptr
8628  store i64 %conv, ptr %0, align 8
8629  ret void
8630}
8631
8632; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8633define dso_local void @st_disjoint_align64_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
8634; CHECK-P10-LABEL: st_disjoint_align64_int8_t_uint64_t:
8635; CHECK-P10:       # %bb.0: # %entry
8636; CHECK-P10-NEXT:    pli r5, 244140625
8637; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
8638; CHECK-P10-NEXT:    rldic r5, r5, 12, 24
8639; CHECK-P10-NEXT:    stdx r4, r3, r5
8640; CHECK-P10-NEXT:    blr
8641;
8642; CHECK-PREP10-LABEL: st_disjoint_align64_int8_t_uint64_t:
8643; CHECK-PREP10:       # %bb.0: # %entry
8644; CHECK-PREP10-NEXT:    lis r5, 3725
8645; CHECK-PREP10-NEXT:    rldicr r3, r3, 0, 23
8646; CHECK-PREP10-NEXT:    ori r5, r5, 19025
8647; CHECK-PREP10-NEXT:    rldic r5, r5, 12, 24
8648; CHECK-PREP10-NEXT:    stdx r4, r3, r5
8649; CHECK-PREP10-NEXT:    blr
8650entry:
8651  %and = and i64 %ptr, -1099511627776
8652  %conv = sext i8 %str to i64
8653  %or = or i64 %and, 1000000000000
8654  %0 = inttoptr i64 %or to ptr
8655  store i64 %conv, ptr %0, align 4096
8656  ret void
8657}
8658
8659; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8660define dso_local void @st_cst_align16_int8_t_uint64_t(i8 signext %str) {
8661; CHECK-LABEL: st_cst_align16_int8_t_uint64_t:
8662; CHECK:       # %bb.0: # %entry
8663; CHECK-NEXT:    std r3, 4080(0)
8664; CHECK-NEXT:    blr
8665entry:
8666  %conv = sext i8 %str to i64
8667  store i64 %conv, ptr inttoptr (i64 4080 to ptr), align 16
8668  ret void
8669}
8670
8671; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8672define dso_local void @st_cst_align32_int8_t_uint64_t(i8 signext %str) {
8673; CHECK-LABEL: st_cst_align32_int8_t_uint64_t:
8674; CHECK:       # %bb.0: # %entry
8675; CHECK-NEXT:    lis r4, 153
8676; CHECK-NEXT:    std r3, -27108(r4)
8677; CHECK-NEXT:    blr
8678entry:
8679  %conv = sext i8 %str to i64
8680  store i64 %conv, ptr inttoptr (i64 9999900 to ptr), align 8
8681  ret void
8682}
8683
8684; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8685define dso_local void @st_cst_align64_int8_t_uint64_t(i8 signext %str) {
8686; CHECK-P10-LABEL: st_cst_align64_int8_t_uint64_t:
8687; CHECK-P10:       # %bb.0: # %entry
8688; CHECK-P10-NEXT:    pli r4, 244140625
8689; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
8690; CHECK-P10-NEXT:    std r3, 0(r4)
8691; CHECK-P10-NEXT:    blr
8692;
8693; CHECK-PREP10-LABEL: st_cst_align64_int8_t_uint64_t:
8694; CHECK-PREP10:       # %bb.0: # %entry
8695; CHECK-PREP10-NEXT:    lis r4, 3725
8696; CHECK-PREP10-NEXT:    ori r4, r4, 19025
8697; CHECK-PREP10-NEXT:    rldic r4, r4, 12, 24
8698; CHECK-PREP10-NEXT:    std r3, 0(r4)
8699; CHECK-PREP10-NEXT:    blr
8700entry:
8701  %conv = sext i8 %str to i64
8702  store i64 %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
8703  ret void
8704}
8705
8706; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8707define dso_local void @st_0_int8_t_float(i64 %ptr, i8 signext %str) {
8708; CHECK-LABEL: st_0_int8_t_float:
8709; CHECK:       # %bb.0: # %entry
8710; CHECK-NEXT:    mtfprwa f0, r4
8711; CHECK-NEXT:    xscvsxdsp f0, f0
8712; CHECK-NEXT:    stfs f0, 0(r3)
8713; CHECK-NEXT:    blr
8714entry:
8715  %conv = sitofp i8 %str to float
8716  %0 = inttoptr i64 %ptr to ptr
8717  store float %conv, ptr %0, align 4
8718  ret void
8719}
8720
8721; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8722define dso_local void @st_align16_int8_t_float(ptr nocapture %ptr, i8 signext %str) {
8723; CHECK-LABEL: st_align16_int8_t_float:
8724; CHECK:       # %bb.0: # %entry
8725; CHECK-NEXT:    mtfprwa f0, r4
8726; CHECK-NEXT:    xscvsxdsp f0, f0
8727; CHECK-NEXT:    stfs f0, 8(r3)
8728; CHECK-NEXT:    blr
8729entry:
8730  %conv = sitofp i8 %str to float
8731  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
8732  store float %conv, ptr %add.ptr, align 4
8733  ret void
8734}
8735
8736; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8737define dso_local void @st_align32_int8_t_float(ptr nocapture %ptr, i8 signext %str) {
8738; CHECK-P10-LABEL: st_align32_int8_t_float:
8739; CHECK-P10:       # %bb.0: # %entry
8740; CHECK-P10-NEXT:    mtfprwa f0, r4
8741; CHECK-P10-NEXT:    xscvsxdsp f0, f0
8742; CHECK-P10-NEXT:    pstfs f0, 99999000(r3), 0
8743; CHECK-P10-NEXT:    blr
8744;
8745; CHECK-P9-LABEL: st_align32_int8_t_float:
8746; CHECK-P9:       # %bb.0: # %entry
8747; CHECK-P9-NEXT:    mtfprwa f0, r4
8748; CHECK-P9-NEXT:    lis r4, 1525
8749; CHECK-P9-NEXT:    xscvsxdsp f0, f0
8750; CHECK-P9-NEXT:    ori r4, r4, 56600
8751; CHECK-P9-NEXT:    stfsx f0, r3, r4
8752; CHECK-P9-NEXT:    blr
8753;
8754; CHECK-P8-LABEL: st_align32_int8_t_float:
8755; CHECK-P8:       # %bb.0: # %entry
8756; CHECK-P8-NEXT:    mtfprwa f0, r4
8757; CHECK-P8-NEXT:    lis r4, 1525
8758; CHECK-P8-NEXT:    ori r4, r4, 56600
8759; CHECK-P8-NEXT:    xscvsxdsp f0, f0
8760; CHECK-P8-NEXT:    stfsx f0, r3, r4
8761; CHECK-P8-NEXT:    blr
8762entry:
8763  %conv = sitofp i8 %str to float
8764  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
8765  store float %conv, ptr %add.ptr, align 4
8766  ret void
8767}
8768
8769; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8770define dso_local void @st_align64_int8_t_float(ptr nocapture %ptr, i8 signext %str) {
8771; CHECK-P10-LABEL: st_align64_int8_t_float:
8772; CHECK-P10:       # %bb.0: # %entry
8773; CHECK-P10-NEXT:    mtfprwa f0, r4
8774; CHECK-P10-NEXT:    pli r4, 244140625
8775; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
8776; CHECK-P10-NEXT:    xscvsxdsp f0, f0
8777; CHECK-P10-NEXT:    stfsx f0, r3, r4
8778; CHECK-P10-NEXT:    blr
8779;
8780; CHECK-P9-LABEL: st_align64_int8_t_float:
8781; CHECK-P9:       # %bb.0: # %entry
8782; CHECK-P9-NEXT:    mtfprwa f0, r4
8783; CHECK-P9-NEXT:    lis r4, 3725
8784; CHECK-P9-NEXT:    xscvsxdsp f0, f0
8785; CHECK-P9-NEXT:    ori r4, r4, 19025
8786; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
8787; CHECK-P9-NEXT:    stfsx f0, r3, r4
8788; CHECK-P9-NEXT:    blr
8789;
8790; CHECK-P8-LABEL: st_align64_int8_t_float:
8791; CHECK-P8:       # %bb.0: # %entry
8792; CHECK-P8-NEXT:    mtfprwa f0, r4
8793; CHECK-P8-NEXT:    lis r4, 3725
8794; CHECK-P8-NEXT:    ori r4, r4, 19025
8795; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
8796; CHECK-P8-NEXT:    xscvsxdsp f0, f0
8797; CHECK-P8-NEXT:    stfsx f0, r3, r4
8798; CHECK-P8-NEXT:    blr
8799entry:
8800  %conv = sitofp i8 %str to float
8801  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
8802  store float %conv, ptr %add.ptr, align 4
8803  ret void
8804}
8805
8806; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8807define dso_local void @st_reg_int8_t_float(ptr nocapture %ptr, i64 %off, i8 signext %str) {
8808; CHECK-LABEL: st_reg_int8_t_float:
8809; CHECK:       # %bb.0: # %entry
8810; CHECK-NEXT:    mtfprwa f0, r5
8811; CHECK-NEXT:    xscvsxdsp f0, f0
8812; CHECK-NEXT:    stfsx f0, r3, r4
8813; CHECK-NEXT:    blr
8814entry:
8815  %conv = sitofp i8 %str to float
8816  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
8817  store float %conv, ptr %add.ptr, align 4
8818  ret void
8819}
8820
8821; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8822define dso_local void @st_or1_int8_t_float(i64 %ptr, i8 zeroext %off, i8 signext %str) {
8823; CHECK-LABEL: st_or1_int8_t_float:
8824; CHECK:       # %bb.0: # %entry
8825; CHECK-NEXT:    mtfprwa f0, r5
8826; CHECK-NEXT:    or r3, r4, r3
8827; CHECK-NEXT:    xscvsxdsp f0, f0
8828; CHECK-NEXT:    stfs f0, 0(r3)
8829; CHECK-NEXT:    blr
8830entry:
8831  %conv = sitofp i8 %str to float
8832  %conv1 = zext i8 %off to i64
8833  %or = or i64 %conv1, %ptr
8834  %0 = inttoptr i64 %or to ptr
8835  store float %conv, ptr %0, align 4
8836  ret void
8837}
8838
8839; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8840define dso_local void @st_not_disjoint16_int8_t_float(i64 %ptr, i8 signext %str) {
8841; CHECK-LABEL: st_not_disjoint16_int8_t_float:
8842; CHECK:       # %bb.0: # %entry
8843; CHECK-NEXT:    mtfprwa f0, r4
8844; CHECK-NEXT:    ori r3, r3, 6
8845; CHECK-NEXT:    xscvsxdsp f0, f0
8846; CHECK-NEXT:    stfs f0, 0(r3)
8847; CHECK-NEXT:    blr
8848entry:
8849  %conv = sitofp i8 %str to float
8850  %or = or i64 %ptr, 6
8851  %0 = inttoptr i64 %or to ptr
8852  store float %conv, ptr %0, align 4
8853  ret void
8854}
8855
8856; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8857define dso_local void @st_disjoint_align16_int8_t_float(i64 %ptr, i8 signext %str) {
8858; CHECK-LABEL: st_disjoint_align16_int8_t_float:
8859; CHECK:       # %bb.0: # %entry
8860; CHECK-NEXT:    mtfprwa f0, r4
8861; CHECK-NEXT:    rldicr r3, r3, 0, 51
8862; CHECK-NEXT:    xscvsxdsp f0, f0
8863; CHECK-NEXT:    stfs f0, 24(r3)
8864; CHECK-NEXT:    blr
8865entry:
8866  %and = and i64 %ptr, -4096
8867  %conv = sitofp i8 %str to float
8868  %or = or i64 %and, 24
8869  %0 = inttoptr i64 %or to ptr
8870  store float %conv, ptr %0, align 8
8871  ret void
8872}
8873
8874; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8875define dso_local void @st_not_disjoint32_int8_t_float(i64 %ptr, i8 signext %str) {
8876; CHECK-P10-LABEL: st_not_disjoint32_int8_t_float:
8877; CHECK-P10:       # %bb.0: # %entry
8878; CHECK-P10-NEXT:    mtfprwa f0, r4
8879; CHECK-P10-NEXT:    ori r3, r3, 34463
8880; CHECK-P10-NEXT:    oris r3, r3, 1
8881; CHECK-P10-NEXT:    xscvsxdsp f0, f0
8882; CHECK-P10-NEXT:    stfs f0, 0(r3)
8883; CHECK-P10-NEXT:    blr
8884;
8885; CHECK-P9-LABEL: st_not_disjoint32_int8_t_float:
8886; CHECK-P9:       # %bb.0: # %entry
8887; CHECK-P9-NEXT:    mtfprwa f0, r4
8888; CHECK-P9-NEXT:    ori r3, r3, 34463
8889; CHECK-P9-NEXT:    xscvsxdsp f0, f0
8890; CHECK-P9-NEXT:    oris r3, r3, 1
8891; CHECK-P9-NEXT:    stfs f0, 0(r3)
8892; CHECK-P9-NEXT:    blr
8893;
8894; CHECK-P8-LABEL: st_not_disjoint32_int8_t_float:
8895; CHECK-P8:       # %bb.0: # %entry
8896; CHECK-P8-NEXT:    mtfprwa f0, r4
8897; CHECK-P8-NEXT:    ori r3, r3, 34463
8898; CHECK-P8-NEXT:    oris r3, r3, 1
8899; CHECK-P8-NEXT:    xscvsxdsp f0, f0
8900; CHECK-P8-NEXT:    stfs f0, 0(r3)
8901; CHECK-P8-NEXT:    blr
8902entry:
8903  %conv = sitofp i8 %str to float
8904  %or = or i64 %ptr, 99999
8905  %0 = inttoptr i64 %or to ptr
8906  store float %conv, ptr %0, align 4
8907  ret void
8908}
8909
8910; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8911define dso_local void @st_disjoint_align32_int8_t_float(i64 %ptr, i8 signext %str) {
8912; CHECK-P10-LABEL: st_disjoint_align32_int8_t_float:
8913; CHECK-P10:       # %bb.0: # %entry
8914; CHECK-P10-NEXT:    mtfprwa f0, r4
8915; CHECK-P10-NEXT:    lis r5, -15264
8916; CHECK-P10-NEXT:    and r3, r3, r5
8917; CHECK-P10-NEXT:    xscvsxdsp f0, f0
8918; CHECK-P10-NEXT:    pstfs f0, 999990000(r3), 0
8919; CHECK-P10-NEXT:    blr
8920;
8921; CHECK-P9-LABEL: st_disjoint_align32_int8_t_float:
8922; CHECK-P9:       # %bb.0: # %entry
8923; CHECK-P9-NEXT:    mtfprwa f0, r4
8924; CHECK-P9-NEXT:    lis r5, -15264
8925; CHECK-P9-NEXT:    lis r4, 15258
8926; CHECK-P9-NEXT:    xscvsxdsp f0, f0
8927; CHECK-P9-NEXT:    and r3, r3, r5
8928; CHECK-P9-NEXT:    ori r4, r4, 41712
8929; CHECK-P9-NEXT:    stfsx f0, r3, r4
8930; CHECK-P9-NEXT:    blr
8931;
8932; CHECK-P8-LABEL: st_disjoint_align32_int8_t_float:
8933; CHECK-P8:       # %bb.0: # %entry
8934; CHECK-P8-NEXT:    mtfprwa f0, r4
8935; CHECK-P8-NEXT:    lis r5, -15264
8936; CHECK-P8-NEXT:    lis r4, 15258
8937; CHECK-P8-NEXT:    and r3, r3, r5
8938; CHECK-P8-NEXT:    ori r4, r4, 41712
8939; CHECK-P8-NEXT:    xscvsxdsp f0, f0
8940; CHECK-P8-NEXT:    stfsx f0, r3, r4
8941; CHECK-P8-NEXT:    blr
8942entry:
8943  %and = and i64 %ptr, -1000341504
8944  %conv = sitofp i8 %str to float
8945  %or = or i64 %and, 999990000
8946  %0 = inttoptr i64 %or to ptr
8947  store float %conv, ptr %0, align 16
8948  ret void
8949}
8950
8951; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8952define dso_local void @st_not_disjoint64_int8_t_float(i64 %ptr, i8 signext %str) {
8953; CHECK-P10-LABEL: st_not_disjoint64_int8_t_float:
8954; CHECK-P10:       # %bb.0: # %entry
8955; CHECK-P10-NEXT:    mtfprwa f0, r4
8956; CHECK-P10-NEXT:    pli r4, 232
8957; CHECK-P10-NEXT:    pli r5, 3567587329
8958; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
8959; CHECK-P10-NEXT:    xscvsxdsp f0, f0
8960; CHECK-P10-NEXT:    or r3, r3, r5
8961; CHECK-P10-NEXT:    stfs f0, 0(r3)
8962; CHECK-P10-NEXT:    blr
8963;
8964; CHECK-P9-LABEL: st_not_disjoint64_int8_t_float:
8965; CHECK-P9:       # %bb.0: # %entry
8966; CHECK-P9-NEXT:    mtfprwa f0, r4
8967; CHECK-P9-NEXT:    li r4, 29
8968; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
8969; CHECK-P9-NEXT:    xscvsxdsp f0, f0
8970; CHECK-P9-NEXT:    oris r4, r4, 54437
8971; CHECK-P9-NEXT:    ori r4, r4, 4097
8972; CHECK-P9-NEXT:    or r3, r3, r4
8973; CHECK-P9-NEXT:    stfs f0, 0(r3)
8974; CHECK-P9-NEXT:    blr
8975;
8976; CHECK-P8-LABEL: st_not_disjoint64_int8_t_float:
8977; CHECK-P8:       # %bb.0: # %entry
8978; CHECK-P8-NEXT:    mtfprwa f0, r4
8979; CHECK-P8-NEXT:    li r4, 29
8980; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
8981; CHECK-P8-NEXT:    oris r4, r4, 54437
8982; CHECK-P8-NEXT:    xscvsxdsp f0, f0
8983; CHECK-P8-NEXT:    ori r4, r4, 4097
8984; CHECK-P8-NEXT:    or r3, r3, r4
8985; CHECK-P8-NEXT:    stfs f0, 0(r3)
8986; CHECK-P8-NEXT:    blr
8987entry:
8988  %conv = sitofp i8 %str to float
8989  %or = or i64 %ptr, 1000000000001
8990  %0 = inttoptr i64 %or to ptr
8991  store float %conv, ptr %0, align 4
8992  ret void
8993}
8994
8995; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
8996define dso_local void @st_disjoint_align64_int8_t_float(i64 %ptr, i8 signext %str) {
8997; CHECK-P10-LABEL: st_disjoint_align64_int8_t_float:
8998; CHECK-P10:       # %bb.0: # %entry
8999; CHECK-P10-NEXT:    mtfprwa f0, r4
9000; CHECK-P10-NEXT:    pli r4, 244140625
9001; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
9002; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
9003; CHECK-P10-NEXT:    xscvsxdsp f0, f0
9004; CHECK-P10-NEXT:    stfsx f0, r3, r4
9005; CHECK-P10-NEXT:    blr
9006;
9007; CHECK-P9-LABEL: st_disjoint_align64_int8_t_float:
9008; CHECK-P9:       # %bb.0: # %entry
9009; CHECK-P9-NEXT:    mtfprwa f0, r4
9010; CHECK-P9-NEXT:    lis r4, 3725
9011; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
9012; CHECK-P9-NEXT:    xscvsxdsp f0, f0
9013; CHECK-P9-NEXT:    ori r4, r4, 19025
9014; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
9015; CHECK-P9-NEXT:    stfsx f0, r3, r4
9016; CHECK-P9-NEXT:    blr
9017;
9018; CHECK-P8-LABEL: st_disjoint_align64_int8_t_float:
9019; CHECK-P8:       # %bb.0: # %entry
9020; CHECK-P8-NEXT:    mtfprwa f0, r4
9021; CHECK-P8-NEXT:    lis r4, 3725
9022; CHECK-P8-NEXT:    rldicr r3, r3, 0, 23
9023; CHECK-P8-NEXT:    ori r4, r4, 19025
9024; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
9025; CHECK-P8-NEXT:    xscvsxdsp f0, f0
9026; CHECK-P8-NEXT:    stfsx f0, r3, r4
9027; CHECK-P8-NEXT:    blr
9028entry:
9029  %and = and i64 %ptr, -1099511627776
9030  %conv = sitofp i8 %str to float
9031  %or = or i64 %and, 1000000000000
9032  %0 = inttoptr i64 %or to ptr
9033  store float %conv, ptr %0, align 4096
9034  ret void
9035}
9036
9037; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9038define dso_local void @st_cst_align16_int8_t_float(i8 signext %str) {
9039; CHECK-LABEL: st_cst_align16_int8_t_float:
9040; CHECK:       # %bb.0: # %entry
9041; CHECK-NEXT:    mtfprwa f0, r3
9042; CHECK-NEXT:    xscvsxdsp f0, f0
9043; CHECK-NEXT:    stfs f0, 4080(0)
9044; CHECK-NEXT:    blr
9045entry:
9046  %conv = sitofp i8 %str to float
9047  store float %conv, ptr inttoptr (i64 4080 to ptr), align 16
9048  ret void
9049}
9050
9051; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9052define dso_local void @st_cst_align32_int8_t_float(i8 signext %str) {
9053; CHECK-LABEL: st_cst_align32_int8_t_float:
9054; CHECK:       # %bb.0: # %entry
9055; CHECK-NEXT:    mtfprwa f0, r3
9056; CHECK-NEXT:    lis r3, 153
9057; CHECK-NEXT:    xscvsxdsp f0, f0
9058; CHECK-NEXT:    stfs f0, -27108(r3)
9059; CHECK-NEXT:    blr
9060entry:
9061  %conv = sitofp i8 %str to float
9062  store float %conv, ptr inttoptr (i64 9999900 to ptr), align 4
9063  ret void
9064}
9065
9066; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9067define dso_local void @st_cst_align64_int8_t_float(i8 signext %str) {
9068; CHECK-P10-LABEL: st_cst_align64_int8_t_float:
9069; CHECK-P10:       # %bb.0: # %entry
9070; CHECK-P10-NEXT:    mtfprwa f0, r3
9071; CHECK-P10-NEXT:    pli r3, 244140625
9072; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
9073; CHECK-P10-NEXT:    xscvsxdsp f0, f0
9074; CHECK-P10-NEXT:    stfs f0, 0(r3)
9075; CHECK-P10-NEXT:    blr
9076;
9077; CHECK-P9-LABEL: st_cst_align64_int8_t_float:
9078; CHECK-P9:       # %bb.0: # %entry
9079; CHECK-P9-NEXT:    mtfprwa f0, r3
9080; CHECK-P9-NEXT:    lis r3, 3725
9081; CHECK-P9-NEXT:    xscvsxdsp f0, f0
9082; CHECK-P9-NEXT:    ori r3, r3, 19025
9083; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
9084; CHECK-P9-NEXT:    stfs f0, 0(r3)
9085; CHECK-P9-NEXT:    blr
9086;
9087; CHECK-P8-LABEL: st_cst_align64_int8_t_float:
9088; CHECK-P8:       # %bb.0: # %entry
9089; CHECK-P8-NEXT:    mtfprwa f0, r3
9090; CHECK-P8-NEXT:    lis r3, 3725
9091; CHECK-P8-NEXT:    ori r3, r3, 19025
9092; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
9093; CHECK-P8-NEXT:    xscvsxdsp f0, f0
9094; CHECK-P8-NEXT:    stfs f0, 0(r3)
9095; CHECK-P8-NEXT:    blr
9096entry:
9097  %conv = sitofp i8 %str to float
9098  store float %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
9099  ret void
9100}
9101
9102; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9103define dso_local void @st_0_int8_t_double(i64 %ptr, i8 signext %str) {
9104; CHECK-LABEL: st_0_int8_t_double:
9105; CHECK:       # %bb.0: # %entry
9106; CHECK-NEXT:    mtfprwa f0, r4
9107; CHECK-NEXT:    xscvsxddp f0, f0
9108; CHECK-NEXT:    stfd f0, 0(r3)
9109; CHECK-NEXT:    blr
9110entry:
9111  %conv = sitofp i8 %str to double
9112  %0 = inttoptr i64 %ptr to ptr
9113  store double %conv, ptr %0, align 8
9114  ret void
9115}
9116
9117; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9118define dso_local void @st_align16_int8_t_double(ptr nocapture %ptr, i8 signext %str) {
9119; CHECK-LABEL: st_align16_int8_t_double:
9120; CHECK:       # %bb.0: # %entry
9121; CHECK-NEXT:    mtfprwa f0, r4
9122; CHECK-NEXT:    xscvsxddp f0, f0
9123; CHECK-NEXT:    stfd f0, 8(r3)
9124; CHECK-NEXT:    blr
9125entry:
9126  %conv = sitofp i8 %str to double
9127  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8
9128  store double %conv, ptr %add.ptr, align 8
9129  ret void
9130}
9131
9132; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9133define dso_local void @st_align32_int8_t_double(ptr nocapture %ptr, i8 signext %str) {
9134; CHECK-P10-LABEL: st_align32_int8_t_double:
9135; CHECK-P10:       # %bb.0: # %entry
9136; CHECK-P10-NEXT:    mtfprwa f0, r4
9137; CHECK-P10-NEXT:    xscvsxddp f0, f0
9138; CHECK-P10-NEXT:    pstfd f0, 99999000(r3), 0
9139; CHECK-P10-NEXT:    blr
9140;
9141; CHECK-P9-LABEL: st_align32_int8_t_double:
9142; CHECK-P9:       # %bb.0: # %entry
9143; CHECK-P9-NEXT:    mtfprwa f0, r4
9144; CHECK-P9-NEXT:    lis r4, 1525
9145; CHECK-P9-NEXT:    xscvsxddp f0, f0
9146; CHECK-P9-NEXT:    ori r4, r4, 56600
9147; CHECK-P9-NEXT:    stfdx f0, r3, r4
9148; CHECK-P9-NEXT:    blr
9149;
9150; CHECK-P8-LABEL: st_align32_int8_t_double:
9151; CHECK-P8:       # %bb.0: # %entry
9152; CHECK-P8-NEXT:    mtfprwa f0, r4
9153; CHECK-P8-NEXT:    lis r4, 1525
9154; CHECK-P8-NEXT:    ori r4, r4, 56600
9155; CHECK-P8-NEXT:    xscvsxddp f0, f0
9156; CHECK-P8-NEXT:    stfdx f0, r3, r4
9157; CHECK-P8-NEXT:    blr
9158entry:
9159  %conv = sitofp i8 %str to double
9160  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000
9161  store double %conv, ptr %add.ptr, align 8
9162  ret void
9163}
9164
9165; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9166define dso_local void @st_align64_int8_t_double(ptr nocapture %ptr, i8 signext %str) {
9167; CHECK-P10-LABEL: st_align64_int8_t_double:
9168; CHECK-P10:       # %bb.0: # %entry
9169; CHECK-P10-NEXT:    mtfprwa f0, r4
9170; CHECK-P10-NEXT:    pli r4, 244140625
9171; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
9172; CHECK-P10-NEXT:    xscvsxddp f0, f0
9173; CHECK-P10-NEXT:    stfdx f0, r3, r4
9174; CHECK-P10-NEXT:    blr
9175;
9176; CHECK-P9-LABEL: st_align64_int8_t_double:
9177; CHECK-P9:       # %bb.0: # %entry
9178; CHECK-P9-NEXT:    mtfprwa f0, r4
9179; CHECK-P9-NEXT:    lis r4, 3725
9180; CHECK-P9-NEXT:    xscvsxddp f0, f0
9181; CHECK-P9-NEXT:    ori r4, r4, 19025
9182; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
9183; CHECK-P9-NEXT:    stfdx f0, r3, r4
9184; CHECK-P9-NEXT:    blr
9185;
9186; CHECK-P8-LABEL: st_align64_int8_t_double:
9187; CHECK-P8:       # %bb.0: # %entry
9188; CHECK-P8-NEXT:    mtfprwa f0, r4
9189; CHECK-P8-NEXT:    lis r4, 3725
9190; CHECK-P8-NEXT:    ori r4, r4, 19025
9191; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
9192; CHECK-P8-NEXT:    xscvsxddp f0, f0
9193; CHECK-P8-NEXT:    stfdx f0, r3, r4
9194; CHECK-P8-NEXT:    blr
9195entry:
9196  %conv = sitofp i8 %str to double
9197  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000
9198  store double %conv, ptr %add.ptr, align 8
9199  ret void
9200}
9201
9202; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9203define dso_local void @st_reg_int8_t_double(ptr nocapture %ptr, i64 %off, i8 signext %str) {
9204; CHECK-LABEL: st_reg_int8_t_double:
9205; CHECK:       # %bb.0: # %entry
9206; CHECK-NEXT:    mtfprwa f0, r5
9207; CHECK-NEXT:    xscvsxddp f0, f0
9208; CHECK-NEXT:    stfdx f0, r3, r4
9209; CHECK-NEXT:    blr
9210entry:
9211  %conv = sitofp i8 %str to double
9212  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off
9213  store double %conv, ptr %add.ptr, align 8
9214  ret void
9215}
9216
9217; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9218define dso_local void @st_or1_int8_t_double(i64 %ptr, i8 zeroext %off, i8 signext %str) {
9219; CHECK-LABEL: st_or1_int8_t_double:
9220; CHECK:       # %bb.0: # %entry
9221; CHECK-NEXT:    mtfprwa f0, r5
9222; CHECK-NEXT:    or r3, r4, r3
9223; CHECK-NEXT:    xscvsxddp f0, f0
9224; CHECK-NEXT:    stfd f0, 0(r3)
9225; CHECK-NEXT:    blr
9226entry:
9227  %conv = sitofp i8 %str to double
9228  %conv1 = zext i8 %off to i64
9229  %or = or i64 %conv1, %ptr
9230  %0 = inttoptr i64 %or to ptr
9231  store double %conv, ptr %0, align 8
9232  ret void
9233}
9234
9235; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9236define dso_local void @st_not_disjoint16_int8_t_double(i64 %ptr, i8 signext %str) {
9237; CHECK-LABEL: st_not_disjoint16_int8_t_double:
9238; CHECK:       # %bb.0: # %entry
9239; CHECK-NEXT:    mtfprwa f0, r4
9240; CHECK-NEXT:    ori r3, r3, 6
9241; CHECK-NEXT:    xscvsxddp f0, f0
9242; CHECK-NEXT:    stfd f0, 0(r3)
9243; CHECK-NEXT:    blr
9244entry:
9245  %conv = sitofp i8 %str to double
9246  %or = or i64 %ptr, 6
9247  %0 = inttoptr i64 %or to ptr
9248  store double %conv, ptr %0, align 8
9249  ret void
9250}
9251
9252; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9253define dso_local void @st_disjoint_align16_int8_t_double(i64 %ptr, i8 signext %str) {
9254; CHECK-LABEL: st_disjoint_align16_int8_t_double:
9255; CHECK:       # %bb.0: # %entry
9256; CHECK-NEXT:    mtfprwa f0, r4
9257; CHECK-NEXT:    rldicr r3, r3, 0, 51
9258; CHECK-NEXT:    xscvsxddp f0, f0
9259; CHECK-NEXT:    stfd f0, 24(r3)
9260; CHECK-NEXT:    blr
9261entry:
9262  %and = and i64 %ptr, -4096
9263  %conv = sitofp i8 %str to double
9264  %or = or i64 %and, 24
9265  %0 = inttoptr i64 %or to ptr
9266  store double %conv, ptr %0, align 8
9267  ret void
9268}
9269
9270; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9271define dso_local void @st_not_disjoint32_int8_t_double(i64 %ptr, i8 signext %str) {
9272; CHECK-P10-LABEL: st_not_disjoint32_int8_t_double:
9273; CHECK-P10:       # %bb.0: # %entry
9274; CHECK-P10-NEXT:    mtfprwa f0, r4
9275; CHECK-P10-NEXT:    ori r3, r3, 34463
9276; CHECK-P10-NEXT:    oris r3, r3, 1
9277; CHECK-P10-NEXT:    xscvsxddp f0, f0
9278; CHECK-P10-NEXT:    stfd f0, 0(r3)
9279; CHECK-P10-NEXT:    blr
9280;
9281; CHECK-P9-LABEL: st_not_disjoint32_int8_t_double:
9282; CHECK-P9:       # %bb.0: # %entry
9283; CHECK-P9-NEXT:    mtfprwa f0, r4
9284; CHECK-P9-NEXT:    ori r3, r3, 34463
9285; CHECK-P9-NEXT:    xscvsxddp f0, f0
9286; CHECK-P9-NEXT:    oris r3, r3, 1
9287; CHECK-P9-NEXT:    stfd f0, 0(r3)
9288; CHECK-P9-NEXT:    blr
9289;
9290; CHECK-P8-LABEL: st_not_disjoint32_int8_t_double:
9291; CHECK-P8:       # %bb.0: # %entry
9292; CHECK-P8-NEXT:    mtfprwa f0, r4
9293; CHECK-P8-NEXT:    ori r3, r3, 34463
9294; CHECK-P8-NEXT:    oris r3, r3, 1
9295; CHECK-P8-NEXT:    xscvsxddp f0, f0
9296; CHECK-P8-NEXT:    stfd f0, 0(r3)
9297; CHECK-P8-NEXT:    blr
9298entry:
9299  %conv = sitofp i8 %str to double
9300  %or = or i64 %ptr, 99999
9301  %0 = inttoptr i64 %or to ptr
9302  store double %conv, ptr %0, align 8
9303  ret void
9304}
9305
9306; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9307define dso_local void @st_disjoint_align32_int8_t_double(i64 %ptr, i8 signext %str) {
9308; CHECK-P10-LABEL: st_disjoint_align32_int8_t_double:
9309; CHECK-P10:       # %bb.0: # %entry
9310; CHECK-P10-NEXT:    mtfprwa f0, r4
9311; CHECK-P10-NEXT:    lis r5, -15264
9312; CHECK-P10-NEXT:    and r3, r3, r5
9313; CHECK-P10-NEXT:    xscvsxddp f0, f0
9314; CHECK-P10-NEXT:    pstfd f0, 999990000(r3), 0
9315; CHECK-P10-NEXT:    blr
9316;
9317; CHECK-P9-LABEL: st_disjoint_align32_int8_t_double:
9318; CHECK-P9:       # %bb.0: # %entry
9319; CHECK-P9-NEXT:    mtfprwa f0, r4
9320; CHECK-P9-NEXT:    lis r5, -15264
9321; CHECK-P9-NEXT:    lis r4, 15258
9322; CHECK-P9-NEXT:    xscvsxddp f0, f0
9323; CHECK-P9-NEXT:    and r3, r3, r5
9324; CHECK-P9-NEXT:    ori r4, r4, 41712
9325; CHECK-P9-NEXT:    stfdx f0, r3, r4
9326; CHECK-P9-NEXT:    blr
9327;
9328; CHECK-P8-LABEL: st_disjoint_align32_int8_t_double:
9329; CHECK-P8:       # %bb.0: # %entry
9330; CHECK-P8-NEXT:    mtfprwa f0, r4
9331; CHECK-P8-NEXT:    lis r5, -15264
9332; CHECK-P8-NEXT:    lis r4, 15258
9333; CHECK-P8-NEXT:    and r3, r3, r5
9334; CHECK-P8-NEXT:    ori r4, r4, 41712
9335; CHECK-P8-NEXT:    xscvsxddp f0, f0
9336; CHECK-P8-NEXT:    stfdx f0, r3, r4
9337; CHECK-P8-NEXT:    blr
9338entry:
9339  %and = and i64 %ptr, -1000341504
9340  %conv = sitofp i8 %str to double
9341  %or = or i64 %and, 999990000
9342  %0 = inttoptr i64 %or to ptr
9343  store double %conv, ptr %0, align 16
9344  ret void
9345}
9346
9347; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9348define dso_local void @st_not_disjoint64_int8_t_double(i64 %ptr, i8 signext %str) {
9349; CHECK-P10-LABEL: st_not_disjoint64_int8_t_double:
9350; CHECK-P10:       # %bb.0: # %entry
9351; CHECK-P10-NEXT:    mtfprwa f0, r4
9352; CHECK-P10-NEXT:    pli r4, 232
9353; CHECK-P10-NEXT:    pli r5, 3567587329
9354; CHECK-P10-NEXT:    rldimi r5, r4, 32, 0
9355; CHECK-P10-NEXT:    xscvsxddp f0, f0
9356; CHECK-P10-NEXT:    or r3, r3, r5
9357; CHECK-P10-NEXT:    stfd f0, 0(r3)
9358; CHECK-P10-NEXT:    blr
9359;
9360; CHECK-P9-LABEL: st_not_disjoint64_int8_t_double:
9361; CHECK-P9:       # %bb.0: # %entry
9362; CHECK-P9-NEXT:    mtfprwa f0, r4
9363; CHECK-P9-NEXT:    li r4, 29
9364; CHECK-P9-NEXT:    rldic r4, r4, 35, 24
9365; CHECK-P9-NEXT:    xscvsxddp f0, f0
9366; CHECK-P9-NEXT:    oris r4, r4, 54437
9367; CHECK-P9-NEXT:    ori r4, r4, 4097
9368; CHECK-P9-NEXT:    or r3, r3, r4
9369; CHECK-P9-NEXT:    stfd f0, 0(r3)
9370; CHECK-P9-NEXT:    blr
9371;
9372; CHECK-P8-LABEL: st_not_disjoint64_int8_t_double:
9373; CHECK-P8:       # %bb.0: # %entry
9374; CHECK-P8-NEXT:    mtfprwa f0, r4
9375; CHECK-P8-NEXT:    li r4, 29
9376; CHECK-P8-NEXT:    rldic r4, r4, 35, 24
9377; CHECK-P8-NEXT:    oris r4, r4, 54437
9378; CHECK-P8-NEXT:    xscvsxddp f0, f0
9379; CHECK-P8-NEXT:    ori r4, r4, 4097
9380; CHECK-P8-NEXT:    or r3, r3, r4
9381; CHECK-P8-NEXT:    stfd f0, 0(r3)
9382; CHECK-P8-NEXT:    blr
9383entry:
9384  %conv = sitofp i8 %str to double
9385  %or = or i64 %ptr, 1000000000001
9386  %0 = inttoptr i64 %or to ptr
9387  store double %conv, ptr %0, align 8
9388  ret void
9389}
9390
9391; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9392define dso_local void @st_disjoint_align64_int8_t_double(i64 %ptr, i8 signext %str) {
9393; CHECK-P10-LABEL: st_disjoint_align64_int8_t_double:
9394; CHECK-P10:       # %bb.0: # %entry
9395; CHECK-P10-NEXT:    mtfprwa f0, r4
9396; CHECK-P10-NEXT:    pli r4, 244140625
9397; CHECK-P10-NEXT:    rldicr r3, r3, 0, 23
9398; CHECK-P10-NEXT:    rldic r4, r4, 12, 24
9399; CHECK-P10-NEXT:    xscvsxddp f0, f0
9400; CHECK-P10-NEXT:    stfdx f0, r3, r4
9401; CHECK-P10-NEXT:    blr
9402;
9403; CHECK-P9-LABEL: st_disjoint_align64_int8_t_double:
9404; CHECK-P9:       # %bb.0: # %entry
9405; CHECK-P9-NEXT:    mtfprwa f0, r4
9406; CHECK-P9-NEXT:    lis r4, 3725
9407; CHECK-P9-NEXT:    rldicr r3, r3, 0, 23
9408; CHECK-P9-NEXT:    xscvsxddp f0, f0
9409; CHECK-P9-NEXT:    ori r4, r4, 19025
9410; CHECK-P9-NEXT:    rldic r4, r4, 12, 24
9411; CHECK-P9-NEXT:    stfdx f0, r3, r4
9412; CHECK-P9-NEXT:    blr
9413;
9414; CHECK-P8-LABEL: st_disjoint_align64_int8_t_double:
9415; CHECK-P8:       # %bb.0: # %entry
9416; CHECK-P8-NEXT:    mtfprwa f0, r4
9417; CHECK-P8-NEXT:    lis r4, 3725
9418; CHECK-P8-NEXT:    rldicr r3, r3, 0, 23
9419; CHECK-P8-NEXT:    ori r4, r4, 19025
9420; CHECK-P8-NEXT:    rldic r4, r4, 12, 24
9421; CHECK-P8-NEXT:    xscvsxddp f0, f0
9422; CHECK-P8-NEXT:    stfdx f0, r3, r4
9423; CHECK-P8-NEXT:    blr
9424entry:
9425  %and = and i64 %ptr, -1099511627776
9426  %conv = sitofp i8 %str to double
9427  %or = or i64 %and, 1000000000000
9428  %0 = inttoptr i64 %or to ptr
9429  store double %conv, ptr %0, align 4096
9430  ret void
9431}
9432
9433; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9434define dso_local void @st_cst_align16_int8_t_double(i8 signext %str) {
9435; CHECK-LABEL: st_cst_align16_int8_t_double:
9436; CHECK:       # %bb.0: # %entry
9437; CHECK-NEXT:    mtfprwa f0, r3
9438; CHECK-NEXT:    xscvsxddp f0, f0
9439; CHECK-NEXT:    stfd f0, 4080(0)
9440; CHECK-NEXT:    blr
9441entry:
9442  %conv = sitofp i8 %str to double
9443  store double %conv, ptr inttoptr (i64 4080 to ptr), align 16
9444  ret void
9445}
9446
9447; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9448define dso_local void @st_cst_align32_int8_t_double(i8 signext %str) {
9449; CHECK-LABEL: st_cst_align32_int8_t_double:
9450; CHECK:       # %bb.0: # %entry
9451; CHECK-NEXT:    mtfprwa f0, r3
9452; CHECK-NEXT:    lis r3, 153
9453; CHECK-NEXT:    xscvsxddp f0, f0
9454; CHECK-NEXT:    stfd f0, -27108(r3)
9455; CHECK-NEXT:    blr
9456entry:
9457  %conv = sitofp i8 %str to double
9458  store double %conv, ptr inttoptr (i64 9999900 to ptr), align 8
9459  ret void
9460}
9461
9462; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
9463define dso_local void @st_cst_align64_int8_t_double(i8 signext %str) {
9464; CHECK-P10-LABEL: st_cst_align64_int8_t_double:
9465; CHECK-P10:       # %bb.0: # %entry
9466; CHECK-P10-NEXT:    mtfprwa f0, r3
9467; CHECK-P10-NEXT:    pli r3, 244140625
9468; CHECK-P10-NEXT:    rldic r3, r3, 12, 24
9469; CHECK-P10-NEXT:    xscvsxddp f0, f0
9470; CHECK-P10-NEXT:    stfd f0, 0(r3)
9471; CHECK-P10-NEXT:    blr
9472;
9473; CHECK-P9-LABEL: st_cst_align64_int8_t_double:
9474; CHECK-P9:       # %bb.0: # %entry
9475; CHECK-P9-NEXT:    mtfprwa f0, r3
9476; CHECK-P9-NEXT:    lis r3, 3725
9477; CHECK-P9-NEXT:    xscvsxddp f0, f0
9478; CHECK-P9-NEXT:    ori r3, r3, 19025
9479; CHECK-P9-NEXT:    rldic r3, r3, 12, 24
9480; CHECK-P9-NEXT:    stfd f0, 0(r3)
9481; CHECK-P9-NEXT:    blr
9482;
9483; CHECK-P8-LABEL: st_cst_align64_int8_t_double:
9484; CHECK-P8:       # %bb.0: # %entry
9485; CHECK-P8-NEXT:    mtfprwa f0, r3
9486; CHECK-P8-NEXT:    lis r3, 3725
9487; CHECK-P8-NEXT:    ori r3, r3, 19025
9488; CHECK-P8-NEXT:    rldic r3, r3, 12, 24
9489; CHECK-P8-NEXT:    xscvsxddp f0, f0
9490; CHECK-P8-NEXT:    stfd f0, 0(r3)
9491; CHECK-P8-NEXT:    blr
9492entry:
9493  %conv = sitofp i8 %str to double
9494  store double %conv, ptr inttoptr (i64 1000000000000 to ptr), align 4096
9495  ret void
9496}
9497