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