Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vfmadd-constrained-sdnode.ll
blobc15b875e8f0c4ef03ec614572299fe18b86f0a5f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zfh,+zvfh,+v -target-abi=ilp32d \
3 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH
4 ; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zfh,+zvfh,+v -target-abi=lp64d \
5 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH
6 ; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zfhmin,+zvfhmin,+v -target-abi=ilp32d \
7 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN
8 ; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zfhmin,+zvfhmin,+v -target-abi=lp64d \
9 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN
11 ; This tests a mix of vfmacc and vfmadd by using different operand orders to
12 ; trigger commuting in TwoAddressInstructionPass.
14 declare <vscale x 1 x half> @llvm.experimental.constrained.fma.nxv1f16(<vscale x 1 x half>, <vscale x 1 x half>, <vscale x 1 x half>, metadata, metadata)
16 define <vscale x 1 x half> @vfmadd_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) strictfp {
17 ; ZVFH-LABEL: vfmadd_vv_nxv1f16:
18 ; ZVFH:       # %bb.0:
19 ; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
20 ; ZVFH-NEXT:    vfmadd.vv v8, v9, v10
21 ; ZVFH-NEXT:    ret
23 ; ZVFHMIN-LABEL: vfmadd_vv_nxv1f16:
24 ; ZVFHMIN:       # %bb.0:
25 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
26 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v10
27 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
28 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v8
29 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
30 ; ZVFHMIN-NEXT:    vfmadd.vv v9, v10, v11
31 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
32 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
33 ; ZVFHMIN-NEXT:    ret
34   %vd = call <vscale x 1 x half> @llvm.experimental.constrained.fma.nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")
35   ret <vscale x 1 x half> %vd
38 define <vscale x 1 x half> @vfmadd_vf_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, half %c) strictfp {
39 ; ZVFH-LABEL: vfmadd_vf_nxv1f16:
40 ; ZVFH:       # %bb.0:
41 ; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
42 ; ZVFH-NEXT:    vfmadd.vf v8, fa0, v9
43 ; ZVFH-NEXT:    ret
45 ; ZVFHMIN-LABEL: vfmadd_vf_nxv1f16:
46 ; ZVFHMIN:       # %bb.0:
47 ; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
48 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
49 ; ZVFHMIN-NEXT:    vfmv.v.f v10, fa5
50 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
51 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v11, v10
52 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
53 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v8
54 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v11
55 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
56 ; ZVFHMIN-NEXT:    vfmadd.vv v12, v9, v10
57 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
58 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v12
59 ; ZVFHMIN-NEXT:    ret
60   %head = insertelement <vscale x 1 x half> poison, half %c, i32 0
61   %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
62   %vd = call <vscale x 1 x half> @llvm.experimental.constrained.fma.nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %splat, <vscale x 1 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")
63   ret <vscale x 1 x half> %vd
66 declare <vscale x 2 x half> @llvm.experimental.constrained.fma.nxv2f16(<vscale x 2 x half>, <vscale x 2 x half>, <vscale x 2 x half>, metadata, metadata)
68 define <vscale x 2 x half> @vfmadd_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) strictfp {
69 ; ZVFH-LABEL: vfmadd_vv_nxv2f16:
70 ; ZVFH:       # %bb.0:
71 ; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
72 ; ZVFH-NEXT:    vfmadd.vv v8, v10, v9
73 ; ZVFH-NEXT:    ret
75 ; ZVFHMIN-LABEL: vfmadd_vv_nxv2f16:
76 ; ZVFHMIN:       # %bb.0:
77 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
78 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v9
79 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v10
80 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v8
81 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
82 ; ZVFHMIN-NEXT:    vfmadd.vv v10, v9, v11
83 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
84 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v10
85 ; ZVFHMIN-NEXT:    ret
86   %vd = call <vscale x 2 x half> @llvm.experimental.constrained.fma.nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vc, <vscale x 2 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")
87   ret <vscale x 2 x half> %vd
90 define <vscale x 2 x half> @vfmadd_vf_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, half %c) strictfp {
91 ; ZVFH-LABEL: vfmadd_vf_nxv2f16:
92 ; ZVFH:       # %bb.0:
93 ; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
94 ; ZVFH-NEXT:    vfmacc.vf v8, fa0, v9
95 ; ZVFH-NEXT:    ret
97 ; ZVFHMIN-LABEL: vfmadd_vf_nxv2f16:
98 ; ZVFHMIN:       # %bb.0:
99 ; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
100 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
101 ; ZVFHMIN-NEXT:    vfmv.v.f v10, fa5
102 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
103 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v11, v10
104 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v8
105 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v9
106 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v11
107 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
108 ; ZVFHMIN-NEXT:    vfmadd.vv v9, v8, v10
109 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
110 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
111 ; ZVFHMIN-NEXT:    ret
112   %head = insertelement <vscale x 2 x half> poison, half %c, i32 0
113   %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
114   %vd = call <vscale x 2 x half> @llvm.experimental.constrained.fma.nxv2f16(<vscale x 2 x half> %vb, <vscale x 2 x half> %splat, <vscale x 2 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")
115   ret <vscale x 2 x half> %vd
118 declare <vscale x 4 x half> @llvm.experimental.constrained.fma.nxv4f16(<vscale x 4 x half>, <vscale x 4 x half>, <vscale x 4 x half>, metadata, metadata)
120 define <vscale x 4 x half> @vfmadd_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) strictfp {
121 ; ZVFH-LABEL: vfmadd_vv_nxv4f16:
122 ; ZVFH:       # %bb.0:
123 ; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
124 ; ZVFH-NEXT:    vfmadd.vv v8, v9, v10
125 ; ZVFH-NEXT:    ret
127 ; ZVFHMIN-LABEL: vfmadd_vv_nxv4f16:
128 ; ZVFHMIN:       # %bb.0:
129 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
130 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
131 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v8
132 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v14, v9
133 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
134 ; ZVFHMIN-NEXT:    vfmadd.vv v14, v10, v12
135 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
136 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v14
137 ; ZVFHMIN-NEXT:    ret
138   %vd = call <vscale x 4 x half> @llvm.experimental.constrained.fma.nxv4f16(<vscale x 4 x half> %vb, <vscale x 4 x half> %va, <vscale x 4 x half> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")
139   ret <vscale x 4 x half> %vd
142 define <vscale x 4 x half> @vfmadd_vf_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, half %c) strictfp {
143 ; ZVFH-LABEL: vfmadd_vf_nxv4f16:
144 ; ZVFH:       # %bb.0:
145 ; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
146 ; ZVFH-NEXT:    vfmadd.vf v8, fa0, v9
147 ; ZVFH-NEXT:    ret
149 ; ZVFHMIN-LABEL: vfmadd_vf_nxv4f16:
150 ; ZVFHMIN:       # %bb.0:
151 ; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
152 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
153 ; ZVFHMIN-NEXT:    vfmv.v.f v10, fa5
154 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
155 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v10
156 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
157 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v14, v8
158 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
159 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
160 ; ZVFHMIN-NEXT:    vfmadd.vv v16, v14, v10
161 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
162 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v16
163 ; ZVFHMIN-NEXT:    ret
164   %head = insertelement <vscale x 4 x half> poison, half %c, i32 0
165   %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
166   %vd = call <vscale x 4 x half> @llvm.experimental.constrained.fma.nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %splat, <vscale x 4 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")
167   ret <vscale x 4 x half> %vd
170 declare <vscale x 8 x half> @llvm.experimental.constrained.fma.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>, <vscale x 8 x half>, metadata, metadata)
172 define <vscale x 8 x half> @vfmadd_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) strictfp {
173 ; ZVFH-LABEL: vfmadd_vv_nxv8f16:
174 ; ZVFH:       # %bb.0:
175 ; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
176 ; ZVFH-NEXT:    vfmacc.vv v8, v12, v10
177 ; ZVFH-NEXT:    ret
179 ; ZVFHMIN-LABEL: vfmadd_vv_nxv8f16:
180 ; ZVFHMIN:       # %bb.0:
181 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
182 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
183 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v20, v12
184 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
185 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
186 ; ZVFHMIN-NEXT:    vfmadd.vv v12, v20, v16
187 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
188 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v12
189 ; ZVFHMIN-NEXT:    ret
190   %vd = call <vscale x 8 x half> @llvm.experimental.constrained.fma.nxv8f16(<vscale x 8 x half> %vb, <vscale x 8 x half> %vc, <vscale x 8 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")
191   ret <vscale x 8 x half> %vd
194 define <vscale x 8 x half> @vfmadd_vf_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, half %c) strictfp {
195 ; ZVFH-LABEL: vfmadd_vf_nxv8f16:
196 ; ZVFH:       # %bb.0:
197 ; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
198 ; ZVFH-NEXT:    vfmacc.vf v8, fa0, v10
199 ; ZVFH-NEXT:    ret
201 ; ZVFHMIN-LABEL: vfmadd_vf_nxv8f16:
202 ; ZVFHMIN:       # %bb.0:
203 ; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
204 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
205 ; ZVFHMIN-NEXT:    vfmv.v.f v12, fa5
206 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
207 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v16, v12
208 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v8
209 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v20, v10
210 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
211 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
212 ; ZVFHMIN-NEXT:    vfmadd.vv v24, v20, v12
213 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
214 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v24
215 ; ZVFHMIN-NEXT:    ret
216   %head = insertelement <vscale x 8 x half> poison, half %c, i32 0
217   %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
218   %vd = call <vscale x 8 x half> @llvm.experimental.constrained.fma.nxv8f16(<vscale x 8 x half> %vb, <vscale x 8 x half> %splat, <vscale x 8 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")
219   ret <vscale x 8 x half> %vd
222 declare <vscale x 16 x half> @llvm.experimental.constrained.fma.nxv16f16(<vscale x 16 x half>, <vscale x 16 x half>, <vscale x 16 x half>, metadata, metadata)
224 define <vscale x 16 x half> @vfmadd_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) strictfp {
225 ; ZVFH-LABEL: vfmadd_vv_nxv16f16:
226 ; ZVFH:       # %bb.0:
227 ; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
228 ; ZVFH-NEXT:    vfmadd.vv v8, v16, v12
229 ; ZVFH-NEXT:    ret
231 ; ZVFHMIN-LABEL: vfmadd_vv_nxv16f16:
232 ; ZVFHMIN:       # %bb.0:
233 ; ZVFHMIN-NEXT:    addi sp, sp, -16
234 ; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16
235 ; ZVFHMIN-NEXT:    csrr a0, vlenb
236 ; ZVFHMIN-NEXT:    slli a0, a0, 2
237 ; ZVFHMIN-NEXT:    sub sp, sp, a0
238 ; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x04, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 4 * vlenb
239 ; ZVFHMIN-NEXT:    addi a0, sp, 16
240 ; ZVFHMIN-NEXT:    vs4r.v v16, (a0) # Unknown-size Folded Spill
241 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
242 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
243 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v8
244 ; ZVFHMIN-NEXT:    addi a0, sp, 16
245 ; ZVFHMIN-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
246 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v8
247 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
248 ; ZVFHMIN-NEXT:    vfmadd.vv v24, v0, v16
249 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
250 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v24
251 ; ZVFHMIN-NEXT:    csrr a0, vlenb
252 ; ZVFHMIN-NEXT:    slli a0, a0, 2
253 ; ZVFHMIN-NEXT:    add sp, sp, a0
254 ; ZVFHMIN-NEXT:    addi sp, sp, 16
255 ; ZVFHMIN-NEXT:    ret
256   %vd = call <vscale x 16 x half> @llvm.experimental.constrained.fma.nxv16f16(<vscale x 16 x half> %vc, <vscale x 16 x half> %va, <vscale x 16 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")
257   ret <vscale x 16 x half> %vd
260 define <vscale x 16 x half> @vfmadd_vf_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, half %c) strictfp {
261 ; ZVFH-LABEL: vfmadd_vf_nxv16f16:
262 ; ZVFH:       # %bb.0:
263 ; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
264 ; ZVFH-NEXT:    vfmadd.vf v8, fa0, v12
265 ; ZVFH-NEXT:    ret
267 ; ZVFHMIN-LABEL: vfmadd_vf_nxv16f16:
268 ; ZVFHMIN:       # %bb.0:
269 ; ZVFHMIN-NEXT:    addi sp, sp, -16
270 ; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16
271 ; ZVFHMIN-NEXT:    csrr a0, vlenb
272 ; ZVFHMIN-NEXT:    slli a0, a0, 2
273 ; ZVFHMIN-NEXT:    sub sp, sp, a0
274 ; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x04, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 4 * vlenb
275 ; ZVFHMIN-NEXT:    vmv4r.v v28, v12
276 ; ZVFHMIN-NEXT:    addi a0, sp, 16
277 ; ZVFHMIN-NEXT:    vs4r.v v8, (a0) # Unknown-size Folded Spill
278 ; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
279 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
280 ; ZVFHMIN-NEXT:    vfmv.v.f v16, fa5
281 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
282 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v24, v16
283 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v28
284 ; ZVFHMIN-NEXT:    addi a0, sp, 16
285 ; ZVFHMIN-NEXT:    vl4r.v v16, (a0) # Unknown-size Folded Reload
286 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v16
287 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v24
288 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
289 ; ZVFHMIN-NEXT:    vfmadd.vv v16, v0, v8
290 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
291 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v16
292 ; ZVFHMIN-NEXT:    csrr a0, vlenb
293 ; ZVFHMIN-NEXT:    slli a0, a0, 2
294 ; ZVFHMIN-NEXT:    add sp, sp, a0
295 ; ZVFHMIN-NEXT:    addi sp, sp, 16
296 ; ZVFHMIN-NEXT:    ret
297   %head = insertelement <vscale x 16 x half> poison, half %c, i32 0
298   %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
299   %vd = call <vscale x 16 x half> @llvm.experimental.constrained.fma.nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %splat, <vscale x 16 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")
300   ret <vscale x 16 x half> %vd
303 declare <vscale x 32 x half> @llvm.experimental.constrained.fma.nxv32f16(<vscale x 32 x half>, <vscale x 32 x half>, <vscale x 32 x half>, metadata, metadata)
305 define <vscale x 32 x half> @vfmadd_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, <vscale x 32 x half> %vc) strictfp {
306 ; ZVFH-LABEL: vfmadd_vv_nxv32f16:
307 ; ZVFH:       # %bb.0:
308 ; ZVFH-NEXT:    vl8re16.v v24, (a0)
309 ; ZVFH-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
310 ; ZVFH-NEXT:    vfmacc.vv v8, v16, v24
311 ; ZVFH-NEXT:    ret
313 ; ZVFHMIN-LABEL: vfmadd_vv_nxv32f16:
314 ; ZVFHMIN:       # %bb.0:
315 ; ZVFHMIN-NEXT:    addi sp, sp, -16
316 ; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16
317 ; ZVFHMIN-NEXT:    csrr a1, vlenb
318 ; ZVFHMIN-NEXT:    slli a1, a1, 5
319 ; ZVFHMIN-NEXT:    sub sp, sp, a1
320 ; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb
321 ; ZVFHMIN-NEXT:    vl8re16.v v0, (a0)
322 ; ZVFHMIN-NEXT:    vmv8r.v v24, v16
323 ; ZVFHMIN-NEXT:    csrr a0, vlenb
324 ; ZVFHMIN-NEXT:    slli a0, a0, 4
325 ; ZVFHMIN-NEXT:    add a0, sp, a0
326 ; ZVFHMIN-NEXT:    addi a0, a0, 16
327 ; ZVFHMIN-NEXT:    vs8r.v v16, (a0) # Unknown-size Folded Spill
328 ; ZVFHMIN-NEXT:    vmv8r.v v16, v8
329 ; ZVFHMIN-NEXT:    addi a0, sp, 16
330 ; ZVFHMIN-NEXT:    vs8r.v v8, (a0) # Unknown-size Folded Spill
331 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
332 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v16
333 ; ZVFHMIN-NEXT:    csrr a0, vlenb
334 ; ZVFHMIN-NEXT:    li a1, 24
335 ; ZVFHMIN-NEXT:    mul a0, a0, a1
336 ; ZVFHMIN-NEXT:    add a0, sp, a0
337 ; ZVFHMIN-NEXT:    addi a0, a0, 16
338 ; ZVFHMIN-NEXT:    vs8r.v v8, (a0) # Unknown-size Folded Spill
339 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v24
340 ; ZVFHMIN-NEXT:    csrr a0, vlenb
341 ; ZVFHMIN-NEXT:    slli a0, a0, 3
342 ; ZVFHMIN-NEXT:    add a0, sp, a0
343 ; ZVFHMIN-NEXT:    addi a0, a0, 16
344 ; ZVFHMIN-NEXT:    vs8r.v v8, (a0) # Unknown-size Folded Spill
345 ; ZVFHMIN-NEXT:    vmv8r.v v8, v0
346 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v8
347 ; ZVFHMIN-NEXT:    csrr a0, vlenb
348 ; ZVFHMIN-NEXT:    li a1, 24
349 ; ZVFHMIN-NEXT:    mul a0, a0, a1
350 ; ZVFHMIN-NEXT:    add a0, sp, a0
351 ; ZVFHMIN-NEXT:    addi a0, a0, 16
352 ; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # Unknown-size Folded Reload
353 ; ZVFHMIN-NEXT:    csrr a0, vlenb
354 ; ZVFHMIN-NEXT:    slli a0, a0, 3
355 ; ZVFHMIN-NEXT:    add a0, sp, a0
356 ; ZVFHMIN-NEXT:    addi a0, a0, 16
357 ; ZVFHMIN-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
358 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
359 ; ZVFHMIN-NEXT:    vfmadd.vv v0, v16, v24
360 ; ZVFHMIN-NEXT:    addi a0, sp, 16
361 ; ZVFHMIN-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
362 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
363 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v20
364 ; ZVFHMIN-NEXT:    csrr a0, vlenb
365 ; ZVFHMIN-NEXT:    slli a0, a0, 3
366 ; ZVFHMIN-NEXT:    add a0, sp, a0
367 ; ZVFHMIN-NEXT:    addi a0, a0, 16
368 ; ZVFHMIN-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
369 ; ZVFHMIN-NEXT:    csrr a0, vlenb
370 ; ZVFHMIN-NEXT:    slli a0, a0, 4
371 ; ZVFHMIN-NEXT:    add a0, sp, a0
372 ; ZVFHMIN-NEXT:    addi a0, a0, 16
373 ; ZVFHMIN-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
374 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v20
375 ; ZVFHMIN-NEXT:    csrr a0, vlenb
376 ; ZVFHMIN-NEXT:    li a1, 24
377 ; ZVFHMIN-NEXT:    mul a0, a0, a1
378 ; ZVFHMIN-NEXT:    add a0, sp, a0
379 ; ZVFHMIN-NEXT:    addi a0, a0, 16
380 ; ZVFHMIN-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
381 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
382 ; ZVFHMIN-NEXT:    csrr a0, vlenb
383 ; ZVFHMIN-NEXT:    li a1, 24
384 ; ZVFHMIN-NEXT:    mul a0, a0, a1
385 ; ZVFHMIN-NEXT:    add a0, sp, a0
386 ; ZVFHMIN-NEXT:    addi a0, a0, 16
387 ; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
388 ; ZVFHMIN-NEXT:    csrr a0, vlenb
389 ; ZVFHMIN-NEXT:    slli a0, a0, 3
390 ; ZVFHMIN-NEXT:    add a0, sp, a0
391 ; ZVFHMIN-NEXT:    addi a0, a0, 16
392 ; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # Unknown-size Folded Reload
393 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
394 ; ZVFHMIN-NEXT:    vfmadd.vv v16, v8, v24
395 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
396 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v0
397 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v16
398 ; ZVFHMIN-NEXT:    csrr a0, vlenb
399 ; ZVFHMIN-NEXT:    slli a0, a0, 5
400 ; ZVFHMIN-NEXT:    add sp, sp, a0
401 ; ZVFHMIN-NEXT:    addi sp, sp, 16
402 ; ZVFHMIN-NEXT:    ret
403   %vd = call <vscale x 32 x half> @llvm.experimental.constrained.fma.nxv32f16(<vscale x 32 x half> %vc, <vscale x 32 x half> %vb, <vscale x 32 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")
404   ret <vscale x 32 x half> %vd
407 define <vscale x 32 x half> @vfmadd_vf_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, half %c) strictfp {
408 ; ZVFH-LABEL: vfmadd_vf_nxv32f16:
409 ; ZVFH:       # %bb.0:
410 ; ZVFH-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
411 ; ZVFH-NEXT:    vfmacc.vf v8, fa0, v16
412 ; ZVFH-NEXT:    ret
414 ; ZVFHMIN-LABEL: vfmadd_vf_nxv32f16:
415 ; ZVFHMIN:       # %bb.0:
416 ; ZVFHMIN-NEXT:    addi sp, sp, -16
417 ; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16
418 ; ZVFHMIN-NEXT:    csrr a0, vlenb
419 ; ZVFHMIN-NEXT:    li a1, 24
420 ; ZVFHMIN-NEXT:    mul a0, a0, a1
421 ; ZVFHMIN-NEXT:    sub sp, sp, a0
422 ; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 24 * vlenb
423 ; ZVFHMIN-NEXT:    addi a0, sp, 16
424 ; ZVFHMIN-NEXT:    vs8r.v v8, (a0) # Unknown-size Folded Spill
425 ; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
426 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
427 ; ZVFHMIN-NEXT:    vfmv.v.f v24, fa5
428 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
429 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v4, v24
430 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v8
431 ; ZVFHMIN-NEXT:    csrr a0, vlenb
432 ; ZVFHMIN-NEXT:    slli a0, a0, 4
433 ; ZVFHMIN-NEXT:    add a0, sp, a0
434 ; ZVFHMIN-NEXT:    addi a0, a0, 16
435 ; ZVFHMIN-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
436 ; ZVFHMIN-NEXT:    vmv8r.v v8, v16
437 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
438 ; ZVFHMIN-NEXT:    csrr a0, vlenb
439 ; ZVFHMIN-NEXT:    slli a0, a0, 3
440 ; ZVFHMIN-NEXT:    add a0, sp, a0
441 ; ZVFHMIN-NEXT:    addi a0, a0, 16
442 ; ZVFHMIN-NEXT:    vs8r.v v16, (a0) # Unknown-size Folded Spill
443 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v4
444 ; ZVFHMIN-NEXT:    vmv.v.v v8, v4
445 ; ZVFHMIN-NEXT:    csrr a0, vlenb
446 ; ZVFHMIN-NEXT:    slli a0, a0, 4
447 ; ZVFHMIN-NEXT:    add a0, sp, a0
448 ; ZVFHMIN-NEXT:    addi a0, a0, 16
449 ; ZVFHMIN-NEXT:    vl8r.v v0, (a0) # Unknown-size Folded Reload
450 ; ZVFHMIN-NEXT:    csrr a0, vlenb
451 ; ZVFHMIN-NEXT:    slli a0, a0, 3
452 ; ZVFHMIN-NEXT:    add a0, sp, a0
453 ; ZVFHMIN-NEXT:    addi a0, a0, 16
454 ; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # Unknown-size Folded Reload
455 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
456 ; ZVFHMIN-NEXT:    vfmadd.vv v16, v24, v0
457 ; ZVFHMIN-NEXT:    addi a0, sp, 16
458 ; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # Unknown-size Folded Reload
459 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
460 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v28
461 ; ZVFHMIN-NEXT:    csrr a0, vlenb
462 ; ZVFHMIN-NEXT:    slli a0, a0, 4
463 ; ZVFHMIN-NEXT:    add a0, sp, a0
464 ; ZVFHMIN-NEXT:    addi a0, a0, 16
465 ; ZVFHMIN-NEXT:    vs8r.v v0, (a0) # Unknown-size Folded Spill
466 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v8
467 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v12
468 ; ZVFHMIN-NEXT:    csrr a0, vlenb
469 ; ZVFHMIN-NEXT:    slli a0, a0, 4
470 ; ZVFHMIN-NEXT:    add a0, sp, a0
471 ; ZVFHMIN-NEXT:    addi a0, a0, 16
472 ; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
473 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
474 ; ZVFHMIN-NEXT:    vfmadd.vv v0, v24, v8
475 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
476 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v16
477 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v0
478 ; ZVFHMIN-NEXT:    csrr a0, vlenb
479 ; ZVFHMIN-NEXT:    li a1, 24
480 ; ZVFHMIN-NEXT:    mul a0, a0, a1
481 ; ZVFHMIN-NEXT:    add sp, sp, a0
482 ; ZVFHMIN-NEXT:    addi sp, sp, 16
483 ; ZVFHMIN-NEXT:    ret
484   %head = insertelement <vscale x 32 x half> poison, half %c, i32 0
485   %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer
486   %vd = call <vscale x 32 x half> @llvm.experimental.constrained.fma.nxv32f16(<vscale x 32 x half> %vb, <vscale x 32 x half> %splat, <vscale x 32 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")
487   ret <vscale x 32 x half> %vd
490 declare <vscale x 1 x float> @llvm.experimental.constrained.fma.nxv1f32(<vscale x 1 x float>, <vscale x 1 x float>, <vscale x 1 x float>, metadata, metadata)
492 define <vscale x 1 x float> @vfmadd_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) strictfp {
493 ; CHECK-LABEL: vfmadd_vv_nxv1f32:
494 ; CHECK:       # %bb.0:
495 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
496 ; CHECK-NEXT:    vfmadd.vv v8, v9, v10
497 ; CHECK-NEXT:    ret
498   %vd = call <vscale x 1 x float> @llvm.experimental.constrained.fma.nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")
499   ret <vscale x 1 x float> %vd
502 define <vscale x 1 x float> @vfmadd_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, float %c) strictfp {
503 ; CHECK-LABEL: vfmadd_vf_nxv1f32:
504 ; CHECK:       # %bb.0:
505 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
506 ; CHECK-NEXT:    vfmadd.vf v8, fa0, v9
507 ; CHECK-NEXT:    ret
508   %head = insertelement <vscale x 1 x float> poison, float %c, i32 0
509   %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
510   %vd = call <vscale x 1 x float> @llvm.experimental.constrained.fma.nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %splat, <vscale x 1 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")
511   ret <vscale x 1 x float> %vd
514 declare <vscale x 2 x float> @llvm.experimental.constrained.fma.nxv2f32(<vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x float>, metadata, metadata)
516 define <vscale x 2 x float> @vfmadd_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) strictfp {
517 ; CHECK-LABEL: vfmadd_vv_nxv2f32:
518 ; CHECK:       # %bb.0:
519 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
520 ; CHECK-NEXT:    vfmadd.vv v8, v10, v9
521 ; CHECK-NEXT:    ret
522   %vd = call <vscale x 2 x float> @llvm.experimental.constrained.fma.nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vc, <vscale x 2 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")
523   ret <vscale x 2 x float> %vd
526 define <vscale x 2 x float> @vfmadd_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, float %c) strictfp {
527 ; CHECK-LABEL: vfmadd_vf_nxv2f32:
528 ; CHECK:       # %bb.0:
529 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
530 ; CHECK-NEXT:    vfmacc.vf v8, fa0, v9
531 ; CHECK-NEXT:    ret
532   %head = insertelement <vscale x 2 x float> poison, float %c, i32 0
533   %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
534   %vd = call <vscale x 2 x float> @llvm.experimental.constrained.fma.nxv2f32(<vscale x 2 x float> %vb, <vscale x 2 x float> %splat, <vscale x 2 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")
535   ret <vscale x 2 x float> %vd
538 declare <vscale x 4 x float> @llvm.experimental.constrained.fma.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>, metadata, metadata)
540 define <vscale x 4 x float> @vfmadd_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) strictfp {
541 ; CHECK-LABEL: vfmadd_vv_nxv4f32:
542 ; CHECK:       # %bb.0:
543 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
544 ; CHECK-NEXT:    vfmadd.vv v8, v10, v12
545 ; CHECK-NEXT:    ret
546   %vd = call <vscale x 4 x float> @llvm.experimental.constrained.fma.nxv4f32(<vscale x 4 x float> %vb, <vscale x 4 x float> %va, <vscale x 4 x float> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")
547   ret <vscale x 4 x float> %vd
550 define <vscale x 4 x float> @vfmadd_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, float %c) strictfp {
551 ; CHECK-LABEL: vfmadd_vf_nxv4f32:
552 ; CHECK:       # %bb.0:
553 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
554 ; CHECK-NEXT:    vfmadd.vf v8, fa0, v10
555 ; CHECK-NEXT:    ret
556   %head = insertelement <vscale x 4 x float> poison, float %c, i32 0
557   %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
558   %vd = call <vscale x 4 x float> @llvm.experimental.constrained.fma.nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %splat, <vscale x 4 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")
559   ret <vscale x 4 x float> %vd
562 declare <vscale x 8 x float> @llvm.experimental.constrained.fma.nxv8f32(<vscale x 8 x float>, <vscale x 8 x float>, <vscale x 8 x float>, metadata, metadata)
564 define <vscale x 8 x float> @vfmadd_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) strictfp {
565 ; CHECK-LABEL: vfmadd_vv_nxv8f32:
566 ; CHECK:       # %bb.0:
567 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
568 ; CHECK-NEXT:    vfmacc.vv v8, v16, v12
569 ; CHECK-NEXT:    ret
570   %vd = call <vscale x 8 x float> @llvm.experimental.constrained.fma.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %vc, <vscale x 8 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")
571   ret <vscale x 8 x float> %vd
574 define <vscale x 8 x float> @vfmadd_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, float %c) strictfp {
575 ; CHECK-LABEL: vfmadd_vf_nxv8f32:
576 ; CHECK:       # %bb.0:
577 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
578 ; CHECK-NEXT:    vfmacc.vf v8, fa0, v12
579 ; CHECK-NEXT:    ret
580   %head = insertelement <vscale x 8 x float> poison, float %c, i32 0
581   %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
582   %vd = call <vscale x 8 x float> @llvm.experimental.constrained.fma.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %splat, <vscale x 8 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")
583   ret <vscale x 8 x float> %vd
586 declare <vscale x 16 x float> @llvm.experimental.constrained.fma.nxv16f32(<vscale x 16 x float>, <vscale x 16 x float>, <vscale x 16 x float>, metadata, metadata)
588 define <vscale x 16 x float> @vfmadd_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, <vscale x 16 x float> %vc) strictfp {
589 ; CHECK-LABEL: vfmadd_vv_nxv16f32:
590 ; CHECK:       # %bb.0:
591 ; CHECK-NEXT:    vl8re32.v v24, (a0)
592 ; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
593 ; CHECK-NEXT:    vfmadd.vv v8, v24, v16
594 ; CHECK-NEXT:    ret
595   %vd = call <vscale x 16 x float> @llvm.experimental.constrained.fma.nxv16f32(<vscale x 16 x float> %vc, <vscale x 16 x float> %va, <vscale x 16 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")
596   ret <vscale x 16 x float> %vd
599 define <vscale x 16 x float> @vfmadd_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, float %c) strictfp {
600 ; CHECK-LABEL: vfmadd_vf_nxv16f32:
601 ; CHECK:       # %bb.0:
602 ; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
603 ; CHECK-NEXT:    vfmadd.vf v8, fa0, v16
604 ; CHECK-NEXT:    ret
605   %head = insertelement <vscale x 16 x float> poison, float %c, i32 0
606   %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer
607   %vd = call <vscale x 16 x float> @llvm.experimental.constrained.fma.nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %splat, <vscale x 16 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")
608   ret <vscale x 16 x float> %vd
611 declare <vscale x 1 x double> @llvm.experimental.constrained.fma.nxv1f64(<vscale x 1 x double>, <vscale x 1 x double>, <vscale x 1 x double>, metadata, metadata)
613 define <vscale x 1 x double> @vfmadd_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x double> %vc) strictfp {
614 ; CHECK-LABEL: vfmadd_vv_nxv1f64:
615 ; CHECK:       # %bb.0:
616 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
617 ; CHECK-NEXT:    vfmadd.vv v8, v9, v10
618 ; CHECK-NEXT:    ret
619   %vd = call <vscale x 1 x double> @llvm.experimental.constrained.fma.nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x double> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")
620   ret <vscale x 1 x double> %vd
623 define <vscale x 1 x double> @vfmadd_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, double %c) strictfp {
624 ; CHECK-LABEL: vfmadd_vf_nxv1f64:
625 ; CHECK:       # %bb.0:
626 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
627 ; CHECK-NEXT:    vfmadd.vf v8, fa0, v9
628 ; CHECK-NEXT:    ret
629   %head = insertelement <vscale x 1 x double> poison, double %c, i32 0
630   %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
631   %vd = call <vscale x 1 x double> @llvm.experimental.constrained.fma.nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %splat, <vscale x 1 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")
632   ret <vscale x 1 x double> %vd
635 declare <vscale x 2 x double> @llvm.experimental.constrained.fma.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>, metadata, metadata)
637 define <vscale x 2 x double> @vfmadd_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, <vscale x 2 x double> %vc) strictfp {
638 ; CHECK-LABEL: vfmadd_vv_nxv2f64:
639 ; CHECK:       # %bb.0:
640 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
641 ; CHECK-NEXT:    vfmadd.vv v8, v12, v10
642 ; CHECK-NEXT:    ret
643   %vd = call <vscale x 2 x double> @llvm.experimental.constrained.fma.nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vc, <vscale x 2 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")
644   ret <vscale x 2 x double> %vd
647 define <vscale x 2 x double> @vfmadd_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, double %c) strictfp {
648 ; CHECK-LABEL: vfmadd_vf_nxv2f64:
649 ; CHECK:       # %bb.0:
650 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
651 ; CHECK-NEXT:    vfmacc.vf v8, fa0, v10
652 ; CHECK-NEXT:    ret
653   %head = insertelement <vscale x 2 x double> poison, double %c, i32 0
654   %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
655   %vd = call <vscale x 2 x double> @llvm.experimental.constrained.fma.nxv2f64(<vscale x 2 x double> %vb, <vscale x 2 x double> %splat, <vscale x 2 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")
656   ret <vscale x 2 x double> %vd
659 declare <vscale x 4 x double> @llvm.experimental.constrained.fma.nxv4f64(<vscale x 4 x double>, <vscale x 4 x double>, <vscale x 4 x double>, metadata, metadata)
661 define <vscale x 4 x double> @vfmadd_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, <vscale x 4 x double> %vc) strictfp {
662 ; CHECK-LABEL: vfmadd_vv_nxv4f64:
663 ; CHECK:       # %bb.0:
664 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
665 ; CHECK-NEXT:    vfmadd.vv v8, v12, v16
666 ; CHECK-NEXT:    ret
667   %vd = call <vscale x 4 x double> @llvm.experimental.constrained.fma.nxv4f64(<vscale x 4 x double> %vb, <vscale x 4 x double> %va, <vscale x 4 x double> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")
668   ret <vscale x 4 x double> %vd
671 define <vscale x 4 x double> @vfmadd_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, double %c) strictfp {
672 ; CHECK-LABEL: vfmadd_vf_nxv4f64:
673 ; CHECK:       # %bb.0:
674 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
675 ; CHECK-NEXT:    vfmadd.vf v8, fa0, v12
676 ; CHECK-NEXT:    ret
677   %head = insertelement <vscale x 4 x double> poison, double %c, i32 0
678   %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
679   %vd = call <vscale x 4 x double> @llvm.experimental.constrained.fma.nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %splat, <vscale x 4 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")
680   ret <vscale x 4 x double> %vd
683 declare <vscale x 8 x double> @llvm.experimental.constrained.fma.nxv8f64(<vscale x 8 x double>, <vscale x 8 x double>, <vscale x 8 x double>, metadata, metadata)
685 define <vscale x 8 x double> @vfmadd_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, <vscale x 8 x double> %vc) strictfp {
686 ; CHECK-LABEL: vfmadd_vv_nxv8f64:
687 ; CHECK:       # %bb.0:
688 ; CHECK-NEXT:    vl8re64.v v24, (a0)
689 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
690 ; CHECK-NEXT:    vfmacc.vv v8, v16, v24
691 ; CHECK-NEXT:    ret
692   %vd = call <vscale x 8 x double> @llvm.experimental.constrained.fma.nxv8f64(<vscale x 8 x double> %vb, <vscale x 8 x double> %vc, <vscale x 8 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")
693   ret <vscale x 8 x double> %vd
696 define <vscale x 8 x double> @vfmadd_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, double %c) strictfp {
697 ; CHECK-LABEL: vfmadd_vf_nxv8f64:
698 ; CHECK:       # %bb.0:
699 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
700 ; CHECK-NEXT:    vfmacc.vf v8, fa0, v16
701 ; CHECK-NEXT:    ret
702   %head = insertelement <vscale x 8 x double> poison, double %c, i32 0
703   %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
704   %vd = call <vscale x 8 x double> @llvm.experimental.constrained.fma.nxv8f64(<vscale x 8 x double> %vb, <vscale x 8 x double> %splat, <vscale x 8 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")
705   ret <vscale x 8 x double> %vd