1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -relocation-model=pic -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \
3; RUN:   -ppc-vsr-nums-as-vr -verify-machineinstrs -ppc-asm-full-reg-names < %s \
4; RUN:   | FileCheck %s
5; RUN: llc -relocation-model=pic -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown \
6; RUN:   -ppc-vsr-nums-as-vr -verify-machineinstrs -ppc-asm-full-reg-names < %s \
7; RUN:   | FileCheck %s -check-prefix=CHECK-P8
8
9@mem = global [5 x i64] [i64 56, i64 63, i64 3, i64 5, i64 6], align 8
10@umem = global [5 x i64] [i64 560, i64 100, i64 34, i64 2, i64 5], align 8
11@swMem = global [5 x i32] [i32 5, i32 2, i32 3, i32 4, i32 0], align 4
12@uwMem = global [5 x i32] [i32 5, i32 2, i32 3, i32 4, i32 0], align 4
13@uhwMem = local_unnamed_addr global [5 x i16] [i16 5, i16 2, i16 3, i16 4, i16 0], align 2
14@ubMem = local_unnamed_addr global [5 x i8] c"\05\02\03\04\00", align 1
15
16; Function Attrs: norecurse nounwind
17define void @sdwConv2qp(fp128* nocapture %a, i64 %b) {
18; CHECK-LABEL: sdwConv2qp:
19; CHECK:       # %bb.0: # %entry
20; CHECK-NEXT:    mtvsrd v2, r4
21; CHECK-NEXT:    xscvsdqp v2, v2
22; CHECK-NEXT:    stxv v2, 0(r3)
23; CHECK-NEXT:    blr
24;
25; CHECK-P8-LABEL: sdwConv2qp:
26; CHECK-P8:       # %bb.0: # %entry
27; CHECK-P8-NEXT:    mflr r0
28; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
29; CHECK-P8-NEXT:    .cfi_offset lr, 16
30; CHECK-P8-NEXT:    .cfi_offset r30, -16
31; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
32; CHECK-P8-NEXT:    std r0, 16(r1)
33; CHECK-P8-NEXT:    stdu r1, -48(r1)
34; CHECK-P8-NEXT:    mr r30, r3
35; CHECK-P8-NEXT:    mr r3, r4
36; CHECK-P8-NEXT:    bl __floatdikf
37; CHECK-P8-NEXT:    nop
38; CHECK-P8-NEXT:    xxswapd vs0, v2
39; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
40; CHECK-P8-NEXT:    addi r1, r1, 48
41; CHECK-P8-NEXT:    ld r0, 16(r1)
42; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
43; CHECK-P8-NEXT:    mtlr r0
44; CHECK-P8-NEXT:    blr
45entry:
46  %conv = sitofp i64 %b to fp128
47  store fp128 %conv, fp128* %a, align 16
48  ret void
49
50}
51
52; Function Attrs: norecurse nounwind
53define void @sdwConv2qp_01(fp128* nocapture %a, i128 %b) {
54; CHECK-LABEL: sdwConv2qp_01:
55; CHECK:       # %bb.0: # %entry
56; CHECK-NEXT:    mflr r0
57; CHECK-NEXT:    .cfi_def_cfa_offset 48
58; CHECK-NEXT:    .cfi_offset lr, 16
59; CHECK-NEXT:    .cfi_offset r30, -16
60; CHECK-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
61; CHECK-NEXT:    std r0, 16(r1)
62; CHECK-NEXT:    stdu r1, -48(r1)
63; CHECK-NEXT:    mr r30, r3
64; CHECK-NEXT:    mr r3, r4
65; CHECK-NEXT:    mr r4, r5
66; CHECK-NEXT:    bl __floattikf
67; CHECK-NEXT:    nop
68; CHECK-NEXT:    stxv v2, 0(r30)
69; CHECK-NEXT:    addi r1, r1, 48
70; CHECK-NEXT:    ld r0, 16(r1)
71; CHECK-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
72; CHECK-NEXT:    mtlr r0
73; CHECK-NEXT:    blr
74;
75; CHECK-P8-LABEL: sdwConv2qp_01:
76; CHECK-P8:       # %bb.0: # %entry
77; CHECK-P8-NEXT:    mflr r0
78; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
79; CHECK-P8-NEXT:    .cfi_offset lr, 16
80; CHECK-P8-NEXT:    .cfi_offset r30, -16
81; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
82; CHECK-P8-NEXT:    std r0, 16(r1)
83; CHECK-P8-NEXT:    stdu r1, -48(r1)
84; CHECK-P8-NEXT:    mr r30, r3
85; CHECK-P8-NEXT:    mr r3, r4
86; CHECK-P8-NEXT:    mr r4, r5
87; CHECK-P8-NEXT:    bl __floattikf
88; CHECK-P8-NEXT:    nop
89; CHECK-P8-NEXT:    xxswapd vs0, v2
90; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
91; CHECK-P8-NEXT:    addi r1, r1, 48
92; CHECK-P8-NEXT:    ld r0, 16(r1)
93; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
94; CHECK-P8-NEXT:    mtlr r0
95; CHECK-P8-NEXT:    blr
96entry:
97  %conv = sitofp i128 %b to fp128
98  store fp128 %conv, fp128* %a, align 16
99  ret void
100
101}
102
103; Function Attrs: norecurse nounwind
104define void @sdwConv2qp_02(fp128* nocapture %a) {
105; CHECK-LABEL: sdwConv2qp_02:
106; CHECK:       # %bb.0: # %entry
107; CHECK-NEXT:    addis r4, r2, .LC0@toc@ha
108; CHECK-NEXT:    ld r4, .LC0@toc@l(r4)
109; CHECK-NEXT:    lxsd v2, 16(r4)
110; CHECK-NEXT:    xscvsdqp v2, v2
111; CHECK-NEXT:    stxv v2, 0(r3)
112; CHECK-NEXT:    blr
113;
114; CHECK-P8-LABEL: sdwConv2qp_02:
115; CHECK-P8:       # %bb.0: # %entry
116; CHECK-P8-NEXT:    mflr r0
117; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
118; CHECK-P8-NEXT:    .cfi_offset lr, 16
119; CHECK-P8-NEXT:    .cfi_offset r30, -16
120; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
121; CHECK-P8-NEXT:    std r0, 16(r1)
122; CHECK-P8-NEXT:    stdu r1, -48(r1)
123; CHECK-P8-NEXT:    addis r4, r2, .LC0@toc@ha
124; CHECK-P8-NEXT:    mr r30, r3
125; CHECK-P8-NEXT:    ld r4, .LC0@toc@l(r4)
126; CHECK-P8-NEXT:    ld r4, 16(r4)
127; CHECK-P8-NEXT:    mr r3, r4
128; CHECK-P8-NEXT:    bl __floatdikf
129; CHECK-P8-NEXT:    nop
130; CHECK-P8-NEXT:    xxswapd vs0, v2
131; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
132; CHECK-P8-NEXT:    addi r1, r1, 48
133; CHECK-P8-NEXT:    ld r0, 16(r1)
134; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
135; CHECK-P8-NEXT:    mtlr r0
136; CHECK-P8-NEXT:    blr
137entry:
138  %0 = load i64, i64* getelementptr inbounds
139                        ([5 x i64], [5 x i64]* @mem, i64 0, i64 2), align 8
140  %conv = sitofp i64 %0 to fp128
141  store fp128 %conv, fp128* %a, align 16
142  ret void
143
144}
145
146; Function Attrs: norecurse nounwind
147define void @sdwConv2qp_03(fp128* nocapture %a, i64* nocapture readonly %b) {
148; CHECK-LABEL: sdwConv2qp_03:
149; CHECK:       # %bb.0: # %entry
150; CHECK-NEXT:    lxsd v2, 0(r4)
151; CHECK-NEXT:    xscvsdqp v2, v2
152; CHECK-NEXT:    stxv v2, 0(r3)
153; CHECK-NEXT:    blr
154;
155; CHECK-P8-LABEL: sdwConv2qp_03:
156; CHECK-P8:       # %bb.0: # %entry
157; CHECK-P8-NEXT:    mflr r0
158; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
159; CHECK-P8-NEXT:    .cfi_offset lr, 16
160; CHECK-P8-NEXT:    .cfi_offset r30, -16
161; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
162; CHECK-P8-NEXT:    std r0, 16(r1)
163; CHECK-P8-NEXT:    stdu r1, -48(r1)
164; CHECK-P8-NEXT:    ld r4, 0(r4)
165; CHECK-P8-NEXT:    mr r30, r3
166; CHECK-P8-NEXT:    mr r3, r4
167; CHECK-P8-NEXT:    bl __floatdikf
168; CHECK-P8-NEXT:    nop
169; CHECK-P8-NEXT:    xxswapd vs0, v2
170; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
171; CHECK-P8-NEXT:    addi r1, r1, 48
172; CHECK-P8-NEXT:    ld r0, 16(r1)
173; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
174; CHECK-P8-NEXT:    mtlr r0
175; CHECK-P8-NEXT:    blr
176entry:
177  %0 = load i64, i64* %b, align 8
178  %conv = sitofp i64 %0 to fp128
179  store fp128 %conv, fp128* %a, align 16
180  ret void
181
182}
183
184; Function Attrs: norecurse nounwind
185define void @sdwConv2qp_04(fp128* nocapture %a, i1 %b) {
186; CHECK-LABEL: sdwConv2qp_04:
187; CHECK:       # %bb.0: # %entry
188; CHECK-NEXT:    andi. r4, r4, 1
189; CHECK-NEXT:    li r4, 0
190; CHECK-NEXT:    li r5, -1
191; CHECK-NEXT:    iselgt r4, r5, r4
192; CHECK-NEXT:    mtvsrwa v2, r4
193; CHECK-NEXT:    xscvsdqp v2, v2
194; CHECK-NEXT:    stxv v2, 0(r3)
195; CHECK-NEXT:    blr
196;
197; CHECK-P8-LABEL: sdwConv2qp_04:
198; CHECK-P8:       # %bb.0: # %entry
199; CHECK-P8-NEXT:    mflr r0
200; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
201; CHECK-P8-NEXT:    .cfi_offset lr, 16
202; CHECK-P8-NEXT:    .cfi_offset r30, -16
203; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
204; CHECK-P8-NEXT:    std r0, 16(r1)
205; CHECK-P8-NEXT:    stdu r1, -48(r1)
206; CHECK-P8-NEXT:    mr r30, r3
207; CHECK-P8-NEXT:    andi. r3, r4, 1
208; CHECK-P8-NEXT:    li r4, -1
209; CHECK-P8-NEXT:    li r3, 0
210; CHECK-P8-NEXT:    iselgt r3, r4, r3
211; CHECK-P8-NEXT:    bl __floatsikf
212; CHECK-P8-NEXT:    nop
213; CHECK-P8-NEXT:    xxswapd vs0, v2
214; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
215; CHECK-P8-NEXT:    addi r1, r1, 48
216; CHECK-P8-NEXT:    ld r0, 16(r1)
217; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
218; CHECK-P8-NEXT:    mtlr r0
219; CHECK-P8-NEXT:    blr
220entry:
221  %conv = sitofp i1 %b to fp128
222  store fp128 %conv, fp128* %a, align 16
223  ret void
224
225}
226
227; Function Attrs: norecurse nounwind
228define void @udwConv2qp(fp128* nocapture %a, i64 %b) {
229; CHECK-LABEL: udwConv2qp:
230; CHECK:       # %bb.0: # %entry
231; CHECK-NEXT:    mtvsrd v2, r4
232; CHECK-NEXT:    xscvudqp v2, v2
233; CHECK-NEXT:    stxv v2, 0(r3)
234; CHECK-NEXT:    blr
235;
236; CHECK-P8-LABEL: udwConv2qp:
237; CHECK-P8:       # %bb.0: # %entry
238; CHECK-P8-NEXT:    mflr r0
239; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
240; CHECK-P8-NEXT:    .cfi_offset lr, 16
241; CHECK-P8-NEXT:    .cfi_offset r30, -16
242; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
243; CHECK-P8-NEXT:    std r0, 16(r1)
244; CHECK-P8-NEXT:    stdu r1, -48(r1)
245; CHECK-P8-NEXT:    mr r30, r3
246; CHECK-P8-NEXT:    mr r3, r4
247; CHECK-P8-NEXT:    bl __floatundikf
248; CHECK-P8-NEXT:    nop
249; CHECK-P8-NEXT:    xxswapd vs0, v2
250; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
251; CHECK-P8-NEXT:    addi r1, r1, 48
252; CHECK-P8-NEXT:    ld r0, 16(r1)
253; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
254; CHECK-P8-NEXT:    mtlr r0
255; CHECK-P8-NEXT:    blr
256entry:
257  %conv = uitofp i64 %b to fp128
258  store fp128 %conv, fp128* %a, align 16
259  ret void
260
261}
262
263; Function Attrs: norecurse nounwind
264define void @udwConv2qp_01(fp128* nocapture %a, i128 %b) {
265; CHECK-LABEL: udwConv2qp_01:
266; CHECK:       # %bb.0: # %entry
267; CHECK-NEXT:    mflr r0
268; CHECK-NEXT:    .cfi_def_cfa_offset 48
269; CHECK-NEXT:    .cfi_offset lr, 16
270; CHECK-NEXT:    .cfi_offset r30, -16
271; CHECK-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
272; CHECK-NEXT:    std r0, 16(r1)
273; CHECK-NEXT:    stdu r1, -48(r1)
274; CHECK-NEXT:    mr r30, r3
275; CHECK-NEXT:    mr r3, r4
276; CHECK-NEXT:    mr r4, r5
277; CHECK-NEXT:    bl __floatuntikf
278; CHECK-NEXT:    nop
279; CHECK-NEXT:    stxv v2, 0(r30)
280; CHECK-NEXT:    addi r1, r1, 48
281; CHECK-NEXT:    ld r0, 16(r1)
282; CHECK-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
283; CHECK-NEXT:    mtlr r0
284; CHECK-NEXT:    blr
285;
286; CHECK-P8-LABEL: udwConv2qp_01:
287; CHECK-P8:       # %bb.0: # %entry
288; CHECK-P8-NEXT:    mflr r0
289; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
290; CHECK-P8-NEXT:    .cfi_offset lr, 16
291; CHECK-P8-NEXT:    .cfi_offset r30, -16
292; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
293; CHECK-P8-NEXT:    std r0, 16(r1)
294; CHECK-P8-NEXT:    stdu r1, -48(r1)
295; CHECK-P8-NEXT:    mr r30, r3
296; CHECK-P8-NEXT:    mr r3, r4
297; CHECK-P8-NEXT:    mr r4, r5
298; CHECK-P8-NEXT:    bl __floatuntikf
299; CHECK-P8-NEXT:    nop
300; CHECK-P8-NEXT:    xxswapd vs0, v2
301; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
302; CHECK-P8-NEXT:    addi r1, r1, 48
303; CHECK-P8-NEXT:    ld r0, 16(r1)
304; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
305; CHECK-P8-NEXT:    mtlr r0
306; CHECK-P8-NEXT:    blr
307entry:
308  %conv = uitofp i128 %b to fp128
309  store fp128 %conv, fp128* %a, align 16
310  ret void
311
312}
313
314; Function Attrs: norecurse nounwind
315define void @udwConv2qp_02(fp128* nocapture %a) {
316; CHECK-LABEL: udwConv2qp_02:
317; CHECK:       # %bb.0: # %entry
318; CHECK-NEXT:    addis r4, r2, .LC1@toc@ha
319; CHECK-NEXT:    ld r4, .LC1@toc@l(r4)
320; CHECK-NEXT:    lxsd v2, 32(r4)
321; CHECK-NEXT:    xscvudqp v2, v2
322; CHECK-NEXT:    stxv v2, 0(r3)
323; CHECK-NEXT:    blr
324;
325; CHECK-P8-LABEL: udwConv2qp_02:
326; CHECK-P8:       # %bb.0: # %entry
327; CHECK-P8-NEXT:    mflr r0
328; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
329; CHECK-P8-NEXT:    .cfi_offset lr, 16
330; CHECK-P8-NEXT:    .cfi_offset r30, -16
331; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
332; CHECK-P8-NEXT:    std r0, 16(r1)
333; CHECK-P8-NEXT:    stdu r1, -48(r1)
334; CHECK-P8-NEXT:    addis r4, r2, .LC1@toc@ha
335; CHECK-P8-NEXT:    mr r30, r3
336; CHECK-P8-NEXT:    ld r4, .LC1@toc@l(r4)
337; CHECK-P8-NEXT:    ld r4, 32(r4)
338; CHECK-P8-NEXT:    mr r3, r4
339; CHECK-P8-NEXT:    bl __floatundikf
340; CHECK-P8-NEXT:    nop
341; CHECK-P8-NEXT:    xxswapd vs0, v2
342; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
343; CHECK-P8-NEXT:    addi r1, r1, 48
344; CHECK-P8-NEXT:    ld r0, 16(r1)
345; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
346; CHECK-P8-NEXT:    mtlr r0
347; CHECK-P8-NEXT:    blr
348entry:
349  %0 = load i64, i64* getelementptr inbounds
350                        ([5 x i64], [5 x i64]* @umem, i64 0, i64 4), align 8
351  %conv = uitofp i64 %0 to fp128
352  store fp128 %conv, fp128* %a, align 16
353  ret void
354
355}
356
357; Function Attrs: norecurse nounwind
358define void @udwConv2qp_03(fp128* nocapture %a, i64* nocapture readonly %b) {
359; CHECK-LABEL: udwConv2qp_03:
360; CHECK:       # %bb.0: # %entry
361; CHECK-NEXT:    lxsd v2, 0(r4)
362; CHECK-NEXT:    xscvudqp v2, v2
363; CHECK-NEXT:    stxv v2, 0(r3)
364; CHECK-NEXT:    blr
365;
366; CHECK-P8-LABEL: udwConv2qp_03:
367; CHECK-P8:       # %bb.0: # %entry
368; CHECK-P8-NEXT:    mflr r0
369; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
370; CHECK-P8-NEXT:    .cfi_offset lr, 16
371; CHECK-P8-NEXT:    .cfi_offset r30, -16
372; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
373; CHECK-P8-NEXT:    std r0, 16(r1)
374; CHECK-P8-NEXT:    stdu r1, -48(r1)
375; CHECK-P8-NEXT:    ld r4, 0(r4)
376; CHECK-P8-NEXT:    mr r30, r3
377; CHECK-P8-NEXT:    mr r3, r4
378; CHECK-P8-NEXT:    bl __floatundikf
379; CHECK-P8-NEXT:    nop
380; CHECK-P8-NEXT:    xxswapd vs0, v2
381; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
382; CHECK-P8-NEXT:    addi r1, r1, 48
383; CHECK-P8-NEXT:    ld r0, 16(r1)
384; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
385; CHECK-P8-NEXT:    mtlr r0
386; CHECK-P8-NEXT:    blr
387entry:
388  %0 = load i64, i64* %b, align 8
389  %conv = uitofp i64 %0 to fp128
390  store fp128 %conv, fp128* %a, align 16
391  ret void
392
393}
394
395; Function Attrs: norecurse nounwind
396define void @udwConv2qp_04(fp128* nocapture %a, i1 %b) {
397; CHECK-LABEL: udwConv2qp_04:
398; CHECK:       # %bb.0: # %entry
399; CHECK-NEXT:    clrlwi r4, r4, 31
400; CHECK-NEXT:    mtvsrwa v2, r4
401; CHECK-NEXT:    xscvsdqp v2, v2
402; CHECK-NEXT:    stxv v2, 0(r3)
403; CHECK-NEXT:    blr
404;
405; CHECK-P8-LABEL: udwConv2qp_04:
406; CHECK-P8:       # %bb.0: # %entry
407; CHECK-P8-NEXT:    mflr r0
408; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
409; CHECK-P8-NEXT:    .cfi_offset lr, 16
410; CHECK-P8-NEXT:    .cfi_offset r30, -16
411; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
412; CHECK-P8-NEXT:    std r0, 16(r1)
413; CHECK-P8-NEXT:    stdu r1, -48(r1)
414; CHECK-P8-NEXT:    mr r30, r3
415; CHECK-P8-NEXT:    clrldi r3, r4, 63
416; CHECK-P8-NEXT:    bl __floatsikf
417; CHECK-P8-NEXT:    nop
418; CHECK-P8-NEXT:    xxswapd vs0, v2
419; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
420; CHECK-P8-NEXT:    addi r1, r1, 48
421; CHECK-P8-NEXT:    ld r0, 16(r1)
422; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
423; CHECK-P8-NEXT:    mtlr r0
424; CHECK-P8-NEXT:    blr
425entry:
426  %conv = uitofp i1 %b to fp128
427  store fp128 %conv, fp128* %a, align 16
428  ret void
429
430}
431
432; Function Attrs: norecurse nounwind
433define fp128* @sdwConv2qp_testXForm(fp128* returned %sink,
434; CHECK-LABEL: sdwConv2qp_testXForm:
435; CHECK:       # %bb.0: # %entry
436; CHECK-NEXT:    lis r5, 1
437; CHECK-NEXT:    ori r5, r5, 7797
438; CHECK-NEXT:    lxsdx v2, r4, r5
439; CHECK-NEXT:    xscvsdqp v2, v2
440; CHECK-NEXT:    stxv v2, 0(r3)
441; CHECK-NEXT:    blr
442;
443; CHECK-P8-LABEL: sdwConv2qp_testXForm:
444; CHECK-P8:       # %bb.0: # %entry
445; CHECK-P8-NEXT:    mflr r0
446; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
447; CHECK-P8-NEXT:    .cfi_offset lr, 16
448; CHECK-P8-NEXT:    .cfi_offset r30, -16
449; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
450; CHECK-P8-NEXT:    std r0, 16(r1)
451; CHECK-P8-NEXT:    stdu r1, -48(r1)
452; CHECK-P8-NEXT:    lis r5, 1
453; CHECK-P8-NEXT:    mr r30, r3
454; CHECK-P8-NEXT:    ori r5, r5, 7797
455; CHECK-P8-NEXT:    ldx r4, r4, r5
456; CHECK-P8-NEXT:    mr r3, r4
457; CHECK-P8-NEXT:    bl __floatdikf
458; CHECK-P8-NEXT:    nop
459; CHECK-P8-NEXT:    xxswapd vs0, v2
460; CHECK-P8-NEXT:    mr r3, r30
461; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
462; CHECK-P8-NEXT:    addi r1, r1, 48
463; CHECK-P8-NEXT:    ld r0, 16(r1)
464; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
465; CHECK-P8-NEXT:    mtlr r0
466; CHECK-P8-NEXT:    blr
467                                    i8* nocapture readonly %a) {
468entry:
469  %add.ptr = getelementptr inbounds i8, i8* %a, i64 73333
470  %0 = bitcast i8* %add.ptr to i64*
471  %1 = load i64, i64* %0, align 8
472  %conv = sitofp i64 %1 to fp128
473  store fp128 %conv, fp128* %sink, align 16
474  ret fp128* %sink
475
476}
477
478; Function Attrs: norecurse nounwind
479define fp128* @udwConv2qp_testXForm(fp128* returned %sink,
480; CHECK-LABEL: udwConv2qp_testXForm:
481; CHECK:       # %bb.0: # %entry
482; CHECK-NEXT:    lis r5, 1
483; CHECK-NEXT:    ori r5, r5, 7797
484; CHECK-NEXT:    lxsdx v2, r4, r5
485; CHECK-NEXT:    xscvudqp v2, v2
486; CHECK-NEXT:    stxv v2, 0(r3)
487; CHECK-NEXT:    blr
488;
489; CHECK-P8-LABEL: udwConv2qp_testXForm:
490; CHECK-P8:       # %bb.0: # %entry
491; CHECK-P8-NEXT:    mflr r0
492; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
493; CHECK-P8-NEXT:    .cfi_offset lr, 16
494; CHECK-P8-NEXT:    .cfi_offset r30, -16
495; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
496; CHECK-P8-NEXT:    std r0, 16(r1)
497; CHECK-P8-NEXT:    stdu r1, -48(r1)
498; CHECK-P8-NEXT:    lis r5, 1
499; CHECK-P8-NEXT:    mr r30, r3
500; CHECK-P8-NEXT:    ori r5, r5, 7797
501; CHECK-P8-NEXT:    ldx r4, r4, r5
502; CHECK-P8-NEXT:    mr r3, r4
503; CHECK-P8-NEXT:    bl __floatundikf
504; CHECK-P8-NEXT:    nop
505; CHECK-P8-NEXT:    xxswapd vs0, v2
506; CHECK-P8-NEXT:    mr r3, r30
507; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
508; CHECK-P8-NEXT:    addi r1, r1, 48
509; CHECK-P8-NEXT:    ld r0, 16(r1)
510; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
511; CHECK-P8-NEXT:    mtlr r0
512; CHECK-P8-NEXT:    blr
513                                    i8* nocapture readonly %a) {
514entry:
515  %add.ptr = getelementptr inbounds i8, i8* %a, i64 73333
516  %0 = bitcast i8* %add.ptr to i64*
517  %1 = load i64, i64* %0, align 8
518  %conv = uitofp i64 %1 to fp128
519  store fp128 %conv, fp128* %sink, align 16
520  ret fp128* %sink
521
522}
523
524; Function Attrs: norecurse nounwind
525define void @swConv2qp(fp128* nocapture %a, i32 signext %b) {
526; CHECK-LABEL: swConv2qp:
527; CHECK:       # %bb.0: # %entry
528; CHECK-NEXT:    mtvsrwa v2, r4
529; CHECK-NEXT:    xscvsdqp v2, v2
530; CHECK-NEXT:    stxv v2, 0(r3)
531; CHECK-NEXT:    blr
532;
533; CHECK-P8-LABEL: swConv2qp:
534; CHECK-P8:       # %bb.0: # %entry
535; CHECK-P8-NEXT:    mflr r0
536; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
537; CHECK-P8-NEXT:    .cfi_offset lr, 16
538; CHECK-P8-NEXT:    .cfi_offset r30, -16
539; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
540; CHECK-P8-NEXT:    std r0, 16(r1)
541; CHECK-P8-NEXT:    stdu r1, -48(r1)
542; CHECK-P8-NEXT:    mr r30, r3
543; CHECK-P8-NEXT:    mr r3, r4
544; CHECK-P8-NEXT:    bl __floatsikf
545; CHECK-P8-NEXT:    nop
546; CHECK-P8-NEXT:    xxswapd vs0, v2
547; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
548; CHECK-P8-NEXT:    addi r1, r1, 48
549; CHECK-P8-NEXT:    ld r0, 16(r1)
550; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
551; CHECK-P8-NEXT:    mtlr r0
552; CHECK-P8-NEXT:    blr
553entry:
554  %conv = sitofp i32 %b to fp128
555  store fp128 %conv, fp128* %a, align 16
556  ret void
557
558}
559
560; Function Attrs: norecurse nounwind
561define void @swConv2qp_02(fp128* nocapture %a, i32* nocapture readonly %b) {
562; CHECK-LABEL: swConv2qp_02:
563; CHECK:       # %bb.0: # %entry
564; CHECK-NEXT:    lxsiwax v2, 0, r4
565; CHECK-NEXT:    xscvsdqp v2, v2
566; CHECK-NEXT:    stxv v2, 0(r3)
567; CHECK-NEXT:    blr
568;
569; CHECK-P8-LABEL: swConv2qp_02:
570; CHECK-P8:       # %bb.0: # %entry
571; CHECK-P8-NEXT:    mflr r0
572; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
573; CHECK-P8-NEXT:    .cfi_offset lr, 16
574; CHECK-P8-NEXT:    .cfi_offset r30, -16
575; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
576; CHECK-P8-NEXT:    std r0, 16(r1)
577; CHECK-P8-NEXT:    stdu r1, -48(r1)
578; CHECK-P8-NEXT:    lwa r4, 0(r4)
579; CHECK-P8-NEXT:    mr r30, r3
580; CHECK-P8-NEXT:    mr r3, r4
581; CHECK-P8-NEXT:    bl __floatsikf
582; CHECK-P8-NEXT:    nop
583; CHECK-P8-NEXT:    xxswapd vs0, v2
584; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
585; CHECK-P8-NEXT:    addi r1, r1, 48
586; CHECK-P8-NEXT:    ld r0, 16(r1)
587; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
588; CHECK-P8-NEXT:    mtlr r0
589; CHECK-P8-NEXT:    blr
590entry:
591  %0 = load i32, i32* %b, align 4
592  %conv = sitofp i32 %0 to fp128
593  store fp128 %conv, fp128* %a, align 16
594  ret void
595
596}
597
598; Function Attrs: norecurse nounwind
599define void @swConv2qp_03(fp128* nocapture %a) {
600; CHECK-LABEL: swConv2qp_03:
601; CHECK:       # %bb.0: # %entry
602; CHECK-NEXT:    addis r4, r2, .LC2@toc@ha
603; CHECK-NEXT:    ld r4, .LC2@toc@l(r4)
604; CHECK-NEXT:    addi r4, r4, 12
605; CHECK-NEXT:    lxsiwax v2, 0, r4
606; CHECK-NEXT:    xscvsdqp v2, v2
607; CHECK-NEXT:    stxv v2, 0(r3)
608; CHECK-NEXT:    blr
609;
610; CHECK-P8-LABEL: swConv2qp_03:
611; CHECK-P8:       # %bb.0: # %entry
612; CHECK-P8-NEXT:    mflr r0
613; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
614; CHECK-P8-NEXT:    .cfi_offset lr, 16
615; CHECK-P8-NEXT:    .cfi_offset r30, -16
616; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
617; CHECK-P8-NEXT:    std r0, 16(r1)
618; CHECK-P8-NEXT:    stdu r1, -48(r1)
619; CHECK-P8-NEXT:    addis r4, r2, .LC2@toc@ha
620; CHECK-P8-NEXT:    mr r30, r3
621; CHECK-P8-NEXT:    ld r4, .LC2@toc@l(r4)
622; CHECK-P8-NEXT:    lwa r4, 12(r4)
623; CHECK-P8-NEXT:    mr r3, r4
624; CHECK-P8-NEXT:    bl __floatsikf
625; CHECK-P8-NEXT:    nop
626; CHECK-P8-NEXT:    xxswapd vs0, v2
627; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
628; CHECK-P8-NEXT:    addi r1, r1, 48
629; CHECK-P8-NEXT:    ld r0, 16(r1)
630; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
631; CHECK-P8-NEXT:    mtlr r0
632; CHECK-P8-NEXT:    blr
633entry:
634  %0 = load i32, i32* getelementptr inbounds
635                        ([5 x i32], [5 x i32]* @swMem, i64 0, i64 3), align 4
636  %conv = sitofp i32 %0 to fp128
637  store fp128 %conv, fp128* %a, align 16
638  ret void
639
640}
641
642; Function Attrs: norecurse nounwind
643define void @uwConv2qp(fp128* nocapture %a, i32 zeroext %b) {
644; CHECK-LABEL: uwConv2qp:
645; CHECK:       # %bb.0: # %entry
646; CHECK-NEXT:    mtvsrwz v2, r4
647; CHECK-NEXT:    xscvudqp v2, v2
648; CHECK-NEXT:    stxv v2, 0(r3)
649; CHECK-NEXT:    blr
650;
651; CHECK-P8-LABEL: uwConv2qp:
652; CHECK-P8:       # %bb.0: # %entry
653; CHECK-P8-NEXT:    mflr r0
654; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
655; CHECK-P8-NEXT:    .cfi_offset lr, 16
656; CHECK-P8-NEXT:    .cfi_offset r30, -16
657; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
658; CHECK-P8-NEXT:    std r0, 16(r1)
659; CHECK-P8-NEXT:    stdu r1, -48(r1)
660; CHECK-P8-NEXT:    mr r30, r3
661; CHECK-P8-NEXT:    mr r3, r4
662; CHECK-P8-NEXT:    bl __floatunsikf
663; CHECK-P8-NEXT:    nop
664; CHECK-P8-NEXT:    xxswapd vs0, v2
665; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
666; CHECK-P8-NEXT:    addi r1, r1, 48
667; CHECK-P8-NEXT:    ld r0, 16(r1)
668; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
669; CHECK-P8-NEXT:    mtlr r0
670; CHECK-P8-NEXT:    blr
671entry:
672  %conv = uitofp i32 %b to fp128
673  store fp128 %conv, fp128* %a, align 16
674  ret void
675
676}
677
678; Function Attrs: norecurse nounwind
679define void @uwConv2qp_02(fp128* nocapture %a, i32* nocapture readonly %b) {
680; CHECK-LABEL: uwConv2qp_02:
681; CHECK:       # %bb.0: # %entry
682; CHECK-NEXT:    lxsiwzx v2, 0, r4
683; CHECK-NEXT:    xscvudqp v2, v2
684; CHECK-NEXT:    stxv v2, 0(r3)
685; CHECK-NEXT:    blr
686;
687; CHECK-P8-LABEL: uwConv2qp_02:
688; CHECK-P8:       # %bb.0: # %entry
689; CHECK-P8-NEXT:    mflr r0
690; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
691; CHECK-P8-NEXT:    .cfi_offset lr, 16
692; CHECK-P8-NEXT:    .cfi_offset r30, -16
693; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
694; CHECK-P8-NEXT:    std r0, 16(r1)
695; CHECK-P8-NEXT:    stdu r1, -48(r1)
696; CHECK-P8-NEXT:    lwz r4, 0(r4)
697; CHECK-P8-NEXT:    mr r30, r3
698; CHECK-P8-NEXT:    mr r3, r4
699; CHECK-P8-NEXT:    bl __floatunsikf
700; CHECK-P8-NEXT:    nop
701; CHECK-P8-NEXT:    xxswapd vs0, v2
702; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
703; CHECK-P8-NEXT:    addi r1, r1, 48
704; CHECK-P8-NEXT:    ld r0, 16(r1)
705; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
706; CHECK-P8-NEXT:    mtlr r0
707; CHECK-P8-NEXT:    blr
708entry:
709  %0 = load i32, i32* %b, align 4
710  %conv = uitofp i32 %0 to fp128
711  store fp128 %conv, fp128* %a, align 16
712  ret void
713
714}
715
716; Function Attrs: norecurse nounwind
717define void @uwConv2qp_03(fp128* nocapture %a) {
718; CHECK-LABEL: uwConv2qp_03:
719; CHECK:       # %bb.0: # %entry
720; CHECK-NEXT:    addis r4, r2, .LC3@toc@ha
721; CHECK-NEXT:    ld r4, .LC3@toc@l(r4)
722; CHECK-NEXT:    addi r4, r4, 12
723; CHECK-NEXT:    lxsiwzx v2, 0, r4
724; CHECK-NEXT:    xscvudqp v2, v2
725; CHECK-NEXT:    stxv v2, 0(r3)
726; CHECK-NEXT:    blr
727;
728; CHECK-P8-LABEL: uwConv2qp_03:
729; CHECK-P8:       # %bb.0: # %entry
730; CHECK-P8-NEXT:    mflr r0
731; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
732; CHECK-P8-NEXT:    .cfi_offset lr, 16
733; CHECK-P8-NEXT:    .cfi_offset r30, -16
734; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
735; CHECK-P8-NEXT:    std r0, 16(r1)
736; CHECK-P8-NEXT:    stdu r1, -48(r1)
737; CHECK-P8-NEXT:    addis r4, r2, .LC3@toc@ha
738; CHECK-P8-NEXT:    mr r30, r3
739; CHECK-P8-NEXT:    ld r4, .LC3@toc@l(r4)
740; CHECK-P8-NEXT:    lwz r4, 12(r4)
741; CHECK-P8-NEXT:    mr r3, r4
742; CHECK-P8-NEXT:    bl __floatunsikf
743; CHECK-P8-NEXT:    nop
744; CHECK-P8-NEXT:    xxswapd vs0, v2
745; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
746; CHECK-P8-NEXT:    addi r1, r1, 48
747; CHECK-P8-NEXT:    ld r0, 16(r1)
748; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
749; CHECK-P8-NEXT:    mtlr r0
750; CHECK-P8-NEXT:    blr
751entry:
752  %0 = load i32, i32* getelementptr inbounds
753                        ([5 x i32], [5 x i32]* @uwMem, i64 0, i64 3), align 4
754  %conv = uitofp i32 %0 to fp128
755  store fp128 %conv, fp128* %a, align 16
756  ret void
757
758}
759
760; Function Attrs: norecurse nounwind
761define void @uwConv2qp_04(fp128* nocapture %a,
762; CHECK-LABEL: uwConv2qp_04:
763; CHECK:       # %bb.0: # %entry
764; CHECK-NEXT:    lwz r5, 0(r5)
765; CHECK-NEXT:    add r4, r5, r4
766; CHECK-NEXT:    mtvsrwz v2, r4
767; CHECK-NEXT:    xscvudqp v2, v2
768; CHECK-NEXT:    stxv v2, 0(r3)
769; CHECK-NEXT:    blr
770;
771; CHECK-P8-LABEL: uwConv2qp_04:
772; CHECK-P8:       # %bb.0: # %entry
773; CHECK-P8-NEXT:    mflr r0
774; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
775; CHECK-P8-NEXT:    .cfi_offset lr, 16
776; CHECK-P8-NEXT:    .cfi_offset r30, -16
777; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
778; CHECK-P8-NEXT:    std r0, 16(r1)
779; CHECK-P8-NEXT:    stdu r1, -48(r1)
780; CHECK-P8-NEXT:    mr r30, r3
781; CHECK-P8-NEXT:    lwz r3, 0(r5)
782; CHECK-P8-NEXT:    add r3, r3, r4
783; CHECK-P8-NEXT:    clrldi r3, r3, 32
784; CHECK-P8-NEXT:    bl __floatunsikf
785; CHECK-P8-NEXT:    nop
786; CHECK-P8-NEXT:    xxswapd vs0, v2
787; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
788; CHECK-P8-NEXT:    addi r1, r1, 48
789; CHECK-P8-NEXT:    ld r0, 16(r1)
790; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
791; CHECK-P8-NEXT:    mtlr r0
792; CHECK-P8-NEXT:    blr
793                          i32 zeroext %b, i32* nocapture readonly %c) {
794entry:
795  %0 = load i32, i32* %c, align 4
796  %add = add i32 %0, %b
797  %conv = uitofp i32 %add to fp128
798  store fp128 %conv, fp128* %a, align 16
799  ret void
800
801}
802
803; Function Attrs: norecurse nounwind
804define void @uhwConv2qp(fp128* nocapture %a, i16 zeroext %b) {
805; CHECK-LABEL: uhwConv2qp:
806; CHECK:       # %bb.0: # %entry
807; CHECK-NEXT:    mtvsrwz v2, r4
808; CHECK-NEXT:    xscvudqp v2, v2
809; CHECK-NEXT:    stxv v2, 0(r3)
810; CHECK-NEXT:    blr
811;
812; CHECK-P8-LABEL: uhwConv2qp:
813; CHECK-P8:       # %bb.0: # %entry
814; CHECK-P8-NEXT:    mflr r0
815; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
816; CHECK-P8-NEXT:    .cfi_offset lr, 16
817; CHECK-P8-NEXT:    .cfi_offset r30, -16
818; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
819; CHECK-P8-NEXT:    std r0, 16(r1)
820; CHECK-P8-NEXT:    stdu r1, -48(r1)
821; CHECK-P8-NEXT:    mr r30, r3
822; CHECK-P8-NEXT:    mr r3, r4
823; CHECK-P8-NEXT:    bl __floatunsikf
824; CHECK-P8-NEXT:    nop
825; CHECK-P8-NEXT:    xxswapd vs0, v2
826; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
827; CHECK-P8-NEXT:    addi r1, r1, 48
828; CHECK-P8-NEXT:    ld r0, 16(r1)
829; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
830; CHECK-P8-NEXT:    mtlr r0
831; CHECK-P8-NEXT:    blr
832entry:
833  %conv = uitofp i16 %b to fp128
834  store fp128 %conv, fp128* %a, align 16
835  ret void
836
837
838}
839
840; Function Attrs: norecurse nounwind
841define void @uhwConv2qp_02(fp128* nocapture %a, i16* nocapture readonly %b) {
842; CHECK-LABEL: uhwConv2qp_02:
843; CHECK:       # %bb.0: # %entry
844; CHECK-NEXT:    lxsihzx v2, 0, r4
845; CHECK-NEXT:    xscvudqp v2, v2
846; CHECK-NEXT:    stxv v2, 0(r3)
847; CHECK-NEXT:    blr
848;
849; CHECK-P8-LABEL: uhwConv2qp_02:
850; CHECK-P8:       # %bb.0: # %entry
851; CHECK-P8-NEXT:    mflr r0
852; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
853; CHECK-P8-NEXT:    .cfi_offset lr, 16
854; CHECK-P8-NEXT:    .cfi_offset r30, -16
855; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
856; CHECK-P8-NEXT:    std r0, 16(r1)
857; CHECK-P8-NEXT:    stdu r1, -48(r1)
858; CHECK-P8-NEXT:    lhz r4, 0(r4)
859; CHECK-P8-NEXT:    mr r30, r3
860; CHECK-P8-NEXT:    mr r3, r4
861; CHECK-P8-NEXT:    bl __floatunsikf
862; CHECK-P8-NEXT:    nop
863; CHECK-P8-NEXT:    xxswapd vs0, v2
864; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
865; CHECK-P8-NEXT:    addi r1, r1, 48
866; CHECK-P8-NEXT:    ld r0, 16(r1)
867; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
868; CHECK-P8-NEXT:    mtlr r0
869; CHECK-P8-NEXT:    blr
870entry:
871  %0 = load i16, i16* %b, align 2
872  %conv = uitofp i16 %0 to fp128
873  store fp128 %conv, fp128* %a, align 16
874  ret void
875
876}
877
878; Function Attrs: norecurse nounwind
879define void @uhwConv2qp_03(fp128* nocapture %a) {
880; CHECK-LABEL: uhwConv2qp_03:
881; CHECK:       # %bb.0: # %entry
882; CHECK-NEXT:    addis r4, r2, .LC4@toc@ha
883; CHECK-NEXT:    ld r4, .LC4@toc@l(r4)
884; CHECK-NEXT:    addi r4, r4, 6
885; CHECK-NEXT:    lxsihzx v2, 0, r4
886; CHECK-NEXT:    xscvudqp v2, v2
887; CHECK-NEXT:    stxv v2, 0(r3)
888; CHECK-NEXT:    blr
889;
890; CHECK-P8-LABEL: uhwConv2qp_03:
891; CHECK-P8:       # %bb.0: # %entry
892; CHECK-P8-NEXT:    mflr r0
893; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
894; CHECK-P8-NEXT:    .cfi_offset lr, 16
895; CHECK-P8-NEXT:    .cfi_offset r30, -16
896; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
897; CHECK-P8-NEXT:    std r0, 16(r1)
898; CHECK-P8-NEXT:    stdu r1, -48(r1)
899; CHECK-P8-NEXT:    addis r4, r2, .LC4@toc@ha
900; CHECK-P8-NEXT:    mr r30, r3
901; CHECK-P8-NEXT:    ld r4, .LC4@toc@l(r4)
902; CHECK-P8-NEXT:    lhz r4, 6(r4)
903; CHECK-P8-NEXT:    mr r3, r4
904; CHECK-P8-NEXT:    bl __floatunsikf
905; CHECK-P8-NEXT:    nop
906; CHECK-P8-NEXT:    xxswapd vs0, v2
907; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
908; CHECK-P8-NEXT:    addi r1, r1, 48
909; CHECK-P8-NEXT:    ld r0, 16(r1)
910; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
911; CHECK-P8-NEXT:    mtlr r0
912; CHECK-P8-NEXT:    blr
913entry:
914  %0 = load i16, i16* getelementptr inbounds
915                        ([5 x i16], [5 x i16]* @uhwMem, i64 0, i64 3), align 2
916  %conv = uitofp i16 %0 to fp128
917  store fp128 %conv, fp128* %a, align 16
918  ret void
919
920}
921
922; Function Attrs: norecurse nounwind
923define void @uhwConv2qp_04(fp128* nocapture %a, i16 zeroext %b,
924; CHECK-LABEL: uhwConv2qp_04:
925; CHECK:       # %bb.0: # %entry
926; CHECK-NEXT:    lhz r5, 0(r5)
927; CHECK-NEXT:    add r4, r5, r4
928; CHECK-NEXT:    mtvsrwa v2, r4
929; CHECK-NEXT:    xscvsdqp v2, v2
930; CHECK-NEXT:    stxv v2, 0(r3)
931; CHECK-NEXT:    blr
932;
933; CHECK-P8-LABEL: uhwConv2qp_04:
934; CHECK-P8:       # %bb.0: # %entry
935; CHECK-P8-NEXT:    mflr r0
936; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
937; CHECK-P8-NEXT:    .cfi_offset lr, 16
938; CHECK-P8-NEXT:    .cfi_offset r30, -16
939; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
940; CHECK-P8-NEXT:    std r0, 16(r1)
941; CHECK-P8-NEXT:    stdu r1, -48(r1)
942; CHECK-P8-NEXT:    mr r30, r3
943; CHECK-P8-NEXT:    lhz r3, 0(r5)
944; CHECK-P8-NEXT:    add r3, r3, r4
945; CHECK-P8-NEXT:    clrldi r3, r3, 32
946; CHECK-P8-NEXT:    bl __floatsikf
947; CHECK-P8-NEXT:    nop
948; CHECK-P8-NEXT:    xxswapd vs0, v2
949; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
950; CHECK-P8-NEXT:    addi r1, r1, 48
951; CHECK-P8-NEXT:    ld r0, 16(r1)
952; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
953; CHECK-P8-NEXT:    mtlr r0
954; CHECK-P8-NEXT:    blr
955                           i16* nocapture readonly %c) {
956entry:
957  %conv = zext i16 %b to i32
958  %0 = load i16, i16* %c, align 2
959  %conv1 = zext i16 %0 to i32
960  %add = add nuw nsw i32 %conv1, %conv
961  %conv2 = sitofp i32 %add to fp128
962  store fp128 %conv2, fp128* %a, align 16
963  ret void
964
965}
966
967; Function Attrs: norecurse nounwind
968define void @ubConv2qp(fp128* nocapture %a, i8 zeroext %b) {
969; CHECK-LABEL: ubConv2qp:
970; CHECK:       # %bb.0: # %entry
971; CHECK-NEXT:    mtvsrwz v2, r4
972; CHECK-NEXT:    xscvudqp v2, v2
973; CHECK-NEXT:    stxv v2, 0(r3)
974; CHECK-NEXT:    blr
975;
976; CHECK-P8-LABEL: ubConv2qp:
977; CHECK-P8:       # %bb.0: # %entry
978; CHECK-P8-NEXT:    mflr r0
979; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
980; CHECK-P8-NEXT:    .cfi_offset lr, 16
981; CHECK-P8-NEXT:    .cfi_offset r30, -16
982; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
983; CHECK-P8-NEXT:    std r0, 16(r1)
984; CHECK-P8-NEXT:    stdu r1, -48(r1)
985; CHECK-P8-NEXT:    mr r30, r3
986; CHECK-P8-NEXT:    mr r3, r4
987; CHECK-P8-NEXT:    bl __floatunsikf
988; CHECK-P8-NEXT:    nop
989; CHECK-P8-NEXT:    xxswapd vs0, v2
990; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
991; CHECK-P8-NEXT:    addi r1, r1, 48
992; CHECK-P8-NEXT:    ld r0, 16(r1)
993; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
994; CHECK-P8-NEXT:    mtlr r0
995; CHECK-P8-NEXT:    blr
996entry:
997  %conv = uitofp i8 %b to fp128
998  store fp128 %conv, fp128* %a, align 16
999  ret void
1000
1001}
1002
1003; Function Attrs: norecurse nounwind
1004define void @ubConv2qp_02(fp128* nocapture %a, i8* nocapture readonly %b) {
1005; CHECK-LABEL: ubConv2qp_02:
1006; CHECK:       # %bb.0: # %entry
1007; CHECK-NEXT:    lxsibzx v2, 0, r4
1008; CHECK-NEXT:    xscvudqp v2, v2
1009; CHECK-NEXT:    stxv v2, 0(r3)
1010; CHECK-NEXT:    blr
1011;
1012; CHECK-P8-LABEL: ubConv2qp_02:
1013; CHECK-P8:       # %bb.0: # %entry
1014; CHECK-P8-NEXT:    mflr r0
1015; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1016; CHECK-P8-NEXT:    .cfi_offset lr, 16
1017; CHECK-P8-NEXT:    .cfi_offset r30, -16
1018; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1019; CHECK-P8-NEXT:    std r0, 16(r1)
1020; CHECK-P8-NEXT:    stdu r1, -48(r1)
1021; CHECK-P8-NEXT:    lbz r4, 0(r4)
1022; CHECK-P8-NEXT:    mr r30, r3
1023; CHECK-P8-NEXT:    mr r3, r4
1024; CHECK-P8-NEXT:    bl __floatunsikf
1025; CHECK-P8-NEXT:    nop
1026; CHECK-P8-NEXT:    xxswapd vs0, v2
1027; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
1028; CHECK-P8-NEXT:    addi r1, r1, 48
1029; CHECK-P8-NEXT:    ld r0, 16(r1)
1030; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1031; CHECK-P8-NEXT:    mtlr r0
1032; CHECK-P8-NEXT:    blr
1033entry:
1034  %0 = load i8, i8* %b, align 1
1035  %conv = uitofp i8 %0 to fp128
1036  store fp128 %conv, fp128* %a, align 16
1037  ret void
1038
1039}
1040
1041; Function Attrs: norecurse nounwind
1042define void @ubConv2qp_03(fp128* nocapture %a) {
1043; CHECK-LABEL: ubConv2qp_03:
1044; CHECK:       # %bb.0: # %entry
1045; CHECK-NEXT:    addis r4, r2, .LC5@toc@ha
1046; CHECK-NEXT:    ld r4, .LC5@toc@l(r4)
1047; CHECK-NEXT:    addi r4, r4, 2
1048; CHECK-NEXT:    lxsibzx v2, 0, r4
1049; CHECK-NEXT:    xscvudqp v2, v2
1050; CHECK-NEXT:    stxv v2, 0(r3)
1051; CHECK-NEXT:    blr
1052;
1053; CHECK-P8-LABEL: ubConv2qp_03:
1054; CHECK-P8:       # %bb.0: # %entry
1055; CHECK-P8-NEXT:    mflr r0
1056; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1057; CHECK-P8-NEXT:    .cfi_offset lr, 16
1058; CHECK-P8-NEXT:    .cfi_offset r30, -16
1059; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1060; CHECK-P8-NEXT:    std r0, 16(r1)
1061; CHECK-P8-NEXT:    stdu r1, -48(r1)
1062; CHECK-P8-NEXT:    addis r4, r2, .LC5@toc@ha
1063; CHECK-P8-NEXT:    mr r30, r3
1064; CHECK-P8-NEXT:    ld r4, .LC5@toc@l(r4)
1065; CHECK-P8-NEXT:    lbz r4, 2(r4)
1066; CHECK-P8-NEXT:    mr r3, r4
1067; CHECK-P8-NEXT:    bl __floatunsikf
1068; CHECK-P8-NEXT:    nop
1069; CHECK-P8-NEXT:    xxswapd vs0, v2
1070; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
1071; CHECK-P8-NEXT:    addi r1, r1, 48
1072; CHECK-P8-NEXT:    ld r0, 16(r1)
1073; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1074; CHECK-P8-NEXT:    mtlr r0
1075; CHECK-P8-NEXT:    blr
1076entry:
1077  %0 = load i8, i8* getelementptr inbounds
1078                      ([5 x i8], [5 x i8]* @ubMem, i64 0, i64 2), align 1
1079  %conv = uitofp i8 %0 to fp128
1080  store fp128 %conv, fp128* %a, align 16
1081  ret void
1082
1083}
1084
1085; Function Attrs: norecurse nounwind
1086define void @ubConv2qp_04(fp128* nocapture %a, i8 zeroext %b,
1087; CHECK-LABEL: ubConv2qp_04:
1088; CHECK:       # %bb.0: # %entry
1089; CHECK-NEXT:    lbz r5, 0(r5)
1090; CHECK-NEXT:    add r4, r5, r4
1091; CHECK-NEXT:    mtvsrwa v2, r4
1092; CHECK-NEXT:    xscvsdqp v2, v2
1093; CHECK-NEXT:    stxv v2, 0(r3)
1094; CHECK-NEXT:    blr
1095;
1096; CHECK-P8-LABEL: ubConv2qp_04:
1097; CHECK-P8:       # %bb.0: # %entry
1098; CHECK-P8-NEXT:    mflr r0
1099; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1100; CHECK-P8-NEXT:    .cfi_offset lr, 16
1101; CHECK-P8-NEXT:    .cfi_offset r30, -16
1102; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1103; CHECK-P8-NEXT:    std r0, 16(r1)
1104; CHECK-P8-NEXT:    stdu r1, -48(r1)
1105; CHECK-P8-NEXT:    mr r30, r3
1106; CHECK-P8-NEXT:    lbz r3, 0(r5)
1107; CHECK-P8-NEXT:    add r3, r3, r4
1108; CHECK-P8-NEXT:    clrldi r3, r3, 32
1109; CHECK-P8-NEXT:    bl __floatsikf
1110; CHECK-P8-NEXT:    nop
1111; CHECK-P8-NEXT:    xxswapd vs0, v2
1112; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
1113; CHECK-P8-NEXT:    addi r1, r1, 48
1114; CHECK-P8-NEXT:    ld r0, 16(r1)
1115; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1116; CHECK-P8-NEXT:    mtlr r0
1117; CHECK-P8-NEXT:    blr
1118                          i8* nocapture readonly %c) {
1119entry:
1120  %conv = zext i8 %b to i32
1121  %0 = load i8, i8* %c, align 1
1122  %conv1 = zext i8 %0 to i32
1123  %add = add nuw nsw i32 %conv1, %conv
1124  %conv2 = sitofp i32 %add to fp128
1125  store fp128 %conv2, fp128* %a, align 16
1126  ret void
1127
1128}
1129
1130;  Convert QP to DP
1131
1132@f128Array = global [4 x fp128]
1133                      [fp128 0xL00000000000000004004C00000000000,
1134                       fp128 0xLF000000000000000400808AB851EB851,
1135                       fp128 0xL5000000000000000400E0C26324C8366,
1136                       fp128 0xL8000000000000000400A24E2E147AE14], align 16
1137@f128global = global fp128 0xL300000000000000040089CA8F5C28F5C, align 16
1138
1139; Function Attrs: norecurse nounwind readonly
1140define double @qpConv2dp(fp128* nocapture readonly %a) {
1141; CHECK-LABEL: qpConv2dp:
1142; CHECK:       # %bb.0: # %entry
1143; CHECK-NEXT:    lxv v2, 0(r3)
1144; CHECK-NEXT:    xscvqpdp v2, v2
1145; CHECK-NEXT:    xscpsgndp f1, v2, v2
1146; CHECK-NEXT:    blr
1147;
1148; CHECK-P8-LABEL: qpConv2dp:
1149; CHECK-P8:       # %bb.0: # %entry
1150; CHECK-P8-NEXT:    mflr r0
1151; CHECK-P8-NEXT:    std r0, 16(r1)
1152; CHECK-P8-NEXT:    stdu r1, -32(r1)
1153; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
1154; CHECK-P8-NEXT:    .cfi_offset lr, 16
1155; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1156; CHECK-P8-NEXT:    xxswapd v2, vs0
1157; CHECK-P8-NEXT:    bl __trunckfdf2
1158; CHECK-P8-NEXT:    nop
1159; CHECK-P8-NEXT:    addi r1, r1, 32
1160; CHECK-P8-NEXT:    ld r0, 16(r1)
1161; CHECK-P8-NEXT:    mtlr r0
1162; CHECK-P8-NEXT:    blr
1163entry:
1164  %0 = load fp128, fp128* %a, align 16
1165  %conv = fptrunc fp128 %0 to double
1166  ret double %conv
1167}
1168
1169; Function Attrs: norecurse nounwind
1170define void @qpConv2dp_02(double* nocapture %res) {
1171; CHECK-LABEL: qpConv2dp_02:
1172; CHECK:       # %bb.0: # %entry
1173; CHECK-NEXT:    addis r4, r2, .LC6@toc@ha
1174; CHECK-NEXT:    ld r4, .LC6@toc@l(r4)
1175; CHECK-NEXT:    lxv v2, 0(r4)
1176; CHECK-NEXT:    xscvqpdp v2, v2
1177; CHECK-NEXT:    stxsd v2, 0(r3)
1178; CHECK-NEXT:    blr
1179;
1180; CHECK-P8-LABEL: qpConv2dp_02:
1181; CHECK-P8:       # %bb.0: # %entry
1182; CHECK-P8-NEXT:    mflr r0
1183; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1184; CHECK-P8-NEXT:    .cfi_offset lr, 16
1185; CHECK-P8-NEXT:    .cfi_offset r30, -16
1186; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1187; CHECK-P8-NEXT:    std r0, 16(r1)
1188; CHECK-P8-NEXT:    stdu r1, -48(r1)
1189; CHECK-P8-NEXT:    addis r4, r2, .LC6@toc@ha
1190; CHECK-P8-NEXT:    mr r30, r3
1191; CHECK-P8-NEXT:    ld r4, .LC6@toc@l(r4)
1192; CHECK-P8-NEXT:    lxvd2x vs0, 0, r4
1193; CHECK-P8-NEXT:    xxswapd v2, vs0
1194; CHECK-P8-NEXT:    bl __trunckfdf2
1195; CHECK-P8-NEXT:    nop
1196; CHECK-P8-NEXT:    stfd f1, 0(r30)
1197; CHECK-P8-NEXT:    addi r1, r1, 48
1198; CHECK-P8-NEXT:    ld r0, 16(r1)
1199; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1200; CHECK-P8-NEXT:    mtlr r0
1201; CHECK-P8-NEXT:    blr
1202entry:
1203  %0 = load fp128, fp128* @f128global, align 16
1204  %conv = fptrunc fp128 %0 to double
1205  store double %conv, double* %res, align 8
1206  ret void
1207}
1208
1209; Function Attrs: norecurse nounwind
1210define void @qpConv2dp_03(double* nocapture %res, i32 signext %idx) {
1211; CHECK-LABEL: qpConv2dp_03:
1212; CHECK:       # %bb.0: # %entry
1213; CHECK-NEXT:    addis r5, r2, .LC7@toc@ha
1214; CHECK-NEXT:    sldi r4, r4, 3
1215; CHECK-NEXT:    ld r5, .LC7@toc@l(r5)
1216; CHECK-NEXT:    lxv v2, 0(r5)
1217; CHECK-NEXT:    xscvqpdp v2, v2
1218; CHECK-NEXT:    stxsdx v2, r3, r4
1219; CHECK-NEXT:    blr
1220;
1221; CHECK-P8-LABEL: qpConv2dp_03:
1222; CHECK-P8:       # %bb.0: # %entry
1223; CHECK-P8-NEXT:    mflr r0
1224; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
1225; CHECK-P8-NEXT:    .cfi_offset lr, 16
1226; CHECK-P8-NEXT:    .cfi_offset r29, -24
1227; CHECK-P8-NEXT:    .cfi_offset r30, -16
1228; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
1229; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1230; CHECK-P8-NEXT:    std r0, 16(r1)
1231; CHECK-P8-NEXT:    stdu r1, -64(r1)
1232; CHECK-P8-NEXT:    mr r30, r4
1233; CHECK-P8-NEXT:    addis r4, r2, .LC7@toc@ha
1234; CHECK-P8-NEXT:    mr r29, r3
1235; CHECK-P8-NEXT:    ld r4, .LC7@toc@l(r4)
1236; CHECK-P8-NEXT:    lxvd2x vs0, 0, r4
1237; CHECK-P8-NEXT:    xxswapd v2, vs0
1238; CHECK-P8-NEXT:    bl __trunckfdf2
1239; CHECK-P8-NEXT:    nop
1240; CHECK-P8-NEXT:    sldi r3, r30, 3
1241; CHECK-P8-NEXT:    stfdx f1, r29, r3
1242; CHECK-P8-NEXT:    addi r1, r1, 64
1243; CHECK-P8-NEXT:    ld r0, 16(r1)
1244; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1245; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
1246; CHECK-P8-NEXT:    mtlr r0
1247; CHECK-P8-NEXT:    blr
1248entry:
1249  %0 = load fp128, fp128* getelementptr inbounds ([4 x fp128], [4 x fp128]* @f128Array, i64 0, i64 0), align 16
1250  %conv = fptrunc fp128 %0 to double
1251  %idxprom = sext i32 %idx to i64
1252  %arrayidx = getelementptr inbounds double, double* %res, i64 %idxprom
1253  store double %conv, double* %arrayidx, align 8
1254  ret void
1255}
1256
1257; Function Attrs: norecurse nounwind
1258define void @qpConv2dp_04(fp128* nocapture readonly %a, fp128* nocapture readonly %b, double* nocapture %res) {
1259; CHECK-LABEL: qpConv2dp_04:
1260; CHECK:       # %bb.0: # %entry
1261; CHECK-NEXT:    lxv v2, 0(r3)
1262; CHECK-NEXT:    lxv v3, 0(r4)
1263; CHECK-NEXT:    xsaddqp v2, v2, v3
1264; CHECK-NEXT:    xscvqpdp v2, v2
1265; CHECK-NEXT:    stxsd v2, 0(r5)
1266; CHECK-NEXT:    blr
1267;
1268; CHECK-P8-LABEL: qpConv2dp_04:
1269; CHECK-P8:       # %bb.0: # %entry
1270; CHECK-P8-NEXT:    mflr r0
1271; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1272; CHECK-P8-NEXT:    .cfi_offset lr, 16
1273; CHECK-P8-NEXT:    .cfi_offset r30, -16
1274; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1275; CHECK-P8-NEXT:    std r0, 16(r1)
1276; CHECK-P8-NEXT:    stdu r1, -48(r1)
1277; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1278; CHECK-P8-NEXT:    lxvd2x vs1, 0, r4
1279; CHECK-P8-NEXT:    mr r30, r5
1280; CHECK-P8-NEXT:    xxswapd v2, vs0
1281; CHECK-P8-NEXT:    xxswapd v3, vs1
1282; CHECK-P8-NEXT:    bl __addkf3
1283; CHECK-P8-NEXT:    nop
1284; CHECK-P8-NEXT:    bl __trunckfdf2
1285; CHECK-P8-NEXT:    nop
1286; CHECK-P8-NEXT:    stfd f1, 0(r30)
1287; CHECK-P8-NEXT:    addi r1, r1, 48
1288; CHECK-P8-NEXT:    ld r0, 16(r1)
1289; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1290; CHECK-P8-NEXT:    mtlr r0
1291; CHECK-P8-NEXT:    blr
1292entry:
1293  %0 = load fp128, fp128* %a, align 16
1294  %1 = load fp128, fp128* %b, align 16
1295  %add = fadd fp128 %0, %1
1296  %conv = fptrunc fp128 %add to double
1297  store double %conv, double* %res, align 8
1298  ret void
1299}
1300
1301;  Convert QP to SP
1302
1303; Function Attrs: norecurse nounwind readonly
1304define float @qpConv2sp(fp128* nocapture readonly %a) {
1305; CHECK-LABEL: qpConv2sp:
1306; CHECK:       # %bb.0: # %entry
1307; CHECK-NEXT:    lxv v2, 0(r3)
1308; CHECK-NEXT:    xscvqpdpo v2, v2
1309; CHECK-NEXT:    xsrsp f1, v2
1310; CHECK-NEXT:    blr
1311;
1312; CHECK-P8-LABEL: qpConv2sp:
1313; CHECK-P8:       # %bb.0: # %entry
1314; CHECK-P8-NEXT:    mflr r0
1315; CHECK-P8-NEXT:    std r0, 16(r1)
1316; CHECK-P8-NEXT:    stdu r1, -32(r1)
1317; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
1318; CHECK-P8-NEXT:    .cfi_offset lr, 16
1319; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1320; CHECK-P8-NEXT:    xxswapd v2, vs0
1321; CHECK-P8-NEXT:    bl __trunckfsf2
1322; CHECK-P8-NEXT:    nop
1323; CHECK-P8-NEXT:    addi r1, r1, 32
1324; CHECK-P8-NEXT:    ld r0, 16(r1)
1325; CHECK-P8-NEXT:    mtlr r0
1326; CHECK-P8-NEXT:    blr
1327entry:
1328  %0 = load fp128, fp128* %a, align 16
1329  %conv = fptrunc fp128 %0 to float
1330  ret float %conv
1331}
1332
1333; Function Attrs: norecurse nounwind
1334define void @qpConv2sp_02(float* nocapture %res) {
1335; CHECK-LABEL: qpConv2sp_02:
1336; CHECK:       # %bb.0: # %entry
1337; CHECK-NEXT:    addis r4, r2, .LC6@toc@ha
1338; CHECK-NEXT:    ld r4, .LC6@toc@l(r4)
1339; CHECK-NEXT:    lxv v2, 0(r4)
1340; CHECK-NEXT:    xscvqpdpo v2, v2
1341; CHECK-NEXT:    xsrsp f0, v2
1342; CHECK-NEXT:    stfs f0, 0(r3)
1343; CHECK-NEXT:    blr
1344;
1345; CHECK-P8-LABEL: qpConv2sp_02:
1346; CHECK-P8:       # %bb.0: # %entry
1347; CHECK-P8-NEXT:    mflr r0
1348; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1349; CHECK-P8-NEXT:    .cfi_offset lr, 16
1350; CHECK-P8-NEXT:    .cfi_offset r30, -16
1351; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1352; CHECK-P8-NEXT:    std r0, 16(r1)
1353; CHECK-P8-NEXT:    stdu r1, -48(r1)
1354; CHECK-P8-NEXT:    addis r4, r2, .LC6@toc@ha
1355; CHECK-P8-NEXT:    mr r30, r3
1356; CHECK-P8-NEXT:    ld r4, .LC6@toc@l(r4)
1357; CHECK-P8-NEXT:    lxvd2x vs0, 0, r4
1358; CHECK-P8-NEXT:    xxswapd v2, vs0
1359; CHECK-P8-NEXT:    bl __trunckfsf2
1360; CHECK-P8-NEXT:    nop
1361; CHECK-P8-NEXT:    stfs f1, 0(r30)
1362; CHECK-P8-NEXT:    addi r1, r1, 48
1363; CHECK-P8-NEXT:    ld r0, 16(r1)
1364; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1365; CHECK-P8-NEXT:    mtlr r0
1366; CHECK-P8-NEXT:    blr
1367entry:
1368  %0 = load fp128, fp128* @f128global, align 16
1369  %conv = fptrunc fp128 %0 to float
1370  store float %conv, float* %res, align 4
1371  ret void
1372}
1373
1374; Function Attrs: norecurse nounwind
1375define void @qpConv2sp_03(float* nocapture %res, i32 signext %idx) {
1376; CHECK-LABEL: qpConv2sp_03:
1377; CHECK:       # %bb.0: # %entry
1378; CHECK-NEXT:    addis r5, r2, .LC7@toc@ha
1379; CHECK-NEXT:    sldi r4, r4, 2
1380; CHECK-NEXT:    ld r5, .LC7@toc@l(r5)
1381; CHECK-NEXT:    lxv v2, 48(r5)
1382; CHECK-NEXT:    xscvqpdpo v2, v2
1383; CHECK-NEXT:    xsrsp f0, v2
1384; CHECK-NEXT:    stfsx f0, r3, r4
1385; CHECK-NEXT:    blr
1386;
1387; CHECK-P8-LABEL: qpConv2sp_03:
1388; CHECK-P8:       # %bb.0: # %entry
1389; CHECK-P8-NEXT:    mflr r0
1390; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
1391; CHECK-P8-NEXT:    .cfi_offset lr, 16
1392; CHECK-P8-NEXT:    .cfi_offset r29, -24
1393; CHECK-P8-NEXT:    .cfi_offset r30, -16
1394; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
1395; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1396; CHECK-P8-NEXT:    std r0, 16(r1)
1397; CHECK-P8-NEXT:    stdu r1, -64(r1)
1398; CHECK-P8-NEXT:    mr r30, r4
1399; CHECK-P8-NEXT:    addis r4, r2, .LC7@toc@ha
1400; CHECK-P8-NEXT:    mr r29, r3
1401; CHECK-P8-NEXT:    ld r4, .LC7@toc@l(r4)
1402; CHECK-P8-NEXT:    addi r4, r4, 48
1403; CHECK-P8-NEXT:    lxvd2x vs0, 0, r4
1404; CHECK-P8-NEXT:    xxswapd v2, vs0
1405; CHECK-P8-NEXT:    bl __trunckfsf2
1406; CHECK-P8-NEXT:    nop
1407; CHECK-P8-NEXT:    sldi r3, r30, 2
1408; CHECK-P8-NEXT:    stfsx f1, r29, r3
1409; CHECK-P8-NEXT:    addi r1, r1, 64
1410; CHECK-P8-NEXT:    ld r0, 16(r1)
1411; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1412; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
1413; CHECK-P8-NEXT:    mtlr r0
1414; CHECK-P8-NEXT:    blr
1415entry:
1416  %0 = load fp128, fp128* getelementptr inbounds ([4 x fp128], [4 x fp128]* @f128Array, i64 0, i64 3), align 16
1417  %conv = fptrunc fp128 %0 to float
1418  %idxprom = sext i32 %idx to i64
1419  %arrayidx = getelementptr inbounds float, float* %res, i64 %idxprom
1420  store float %conv, float* %arrayidx, align 4
1421  ret void
1422}
1423
1424; Function Attrs: norecurse nounwind
1425define void @qpConv2sp_04(fp128* nocapture readonly %a, fp128* nocapture readonly %b, float* nocapture %res) {
1426; CHECK-LABEL: qpConv2sp_04:
1427; CHECK:       # %bb.0: # %entry
1428; CHECK-NEXT:    lxv v2, 0(r3)
1429; CHECK-NEXT:    lxv v3, 0(r4)
1430; CHECK-NEXT:    xsaddqp v2, v2, v3
1431; CHECK-NEXT:    xscvqpdpo v2, v2
1432; CHECK-NEXT:    xsrsp f0, v2
1433; CHECK-NEXT:    stfs f0, 0(r5)
1434; CHECK-NEXT:    blr
1435;
1436; CHECK-P8-LABEL: qpConv2sp_04:
1437; CHECK-P8:       # %bb.0: # %entry
1438; CHECK-P8-NEXT:    mflr r0
1439; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1440; CHECK-P8-NEXT:    .cfi_offset lr, 16
1441; CHECK-P8-NEXT:    .cfi_offset r30, -16
1442; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1443; CHECK-P8-NEXT:    std r0, 16(r1)
1444; CHECK-P8-NEXT:    stdu r1, -48(r1)
1445; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1446; CHECK-P8-NEXT:    lxvd2x vs1, 0, r4
1447; CHECK-P8-NEXT:    mr r30, r5
1448; CHECK-P8-NEXT:    xxswapd v2, vs0
1449; CHECK-P8-NEXT:    xxswapd v3, vs1
1450; CHECK-P8-NEXT:    bl __addkf3
1451; CHECK-P8-NEXT:    nop
1452; CHECK-P8-NEXT:    bl __trunckfsf2
1453; CHECK-P8-NEXT:    nop
1454; CHECK-P8-NEXT:    stfs f1, 0(r30)
1455; CHECK-P8-NEXT:    addi r1, r1, 48
1456; CHECK-P8-NEXT:    ld r0, 16(r1)
1457; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1458; CHECK-P8-NEXT:    mtlr r0
1459; CHECK-P8-NEXT:    blr
1460entry:
1461  %0 = load fp128, fp128* %a, align 16
1462  %1 = load fp128, fp128* %b, align 16
1463  %add = fadd fp128 %0, %1
1464  %conv = fptrunc fp128 %add to float
1465  store float %conv, float* %res, align 4
1466  ret void
1467}
1468
1469@f128Glob = common global fp128 0xL00000000000000000000000000000000, align 16
1470
1471; Function Attrs: norecurse nounwind readnone
1472define fp128 @dpConv2qp(double %a) {
1473; CHECK-LABEL: dpConv2qp:
1474; CHECK:       # %bb.0: # %entry
1475; CHECK-NEXT:    xscpsgndp v2, f1, f1
1476; CHECK-NEXT:    xscvdpqp v2, v2
1477; CHECK-NEXT:    blr
1478;
1479; CHECK-P8-LABEL: dpConv2qp:
1480; CHECK-P8:       # %bb.0: # %entry
1481; CHECK-P8-NEXT:    mflr r0
1482; CHECK-P8-NEXT:    std r0, 16(r1)
1483; CHECK-P8-NEXT:    stdu r1, -32(r1)
1484; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
1485; CHECK-P8-NEXT:    .cfi_offset lr, 16
1486; CHECK-P8-NEXT:    bl __extenddfkf2
1487; CHECK-P8-NEXT:    nop
1488; CHECK-P8-NEXT:    addi r1, r1, 32
1489; CHECK-P8-NEXT:    ld r0, 16(r1)
1490; CHECK-P8-NEXT:    mtlr r0
1491; CHECK-P8-NEXT:    blr
1492entry:
1493  %conv = fpext double %a to fp128
1494  ret fp128 %conv
1495}
1496
1497; Function Attrs: norecurse nounwind
1498define void @dpConv2qp_02(double* nocapture readonly %a) {
1499; CHECK-LABEL: dpConv2qp_02:
1500; CHECK:       # %bb.0: # %entry
1501; CHECK-NEXT:    lxsd v2, 0(r3)
1502; CHECK-NEXT:    addis r3, r2, .LC8@toc@ha
1503; CHECK-NEXT:    ld r3, .LC8@toc@l(r3)
1504; CHECK-NEXT:    xscvdpqp v2, v2
1505; CHECK-NEXT:    stxv v2, 0(r3)
1506; CHECK-NEXT:    blr
1507;
1508; CHECK-P8-LABEL: dpConv2qp_02:
1509; CHECK-P8:       # %bb.0: # %entry
1510; CHECK-P8-NEXT:    mflr r0
1511; CHECK-P8-NEXT:    std r0, 16(r1)
1512; CHECK-P8-NEXT:    stdu r1, -32(r1)
1513; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
1514; CHECK-P8-NEXT:    .cfi_offset lr, 16
1515; CHECK-P8-NEXT:    lfd f1, 0(r3)
1516; CHECK-P8-NEXT:    bl __extenddfkf2
1517; CHECK-P8-NEXT:    nop
1518; CHECK-P8-NEXT:    addis r3, r2, .LC8@toc@ha
1519; CHECK-P8-NEXT:    xxswapd vs0, v2
1520; CHECK-P8-NEXT:    ld r3, .LC8@toc@l(r3)
1521; CHECK-P8-NEXT:    stxvd2x vs0, 0, r3
1522; CHECK-P8-NEXT:    addi r1, r1, 32
1523; CHECK-P8-NEXT:    ld r0, 16(r1)
1524; CHECK-P8-NEXT:    mtlr r0
1525; CHECK-P8-NEXT:    blr
1526entry:
1527  %0 = load double, double* %a, align 8
1528  %conv = fpext double %0 to fp128
1529  store fp128 %conv, fp128* @f128Glob, align 16
1530  ret void
1531}
1532
1533; Function Attrs: norecurse nounwind
1534define void @dpConv2qp_02b(double* nocapture readonly %a, i32 signext %idx) {
1535; CHECK-LABEL: dpConv2qp_02b:
1536; CHECK:       # %bb.0: # %entry
1537; CHECK-NEXT:    sldi r4, r4, 3
1538; CHECK-NEXT:    lxsdx v2, r3, r4
1539; CHECK-NEXT:    addis r3, r2, .LC8@toc@ha
1540; CHECK-NEXT:    ld r3, .LC8@toc@l(r3)
1541; CHECK-NEXT:    xscvdpqp v2, v2
1542; CHECK-NEXT:    stxv v2, 0(r3)
1543; CHECK-NEXT:    blr
1544;
1545; CHECK-P8-LABEL: dpConv2qp_02b:
1546; CHECK-P8:       # %bb.0: # %entry
1547; CHECK-P8-NEXT:    mflr r0
1548; CHECK-P8-NEXT:    std r0, 16(r1)
1549; CHECK-P8-NEXT:    stdu r1, -32(r1)
1550; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
1551; CHECK-P8-NEXT:    .cfi_offset lr, 16
1552; CHECK-P8-NEXT:    sldi r4, r4, 3
1553; CHECK-P8-NEXT:    lfdx f1, r3, r4
1554; CHECK-P8-NEXT:    bl __extenddfkf2
1555; CHECK-P8-NEXT:    nop
1556; CHECK-P8-NEXT:    addis r3, r2, .LC8@toc@ha
1557; CHECK-P8-NEXT:    xxswapd vs0, v2
1558; CHECK-P8-NEXT:    ld r3, .LC8@toc@l(r3)
1559; CHECK-P8-NEXT:    stxvd2x vs0, 0, r3
1560; CHECK-P8-NEXT:    addi r1, r1, 32
1561; CHECK-P8-NEXT:    ld r0, 16(r1)
1562; CHECK-P8-NEXT:    mtlr r0
1563; CHECK-P8-NEXT:    blr
1564entry:
1565  %idxprom = sext i32 %idx to i64
1566  %arrayidx = getelementptr inbounds double, double* %a, i64 %idxprom
1567  %0 = load double, double* %arrayidx, align 8
1568  %conv = fpext double %0 to fp128
1569  store fp128 %conv, fp128* @f128Glob, align 16
1570  ret void
1571}
1572
1573; Function Attrs: norecurse nounwind
1574define void @dpConv2qp_03(fp128* nocapture %res, i32 signext %idx, double %a) {
1575; CHECK-LABEL: dpConv2qp_03:
1576; CHECK:       # %bb.0: # %entry
1577; CHECK-NEXT:    xscpsgndp v2, f1, f1
1578; CHECK-NEXT:    sldi r4, r4, 4
1579; CHECK-NEXT:    xscvdpqp v2, v2
1580; CHECK-NEXT:    stxvx v2, r3, r4
1581; CHECK-NEXT:    blr
1582;
1583; CHECK-P8-LABEL: dpConv2qp_03:
1584; CHECK-P8:       # %bb.0: # %entry
1585; CHECK-P8-NEXT:    mflr r0
1586; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
1587; CHECK-P8-NEXT:    .cfi_offset lr, 16
1588; CHECK-P8-NEXT:    .cfi_offset r29, -24
1589; CHECK-P8-NEXT:    .cfi_offset r30, -16
1590; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
1591; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1592; CHECK-P8-NEXT:    std r0, 16(r1)
1593; CHECK-P8-NEXT:    stdu r1, -64(r1)
1594; CHECK-P8-NEXT:    mr r30, r4
1595; CHECK-P8-NEXT:    mr r29, r3
1596; CHECK-P8-NEXT:    bl __extenddfkf2
1597; CHECK-P8-NEXT:    nop
1598; CHECK-P8-NEXT:    xxswapd vs0, v2
1599; CHECK-P8-NEXT:    sldi r3, r30, 4
1600; CHECK-P8-NEXT:    stxvd2x vs0, r29, r3
1601; CHECK-P8-NEXT:    addi r1, r1, 64
1602; CHECK-P8-NEXT:    ld r0, 16(r1)
1603; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1604; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
1605; CHECK-P8-NEXT:    mtlr r0
1606; CHECK-P8-NEXT:    blr
1607entry:
1608  %conv = fpext double %a to fp128
1609  %idxprom = sext i32 %idx to i64
1610  %arrayidx = getelementptr inbounds fp128, fp128* %res, i64 %idxprom
1611  store fp128 %conv, fp128* %arrayidx, align 16
1612  ret void
1613}
1614
1615; Function Attrs: norecurse nounwind
1616define void @dpConv2qp_04(double %a, fp128* nocapture %res) {
1617; CHECK-LABEL: dpConv2qp_04:
1618; CHECK:       # %bb.0: # %entry
1619; CHECK-NEXT:    xscpsgndp v2, f1, f1
1620; CHECK-NEXT:    xscvdpqp v2, v2
1621; CHECK-NEXT:    stxv v2, 0(r4)
1622; CHECK-NEXT:    blr
1623;
1624; CHECK-P8-LABEL: dpConv2qp_04:
1625; CHECK-P8:       # %bb.0: # %entry
1626; CHECK-P8-NEXT:    mflr r0
1627; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1628; CHECK-P8-NEXT:    .cfi_offset lr, 16
1629; CHECK-P8-NEXT:    .cfi_offset r30, -16
1630; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1631; CHECK-P8-NEXT:    std r0, 16(r1)
1632; CHECK-P8-NEXT:    stdu r1, -48(r1)
1633; CHECK-P8-NEXT:    mr r30, r4
1634; CHECK-P8-NEXT:    bl __extenddfkf2
1635; CHECK-P8-NEXT:    nop
1636; CHECK-P8-NEXT:    xxswapd vs0, v2
1637; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
1638; CHECK-P8-NEXT:    addi r1, r1, 48
1639; CHECK-P8-NEXT:    ld r0, 16(r1)
1640; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1641; CHECK-P8-NEXT:    mtlr r0
1642; CHECK-P8-NEXT:    blr
1643entry:
1644  %conv = fpext double %a to fp128
1645  store fp128 %conv, fp128* %res, align 16
1646  ret void
1647}
1648
1649; Function Attrs: norecurse nounwind readnone
1650define fp128 @spConv2qp(float %a) {
1651; CHECK-LABEL: spConv2qp:
1652; CHECK:       # %bb.0: # %entry
1653; CHECK-NEXT:    xscpsgndp v2, f1, f1
1654; CHECK-NEXT:    xscvdpqp v2, v2
1655; CHECK-NEXT:    blr
1656;
1657; CHECK-P8-LABEL: spConv2qp:
1658; CHECK-P8:       # %bb.0: # %entry
1659; CHECK-P8-NEXT:    mflr r0
1660; CHECK-P8-NEXT:    std r0, 16(r1)
1661; CHECK-P8-NEXT:    stdu r1, -32(r1)
1662; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
1663; CHECK-P8-NEXT:    .cfi_offset lr, 16
1664; CHECK-P8-NEXT:    bl __extendsfkf2
1665; CHECK-P8-NEXT:    nop
1666; CHECK-P8-NEXT:    addi r1, r1, 32
1667; CHECK-P8-NEXT:    ld r0, 16(r1)
1668; CHECK-P8-NEXT:    mtlr r0
1669; CHECK-P8-NEXT:    blr
1670entry:
1671  %conv = fpext float %a to fp128
1672  ret fp128 %conv
1673}
1674
1675; Function Attrs: norecurse nounwind
1676define void @spConv2qp_02(float* nocapture readonly %a) {
1677; CHECK-LABEL: spConv2qp_02:
1678; CHECK:       # %bb.0: # %entry
1679; CHECK-NEXT:    lxssp v2, 0(r3)
1680; CHECK-NEXT:    addis r3, r2, .LC8@toc@ha
1681; CHECK-NEXT:    ld r3, .LC8@toc@l(r3)
1682; CHECK-NEXT:    xscvdpqp v2, v2
1683; CHECK-NEXT:    stxv v2, 0(r3)
1684; CHECK-NEXT:    blr
1685;
1686; CHECK-P8-LABEL: spConv2qp_02:
1687; CHECK-P8:       # %bb.0: # %entry
1688; CHECK-P8-NEXT:    mflr r0
1689; CHECK-P8-NEXT:    std r0, 16(r1)
1690; CHECK-P8-NEXT:    stdu r1, -32(r1)
1691; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
1692; CHECK-P8-NEXT:    .cfi_offset lr, 16
1693; CHECK-P8-NEXT:    lfs f1, 0(r3)
1694; CHECK-P8-NEXT:    bl __extendsfkf2
1695; CHECK-P8-NEXT:    nop
1696; CHECK-P8-NEXT:    addis r3, r2, .LC8@toc@ha
1697; CHECK-P8-NEXT:    xxswapd vs0, v2
1698; CHECK-P8-NEXT:    ld r3, .LC8@toc@l(r3)
1699; CHECK-P8-NEXT:    stxvd2x vs0, 0, r3
1700; CHECK-P8-NEXT:    addi r1, r1, 32
1701; CHECK-P8-NEXT:    ld r0, 16(r1)
1702; CHECK-P8-NEXT:    mtlr r0
1703; CHECK-P8-NEXT:    blr
1704entry:
1705  %0 = load float, float* %a, align 4
1706  %conv = fpext float %0 to fp128
1707  store fp128 %conv, fp128* @f128Glob, align 16
1708  ret void
1709}
1710
1711; Function Attrs: norecurse nounwind
1712define void @spConv2qp_02b(float* nocapture readonly %a, i32 signext %idx) {
1713; CHECK-LABEL: spConv2qp_02b:
1714; CHECK:       # %bb.0: # %entry
1715; CHECK-NEXT:    sldi r4, r4, 2
1716; CHECK-NEXT:    lxsspx v2, r3, r4
1717; CHECK-NEXT:    addis r3, r2, .LC8@toc@ha
1718; CHECK-NEXT:    ld r3, .LC8@toc@l(r3)
1719; CHECK-NEXT:    xscvdpqp v2, v2
1720; CHECK-NEXT:    stxv v2, 0(r3)
1721; CHECK-NEXT:    blr
1722;
1723; CHECK-P8-LABEL: spConv2qp_02b:
1724; CHECK-P8:       # %bb.0: # %entry
1725; CHECK-P8-NEXT:    mflr r0
1726; CHECK-P8-NEXT:    std r0, 16(r1)
1727; CHECK-P8-NEXT:    stdu r1, -32(r1)
1728; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
1729; CHECK-P8-NEXT:    .cfi_offset lr, 16
1730; CHECK-P8-NEXT:    sldi r4, r4, 2
1731; CHECK-P8-NEXT:    lfsx f1, r3, r4
1732; CHECK-P8-NEXT:    bl __extendsfkf2
1733; CHECK-P8-NEXT:    nop
1734; CHECK-P8-NEXT:    addis r3, r2, .LC8@toc@ha
1735; CHECK-P8-NEXT:    xxswapd vs0, v2
1736; CHECK-P8-NEXT:    ld r3, .LC8@toc@l(r3)
1737; CHECK-P8-NEXT:    stxvd2x vs0, 0, r3
1738; CHECK-P8-NEXT:    addi r1, r1, 32
1739; CHECK-P8-NEXT:    ld r0, 16(r1)
1740; CHECK-P8-NEXT:    mtlr r0
1741; CHECK-P8-NEXT:    blr
1742entry:
1743  %idxprom = sext i32 %idx to i64
1744  %arrayidx = getelementptr inbounds float, float* %a, i64 %idxprom
1745  %0 = load float, float* %arrayidx, align 4
1746  %conv = fpext float %0 to fp128
1747  store fp128 %conv, fp128* @f128Glob, align 16
1748  ret void
1749}
1750
1751; Function Attrs: norecurse nounwind
1752define void @spConv2qp_03(fp128* nocapture %res, i32 signext %idx, float %a) {
1753; CHECK-LABEL: spConv2qp_03:
1754; CHECK:       # %bb.0: # %entry
1755; CHECK-NEXT:    xscpsgndp v2, f1, f1
1756; CHECK-NEXT:    sldi r4, r4, 4
1757; CHECK-NEXT:    xscvdpqp v2, v2
1758; CHECK-NEXT:    stxvx v2, r3, r4
1759; CHECK-NEXT:    blr
1760;
1761; CHECK-P8-LABEL: spConv2qp_03:
1762; CHECK-P8:       # %bb.0: # %entry
1763; CHECK-P8-NEXT:    mflr r0
1764; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
1765; CHECK-P8-NEXT:    .cfi_offset lr, 16
1766; CHECK-P8-NEXT:    .cfi_offset r29, -24
1767; CHECK-P8-NEXT:    .cfi_offset r30, -16
1768; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
1769; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1770; CHECK-P8-NEXT:    std r0, 16(r1)
1771; CHECK-P8-NEXT:    stdu r1, -64(r1)
1772; CHECK-P8-NEXT:    mr r30, r4
1773; CHECK-P8-NEXT:    mr r29, r3
1774; CHECK-P8-NEXT:    bl __extendsfkf2
1775; CHECK-P8-NEXT:    nop
1776; CHECK-P8-NEXT:    xxswapd vs0, v2
1777; CHECK-P8-NEXT:    sldi r3, r30, 4
1778; CHECK-P8-NEXT:    stxvd2x vs0, r29, r3
1779; CHECK-P8-NEXT:    addi r1, r1, 64
1780; CHECK-P8-NEXT:    ld r0, 16(r1)
1781; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1782; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
1783; CHECK-P8-NEXT:    mtlr r0
1784; CHECK-P8-NEXT:    blr
1785entry:
1786  %conv = fpext float %a to fp128
1787  %idxprom = sext i32 %idx to i64
1788  %arrayidx = getelementptr inbounds fp128, fp128* %res, i64 %idxprom
1789  store fp128 %conv, fp128* %arrayidx, align 16
1790  ret void
1791}
1792
1793; Function Attrs: norecurse nounwind
1794define void @spConv2qp_04(float %a, fp128* nocapture %res) {
1795; CHECK-LABEL: spConv2qp_04:
1796; CHECK:       # %bb.0: # %entry
1797; CHECK-NEXT:    xscpsgndp v2, f1, f1
1798; CHECK-NEXT:    xscvdpqp v2, v2
1799; CHECK-NEXT:    stxv v2, 0(r4)
1800; CHECK-NEXT:    blr
1801;
1802; CHECK-P8-LABEL: spConv2qp_04:
1803; CHECK-P8:       # %bb.0: # %entry
1804; CHECK-P8-NEXT:    mflr r0
1805; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1806; CHECK-P8-NEXT:    .cfi_offset lr, 16
1807; CHECK-P8-NEXT:    .cfi_offset r30, -16
1808; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1809; CHECK-P8-NEXT:    std r0, 16(r1)
1810; CHECK-P8-NEXT:    stdu r1, -48(r1)
1811; CHECK-P8-NEXT:    mr r30, r4
1812; CHECK-P8-NEXT:    bl __extendsfkf2
1813; CHECK-P8-NEXT:    nop
1814; CHECK-P8-NEXT:    xxswapd vs0, v2
1815; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
1816; CHECK-P8-NEXT:    addi r1, r1, 48
1817; CHECK-P8-NEXT:    ld r0, 16(r1)
1818; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1819; CHECK-P8-NEXT:    mtlr r0
1820; CHECK-P8-NEXT:    blr
1821entry:
1822  %conv = fpext float %a to fp128
1823  store fp128 %conv, fp128* %res, align 16
1824  ret void
1825}
1826
1827
1828; Function Attrs: norecurse nounwind
1829define void @cvdp2sw2qp(double %val, fp128* nocapture %res) {
1830; CHECK-LABEL: cvdp2sw2qp:
1831; CHECK:       # %bb.0: # %entry
1832; CHECK-NEXT:    xscvdpsxws v2, f1
1833; CHECK-NEXT:    vextsw2d v2, v2
1834; CHECK-NEXT:    xscvsdqp v2, v2
1835; CHECK-NEXT:    stxv v2, 0(r4)
1836; CHECK-NEXT:    blr
1837;
1838; CHECK-P8-LABEL: cvdp2sw2qp:
1839; CHECK-P8:       # %bb.0: # %entry
1840; CHECK-P8-NEXT:    mflr r0
1841; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1842; CHECK-P8-NEXT:    .cfi_offset lr, 16
1843; CHECK-P8-NEXT:    .cfi_offset r30, -16
1844; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1845; CHECK-P8-NEXT:    std r0, 16(r1)
1846; CHECK-P8-NEXT:    stdu r1, -48(r1)
1847; CHECK-P8-NEXT:    xscvdpsxws f0, f1
1848; CHECK-P8-NEXT:    mr r30, r4
1849; CHECK-P8-NEXT:    mffprwz r3, f0
1850; CHECK-P8-NEXT:    extsw r3, r3
1851; CHECK-P8-NEXT:    bl __floatsikf
1852; CHECK-P8-NEXT:    nop
1853; CHECK-P8-NEXT:    xxswapd vs0, v2
1854; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
1855; CHECK-P8-NEXT:    addi r1, r1, 48
1856; CHECK-P8-NEXT:    ld r0, 16(r1)
1857; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1858; CHECK-P8-NEXT:    mtlr r0
1859; CHECK-P8-NEXT:    blr
1860entry:
1861  %conv = fptosi double %val to i32
1862  %conv1 = sitofp i32 %conv to fp128
1863  store fp128 %conv1, fp128* %res, align 16
1864  ret void
1865}
1866
1867; Function Attrs: norecurse nounwind
1868define void @cvdp2sdw2qp(double %val, fp128* nocapture %res) {
1869; CHECK-LABEL: cvdp2sdw2qp:
1870; CHECK:       # %bb.0: # %entry
1871; CHECK-NEXT:    xscvdpsxds v2, f1
1872; CHECK-NEXT:    xscvsdqp v2, v2
1873; CHECK-NEXT:    stxv v2, 0(r4)
1874; CHECK-NEXT:    blr
1875;
1876; CHECK-P8-LABEL: cvdp2sdw2qp:
1877; CHECK-P8:       # %bb.0: # %entry
1878; CHECK-P8-NEXT:    mflr r0
1879; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1880; CHECK-P8-NEXT:    .cfi_offset lr, 16
1881; CHECK-P8-NEXT:    .cfi_offset r30, -16
1882; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1883; CHECK-P8-NEXT:    std r0, 16(r1)
1884; CHECK-P8-NEXT:    stdu r1, -48(r1)
1885; CHECK-P8-NEXT:    xscvdpsxds f0, f1
1886; CHECK-P8-NEXT:    mr r30, r4
1887; CHECK-P8-NEXT:    mffprd r3, f0
1888; CHECK-P8-NEXT:    bl __floatdikf
1889; CHECK-P8-NEXT:    nop
1890; CHECK-P8-NEXT:    xxswapd vs0, v2
1891; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
1892; CHECK-P8-NEXT:    addi r1, r1, 48
1893; CHECK-P8-NEXT:    ld r0, 16(r1)
1894; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1895; CHECK-P8-NEXT:    mtlr r0
1896; CHECK-P8-NEXT:    blr
1897entry:
1898  %conv = fptosi double %val to i64
1899  %conv1 = sitofp i64 %conv to fp128
1900  store fp128 %conv1, fp128* %res, align 16
1901  ret void
1902}
1903
1904; Function Attrs: norecurse nounwind
1905define void @cvsp2sw2qp(float %val, fp128* nocapture %res) {
1906; CHECK-LABEL: cvsp2sw2qp:
1907; CHECK:       # %bb.0: # %entry
1908; CHECK-NEXT:    xscvdpsxws v2, f1
1909; CHECK-NEXT:    vextsw2d v2, v2
1910; CHECK-NEXT:    xscvsdqp v2, v2
1911; CHECK-NEXT:    stxv v2, 0(r4)
1912; CHECK-NEXT:    blr
1913;
1914; CHECK-P8-LABEL: cvsp2sw2qp:
1915; CHECK-P8:       # %bb.0: # %entry
1916; CHECK-P8-NEXT:    mflr r0
1917; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1918; CHECK-P8-NEXT:    .cfi_offset lr, 16
1919; CHECK-P8-NEXT:    .cfi_offset r30, -16
1920; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1921; CHECK-P8-NEXT:    std r0, 16(r1)
1922; CHECK-P8-NEXT:    stdu r1, -48(r1)
1923; CHECK-P8-NEXT:    xscvdpsxws f0, f1
1924; CHECK-P8-NEXT:    mr r30, r4
1925; CHECK-P8-NEXT:    mffprwz r3, f0
1926; CHECK-P8-NEXT:    extsw r3, r3
1927; CHECK-P8-NEXT:    bl __floatsikf
1928; CHECK-P8-NEXT:    nop
1929; CHECK-P8-NEXT:    xxswapd vs0, v2
1930; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
1931; CHECK-P8-NEXT:    addi r1, r1, 48
1932; CHECK-P8-NEXT:    ld r0, 16(r1)
1933; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1934; CHECK-P8-NEXT:    mtlr r0
1935; CHECK-P8-NEXT:    blr
1936entry:
1937  %conv = fptosi float %val to i32
1938  %conv1 = sitofp i32 %conv to fp128
1939  store fp128 %conv1, fp128* %res, align 16
1940  ret void
1941}
1942
1943; Function Attrs: norecurse nounwind
1944define void @cvsp2sdw2qp(float %val, fp128* nocapture %res) {
1945; CHECK-LABEL: cvsp2sdw2qp:
1946; CHECK:       # %bb.0: # %entry
1947; CHECK-NEXT:    xscvdpsxds v2, f1
1948; CHECK-NEXT:    xscvsdqp v2, v2
1949; CHECK-NEXT:    stxv v2, 0(r4)
1950; CHECK-NEXT:    blr
1951;
1952; CHECK-P8-LABEL: cvsp2sdw2qp:
1953; CHECK-P8:       # %bb.0: # %entry
1954; CHECK-P8-NEXT:    mflr r0
1955; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1956; CHECK-P8-NEXT:    .cfi_offset lr, 16
1957; CHECK-P8-NEXT:    .cfi_offset r30, -16
1958; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1959; CHECK-P8-NEXT:    std r0, 16(r1)
1960; CHECK-P8-NEXT:    stdu r1, -48(r1)
1961; CHECK-P8-NEXT:    xscvdpsxds f0, f1
1962; CHECK-P8-NEXT:    mr r30, r4
1963; CHECK-P8-NEXT:    mffprd r3, f0
1964; CHECK-P8-NEXT:    bl __floatdikf
1965; CHECK-P8-NEXT:    nop
1966; CHECK-P8-NEXT:    xxswapd vs0, v2
1967; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
1968; CHECK-P8-NEXT:    addi r1, r1, 48
1969; CHECK-P8-NEXT:    ld r0, 16(r1)
1970; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1971; CHECK-P8-NEXT:    mtlr r0
1972; CHECK-P8-NEXT:    blr
1973entry:
1974  %conv = fptosi float %val to i64
1975  %conv1 = sitofp i64 %conv to fp128
1976  store fp128 %conv1, fp128* %res, align 16
1977  ret void
1978}
1979
1980; Function Attrs: norecurse nounwind
1981define void @cvdp2uw2qp(double %val, fp128* nocapture %res) {
1982; CHECK-LABEL: cvdp2uw2qp:
1983; CHECK:       # %bb.0: # %entry
1984; CHECK-NEXT:    xscvdpuxws f0, f1
1985; CHECK-NEXT:    xxextractuw v2, vs0, 8
1986; CHECK-NEXT:    xscvudqp v2, v2
1987; CHECK-NEXT:    stxv v2, 0(r4)
1988; CHECK-NEXT:    blr
1989;
1990; CHECK-P8-LABEL: cvdp2uw2qp:
1991; CHECK-P8:       # %bb.0: # %entry
1992; CHECK-P8-NEXT:    mflr r0
1993; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1994; CHECK-P8-NEXT:    .cfi_offset lr, 16
1995; CHECK-P8-NEXT:    .cfi_offset r30, -16
1996; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1997; CHECK-P8-NEXT:    std r0, 16(r1)
1998; CHECK-P8-NEXT:    stdu r1, -48(r1)
1999; CHECK-P8-NEXT:    xscvdpuxws f0, f1
2000; CHECK-P8-NEXT:    mr r30, r4
2001; CHECK-P8-NEXT:    mffprwz r3, f0
2002; CHECK-P8-NEXT:    clrldi r3, r3, 32
2003; CHECK-P8-NEXT:    bl __floatunsikf
2004; CHECK-P8-NEXT:    nop
2005; CHECK-P8-NEXT:    xxswapd vs0, v2
2006; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
2007; CHECK-P8-NEXT:    addi r1, r1, 48
2008; CHECK-P8-NEXT:    ld r0, 16(r1)
2009; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
2010; CHECK-P8-NEXT:    mtlr r0
2011; CHECK-P8-NEXT:    blr
2012entry:
2013  %conv = fptoui double %val to i32
2014  %conv1 = uitofp i32 %conv to fp128
2015  store fp128 %conv1, fp128* %res, align 16
2016  ret void
2017}
2018
2019; Function Attrs: norecurse nounwind
2020define void @cvdp2udw2qp(double %val, fp128* nocapture %res) {
2021; CHECK-LABEL: cvdp2udw2qp:
2022; CHECK:       # %bb.0: # %entry
2023; CHECK-NEXT:    xscvdpuxds v2, f1
2024; CHECK-NEXT:    xscvudqp v2, v2
2025; CHECK-NEXT:    stxv v2, 0(r4)
2026; CHECK-NEXT:    blr
2027;
2028; CHECK-P8-LABEL: cvdp2udw2qp:
2029; CHECK-P8:       # %bb.0: # %entry
2030; CHECK-P8-NEXT:    mflr r0
2031; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
2032; CHECK-P8-NEXT:    .cfi_offset lr, 16
2033; CHECK-P8-NEXT:    .cfi_offset r30, -16
2034; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
2035; CHECK-P8-NEXT:    std r0, 16(r1)
2036; CHECK-P8-NEXT:    stdu r1, -48(r1)
2037; CHECK-P8-NEXT:    xscvdpuxds f0, f1
2038; CHECK-P8-NEXT:    mr r30, r4
2039; CHECK-P8-NEXT:    mffprd r3, f0
2040; CHECK-P8-NEXT:    bl __floatundikf
2041; CHECK-P8-NEXT:    nop
2042; CHECK-P8-NEXT:    xxswapd vs0, v2
2043; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
2044; CHECK-P8-NEXT:    addi r1, r1, 48
2045; CHECK-P8-NEXT:    ld r0, 16(r1)
2046; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
2047; CHECK-P8-NEXT:    mtlr r0
2048; CHECK-P8-NEXT:    blr
2049entry:
2050  %conv = fptoui double %val to i64
2051  %conv1 = uitofp i64 %conv to fp128
2052  store fp128 %conv1, fp128* %res, align 16
2053  ret void
2054}
2055
2056; Function Attrs: norecurse nounwind
2057define void @cvsp2uw2qp(float %val, fp128* nocapture %res) {
2058; CHECK-LABEL: cvsp2uw2qp:
2059; CHECK:       # %bb.0: # %entry
2060; CHECK-NEXT:    xscvdpuxws f0, f1
2061; CHECK-NEXT:    xxextractuw v2, vs0, 8
2062; CHECK-NEXT:    xscvudqp v2, v2
2063; CHECK-NEXT:    stxv v2, 0(r4)
2064; CHECK-NEXT:    blr
2065;
2066; CHECK-P8-LABEL: cvsp2uw2qp:
2067; CHECK-P8:       # %bb.0: # %entry
2068; CHECK-P8-NEXT:    mflr r0
2069; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
2070; CHECK-P8-NEXT:    .cfi_offset lr, 16
2071; CHECK-P8-NEXT:    .cfi_offset r30, -16
2072; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
2073; CHECK-P8-NEXT:    std r0, 16(r1)
2074; CHECK-P8-NEXT:    stdu r1, -48(r1)
2075; CHECK-P8-NEXT:    xscvdpuxws f0, f1
2076; CHECK-P8-NEXT:    mr r30, r4
2077; CHECK-P8-NEXT:    mffprwz r3, f0
2078; CHECK-P8-NEXT:    clrldi r3, r3, 32
2079; CHECK-P8-NEXT:    bl __floatunsikf
2080; CHECK-P8-NEXT:    nop
2081; CHECK-P8-NEXT:    xxswapd vs0, v2
2082; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
2083; CHECK-P8-NEXT:    addi r1, r1, 48
2084; CHECK-P8-NEXT:    ld r0, 16(r1)
2085; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
2086; CHECK-P8-NEXT:    mtlr r0
2087; CHECK-P8-NEXT:    blr
2088entry:
2089  %conv = fptoui float %val to i32
2090  %conv1 = uitofp i32 %conv to fp128
2091  store fp128 %conv1, fp128* %res, align 16
2092  ret void
2093}
2094
2095; Function Attrs: norecurse nounwind
2096define void @cvsp2udw2qp(float %val, fp128* nocapture %res) {
2097; CHECK-LABEL: cvsp2udw2qp:
2098; CHECK:       # %bb.0: # %entry
2099; CHECK-NEXT:    xscvdpuxds v2, f1
2100; CHECK-NEXT:    xscvudqp v2, v2
2101; CHECK-NEXT:    stxv v2, 0(r4)
2102; CHECK-NEXT:    blr
2103;
2104; CHECK-P8-LABEL: cvsp2udw2qp:
2105; CHECK-P8:       # %bb.0: # %entry
2106; CHECK-P8-NEXT:    mflr r0
2107; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
2108; CHECK-P8-NEXT:    .cfi_offset lr, 16
2109; CHECK-P8-NEXT:    .cfi_offset r30, -16
2110; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
2111; CHECK-P8-NEXT:    std r0, 16(r1)
2112; CHECK-P8-NEXT:    stdu r1, -48(r1)
2113; CHECK-P8-NEXT:    xscvdpuxds f0, f1
2114; CHECK-P8-NEXT:    mr r30, r4
2115; CHECK-P8-NEXT:    mffprd r3, f0
2116; CHECK-P8-NEXT:    bl __floatundikf
2117; CHECK-P8-NEXT:    nop
2118; CHECK-P8-NEXT:    xxswapd vs0, v2
2119; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
2120; CHECK-P8-NEXT:    addi r1, r1, 48
2121; CHECK-P8-NEXT:    ld r0, 16(r1)
2122; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
2123; CHECK-P8-NEXT:    mtlr r0
2124; CHECK-P8-NEXT:    blr
2125entry:
2126  %conv = fptoui float %val to i64
2127  %conv1 = uitofp i64 %conv to fp128
2128  store fp128 %conv1, fp128* %res, align 16
2129  ret void
2130}
2131
2132; Function Attrs: norecurse nounwind readonly
2133define i128 @qpConv2i128(fp128* nocapture readonly %a) {
2134; CHECK-LABEL: qpConv2i128:
2135; CHECK:       # %bb.0: # %entry
2136; CHECK-NEXT:    mflr r0
2137; CHECK-NEXT:    std r0, 16(r1)
2138; CHECK-NEXT:    stdu r1, -32(r1)
2139; CHECK-NEXT:    .cfi_def_cfa_offset 32
2140; CHECK-NEXT:    .cfi_offset lr, 16
2141; CHECK-NEXT:    lxv v2, 0(r3)
2142; CHECK-NEXT:    bl __fixkfti
2143; CHECK-NEXT:    nop
2144; CHECK-NEXT:    addi r1, r1, 32
2145; CHECK-NEXT:    ld r0, 16(r1)
2146; CHECK-NEXT:    mtlr r0
2147; CHECK-NEXT:    blr
2148;
2149; CHECK-P8-LABEL: qpConv2i128:
2150; CHECK-P8:       # %bb.0: # %entry
2151; CHECK-P8-NEXT:    mflr r0
2152; CHECK-P8-NEXT:    std r0, 16(r1)
2153; CHECK-P8-NEXT:    stdu r1, -32(r1)
2154; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
2155; CHECK-P8-NEXT:    .cfi_offset lr, 16
2156; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
2157; CHECK-P8-NEXT:    xxswapd v2, vs0
2158; CHECK-P8-NEXT:    bl __fixkfti
2159; CHECK-P8-NEXT:    nop
2160; CHECK-P8-NEXT:    addi r1, r1, 32
2161; CHECK-P8-NEXT:    ld r0, 16(r1)
2162; CHECK-P8-NEXT:    mtlr r0
2163; CHECK-P8-NEXT:    blr
2164entry:
2165  %0 = load fp128, fp128* %a, align 16
2166  %conv = fptosi fp128 %0 to i128
2167  ret i128 %conv
2168}
2169
2170; Function Attrs: norecurse nounwind readonly
2171define i128 @qpConv2ui128(fp128* nocapture readonly %a) {
2172; CHECK-LABEL: qpConv2ui128:
2173; CHECK:       # %bb.0: # %entry
2174; CHECK-NEXT:    mflr r0
2175; CHECK-NEXT:    std r0, 16(r1)
2176; CHECK-NEXT:    stdu r1, -32(r1)
2177; CHECK-NEXT:    .cfi_def_cfa_offset 32
2178; CHECK-NEXT:    .cfi_offset lr, 16
2179; CHECK-NEXT:    lxv v2, 0(r3)
2180; CHECK-NEXT:    bl __fixunskfti
2181; CHECK-NEXT:    nop
2182; CHECK-NEXT:    addi r1, r1, 32
2183; CHECK-NEXT:    ld r0, 16(r1)
2184; CHECK-NEXT:    mtlr r0
2185; CHECK-NEXT:    blr
2186;
2187; CHECK-P8-LABEL: qpConv2ui128:
2188; CHECK-P8:       # %bb.0: # %entry
2189; CHECK-P8-NEXT:    mflr r0
2190; CHECK-P8-NEXT:    std r0, 16(r1)
2191; CHECK-P8-NEXT:    stdu r1, -32(r1)
2192; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
2193; CHECK-P8-NEXT:    .cfi_offset lr, 16
2194; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
2195; CHECK-P8-NEXT:    xxswapd v2, vs0
2196; CHECK-P8-NEXT:    bl __fixunskfti
2197; CHECK-P8-NEXT:    nop
2198; CHECK-P8-NEXT:    addi r1, r1, 32
2199; CHECK-P8-NEXT:    ld r0, 16(r1)
2200; CHECK-P8-NEXT:    mtlr r0
2201; CHECK-P8-NEXT:    blr
2202entry:
2203  %0 = load fp128, fp128* %a, align 16
2204  %conv = fptoui fp128 %0 to i128
2205  ret i128 %conv
2206}
2207
2208; Function Attrs: norecurse nounwind readonly
2209define i1 @qpConv2ui1(fp128* nocapture readonly %a) {
2210; CHECK-LABEL: qpConv2ui1:
2211; CHECK:       # %bb.0: # %entry
2212; CHECK-NEXT:    lxv v2, 0(r3)
2213; CHECK-NEXT:    xscvqpswz v2, v2
2214; CHECK-NEXT:    mfvsrwz r3, v2
2215; CHECK-NEXT:    blr
2216;
2217; CHECK-P8-LABEL: qpConv2ui1:
2218; CHECK-P8:       # %bb.0: # %entry
2219; CHECK-P8-NEXT:    mflr r0
2220; CHECK-P8-NEXT:    std r0, 16(r1)
2221; CHECK-P8-NEXT:    stdu r1, -32(r1)
2222; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
2223; CHECK-P8-NEXT:    .cfi_offset lr, 16
2224; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
2225; CHECK-P8-NEXT:    xxswapd v2, vs0
2226; CHECK-P8-NEXT:    bl __fixkfsi
2227; CHECK-P8-NEXT:    nop
2228; CHECK-P8-NEXT:    addi r1, r1, 32
2229; CHECK-P8-NEXT:    ld r0, 16(r1)
2230; CHECK-P8-NEXT:    mtlr r0
2231; CHECK-P8-NEXT:    blr
2232entry:
2233  %0 = load fp128, fp128* %a, align 16
2234  %conv = fptoui fp128 %0 to i1
2235  ret i1 %conv
2236}
2237
2238; Function Attrs: norecurse nounwind readonly
2239define i1 @qpConv2si1(fp128* nocapture readonly %a) {
2240; CHECK-LABEL: qpConv2si1:
2241; CHECK:       # %bb.0: # %entry
2242; CHECK-NEXT:    lxv v2, 0(r3)
2243; CHECK-NEXT:    xscvqpswz v2, v2
2244; CHECK-NEXT:    mfvsrwz r3, v2
2245; CHECK-NEXT:    blr
2246;
2247; CHECK-P8-LABEL: qpConv2si1:
2248; CHECK-P8:       # %bb.0: # %entry
2249; CHECK-P8-NEXT:    mflr r0
2250; CHECK-P8-NEXT:    std r0, 16(r1)
2251; CHECK-P8-NEXT:    stdu r1, -32(r1)
2252; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
2253; CHECK-P8-NEXT:    .cfi_offset lr, 16
2254; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
2255; CHECK-P8-NEXT:    xxswapd v2, vs0
2256; CHECK-P8-NEXT:    bl __fixkfsi
2257; CHECK-P8-NEXT:    nop
2258; CHECK-P8-NEXT:    addi r1, r1, 32
2259; CHECK-P8-NEXT:    ld r0, 16(r1)
2260; CHECK-P8-NEXT:    mtlr r0
2261; CHECK-P8-NEXT:    blr
2262entry:
2263  %0 = load fp128, fp128* %a, align 16
2264  %conv = fptosi fp128 %0 to i1
2265  ret i1 %conv
2266}
2267