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