xref: /llvm-project/llvm/test/CodeGen/PowerPC/fp-strict-round.ll (revision 6b1db79887df19bc8e8c946108966aa6021c8b87)
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) strictfp {
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) strictfp {
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) strictfp {
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) strictfp {
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) strictfp {
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) strictfp {
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) strictfp {
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) strictfp {
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) strictfp {
171; P8-LABEL: nearbyint_f64:
172; P8:       # %bb.0:
173; P8-NEXT:    mflr r0
174; P8-NEXT:    stdu r1, -112(r1)
175; P8-NEXT:    std r0, 128(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:    stdu r1, -32(r1)
189; P9-NEXT:    std r0, 48(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) strictfp {
206; P8-LABEL: nearbyint_v4f32:
207; P8:       # %bb.0:
208; P8-NEXT:    mflr r0
209; P8-NEXT:    stdu r1, -176(r1)
210; P8-NEXT:    std r0, 192(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:    xscvspdpn f1, vs0
219; P8-NEXT:    stxvd2x v29, r1, r3 # 16-byte Folded Spill
220; P8-NEXT:    li r3, 144
221; P8-NEXT:    stxvd2x v30, r1, r3 # 16-byte Folded Spill
222; P8-NEXT:    li r3, 160
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:    xxmrghd vs0, vs1, v30
233; P8-NEXT:    xscvspdpn f1, v31
234; P8-NEXT:    xvcvdpsp v29, vs0
235; P8-NEXT:    bl nearbyintf
236; P8-NEXT:    nop
237; P8-NEXT:    xxswapd vs0, v31
238; P8-NEXT:    xxlor v30, f1, f1
239; P8-NEXT:    xscvspdpn f1, vs0
240; P8-NEXT:    bl nearbyintf
241; P8-NEXT:    nop
242; P8-NEXT:    xxmrghd vs0, v30, vs1
243; P8-NEXT:    li r3, 160
244; P8-NEXT:    xvcvdpsp v2, vs0
245; P8-NEXT:    lxvd2x v31, r1, r3 # 16-byte Folded Reload
246; P8-NEXT:    li r3, 144
247; P8-NEXT:    lxvd2x v30, r1, r3 # 16-byte Folded Reload
248; P8-NEXT:    li r3, 128
249; P8-NEXT:    vmrgew v2, v2, v29
250; P8-NEXT:    lxvd2x v29, r1, r3 # 16-byte Folded Reload
251; P8-NEXT:    addi r1, r1, 176
252; P8-NEXT:    ld r0, 16(r1)
253; P8-NEXT:    mtlr r0
254; P8-NEXT:    blr
255;
256; P9-LABEL: nearbyint_v4f32:
257; P9:       # %bb.0:
258; P9-NEXT:    mflr r0
259; P9-NEXT:    stdu r1, -80(r1)
260; P9-NEXT:    std r0, 96(r1)
261; P9-NEXT:    .cfi_def_cfa_offset 80
262; P9-NEXT:    .cfi_offset lr, 16
263; P9-NEXT:    .cfi_offset v29, -48
264; P9-NEXT:    .cfi_offset v30, -32
265; P9-NEXT:    .cfi_offset v31, -16
266; P9-NEXT:    xxsldwi vs0, v2, v2, 3
267; P9-NEXT:    stxv v29, 32(r1) # 16-byte Folded Spill
268; P9-NEXT:    xscvspdpn f1, vs0
269; P9-NEXT:    stxv v30, 48(r1) # 16-byte Folded Spill
270; P9-NEXT:    stxv v31, 64(r1) # 16-byte Folded Spill
271; P9-NEXT:    vmr v31, v2
272; P9-NEXT:    bl nearbyintf
273; P9-NEXT:    nop
274; P9-NEXT:    xxsldwi vs0, v31, v31, 1
275; P9-NEXT:    xscpsgndp v30, f1, f1
276; P9-NEXT:    xscvspdpn f1, vs0
277; P9-NEXT:    bl nearbyintf
278; P9-NEXT:    nop
279; P9-NEXT:    xxmrghd vs0, vs1, v30
280; P9-NEXT:    xscvspdpn f1, v31
281; P9-NEXT:    xvcvdpsp v29, vs0
282; P9-NEXT:    bl nearbyintf
283; P9-NEXT:    nop
284; P9-NEXT:    xxswapd vs0, v31
285; P9-NEXT:    xscpsgndp v30, f1, f1
286; P9-NEXT:    xscvspdpn f1, vs0
287; P9-NEXT:    bl nearbyintf
288; P9-NEXT:    nop
289; P9-NEXT:    xxmrghd vs0, v30, vs1
290; P9-NEXT:    lxv v31, 64(r1) # 16-byte Folded Reload
291; P9-NEXT:    lxv v30, 48(r1) # 16-byte Folded Reload
292; P9-NEXT:    xvcvdpsp v2, vs0
293; P9-NEXT:    vmrgew v2, v2, v29
294; P9-NEXT:    lxv v29, 32(r1) # 16-byte Folded Reload
295; P9-NEXT:    addi r1, r1, 80
296; P9-NEXT:    ld r0, 16(r1)
297; P9-NEXT:    mtlr r0
298; P9-NEXT:    blr
299  %res = call <4 x float> @llvm.experimental.constrained.nearbyint.v4f32(
300                        <4 x float> %vf1,
301                        metadata !"round.dynamic",
302                        metadata !"fpexcept.strict")
303  ret <4 x float> %res
304}
305
306define <2 x double> @nearbyint_v2f64(<2 x double> %vf1, <2 x double> %vf2) strictfp {
307; P8-LABEL: nearbyint_v2f64:
308; P8:       # %bb.0:
309; P8-NEXT:    mflr r0
310; P8-NEXT:    stdu r1, -160(r1)
311; P8-NEXT:    std r0, 176(r1)
312; P8-NEXT:    .cfi_def_cfa_offset 160
313; P8-NEXT:    .cfi_offset lr, 16
314; P8-NEXT:    .cfi_offset v30, -32
315; P8-NEXT:    .cfi_offset v31, -16
316; P8-NEXT:    li r3, 128
317; P8-NEXT:    stxvd2x v30, r1, r3 # 16-byte Folded Spill
318; P8-NEXT:    li r3, 144
319; P8-NEXT:    stxvd2x v31, r1, r3 # 16-byte Folded Spill
320; P8-NEXT:    vmr v31, v2
321; P8-NEXT:    xxlor f1, v31, v31
322; P8-NEXT:    bl nearbyint
323; P8-NEXT:    nop
324; P8-NEXT:    xxlor v30, f1, f1
325; P8-NEXT:    xxswapd vs1, v31
326; P8-NEXT:    bl nearbyint
327; P8-NEXT:    nop
328; P8-NEXT:    li r3, 144
329; P8-NEXT:    xxmrghd v2, v30, vs1
330; P8-NEXT:    lxvd2x v31, r1, r3 # 16-byte Folded Reload
331; P8-NEXT:    li r3, 128
332; P8-NEXT:    lxvd2x v30, r1, r3 # 16-byte Folded Reload
333; P8-NEXT:    addi r1, r1, 160
334; P8-NEXT:    ld r0, 16(r1)
335; P8-NEXT:    mtlr r0
336; P8-NEXT:    blr
337;
338; P9-LABEL: nearbyint_v2f64:
339; P9:       # %bb.0:
340; P9-NEXT:    mflr r0
341; P9-NEXT:    stdu r1, -64(r1)
342; P9-NEXT:    std r0, 80(r1)
343; P9-NEXT:    .cfi_def_cfa_offset 64
344; P9-NEXT:    .cfi_offset lr, 16
345; P9-NEXT:    .cfi_offset v30, -32
346; P9-NEXT:    .cfi_offset v31, -16
347; P9-NEXT:    stxv v31, 48(r1) # 16-byte Folded Spill
348; P9-NEXT:    vmr v31, v2
349; P9-NEXT:    xscpsgndp f1, v31, v31
350; P9-NEXT:    stxv v30, 32(r1) # 16-byte Folded Spill
351; P9-NEXT:    bl nearbyint
352; P9-NEXT:    nop
353; P9-NEXT:    xscpsgndp v30, f1, f1
354; P9-NEXT:    xxswapd vs1, v31
355; P9-NEXT:    bl nearbyint
356; P9-NEXT:    nop
357; P9-NEXT:    xxmrghd v2, v30, vs1
358; P9-NEXT:    lxv v31, 48(r1) # 16-byte Folded Reload
359; P9-NEXT:    lxv v30, 32(r1) # 16-byte Folded Reload
360; P9-NEXT:    addi r1, r1, 64
361; P9-NEXT:    ld r0, 16(r1)
362; P9-NEXT:    mtlr r0
363; P9-NEXT:    blr
364  %res = call <2 x double> @llvm.experimental.constrained.nearbyint.v2f64(
365                        <2 x double> %vf1,
366                        metadata !"round.dynamic",
367                        metadata !"fpexcept.strict")
368  ret <2 x double> %res
369}
370
371define <4 x double> @fpext_v4f64_v4f32(<4 x float> %vf1) strictfp {
372; P8-LABEL: fpext_v4f64_v4f32:
373; P8:       # %bb.0:
374; P8-NEXT:    xxsldwi vs0, v2, v2, 1
375; P8-NEXT:    xscvspdpn f3, v2
376; P8-NEXT:    xxsldwi vs1, v2, v2, 3
377; P8-NEXT:    xxswapd vs2, v2
378; P8-NEXT:    xscvspdpn f0, vs0
379; P8-NEXT:    xxmrghd v2, vs3, vs0
380; P8-NEXT:    xscvspdpn f0, vs1
381; P8-NEXT:    xscvspdpn f1, vs2
382; P8-NEXT:    xxmrghd v3, vs1, vs0
383; P8-NEXT:    blr
384;
385; P9-LABEL: fpext_v4f64_v4f32:
386; P9:       # %bb.0:
387; P9-NEXT:    xxsldwi vs0, v2, v2, 3
388; P9-NEXT:    xxswapd vs1, v2
389; P9-NEXT:    xscvspdpn f0, vs0
390; P9-NEXT:    xscvspdpn f1, vs1
391; P9-NEXT:    xxsldwi vs2, v2, v2, 1
392; P9-NEXT:    xscvspdpn f2, vs2
393; P9-NEXT:    xxmrghd vs0, vs1, vs0
394; P9-NEXT:    xscvspdpn f1, v2
395; P9-NEXT:    xxmrghd v3, vs1, vs2
396; P9-NEXT:    xxlor v2, vs0, vs0
397; P9-NEXT:    blr
398  %res = call <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(
399                        <4 x float> %vf1,
400                        metadata !"fpexcept.strict")
401  ret <4 x double> %res
402}
403
404define <2 x double> @fpext_v2f64_v2f32(<2 x float> %vf1) strictfp {
405; P8-LABEL: fpext_v2f64_v2f32:
406; P8:       # %bb.0:
407; P8-NEXT:    xxsldwi vs0, v2, v2, 1
408; P8-NEXT:    xscvspdpn f1, v2
409; P8-NEXT:    xscvspdpn f0, vs0
410; P8-NEXT:    xxmrghd v2, vs1, vs0
411; P8-NEXT:    blr
412;
413; P9-LABEL: fpext_v2f64_v2f32:
414; P9:       # %bb.0:
415; P9-NEXT:    xxsldwi vs0, v2, v2, 3
416; P9-NEXT:    xxswapd vs1, v2
417; P9-NEXT:    xscvspdpn f0, vs0
418; P9-NEXT:    xscvspdpn f1, vs1
419; P9-NEXT:    xxmrghd v2, vs1, vs0
420; P9-NEXT:    blr
421  %res = call <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(
422                        <2 x float> %vf1,
423                        metadata !"fpexcept.strict")
424  ret <2 x double> %res
425}
426
427define float @fptrunc_f32_f64(double %f1) strictfp {
428; P8-LABEL: fptrunc_f32_f64:
429; P8:       # %bb.0:
430; P8-NEXT:    xsrsp f1, f1
431; P8-NEXT:    blr
432;
433; P9-LABEL: fptrunc_f32_f64:
434; P9:       # %bb.0:
435; P9-NEXT:    xsrsp f1, f1
436; P9-NEXT:    blr
437  %res = call float @llvm.experimental.constrained.fptrunc.f32.f64(
438                        double %f1,
439                        metadata !"round.dynamic",
440                        metadata !"fpexcept.strict")
441  ret float %res;
442}
443
444define <4 x float> @fptrunc_v4f32_v4f64(<4 x double> %vf1) strictfp {
445; P8-LABEL: fptrunc_v4f32_v4f64:
446; P8:       # %bb.0:
447; P8-NEXT:    xxmrgld vs0, v2, v3
448; P8-NEXT:    xxmrghd vs1, v2, v3
449; P8-NEXT:    xvcvdpsp v2, vs0
450; P8-NEXT:    xvcvdpsp v3, vs1
451; P8-NEXT:    vmrgew v2, v3, v2
452; P8-NEXT:    blr
453;
454; P9-LABEL: fptrunc_v4f32_v4f64:
455; P9:       # %bb.0:
456; P9-NEXT:    xxmrgld vs0, v3, v2
457; P9-NEXT:    xvcvdpsp v4, vs0
458; P9-NEXT:    xxmrghd vs0, v3, v2
459; P9-NEXT:    xvcvdpsp v2, vs0
460; P9-NEXT:    vmrgew v2, v2, v4
461; P9-NEXT:    blr
462  %res = call <4 x float> @llvm.experimental.constrained.fptrunc.v4f32.v4f64(
463                        <4 x double> %vf1,
464                        metadata !"round.dynamic",
465                        metadata !"fpexcept.strict")
466  ret <4 x float> %res
467}
468
469define <2 x float> @fptrunc_v2f32_v2f64(<2 x double> %vf1) strictfp {
470; P8-LABEL: fptrunc_v2f32_v2f64:
471; P8:       # %bb.0:
472; P8-NEXT:    xxswapd vs0, v2
473; P8-NEXT:    xsrsp f1, v2
474; P8-NEXT:    xsrsp f0, f0
475; P8-NEXT:    xscvdpspn v2, f1
476; P8-NEXT:    xscvdpspn v3, f0
477; P8-NEXT:    vmrgow v2, v2, v3
478; P8-NEXT:    blr
479;
480; P9-LABEL: fptrunc_v2f32_v2f64:
481; P9:       # %bb.0:
482; P9-NEXT:    xxswapd vs1, v2
483; P9-NEXT:    xsrsp f0, v2
484; P9-NEXT:    xsrsp f1, f1
485; P9-NEXT:    xscvdpspn vs0, f0
486; P9-NEXT:    xscvdpspn vs1, f1
487; P9-NEXT:    xxmrghw v2, vs0, vs1
488; P9-NEXT:    blr
489  %res = call <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(
490                        <2 x double> %vf1,
491                        metadata !"round.dynamic",
492                        metadata !"fpexcept.strict")
493  ret <2 x float> %res
494}
495
496define float @round_f32(float %f1) strictfp {
497; P8-LABEL: round_f32:
498; P8:       # %bb.0:
499; P8-NEXT:    xsrdpi f1, f1
500; P8-NEXT:    blr
501;
502; P9-LABEL: round_f32:
503; P9:       # %bb.0:
504; P9-NEXT:    xsrdpi f1, f1
505; P9-NEXT:    blr
506  %res = call float @llvm.experimental.constrained.round.f32(
507                        float %f1,
508                        metadata !"fpexcept.strict")
509  ret float %res
510}
511
512define double @round_f64(double %f1) strictfp {
513; P8-LABEL: round_f64:
514; P8:       # %bb.0:
515; P8-NEXT:    xsrdpi f1, f1
516; P8-NEXT:    blr
517;
518; P9-LABEL: round_f64:
519; P9:       # %bb.0:
520; P9-NEXT:    xsrdpi f1, f1
521; P9-NEXT:    blr
522  %res = call double @llvm.experimental.constrained.round.f64(
523                        double %f1,
524                        metadata !"fpexcept.strict")
525  ret double %res
526}
527
528define <4 x float> @round_v4f32(<4 x float> %vf1) strictfp {
529; P8-LABEL: round_v4f32:
530; P8:       # %bb.0:
531; P8-NEXT:    xvrspi v2, v2
532; P8-NEXT:    blr
533;
534; P9-LABEL: round_v4f32:
535; P9:       # %bb.0:
536; P9-NEXT:    xvrspi v2, v2
537; P9-NEXT:    blr
538  %res = call <4 x float> @llvm.experimental.constrained.round.v4f32(
539                        <4 x float> %vf1,
540                        metadata !"fpexcept.strict")
541  ret <4 x float> %res
542}
543
544define <2 x double> @round_v2f64(<2 x double> %vf1) strictfp {
545; P8-LABEL: round_v2f64:
546; P8:       # %bb.0:
547; P8-NEXT:    xvrdpi v2, v2
548; P8-NEXT:    blr
549;
550; P9-LABEL: round_v2f64:
551; P9:       # %bb.0:
552; P9-NEXT:    xvrdpi v2, v2
553; P9-NEXT:    blr
554  %res = call <2 x double> @llvm.experimental.constrained.round.v2f64(
555                        <2 x double> %vf1,
556                        metadata !"fpexcept.strict")
557  ret <2 x double> %res
558}
559
560define float @trunc_f32(float %f1) strictfp {
561; P8-LABEL: trunc_f32:
562; P8:       # %bb.0:
563; P8-NEXT:    xsrdpiz f1, f1
564; P8-NEXT:    blr
565;
566; P9-LABEL: trunc_f32:
567; P9:       # %bb.0:
568; P9-NEXT:    xsrdpiz f1, f1
569; P9-NEXT:    blr
570  %res = call float @llvm.experimental.constrained.trunc.f32(
571                        float %f1,
572                        metadata !"fpexcept.strict")
573  ret float %res
574}
575
576define double @trunc_f64(double %f1) strictfp {
577; P8-LABEL: trunc_f64:
578; P8:       # %bb.0:
579; P8-NEXT:    xsrdpiz f1, f1
580; P8-NEXT:    blr
581;
582; P9-LABEL: trunc_f64:
583; P9:       # %bb.0:
584; P9-NEXT:    xsrdpiz f1, f1
585; P9-NEXT:    blr
586  %res = call double @llvm.experimental.constrained.trunc.f64(
587                        double %f1,
588                        metadata !"fpexcept.strict")
589  ret double %res
590}
591
592define <4 x float> @trunc_v4f32(<4 x float> %vf1) strictfp {
593; P8-LABEL: trunc_v4f32:
594; P8:       # %bb.0:
595; P8-NEXT:    xvrspiz v2, v2
596; P8-NEXT:    blr
597;
598; P9-LABEL: trunc_v4f32:
599; P9:       # %bb.0:
600; P9-NEXT:    xvrspiz v2, v2
601; P9-NEXT:    blr
602  %res = call <4 x float> @llvm.experimental.constrained.trunc.v4f32(
603                        <4 x float> %vf1,
604                        metadata !"fpexcept.strict")
605  ret <4 x float> %res
606}
607
608define <2 x double> @trunc_v2f64(<2 x double> %vf1) strictfp {
609; P8-LABEL: trunc_v2f64:
610; P8:       # %bb.0:
611; P8-NEXT:    xvrdpiz v2, v2
612; P8-NEXT:    blr
613;
614; P9-LABEL: trunc_v2f64:
615; P9:       # %bb.0:
616; P9-NEXT:    xvrdpiz v2, v2
617; P9-NEXT:    blr
618  %res = call <2 x double> @llvm.experimental.constrained.trunc.v2f64(
619                        <2 x double> %vf1,
620                        metadata !"fpexcept.strict")
621  ret <2 x double> %res
622}
623