1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux \
3; RUN:   -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr  | FileCheck \
4; RUN:   --check-prefix=P8 %s
5; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux \
6; RUN:   -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr | FileCheck \
7; RUN:   --check-prefix=P9 %s
8
9; FIXME: Constrained fpext would fail if VSX feature disabled. Add no-vsx
10
11declare float @llvm.experimental.constrained.ceil.f32(float, metadata)
12declare double @llvm.experimental.constrained.ceil.f64(double, metadata)
13declare <4 x float> @llvm.experimental.constrained.ceil.v4f32(<4 x float>, metadata)
14declare <2 x double> @llvm.experimental.constrained.ceil.v2f64(<2 x double>, metadata)
15
16declare float @llvm.experimental.constrained.floor.f32(float, metadata)
17declare double @llvm.experimental.constrained.floor.f64(double, metadata)
18declare <4 x float> @llvm.experimental.constrained.floor.v4f32(<4 x float>, metadata)
19declare <2 x double> @llvm.experimental.constrained.floor.v2f64(<2 x double>, metadata)
20
21declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata)
22declare <4 x float> @llvm.experimental.constrained.nearbyint.v4f32(<4 x float>, metadata, metadata)
23declare <2 x double> @llvm.experimental.constrained.nearbyint.v2f64(<2 x double>, metadata, metadata)
24
25declare <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(<4 x float>, metadata)
26declare <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(<2 x float>, metadata)
27
28declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata)
29declare <4 x float> @llvm.experimental.constrained.fptrunc.v4f32.v4f64(<4 x double>, metadata, metadata)
30declare <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(<2 x double>, metadata, metadata)
31
32declare float @llvm.experimental.constrained.round.f32(float, metadata)
33declare double @llvm.experimental.constrained.round.f64(double, metadata)
34declare <4 x float> @llvm.experimental.constrained.round.v4f32(<4 x float>, metadata)
35declare <2 x double> @llvm.experimental.constrained.round.v2f64(<2 x double>, metadata)
36
37declare float @llvm.experimental.constrained.trunc.f32(float, metadata)
38declare double @llvm.experimental.constrained.trunc.f64(double, metadata)
39declare <4 x float> @llvm.experimental.constrained.trunc.v4f32(<4 x float>, metadata)
40declare <2 x double> @llvm.experimental.constrained.trunc.v2f64(<2 x double>, metadata)
41
42define float @ceil_f32(float %f1) {
43; P8-LABEL: ceil_f32:
44; P8:       # %bb.0:
45; P8-NEXT:    xsrdpip f1, f1
46; P8-NEXT:    blr
47;
48; P9-LABEL: ceil_f32:
49; P9:       # %bb.0:
50; P9-NEXT:    xsrdpip f1, f1
51; P9-NEXT:    blr
52  %res = call float @llvm.experimental.constrained.ceil.f32(
53                        float %f1,
54                        metadata !"fpexcept.strict")
55  ret float %res
56}
57
58define double @ceil_f64(double %f1) {
59; P8-LABEL: ceil_f64:
60; P8:       # %bb.0:
61; P8-NEXT:    xsrdpip f1, f1
62; P8-NEXT:    blr
63;
64; P9-LABEL: ceil_f64:
65; P9:       # %bb.0:
66; P9-NEXT:    xsrdpip f1, f1
67; P9-NEXT:    blr
68  %res = call double @llvm.experimental.constrained.ceil.f64(
69                        double %f1,
70                        metadata !"fpexcept.strict")
71  ret double %res
72}
73
74define <4 x float> @ceil_v4f32(<4 x float> %vf1) {
75; P8-LABEL: ceil_v4f32:
76; P8:       # %bb.0:
77; P8-NEXT:    xvrspip v2, v2
78; P8-NEXT:    blr
79;
80; P9-LABEL: ceil_v4f32:
81; P9:       # %bb.0:
82; P9-NEXT:    xvrspip v2, v2
83; P9-NEXT:    blr
84  %res = call <4 x float> @llvm.experimental.constrained.ceil.v4f32(
85                        <4 x float> %vf1,
86                        metadata !"fpexcept.strict")
87  ret <4 x float> %res
88}
89
90define <2 x double> @ceil_v2f64(<2 x double> %vf1) {
91; P8-LABEL: ceil_v2f64:
92; P8:       # %bb.0:
93; P8-NEXT:    xvrdpip v2, v2
94; P8-NEXT:    blr
95;
96; P9-LABEL: ceil_v2f64:
97; P9:       # %bb.0:
98; P9-NEXT:    xvrdpip v2, v2
99; P9-NEXT:    blr
100  %res = call <2 x double> @llvm.experimental.constrained.ceil.v2f64(
101                        <2 x double> %vf1,
102                        metadata !"fpexcept.strict")
103  ret <2 x double> %res
104}
105
106define float @floor_f32(float %f1) {
107; P8-LABEL: floor_f32:
108; P8:       # %bb.0:
109; P8-NEXT:    xsrdpim f1, f1
110; P8-NEXT:    blr
111;
112; P9-LABEL: floor_f32:
113; P9:       # %bb.0:
114; P9-NEXT:    xsrdpim f1, f1
115; P9-NEXT:    blr
116  %res = call float @llvm.experimental.constrained.floor.f32(
117                        float %f1,
118                        metadata !"fpexcept.strict")
119  ret float %res
120}
121
122define double @floor_f64(double %f1) {
123; P8-LABEL: floor_f64:
124; P8:       # %bb.0:
125; P8-NEXT:    xsrdpim f1, f1
126; P8-NEXT:    blr
127;
128; P9-LABEL: floor_f64:
129; P9:       # %bb.0:
130; P9-NEXT:    xsrdpim f1, f1
131; P9-NEXT:    blr
132  %res = call double @llvm.experimental.constrained.floor.f64(
133                        double %f1,
134                        metadata !"fpexcept.strict")
135  ret double %res;
136}
137
138define <4 x float> @floor_v4f32(<4 x float> %vf1) {
139; P8-LABEL: floor_v4f32:
140; P8:       # %bb.0:
141; P8-NEXT:    xvrspim v2, v2
142; P8-NEXT:    blr
143;
144; P9-LABEL: floor_v4f32:
145; P9:       # %bb.0:
146; P9-NEXT:    xvrspim v2, v2
147; P9-NEXT:    blr
148  %res = call <4 x float> @llvm.experimental.constrained.floor.v4f32(
149                        <4 x float> %vf1,
150                        metadata !"fpexcept.strict")
151  ret <4 x float> %res;
152}
153
154define <2 x double> @floor_v2f64(<2 x double> %vf1) {
155; P8-LABEL: floor_v2f64:
156; P8:       # %bb.0:
157; P8-NEXT:    xvrdpim v2, v2
158; P8-NEXT:    blr
159;
160; P9-LABEL: floor_v2f64:
161; P9:       # %bb.0:
162; P9-NEXT:    xvrdpim v2, v2
163; P9-NEXT:    blr
164  %res = call <2 x double> @llvm.experimental.constrained.floor.v2f64(
165                        <2 x double> %vf1,
166                        metadata !"fpexcept.strict")
167  ret <2 x double> %res;
168}
169
170define double @nearbyint_f64(double %f1, double %f2) {
171; P8-LABEL: nearbyint_f64:
172; P8:       # %bb.0:
173; P8-NEXT:    mflr r0
174; P8-NEXT:    std r0, 16(r1)
175; P8-NEXT:    stdu r1, -112(r1)
176; P8-NEXT:    .cfi_def_cfa_offset 112
177; P8-NEXT:    .cfi_offset lr, 16
178; P8-NEXT:    bl nearbyint
179; P8-NEXT:    nop
180; P8-NEXT:    addi r1, r1, 112
181; P8-NEXT:    ld r0, 16(r1)
182; P8-NEXT:    mtlr r0
183; P8-NEXT:    blr
184;
185; P9-LABEL: nearbyint_f64:
186; P9:       # %bb.0:
187; P9-NEXT:    mflr r0
188; P9-NEXT:    std r0, 16(r1)
189; P9-NEXT:    stdu r1, -32(r1)
190; P9-NEXT:    .cfi_def_cfa_offset 32
191; P9-NEXT:    .cfi_offset lr, 16
192; P9-NEXT:    bl nearbyint
193; P9-NEXT:    nop
194; P9-NEXT:    addi r1, r1, 32
195; P9-NEXT:    ld r0, 16(r1)
196; P9-NEXT:    mtlr r0
197; P9-NEXT:    blr
198  %res = call double @llvm.experimental.constrained.nearbyint.f64(
199                        double %f1,
200                        metadata !"round.dynamic",
201                        metadata !"fpexcept.strict")
202  ret double %res
203}
204
205define <4 x float> @nearbyint_v4f32(<4 x float> %vf1, <4 x float> %vf2) {
206; P8-LABEL: nearbyint_v4f32:
207; P8:       # %bb.0:
208; P8-NEXT:    mflr r0
209; P8-NEXT:    std r0, 16(r1)
210; P8-NEXT:    stdu r1, -176(r1)
211; P8-NEXT:    .cfi_def_cfa_offset 176
212; P8-NEXT:    .cfi_offset lr, 16
213; P8-NEXT:    .cfi_offset v29, -48
214; P8-NEXT:    .cfi_offset v30, -32
215; P8-NEXT:    .cfi_offset v31, -16
216; P8-NEXT:    xxsldwi vs0, v2, v2, 3
217; P8-NEXT:    li r3, 128
218; P8-NEXT:    stxvd2x v29, r1, r3 # 16-byte Folded Spill
219; P8-NEXT:    li r3, 144
220; P8-NEXT:    stxvd2x v30, r1, r3 # 16-byte Folded Spill
221; P8-NEXT:    li r3, 160
222; P8-NEXT:    xscvspdpn f1, vs0
223; P8-NEXT:    stxvd2x v31, r1, r3 # 16-byte Folded Spill
224; P8-NEXT:    vmr v31, v2
225; P8-NEXT:    bl nearbyintf
226; P8-NEXT:    nop
227; P8-NEXT:    xxsldwi vs0, v31, v31, 1
228; P8-NEXT:    xxlor v30, f1, f1
229; P8-NEXT:    xscvspdpn f1, vs0
230; P8-NEXT:    bl nearbyintf
231; P8-NEXT:    nop
232; P8-NEXT:    # kill: def $f1 killed $f1 def $vsl1
233; P8-NEXT:    xxmrghd vs0, vs1, v30
234; P8-NEXT:    xscvspdpn f1, v31
235; P8-NEXT:    xvcvdpsp v29, vs0
236; P8-NEXT:    bl nearbyintf
237; P8-NEXT:    nop
238; P8-NEXT:    xxswapd vs0, v31
239; P8-NEXT:    xxlor v30, f1, f1
240; P8-NEXT:    xscvspdpn f1, vs0
241; P8-NEXT:    bl nearbyintf
242; P8-NEXT:    nop
243; P8-NEXT:    # kill: def $f1 killed $f1 def $vsl1
244; P8-NEXT:    xxmrghd vs0, v30, vs1
245; P8-NEXT:    li r3, 160
246; P8-NEXT:    lxvd2x v31, r1, r3 # 16-byte Folded Reload
247; P8-NEXT:    li r3, 144
248; P8-NEXT:    lxvd2x v30, r1, r3 # 16-byte Folded Reload
249; P8-NEXT:    li r3, 128
250; P8-NEXT:    xvcvdpsp v2, vs0
251; P8-NEXT:    vmrgew v2, v2, v29
252; P8-NEXT:    lxvd2x v29, r1, r3 # 16-byte Folded Reload
253; P8-NEXT:    addi r1, r1, 176
254; P8-NEXT:    ld r0, 16(r1)
255; P8-NEXT:    mtlr r0
256; P8-NEXT:    blr
257;
258; P9-LABEL: nearbyint_v4f32:
259; P9:       # %bb.0:
260; P9-NEXT:    mflr r0
261; P9-NEXT:    std r0, 16(r1)
262; P9-NEXT:    stdu r1, -80(r1)
263; P9-NEXT:    .cfi_def_cfa_offset 80
264; P9-NEXT:    .cfi_offset lr, 16
265; P9-NEXT:    .cfi_offset v29, -48
266; P9-NEXT:    .cfi_offset v30, -32
267; P9-NEXT:    .cfi_offset v31, -16
268; P9-NEXT:    xxsldwi vs0, v2, v2, 3
269; P9-NEXT:    stxv v29, 32(r1) # 16-byte Folded Spill
270; P9-NEXT:    xscvspdpn f1, vs0
271; P9-NEXT:    stxv v30, 48(r1) # 16-byte Folded Spill
272; P9-NEXT:    stxv v31, 64(r1) # 16-byte Folded Spill
273; P9-NEXT:    vmr v31, v2
274; P9-NEXT:    bl nearbyintf
275; P9-NEXT:    nop
276; P9-NEXT:    xxsldwi vs0, v31, v31, 1
277; P9-NEXT:    xscpsgndp v30, f1, f1
278; P9-NEXT:    xscvspdpn f1, vs0
279; P9-NEXT:    bl nearbyintf
280; P9-NEXT:    nop
281; P9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
282; P9-NEXT:    xxmrghd vs0, vs1, v30
283; P9-NEXT:    xscvspdpn f1, v31
284; P9-NEXT:    xvcvdpsp v29, vs0
285; P9-NEXT:    bl nearbyintf
286; P9-NEXT:    nop
287; P9-NEXT:    xxswapd vs0, v31
288; P9-NEXT:    xscpsgndp v30, f1, f1
289; P9-NEXT:    xscvspdpn f1, vs0
290; P9-NEXT:    bl nearbyintf
291; P9-NEXT:    nop
292; P9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
293; P9-NEXT:    xxmrghd vs0, v30, vs1
294; P9-NEXT:    lxv v31, 64(r1) # 16-byte Folded Reload
295; P9-NEXT:    lxv v30, 48(r1) # 16-byte Folded Reload
296; P9-NEXT:    xvcvdpsp v2, vs0
297; P9-NEXT:    vmrgew v2, v2, v29
298; P9-NEXT:    lxv v29, 32(r1) # 16-byte Folded Reload
299; P9-NEXT:    addi r1, r1, 80
300; P9-NEXT:    ld r0, 16(r1)
301; P9-NEXT:    mtlr r0
302; P9-NEXT:    blr
303  %res = call <4 x float> @llvm.experimental.constrained.nearbyint.v4f32(
304                        <4 x float> %vf1,
305                        metadata !"round.dynamic",
306                        metadata !"fpexcept.strict")
307  ret <4 x float> %res
308}
309
310define <2 x double> @nearbyint_v2f64(<2 x double> %vf1, <2 x double> %vf2) {
311; P8-LABEL: nearbyint_v2f64:
312; P8:       # %bb.0:
313; P8-NEXT:    mflr r0
314; P8-NEXT:    std r0, 16(r1)
315; P8-NEXT:    stdu r1, -160(r1)
316; P8-NEXT:    .cfi_def_cfa_offset 160
317; P8-NEXT:    .cfi_offset lr, 16
318; P8-NEXT:    .cfi_offset v30, -32
319; P8-NEXT:    .cfi_offset v31, -16
320; P8-NEXT:    li r3, 128
321; P8-NEXT:    stxvd2x v30, r1, r3 # 16-byte Folded Spill
322; P8-NEXT:    li r3, 144
323; P8-NEXT:    stxvd2x v31, r1, r3 # 16-byte Folded Spill
324; P8-NEXT:    vmr v31, v2
325; P8-NEXT:    xxlor f1, v31, v31
326; P8-NEXT:    bl nearbyint
327; P8-NEXT:    nop
328; P8-NEXT:    xxlor v30, f1, f1
329; P8-NEXT:    xxswapd vs1, v31
330; P8-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
331; P8-NEXT:    bl nearbyint
332; P8-NEXT:    nop
333; P8-NEXT:    li r3, 144
334; P8-NEXT:    # kill: def $f1 killed $f1 def $vsl1
335; P8-NEXT:    xxmrghd v2, v30, vs1
336; P8-NEXT:    lxvd2x v31, r1, r3 # 16-byte Folded Reload
337; P8-NEXT:    li r3, 128
338; P8-NEXT:    lxvd2x v30, r1, r3 # 16-byte Folded Reload
339; P8-NEXT:    addi r1, r1, 160
340; P8-NEXT:    ld r0, 16(r1)
341; P8-NEXT:    mtlr r0
342; P8-NEXT:    blr
343;
344; P9-LABEL: nearbyint_v2f64:
345; P9:       # %bb.0:
346; P9-NEXT:    mflr r0
347; P9-NEXT:    std r0, 16(r1)
348; P9-NEXT:    stdu r1, -64(r1)
349; P9-NEXT:    .cfi_def_cfa_offset 64
350; P9-NEXT:    .cfi_offset lr, 16
351; P9-NEXT:    .cfi_offset v30, -32
352; P9-NEXT:    .cfi_offset v31, -16
353; P9-NEXT:    stxv v31, 48(r1) # 16-byte Folded Spill
354; P9-NEXT:    vmr v31, v2
355; P9-NEXT:    xscpsgndp f1, v31, v31
356; P9-NEXT:    stxv v30, 32(r1) # 16-byte Folded Spill
357; P9-NEXT:    bl nearbyint
358; P9-NEXT:    nop
359; P9-NEXT:    xscpsgndp v30, f1, f1
360; P9-NEXT:    xxswapd vs1, v31
361; P9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
362; P9-NEXT:    bl nearbyint
363; P9-NEXT:    nop
364; P9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
365; P9-NEXT:    xxmrghd v2, v30, vs1
366; P9-NEXT:    lxv v31, 48(r1) # 16-byte Folded Reload
367; P9-NEXT:    lxv v30, 32(r1) # 16-byte Folded Reload
368; P9-NEXT:    addi r1, r1, 64
369; P9-NEXT:    ld r0, 16(r1)
370; P9-NEXT:    mtlr r0
371; P9-NEXT:    blr
372  %res = call <2 x double> @llvm.experimental.constrained.nearbyint.v2f64(
373                        <2 x double> %vf1,
374                        metadata !"round.dynamic",
375                        metadata !"fpexcept.strict")
376  ret <2 x double> %res
377}
378
379define <4 x double> @fpext_v4f64_v4f32(<4 x float> %vf1) {
380; P8-LABEL: fpext_v4f64_v4f32:
381; P8:       # %bb.0:
382; P8-NEXT:    xxsldwi vs0, v2, v2, 1
383; P8-NEXT:    xxsldwi vs1, v2, v2, 3
384; P8-NEXT:    xxswapd vs3, v2
385; P8-NEXT:    xscvspdpn f2, v2
386; P8-NEXT:    xscvspdpn f0, vs0
387; P8-NEXT:    xscvspdpn f1, vs1
388; P8-NEXT:    xscvspdpn f3, vs3
389; P8-NEXT:    xxmrghd v2, vs2, vs0
390; P8-NEXT:    xxmrghd v3, vs3, vs1
391; P8-NEXT:    blr
392;
393; P9-LABEL: fpext_v4f64_v4f32:
394; P9:       # %bb.0:
395; P9-NEXT:    xxsldwi vs0, v2, v2, 3
396; P9-NEXT:    xxswapd vs1, v2
397; P9-NEXT:    xscvspdpn f0, vs0
398; P9-NEXT:    xscvspdpn f1, vs1
399; P9-NEXT:    xxsldwi vs2, v2, v2, 1
400; P9-NEXT:    xscvspdpn f2, vs2
401; P9-NEXT:    xxmrghd vs0, vs1, vs0
402; P9-NEXT:    xscvspdpn f1, v2
403; P9-NEXT:    xxmrghd v3, vs1, vs2
404; P9-NEXT:    xxlor v2, vs0, vs0
405; P9-NEXT:    blr
406  %res = call <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(
407                        <4 x float> %vf1,
408                        metadata !"fpexcept.strict")
409  ret <4 x double> %res
410}
411
412define <2 x double> @fpext_v2f64_v2f32(<2 x float> %vf1) {
413; P8-LABEL: fpext_v2f64_v2f32:
414; P8:       # %bb.0:
415; P8-NEXT:    xxsldwi vs0, v2, v2, 1
416; P8-NEXT:    xscvspdpn f1, v2
417; P8-NEXT:    xscvspdpn f0, vs0
418; P8-NEXT:    xxmrghd v2, vs1, vs0
419; P8-NEXT:    blr
420;
421; P9-LABEL: fpext_v2f64_v2f32:
422; P9:       # %bb.0:
423; P9-NEXT:    xxsldwi vs0, v2, v2, 3
424; P9-NEXT:    xxswapd vs1, v2
425; P9-NEXT:    xscvspdpn f0, vs0
426; P9-NEXT:    xscvspdpn f1, vs1
427; P9-NEXT:    xxmrghd v2, vs1, vs0
428; P9-NEXT:    blr
429  %res = call <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(
430                        <2 x float> %vf1,
431                        metadata !"fpexcept.strict")
432  ret <2 x double> %res
433}
434
435define float @fptrunc_f32_f64(double %f1) {
436; P8-LABEL: fptrunc_f32_f64:
437; P8:       # %bb.0:
438; P8-NEXT:    xsrsp f1, f1
439; P8-NEXT:    blr
440;
441; P9-LABEL: fptrunc_f32_f64:
442; P9:       # %bb.0:
443; P9-NEXT:    xsrsp f1, f1
444; P9-NEXT:    blr
445  %res = call float @llvm.experimental.constrained.fptrunc.f32.f64(
446                        double %f1,
447                        metadata !"round.dynamic",
448                        metadata !"fpexcept.strict")
449  ret float %res;
450}
451
452define <4 x float> @fptrunc_v4f32_v4f64(<4 x double> %vf1) {
453; P8-LABEL: fptrunc_v4f32_v4f64:
454; P8:       # %bb.0:
455; P8-NEXT:    xxmrgld vs0, v2, v3
456; P8-NEXT:    xxmrghd vs1, v2, v3
457; P8-NEXT:    xvcvdpsp v2, vs0
458; P8-NEXT:    xvcvdpsp v3, vs1
459; P8-NEXT:    vmrgew v2, v3, v2
460; P8-NEXT:    blr
461;
462; P9-LABEL: fptrunc_v4f32_v4f64:
463; P9:       # %bb.0:
464; P9-NEXT:    xxmrgld vs0, v3, v2
465; P9-NEXT:    xvcvdpsp v4, vs0
466; P9-NEXT:    xxmrghd vs0, v3, v2
467; P9-NEXT:    xvcvdpsp v2, vs0
468; P9-NEXT:    vmrgew v2, v2, v4
469; P9-NEXT:    blr
470  %res = call <4 x float> @llvm.experimental.constrained.fptrunc.v4f32.v4f64(
471                        <4 x double> %vf1,
472                        metadata !"round.dynamic",
473                        metadata !"fpexcept.strict")
474  ret <4 x float> %res
475}
476
477define <2 x float> @fptrunc_v2f32_v2f64(<2 x double> %vf1) {
478; P8-LABEL: fptrunc_v2f32_v2f64:
479; P8:       # %bb.0:
480; P8-NEXT:    xxswapd vs0, v2
481; P8-NEXT:    xsrsp f1, v2
482; P8-NEXT:    xsrsp f0, f0
483; P8-NEXT:    xscvdpspn v2, f1
484; P8-NEXT:    xscvdpspn v3, f0
485; P8-NEXT:    vmrgow v2, v2, v3
486; P8-NEXT:    blr
487;
488; P9-LABEL: fptrunc_v2f32_v2f64:
489; P9:       # %bb.0:
490; P9-NEXT:    xxswapd vs1, v2
491; P9-NEXT:    xsrsp f0, v2
492; P9-NEXT:    xsrsp f1, f1
493; P9-NEXT:    xscvdpspn vs0, f0
494; P9-NEXT:    xscvdpspn vs1, f1
495; P9-NEXT:    xxmrghw v2, vs0, vs1
496; P9-NEXT:    blr
497  %res = call <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(
498                        <2 x double> %vf1,
499                        metadata !"round.dynamic",
500                        metadata !"fpexcept.strict")
501  ret <2 x float> %res
502}
503
504define float @round_f32(float %f1) {
505; P8-LABEL: round_f32:
506; P8:       # %bb.0:
507; P8-NEXT:    xsrdpi f1, f1
508; P8-NEXT:    blr
509;
510; P9-LABEL: round_f32:
511; P9:       # %bb.0:
512; P9-NEXT:    xsrdpi f1, f1
513; P9-NEXT:    blr
514  %res = call float @llvm.experimental.constrained.round.f32(
515                        float %f1,
516                        metadata !"fpexcept.strict")
517  ret float %res
518}
519
520define double @round_f64(double %f1) {
521; P8-LABEL: round_f64:
522; P8:       # %bb.0:
523; P8-NEXT:    xsrdpi f1, f1
524; P8-NEXT:    blr
525;
526; P9-LABEL: round_f64:
527; P9:       # %bb.0:
528; P9-NEXT:    xsrdpi f1, f1
529; P9-NEXT:    blr
530  %res = call double @llvm.experimental.constrained.round.f64(
531                        double %f1,
532                        metadata !"fpexcept.strict")
533  ret double %res
534}
535
536define <4 x float> @round_v4f32(<4 x float> %vf1) {
537; P8-LABEL: round_v4f32:
538; P8:       # %bb.0:
539; P8-NEXT:    xvrspi v2, v2
540; P8-NEXT:    blr
541;
542; P9-LABEL: round_v4f32:
543; P9:       # %bb.0:
544; P9-NEXT:    xvrspi v2, v2
545; P9-NEXT:    blr
546  %res = call <4 x float> @llvm.experimental.constrained.round.v4f32(
547                        <4 x float> %vf1,
548                        metadata !"fpexcept.strict")
549  ret <4 x float> %res
550}
551
552define <2 x double> @round_v2f64(<2 x double> %vf1) {
553; P8-LABEL: round_v2f64:
554; P8:       # %bb.0:
555; P8-NEXT:    xvrdpi v2, v2
556; P8-NEXT:    blr
557;
558; P9-LABEL: round_v2f64:
559; P9:       # %bb.0:
560; P9-NEXT:    xvrdpi v2, v2
561; P9-NEXT:    blr
562  %res = call <2 x double> @llvm.experimental.constrained.round.v2f64(
563                        <2 x double> %vf1,
564                        metadata !"fpexcept.strict")
565  ret <2 x double> %res
566}
567
568define float @trunc_f32(float %f1) {
569; P8-LABEL: trunc_f32:
570; P8:       # %bb.0:
571; P8-NEXT:    xsrdpiz f1, f1
572; P8-NEXT:    blr
573;
574; P9-LABEL: trunc_f32:
575; P9:       # %bb.0:
576; P9-NEXT:    xsrdpiz f1, f1
577; P9-NEXT:    blr
578  %res = call float @llvm.experimental.constrained.trunc.f32(
579                        float %f1,
580                        metadata !"fpexcept.strict")
581  ret float %res
582}
583
584define double @trunc_f64(double %f1) {
585; P8-LABEL: trunc_f64:
586; P8:       # %bb.0:
587; P8-NEXT:    xsrdpiz f1, f1
588; P8-NEXT:    blr
589;
590; P9-LABEL: trunc_f64:
591; P9:       # %bb.0:
592; P9-NEXT:    xsrdpiz f1, f1
593; P9-NEXT:    blr
594  %res = call double @llvm.experimental.constrained.trunc.f64(
595                        double %f1,
596                        metadata !"fpexcept.strict")
597  ret double %res
598}
599
600define <4 x float> @trunc_v4f32(<4 x float> %vf1) {
601; P8-LABEL: trunc_v4f32:
602; P8:       # %bb.0:
603; P8-NEXT:    xvrspiz v2, v2
604; P8-NEXT:    blr
605;
606; P9-LABEL: trunc_v4f32:
607; P9:       # %bb.0:
608; P9-NEXT:    xvrspiz v2, v2
609; P9-NEXT:    blr
610  %res = call <4 x float> @llvm.experimental.constrained.trunc.v4f32(
611                        <4 x float> %vf1,
612                        metadata !"fpexcept.strict")
613  ret <4 x float> %res
614}
615
616define <2 x double> @trunc_v2f64(<2 x double> %vf1) {
617; P8-LABEL: trunc_v2f64:
618; P8:       # %bb.0:
619; P8-NEXT:    xvrdpiz v2, v2
620; P8-NEXT:    blr
621;
622; P9-LABEL: trunc_v2f64:
623; P9:       # %bb.0:
624; P9-NEXT:    xvrdpiz v2, v2
625; P9-NEXT:    blr
626  %res = call <2 x double> @llvm.experimental.constrained.trunc.v2f64(
627                        <2 x double> %vf1,
628                        metadata !"fpexcept.strict")
629  ret <2 x double> %res
630}
631