xref: /llvm-project/llvm/test/CodeGen/PowerPC/f128-truncateNconv.ll (revision b922a3621116b404d868af8b74cab25ab78555be)
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:   -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s \
4; RUN:   | FileCheck %s
5; RUN: llc -relocation-model=pic -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown \
6; RUN:   -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s \
7; RUN:   | FileCheck %s -check-prefix=CHECK-P8
8
9@f128Array = global [4 x fp128] [fp128 0xL00000000000000004004C00000000000,
10                                 fp128 0xLF000000000000000400808AB851EB851,
11                                 fp128 0xL5000000000000000400E0C26324C8366,
12                                 fp128 0xL8000000000000000400A24E2E147AE14],
13                                align 16
14
15; Function Attrs: norecurse nounwind readonly
16define i64 @qpConv2sdw(ptr nocapture readonly %a) {
17; CHECK-LABEL: qpConv2sdw:
18; CHECK:       # %bb.0: # %entry
19; CHECK-NEXT:    lxv v2, 0(r3)
20; CHECK-NEXT:    xscvqpsdz v2, v2
21; CHECK-NEXT:    mfvsrd r3, v2
22; CHECK-NEXT:    blr
23;
24; CHECK-P8-LABEL: qpConv2sdw:
25; CHECK-P8:       # %bb.0: # %entry
26; CHECK-P8-NEXT:    mflr r0
27; CHECK-P8-NEXT:    stdu r1, -32(r1)
28; CHECK-P8-NEXT:    std r0, 48(r1)
29; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
30; CHECK-P8-NEXT:    .cfi_offset lr, 16
31; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
32; CHECK-P8-NEXT:    xxswapd v2, vs0
33; CHECK-P8-NEXT:    bl __fixkfdi
34; CHECK-P8-NEXT:    nop
35; CHECK-P8-NEXT:    addi r1, r1, 32
36; CHECK-P8-NEXT:    ld r0, 16(r1)
37; CHECK-P8-NEXT:    mtlr r0
38; CHECK-P8-NEXT:    blr
39entry:
40  %0 = load fp128, ptr %a, align 16
41  %conv = fptosi fp128 %0 to i64
42  ret i64 %conv
43
44}
45
46; Function Attrs: norecurse nounwind
47define void @qpConv2sdw_02(ptr nocapture %res) local_unnamed_addr #1 {
48; CHECK-LABEL: qpConv2sdw_02:
49; CHECK:       # %bb.0: # %entry
50; CHECK-NEXT:    addis r4, r2, .LC0@toc@ha
51; CHECK-NEXT:    ld r4, .LC0@toc@l(r4)
52; CHECK-NEXT:    lxv v2, 32(r4)
53; CHECK-NEXT:    xscvqpsdz v2, v2
54; CHECK-NEXT:    stxsd v2, 0(r3)
55; CHECK-NEXT:    blr
56;
57; CHECK-P8-LABEL: qpConv2sdw_02:
58; CHECK-P8:       # %bb.0: # %entry
59; CHECK-P8-NEXT:    mflr r0
60; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
61; CHECK-P8-NEXT:    .cfi_offset lr, 16
62; CHECK-P8-NEXT:    .cfi_offset r30, -16
63; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
64; CHECK-P8-NEXT:    stdu r1, -48(r1)
65; CHECK-P8-NEXT:    mr r30, r3
66; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
67; CHECK-P8-NEXT:    std r0, 64(r1)
68; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
69; CHECK-P8-NEXT:    addi r3, r3, 32
70; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
71; CHECK-P8-NEXT:    xxswapd v2, vs0
72; CHECK-P8-NEXT:    bl __fixkfdi
73; CHECK-P8-NEXT:    nop
74; CHECK-P8-NEXT:    std r3, 0(r30)
75; CHECK-P8-NEXT:    addi r1, r1, 48
76; CHECK-P8-NEXT:    ld r0, 16(r1)
77; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
78; CHECK-P8-NEXT:    mtlr r0
79; CHECK-P8-NEXT:    blr
80entry:
81  %0 = load fp128, ptr getelementptr inbounds
82                            ([4 x fp128], ptr @f128Array, i64 0,
83                             i64 2), align 16
84  %conv = fptosi fp128 %0 to i64
85  store i64 %conv, ptr %res, align 8
86  ret void
87
88}
89
90; Function Attrs: norecurse nounwind readonly
91define i64 @qpConv2sdw_03(ptr nocapture readonly %a) {
92; CHECK-LABEL: qpConv2sdw_03:
93; CHECK:       # %bb.0: # %entry
94; CHECK-NEXT:    lxv v2, 0(r3)
95; CHECK-NEXT:    addis r3, r2, .LC0@toc@ha
96; CHECK-NEXT:    ld r3, .LC0@toc@l(r3)
97; CHECK-NEXT:    lxv v3, 16(r3)
98; CHECK-NEXT:    xsaddqp v2, v2, v3
99; CHECK-NEXT:    xscvqpsdz v2, v2
100; CHECK-NEXT:    mfvsrd r3, v2
101; CHECK-NEXT:    blr
102;
103; CHECK-P8-LABEL: qpConv2sdw_03:
104; CHECK-P8:       # %bb.0: # %entry
105; CHECK-P8-NEXT:    mflr r0
106; CHECK-P8-NEXT:    stdu r1, -32(r1)
107; CHECK-P8-NEXT:    std r0, 48(r1)
108; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
109; CHECK-P8-NEXT:    .cfi_offset lr, 16
110; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
111; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
112; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
113; CHECK-P8-NEXT:    addi r3, r3, 16
114; CHECK-P8-NEXT:    xxswapd v2, vs0
115; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
116; CHECK-P8-NEXT:    xxswapd v3, vs0
117; CHECK-P8-NEXT:    bl __addkf3
118; CHECK-P8-NEXT:    nop
119; CHECK-P8-NEXT:    bl __fixkfdi
120; CHECK-P8-NEXT:    nop
121; CHECK-P8-NEXT:    addi r1, r1, 32
122; CHECK-P8-NEXT:    ld r0, 16(r1)
123; CHECK-P8-NEXT:    mtlr r0
124; CHECK-P8-NEXT:    blr
125entry:
126  %0 = load fp128, ptr %a, align 16
127  %1 = load fp128, ptr getelementptr inbounds
128                            ([4 x fp128], ptr @f128Array, i64 0,
129                             i64 1), align 16
130  %add = fadd fp128 %0, %1
131  %conv = fptosi fp128 %add to i64
132  ret i64 %conv
133
134}
135
136; Function Attrs: norecurse nounwind
137define void @qpConv2sdw_04(ptr nocapture readonly %a,
138; CHECK-LABEL: qpConv2sdw_04:
139; CHECK:       # %bb.0: # %entry
140; CHECK-NEXT:    lxv v2, 0(r3)
141; CHECK-NEXT:    lxv v3, 0(r4)
142; CHECK-NEXT:    xsaddqp v2, v2, v3
143; CHECK-NEXT:    xscvqpsdz v2, v2
144; CHECK-NEXT:    stxsd v2, 0(r5)
145; CHECK-NEXT:    blr
146;
147; CHECK-P8-LABEL: qpConv2sdw_04:
148; CHECK-P8:       # %bb.0: # %entry
149; CHECK-P8-NEXT:    mflr r0
150; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
151; CHECK-P8-NEXT:    .cfi_offset lr, 16
152; CHECK-P8-NEXT:    .cfi_offset r30, -16
153; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
154; CHECK-P8-NEXT:    stdu r1, -48(r1)
155; CHECK-P8-NEXT:    std r0, 64(r1)
156; CHECK-P8-NEXT:    mr r30, r5
157; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
158; CHECK-P8-NEXT:    xxswapd v2, vs0
159; CHECK-P8-NEXT:    lxvd2x vs0, 0, r4
160; CHECK-P8-NEXT:    xxswapd v3, vs0
161; CHECK-P8-NEXT:    bl __addkf3
162; CHECK-P8-NEXT:    nop
163; CHECK-P8-NEXT:    bl __fixkfdi
164; CHECK-P8-NEXT:    nop
165; CHECK-P8-NEXT:    std r3, 0(r30)
166; CHECK-P8-NEXT:    addi r1, r1, 48
167; CHECK-P8-NEXT:    ld r0, 16(r1)
168; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
169; CHECK-P8-NEXT:    mtlr r0
170; CHECK-P8-NEXT:    blr
171                           ptr nocapture readonly %b, ptr nocapture %res) {
172entry:
173  %0 = load fp128, ptr %a, align 16
174  %1 = load fp128, ptr %b, align 16
175  %add = fadd fp128 %0, %1
176  %conv = fptosi fp128 %add to i64
177  store i64 %conv, ptr %res, align 8
178  ret void
179
180}
181
182; Function Attrs: norecurse nounwind
183define void @qpConv2sdw_testXForm(ptr nocapture %res, i32 signext %idx) {
184; CHECK-LABEL: qpConv2sdw_testXForm:
185; CHECK:       # %bb.0: # %entry
186; CHECK-NEXT:    addis r5, r2, .LC0@toc@ha
187; CHECK-NEXT:    sldi r4, r4, 3
188; CHECK-NEXT:    ld r5, .LC0@toc@l(r5)
189; CHECK-NEXT:    lxv v2, 32(r5)
190; CHECK-NEXT:    xscvqpsdz v2, v2
191; CHECK-NEXT:    stxsdx v2, r3, r4
192; CHECK-NEXT:    blr
193;
194; CHECK-P8-LABEL: qpConv2sdw_testXForm:
195; CHECK-P8:       # %bb.0: # %entry
196; CHECK-P8-NEXT:    mflr r0
197; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
198; CHECK-P8-NEXT:    .cfi_offset lr, 16
199; CHECK-P8-NEXT:    .cfi_offset r29, -24
200; CHECK-P8-NEXT:    .cfi_offset r30, -16
201; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
202; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
203; CHECK-P8-NEXT:    stdu r1, -64(r1)
204; CHECK-P8-NEXT:    mr r29, r3
205; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
206; CHECK-P8-NEXT:    std r0, 80(r1)
207; CHECK-P8-NEXT:    mr r30, r4
208; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
209; CHECK-P8-NEXT:    addi r3, r3, 32
210; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
211; CHECK-P8-NEXT:    xxswapd v2, vs0
212; CHECK-P8-NEXT:    bl __fixkfdi
213; CHECK-P8-NEXT:    nop
214; CHECK-P8-NEXT:    sldi r4, r30, 3
215; CHECK-P8-NEXT:    stdx r3, r29, r4
216; CHECK-P8-NEXT:    addi r1, r1, 64
217; CHECK-P8-NEXT:    ld r0, 16(r1)
218; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
219; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
220; CHECK-P8-NEXT:    mtlr r0
221; CHECK-P8-NEXT:    blr
222entry:
223  %0 = load fp128, ptr getelementptr inbounds
224                            ([4 x fp128], ptr @f128Array,
225                             i64 0, i64 2), align 16
226  %conv = fptosi fp128 %0 to i64
227  %idxprom = sext i32 %idx to i64
228  %arrayidx = getelementptr inbounds i64, ptr %res, i64 %idxprom
229  store i64 %conv, ptr %arrayidx, align 8
230  ret void
231
232}
233
234; Function Attrs: norecurse nounwind readonly
235define i64 @qpConv2udw(ptr nocapture readonly %a) {
236; CHECK-LABEL: qpConv2udw:
237; CHECK:       # %bb.0: # %entry
238; CHECK-NEXT:    lxv v2, 0(r3)
239; CHECK-NEXT:    xscvqpudz v2, v2
240; CHECK-NEXT:    mfvsrd r3, v2
241; CHECK-NEXT:    blr
242;
243; CHECK-P8-LABEL: qpConv2udw:
244; CHECK-P8:       # %bb.0: # %entry
245; CHECK-P8-NEXT:    mflr r0
246; CHECK-P8-NEXT:    stdu r1, -32(r1)
247; CHECK-P8-NEXT:    std r0, 48(r1)
248; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
249; CHECK-P8-NEXT:    .cfi_offset lr, 16
250; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
251; CHECK-P8-NEXT:    xxswapd v2, vs0
252; CHECK-P8-NEXT:    bl __fixunskfdi
253; CHECK-P8-NEXT:    nop
254; CHECK-P8-NEXT:    addi r1, r1, 32
255; CHECK-P8-NEXT:    ld r0, 16(r1)
256; CHECK-P8-NEXT:    mtlr r0
257; CHECK-P8-NEXT:    blr
258entry:
259  %0 = load fp128, ptr %a, align 16
260  %conv = fptoui fp128 %0 to i64
261  ret i64 %conv
262
263}
264
265; Function Attrs: norecurse nounwind
266define void @qpConv2udw_02(ptr nocapture %res) {
267; CHECK-LABEL: qpConv2udw_02:
268; CHECK:       # %bb.0: # %entry
269; CHECK-NEXT:    addis r4, r2, .LC0@toc@ha
270; CHECK-NEXT:    ld r4, .LC0@toc@l(r4)
271; CHECK-NEXT:    lxv v2, 32(r4)
272; CHECK-NEXT:    xscvqpudz v2, v2
273; CHECK-NEXT:    stxsd v2, 0(r3)
274; CHECK-NEXT:    blr
275;
276; CHECK-P8-LABEL: qpConv2udw_02:
277; CHECK-P8:       # %bb.0: # %entry
278; CHECK-P8-NEXT:    mflr r0
279; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
280; CHECK-P8-NEXT:    .cfi_offset lr, 16
281; CHECK-P8-NEXT:    .cfi_offset r30, -16
282; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
283; CHECK-P8-NEXT:    stdu r1, -48(r1)
284; CHECK-P8-NEXT:    mr r30, r3
285; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
286; CHECK-P8-NEXT:    std r0, 64(r1)
287; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
288; CHECK-P8-NEXT:    addi r3, r3, 32
289; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
290; CHECK-P8-NEXT:    xxswapd v2, vs0
291; CHECK-P8-NEXT:    bl __fixunskfdi
292; CHECK-P8-NEXT:    nop
293; CHECK-P8-NEXT:    std r3, 0(r30)
294; CHECK-P8-NEXT:    addi r1, r1, 48
295; CHECK-P8-NEXT:    ld r0, 16(r1)
296; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
297; CHECK-P8-NEXT:    mtlr r0
298; CHECK-P8-NEXT:    blr
299entry:
300  %0 = load fp128, ptr getelementptr inbounds
301                            ([4 x fp128], ptr @f128Array, i64 0,
302                             i64 2), align 16
303  %conv = fptoui fp128 %0 to i64
304  store i64 %conv, ptr %res, align 8
305  ret void
306
307}
308
309; Function Attrs: norecurse nounwind readonly
310define i64 @qpConv2udw_03(ptr nocapture readonly %a) {
311; CHECK-LABEL: qpConv2udw_03:
312; CHECK:       # %bb.0: # %entry
313; CHECK-NEXT:    lxv v2, 0(r3)
314; CHECK-NEXT:    addis r3, r2, .LC0@toc@ha
315; CHECK-NEXT:    ld r3, .LC0@toc@l(r3)
316; CHECK-NEXT:    lxv v3, 16(r3)
317; CHECK-NEXT:    xsaddqp v2, v2, v3
318; CHECK-NEXT:    xscvqpudz v2, v2
319; CHECK-NEXT:    mfvsrd r3, v2
320; CHECK-NEXT:    blr
321;
322; CHECK-P8-LABEL: qpConv2udw_03:
323; CHECK-P8:       # %bb.0: # %entry
324; CHECK-P8-NEXT:    mflr r0
325; CHECK-P8-NEXT:    stdu r1, -32(r1)
326; CHECK-P8-NEXT:    std r0, 48(r1)
327; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
328; CHECK-P8-NEXT:    .cfi_offset lr, 16
329; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
330; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
331; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
332; CHECK-P8-NEXT:    addi r3, r3, 16
333; CHECK-P8-NEXT:    xxswapd v2, vs0
334; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
335; CHECK-P8-NEXT:    xxswapd v3, vs0
336; CHECK-P8-NEXT:    bl __addkf3
337; CHECK-P8-NEXT:    nop
338; CHECK-P8-NEXT:    bl __fixunskfdi
339; CHECK-P8-NEXT:    nop
340; CHECK-P8-NEXT:    addi r1, r1, 32
341; CHECK-P8-NEXT:    ld r0, 16(r1)
342; CHECK-P8-NEXT:    mtlr r0
343; CHECK-P8-NEXT:    blr
344entry:
345  %0 = load fp128, ptr %a, align 16
346  %1 = load fp128, ptr getelementptr inbounds
347                            ([4 x fp128], ptr @f128Array, i64 0,
348                             i64 1), align 16
349  %add = fadd fp128 %0, %1
350  %conv = fptoui fp128 %add to i64
351  ret i64 %conv
352
353}
354
355; Function Attrs: norecurse nounwind
356define void @qpConv2udw_04(ptr nocapture readonly %a,
357; CHECK-LABEL: qpConv2udw_04:
358; CHECK:       # %bb.0: # %entry
359; CHECK-NEXT:    lxv v2, 0(r3)
360; CHECK-NEXT:    lxv v3, 0(r4)
361; CHECK-NEXT:    xsaddqp v2, v2, v3
362; CHECK-NEXT:    xscvqpudz v2, v2
363; CHECK-NEXT:    stxsd v2, 0(r5)
364; CHECK-NEXT:    blr
365;
366; CHECK-P8-LABEL: qpConv2udw_04:
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:    stdu r1, -48(r1)
374; CHECK-P8-NEXT:    std r0, 64(r1)
375; CHECK-P8-NEXT:    mr r30, r5
376; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
377; CHECK-P8-NEXT:    xxswapd v2, vs0
378; CHECK-P8-NEXT:    lxvd2x vs0, 0, r4
379; CHECK-P8-NEXT:    xxswapd v3, vs0
380; CHECK-P8-NEXT:    bl __addkf3
381; CHECK-P8-NEXT:    nop
382; CHECK-P8-NEXT:    bl __fixunskfdi
383; CHECK-P8-NEXT:    nop
384; CHECK-P8-NEXT:    std r3, 0(r30)
385; CHECK-P8-NEXT:    addi r1, r1, 48
386; CHECK-P8-NEXT:    ld r0, 16(r1)
387; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
388; CHECK-P8-NEXT:    mtlr r0
389; CHECK-P8-NEXT:    blr
390                           ptr nocapture readonly %b, ptr nocapture %res) {
391entry:
392  %0 = load fp128, ptr %a, align 16
393  %1 = load fp128, ptr %b, align 16
394  %add = fadd fp128 %0, %1
395  %conv = fptoui fp128 %add to i64
396  store i64 %conv, ptr %res, align 8
397  ret void
398
399}
400
401; Function Attrs: norecurse nounwind
402define void @qpConv2udw_testXForm(ptr nocapture %res, i32 signext %idx) {
403; CHECK-LABEL: qpConv2udw_testXForm:
404; CHECK:       # %bb.0: # %entry
405; CHECK-NEXT:    addis r5, r2, .LC0@toc@ha
406; CHECK-NEXT:    sldi r4, r4, 3
407; CHECK-NEXT:    ld r5, .LC0@toc@l(r5)
408; CHECK-NEXT:    lxv v2, 0(r5)
409; CHECK-NEXT:    xscvqpudz v2, v2
410; CHECK-NEXT:    stxsdx v2, r3, r4
411; CHECK-NEXT:    blr
412;
413; CHECK-P8-LABEL: qpConv2udw_testXForm:
414; CHECK-P8:       # %bb.0: # %entry
415; CHECK-P8-NEXT:    mflr r0
416; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
417; CHECK-P8-NEXT:    .cfi_offset lr, 16
418; CHECK-P8-NEXT:    .cfi_offset r29, -24
419; CHECK-P8-NEXT:    .cfi_offset r30, -16
420; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
421; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
422; CHECK-P8-NEXT:    stdu r1, -64(r1)
423; CHECK-P8-NEXT:    mr r29, r3
424; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
425; CHECK-P8-NEXT:    std r0, 80(r1)
426; CHECK-P8-NEXT:    mr r30, r4
427; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
428; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
429; CHECK-P8-NEXT:    xxswapd v2, vs0
430; CHECK-P8-NEXT:    bl __fixunskfdi
431; CHECK-P8-NEXT:    nop
432; CHECK-P8-NEXT:    sldi r4, r30, 3
433; CHECK-P8-NEXT:    stdx r3, r29, r4
434; CHECK-P8-NEXT:    addi r1, r1, 64
435; CHECK-P8-NEXT:    ld r0, 16(r1)
436; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
437; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
438; CHECK-P8-NEXT:    mtlr r0
439; CHECK-P8-NEXT:    blr
440entry:
441  %0 = load fp128, ptr @f128Array, align 16
442  %conv = fptoui fp128 %0 to i64
443  %idxprom = sext i32 %idx to i64
444  %arrayidx = getelementptr inbounds i64, ptr %res, i64 %idxprom
445  store i64 %conv, ptr %arrayidx, align 8
446  ret void
447
448}
449
450; Function Attrs: norecurse nounwind readonly
451define signext i32 @qpConv2sw(ptr nocapture readonly %a)  {
452; CHECK-LABEL: qpConv2sw:
453; CHECK:       # %bb.0: # %entry
454; CHECK-NEXT:    lxv v2, 0(r3)
455; CHECK-NEXT:    xscvqpswz v2, v2
456; CHECK-NEXT:    mfvsrwz r3, v2
457; CHECK-NEXT:    extsw r3, r3
458; CHECK-NEXT:    blr
459;
460; CHECK-P8-LABEL: qpConv2sw:
461; CHECK-P8:       # %bb.0: # %entry
462; CHECK-P8-NEXT:    mflr r0
463; CHECK-P8-NEXT:    stdu r1, -32(r1)
464; CHECK-P8-NEXT:    std r0, 48(r1)
465; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
466; CHECK-P8-NEXT:    .cfi_offset lr, 16
467; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
468; CHECK-P8-NEXT:    xxswapd v2, vs0
469; CHECK-P8-NEXT:    bl __fixkfsi
470; CHECK-P8-NEXT:    nop
471; CHECK-P8-NEXT:    extsw r3, r3
472; CHECK-P8-NEXT:    addi r1, r1, 32
473; CHECK-P8-NEXT:    ld r0, 16(r1)
474; CHECK-P8-NEXT:    mtlr r0
475; CHECK-P8-NEXT:    blr
476entry:
477  %0 = load fp128, ptr %a, align 16
478  %conv = fptosi fp128 %0 to i32
479  ret i32 %conv
480
481}
482
483; Function Attrs: norecurse nounwind
484define void @qpConv2sw_02(ptr nocapture %res) {
485; CHECK-LABEL: qpConv2sw_02:
486; CHECK:       # %bb.0: # %entry
487; CHECK-NEXT:    addis r4, r2, .LC0@toc@ha
488; CHECK-NEXT:    ld r4, .LC0@toc@l(r4)
489; CHECK-NEXT:    lxv v2, 32(r4)
490; CHECK-NEXT:    xscvqpswz v2, v2
491; CHECK-NEXT:    stxsiwx v2, 0, r3
492; CHECK-NEXT:    blr
493;
494; CHECK-P8-LABEL: qpConv2sw_02:
495; CHECK-P8:       # %bb.0: # %entry
496; CHECK-P8-NEXT:    mflr r0
497; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
498; CHECK-P8-NEXT:    .cfi_offset lr, 16
499; CHECK-P8-NEXT:    .cfi_offset r30, -16
500; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
501; CHECK-P8-NEXT:    stdu r1, -48(r1)
502; CHECK-P8-NEXT:    mr r30, r3
503; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
504; CHECK-P8-NEXT:    std r0, 64(r1)
505; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
506; CHECK-P8-NEXT:    addi r3, r3, 32
507; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
508; CHECK-P8-NEXT:    xxswapd v2, vs0
509; CHECK-P8-NEXT:    bl __fixkfsi
510; CHECK-P8-NEXT:    nop
511; CHECK-P8-NEXT:    stw r3, 0(r30)
512; CHECK-P8-NEXT:    addi r1, r1, 48
513; CHECK-P8-NEXT:    ld r0, 16(r1)
514; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
515; CHECK-P8-NEXT:    mtlr r0
516; CHECK-P8-NEXT:    blr
517entry:
518  %0 = load fp128, ptr getelementptr inbounds
519                            ([4 x fp128], ptr @f128Array, i64 0,
520                             i64 2), align 16
521  %conv = fptosi fp128 %0 to i32
522  store i32 %conv, ptr %res, align 4
523  ret void
524
525}
526
527; Function Attrs: norecurse nounwind readonly
528define signext i32 @qpConv2sw_03(ptr nocapture readonly %a)  {
529; CHECK-LABEL: qpConv2sw_03:
530; CHECK:       # %bb.0: # %entry
531; CHECK-NEXT:    lxv v2, 0(r3)
532; CHECK-NEXT:    addis r3, r2, .LC0@toc@ha
533; CHECK-NEXT:    ld r3, .LC0@toc@l(r3)
534; CHECK-NEXT:    lxv v3, 16(r3)
535; CHECK-NEXT:    xsaddqp v2, v2, v3
536; CHECK-NEXT:    xscvqpswz v2, v2
537; CHECK-NEXT:    mfvsrwz r3, v2
538; CHECK-NEXT:    extsw r3, r3
539; CHECK-NEXT:    blr
540;
541; CHECK-P8-LABEL: qpConv2sw_03:
542; CHECK-P8:       # %bb.0: # %entry
543; CHECK-P8-NEXT:    mflr r0
544; CHECK-P8-NEXT:    stdu r1, -32(r1)
545; CHECK-P8-NEXT:    std r0, 48(r1)
546; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
547; CHECK-P8-NEXT:    .cfi_offset lr, 16
548; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
549; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
550; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
551; CHECK-P8-NEXT:    addi r3, r3, 16
552; CHECK-P8-NEXT:    xxswapd v2, vs0
553; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
554; CHECK-P8-NEXT:    xxswapd v3, vs0
555; CHECK-P8-NEXT:    bl __addkf3
556; CHECK-P8-NEXT:    nop
557; CHECK-P8-NEXT:    bl __fixkfsi
558; CHECK-P8-NEXT:    nop
559; CHECK-P8-NEXT:    extsw r3, r3
560; CHECK-P8-NEXT:    addi r1, r1, 32
561; CHECK-P8-NEXT:    ld r0, 16(r1)
562; CHECK-P8-NEXT:    mtlr r0
563; CHECK-P8-NEXT:    blr
564entry:
565  %0 = load fp128, ptr %a, align 16
566  %1 = load fp128, ptr getelementptr inbounds
567                            ([4 x fp128], ptr @f128Array, i64 0,
568                             i64 1), align 16
569  %add = fadd fp128 %0, %1
570  %conv = fptosi fp128 %add to i32
571  ret i32 %conv
572
573}
574
575; Function Attrs: norecurse nounwind
576define void @qpConv2sw_04(ptr nocapture readonly %a,
577; CHECK-LABEL: qpConv2sw_04:
578; CHECK:       # %bb.0: # %entry
579; CHECK-NEXT:    lxv v2, 0(r3)
580; CHECK-NEXT:    lxv v3, 0(r4)
581; CHECK-NEXT:    xsaddqp v2, v2, v3
582; CHECK-NEXT:    xscvqpswz v2, v2
583; CHECK-NEXT:    stxsiwx v2, 0, r5
584; CHECK-NEXT:    blr
585;
586; CHECK-P8-LABEL: qpConv2sw_04:
587; CHECK-P8:       # %bb.0: # %entry
588; CHECK-P8-NEXT:    mflr r0
589; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
590; CHECK-P8-NEXT:    .cfi_offset lr, 16
591; CHECK-P8-NEXT:    .cfi_offset r30, -16
592; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
593; CHECK-P8-NEXT:    stdu r1, -48(r1)
594; CHECK-P8-NEXT:    std r0, 64(r1)
595; CHECK-P8-NEXT:    mr r30, r5
596; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
597; CHECK-P8-NEXT:    xxswapd v2, vs0
598; CHECK-P8-NEXT:    lxvd2x vs0, 0, r4
599; CHECK-P8-NEXT:    xxswapd v3, vs0
600; CHECK-P8-NEXT:    bl __addkf3
601; CHECK-P8-NEXT:    nop
602; CHECK-P8-NEXT:    bl __fixkfsi
603; CHECK-P8-NEXT:    nop
604; CHECK-P8-NEXT:    stw r3, 0(r30)
605; CHECK-P8-NEXT:    addi r1, r1, 48
606; CHECK-P8-NEXT:    ld r0, 16(r1)
607; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
608; CHECK-P8-NEXT:    mtlr r0
609; CHECK-P8-NEXT:    blr
610                          ptr nocapture readonly %b, ptr nocapture %res) {
611entry:
612  %0 = load fp128, ptr %a, align 16
613  %1 = load fp128, ptr %b, align 16
614  %add = fadd fp128 %0, %1
615  %conv = fptosi fp128 %add to i32
616  store i32 %conv, ptr %res, align 4
617  ret void
618
619}
620
621; Function Attrs: norecurse nounwind readonly
622define zeroext i32 @qpConv2uw(ptr nocapture readonly %a)  {
623; CHECK-LABEL: qpConv2uw:
624; CHECK:       # %bb.0: # %entry
625; CHECK-NEXT:    lxv v2, 0(r3)
626; CHECK-NEXT:    xscvqpuwz v2, v2
627; CHECK-NEXT:    mfvsrwz r3, v2
628; CHECK-NEXT:    blr
629;
630; CHECK-P8-LABEL: qpConv2uw:
631; CHECK-P8:       # %bb.0: # %entry
632; CHECK-P8-NEXT:    mflr r0
633; CHECK-P8-NEXT:    stdu r1, -32(r1)
634; CHECK-P8-NEXT:    std r0, 48(r1)
635; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
636; CHECK-P8-NEXT:    .cfi_offset lr, 16
637; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
638; CHECK-P8-NEXT:    xxswapd v2, vs0
639; CHECK-P8-NEXT:    bl __fixunskfsi
640; CHECK-P8-NEXT:    nop
641; CHECK-P8-NEXT:    addi r1, r1, 32
642; CHECK-P8-NEXT:    ld r0, 16(r1)
643; CHECK-P8-NEXT:    mtlr r0
644; CHECK-P8-NEXT:    blr
645entry:
646  %0 = load fp128, ptr %a, align 16
647  %conv = fptoui fp128 %0 to i32
648  ret i32 %conv
649
650}
651
652; Function Attrs: norecurse nounwind
653define void @qpConv2uw_02(ptr nocapture %res) {
654; CHECK-LABEL: qpConv2uw_02:
655; CHECK:       # %bb.0: # %entry
656; CHECK-NEXT:    addis r4, r2, .LC0@toc@ha
657; CHECK-NEXT:    ld r4, .LC0@toc@l(r4)
658; CHECK-NEXT:    lxv v2, 32(r4)
659; CHECK-NEXT:    xscvqpuwz v2, v2
660; CHECK-NEXT:    stxsiwx v2, 0, r3
661; CHECK-NEXT:    blr
662;
663; CHECK-P8-LABEL: qpConv2uw_02:
664; CHECK-P8:       # %bb.0: # %entry
665; CHECK-P8-NEXT:    mflr r0
666; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
667; CHECK-P8-NEXT:    .cfi_offset lr, 16
668; CHECK-P8-NEXT:    .cfi_offset r30, -16
669; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
670; CHECK-P8-NEXT:    stdu r1, -48(r1)
671; CHECK-P8-NEXT:    mr r30, r3
672; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
673; CHECK-P8-NEXT:    std r0, 64(r1)
674; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
675; CHECK-P8-NEXT:    addi r3, r3, 32
676; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
677; CHECK-P8-NEXT:    xxswapd v2, vs0
678; CHECK-P8-NEXT:    bl __fixunskfsi
679; CHECK-P8-NEXT:    nop
680; CHECK-P8-NEXT:    stw r3, 0(r30)
681; CHECK-P8-NEXT:    addi r1, r1, 48
682; CHECK-P8-NEXT:    ld r0, 16(r1)
683; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
684; CHECK-P8-NEXT:    mtlr r0
685; CHECK-P8-NEXT:    blr
686entry:
687  %0 = load fp128, ptr getelementptr inbounds
688                            ([4 x fp128], ptr @f128Array, i64 0,
689                             i64 2), align 16
690  %conv = fptoui fp128 %0 to i32
691  store i32 %conv, ptr %res, align 4
692  ret void
693
694}
695
696; Function Attrs: norecurse nounwind readonly
697define zeroext i32 @qpConv2uw_03(ptr nocapture readonly %a)  {
698; CHECK-LABEL: qpConv2uw_03:
699; CHECK:       # %bb.0: # %entry
700; CHECK-NEXT:    lxv v2, 0(r3)
701; CHECK-NEXT:    addis r3, r2, .LC0@toc@ha
702; CHECK-NEXT:    ld r3, .LC0@toc@l(r3)
703; CHECK-NEXT:    lxv v3, 16(r3)
704; CHECK-NEXT:    xsaddqp v2, v2, v3
705; CHECK-NEXT:    xscvqpuwz v2, v2
706; CHECK-NEXT:    mfvsrwz r3, v2
707; CHECK-NEXT:    blr
708;
709; CHECK-P8-LABEL: qpConv2uw_03:
710; CHECK-P8:       # %bb.0: # %entry
711; CHECK-P8-NEXT:    mflr r0
712; CHECK-P8-NEXT:    stdu r1, -32(r1)
713; CHECK-P8-NEXT:    std r0, 48(r1)
714; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
715; CHECK-P8-NEXT:    .cfi_offset lr, 16
716; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
717; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
718; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
719; CHECK-P8-NEXT:    addi r3, r3, 16
720; CHECK-P8-NEXT:    xxswapd v2, vs0
721; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
722; CHECK-P8-NEXT:    xxswapd v3, vs0
723; CHECK-P8-NEXT:    bl __addkf3
724; CHECK-P8-NEXT:    nop
725; CHECK-P8-NEXT:    bl __fixunskfsi
726; CHECK-P8-NEXT:    nop
727; CHECK-P8-NEXT:    addi r1, r1, 32
728; CHECK-P8-NEXT:    ld r0, 16(r1)
729; CHECK-P8-NEXT:    mtlr r0
730; CHECK-P8-NEXT:    blr
731entry:
732  %0 = load fp128, ptr %a, align 16
733  %1 = load fp128, ptr getelementptr inbounds
734                            ([4 x fp128], ptr @f128Array, i64 0,
735                             i64 1), align 16
736  %add = fadd fp128 %0, %1
737  %conv = fptoui fp128 %add to i32
738  ret i32 %conv
739
740}
741
742; Function Attrs: norecurse nounwind
743define void @qpConv2uw_04(ptr nocapture readonly %a,
744; CHECK-LABEL: qpConv2uw_04:
745; CHECK:       # %bb.0: # %entry
746; CHECK-NEXT:    lxv v2, 0(r3)
747; CHECK-NEXT:    lxv v3, 0(r4)
748; CHECK-NEXT:    xsaddqp v2, v2, v3
749; CHECK-NEXT:    xscvqpuwz v2, v2
750; CHECK-NEXT:    stxsiwx v2, 0, r5
751; CHECK-NEXT:    blr
752;
753; CHECK-P8-LABEL: qpConv2uw_04:
754; CHECK-P8:       # %bb.0: # %entry
755; CHECK-P8-NEXT:    mflr r0
756; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
757; CHECK-P8-NEXT:    .cfi_offset lr, 16
758; CHECK-P8-NEXT:    .cfi_offset r30, -16
759; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
760; CHECK-P8-NEXT:    stdu r1, -48(r1)
761; CHECK-P8-NEXT:    std r0, 64(r1)
762; CHECK-P8-NEXT:    mr r30, r5
763; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
764; CHECK-P8-NEXT:    xxswapd v2, vs0
765; CHECK-P8-NEXT:    lxvd2x vs0, 0, r4
766; CHECK-P8-NEXT:    xxswapd v3, vs0
767; CHECK-P8-NEXT:    bl __addkf3
768; CHECK-P8-NEXT:    nop
769; CHECK-P8-NEXT:    bl __fixunskfsi
770; CHECK-P8-NEXT:    nop
771; CHECK-P8-NEXT:    stw r3, 0(r30)
772; CHECK-P8-NEXT:    addi r1, r1, 48
773; CHECK-P8-NEXT:    ld r0, 16(r1)
774; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
775; CHECK-P8-NEXT:    mtlr r0
776; CHECK-P8-NEXT:    blr
777                          ptr nocapture readonly %b, ptr nocapture %res) {
778entry:
779  %0 = load fp128, ptr %a, align 16
780  %1 = load fp128, ptr %b, align 16
781  %add = fadd fp128 %0, %1
782  %conv = fptoui fp128 %add to i32
783  store i32 %conv, ptr %res, align 4
784  ret void
785
786}
787
788
789; Function Attrs: norecurse nounwind readonly
790define signext i16 @qpConv2shw(ptr nocapture readonly %a) {
791; CHECK-LABEL: qpConv2shw:
792; CHECK:       # %bb.0: # %entry
793; CHECK-NEXT:    lxv v2, 0(r3)
794; CHECK-NEXT:    xscvqpswz v2, v2
795; CHECK-NEXT:    mfvsrwz r3, v2
796; CHECK-NEXT:    extsw r3, r3
797; CHECK-NEXT:    blr
798;
799; CHECK-P8-LABEL: qpConv2shw:
800; CHECK-P8:       # %bb.0: # %entry
801; CHECK-P8-NEXT:    mflr r0
802; CHECK-P8-NEXT:    stdu r1, -32(r1)
803; CHECK-P8-NEXT:    std r0, 48(r1)
804; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
805; CHECK-P8-NEXT:    .cfi_offset lr, 16
806; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
807; CHECK-P8-NEXT:    xxswapd v2, vs0
808; CHECK-P8-NEXT:    bl __fixkfsi
809; CHECK-P8-NEXT:    nop
810; CHECK-P8-NEXT:    extsw r3, r3
811; CHECK-P8-NEXT:    addi r1, r1, 32
812; CHECK-P8-NEXT:    ld r0, 16(r1)
813; CHECK-P8-NEXT:    mtlr r0
814; CHECK-P8-NEXT:    blr
815entry:
816  %0 = load fp128, ptr %a, align 16
817  %conv = fptosi fp128 %0 to i16
818  ret i16 %conv
819}
820
821; Function Attrs: norecurse nounwind
822define void @qpConv2shw_02(ptr nocapture %res) {
823; CHECK-LABEL: qpConv2shw_02:
824; CHECK:       # %bb.0: # %entry
825; CHECK-NEXT:    addis r4, r2, .LC0@toc@ha
826; CHECK-NEXT:    ld r4, .LC0@toc@l(r4)
827; CHECK-NEXT:    lxv v2, 32(r4)
828; CHECK-NEXT:    xscvqpsdz v2, v2
829; CHECK-NEXT:    stxsihx v2, 0, r3
830; CHECK-NEXT:    blr
831;
832; CHECK-P8-LABEL: qpConv2shw_02:
833; CHECK-P8:       # %bb.0: # %entry
834; CHECK-P8-NEXT:    mflr r0
835; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
836; CHECK-P8-NEXT:    .cfi_offset lr, 16
837; CHECK-P8-NEXT:    .cfi_offset r30, -16
838; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
839; CHECK-P8-NEXT:    stdu r1, -48(r1)
840; CHECK-P8-NEXT:    mr r30, r3
841; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
842; CHECK-P8-NEXT:    std r0, 64(r1)
843; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
844; CHECK-P8-NEXT:    addi r3, r3, 32
845; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
846; CHECK-P8-NEXT:    xxswapd v2, vs0
847; CHECK-P8-NEXT:    bl __fixkfsi
848; CHECK-P8-NEXT:    nop
849; CHECK-P8-NEXT:    sth r3, 0(r30)
850; CHECK-P8-NEXT:    addi r1, r1, 48
851; CHECK-P8-NEXT:    ld r0, 16(r1)
852; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
853; CHECK-P8-NEXT:    mtlr r0
854; CHECK-P8-NEXT:    blr
855entry:
856  %0 = load fp128, ptr getelementptr inbounds
857                            ([4 x fp128], ptr @f128Array,
858                             i64 0, i64 2), align 16
859  %conv = fptosi fp128 %0 to i16
860  store i16 %conv, ptr %res, align 2
861  ret void
862}
863
864; Function Attrs: norecurse nounwind readonly
865define signext i16 @qpConv2shw_03(ptr nocapture readonly %a) {
866; CHECK-LABEL: qpConv2shw_03:
867; CHECK:       # %bb.0: # %entry
868; CHECK-NEXT:    lxv v2, 0(r3)
869; CHECK-NEXT:    addis r3, r2, .LC0@toc@ha
870; CHECK-NEXT:    ld r3, .LC0@toc@l(r3)
871; CHECK-NEXT:    lxv v3, 16(r3)
872; CHECK-NEXT:    xsaddqp v2, v2, v3
873; CHECK-NEXT:    xscvqpswz v2, v2
874; CHECK-NEXT:    mfvsrwz r3, v2
875; CHECK-NEXT:    extsw r3, r3
876; CHECK-NEXT:    blr
877;
878; CHECK-P8-LABEL: qpConv2shw_03:
879; CHECK-P8:       # %bb.0: # %entry
880; CHECK-P8-NEXT:    mflr r0
881; CHECK-P8-NEXT:    stdu r1, -32(r1)
882; CHECK-P8-NEXT:    std r0, 48(r1)
883; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
884; CHECK-P8-NEXT:    .cfi_offset lr, 16
885; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
886; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
887; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
888; CHECK-P8-NEXT:    addi r3, r3, 16
889; CHECK-P8-NEXT:    xxswapd v2, vs0
890; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
891; CHECK-P8-NEXT:    xxswapd v3, vs0
892; CHECK-P8-NEXT:    bl __addkf3
893; CHECK-P8-NEXT:    nop
894; CHECK-P8-NEXT:    bl __fixkfsi
895; CHECK-P8-NEXT:    nop
896; CHECK-P8-NEXT:    extsw r3, r3
897; CHECK-P8-NEXT:    addi r1, r1, 32
898; CHECK-P8-NEXT:    ld r0, 16(r1)
899; CHECK-P8-NEXT:    mtlr r0
900; CHECK-P8-NEXT:    blr
901entry:
902  %0 = load fp128, ptr %a, align 16
903  %1 = load fp128, ptr getelementptr inbounds
904                            ([4 x fp128], ptr @f128Array,
905                             i64 0, i64 1), align 16
906  %add = fadd fp128 %0, %1
907  %conv = fptosi fp128 %add to i16
908  ret i16 %conv
909}
910
911; Function Attrs: norecurse nounwind
912define void @qpConv2shw_04(ptr nocapture readonly %a,
913; CHECK-LABEL: qpConv2shw_04:
914; CHECK:       # %bb.0: # %entry
915; CHECK-NEXT:    lxv v2, 0(r3)
916; CHECK-NEXT:    lxv v3, 0(r4)
917; CHECK-NEXT:    xsaddqp v2, v2, v3
918; CHECK-NEXT:    xscvqpsdz v2, v2
919; CHECK-NEXT:    stxsihx v2, 0, r5
920; CHECK-NEXT:    blr
921;
922; CHECK-P8-LABEL: qpConv2shw_04:
923; CHECK-P8:       # %bb.0: # %entry
924; CHECK-P8-NEXT:    mflr r0
925; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
926; CHECK-P8-NEXT:    .cfi_offset lr, 16
927; CHECK-P8-NEXT:    .cfi_offset r30, -16
928; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
929; CHECK-P8-NEXT:    stdu r1, -48(r1)
930; CHECK-P8-NEXT:    std r0, 64(r1)
931; CHECK-P8-NEXT:    mr r30, r5
932; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
933; CHECK-P8-NEXT:    xxswapd v2, vs0
934; CHECK-P8-NEXT:    lxvd2x vs0, 0, r4
935; CHECK-P8-NEXT:    xxswapd v3, vs0
936; CHECK-P8-NEXT:    bl __addkf3
937; CHECK-P8-NEXT:    nop
938; CHECK-P8-NEXT:    bl __fixkfsi
939; CHECK-P8-NEXT:    nop
940; CHECK-P8-NEXT:    sth r3, 0(r30)
941; CHECK-P8-NEXT:    addi r1, r1, 48
942; CHECK-P8-NEXT:    ld r0, 16(r1)
943; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
944; CHECK-P8-NEXT:    mtlr r0
945; CHECK-P8-NEXT:    blr
946                           ptr nocapture readonly %b, ptr nocapture %res) {
947entry:
948  %0 = load fp128, ptr %a, align 16
949  %1 = load fp128, ptr %b, align 16
950  %add = fadd fp128 %0, %1
951  %conv = fptosi fp128 %add to i16
952  store i16 %conv, ptr %res, align 2
953  ret void
954}
955
956; Function Attrs: norecurse nounwind readonly
957define zeroext i16 @qpConv2uhw(ptr nocapture readonly %a) {
958; CHECK-LABEL: qpConv2uhw:
959; CHECK:       # %bb.0: # %entry
960; CHECK-NEXT:    lxv v2, 0(r3)
961; CHECK-NEXT:    xscvqpswz v2, v2
962; CHECK-NEXT:    mfvsrwz r3, v2
963; CHECK-NEXT:    blr
964;
965; CHECK-P8-LABEL: qpConv2uhw:
966; CHECK-P8:       # %bb.0: # %entry
967; CHECK-P8-NEXT:    mflr r0
968; CHECK-P8-NEXT:    stdu r1, -32(r1)
969; CHECK-P8-NEXT:    std r0, 48(r1)
970; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
971; CHECK-P8-NEXT:    .cfi_offset lr, 16
972; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
973; CHECK-P8-NEXT:    xxswapd v2, vs0
974; CHECK-P8-NEXT:    bl __fixkfsi
975; CHECK-P8-NEXT:    nop
976; CHECK-P8-NEXT:    addi r1, r1, 32
977; CHECK-P8-NEXT:    ld r0, 16(r1)
978; CHECK-P8-NEXT:    mtlr r0
979; CHECK-P8-NEXT:    blr
980entry:
981  %0 = load fp128, ptr %a, align 16
982  %conv = fptoui fp128 %0 to i16
983  ret i16 %conv
984}
985
986; Function Attrs: norecurse nounwind
987define void @qpConv2uhw_02(ptr nocapture %res) {
988; CHECK-LABEL: qpConv2uhw_02:
989; CHECK:       # %bb.0: # %entry
990; CHECK-NEXT:    addis r4, r2, .LC0@toc@ha
991; CHECK-NEXT:    ld r4, .LC0@toc@l(r4)
992; CHECK-NEXT:    lxv v2, 32(r4)
993; CHECK-NEXT:    xscvqpudz v2, v2
994; CHECK-NEXT:    stxsihx v2, 0, r3
995; CHECK-NEXT:    blr
996;
997; CHECK-P8-LABEL: qpConv2uhw_02:
998; CHECK-P8:       # %bb.0: # %entry
999; CHECK-P8-NEXT:    mflr r0
1000; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1001; CHECK-P8-NEXT:    .cfi_offset lr, 16
1002; CHECK-P8-NEXT:    .cfi_offset r30, -16
1003; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1004; CHECK-P8-NEXT:    stdu r1, -48(r1)
1005; CHECK-P8-NEXT:    mr r30, r3
1006; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
1007; CHECK-P8-NEXT:    std r0, 64(r1)
1008; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
1009; CHECK-P8-NEXT:    addi r3, r3, 32
1010; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1011; CHECK-P8-NEXT:    xxswapd v2, vs0
1012; CHECK-P8-NEXT:    bl __fixkfsi
1013; CHECK-P8-NEXT:    nop
1014; CHECK-P8-NEXT:    sth r3, 0(r30)
1015; CHECK-P8-NEXT:    addi r1, r1, 48
1016; CHECK-P8-NEXT:    ld r0, 16(r1)
1017; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1018; CHECK-P8-NEXT:    mtlr r0
1019; CHECK-P8-NEXT:    blr
1020entry:
1021  %0 = load fp128, ptr getelementptr inbounds
1022                            ([4 x fp128], ptr @f128Array,
1023                             i64 0, i64 2), align 16
1024  %conv = fptoui fp128 %0 to i16
1025  store i16 %conv, ptr %res, align 2
1026  ret void
1027}
1028
1029; Function Attrs: norecurse nounwind readonly
1030define zeroext i16 @qpConv2uhw_03(ptr nocapture readonly %a) {
1031; CHECK-LABEL: qpConv2uhw_03:
1032; CHECK:       # %bb.0: # %entry
1033; CHECK-NEXT:    lxv v2, 0(r3)
1034; CHECK-NEXT:    addis r3, r2, .LC0@toc@ha
1035; CHECK-NEXT:    ld r3, .LC0@toc@l(r3)
1036; CHECK-NEXT:    lxv v3, 16(r3)
1037; CHECK-NEXT:    xsaddqp v2, v2, v3
1038; CHECK-NEXT:    xscvqpswz v2, v2
1039; CHECK-NEXT:    mfvsrwz r3, v2
1040; CHECK-NEXT:    blr
1041;
1042; CHECK-P8-LABEL: qpConv2uhw_03:
1043; CHECK-P8:       # %bb.0: # %entry
1044; CHECK-P8-NEXT:    mflr r0
1045; CHECK-P8-NEXT:    stdu r1, -32(r1)
1046; CHECK-P8-NEXT:    std r0, 48(r1)
1047; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
1048; CHECK-P8-NEXT:    .cfi_offset lr, 16
1049; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1050; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
1051; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
1052; CHECK-P8-NEXT:    addi r3, r3, 16
1053; CHECK-P8-NEXT:    xxswapd v2, vs0
1054; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1055; CHECK-P8-NEXT:    xxswapd v3, vs0
1056; CHECK-P8-NEXT:    bl __addkf3
1057; CHECK-P8-NEXT:    nop
1058; CHECK-P8-NEXT:    bl __fixkfsi
1059; CHECK-P8-NEXT:    nop
1060; CHECK-P8-NEXT:    addi r1, r1, 32
1061; CHECK-P8-NEXT:    ld r0, 16(r1)
1062; CHECK-P8-NEXT:    mtlr r0
1063; CHECK-P8-NEXT:    blr
1064entry:
1065  %0 = load fp128, ptr %a, align 16
1066  %1 = load fp128, ptr getelementptr inbounds
1067                            ([4 x fp128], ptr @f128Array,
1068                             i64 0, i64 1), align 16
1069  %add = fadd fp128 %0, %1
1070  %conv = fptoui fp128 %add to i16
1071  ret i16 %conv
1072}
1073
1074; Function Attrs: norecurse nounwind
1075define void @qpConv2uhw_04(ptr nocapture readonly %a,
1076; CHECK-LABEL: qpConv2uhw_04:
1077; CHECK:       # %bb.0: # %entry
1078; CHECK-NEXT:    lxv v2, 0(r3)
1079; CHECK-NEXT:    lxv v3, 0(r4)
1080; CHECK-NEXT:    xsaddqp v2, v2, v3
1081; CHECK-NEXT:    xscvqpudz v2, v2
1082; CHECK-NEXT:    stxsihx v2, 0, r5
1083; CHECK-NEXT:    blr
1084;
1085; CHECK-P8-LABEL: qpConv2uhw_04:
1086; CHECK-P8:       # %bb.0: # %entry
1087; CHECK-P8-NEXT:    mflr r0
1088; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1089; CHECK-P8-NEXT:    .cfi_offset lr, 16
1090; CHECK-P8-NEXT:    .cfi_offset r30, -16
1091; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1092; CHECK-P8-NEXT:    stdu r1, -48(r1)
1093; CHECK-P8-NEXT:    std r0, 64(r1)
1094; CHECK-P8-NEXT:    mr r30, r5
1095; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1096; CHECK-P8-NEXT:    xxswapd v2, vs0
1097; CHECK-P8-NEXT:    lxvd2x vs0, 0, r4
1098; CHECK-P8-NEXT:    xxswapd v3, vs0
1099; CHECK-P8-NEXT:    bl __addkf3
1100; CHECK-P8-NEXT:    nop
1101; CHECK-P8-NEXT:    bl __fixkfsi
1102; CHECK-P8-NEXT:    nop
1103; CHECK-P8-NEXT:    sth r3, 0(r30)
1104; CHECK-P8-NEXT:    addi r1, r1, 48
1105; CHECK-P8-NEXT:    ld r0, 16(r1)
1106; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1107; CHECK-P8-NEXT:    mtlr r0
1108; CHECK-P8-NEXT:    blr
1109                           ptr nocapture readonly %b, ptr nocapture %res) {
1110entry:
1111  %0 = load fp128, ptr %a, align 16
1112  %1 = load fp128, ptr %b, align 16
1113  %add = fadd fp128 %0, %1
1114  %conv = fptoui fp128 %add to i16
1115  store i16 %conv, ptr %res, align 2
1116  ret void
1117}
1118
1119; Function Attrs: norecurse nounwind readonly
1120define signext i8 @qpConv2sb(ptr nocapture readonly %a) {
1121; CHECK-LABEL: qpConv2sb:
1122; CHECK:       # %bb.0: # %entry
1123; CHECK-NEXT:    lxv v2, 0(r3)
1124; CHECK-NEXT:    xscvqpswz v2, v2
1125; CHECK-NEXT:    mfvsrwz r3, v2
1126; CHECK-NEXT:    extsw r3, r3
1127; CHECK-NEXT:    blr
1128;
1129; CHECK-P8-LABEL: qpConv2sb:
1130; CHECK-P8:       # %bb.0: # %entry
1131; CHECK-P8-NEXT:    mflr r0
1132; CHECK-P8-NEXT:    stdu r1, -32(r1)
1133; CHECK-P8-NEXT:    std r0, 48(r1)
1134; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
1135; CHECK-P8-NEXT:    .cfi_offset lr, 16
1136; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1137; CHECK-P8-NEXT:    xxswapd v2, vs0
1138; CHECK-P8-NEXT:    bl __fixkfsi
1139; CHECK-P8-NEXT:    nop
1140; CHECK-P8-NEXT:    extsw r3, r3
1141; CHECK-P8-NEXT:    addi r1, r1, 32
1142; CHECK-P8-NEXT:    ld r0, 16(r1)
1143; CHECK-P8-NEXT:    mtlr r0
1144; CHECK-P8-NEXT:    blr
1145entry:
1146  %0 = load fp128, ptr %a, align 16
1147  %conv = fptosi fp128 %0 to i8
1148  ret i8 %conv
1149}
1150
1151; Function Attrs: norecurse nounwind
1152define void @qpConv2sb_02(ptr nocapture %res) {
1153; CHECK-LABEL: qpConv2sb_02:
1154; CHECK:       # %bb.0: # %entry
1155; CHECK-NEXT:    addis r4, r2, .LC0@toc@ha
1156; CHECK-NEXT:    ld r4, .LC0@toc@l(r4)
1157; CHECK-NEXT:    lxv v2, 32(r4)
1158; CHECK-NEXT:    xscvqpsdz v2, v2
1159; CHECK-NEXT:    stxsibx v2, 0, r3
1160; CHECK-NEXT:    blr
1161;
1162; CHECK-P8-LABEL: qpConv2sb_02:
1163; CHECK-P8:       # %bb.0: # %entry
1164; CHECK-P8-NEXT:    mflr r0
1165; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1166; CHECK-P8-NEXT:    .cfi_offset lr, 16
1167; CHECK-P8-NEXT:    .cfi_offset r30, -16
1168; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1169; CHECK-P8-NEXT:    stdu r1, -48(r1)
1170; CHECK-P8-NEXT:    mr r30, r3
1171; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
1172; CHECK-P8-NEXT:    std r0, 64(r1)
1173; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
1174; CHECK-P8-NEXT:    addi r3, r3, 32
1175; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1176; CHECK-P8-NEXT:    xxswapd v2, vs0
1177; CHECK-P8-NEXT:    bl __fixkfsi
1178; CHECK-P8-NEXT:    nop
1179; CHECK-P8-NEXT:    stb r3, 0(r30)
1180; CHECK-P8-NEXT:    addi r1, r1, 48
1181; CHECK-P8-NEXT:    ld r0, 16(r1)
1182; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1183; CHECK-P8-NEXT:    mtlr r0
1184; CHECK-P8-NEXT:    blr
1185entry:
1186  %0 = load fp128, ptr getelementptr inbounds
1187                            ([4 x fp128], ptr @f128Array,
1188                             i64 0, i64 2), align 16
1189  %conv = fptosi fp128 %0 to i8
1190  store i8 %conv, ptr %res, align 1
1191  ret void
1192}
1193
1194; Function Attrs: norecurse nounwind readonly
1195define signext i8 @qpConv2sb_03(ptr nocapture readonly %a) {
1196; CHECK-LABEL: qpConv2sb_03:
1197; CHECK:       # %bb.0: # %entry
1198; CHECK-NEXT:    lxv v2, 0(r3)
1199; CHECK-NEXT:    addis r3, r2, .LC0@toc@ha
1200; CHECK-NEXT:    ld r3, .LC0@toc@l(r3)
1201; CHECK-NEXT:    lxv v3, 16(r3)
1202; CHECK-NEXT:    xsaddqp v2, v2, v3
1203; CHECK-NEXT:    xscvqpswz v2, v2
1204; CHECK-NEXT:    mfvsrwz r3, v2
1205; CHECK-NEXT:    extsw r3, r3
1206; CHECK-NEXT:    blr
1207;
1208; CHECK-P8-LABEL: qpConv2sb_03:
1209; CHECK-P8:       # %bb.0: # %entry
1210; CHECK-P8-NEXT:    mflr r0
1211; CHECK-P8-NEXT:    stdu r1, -32(r1)
1212; CHECK-P8-NEXT:    std r0, 48(r1)
1213; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
1214; CHECK-P8-NEXT:    .cfi_offset lr, 16
1215; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1216; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
1217; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
1218; CHECK-P8-NEXT:    addi r3, r3, 16
1219; CHECK-P8-NEXT:    xxswapd v2, vs0
1220; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1221; CHECK-P8-NEXT:    xxswapd v3, vs0
1222; CHECK-P8-NEXT:    bl __addkf3
1223; CHECK-P8-NEXT:    nop
1224; CHECK-P8-NEXT:    bl __fixkfsi
1225; CHECK-P8-NEXT:    nop
1226; CHECK-P8-NEXT:    extsw r3, r3
1227; CHECK-P8-NEXT:    addi r1, r1, 32
1228; CHECK-P8-NEXT:    ld r0, 16(r1)
1229; CHECK-P8-NEXT:    mtlr r0
1230; CHECK-P8-NEXT:    blr
1231entry:
1232  %0 = load fp128, ptr %a, align 16
1233  %1 = load fp128, ptr getelementptr inbounds
1234                            ([4 x fp128], ptr @f128Array,
1235                             i64 0, i64 1), align 16
1236  %add = fadd fp128 %0, %1
1237  %conv = fptosi fp128 %add to i8
1238  ret i8 %conv
1239}
1240
1241; Function Attrs: norecurse nounwind
1242define void @qpConv2sb_04(ptr nocapture readonly %a,
1243; CHECK-LABEL: qpConv2sb_04:
1244; CHECK:       # %bb.0: # %entry
1245; CHECK-NEXT:    lxv v2, 0(r3)
1246; CHECK-NEXT:    lxv v3, 0(r4)
1247; CHECK-NEXT:    xsaddqp v2, v2, v3
1248; CHECK-NEXT:    xscvqpsdz v2, v2
1249; CHECK-NEXT:    stxsibx v2, 0, r5
1250; CHECK-NEXT:    blr
1251;
1252; CHECK-P8-LABEL: qpConv2sb_04:
1253; CHECK-P8:       # %bb.0: # %entry
1254; CHECK-P8-NEXT:    mflr r0
1255; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1256; CHECK-P8-NEXT:    .cfi_offset lr, 16
1257; CHECK-P8-NEXT:    .cfi_offset r30, -16
1258; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1259; CHECK-P8-NEXT:    stdu r1, -48(r1)
1260; CHECK-P8-NEXT:    std r0, 64(r1)
1261; CHECK-P8-NEXT:    mr r30, r5
1262; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1263; CHECK-P8-NEXT:    xxswapd v2, vs0
1264; CHECK-P8-NEXT:    lxvd2x vs0, 0, r4
1265; CHECK-P8-NEXT:    xxswapd v3, vs0
1266; CHECK-P8-NEXT:    bl __addkf3
1267; CHECK-P8-NEXT:    nop
1268; CHECK-P8-NEXT:    bl __fixkfsi
1269; CHECK-P8-NEXT:    nop
1270; CHECK-P8-NEXT:    stb r3, 0(r30)
1271; CHECK-P8-NEXT:    addi r1, r1, 48
1272; CHECK-P8-NEXT:    ld r0, 16(r1)
1273; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1274; CHECK-P8-NEXT:    mtlr r0
1275; CHECK-P8-NEXT:    blr
1276                          ptr nocapture readonly %b, ptr nocapture %res) {
1277entry:
1278  %0 = load fp128, ptr %a, align 16
1279  %1 = load fp128, ptr %b, align 16
1280  %add = fadd fp128 %0, %1
1281  %conv = fptosi fp128 %add to i8
1282  store i8 %conv, ptr %res, align 1
1283  ret void
1284}
1285
1286; Function Attrs: norecurse nounwind readonly
1287define zeroext i8 @qpConv2ub(ptr nocapture readonly %a) {
1288; CHECK-LABEL: qpConv2ub:
1289; CHECK:       # %bb.0: # %entry
1290; CHECK-NEXT:    lxv v2, 0(r3)
1291; CHECK-NEXT:    xscvqpswz v2, v2
1292; CHECK-NEXT:    mfvsrwz r3, v2
1293; CHECK-NEXT:    blr
1294;
1295; CHECK-P8-LABEL: qpConv2ub:
1296; CHECK-P8:       # %bb.0: # %entry
1297; CHECK-P8-NEXT:    mflr r0
1298; CHECK-P8-NEXT:    stdu r1, -32(r1)
1299; CHECK-P8-NEXT:    std r0, 48(r1)
1300; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
1301; CHECK-P8-NEXT:    .cfi_offset lr, 16
1302; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1303; CHECK-P8-NEXT:    xxswapd v2, vs0
1304; CHECK-P8-NEXT:    bl __fixkfsi
1305; CHECK-P8-NEXT:    nop
1306; CHECK-P8-NEXT:    addi r1, r1, 32
1307; CHECK-P8-NEXT:    ld r0, 16(r1)
1308; CHECK-P8-NEXT:    mtlr r0
1309; CHECK-P8-NEXT:    blr
1310entry:
1311  %0 = load fp128, ptr %a, align 16
1312  %conv = fptoui fp128 %0 to i8
1313  ret i8 %conv
1314}
1315
1316; Function Attrs: norecurse nounwind
1317define void @qpConv2ub_02(ptr nocapture %res) {
1318; CHECK-LABEL: qpConv2ub_02:
1319; CHECK:       # %bb.0: # %entry
1320; CHECK-NEXT:    addis r4, r2, .LC0@toc@ha
1321; CHECK-NEXT:    ld r4, .LC0@toc@l(r4)
1322; CHECK-NEXT:    lxv v2, 32(r4)
1323; CHECK-NEXT:    xscvqpudz v2, v2
1324; CHECK-NEXT:    stxsibx v2, 0, r3
1325; CHECK-NEXT:    blr
1326;
1327; CHECK-P8-LABEL: qpConv2ub_02:
1328; CHECK-P8:       # %bb.0: # %entry
1329; CHECK-P8-NEXT:    mflr r0
1330; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1331; CHECK-P8-NEXT:    .cfi_offset lr, 16
1332; CHECK-P8-NEXT:    .cfi_offset r30, -16
1333; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1334; CHECK-P8-NEXT:    stdu r1, -48(r1)
1335; CHECK-P8-NEXT:    mr r30, r3
1336; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
1337; CHECK-P8-NEXT:    std r0, 64(r1)
1338; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
1339; CHECK-P8-NEXT:    addi r3, r3, 32
1340; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1341; CHECK-P8-NEXT:    xxswapd v2, vs0
1342; CHECK-P8-NEXT:    bl __fixkfsi
1343; CHECK-P8-NEXT:    nop
1344; CHECK-P8-NEXT:    stb r3, 0(r30)
1345; CHECK-P8-NEXT:    addi r1, r1, 48
1346; CHECK-P8-NEXT:    ld r0, 16(r1)
1347; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1348; CHECK-P8-NEXT:    mtlr r0
1349; CHECK-P8-NEXT:    blr
1350entry:
1351  %0 = load fp128, ptr getelementptr inbounds
1352                            ([4 x fp128], ptr @f128Array,
1353                             i64 0, i64 2), align 16
1354  %conv = fptoui fp128 %0 to i8
1355  store i8 %conv, ptr %res, align 1
1356  ret void
1357}
1358
1359; Function Attrs: norecurse nounwind readonly
1360define zeroext i8 @qpConv2ub_03(ptr nocapture readonly %a) {
1361; CHECK-LABEL: qpConv2ub_03:
1362; CHECK:       # %bb.0: # %entry
1363; CHECK-NEXT:    lxv v2, 0(r3)
1364; CHECK-NEXT:    addis r3, r2, .LC0@toc@ha
1365; CHECK-NEXT:    ld r3, .LC0@toc@l(r3)
1366; CHECK-NEXT:    lxv v3, 16(r3)
1367; CHECK-NEXT:    xsaddqp v2, v2, v3
1368; CHECK-NEXT:    xscvqpswz v2, v2
1369; CHECK-NEXT:    mfvsrwz r3, v2
1370; CHECK-NEXT:    blr
1371;
1372; CHECK-P8-LABEL: qpConv2ub_03:
1373; CHECK-P8:       # %bb.0: # %entry
1374; CHECK-P8-NEXT:    mflr r0
1375; CHECK-P8-NEXT:    stdu r1, -32(r1)
1376; CHECK-P8-NEXT:    std r0, 48(r1)
1377; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
1378; CHECK-P8-NEXT:    .cfi_offset lr, 16
1379; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1380; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
1381; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
1382; CHECK-P8-NEXT:    addi r3, r3, 16
1383; CHECK-P8-NEXT:    xxswapd v2, vs0
1384; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1385; CHECK-P8-NEXT:    xxswapd v3, vs0
1386; CHECK-P8-NEXT:    bl __addkf3
1387; CHECK-P8-NEXT:    nop
1388; CHECK-P8-NEXT:    bl __fixkfsi
1389; CHECK-P8-NEXT:    nop
1390; CHECK-P8-NEXT:    addi r1, r1, 32
1391; CHECK-P8-NEXT:    ld r0, 16(r1)
1392; CHECK-P8-NEXT:    mtlr r0
1393; CHECK-P8-NEXT:    blr
1394entry:
1395  %0 = load fp128, ptr %a, align 16
1396  %1 = load fp128, ptr getelementptr inbounds
1397                            ([4 x fp128], ptr @f128Array,
1398                             i64 0, i64 1), align 16
1399  %add = fadd fp128 %0, %1
1400  %conv = fptoui fp128 %add to i8
1401  ret i8 %conv
1402}
1403
1404; Function Attrs: norecurse nounwind
1405define void @qpConv2ub_04(ptr nocapture readonly %a,
1406; CHECK-LABEL: qpConv2ub_04:
1407; CHECK:       # %bb.0: # %entry
1408; CHECK-NEXT:    lxv v2, 0(r3)
1409; CHECK-NEXT:    lxv v3, 0(r4)
1410; CHECK-NEXT:    xsaddqp v2, v2, v3
1411; CHECK-NEXT:    xscvqpudz v2, v2
1412; CHECK-NEXT:    stxsibx v2, 0, r5
1413; CHECK-NEXT:    blr
1414;
1415; CHECK-P8-LABEL: qpConv2ub_04:
1416; CHECK-P8:       # %bb.0: # %entry
1417; CHECK-P8-NEXT:    mflr r0
1418; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1419; CHECK-P8-NEXT:    .cfi_offset lr, 16
1420; CHECK-P8-NEXT:    .cfi_offset r30, -16
1421; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1422; CHECK-P8-NEXT:    stdu r1, -48(r1)
1423; CHECK-P8-NEXT:    std r0, 64(r1)
1424; CHECK-P8-NEXT:    mr r30, r5
1425; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
1426; CHECK-P8-NEXT:    xxswapd v2, vs0
1427; CHECK-P8-NEXT:    lxvd2x vs0, 0, r4
1428; CHECK-P8-NEXT:    xxswapd v3, vs0
1429; CHECK-P8-NEXT:    bl __addkf3
1430; CHECK-P8-NEXT:    nop
1431; CHECK-P8-NEXT:    bl __fixkfsi
1432; CHECK-P8-NEXT:    nop
1433; CHECK-P8-NEXT:    stb r3, 0(r30)
1434; CHECK-P8-NEXT:    addi r1, r1, 48
1435; CHECK-P8-NEXT:    ld r0, 16(r1)
1436; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1437; CHECK-P8-NEXT:    mtlr r0
1438; CHECK-P8-NEXT:    blr
1439                          ptr nocapture readonly %b, ptr nocapture %res) {
1440entry:
1441  %0 = load fp128, ptr %a, align 16
1442  %1 = load fp128, ptr %b, align 16
1443  %add = fadd fp128 %0, %1
1444  %conv = fptoui fp128 %add to i8
1445  store i8 %conv, ptr %res, align 1
1446  ret void
1447}
1448
1449define void @qpConvppcf128(fp128 %src, ptr %dst) {
1450; CHECK-LABEL: qpConvppcf128:
1451; CHECK:       # %bb.0: # %entry
1452; CHECK-NEXT:    mflr r0
1453; CHECK-NEXT:    .cfi_def_cfa_offset 48
1454; CHECK-NEXT:    .cfi_offset lr, 16
1455; CHECK-NEXT:    .cfi_offset r30, -16
1456; CHECK-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1457; CHECK-NEXT:    stdu r1, -48(r1)
1458; CHECK-NEXT:    std r0, 64(r1)
1459; CHECK-NEXT:    mr r30, r5
1460; CHECK-NEXT:    bl __extendkftf2
1461; CHECK-NEXT:    nop
1462; CHECK-NEXT:    stfd f2, 8(r30)
1463; CHECK-NEXT:    stfd f1, 0(r30)
1464; CHECK-NEXT:    addi r1, r1, 48
1465; CHECK-NEXT:    ld r0, 16(r1)
1466; CHECK-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1467; CHECK-NEXT:    mtlr r0
1468; CHECK-NEXT:    blr
1469;
1470; CHECK-P8-LABEL: qpConvppcf128:
1471; CHECK-P8:       # %bb.0: # %entry
1472; CHECK-P8-NEXT:    mflr r0
1473; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1474; CHECK-P8-NEXT:    .cfi_offset lr, 16
1475; CHECK-P8-NEXT:    .cfi_offset r30, -16
1476; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1477; CHECK-P8-NEXT:    stdu r1, -48(r1)
1478; CHECK-P8-NEXT:    std r0, 64(r1)
1479; CHECK-P8-NEXT:    mr r30, r5
1480; CHECK-P8-NEXT:    bl __extendkftf2
1481; CHECK-P8-NEXT:    nop
1482; CHECK-P8-NEXT:    stfd f2, 8(r30)
1483; CHECK-P8-NEXT:    stfd f1, 0(r30)
1484; CHECK-P8-NEXT:    addi r1, r1, 48
1485; CHECK-P8-NEXT:    ld r0, 16(r1)
1486; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1487; CHECK-P8-NEXT:    mtlr r0
1488; CHECK-P8-NEXT:    blr
1489entry:
1490  %res = call ppc_fp128 @llvm.ppc.convert.f128.to.ppcf128(fp128 %src)
1491  store ppc_fp128 %res, ptr %dst, align 16
1492  ret void
1493}
1494
1495define void @ppcf128Convqp(ppc_fp128 %src, ptr %dst) {
1496; CHECK-LABEL: ppcf128Convqp:
1497; CHECK:       # %bb.0: # %entry
1498; CHECK-NEXT:    mflr r0
1499; CHECK-NEXT:    .cfi_def_cfa_offset 48
1500; CHECK-NEXT:    .cfi_offset lr, 16
1501; CHECK-NEXT:    .cfi_offset r30, -16
1502; CHECK-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1503; CHECK-NEXT:    stdu r1, -48(r1)
1504; CHECK-NEXT:    std r0, 64(r1)
1505; CHECK-NEXT:    mr r30, r5
1506; CHECK-NEXT:    bl __trunctfkf2
1507; CHECK-NEXT:    nop
1508; CHECK-NEXT:    stxv v2, 0(r30)
1509; CHECK-NEXT:    addi r1, r1, 48
1510; CHECK-NEXT:    ld r0, 16(r1)
1511; CHECK-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1512; CHECK-NEXT:    mtlr r0
1513; CHECK-NEXT:    blr
1514;
1515; CHECK-P8-LABEL: ppcf128Convqp:
1516; CHECK-P8:       # %bb.0: # %entry
1517; CHECK-P8-NEXT:    mflr r0
1518; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
1519; CHECK-P8-NEXT:    .cfi_offset lr, 16
1520; CHECK-P8-NEXT:    .cfi_offset r30, -16
1521; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1522; CHECK-P8-NEXT:    stdu r1, -48(r1)
1523; CHECK-P8-NEXT:    std r0, 64(r1)
1524; CHECK-P8-NEXT:    mr r30, r5
1525; CHECK-P8-NEXT:    bl __trunctfkf2
1526; CHECK-P8-NEXT:    nop
1527; CHECK-P8-NEXT:    xxswapd vs0, v2
1528; CHECK-P8-NEXT:    stxvd2x vs0, 0, r30
1529; CHECK-P8-NEXT:    addi r1, r1, 48
1530; CHECK-P8-NEXT:    ld r0, 16(r1)
1531; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1532; CHECK-P8-NEXT:    mtlr r0
1533; CHECK-P8-NEXT:    blr
1534entry:
1535  %res = call fp128 @llvm.ppc.convert.ppcf128.to.f128(ppc_fp128 %src)
1536  store fp128 %res, ptr %dst, align 16
1537  ret void
1538}
1539
1540declare ppc_fp128 @llvm.ppc.convert.f128.to.ppcf128(fp128)
1541declare fp128 @llvm.ppc.convert.ppcf128.to.f128(ppc_fp128)
1542