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