1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v -target-abi=ilp32d \
3 ; RUN: -verify-machineinstrs < %s | FileCheck %s
4 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v -target-abi=lp64d \
5 ; RUN: -verify-machineinstrs < %s | FileCheck %s
7 declare <2 x half> @llvm.experimental.constrained.fsub.v2f16(<2 x half>, <2 x half>, metadata, metadata)
8 define <2 x half> @vfsub_vv_v2f16(<2 x half> %va, <2 x half> %vb) strictfp {
9 ; CHECK-LABEL: vfsub_vv_v2f16:
10 ; CHECK: # %bb.0: # %entry
11 ; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
12 ; CHECK-NEXT: vfsub.vv v8, v8, v9
15 %vc = call <2 x half> @llvm.experimental.constrained.fsub.v2f16(<2 x half> %va, <2 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")
19 define <2 x half> @vfsub_vf_v2f16(<2 x half> %va, half %b) strictfp {
20 ; CHECK-LABEL: vfsub_vf_v2f16:
22 ; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
23 ; CHECK-NEXT: vfsub.vf v8, v8, fa0
25 %head = insertelement <2 x half> poison, half %b, i32 0
26 %splat = shufflevector <2 x half> %head, <2 x half> poison, <2 x i32> zeroinitializer
27 %vc = call <2 x half> @llvm.experimental.constrained.fsub.v2f16(<2 x half> %va, <2 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")
31 declare <4 x half> @llvm.experimental.constrained.fsub.v4f16(<4 x half>, <4 x half>, metadata, metadata)
32 define <4 x half> @vfsub_vv_v4f16(<4 x half> %va, <4 x half> %vb) strictfp {
33 ; CHECK-LABEL: vfsub_vv_v4f16:
34 ; CHECK: # %bb.0: # %entry
35 ; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
36 ; CHECK-NEXT: vfsub.vv v8, v8, v9
39 %vc = call <4 x half> @llvm.experimental.constrained.fsub.v4f16(<4 x half> %va, <4 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")
43 define <4 x half> @vfsub_vf_v4f16(<4 x half> %va, half %b) strictfp {
44 ; CHECK-LABEL: vfsub_vf_v4f16:
46 ; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
47 ; CHECK-NEXT: vfsub.vf v8, v8, fa0
49 %head = insertelement <4 x half> poison, half %b, i32 0
50 %splat = shufflevector <4 x half> %head, <4 x half> poison, <4 x i32> zeroinitializer
51 %vc = call <4 x half> @llvm.experimental.constrained.fsub.v4f16(<4 x half> %va, <4 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")
55 declare <8 x half> @llvm.experimental.constrained.fsub.v8f16(<8 x half>, <8 x half>, metadata, metadata)
56 define <8 x half> @vfsub_vv_v8f16(<8 x half> %va, <8 x half> %vb) strictfp {
57 ; CHECK-LABEL: vfsub_vv_v8f16:
58 ; CHECK: # %bb.0: # %entry
59 ; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma
60 ; CHECK-NEXT: vfsub.vv v8, v8, v9
63 %vc = call <8 x half> @llvm.experimental.constrained.fsub.v8f16(<8 x half> %va, <8 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")
67 define <8 x half> @vfsub_vf_v8f16(<8 x half> %va, half %b) strictfp {
68 ; CHECK-LABEL: vfsub_vf_v8f16:
70 ; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma
71 ; CHECK-NEXT: vfsub.vf v8, v8, fa0
73 %head = insertelement <8 x half> poison, half %b, i32 0
74 %splat = shufflevector <8 x half> %head, <8 x half> poison, <8 x i32> zeroinitializer
75 %vc = call <8 x half> @llvm.experimental.constrained.fsub.v8f16(<8 x half> %va, <8 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")
79 define <8 x half> @vfsub_fv_v8f16(<8 x half> %va, half %b) strictfp {
80 ; CHECK-LABEL: vfsub_fv_v8f16:
82 ; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma
83 ; CHECK-NEXT: vfrsub.vf v8, v8, fa0
85 %head = insertelement <8 x half> poison, half %b, i32 0
86 %splat = shufflevector <8 x half> %head, <8 x half> poison, <8 x i32> zeroinitializer
87 %vc = call <8 x half> @llvm.experimental.constrained.fsub.v8f16(<8 x half> %splat, <8 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")
91 declare <16 x half> @llvm.experimental.constrained.fsub.v16f16(<16 x half>, <16 x half>, metadata, metadata)
92 define <16 x half> @vfsub_vv_v16f16(<16 x half> %va, <16 x half> %vb) strictfp {
93 ; CHECK-LABEL: vfsub_vv_v16f16:
94 ; CHECK: # %bb.0: # %entry
95 ; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma
96 ; CHECK-NEXT: vfsub.vv v8, v8, v10
99 %vc = call <16 x half> @llvm.experimental.constrained.fsub.v16f16(<16 x half> %va, <16 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")
103 define <16 x half> @vfsub_vf_v16f16(<16 x half> %va, half %b) strictfp {
104 ; CHECK-LABEL: vfsub_vf_v16f16:
106 ; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma
107 ; CHECK-NEXT: vfsub.vf v8, v8, fa0
109 %head = insertelement <16 x half> poison, half %b, i32 0
110 %splat = shufflevector <16 x half> %head, <16 x half> poison, <16 x i32> zeroinitializer
111 %vc = call <16 x half> @llvm.experimental.constrained.fsub.v16f16(<16 x half> %va, <16 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")
115 declare <32 x half> @llvm.experimental.constrained.fsub.v32f16(<32 x half>, <32 x half>, metadata, metadata)
116 define <32 x half> @vfsub_vv_v32f16(<32 x half> %va, <32 x half> %vb) strictfp {
117 ; CHECK-LABEL: vfsub_vv_v32f16:
118 ; CHECK: # %bb.0: # %entry
119 ; CHECK-NEXT: li a0, 32
120 ; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma
121 ; CHECK-NEXT: vfsub.vv v8, v8, v12
124 %vc = call <32 x half> @llvm.experimental.constrained.fsub.v32f16(<32 x half> %va, <32 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")
128 define <32 x half> @vfsub_vf_v32f16(<32 x half> %va, half %b) strictfp {
129 ; CHECK-LABEL: vfsub_vf_v32f16:
131 ; CHECK-NEXT: li a0, 32
132 ; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma
133 ; CHECK-NEXT: vfsub.vf v8, v8, fa0
135 %head = insertelement <32 x half> poison, half %b, i32 0
136 %splat = shufflevector <32 x half> %head, <32 x half> poison, <32 x i32> zeroinitializer
137 %vc = call <32 x half> @llvm.experimental.constrained.fsub.v32f16(<32 x half> %va, <32 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")
141 declare <2 x float> @llvm.experimental.constrained.fsub.v2f32(<2 x float>, <2 x float>, metadata, metadata)
142 define <2 x float> @vfsub_vv_v2f32(<2 x float> %va, <2 x float> %vb) strictfp {
143 ; CHECK-LABEL: vfsub_vv_v2f32:
144 ; CHECK: # %bb.0: # %entry
145 ; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
146 ; CHECK-NEXT: vfsub.vv v8, v8, v9
149 %vc = call <2 x float> @llvm.experimental.constrained.fsub.v2f32(<2 x float> %va, <2 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")
153 define <2 x float> @vfsub_vf_v2f32(<2 x float> %va, float %b) strictfp {
154 ; CHECK-LABEL: vfsub_vf_v2f32:
156 ; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
157 ; CHECK-NEXT: vfsub.vf v8, v8, fa0
159 %head = insertelement <2 x float> poison, float %b, i32 0
160 %splat = shufflevector <2 x float> %head, <2 x float> poison, <2 x i32> zeroinitializer
161 %vc = call <2 x float> @llvm.experimental.constrained.fsub.v2f32(<2 x float> %va, <2 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")
165 declare <4 x float> @llvm.experimental.constrained.fsub.v4f32(<4 x float>, <4 x float>, metadata, metadata)
166 define <4 x float> @vfsub_vv_v4f32(<4 x float> %va, <4 x float> %vb) strictfp {
167 ; CHECK-LABEL: vfsub_vv_v4f32:
168 ; CHECK: # %bb.0: # %entry
169 ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
170 ; CHECK-NEXT: vfsub.vv v8, v8, v9
173 %vc = call <4 x float> @llvm.experimental.constrained.fsub.v4f32(<4 x float> %va, <4 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")
177 define <4 x float> @vfsub_vf_v4f32(<4 x float> %va, float %b) strictfp {
178 ; CHECK-LABEL: vfsub_vf_v4f32:
180 ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
181 ; CHECK-NEXT: vfsub.vf v8, v8, fa0
183 %head = insertelement <4 x float> poison, float %b, i32 0
184 %splat = shufflevector <4 x float> %head, <4 x float> poison, <4 x i32> zeroinitializer
185 %vc = call <4 x float> @llvm.experimental.constrained.fsub.v4f32(<4 x float> %va, <4 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")
189 declare <8 x float> @llvm.experimental.constrained.fsub.v8f32(<8 x float>, <8 x float>, metadata, metadata)
190 define <8 x float> @vfsub_vv_v8f32(<8 x float> %va, <8 x float> %vb) strictfp {
191 ; CHECK-LABEL: vfsub_vv_v8f32:
192 ; CHECK: # %bb.0: # %entry
193 ; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma
194 ; CHECK-NEXT: vfsub.vv v8, v8, v10
197 %vc = call <8 x float> @llvm.experimental.constrained.fsub.v8f32(<8 x float> %va, <8 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")
201 define <8 x float> @vfsub_vf_v8f32(<8 x float> %va, float %b) strictfp {
202 ; CHECK-LABEL: vfsub_vf_v8f32:
204 ; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma
205 ; CHECK-NEXT: vfsub.vf v8, v8, fa0
207 %head = insertelement <8 x float> poison, float %b, i32 0
208 %splat = shufflevector <8 x float> %head, <8 x float> poison, <8 x i32> zeroinitializer
209 %vc = call <8 x float> @llvm.experimental.constrained.fsub.v8f32(<8 x float> %va, <8 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")
213 define <8 x float> @vfsub_fv_v8f32(<8 x float> %va, float %b) strictfp {
214 ; CHECK-LABEL: vfsub_fv_v8f32:
216 ; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma
217 ; CHECK-NEXT: vfrsub.vf v8, v8, fa0
219 %head = insertelement <8 x float> poison, float %b, i32 0
220 %splat = shufflevector <8 x float> %head, <8 x float> poison, <8 x i32> zeroinitializer
221 %vc = call <8 x float> @llvm.experimental.constrained.fsub.v8f32(<8 x float> %splat, <8 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")
225 declare <16 x float> @llvm.experimental.constrained.fsub.v16f32(<16 x float>, <16 x float>, metadata, metadata)
226 define <16 x float> @vfsub_vv_v16f32(<16 x float> %va, <16 x float> %vb) strictfp {
227 ; CHECK-LABEL: vfsub_vv_v16f32:
228 ; CHECK: # %bb.0: # %entry
229 ; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma
230 ; CHECK-NEXT: vfsub.vv v8, v8, v12
233 %vc = call <16 x float> @llvm.experimental.constrained.fsub.v16f32(<16 x float> %va, <16 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")
237 define <16 x float> @vfsub_vf_v16f32(<16 x float> %va, float %b) strictfp {
238 ; CHECK-LABEL: vfsub_vf_v16f32:
240 ; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma
241 ; CHECK-NEXT: vfsub.vf v8, v8, fa0
243 %head = insertelement <16 x float> poison, float %b, i32 0
244 %splat = shufflevector <16 x float> %head, <16 x float> poison, <16 x i32> zeroinitializer
245 %vc = call <16 x float> @llvm.experimental.constrained.fsub.v16f32(<16 x float> %va, <16 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")
249 declare <2 x double> @llvm.experimental.constrained.fsub.v2f64(<2 x double>, <2 x double>, metadata, metadata)
250 define <2 x double> @vfsub_vv_v2f64(<2 x double> %va, <2 x double> %vb) strictfp {
251 ; CHECK-LABEL: vfsub_vv_v2f64:
252 ; CHECK: # %bb.0: # %entry
253 ; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma
254 ; CHECK-NEXT: vfsub.vv v8, v8, v9
257 %vc = call <2 x double> @llvm.experimental.constrained.fsub.v2f64(<2 x double> %va, <2 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")
261 define <2 x double> @vfsub_vf_v2f64(<2 x double> %va, double %b) strictfp {
262 ; CHECK-LABEL: vfsub_vf_v2f64:
264 ; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma
265 ; CHECK-NEXT: vfsub.vf v8, v8, fa0
267 %head = insertelement <2 x double> poison, double %b, i32 0
268 %splat = shufflevector <2 x double> %head, <2 x double> poison, <2 x i32> zeroinitializer
269 %vc = call <2 x double> @llvm.experimental.constrained.fsub.v2f64(<2 x double> %va, <2 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")
273 declare <4 x double> @llvm.experimental.constrained.fsub.v4f64(<4 x double>, <4 x double>, metadata, metadata)
274 define <4 x double> @vfsub_vv_v4f64(<4 x double> %va, <4 x double> %vb) strictfp {
275 ; CHECK-LABEL: vfsub_vv_v4f64:
276 ; CHECK: # %bb.0: # %entry
277 ; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma
278 ; CHECK-NEXT: vfsub.vv v8, v8, v10
281 %vc = call <4 x double> @llvm.experimental.constrained.fsub.v4f64(<4 x double> %va, <4 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")
285 define <4 x double> @vfsub_vf_v4f64(<4 x double> %va, double %b) strictfp {
286 ; CHECK-LABEL: vfsub_vf_v4f64:
288 ; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma
289 ; CHECK-NEXT: vfsub.vf v8, v8, fa0
291 %head = insertelement <4 x double> poison, double %b, i32 0
292 %splat = shufflevector <4 x double> %head, <4 x double> poison, <4 x i32> zeroinitializer
293 %vc = call <4 x double> @llvm.experimental.constrained.fsub.v4f64(<4 x double> %va, <4 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")
297 declare <8 x double> @llvm.experimental.constrained.fsub.v8f64(<8 x double>, <8 x double>, metadata, metadata)
298 define <8 x double> @vfsub_vv_v8f64(<8 x double> %va, <8 x double> %vb) strictfp {
299 ; CHECK-LABEL: vfsub_vv_v8f64:
300 ; CHECK: # %bb.0: # %entry
301 ; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma
302 ; CHECK-NEXT: vfsub.vv v8, v8, v12
305 %vc = call <8 x double> @llvm.experimental.constrained.fsub.v8f64(<8 x double> %va, <8 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")
309 define <8 x double> @vfsub_vf_v8f64(<8 x double> %va, double %b) strictfp {
310 ; CHECK-LABEL: vfsub_vf_v8f64:
312 ; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma
313 ; CHECK-NEXT: vfsub.vf v8, v8, fa0
315 %head = insertelement <8 x double> poison, double %b, i32 0
316 %splat = shufflevector <8 x double> %head, <8 x double> poison, <8 x i32> zeroinitializer
317 %vc = call <8 x double> @llvm.experimental.constrained.fsub.v8f64(<8 x double> %va, <8 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")
321 define <8 x double> @vfsub_fv_v8f64(<8 x double> %va, double %b) strictfp {
322 ; CHECK-LABEL: vfsub_fv_v8f64:
324 ; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma
325 ; CHECK-NEXT: vfrsub.vf v8, v8, fa0
327 %head = insertelement <8 x double> poison, double %b, i32 0
328 %splat = shufflevector <8 x double> %head, <8 x double> poison, <8 x i32> zeroinitializer
329 %vc = call <8 x double> @llvm.experimental.constrained.fsub.v8f64(<8 x double> %splat, <8 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")