xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/vfmsub-constrained-sdnode.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zvfh,+v -target-abi=ilp32d \
3; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH
4; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+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
10
11; This tests a mix of vfmsac and vfmsub by using different operand orders to
12; trigger commuting in TwoAddressInstructionPass.
13
14declare <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)
15
16define <vscale x 1 x half> @vfmsub_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) strictfp {
17; ZVFH-LABEL: vfmsub_vv_nxv1f16:
18; ZVFH:       # %bb.0:
19; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
20; ZVFH-NEXT:    vfmsub.vv v8, v9, v10
21; ZVFH-NEXT:    ret
22;
23; ZVFHMIN-LABEL: vfmsub_vv_nxv1f16:
24; ZVFHMIN:       # %bb.0:
25; ZVFHMIN-NEXT:    lui a0, 8
26; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, mf4, ta, ma
27; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v9
28; ZVFHMIN-NEXT:    vxor.vx v9, v10, a0
29; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
30; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v8
31; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
32; ZVFHMIN-NEXT:    vfmadd.vv v9, v11, v10
33; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
34; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
35; ZVFHMIN-NEXT:    ret
36  %neg = fneg <vscale x 1 x half> %vc
37  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
38  ret <vscale x 1 x half> %vd
39}
40
41define <vscale x 1 x half> @vfmsub_vf_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, half %c) strictfp {
42; ZVFH-LABEL: vfmsub_vf_nxv1f16:
43; ZVFH:       # %bb.0:
44; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
45; ZVFH-NEXT:    vfmsub.vf v8, fa0, v9
46; ZVFH-NEXT:    ret
47;
48; ZVFHMIN-LABEL: vfmsub_vf_nxv1f16:
49; ZVFHMIN:       # %bb.0:
50; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
51; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, mf4, ta, ma
52; ZVFHMIN-NEXT:    vmv.v.x v10, a0
53; ZVFHMIN-NEXT:    lui a0, 8
54; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v8
55; ZVFHMIN-NEXT:    vxor.vx v8, v9, a0
56; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v8
57; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
58; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
59; ZVFHMIN-NEXT:    vfmadd.vv v12, v11, v9
60; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
61; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v12
62; ZVFHMIN-NEXT:    ret
63  %head = insertelement <vscale x 1 x half> poison, half %c, i32 0
64  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
65  %neg = fneg <vscale x 1 x half> %vb
66  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
67  ret <vscale x 1 x half> %vd
68}
69
70declare <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)
71
72define <vscale x 2 x half> @vfmsub_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) strictfp {
73; ZVFH-LABEL: vfmsub_vv_nxv2f16:
74; ZVFH:       # %bb.0:
75; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
76; ZVFH-NEXT:    vfmsub.vv v8, v10, v9
77; ZVFH-NEXT:    ret
78;
79; ZVFHMIN-LABEL: vfmsub_vv_nxv2f16:
80; ZVFHMIN:       # %bb.0:
81; ZVFHMIN-NEXT:    lui a0, 8
82; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
83; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v10
84; ZVFHMIN-NEXT:    vxor.vx v9, v9, a0
85; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
86; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v8
87; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
88; ZVFHMIN-NEXT:    vfmadd.vv v9, v11, v10
89; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
90; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
91; ZVFHMIN-NEXT:    ret
92  %neg = fneg <vscale x 2 x half> %vb
93  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
94  ret <vscale x 2 x half> %vd
95}
96
97define <vscale x 2 x half> @vfmsub_vf_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, half %c) strictfp {
98; ZVFH-LABEL: vfmsub_vf_nxv2f16:
99; ZVFH:       # %bb.0:
100; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
101; ZVFH-NEXT:    vfmsac.vf v8, fa0, v9
102; ZVFH-NEXT:    ret
103;
104; ZVFHMIN-LABEL: vfmsub_vf_nxv2f16:
105; ZVFHMIN:       # %bb.0:
106; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
107; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
108; ZVFHMIN-NEXT:    vmv.v.x v10, a0
109; ZVFHMIN-NEXT:    lui a0, 8
110; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v9
111; ZVFHMIN-NEXT:    vxor.vx v8, v8, a0
112; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v8
113; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
114; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
115; ZVFHMIN-NEXT:    vfmadd.vv v12, v11, v9
116; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
117; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v12
118; ZVFHMIN-NEXT:    ret
119  %head = insertelement <vscale x 2 x half> poison, half %c, i32 0
120  %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
121  %neg = fneg <vscale x 2 x half> %va
122  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
123  ret <vscale x 2 x half> %vd
124}
125
126declare <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)
127
128define <vscale x 4 x half> @vfmsub_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) strictfp {
129; ZVFH-LABEL: vfmsub_vv_nxv4f16:
130; ZVFH:       # %bb.0:
131; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
132; ZVFH-NEXT:    vfmsub.vv v8, v9, v10
133; ZVFH-NEXT:    ret
134;
135; ZVFHMIN-LABEL: vfmsub_vv_nxv4f16:
136; ZVFHMIN:       # %bb.0:
137; ZVFHMIN-NEXT:    lui a0, 8
138; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m1, ta, ma
139; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v8
140; ZVFHMIN-NEXT:    vxor.vx v8, v10, a0
141; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v8
142; ZVFHMIN-NEXT:    vfwcvt.f.f.v v14, v9
143; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
144; ZVFHMIN-NEXT:    vfmadd.vv v14, v12, v10
145; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
146; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v14
147; ZVFHMIN-NEXT:    ret
148  %neg = fneg <vscale x 4 x half> %vc
149  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
150  ret <vscale x 4 x half> %vd
151}
152
153define <vscale x 4 x half> @vfmsub_vf_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, half %c) strictfp {
154; ZVFH-LABEL: vfmsub_vf_nxv4f16:
155; ZVFH:       # %bb.0:
156; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
157; ZVFH-NEXT:    vfmsub.vf v8, fa0, v9
158; ZVFH-NEXT:    ret
159;
160; ZVFHMIN-LABEL: vfmsub_vf_nxv4f16:
161; ZVFHMIN:       # %bb.0:
162; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
163; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m1, ta, ma
164; ZVFHMIN-NEXT:    vmv.v.x v10, a0
165; ZVFHMIN-NEXT:    lui a0, 8
166; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v8
167; ZVFHMIN-NEXT:    vxor.vx v8, v9, a0
168; ZVFHMIN-NEXT:    vfwcvt.f.f.v v14, v8
169; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v10
170; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
171; ZVFHMIN-NEXT:    vfmadd.vv v16, v12, v14
172; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
173; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v16
174; ZVFHMIN-NEXT:    ret
175  %head = insertelement <vscale x 4 x half> poison, half %c, i32 0
176  %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
177  %neg = fneg <vscale x 4 x half> %vb
178  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
179  ret <vscale x 4 x half> %vd
180}
181
182declare <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)
183
184define <vscale x 8 x half> @vfmsub_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) strictfp {
185; ZVFH-LABEL: vfmsub_vv_nxv8f16:
186; ZVFH:       # %bb.0:
187; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
188; ZVFH-NEXT:    vfmsac.vv v8, v12, v10
189; ZVFH-NEXT:    ret
190;
191; ZVFHMIN-LABEL: vfmsub_vv_nxv8f16:
192; ZVFHMIN:       # %bb.0:
193; ZVFHMIN-NEXT:    lui a0, 8
194; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m2, ta, ma
195; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
196; ZVFHMIN-NEXT:    vxor.vx v8, v8, a0
197; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v8
198; ZVFHMIN-NEXT:    vfwcvt.f.f.v v20, v10
199; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
200; ZVFHMIN-NEXT:    vfmadd.vv v20, v16, v12
201; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
202; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v20
203; ZVFHMIN-NEXT:    ret
204  %neg = fneg <vscale x 8 x half> %va
205  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
206  ret <vscale x 8 x half> %vd
207}
208
209define <vscale x 8 x half> @vfmsub_vf_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, half %c) strictfp {
210; ZVFH-LABEL: vfmsub_vf_nxv8f16:
211; ZVFH:       # %bb.0:
212; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
213; ZVFH-NEXT:    vfmsac.vf v8, fa0, v10
214; ZVFH-NEXT:    ret
215;
216; ZVFHMIN-LABEL: vfmsub_vf_nxv8f16:
217; ZVFHMIN:       # %bb.0:
218; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
219; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m2, ta, ma
220; ZVFHMIN-NEXT:    vmv.v.x v12, a0
221; ZVFHMIN-NEXT:    lui a0, 8
222; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v10
223; ZVFHMIN-NEXT:    vxor.vx v8, v8, a0
224; ZVFHMIN-NEXT:    vfwcvt.f.f.v v20, v8
225; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v12
226; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
227; ZVFHMIN-NEXT:    vfmadd.vv v24, v16, v20
228; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
229; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v24
230; ZVFHMIN-NEXT:    ret
231  %head = insertelement <vscale x 8 x half> poison, half %c, i32 0
232  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
233  %neg = fneg <vscale x 8 x half> %va
234  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
235  ret <vscale x 8 x half> %vd
236}
237
238declare <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)
239
240define <vscale x 16 x half> @vfmsub_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) strictfp {
241; ZVFH-LABEL: vfmsub_vv_nxv16f16:
242; ZVFH:       # %bb.0:
243; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
244; ZVFH-NEXT:    vfmsub.vv v8, v16, v12
245; ZVFH-NEXT:    ret
246;
247; ZVFHMIN-LABEL: vfmsub_vv_nxv16f16:
248; ZVFHMIN:       # %bb.0:
249; ZVFHMIN-NEXT:    addi sp, sp, -16
250; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16
251; ZVFHMIN-NEXT:    csrr a0, vlenb
252; ZVFHMIN-NEXT:    slli a0, a0, 2
253; ZVFHMIN-NEXT:    sub sp, sp, a0
254; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x04, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 4 * vlenb
255; ZVFHMIN-NEXT:    addi a0, sp, 16
256; ZVFHMIN-NEXT:    vs4r.v v16, (a0) # Unknown-size Folded Spill
257; ZVFHMIN-NEXT:    lui a0, 8
258; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
259; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
260; ZVFHMIN-NEXT:    vxor.vx v8, v12, a0
261; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v8
262; ZVFHMIN-NEXT:    addi a0, sp, 16
263; ZVFHMIN-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
264; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v8
265; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
266; ZVFHMIN-NEXT:    vfmadd.vv v24, v16, v0
267; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
268; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v24
269; ZVFHMIN-NEXT:    csrr a0, vlenb
270; ZVFHMIN-NEXT:    slli a0, a0, 2
271; ZVFHMIN-NEXT:    add sp, sp, a0
272; ZVFHMIN-NEXT:    .cfi_def_cfa sp, 16
273; ZVFHMIN-NEXT:    addi sp, sp, 16
274; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 0
275; ZVFHMIN-NEXT:    ret
276  %neg = fneg <vscale x 16 x half> %vb
277  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
278  ret <vscale x 16 x half> %vd
279}
280
281define <vscale x 16 x half> @vfmsub_vf_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, half %c) strictfp {
282; ZVFH-LABEL: vfmsub_vf_nxv16f16:
283; ZVFH:       # %bb.0:
284; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
285; ZVFH-NEXT:    vfmsub.vf v8, fa0, v12
286; ZVFH-NEXT:    ret
287;
288; ZVFHMIN-LABEL: vfmsub_vf_nxv16f16:
289; ZVFHMIN:       # %bb.0:
290; ZVFHMIN-NEXT:    addi sp, sp, -16
291; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16
292; ZVFHMIN-NEXT:    csrr a0, vlenb
293; ZVFHMIN-NEXT:    slli a0, a0, 2
294; ZVFHMIN-NEXT:    sub sp, sp, a0
295; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x04, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 4 * vlenb
296; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
297; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
298; ZVFHMIN-NEXT:    vmv.v.x v16, a0
299; ZVFHMIN-NEXT:    addi a0, sp, 16
300; ZVFHMIN-NEXT:    vs4r.v v16, (a0) # Unknown-size Folded Spill
301; ZVFHMIN-NEXT:    lui a0, 8
302; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v8
303; ZVFHMIN-NEXT:    vxor.vx v8, v12, a0
304; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v8
305; ZVFHMIN-NEXT:    addi a0, sp, 16
306; ZVFHMIN-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
307; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
308; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
309; ZVFHMIN-NEXT:    vfmadd.vv v16, v24, v0
310; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
311; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v16
312; ZVFHMIN-NEXT:    csrr a0, vlenb
313; ZVFHMIN-NEXT:    slli a0, a0, 2
314; ZVFHMIN-NEXT:    add sp, sp, a0
315; ZVFHMIN-NEXT:    .cfi_def_cfa sp, 16
316; ZVFHMIN-NEXT:    addi sp, sp, 16
317; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 0
318; ZVFHMIN-NEXT:    ret
319  %head = insertelement <vscale x 16 x half> poison, half %c, i32 0
320  %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
321  %neg = fneg <vscale x 16 x half> %vb
322  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
323  ret <vscale x 16 x half> %vd
324}
325
326declare <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)
327
328define <vscale x 32 x half> @vfmsub_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, <vscale x 32 x half> %vc) strictfp {
329; ZVFH-LABEL: vfmsub_vv_nxv32f16:
330; ZVFH:       # %bb.0:
331; ZVFH-NEXT:    vl8re16.v v24, (a0)
332; ZVFH-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
333; ZVFH-NEXT:    vfmsac.vv v8, v16, v24
334; ZVFH-NEXT:    ret
335;
336; ZVFHMIN-LABEL: vfmsub_vv_nxv32f16:
337; ZVFHMIN:       # %bb.0:
338; ZVFHMIN-NEXT:    addi sp, sp, -16
339; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16
340; ZVFHMIN-NEXT:    csrr a1, vlenb
341; ZVFHMIN-NEXT:    li a2, 24
342; ZVFHMIN-NEXT:    mul a1, a1, a2
343; ZVFHMIN-NEXT:    sub sp, sp, a1
344; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 24 * vlenb
345; ZVFHMIN-NEXT:    csrr a1, vlenb
346; ZVFHMIN-NEXT:    slli a1, a1, 4
347; ZVFHMIN-NEXT:    add a1, sp, a1
348; ZVFHMIN-NEXT:    addi a1, a1, 16
349; ZVFHMIN-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
350; ZVFHMIN-NEXT:    vl8re16.v v24, (a0)
351; ZVFHMIN-NEXT:    csrr a0, vlenb
352; ZVFHMIN-NEXT:    slli a0, a0, 3
353; ZVFHMIN-NEXT:    add a0, sp, a0
354; ZVFHMIN-NEXT:    addi a0, a0, 16
355; ZVFHMIN-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
356; ZVFHMIN-NEXT:    lui a0, 8
357; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
358; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v16
359; ZVFHMIN-NEXT:    addi a1, sp, 16
360; ZVFHMIN-NEXT:    vs8r.v v0, (a1) # Unknown-size Folded Spill
361; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m8, ta, ma
362; ZVFHMIN-NEXT:    vxor.vx v8, v8, a0
363; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
364; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
365; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v24
366; ZVFHMIN-NEXT:    addi a0, sp, 16
367; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # Unknown-size Folded Reload
368; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
369; ZVFHMIN-NEXT:    vfmadd.vv v0, v24, v16
370; ZVFHMIN-NEXT:    csrr a0, vlenb
371; ZVFHMIN-NEXT:    slli a0, a0, 4
372; ZVFHMIN-NEXT:    add a0, sp, a0
373; ZVFHMIN-NEXT:    addi a0, a0, 16
374; ZVFHMIN-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
375; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
376; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v20
377; ZVFHMIN-NEXT:    addi a0, sp, 16
378; ZVFHMIN-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
379; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v12
380; ZVFHMIN-NEXT:    csrr a0, vlenb
381; ZVFHMIN-NEXT:    slli a0, a0, 3
382; ZVFHMIN-NEXT:    add a0, sp, a0
383; ZVFHMIN-NEXT:    addi a0, a0, 16
384; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
385; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
386; ZVFHMIN-NEXT:    addi a0, sp, 16
387; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
388; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
389; ZVFHMIN-NEXT:    vfmadd.vv v16, v8, v24
390; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
391; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v0
392; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v16
393; ZVFHMIN-NEXT:    csrr a0, vlenb
394; ZVFHMIN-NEXT:    li a1, 24
395; ZVFHMIN-NEXT:    mul a0, a0, a1
396; ZVFHMIN-NEXT:    add sp, sp, a0
397; ZVFHMIN-NEXT:    .cfi_def_cfa sp, 16
398; ZVFHMIN-NEXT:    addi sp, sp, 16
399; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 0
400; ZVFHMIN-NEXT:    ret
401  %neg = fneg <vscale x 32 x half> %va
402  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
403  ret <vscale x 32 x half> %vd
404}
405
406define <vscale x 32 x half> @vfmsub_vf_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, half %c) strictfp {
407; ZVFH-LABEL: vfmsub_vf_nxv32f16:
408; ZVFH:       # %bb.0:
409; ZVFH-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
410; ZVFH-NEXT:    vfmsac.vf v8, fa0, v16
411; ZVFH-NEXT:    ret
412;
413; ZVFHMIN-LABEL: vfmsub_vf_nxv32f16:
414; ZVFHMIN:       # %bb.0:
415; ZVFHMIN-NEXT:    addi sp, sp, -16
416; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16
417; ZVFHMIN-NEXT:    csrr a0, vlenb
418; ZVFHMIN-NEXT:    li a1, 24
419; ZVFHMIN-NEXT:    mul a0, a0, a1
420; ZVFHMIN-NEXT:    sub sp, sp, a0
421; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 24 * vlenb
422; ZVFHMIN-NEXT:    csrr a0, vlenb
423; ZVFHMIN-NEXT:    slli a0, a0, 3
424; ZVFHMIN-NEXT:    add a0, sp, a0
425; ZVFHMIN-NEXT:    addi a0, a0, 16
426; ZVFHMIN-NEXT:    vs8r.v v16, (a0) # Unknown-size Folded Spill
427; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
428; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m8, ta, ma
429; ZVFHMIN-NEXT:    vmv.v.x v24, a0
430; ZVFHMIN-NEXT:    csrr a0, vlenb
431; ZVFHMIN-NEXT:    slli a0, a0, 4
432; ZVFHMIN-NEXT:    add a0, sp, a0
433; ZVFHMIN-NEXT:    addi a0, a0, 16
434; ZVFHMIN-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
435; ZVFHMIN-NEXT:    lui a0, 8
436; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
437; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
438; ZVFHMIN-NEXT:    addi a1, sp, 16
439; ZVFHMIN-NEXT:    vs8r.v v24, (a1) # Unknown-size Folded Spill
440; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m8, ta, ma
441; ZVFHMIN-NEXT:    vxor.vx v8, v8, a0
442; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
443; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
444; ZVFHMIN-NEXT:    csrr a0, vlenb
445; ZVFHMIN-NEXT:    slli a0, a0, 4
446; ZVFHMIN-NEXT:    add a0, sp, a0
447; ZVFHMIN-NEXT:    addi a0, a0, 16
448; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # Unknown-size Folded Reload
449; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v24
450; ZVFHMIN-NEXT:    addi a0, sp, 16
451; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # Unknown-size Folded Reload
452; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
453; ZVFHMIN-NEXT:    vfmadd.vv v0, v24, v16
454; ZVFHMIN-NEXT:    csrr a0, vlenb
455; ZVFHMIN-NEXT:    slli a0, a0, 3
456; ZVFHMIN-NEXT:    add a0, sp, a0
457; ZVFHMIN-NEXT:    addi a0, a0, 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 v16, v28
461; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v12
462; ZVFHMIN-NEXT:    csrr a0, vlenb
463; ZVFHMIN-NEXT:    slli a0, a0, 3
464; ZVFHMIN-NEXT:    add a0, sp, a0
465; ZVFHMIN-NEXT:    addi a0, a0, 16
466; ZVFHMIN-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
467; ZVFHMIN-NEXT:    csrr a0, vlenb
468; ZVFHMIN-NEXT:    slli a0, a0, 4
469; ZVFHMIN-NEXT:    add a0, sp, a0
470; ZVFHMIN-NEXT:    addi a0, a0, 16
471; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # Unknown-size Folded Reload
472; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v28
473; ZVFHMIN-NEXT:    csrr a0, vlenb
474; ZVFHMIN-NEXT:    slli a0, a0, 3
475; ZVFHMIN-NEXT:    add a0, sp, a0
476; ZVFHMIN-NEXT:    addi a0, a0, 16
477; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # Unknown-size Folded Reload
478; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
479; ZVFHMIN-NEXT:    vfmadd.vv v16, v8, v24
480; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
481; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v0
482; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v16
483; ZVFHMIN-NEXT:    csrr a0, vlenb
484; ZVFHMIN-NEXT:    li a1, 24
485; ZVFHMIN-NEXT:    mul a0, a0, a1
486; ZVFHMIN-NEXT:    add sp, sp, a0
487; ZVFHMIN-NEXT:    .cfi_def_cfa sp, 16
488; ZVFHMIN-NEXT:    addi sp, sp, 16
489; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 0
490; ZVFHMIN-NEXT:    ret
491  %head = insertelement <vscale x 32 x half> poison, half %c, i32 0
492  %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer
493  %neg = fneg <vscale x 32 x half> %va
494  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
495  ret <vscale x 32 x half> %vd
496}
497
498declare <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)
499
500define <vscale x 1 x float> @vfmsub_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) strictfp {
501; CHECK-LABEL: vfmsub_vv_nxv1f32:
502; CHECK:       # %bb.0:
503; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
504; CHECK-NEXT:    vfmsub.vv v8, v9, v10
505; CHECK-NEXT:    ret
506  %neg = fneg <vscale x 1 x float> %vc
507  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
508  ret <vscale x 1 x float> %vd
509}
510
511define <vscale x 1 x float> @vfmsub_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, float %c) strictfp {
512; CHECK-LABEL: vfmsub_vf_nxv1f32:
513; CHECK:       # %bb.0:
514; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
515; CHECK-NEXT:    vfmsub.vf v8, fa0, v9
516; CHECK-NEXT:    ret
517  %head = insertelement <vscale x 1 x float> poison, float %c, i32 0
518  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
519  %neg = fneg <vscale x 1 x float> %vb
520  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
521  ret <vscale x 1 x float> %vd
522}
523
524declare <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)
525
526define <vscale x 2 x float> @vfmsub_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) strictfp {
527; CHECK-LABEL: vfmsub_vv_nxv2f32:
528; CHECK:       # %bb.0:
529; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
530; CHECK-NEXT:    vfmsub.vv v8, v10, v9
531; CHECK-NEXT:    ret
532  %neg = fneg <vscale x 2 x float> %vb
533  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
534  ret <vscale x 2 x float> %vd
535}
536
537define <vscale x 2 x float> @vfmsub_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, float %c) strictfp {
538; CHECK-LABEL: vfmsub_vf_nxv2f32:
539; CHECK:       # %bb.0:
540; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
541; CHECK-NEXT:    vfmsac.vf v8, fa0, v9
542; CHECK-NEXT:    ret
543  %head = insertelement <vscale x 2 x float> poison, float %c, i32 0
544  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
545  %neg = fneg <vscale x 2 x float> %va
546  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
547  ret <vscale x 2 x float> %vd
548}
549
550declare <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)
551
552define <vscale x 4 x float> @vfmsub_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) strictfp {
553; CHECK-LABEL: vfmsub_vv_nxv4f32:
554; CHECK:       # %bb.0:
555; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
556; CHECK-NEXT:    vfmsub.vv v8, v10, v12
557; CHECK-NEXT:    ret
558  %neg = fneg <vscale x 4 x float> %vc
559  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
560  ret <vscale x 4 x float> %vd
561}
562
563define <vscale x 4 x float> @vfmsub_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, float %c) strictfp {
564; CHECK-LABEL: vfmsub_vf_nxv4f32:
565; CHECK:       # %bb.0:
566; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
567; CHECK-NEXT:    vfmsub.vf v8, fa0, v10
568; CHECK-NEXT:    ret
569  %head = insertelement <vscale x 4 x float> poison, float %c, i32 0
570  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
571  %neg = fneg <vscale x 4 x float> %vb
572  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
573  ret <vscale x 4 x float> %vd
574}
575
576declare <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)
577
578define <vscale x 8 x float> @vfmsub_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) strictfp {
579; CHECK-LABEL: vfmsub_vv_nxv8f32:
580; CHECK:       # %bb.0:
581; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
582; CHECK-NEXT:    vfmsac.vv v8, v16, v12
583; CHECK-NEXT:    ret
584  %neg = fneg <vscale x 8 x float> %va
585  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
586  ret <vscale x 8 x float> %vd
587}
588
589define <vscale x 8 x float> @vfmsub_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, float %c) strictfp {
590; CHECK-LABEL: vfmsub_vf_nxv8f32:
591; CHECK:       # %bb.0:
592; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
593; CHECK-NEXT:    vfmsac.vf v8, fa0, v12
594; CHECK-NEXT:    ret
595  %head = insertelement <vscale x 8 x float> poison, float %c, i32 0
596  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
597  %neg = fneg <vscale x 8 x float> %va
598  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
599  ret <vscale x 8 x float> %vd
600}
601
602declare <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)
603
604define <vscale x 16 x float> @vfmsub_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, <vscale x 16 x float> %vc) strictfp {
605; CHECK-LABEL: vfmsub_vv_nxv16f32:
606; CHECK:       # %bb.0:
607; CHECK-NEXT:    vl8re32.v v24, (a0)
608; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
609; CHECK-NEXT:    vfmsub.vv v8, v24, v16
610; CHECK-NEXT:    ret
611  %neg = fneg <vscale x 16 x float> %vb
612  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
613  ret <vscale x 16 x float> %vd
614}
615
616define <vscale x 16 x float> @vfmsub_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, float %c) strictfp {
617; CHECK-LABEL: vfmsub_vf_nxv16f32:
618; CHECK:       # %bb.0:
619; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
620; CHECK-NEXT:    vfmsub.vf v8, fa0, v16
621; CHECK-NEXT:    ret
622  %head = insertelement <vscale x 16 x float> poison, float %c, i32 0
623  %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer
624  %neg = fneg <vscale x 16 x float> %vb
625  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
626  ret <vscale x 16 x float> %vd
627}
628
629declare <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)
630
631define <vscale x 1 x double> @vfmsub_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x double> %vc) strictfp {
632; CHECK-LABEL: vfmsub_vv_nxv1f64:
633; CHECK:       # %bb.0:
634; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
635; CHECK-NEXT:    vfmsub.vv v8, v9, v10
636; CHECK-NEXT:    ret
637  %neg = fneg <vscale x 1 x double> %vc
638  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
639  ret <vscale x 1 x double> %vd
640}
641
642define <vscale x 1 x double> @vfmsub_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, double %c) strictfp {
643; CHECK-LABEL: vfmsub_vf_nxv1f64:
644; CHECK:       # %bb.0:
645; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
646; CHECK-NEXT:    vfmsub.vf v8, fa0, v9
647; CHECK-NEXT:    ret
648  %head = insertelement <vscale x 1 x double> poison, double %c, i32 0
649  %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
650  %neg = fneg <vscale x 1 x double> %vb
651  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
652  ret <vscale x 1 x double> %vd
653}
654
655declare <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)
656
657define <vscale x 2 x double> @vfmsub_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, <vscale x 2 x double> %vc) strictfp {
658; CHECK-LABEL: vfmsub_vv_nxv2f64:
659; CHECK:       # %bb.0:
660; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
661; CHECK-NEXT:    vfmsub.vv v8, v12, v10
662; CHECK-NEXT:    ret
663  %neg = fneg <vscale x 2 x double> %vb
664  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
665  ret <vscale x 2 x double> %vd
666}
667
668define <vscale x 2 x double> @vfmsub_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, double %c) strictfp {
669; CHECK-LABEL: vfmsub_vf_nxv2f64:
670; CHECK:       # %bb.0:
671; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
672; CHECK-NEXT:    vfmsac.vf v8, fa0, v10
673; CHECK-NEXT:    ret
674  %head = insertelement <vscale x 2 x double> poison, double %c, i32 0
675  %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
676  %neg = fneg <vscale x 2 x double> %va
677  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
678  ret <vscale x 2 x double> %vd
679}
680
681declare <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)
682
683define <vscale x 4 x double> @vfmsub_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, <vscale x 4 x double> %vc) strictfp {
684; CHECK-LABEL: vfmsub_vv_nxv4f64:
685; CHECK:       # %bb.0:
686; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
687; CHECK-NEXT:    vfmsub.vv v8, v12, v16
688; CHECK-NEXT:    ret
689  %neg = fneg <vscale x 4 x double> %vc
690  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
691  ret <vscale x 4 x double> %vd
692}
693
694define <vscale x 4 x double> @vfmsub_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, double %c) strictfp {
695; CHECK-LABEL: vfmsub_vf_nxv4f64:
696; CHECK:       # %bb.0:
697; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
698; CHECK-NEXT:    vfmsub.vf v8, fa0, v12
699; CHECK-NEXT:    ret
700  %head = insertelement <vscale x 4 x double> poison, double %c, i32 0
701  %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
702  %neg = fneg <vscale x 4 x double> %vb
703  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
704  ret <vscale x 4 x double> %vd
705}
706
707declare <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)
708
709define <vscale x 8 x double> @vfmsub_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, <vscale x 8 x double> %vc) strictfp {
710; CHECK-LABEL: vfmsub_vv_nxv8f64:
711; CHECK:       # %bb.0:
712; CHECK-NEXT:    vl8re64.v v24, (a0)
713; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
714; CHECK-NEXT:    vfmsac.vv v8, v16, v24
715; CHECK-NEXT:    ret
716  %neg = fneg <vscale x 8 x double> %va
717  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
718  ret <vscale x 8 x double> %vd
719}
720
721define <vscale x 8 x double> @vfmsub_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, double %c) strictfp {
722; CHECK-LABEL: vfmsub_vf_nxv8f64:
723; CHECK:       # %bb.0:
724; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
725; CHECK-NEXT:    vfmsac.vf v8, fa0, v16
726; CHECK-NEXT:    ret
727  %head = insertelement <vscale x 8 x double> poison, double %c, i32 0
728  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
729  %neg = fneg <vscale x 8 x double> %va
730  %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> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")
731  ret <vscale x 8 x double> %vd
732}
733