[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / SystemZ / vec-strict-round-01.ll
blob9f73c73c212bd876d3436237dda5c595ea8b7ee8
1 ; Test strict v2f64 rounding.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
5 declare double @llvm.experimental.constrained.rint.f64(double, metadata, metadata)
6 declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata)
7 declare double @llvm.experimental.constrained.floor.f64(double, metadata, metadata)
8 declare double @llvm.experimental.constrained.ceil.f64(double, metadata, metadata)
9 declare double @llvm.experimental.constrained.trunc.f64(double, metadata, metadata)
10 declare double @llvm.experimental.constrained.round.f64(double, metadata, metadata)
11 declare <2 x double> @llvm.experimental.constrained.rint.v2f64(<2 x double>, metadata, metadata)
12 declare <2 x double> @llvm.experimental.constrained.nearbyint.v2f64(<2 x double>, metadata, metadata)
13 declare <2 x double> @llvm.experimental.constrained.floor.v2f64(<2 x double>, metadata, metadata)
14 declare <2 x double> @llvm.experimental.constrained.ceil.v2f64(<2 x double>, metadata, metadata)
15 declare <2 x double> @llvm.experimental.constrained.trunc.v2f64(<2 x double>, metadata, metadata)
16 declare <2 x double> @llvm.experimental.constrained.round.v2f64(<2 x double>, metadata, metadata)
18 define <2 x double> @f1(<2 x double> %val) #0 {
19 ; CHECK-LABEL: f1:
20 ; CHECK: vfidb %v24, %v24, 0, 0
21 ; CHECK: br %r14
22   %res = call <2 x double> @llvm.experimental.constrained.rint.v2f64(
23                         <2 x double> %val,
24                         metadata !"round.dynamic",
25                         metadata !"fpexcept.strict") #0
26   ret <2 x double> %res
29 define <2 x double> @f2(<2 x double> %val) #0 {
30 ; CHECK-LABEL: f2:
31 ; CHECK: vfidb %v24, %v24, 4, 0
32 ; CHECK: br %r14
33   %res = call <2 x double> @llvm.experimental.constrained.nearbyint.v2f64(
34                         <2 x double> %val,
35                         metadata !"round.dynamic",
36                         metadata !"fpexcept.strict") #0
37   ret <2 x double> %res
40 define <2 x double> @f3(<2 x double> %val) #0 {
41 ; CHECK-LABEL: f3:
42 ; CHECK: vfidb %v24, %v24, 4, 7
43 ; CHECK: br %r14
44   %res = call <2 x double> @llvm.experimental.constrained.floor.v2f64(
45                         <2 x double> %val,
46                         metadata !"round.dynamic",
47                         metadata !"fpexcept.strict") #0
48   ret <2 x double> %res
51 define <2 x double> @f4(<2 x double> %val) #0 {
52 ; CHECK-LABEL: f4:
53 ; CHECK: vfidb %v24, %v24, 4, 6
54 ; CHECK: br %r14
55   %res = call <2 x double> @llvm.experimental.constrained.ceil.v2f64(
56                         <2 x double> %val,
57                         metadata !"round.dynamic",
58                         metadata !"fpexcept.strict") #0
59   ret <2 x double> %res
62 define <2 x double> @f5(<2 x double> %val) #0 {
63 ; CHECK-LABEL: f5:
64 ; CHECK: vfidb %v24, %v24, 4, 5
65 ; CHECK: br %r14
66   %res = call <2 x double> @llvm.experimental.constrained.trunc.v2f64(
67                         <2 x double> %val,
68                         metadata !"round.dynamic",
69                         metadata !"fpexcept.strict") #0
70   ret <2 x double> %res
73 define <2 x double> @f6(<2 x double> %val) #0 {
74 ; CHECK-LABEL: f6:
75 ; CHECK: vfidb %v24, %v24, 4, 1
76 ; CHECK: br %r14
77   %res = call <2 x double> @llvm.experimental.constrained.round.v2f64(
78                         <2 x double> %val,
79                         metadata !"round.dynamic",
80                         metadata !"fpexcept.strict") #0
81   ret <2 x double> %res
84 define double @f7(<2 x double> %val) #0 {
85 ; CHECK-LABEL: f7:
86 ; CHECK: wfidb %f0, %v24, 0, 0
87 ; CHECK: br %r14
88   %scalar = extractelement <2 x double> %val, i32 0
89   %res = call double @llvm.experimental.constrained.rint.f64(
90                         double %scalar,
91                         metadata !"round.dynamic",
92                         metadata !"fpexcept.strict") #0
93   ret double %res
96 define double @f8(<2 x double> %val) #0 {
97 ; CHECK-LABEL: f8:
98 ; CHECK: wfidb %f0, %v24, 4, 0
99 ; CHECK: br %r14
100   %scalar = extractelement <2 x double> %val, i32 0
101   %res = call double @llvm.experimental.constrained.nearbyint.f64(
102                         double %scalar,
103                         metadata !"round.dynamic",
104                         metadata !"fpexcept.strict") #0
105   ret double %res
108 define double @f9(<2 x double> %val) #0 {
109 ; CHECK-LABEL: f9:
110 ; CHECK: wfidb %f0, %v24, 4, 7
111 ; CHECK: br %r14
112   %scalar = extractelement <2 x double> %val, i32 0
113   %res = call double @llvm.experimental.constrained.floor.f64(
114                         double %scalar,
115                         metadata !"round.dynamic",
116                         metadata !"fpexcept.strict") #0
117   ret double %res
121 define double @f10(<2 x double> %val) #0 {
122 ; CHECK-LABEL: f10:
123 ; CHECK: wfidb %f0, %v24, 4, 6
124 ; CHECK: br %r14
125   %scalar = extractelement <2 x double> %val, i32 0
126   %res = call double @llvm.experimental.constrained.ceil.f64(
127                         double %scalar,
128                         metadata !"round.dynamic",
129                         metadata !"fpexcept.strict") #0
130   ret double %res
133 define double @f11(<2 x double> %val) #0 {
134 ; CHECK-LABEL: f11:
135 ; CHECK: wfidb %f0, %v24, 4, 5
136 ; CHECK: br %r14
137   %scalar = extractelement <2 x double> %val, i32 0
138   %res = call double @llvm.experimental.constrained.trunc.f64(
139                         double %scalar,
140                         metadata !"round.dynamic",
141                         metadata !"fpexcept.strict") #0
142   ret double %res
145 define double @f12(<2 x double> %val) #0 {
146 ; CHECK-LABEL: f12:
147 ; CHECK: wfidb %f0, %v24, 4, 1
148 ; CHECK: br %r14
149   %scalar = extractelement <2 x double> %val, i32 0
150   %res = call double @llvm.experimental.constrained.round.f64(
151                         double %scalar,
152                         metadata !"round.dynamic",
153                         metadata !"fpexcept.strict") #0
154   ret double %res
157 attributes #0 = { strictfp }