blob: b2a2c7efbdf63636a4e199b3208ae33d03ddd589 [file] [log] [blame]
Craig Topper3bae2a42019-10-30 11:41:44 -07001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
Wang, Pengfei60333a52020-01-03 10:57:27 +08002; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512f -mattr=+avx512vl -O3 | FileCheck %s
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f -mattr=+avx512vl -O3 | FileCheck %s
Craig Topper3bae2a42019-10-30 11:41:44 -07004
5declare <8 x double> @llvm.experimental.constrained.fadd.v8f64(<8 x double>, <8 x double>, metadata, metadata)
6declare <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float>, <16 x float>, metadata, metadata)
7declare <8 x double> @llvm.experimental.constrained.fsub.v8f64(<8 x double>, <8 x double>, metadata, metadata)
8declare <16 x float> @llvm.experimental.constrained.fsub.v16f32(<16 x float>, <16 x float>, metadata, metadata)
9declare <8 x double> @llvm.experimental.constrained.fmul.v8f64(<8 x double>, <8 x double>, metadata, metadata)
10declare <16 x float> @llvm.experimental.constrained.fmul.v16f32(<16 x float>, <16 x float>, metadata, metadata)
11declare <8 x double> @llvm.experimental.constrained.fdiv.v8f64(<8 x double>, <8 x double>, metadata, metadata)
12declare <16 x float> @llvm.experimental.constrained.fdiv.v16f32(<16 x float>, <16 x float>, metadata, metadata)
Liu, Chen3bbf78602019-12-10 09:04:28 +080013declare <8 x double> @llvm.experimental.constrained.sqrt.v8f64(<8 x double>, metadata, metadata)
14declare <16 x float> @llvm.experimental.constrained.sqrt.v16f32(<16 x float>, metadata, metadata)
15declare <8 x double> @llvm.experimental.constrained.fpext.v8f64.v8f32(<8 x float>, metadata)
16declare <8 x float> @llvm.experimental.constrained.fptrunc.v8f32.v8f64(<8 x double>, metadata, metadata)
Wang, Pengfei19492352019-12-17 21:27:46 +080017declare <8 x double> @llvm.experimental.constrained.fma.v8f64(<8 x double>, <8 x double>, <8 x double>, metadata, metadata)
18declare <16 x float> @llvm.experimental.constrained.fma.v16f32(<16 x float>, <16 x float>, <16 x float>, metadata, metadata)
Liu, Chen38af492a2019-12-31 11:38:17 +080019declare <16 x float> @llvm.experimental.constrained.ceil.v16f32(<16 x float>, metadata)
20declare <8 x double> @llvm.experimental.constrained.ceil.v8f64(<8 x double>, metadata)
21declare <16 x float> @llvm.experimental.constrained.floor.v16f32(<16 x float>, metadata)
22declare <8 x double> @llvm.experimental.constrained.floor.v8f64(<8 x double>, metadata)
23declare <16 x float> @llvm.experimental.constrained.trunc.v16f32(<16 x float>, metadata)
24declare <8 x double> @llvm.experimental.constrained.trunc.v8f64(<8 x double>, metadata)
25declare <16 x float> @llvm.experimental.constrained.rint.v16f32(<16 x float>, metadata, metadata)
26declare <8 x double> @llvm.experimental.constrained.rint.v8f64(<8 x double>, metadata, metadata)
27declare <16 x float> @llvm.experimental.constrained.nearbyint.v16f32(<16 x float>, metadata, metadata)
28declare <8 x double> @llvm.experimental.constrained.nearbyint.v8f64(<8 x double>, metadata, metadata)
29
Craig Topper3bae2a42019-10-30 11:41:44 -070030
31define <8 x double> @f1(<8 x double> %a, <8 x double> %b) #0 {
32; CHECK-LABEL: f1:
33; CHECK: # %bb.0:
Craig Topper95f44cf2019-11-21 14:24:32 -080034; CHECK-NEXT: vaddpd %zmm1, %zmm0, %zmm0
Craig Topper3bae2a42019-10-30 11:41:44 -070035; CHECK-NEXT: ret{{[l|q]}}
36 %ret = call <8 x double> @llvm.experimental.constrained.fadd.v8f64(<8 x double> %a, <8 x double> %b,
37 metadata !"round.dynamic",
38 metadata !"fpexcept.strict") #0
39 ret <8 x double> %ret
40}
41
42define <16 x float> @f2(<16 x float> %a, <16 x float> %b) #0 {
43; CHECK-LABEL: f2:
44; CHECK: # %bb.0:
Craig Topper95f44cf2019-11-21 14:24:32 -080045; CHECK-NEXT: vaddps %zmm1, %zmm0, %zmm0
Craig Topper3bae2a42019-10-30 11:41:44 -070046; CHECK-NEXT: ret{{[l|q]}}
47 %ret = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %a, <16 x float> %b,
48 metadata !"round.dynamic",
49 metadata !"fpexcept.strict") #0
50 ret <16 x float> %ret
51}
52
53define <8 x double> @f3(<8 x double> %a, <8 x double> %b) #0 {
54; CHECK-LABEL: f3:
55; CHECK: # %bb.0:
Craig Topper95f44cf2019-11-21 14:24:32 -080056; CHECK-NEXT: vsubpd %zmm1, %zmm0, %zmm0
Craig Topper3bae2a42019-10-30 11:41:44 -070057; CHECK-NEXT: ret{{[l|q]}}
58 %ret = call <8 x double> @llvm.experimental.constrained.fsub.v8f64(<8 x double> %a, <8 x double> %b,
59 metadata !"round.dynamic",
60 metadata !"fpexcept.strict") #0
61 ret <8 x double> %ret
62}
63
64define <16 x float> @f4(<16 x float> %a, <16 x float> %b) #0 {
65; CHECK-LABEL: f4:
66; CHECK: # %bb.0:
Craig Topper95f44cf2019-11-21 14:24:32 -080067; CHECK-NEXT: vsubps %zmm1, %zmm0, %zmm0
Craig Topper3bae2a42019-10-30 11:41:44 -070068; CHECK-NEXT: ret{{[l|q]}}
69 %ret = call <16 x float> @llvm.experimental.constrained.fsub.v16f32(<16 x float> %a, <16 x float> %b,
70 metadata !"round.dynamic",
71 metadata !"fpexcept.strict") #0
72 ret <16 x float> %ret
73}
74
75define <8 x double> @f5(<8 x double> %a, <8 x double> %b) #0 {
76; CHECK-LABEL: f5:
77; CHECK: # %bb.0:
78; CHECK-NEXT: vmulpd %zmm1, %zmm0, %zmm0
79; CHECK-NEXT: ret{{[l|q]}}
80 %ret = call <8 x double> @llvm.experimental.constrained.fmul.v8f64(<8 x double> %a, <8 x double> %b,
81 metadata !"round.dynamic",
82 metadata !"fpexcept.strict") #0
83 ret <8 x double> %ret
84}
85
86define <16 x float> @f6(<16 x float> %a, <16 x float> %b) #0 {
87; CHECK-LABEL: f6:
88; CHECK: # %bb.0:
89; CHECK-NEXT: vmulps %zmm1, %zmm0, %zmm0
90; CHECK-NEXT: ret{{[l|q]}}
91 %ret = call <16 x float> @llvm.experimental.constrained.fmul.v16f32(<16 x float> %a, <16 x float> %b,
92 metadata !"round.dynamic",
93 metadata !"fpexcept.strict") #0
94 ret <16 x float> %ret
95}
96
97define <8 x double> @f7(<8 x double> %a, <8 x double> %b) #0 {
98; CHECK-LABEL: f7:
99; CHECK: # %bb.0:
100; CHECK-NEXT: vdivpd %zmm1, %zmm0, %zmm0
101; CHECK-NEXT: ret{{[l|q]}}
102 %ret = call <8 x double> @llvm.experimental.constrained.fdiv.v8f64(<8 x double> %a, <8 x double> %b,
103 metadata !"round.dynamic",
104 metadata !"fpexcept.strict") #0
105 ret <8 x double> %ret
106}
107
108define <16 x float> @f8(<16 x float> %a, <16 x float> %b) #0 {
109; CHECK-LABEL: f8:
110; CHECK: # %bb.0:
111; CHECK-NEXT: vdivps %zmm1, %zmm0, %zmm0
112; CHECK-NEXT: ret{{[l|q]}}
113 %ret = call <16 x float> @llvm.experimental.constrained.fdiv.v16f32(<16 x float> %a, <16 x float> %b,
114 metadata !"round.dynamic",
115 metadata !"fpexcept.strict") #0
116 ret <16 x float> %ret
117}
118
Liu, Chen3bbf78602019-12-10 09:04:28 +0800119define <8 x double> @f9(<8 x double> %a) #0 {
120; CHECK-LABEL: f9:
121; CHECK: # %bb.0:
122; CHECK-NEXT: vsqrtpd %zmm0, %zmm0
123; CHECK-NEXT: ret{{[l|q]}}
124 %ret = call <8 x double> @llvm.experimental.constrained.sqrt.v8f64(
125 <8 x double> %a,
126 metadata !"round.dynamic",
127 metadata !"fpexcept.strict") #0
128 ret <8 x double> %ret
129}
130
131
132define <16 x float> @f10(<16 x float> %a) #0 {
133; CHECK-LABEL: f10:
134; CHECK: # %bb.0:
135; CHECK-NEXT: vsqrtps %zmm0, %zmm0
136; CHECK-NEXT: ret{{[l|q]}}
137 %ret = call <16 x float> @llvm.experimental.constrained.sqrt.v16f32(
138 <16 x float> %a,
139 metadata !"round.dynamic",
140 metadata !"fpexcept.strict") #0
141 ret <16 x float > %ret
142}
143
144define <8 x double> @f11(<8 x float> %a) #0 {
145; CHECK-LABEL: f11:
146; CHECK: # %bb.0:
147; CHECK-NEXT: vcvtps2pd %ymm0, %zmm0
148; CHECK-NEXT: ret{{[l|q]}}
149 %ret = call <8 x double> @llvm.experimental.constrained.fpext.v8f64.v8f32(
150 <8 x float> %a,
151 metadata !"fpexcept.strict") #0
152 ret <8 x double> %ret
153}
154
155define <8 x float> @f12(<8 x double> %a) #0 {
156; CHECK-LABEL: f12:
157; CHECK: # %bb.0:
158; CHECK-NEXT: vcvtpd2ps %zmm0, %ymm0
159; CHECK-NEXT: ret{{[l|q]}}
160 %ret = call <8 x float> @llvm.experimental.constrained.fptrunc.v8f32.v8f64(
161 <8 x double> %a,
162 metadata !"round.dynamic",
163 metadata !"fpexcept.strict") #0
164 ret <8 x float> %ret
165}
166
Wang, Pengfei19492352019-12-17 21:27:46 +0800167define <16 x float> @f13(<16 x float> %a, <16 x float> %b, <16 x float> %c) #0 {
168; CHECK-LABEL: f13:
169; CHECK: # %bb.0:
170; CHECK-NEXT: vfmadd213ps {{.*#+}} zmm0 = (zmm1 * zmm0) + zmm2
171; CHECK-NEXT: ret{{[l|q]}}
172 %res = call <16 x float> @llvm.experimental.constrained.fma.v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %c,
173 metadata !"round.dynamic",
174 metadata !"fpexcept.strict") #0
175 ret <16 x float> %res
176}
177
178define <8 x double> @f14(<8 x double> %a, <8 x double> %b, <8 x double> %c) #0 {
179; CHECK-LABEL: f14:
180; CHECK: # %bb.0:
181; CHECK-NEXT: vfmadd213pd {{.*#+}} zmm0 = (zmm1 * zmm0) + zmm2
182; CHECK-NEXT: ret{{[l|q]}}
183 %res = call <8 x double> @llvm.experimental.constrained.fma.v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %c,
184 metadata !"round.dynamic",
185 metadata !"fpexcept.strict") #0
186 ret <8 x double> %res
187}
188
Liu, Chen38af492a2019-12-31 11:38:17 +0800189define <16 x float> @strict_vector_fceil_v16f32(<16 x float> %f) #0 {
190; CHECK-LABEL: strict_vector_fceil_v16f32:
191; CHECK: # %bb.0:
192; CHECK-NEXT: vrndscaleps $10, %zmm0, %zmm0
193; CHECK-NEXT: ret{{[l|q]}}
194 %res = call <16 x float> @llvm.experimental.constrained.ceil.v16f32(<16 x float> %f, metadata !"fpexcept.strict")
195 ret <16 x float> %res
196}
197
198define <8 x double> @strict_vector_fceil_v8f64(<8 x double> %f) #0 {
199; CHECK-LABEL: strict_vector_fceil_v8f64:
200; CHECK: # %bb.0:
201; CHECK-NEXT: vrndscalepd $10, %zmm0, %zmm0
202; CHECK-NEXT: ret{{[l|q]}}
203 %res = call <8 x double> @llvm.experimental.constrained.ceil.v8f64(<8 x double> %f, metadata !"fpexcept.strict")
204 ret <8 x double> %res
205}
206
207define <16 x float> @strict_vector_ffloor_v16f32(<16 x float> %f) #0 {
208; CHECK-LABEL: strict_vector_ffloor_v16f32:
209; CHECK: # %bb.0:
210; CHECK-NEXT: vrndscaleps $9, %zmm0, %zmm0
211; CHECK-NEXT: ret{{[l|q]}}
212 %res = call <16 x float> @llvm.experimental.constrained.floor.v16f32(<16 x float> %f, metadata !"fpexcept.strict")
213 ret <16 x float> %res
214}
215
216define <8 x double> @strict_vector_ffloor_v8f64(<8 x double> %f) #0 {
217; CHECK-LABEL: strict_vector_ffloor_v8f64:
218; CHECK: # %bb.0:
219; CHECK-NEXT: vrndscalepd $9, %zmm0, %zmm0
220; CHECK-NEXT: ret{{[l|q]}}
221 %res = call <8 x double> @llvm.experimental.constrained.floor.v8f64(<8 x double> %f, metadata !"fpexcept.strict")
222 ret <8 x double> %res
223}
224
225define <16 x float> @strict_vector_ftrunc_v16f32(<16 x float> %f) #0 {
226; CHECK-LABEL: strict_vector_ftrunc_v16f32:
227; CHECK: # %bb.0:
228; CHECK-NEXT: vrndscaleps $11, %zmm0, %zmm0
229; CHECK-NEXT: ret{{[l|q]}}
230 %res = call <16 x float> @llvm.experimental.constrained.trunc.v16f32(<16 x float> %f, metadata !"fpexcept.strict")
231 ret <16 x float> %res
232}
233
234define <8 x double> @strict_vector_ftrunc_v8f64(<8 x double> %f) #0 {
235; CHECK-LABEL: strict_vector_ftrunc_v8f64:
236; CHECK: # %bb.0:
237; CHECK-NEXT: vrndscalepd $11, %zmm0, %zmm0
238; CHECK-NEXT: ret{{[l|q]}}
239 %res = call <8 x double> @llvm.experimental.constrained.trunc.v8f64(<8 x double> %f, metadata !"fpexcept.strict")
240 ret <8 x double> %res
241}
242
243define <16 x float> @strict_vector_frint_v16f32(<16 x float> %f) #0 {
244; CHECK-LABEL: strict_vector_frint_v16f32:
245; CHECK: # %bb.0:
246; CHECK-NEXT: vrndscaleps $4, %zmm0, %zmm0
247; CHECK-NEXT: ret{{[l|q]}}
248 %res = call <16 x float> @llvm.experimental.constrained.rint.v16f32(<16 x float> %f,
249 metadata !"round.dynamic", metadata !"fpexcept.strict")
250 ret <16 x float> %res
251}
252
253define <8 x double> @strict_vector_frint_v8f64(<8 x double> %f) #0 {
254; CHECK-LABEL: strict_vector_frint_v8f64:
255; CHECK: # %bb.0:
256; CHECK-NEXT: vrndscalepd $4, %zmm0, %zmm0
257; CHECK-NEXT: ret{{[l|q]}}
258 %res = call <8 x double> @llvm.experimental.constrained.rint.v8f64(<8 x double> %f,
259 metadata !"round.dynamic", metadata !"fpexcept.strict")
260 ret <8 x double> %res
261}
262
263define <16 x float> @strict_vector_fnearbyint_v16f32(<16 x float> %f) #0 {
264; CHECK-LABEL: strict_vector_fnearbyint_v16f32:
265; CHECK: # %bb.0:
266; CHECK-NEXT: vrndscaleps $12, %zmm0, %zmm0
267; CHECK-NEXT: ret{{[l|q]}}
268 %res = call <16 x float> @llvm.experimental.constrained.nearbyint.v16f32(<16 x float> %f,
269 metadata !"round.dynamic", metadata !"fpexcept.strict")
270 ret <16 x float> %res
271}
272
273define <8 x double> @strict_vector_fnearbyint_v8f64(<8 x double> %f) #0 {
274; CHECK-LABEL: strict_vector_fnearbyint_v8f64:
275; CHECK: # %bb.0:
276; CHECK-NEXT: vrndscalepd $12, %zmm0, %zmm0
277; CHECK-NEXT: ret{{[l|q]}}
278 %res = call <8 x double> @llvm.experimental.constrained.nearbyint.v8f64(<8 x double> %f,
279 metadata !"round.dynamic", metadata !"fpexcept.strict")
280 ret <8 x double> %res
281}
282
Craig Topper3bae2a42019-10-30 11:41:44 -0700283attributes #0 = { strictfp }