xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/vfwmacc-sdnode.ll (revision 879e801a916627fab9a90e2b51c9917b629c3392)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v -target-abi=ilp32d \
3; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH
4; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v -target-abi=lp64d \
5; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH
6; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfhmin,+v -target-abi=ilp32d \
7; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN
8; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfhmin,+v -target-abi=lp64d \
9; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN
10
11declare <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float>, <vscale x 1 x float>, <vscale x 1 x float>)
12
13define <vscale x 1 x float> @vfwmacc_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) {
14; ZVFH-LABEL: vfwmacc_vv_nxv1f32:
15; ZVFH:       # %bb.0:
16; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
17; ZVFH-NEXT:    vfwmacc.vv v8, v9, v10
18; ZVFH-NEXT:    ret
19;
20; ZVFHMIN-LABEL: vfwmacc_vv_nxv1f32:
21; ZVFHMIN:       # %bb.0:
22; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
23; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v9
24; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v10
25; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
26; ZVFHMIN-NEXT:    vfmacc.vv v8, v11, v9
27; ZVFHMIN-NEXT:    ret
28  %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float>
29  %ve = fpext <vscale x 1 x half> %vc to <vscale x 1 x float>
30  %vf = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vd, <vscale x 1 x float> %ve, <vscale x 1 x float> %va)
31  ret <vscale x 1 x float> %vf
32}
33
34define <vscale x 1 x float> @vfwmacc_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, half %c) {
35; ZVFH-LABEL: vfwmacc_vf_nxv1f32:
36; ZVFH:       # %bb.0:
37; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
38; ZVFH-NEXT:    vfwmacc.vf v8, fa0, v9
39; ZVFH-NEXT:    ret
40;
41; ZVFHMIN-LABEL: vfwmacc_vf_nxv1f32:
42; ZVFHMIN:       # %bb.0:
43; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
44; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
45; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
46; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
47; ZVFHMIN-NEXT:    vfmacc.vf v8, fa5, v10
48; ZVFHMIN-NEXT:    ret
49  %head = insertelement <vscale x 1 x half> poison, half %c, i32 0
50  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
51  %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float>
52  %ve = fpext <vscale x 1 x half> %splat to <vscale x 1 x float>
53  %vf = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vd, <vscale x 1 x float> %ve, <vscale x 1 x float> %va)
54  ret <vscale x 1 x float> %vf
55}
56
57define <vscale x 1 x float> @vfwnmacc_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) {
58; ZVFH-LABEL: vfwnmacc_vv_nxv1f32:
59; ZVFH:       # %bb.0:
60; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
61; ZVFH-NEXT:    vfwnmacc.vv v8, v9, v10
62; ZVFH-NEXT:    ret
63;
64; ZVFHMIN-LABEL: vfwnmacc_vv_nxv1f32:
65; ZVFHMIN:       # %bb.0:
66; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
67; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v9
68; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v10
69; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
70; ZVFHMIN-NEXT:    vfnmacc.vv v8, v11, v9
71; ZVFHMIN-NEXT:    ret
72  %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float>
73  %ve = fpext <vscale x 1 x half> %vc to <vscale x 1 x float>
74  %vf = fneg <vscale x 1 x float> %va
75  %vg = fneg <vscale x 1 x float> %vd
76  %vh = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vg, <vscale x 1 x float> %ve, <vscale x 1 x float> %vf)
77  ret <vscale x 1 x float> %vh
78}
79
80define <vscale x 1 x float> @vfwnmacc_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, half %c) {
81; ZVFH-LABEL: vfwnmacc_vf_nxv1f32:
82; ZVFH:       # %bb.0:
83; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
84; ZVFH-NEXT:    vfwnmacc.vf v8, fa0, v9
85; ZVFH-NEXT:    ret
86;
87; ZVFHMIN-LABEL: vfwnmacc_vf_nxv1f32:
88; ZVFHMIN:       # %bb.0:
89; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
90; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
91; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
92; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
93; ZVFHMIN-NEXT:    vfnmacc.vf v8, fa5, v10
94; ZVFHMIN-NEXT:    ret
95  %head = insertelement <vscale x 1 x half> poison, half %c, i32 0
96  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
97  %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float>
98  %ve = fpext <vscale x 1 x half> %splat to <vscale x 1 x float>
99  %vf = fneg <vscale x 1 x float> %va
100  %vg = fneg <vscale x 1 x float> %vd
101  %vh = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vg, <vscale x 1 x float> %ve, <vscale x 1 x float> %vf)
102  ret <vscale x 1 x float> %vh
103}
104
105define <vscale x 1 x float> @vfwnmacc_fv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, half %c) {
106; ZVFH-LABEL: vfwnmacc_fv_nxv1f32:
107; ZVFH:       # %bb.0:
108; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
109; ZVFH-NEXT:    vfwnmacc.vf v8, fa0, v9
110; ZVFH-NEXT:    ret
111;
112; ZVFHMIN-LABEL: vfwnmacc_fv_nxv1f32:
113; ZVFHMIN:       # %bb.0:
114; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
115; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
116; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
117; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
118; ZVFHMIN-NEXT:    vfnmacc.vf v8, fa5, v10
119; ZVFHMIN-NEXT:    ret
120  %head = insertelement <vscale x 1 x half> poison, half %c, i32 0
121  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
122  %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float>
123  %ve = fpext <vscale x 1 x half> %splat to <vscale x 1 x float>
124  %vf = fneg <vscale x 1 x float> %va
125  %vg = fneg <vscale x 1 x float> %ve
126  %vh = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vd, <vscale x 1 x float> %vg, <vscale x 1 x float> %vf)
127  ret <vscale x 1 x float> %vh
128}
129
130define <vscale x 1 x float> @vfwmsac_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) {
131; ZVFH-LABEL: vfwmsac_vv_nxv1f32:
132; ZVFH:       # %bb.0:
133; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
134; ZVFH-NEXT:    vfwmsac.vv v8, v9, v10
135; ZVFH-NEXT:    ret
136;
137; ZVFHMIN-LABEL: vfwmsac_vv_nxv1f32:
138; ZVFHMIN:       # %bb.0:
139; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
140; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v9
141; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v10
142; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
143; ZVFHMIN-NEXT:    vfmsac.vv v8, v11, v9
144; ZVFHMIN-NEXT:    ret
145  %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float>
146  %ve = fpext <vscale x 1 x half> %vc to <vscale x 1 x float>
147  %vf = fneg <vscale x 1 x float> %va
148  %vg = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vd, <vscale x 1 x float> %ve, <vscale x 1 x float> %vf)
149  ret <vscale x 1 x float> %vg
150}
151
152define <vscale x 1 x float> @vfwmsac_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, half %c) {
153; ZVFH-LABEL: vfwmsac_vf_nxv1f32:
154; ZVFH:       # %bb.0:
155; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
156; ZVFH-NEXT:    vfwmsac.vf v8, fa0, v9
157; ZVFH-NEXT:    ret
158;
159; ZVFHMIN-LABEL: vfwmsac_vf_nxv1f32:
160; ZVFHMIN:       # %bb.0:
161; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
162; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
163; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
164; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
165; ZVFHMIN-NEXT:    vfmsac.vf v8, fa5, v10
166; ZVFHMIN-NEXT:    ret
167  %head = insertelement <vscale x 1 x half> poison, half %c, i32 0
168  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
169  %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float>
170  %ve = fpext <vscale x 1 x half> %splat to <vscale x 1 x float>
171  %vf = fneg <vscale x 1 x float> %va
172  %vg = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vd, <vscale x 1 x float> %ve, <vscale x 1 x float> %vf)
173  ret <vscale x 1 x float> %vg
174}
175
176define <vscale x 1 x float> @vfwnmsac_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) {
177; ZVFH-LABEL: vfwnmsac_vv_nxv1f32:
178; ZVFH:       # %bb.0:
179; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
180; ZVFH-NEXT:    vfwnmsac.vv v8, v9, v10
181; ZVFH-NEXT:    ret
182;
183; ZVFHMIN-LABEL: vfwnmsac_vv_nxv1f32:
184; ZVFHMIN:       # %bb.0:
185; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
186; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v9
187; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v10
188; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
189; ZVFHMIN-NEXT:    vfnmsac.vv v8, v11, v9
190; ZVFHMIN-NEXT:    ret
191  %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float>
192  %ve = fpext <vscale x 1 x half> %vc to <vscale x 1 x float>
193  %vf = fneg <vscale x 1 x float> %vd
194  %vg = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vf, <vscale x 1 x float> %ve, <vscale x 1 x float> %va)
195  ret <vscale x 1 x float> %vg
196}
197
198define <vscale x 1 x float> @vfwnmsac_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, half %c) {
199; ZVFH-LABEL: vfwnmsac_vf_nxv1f32:
200; ZVFH:       # %bb.0:
201; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
202; ZVFH-NEXT:    vfwnmsac.vf v8, fa0, v9
203; ZVFH-NEXT:    ret
204;
205; ZVFHMIN-LABEL: vfwnmsac_vf_nxv1f32:
206; ZVFHMIN:       # %bb.0:
207; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
208; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
209; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
210; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
211; ZVFHMIN-NEXT:    vfnmsac.vf v8, fa5, v10
212; ZVFHMIN-NEXT:    ret
213  %head = insertelement <vscale x 1 x half> poison, half %c, i32 0
214  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
215  %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float>
216  %ve = fpext <vscale x 1 x half> %splat to <vscale x 1 x float>
217  %vf = fneg <vscale x 1 x float> %vd
218  %vg = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vf, <vscale x 1 x float> %ve, <vscale x 1 x float> %va)
219  ret <vscale x 1 x float> %vg
220}
221
222define <vscale x 1 x float> @vfwnmsac_fv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, half %c) {
223; ZVFH-LABEL: vfwnmsac_fv_nxv1f32:
224; ZVFH:       # %bb.0:
225; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
226; ZVFH-NEXT:    vfwnmsac.vf v8, fa0, v9
227; ZVFH-NEXT:    ret
228;
229; ZVFHMIN-LABEL: vfwnmsac_fv_nxv1f32:
230; ZVFHMIN:       # %bb.0:
231; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
232; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
233; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
234; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
235; ZVFHMIN-NEXT:    vfnmsac.vf v8, fa5, v10
236; ZVFHMIN-NEXT:    ret
237  %head = insertelement <vscale x 1 x half> poison, half %c, i32 0
238  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
239  %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float>
240  %ve = fpext <vscale x 1 x half> %splat to <vscale x 1 x float>
241  %vf = fneg <vscale x 1 x float> %ve
242  %vg = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vd, <vscale x 1 x float> %vf, <vscale x 1 x float> %va)
243  ret <vscale x 1 x float> %vg
244}
245
246declare <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x float>)
247
248define <vscale x 2 x float> @vfwmacc_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) {
249; ZVFH-LABEL: vfwmacc_vv_nxv2f32:
250; ZVFH:       # %bb.0:
251; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
252; ZVFH-NEXT:    vfwmacc.vv v8, v9, v10
253; ZVFH-NEXT:    ret
254;
255; ZVFHMIN-LABEL: vfwmacc_vv_nxv2f32:
256; ZVFHMIN:       # %bb.0:
257; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
258; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v9
259; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v10
260; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
261; ZVFHMIN-NEXT:    vfmacc.vv v8, v11, v9
262; ZVFHMIN-NEXT:    ret
263  %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float>
264  %ve = fpext <vscale x 2 x half> %vc to <vscale x 2 x float>
265  %vf = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vd, <vscale x 2 x float> %ve, <vscale x 2 x float> %va)
266  ret <vscale x 2 x float> %vf
267}
268
269define <vscale x 2 x float> @vfwmacc_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, half %c) {
270; ZVFH-LABEL: vfwmacc_vf_nxv2f32:
271; ZVFH:       # %bb.0:
272; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
273; ZVFH-NEXT:    vfwmacc.vf v8, fa0, v9
274; ZVFH-NEXT:    ret
275;
276; ZVFHMIN-LABEL: vfwmacc_vf_nxv2f32:
277; ZVFHMIN:       # %bb.0:
278; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
279; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
280; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
281; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
282; ZVFHMIN-NEXT:    vfmacc.vf v8, fa5, v10
283; ZVFHMIN-NEXT:    ret
284  %head = insertelement <vscale x 2 x half> poison, half %c, i32 0
285  %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
286  %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float>
287  %ve = fpext <vscale x 2 x half> %splat to <vscale x 2 x float>
288  %vf = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vd, <vscale x 2 x float> %ve, <vscale x 2 x float> %va)
289  ret <vscale x 2 x float> %vf
290}
291
292define <vscale x 2 x float> @vfwnmacc_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) {
293; ZVFH-LABEL: vfwnmacc_vv_nxv2f32:
294; ZVFH:       # %bb.0:
295; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
296; ZVFH-NEXT:    vfwnmacc.vv v8, v9, v10
297; ZVFH-NEXT:    ret
298;
299; ZVFHMIN-LABEL: vfwnmacc_vv_nxv2f32:
300; ZVFHMIN:       # %bb.0:
301; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
302; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v9
303; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v10
304; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
305; ZVFHMIN-NEXT:    vfnmacc.vv v8, v11, v9
306; ZVFHMIN-NEXT:    ret
307  %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float>
308  %ve = fpext <vscale x 2 x half> %vc to <vscale x 2 x float>
309  %vf = fneg <vscale x 2 x float> %va
310  %vg = fneg <vscale x 2 x float> %vd
311  %vh = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vg, <vscale x 2 x float> %ve, <vscale x 2 x float> %vf)
312  ret <vscale x 2 x float> %vh
313}
314
315define <vscale x 2 x float> @vfwnmacc_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, half %c) {
316; ZVFH-LABEL: vfwnmacc_vf_nxv2f32:
317; ZVFH:       # %bb.0:
318; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
319; ZVFH-NEXT:    vfwnmacc.vf v8, fa0, v9
320; ZVFH-NEXT:    ret
321;
322; ZVFHMIN-LABEL: vfwnmacc_vf_nxv2f32:
323; ZVFHMIN:       # %bb.0:
324; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
325; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
326; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
327; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
328; ZVFHMIN-NEXT:    vfnmacc.vf v8, fa5, v10
329; ZVFHMIN-NEXT:    ret
330  %head = insertelement <vscale x 2 x half> poison, half %c, i32 0
331  %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
332  %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float>
333  %ve = fpext <vscale x 2 x half> %splat to <vscale x 2 x float>
334  %vf = fneg <vscale x 2 x float> %va
335  %vg = fneg <vscale x 2 x float> %vd
336  %vh = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vg, <vscale x 2 x float> %ve, <vscale x 2 x float> %vf)
337  ret <vscale x 2 x float> %vh
338}
339
340define <vscale x 2 x float> @vfwnmacc_fv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, half %c) {
341; ZVFH-LABEL: vfwnmacc_fv_nxv2f32:
342; ZVFH:       # %bb.0:
343; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
344; ZVFH-NEXT:    vfwnmacc.vf v8, fa0, v9
345; ZVFH-NEXT:    ret
346;
347; ZVFHMIN-LABEL: vfwnmacc_fv_nxv2f32:
348; ZVFHMIN:       # %bb.0:
349; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
350; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
351; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
352; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
353; ZVFHMIN-NEXT:    vfnmacc.vf v8, fa5, v10
354; ZVFHMIN-NEXT:    ret
355  %head = insertelement <vscale x 2 x half> poison, half %c, i32 0
356  %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
357  %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float>
358  %ve = fpext <vscale x 2 x half> %splat to <vscale x 2 x float>
359  %vf = fneg <vscale x 2 x float> %va
360  %vg = fneg <vscale x 2 x float> %ve
361  %vh = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vd, <vscale x 2 x float> %vg, <vscale x 2 x float> %vf)
362  ret <vscale x 2 x float> %vh
363}
364
365define <vscale x 2 x float> @vfwmsac_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) {
366; ZVFH-LABEL: vfwmsac_vv_nxv2f32:
367; ZVFH:       # %bb.0:
368; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
369; ZVFH-NEXT:    vfwmsac.vv v8, v9, v10
370; ZVFH-NEXT:    ret
371;
372; ZVFHMIN-LABEL: vfwmsac_vv_nxv2f32:
373; ZVFHMIN:       # %bb.0:
374; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
375; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v9
376; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v10
377; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
378; ZVFHMIN-NEXT:    vfmsac.vv v8, v11, v9
379; ZVFHMIN-NEXT:    ret
380  %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float>
381  %ve = fpext <vscale x 2 x half> %vc to <vscale x 2 x float>
382  %vf = fneg <vscale x 2 x float> %va
383  %vg = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vd, <vscale x 2 x float> %ve, <vscale x 2 x float> %vf)
384  ret <vscale x 2 x float> %vg
385}
386
387define <vscale x 2 x float> @vfwmsac_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, half %c) {
388; ZVFH-LABEL: vfwmsac_vf_nxv2f32:
389; ZVFH:       # %bb.0:
390; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
391; ZVFH-NEXT:    vfwmsac.vf v8, fa0, v9
392; ZVFH-NEXT:    ret
393;
394; ZVFHMIN-LABEL: vfwmsac_vf_nxv2f32:
395; ZVFHMIN:       # %bb.0:
396; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
397; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
398; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
399; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
400; ZVFHMIN-NEXT:    vfmsac.vf v8, fa5, v10
401; ZVFHMIN-NEXT:    ret
402  %head = insertelement <vscale x 2 x half> poison, half %c, i32 0
403  %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
404  %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float>
405  %ve = fpext <vscale x 2 x half> %splat to <vscale x 2 x float>
406  %vf = fneg <vscale x 2 x float> %va
407  %vg = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vd, <vscale x 2 x float> %ve, <vscale x 2 x float> %vf)
408  ret <vscale x 2 x float> %vg
409}
410
411define <vscale x 2 x float> @vfwnmsac_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) {
412; ZVFH-LABEL: vfwnmsac_vv_nxv2f32:
413; ZVFH:       # %bb.0:
414; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
415; ZVFH-NEXT:    vfwnmsac.vv v8, v9, v10
416; ZVFH-NEXT:    ret
417;
418; ZVFHMIN-LABEL: vfwnmsac_vv_nxv2f32:
419; ZVFHMIN:       # %bb.0:
420; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
421; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v9
422; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v10
423; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
424; ZVFHMIN-NEXT:    vfnmsac.vv v8, v11, v9
425; ZVFHMIN-NEXT:    ret
426  %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float>
427  %ve = fpext <vscale x 2 x half> %vc to <vscale x 2 x float>
428  %vf = fneg <vscale x 2 x float> %vd
429  %vg = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vf, <vscale x 2 x float> %ve, <vscale x 2 x float> %va)
430  ret <vscale x 2 x float> %vg
431}
432
433define <vscale x 2 x float> @vfwnmsac_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, half %c) {
434; ZVFH-LABEL: vfwnmsac_vf_nxv2f32:
435; ZVFH:       # %bb.0:
436; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
437; ZVFH-NEXT:    vfwnmsac.vf v8, fa0, v9
438; ZVFH-NEXT:    ret
439;
440; ZVFHMIN-LABEL: vfwnmsac_vf_nxv2f32:
441; ZVFHMIN:       # %bb.0:
442; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
443; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
444; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
445; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
446; ZVFHMIN-NEXT:    vfnmsac.vf v8, fa5, v10
447; ZVFHMIN-NEXT:    ret
448  %head = insertelement <vscale x 2 x half> poison, half %c, i32 0
449  %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
450  %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float>
451  %ve = fpext <vscale x 2 x half> %splat to <vscale x 2 x float>
452  %vf = fneg <vscale x 2 x float> %vd
453  %vg = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vf, <vscale x 2 x float> %ve, <vscale x 2 x float> %va)
454  ret <vscale x 2 x float> %vg
455}
456
457define <vscale x 2 x float> @vfwnmsac_fv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, half %c) {
458; ZVFH-LABEL: vfwnmsac_fv_nxv2f32:
459; ZVFH:       # %bb.0:
460; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
461; ZVFH-NEXT:    vfwnmsac.vf v8, fa0, v9
462; ZVFH-NEXT:    ret
463;
464; ZVFHMIN-LABEL: vfwnmsac_fv_nxv2f32:
465; ZVFHMIN:       # %bb.0:
466; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
467; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
468; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
469; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
470; ZVFHMIN-NEXT:    vfnmsac.vf v8, fa5, v10
471; ZVFHMIN-NEXT:    ret
472  %head = insertelement <vscale x 2 x half> poison, half %c, i32 0
473  %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
474  %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float>
475  %ve = fpext <vscale x 2 x half> %splat to <vscale x 2 x float>
476  %vf = fneg <vscale x 2 x float> %ve
477  %vg = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vd, <vscale x 2 x float> %vf, <vscale x 2 x float> %va)
478  ret <vscale x 2 x float> %vg
479}
480
481
482declare <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>)
483
484define <vscale x 4 x float> @vfwmacc_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) {
485; ZVFH-LABEL: vfwmacc_vv_nxv4f32:
486; ZVFH:       # %bb.0:
487; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
488; ZVFH-NEXT:    vfwmacc.vv v8, v10, v11
489; ZVFH-NEXT:    ret
490;
491; ZVFHMIN-LABEL: vfwmacc_vv_nxv4f32:
492; ZVFHMIN:       # %bb.0:
493; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
494; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
495; ZVFHMIN-NEXT:    vfwcvt.f.f.v v14, v11
496; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
497; ZVFHMIN-NEXT:    vfmacc.vv v8, v12, v14
498; ZVFHMIN-NEXT:    ret
499  %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float>
500  %ve = fpext <vscale x 4 x half> %vc to <vscale x 4 x float>
501  %vf = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vd, <vscale x 4 x float> %ve, <vscale x 4 x float> %va)
502  ret <vscale x 4 x float> %vf
503}
504
505define <vscale x 4 x float> @vfwmacc_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, half %c) {
506; ZVFH-LABEL: vfwmacc_vf_nxv4f32:
507; ZVFH:       # %bb.0:
508; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
509; ZVFH-NEXT:    vfwmacc.vf v8, fa0, v10
510; ZVFH-NEXT:    ret
511;
512; ZVFHMIN-LABEL: vfwmacc_vf_nxv4f32:
513; ZVFHMIN:       # %bb.0:
514; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
515; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
516; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
517; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
518; ZVFHMIN-NEXT:    vfmacc.vf v8, fa5, v12
519; ZVFHMIN-NEXT:    ret
520  %head = insertelement <vscale x 4 x half> poison, half %c, i32 0
521  %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
522  %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float>
523  %ve = fpext <vscale x 4 x half> %splat to <vscale x 4 x float>
524  %vf = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vd, <vscale x 4 x float> %ve, <vscale x 4 x float> %va)
525  ret <vscale x 4 x float> %vf
526}
527
528define <vscale x 4 x float> @vfwnmacc_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) {
529; ZVFH-LABEL: vfwnmacc_vv_nxv4f32:
530; ZVFH:       # %bb.0:
531; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
532; ZVFH-NEXT:    vfwnmacc.vv v8, v10, v11
533; ZVFH-NEXT:    ret
534;
535; ZVFHMIN-LABEL: vfwnmacc_vv_nxv4f32:
536; ZVFHMIN:       # %bb.0:
537; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
538; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
539; ZVFHMIN-NEXT:    vfwcvt.f.f.v v14, v11
540; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
541; ZVFHMIN-NEXT:    vfnmacc.vv v8, v12, v14
542; ZVFHMIN-NEXT:    ret
543  %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float>
544  %ve = fpext <vscale x 4 x half> %vc to <vscale x 4 x float>
545  %vf = fneg <vscale x 4 x float> %va
546  %vg = fneg <vscale x 4 x float> %vd
547  %vh = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vg, <vscale x 4 x float> %ve, <vscale x 4 x float> %vf)
548  ret <vscale x 4 x float> %vh
549}
550
551define <vscale x 4 x float> @vfwnmacc_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, half %c) {
552; ZVFH-LABEL: vfwnmacc_vf_nxv4f32:
553; ZVFH:       # %bb.0:
554; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
555; ZVFH-NEXT:    vfwnmacc.vf v8, fa0, v10
556; ZVFH-NEXT:    ret
557;
558; ZVFHMIN-LABEL: vfwnmacc_vf_nxv4f32:
559; ZVFHMIN:       # %bb.0:
560; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
561; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
562; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
563; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
564; ZVFHMIN-NEXT:    vfnmacc.vf v8, fa5, v12
565; ZVFHMIN-NEXT:    ret
566  %head = insertelement <vscale x 4 x half> poison, half %c, i32 0
567  %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
568  %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float>
569  %ve = fpext <vscale x 4 x half> %splat to <vscale x 4 x float>
570  %vf = fneg <vscale x 4 x float> %va
571  %vg = fneg <vscale x 4 x float> %vd
572  %vh = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vg, <vscale x 4 x float> %ve, <vscale x 4 x float> %vf)
573  ret <vscale x 4 x float> %vh
574}
575
576define <vscale x 4 x float> @vfwnmacc_fv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, half %c) {
577; ZVFH-LABEL: vfwnmacc_fv_nxv4f32:
578; ZVFH:       # %bb.0:
579; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
580; ZVFH-NEXT:    vfwnmacc.vf v8, fa0, v10
581; ZVFH-NEXT:    ret
582;
583; ZVFHMIN-LABEL: vfwnmacc_fv_nxv4f32:
584; ZVFHMIN:       # %bb.0:
585; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
586; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
587; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
588; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
589; ZVFHMIN-NEXT:    vfnmacc.vf v8, fa5, v12
590; ZVFHMIN-NEXT:    ret
591  %head = insertelement <vscale x 4 x half> poison, half %c, i32 0
592  %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
593  %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float>
594  %ve = fpext <vscale x 4 x half> %splat to <vscale x 4 x float>
595  %vf = fneg <vscale x 4 x float> %va
596  %vg = fneg <vscale x 4 x float> %ve
597  %vh = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vd, <vscale x 4 x float> %vg, <vscale x 4 x float> %vf)
598  ret <vscale x 4 x float> %vh
599}
600
601define <vscale x 4 x float> @vfwmsac_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) {
602; ZVFH-LABEL: vfwmsac_vv_nxv4f32:
603; ZVFH:       # %bb.0:
604; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
605; ZVFH-NEXT:    vfwmsac.vv v8, v10, v11
606; ZVFH-NEXT:    ret
607;
608; ZVFHMIN-LABEL: vfwmsac_vv_nxv4f32:
609; ZVFHMIN:       # %bb.0:
610; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
611; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
612; ZVFHMIN-NEXT:    vfwcvt.f.f.v v14, v11
613; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
614; ZVFHMIN-NEXT:    vfmsac.vv v8, v12, v14
615; ZVFHMIN-NEXT:    ret
616  %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float>
617  %ve = fpext <vscale x 4 x half> %vc to <vscale x 4 x float>
618  %vf = fneg <vscale x 4 x float> %va
619  %vg = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vd, <vscale x 4 x float> %ve, <vscale x 4 x float> %vf)
620  ret <vscale x 4 x float> %vg
621}
622
623define <vscale x 4 x float> @vfwmsac_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, half %c) {
624; ZVFH-LABEL: vfwmsac_vf_nxv4f32:
625; ZVFH:       # %bb.0:
626; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
627; ZVFH-NEXT:    vfwmsac.vf v8, fa0, v10
628; ZVFH-NEXT:    ret
629;
630; ZVFHMIN-LABEL: vfwmsac_vf_nxv4f32:
631; ZVFHMIN:       # %bb.0:
632; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
633; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
634; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
635; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
636; ZVFHMIN-NEXT:    vfmsac.vf v8, fa5, v12
637; ZVFHMIN-NEXT:    ret
638  %head = insertelement <vscale x 4 x half> poison, half %c, i32 0
639  %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
640  %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float>
641  %ve = fpext <vscale x 4 x half> %splat to <vscale x 4 x float>
642  %vf = fneg <vscale x 4 x float> %va
643  %vg = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vd, <vscale x 4 x float> %ve, <vscale x 4 x float> %vf)
644  ret <vscale x 4 x float> %vg
645}
646
647define <vscale x 4 x float> @vfwnmsac_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) {
648; ZVFH-LABEL: vfwnmsac_vv_nxv4f32:
649; ZVFH:       # %bb.0:
650; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
651; ZVFH-NEXT:    vfwnmsac.vv v8, v10, v11
652; ZVFH-NEXT:    ret
653;
654; ZVFHMIN-LABEL: vfwnmsac_vv_nxv4f32:
655; ZVFHMIN:       # %bb.0:
656; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
657; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
658; ZVFHMIN-NEXT:    vfwcvt.f.f.v v14, v11
659; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
660; ZVFHMIN-NEXT:    vfnmsac.vv v8, v12, v14
661; ZVFHMIN-NEXT:    ret
662  %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float>
663  %ve = fpext <vscale x 4 x half> %vc to <vscale x 4 x float>
664  %vf = fneg <vscale x 4 x float> %vd
665  %vg = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vf, <vscale x 4 x float> %ve, <vscale x 4 x float> %va)
666  ret <vscale x 4 x float> %vg
667}
668
669define <vscale x 4 x float> @vfwnmsac_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, half %c) {
670; ZVFH-LABEL: vfwnmsac_vf_nxv4f32:
671; ZVFH:       # %bb.0:
672; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
673; ZVFH-NEXT:    vfwnmsac.vf v8, fa0, v10
674; ZVFH-NEXT:    ret
675;
676; ZVFHMIN-LABEL: vfwnmsac_vf_nxv4f32:
677; ZVFHMIN:       # %bb.0:
678; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
679; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
680; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
681; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
682; ZVFHMIN-NEXT:    vfnmsac.vf v8, fa5, v12
683; ZVFHMIN-NEXT:    ret
684  %head = insertelement <vscale x 4 x half> poison, half %c, i32 0
685  %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
686  %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float>
687  %ve = fpext <vscale x 4 x half> %splat to <vscale x 4 x float>
688  %vf = fneg <vscale x 4 x float> %vd
689  %vg = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vf, <vscale x 4 x float> %ve, <vscale x 4 x float> %va)
690  ret <vscale x 4 x float> %vg
691}
692
693define <vscale x 4 x float> @vfwnmsac_fv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, half %c) {
694; ZVFH-LABEL: vfwnmsac_fv_nxv4f32:
695; ZVFH:       # %bb.0:
696; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
697; ZVFH-NEXT:    vfwnmsac.vf v8, fa0, v10
698; ZVFH-NEXT:    ret
699;
700; ZVFHMIN-LABEL: vfwnmsac_fv_nxv4f32:
701; ZVFHMIN:       # %bb.0:
702; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
703; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
704; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
705; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
706; ZVFHMIN-NEXT:    vfnmsac.vf v8, fa5, v12
707; ZVFHMIN-NEXT:    ret
708  %head = insertelement <vscale x 4 x half> poison, half %c, i32 0
709  %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
710  %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float>
711  %ve = fpext <vscale x 4 x half> %splat to <vscale x 4 x float>
712  %vf = fneg <vscale x 4 x float> %ve
713  %vg = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vd, <vscale x 4 x float> %vf, <vscale x 4 x float> %va)
714  ret <vscale x 4 x float> %vg
715}
716
717declare <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float>, <vscale x 8 x float>, <vscale x 8 x float>)
718
719define <vscale x 8 x float> @vfwmacc_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) {
720; ZVFH-LABEL: vfwmacc_vv_nxv8f32:
721; ZVFH:       # %bb.0:
722; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
723; ZVFH-NEXT:    vfwmacc.vv v8, v12, v14
724; ZVFH-NEXT:    ret
725;
726; ZVFHMIN-LABEL: vfwmacc_vv_nxv8f32:
727; ZVFHMIN:       # %bb.0:
728; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
729; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
730; ZVFHMIN-NEXT:    vfwcvt.f.f.v v20, v14
731; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
732; ZVFHMIN-NEXT:    vfmacc.vv v8, v16, v20
733; ZVFHMIN-NEXT:    ret
734  %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float>
735  %ve = fpext <vscale x 8 x half> %vc to <vscale x 8 x float>
736  %vf = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vd, <vscale x 8 x float> %ve, <vscale x 8 x float> %va)
737  ret <vscale x 8 x float> %vf
738}
739
740define <vscale x 8 x float> @vfwmacc_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, half %c) {
741; ZVFH-LABEL: vfwmacc_vf_nxv8f32:
742; ZVFH:       # %bb.0:
743; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
744; ZVFH-NEXT:    vfwmacc.vf v8, fa0, v12
745; ZVFH-NEXT:    ret
746;
747; ZVFHMIN-LABEL: vfwmacc_vf_nxv8f32:
748; ZVFHMIN:       # %bb.0:
749; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
750; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
751; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
752; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
753; ZVFHMIN-NEXT:    vfmacc.vf v8, fa5, v16
754; ZVFHMIN-NEXT:    ret
755  %head = insertelement <vscale x 8 x half> poison, half %c, i32 0
756  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
757  %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float>
758  %ve = fpext <vscale x 8 x half> %splat to <vscale x 8 x float>
759  %vf = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vd, <vscale x 8 x float> %ve, <vscale x 8 x float> %va)
760  ret <vscale x 8 x float> %vf
761}
762
763define <vscale x 8 x float> @vfwnmacc_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) {
764; ZVFH-LABEL: vfwnmacc_vv_nxv8f32:
765; ZVFH:       # %bb.0:
766; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
767; ZVFH-NEXT:    vfwnmacc.vv v8, v12, v14
768; ZVFH-NEXT:    ret
769;
770; ZVFHMIN-LABEL: vfwnmacc_vv_nxv8f32:
771; ZVFHMIN:       # %bb.0:
772; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
773; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
774; ZVFHMIN-NEXT:    vfwcvt.f.f.v v20, v14
775; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
776; ZVFHMIN-NEXT:    vfnmacc.vv v8, v16, v20
777; ZVFHMIN-NEXT:    ret
778  %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float>
779  %ve = fpext <vscale x 8 x half> %vc to <vscale x 8 x float>
780  %vf = fneg <vscale x 8 x float> %va
781  %vg = fneg <vscale x 8 x float> %vd
782  %vh = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vg, <vscale x 8 x float> %ve, <vscale x 8 x float> %vf)
783  ret <vscale x 8 x float> %vh
784}
785
786define <vscale x 8 x float> @vfwnmacc_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, half %c) {
787; ZVFH-LABEL: vfwnmacc_vf_nxv8f32:
788; ZVFH:       # %bb.0:
789; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
790; ZVFH-NEXT:    vfwnmacc.vf v8, fa0, v12
791; ZVFH-NEXT:    ret
792;
793; ZVFHMIN-LABEL: vfwnmacc_vf_nxv8f32:
794; ZVFHMIN:       # %bb.0:
795; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
796; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
797; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
798; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
799; ZVFHMIN-NEXT:    vfnmacc.vf v8, fa5, v16
800; ZVFHMIN-NEXT:    ret
801  %head = insertelement <vscale x 8 x half> poison, half %c, i32 0
802  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
803  %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float>
804  %ve = fpext <vscale x 8 x half> %splat to <vscale x 8 x float>
805  %vf = fneg <vscale x 8 x float> %va
806  %vg = fneg <vscale x 8 x float> %vd
807  %vh = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vg, <vscale x 8 x float> %ve, <vscale x 8 x float> %vf)
808  ret <vscale x 8 x float> %vh
809}
810
811define <vscale x 8 x float> @vfwnmacc_fv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, half %c) {
812; ZVFH-LABEL: vfwnmacc_fv_nxv8f32:
813; ZVFH:       # %bb.0:
814; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
815; ZVFH-NEXT:    vfwnmacc.vf v8, fa0, v12
816; ZVFH-NEXT:    ret
817;
818; ZVFHMIN-LABEL: vfwnmacc_fv_nxv8f32:
819; ZVFHMIN:       # %bb.0:
820; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
821; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
822; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
823; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
824; ZVFHMIN-NEXT:    vfnmacc.vf v8, fa5, v16
825; ZVFHMIN-NEXT:    ret
826  %head = insertelement <vscale x 8 x half> poison, half %c, i32 0
827  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
828  %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float>
829  %ve = fpext <vscale x 8 x half> %splat to <vscale x 8 x float>
830  %vf = fneg <vscale x 8 x float> %va
831  %vg = fneg <vscale x 8 x float> %ve
832  %vh = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vd, <vscale x 8 x float> %vg, <vscale x 8 x float> %vf)
833  ret <vscale x 8 x float> %vh
834}
835
836define <vscale x 8 x float> @vfwmsac_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) {
837; ZVFH-LABEL: vfwmsac_vv_nxv8f32:
838; ZVFH:       # %bb.0:
839; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
840; ZVFH-NEXT:    vfwmsac.vv v8, v12, v14
841; ZVFH-NEXT:    ret
842;
843; ZVFHMIN-LABEL: vfwmsac_vv_nxv8f32:
844; ZVFHMIN:       # %bb.0:
845; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
846; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
847; ZVFHMIN-NEXT:    vfwcvt.f.f.v v20, v14
848; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
849; ZVFHMIN-NEXT:    vfmsac.vv v8, v16, v20
850; ZVFHMIN-NEXT:    ret
851  %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float>
852  %ve = fpext <vscale x 8 x half> %vc to <vscale x 8 x float>
853  %vf = fneg <vscale x 8 x float> %va
854  %vg = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vd, <vscale x 8 x float> %ve, <vscale x 8 x float> %vf)
855  ret <vscale x 8 x float> %vg
856}
857
858define <vscale x 8 x float> @vfwmsac_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, half %c) {
859; ZVFH-LABEL: vfwmsac_vf_nxv8f32:
860; ZVFH:       # %bb.0:
861; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
862; ZVFH-NEXT:    vfwmsac.vf v8, fa0, v12
863; ZVFH-NEXT:    ret
864;
865; ZVFHMIN-LABEL: vfwmsac_vf_nxv8f32:
866; ZVFHMIN:       # %bb.0:
867; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
868; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
869; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
870; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
871; ZVFHMIN-NEXT:    vfmsac.vf v8, fa5, v16
872; ZVFHMIN-NEXT:    ret
873  %head = insertelement <vscale x 8 x half> poison, half %c, i32 0
874  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
875  %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float>
876  %ve = fpext <vscale x 8 x half> %splat to <vscale x 8 x float>
877  %vf = fneg <vscale x 8 x float> %va
878  %vg = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vd, <vscale x 8 x float> %ve, <vscale x 8 x float> %vf)
879  ret <vscale x 8 x float> %vg
880}
881
882define <vscale x 8 x float> @vfwnmsac_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) {
883; ZVFH-LABEL: vfwnmsac_vv_nxv8f32:
884; ZVFH:       # %bb.0:
885; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
886; ZVFH-NEXT:    vfwnmsac.vv v8, v12, v14
887; ZVFH-NEXT:    ret
888;
889; ZVFHMIN-LABEL: vfwnmsac_vv_nxv8f32:
890; ZVFHMIN:       # %bb.0:
891; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
892; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
893; ZVFHMIN-NEXT:    vfwcvt.f.f.v v20, v14
894; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
895; ZVFHMIN-NEXT:    vfnmsac.vv v8, v16, v20
896; ZVFHMIN-NEXT:    ret
897  %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float>
898  %ve = fpext <vscale x 8 x half> %vc to <vscale x 8 x float>
899  %vf = fneg <vscale x 8 x float> %vd
900  %vg = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vf, <vscale x 8 x float> %ve, <vscale x 8 x float> %va)
901  ret <vscale x 8 x float> %vg
902}
903
904define <vscale x 8 x float> @vfwnmsac_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, half %c) {
905; ZVFH-LABEL: vfwnmsac_vf_nxv8f32:
906; ZVFH:       # %bb.0:
907; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
908; ZVFH-NEXT:    vfwnmsac.vf v8, fa0, v12
909; ZVFH-NEXT:    ret
910;
911; ZVFHMIN-LABEL: vfwnmsac_vf_nxv8f32:
912; ZVFHMIN:       # %bb.0:
913; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
914; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
915; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
916; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
917; ZVFHMIN-NEXT:    vfnmsac.vf v8, fa5, v16
918; ZVFHMIN-NEXT:    ret
919  %head = insertelement <vscale x 8 x half> poison, half %c, i32 0
920  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
921  %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float>
922  %ve = fpext <vscale x 8 x half> %splat to <vscale x 8 x float>
923  %vf = fneg <vscale x 8 x float> %vd
924  %vg = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vf, <vscale x 8 x float> %ve, <vscale x 8 x float> %va)
925  ret <vscale x 8 x float> %vg
926}
927
928define <vscale x 8 x float> @vfwnmsac_fv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, half %c) {
929; ZVFH-LABEL: vfwnmsac_fv_nxv8f32:
930; ZVFH:       # %bb.0:
931; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
932; ZVFH-NEXT:    vfwnmsac.vf v8, fa0, v12
933; ZVFH-NEXT:    ret
934;
935; ZVFHMIN-LABEL: vfwnmsac_fv_nxv8f32:
936; ZVFHMIN:       # %bb.0:
937; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
938; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
939; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
940; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
941; ZVFHMIN-NEXT:    vfnmsac.vf v8, fa5, v16
942; ZVFHMIN-NEXT:    ret
943  %head = insertelement <vscale x 8 x half> poison, half %c, i32 0
944  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
945  %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float>
946  %ve = fpext <vscale x 8 x half> %splat to <vscale x 8 x float>
947  %vf = fneg <vscale x 8 x float> %ve
948  %vg = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vd, <vscale x 8 x float> %vf, <vscale x 8 x float> %va)
949  ret <vscale x 8 x float> %vg
950}
951
952declare <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float>, <vscale x 16 x float>, <vscale x 16 x float>)
953
954define <vscale x 16 x float> @vfwmacc_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) {
955; ZVFH-LABEL: vfwmacc_vv_nxv16f32:
956; ZVFH:       # %bb.0:
957; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
958; ZVFH-NEXT:    vfwmacc.vv v8, v16, v20
959; ZVFH-NEXT:    ret
960;
961; ZVFHMIN-LABEL: vfwmacc_vv_nxv16f32:
962; ZVFHMIN:       # %bb.0:
963; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
964; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
965; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v20
966; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
967; ZVFHMIN-NEXT:    vfmacc.vv v8, v24, v0
968; ZVFHMIN-NEXT:    ret
969  %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float>
970  %ve = fpext <vscale x 16 x half> %vc to <vscale x 16 x float>
971  %vf = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vd, <vscale x 16 x float> %ve, <vscale x 16 x float> %va)
972  ret <vscale x 16 x float> %vf
973}
974
975define <vscale x 16 x float> @vfwmacc_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, half %c) {
976; ZVFH-LABEL: vfwmacc_vf_nxv16f32:
977; ZVFH:       # %bb.0:
978; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
979; ZVFH-NEXT:    vfwmacc.vf v8, fa0, v16
980; ZVFH-NEXT:    ret
981;
982; ZVFHMIN-LABEL: vfwmacc_vf_nxv16f32:
983; ZVFHMIN:       # %bb.0:
984; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
985; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
986; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
987; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
988; ZVFHMIN-NEXT:    vfmacc.vf v8, fa5, v24
989; ZVFHMIN-NEXT:    ret
990  %head = insertelement <vscale x 16 x half> poison, half %c, i32 0
991  %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
992  %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float>
993  %ve = fpext <vscale x 16 x half> %splat to <vscale x 16 x float>
994  %vf = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vd, <vscale x 16 x float> %ve, <vscale x 16 x float> %va)
995  ret <vscale x 16 x float> %vf
996}
997
998define <vscale x 16 x float> @vfwnmacc_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) {
999; ZVFH-LABEL: vfwnmacc_vv_nxv16f32:
1000; ZVFH:       # %bb.0:
1001; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1002; ZVFH-NEXT:    vfwnmacc.vv v8, v16, v20
1003; ZVFH-NEXT:    ret
1004;
1005; ZVFHMIN-LABEL: vfwnmacc_vv_nxv16f32:
1006; ZVFHMIN:       # %bb.0:
1007; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1008; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
1009; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v20
1010; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
1011; ZVFHMIN-NEXT:    vfnmacc.vv v8, v24, v0
1012; ZVFHMIN-NEXT:    ret
1013  %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float>
1014  %ve = fpext <vscale x 16 x half> %vc to <vscale x 16 x float>
1015  %vf = fneg <vscale x 16 x float> %va
1016  %vg = fneg <vscale x 16 x float> %vd
1017  %vh = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vg, <vscale x 16 x float> %ve, <vscale x 16 x float> %vf)
1018  ret <vscale x 16 x float> %vh
1019}
1020
1021define <vscale x 16 x float> @vfwnmacc_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, half %c) {
1022; ZVFH-LABEL: vfwnmacc_vf_nxv16f32:
1023; ZVFH:       # %bb.0:
1024; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1025; ZVFH-NEXT:    vfwnmacc.vf v8, fa0, v16
1026; ZVFH-NEXT:    ret
1027;
1028; ZVFHMIN-LABEL: vfwnmacc_vf_nxv16f32:
1029; ZVFHMIN:       # %bb.0:
1030; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1031; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
1032; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
1033; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
1034; ZVFHMIN-NEXT:    vfnmacc.vf v8, fa5, v24
1035; ZVFHMIN-NEXT:    ret
1036  %head = insertelement <vscale x 16 x half> poison, half %c, i32 0
1037  %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
1038  %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float>
1039  %ve = fpext <vscale x 16 x half> %splat to <vscale x 16 x float>
1040  %vf = fneg <vscale x 16 x float> %va
1041  %vg = fneg <vscale x 16 x float> %vd
1042  %vh = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vg, <vscale x 16 x float> %ve, <vscale x 16 x float> %vf)
1043  ret <vscale x 16 x float> %vh
1044}
1045
1046define <vscale x 16 x float> @vfwnmacc_fv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, half %c) {
1047; ZVFH-LABEL: vfwnmacc_fv_nxv16f32:
1048; ZVFH:       # %bb.0:
1049; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1050; ZVFH-NEXT:    vfwnmacc.vf v8, fa0, v16
1051; ZVFH-NEXT:    ret
1052;
1053; ZVFHMIN-LABEL: vfwnmacc_fv_nxv16f32:
1054; ZVFHMIN:       # %bb.0:
1055; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1056; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
1057; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
1058; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
1059; ZVFHMIN-NEXT:    vfnmacc.vf v8, fa5, v24
1060; ZVFHMIN-NEXT:    ret
1061  %head = insertelement <vscale x 16 x half> poison, half %c, i32 0
1062  %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
1063  %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float>
1064  %ve = fpext <vscale x 16 x half> %splat to <vscale x 16 x float>
1065  %vf = fneg <vscale x 16 x float> %va
1066  %vg = fneg <vscale x 16 x float> %ve
1067  %vh = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vd, <vscale x 16 x float> %vg, <vscale x 16 x float> %vf)
1068  ret <vscale x 16 x float> %vh
1069}
1070
1071define <vscale x 16 x float> @vfwmsac_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) {
1072; ZVFH-LABEL: vfwmsac_vv_nxv16f32:
1073; ZVFH:       # %bb.0:
1074; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1075; ZVFH-NEXT:    vfwmsac.vv v8, v16, v20
1076; ZVFH-NEXT:    ret
1077;
1078; ZVFHMIN-LABEL: vfwmsac_vv_nxv16f32:
1079; ZVFHMIN:       # %bb.0:
1080; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1081; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
1082; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v20
1083; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
1084; ZVFHMIN-NEXT:    vfmsac.vv v8, v24, v0
1085; ZVFHMIN-NEXT:    ret
1086  %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float>
1087  %ve = fpext <vscale x 16 x half> %vc to <vscale x 16 x float>
1088  %vf = fneg <vscale x 16 x float> %va
1089  %vg = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vd, <vscale x 16 x float> %ve, <vscale x 16 x float> %vf)
1090  ret <vscale x 16 x float> %vg
1091}
1092
1093define <vscale x 16 x float> @vfwmsac_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, half %c) {
1094; ZVFH-LABEL: vfwmsac_vf_nxv16f32:
1095; ZVFH:       # %bb.0:
1096; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1097; ZVFH-NEXT:    vfwmsac.vf v8, fa0, v16
1098; ZVFH-NEXT:    ret
1099;
1100; ZVFHMIN-LABEL: vfwmsac_vf_nxv16f32:
1101; ZVFHMIN:       # %bb.0:
1102; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1103; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
1104; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
1105; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
1106; ZVFHMIN-NEXT:    vfmsac.vf v8, fa5, v24
1107; ZVFHMIN-NEXT:    ret
1108  %head = insertelement <vscale x 16 x half> poison, half %c, i32 0
1109  %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
1110  %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float>
1111  %ve = fpext <vscale x 16 x half> %splat to <vscale x 16 x float>
1112  %vf = fneg <vscale x 16 x float> %va
1113  %vg = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vd, <vscale x 16 x float> %ve, <vscale x 16 x float> %vf)
1114  ret <vscale x 16 x float> %vg
1115}
1116
1117define <vscale x 16 x float> @vfwnmsac_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) {
1118; ZVFH-LABEL: vfwnmsac_vv_nxv16f32:
1119; ZVFH:       # %bb.0:
1120; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1121; ZVFH-NEXT:    vfwnmsac.vv v8, v16, v20
1122; ZVFH-NEXT:    ret
1123;
1124; ZVFHMIN-LABEL: vfwnmsac_vv_nxv16f32:
1125; ZVFHMIN:       # %bb.0:
1126; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1127; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
1128; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v20
1129; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
1130; ZVFHMIN-NEXT:    vfnmsac.vv v8, v24, v0
1131; ZVFHMIN-NEXT:    ret
1132  %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float>
1133  %ve = fpext <vscale x 16 x half> %vc to <vscale x 16 x float>
1134  %vf = fneg <vscale x 16 x float> %vd
1135  %vg = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vf, <vscale x 16 x float> %ve, <vscale x 16 x float> %va)
1136  ret <vscale x 16 x float> %vg
1137}
1138
1139define <vscale x 16 x float> @vfwnmsac_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, half %c) {
1140; ZVFH-LABEL: vfwnmsac_vf_nxv16f32:
1141; ZVFH:       # %bb.0:
1142; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1143; ZVFH-NEXT:    vfwnmsac.vf v8, fa0, v16
1144; ZVFH-NEXT:    ret
1145;
1146; ZVFHMIN-LABEL: vfwnmsac_vf_nxv16f32:
1147; ZVFHMIN:       # %bb.0:
1148; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1149; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
1150; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
1151; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
1152; ZVFHMIN-NEXT:    vfnmsac.vf v8, fa5, v24
1153; ZVFHMIN-NEXT:    ret
1154  %head = insertelement <vscale x 16 x half> poison, half %c, i32 0
1155  %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
1156  %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float>
1157  %ve = fpext <vscale x 16 x half> %splat to <vscale x 16 x float>
1158  %vf = fneg <vscale x 16 x float> %vd
1159  %vg = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vf, <vscale x 16 x float> %ve, <vscale x 16 x float> %va)
1160  ret <vscale x 16 x float> %vg
1161}
1162
1163define <vscale x 16 x float> @vfwnmsac_fv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, half %c) {
1164; ZVFH-LABEL: vfwnmsac_fv_nxv16f32:
1165; ZVFH:       # %bb.0:
1166; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1167; ZVFH-NEXT:    vfwnmsac.vf v8, fa0, v16
1168; ZVFH-NEXT:    ret
1169;
1170; ZVFHMIN-LABEL: vfwnmsac_fv_nxv16f32:
1171; ZVFHMIN:       # %bb.0:
1172; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1173; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
1174; ZVFHMIN-NEXT:    fcvt.s.h fa5, fa0
1175; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
1176; ZVFHMIN-NEXT:    vfnmsac.vf v8, fa5, v24
1177; ZVFHMIN-NEXT:    ret
1178  %head = insertelement <vscale x 16 x half> poison, half %c, i32 0
1179  %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
1180  %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float>
1181  %ve = fpext <vscale x 16 x half> %splat to <vscale x 16 x float>
1182  %vf = fneg <vscale x 16 x float> %ve
1183  %vg = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vd, <vscale x 16 x float> %vf, <vscale x 16 x float> %va)
1184  ret <vscale x 16 x float> %vg
1185}
1186
1187declare <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double>, <vscale x 1 x double>, <vscale x 1 x double>)
1188
1189define <vscale x 1 x double> @vfwmacc_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) {
1190; CHECK-LABEL: vfwmacc_vv_nxv1f64:
1191; CHECK:       # %bb.0:
1192; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
1193; CHECK-NEXT:    vfwmacc.vv v8, v9, v10
1194; CHECK-NEXT:    ret
1195  %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>
1196  %ve = fpext <vscale x 1 x float> %vc to <vscale x 1 x double>
1197  %vf = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vd, <vscale x 1 x double> %ve, <vscale x 1 x double> %va)
1198  ret <vscale x 1 x double> %vf
1199}
1200
1201define <vscale x 1 x double> @vfwmacc_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, float %c) {
1202; CHECK-LABEL: vfwmacc_vf_nxv1f64:
1203; CHECK:       # %bb.0:
1204; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
1205; CHECK-NEXT:    vfwmacc.vf v8, fa0, v9
1206; CHECK-NEXT:    ret
1207  %head = insertelement <vscale x 1 x float> poison, float %c, i32 0
1208  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
1209  %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>
1210  %ve = fpext <vscale x 1 x float> %splat to <vscale x 1 x double>
1211  %vf = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vd, <vscale x 1 x double> %ve, <vscale x 1 x double> %va)
1212  ret <vscale x 1 x double> %vf
1213}
1214
1215define <vscale x 1 x double> @vfwnmacc_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) {
1216; CHECK-LABEL: vfwnmacc_vv_nxv1f64:
1217; CHECK:       # %bb.0:
1218; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
1219; CHECK-NEXT:    vfwnmacc.vv v8, v9, v10
1220; CHECK-NEXT:    ret
1221  %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>
1222  %ve = fpext <vscale x 1 x float> %vc to <vscale x 1 x double>
1223  %vf = fneg <vscale x 1 x double> %va
1224  %vg = fneg <vscale x 1 x double> %vd
1225  %vh = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vg, <vscale x 1 x double> %ve, <vscale x 1 x double> %vf)
1226  ret <vscale x 1 x double> %vh
1227}
1228
1229define <vscale x 1 x double> @vfwnmacc_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, float %c) {
1230; CHECK-LABEL: vfwnmacc_vf_nxv1f64:
1231; CHECK:       # %bb.0:
1232; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
1233; CHECK-NEXT:    vfwnmacc.vf v8, fa0, v9
1234; CHECK-NEXT:    ret
1235  %head = insertelement <vscale x 1 x float> poison, float %c, i32 0
1236  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
1237  %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>
1238  %ve = fpext <vscale x 1 x float> %splat to <vscale x 1 x double>
1239  %vf = fneg <vscale x 1 x double> %va
1240  %vg = fneg <vscale x 1 x double> %vd
1241  %vh = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vg, <vscale x 1 x double> %ve, <vscale x 1 x double> %vf)
1242  ret <vscale x 1 x double> %vh
1243}
1244
1245define <vscale x 1 x double> @vfwnmacc_fv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, float %c) {
1246; CHECK-LABEL: vfwnmacc_fv_nxv1f64:
1247; CHECK:       # %bb.0:
1248; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
1249; CHECK-NEXT:    vfwnmacc.vf v8, fa0, v9
1250; CHECK-NEXT:    ret
1251  %head = insertelement <vscale x 1 x float> poison, float %c, i32 0
1252  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
1253  %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>
1254  %ve = fpext <vscale x 1 x float> %splat to <vscale x 1 x double>
1255  %vf = fneg <vscale x 1 x double> %va
1256  %vg = fneg <vscale x 1 x double> %ve
1257  %vh = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vd, <vscale x 1 x double> %vg, <vscale x 1 x double> %vf)
1258  ret <vscale x 1 x double> %vh
1259}
1260
1261define <vscale x 1 x double> @vfwmsac_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) {
1262; CHECK-LABEL: vfwmsac_vv_nxv1f64:
1263; CHECK:       # %bb.0:
1264; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
1265; CHECK-NEXT:    vfwmsac.vv v8, v9, v10
1266; CHECK-NEXT:    ret
1267  %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>
1268  %ve = fpext <vscale x 1 x float> %vc to <vscale x 1 x double>
1269  %vf = fneg <vscale x 1 x double> %va
1270  %vg = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vd, <vscale x 1 x double> %ve, <vscale x 1 x double> %vf)
1271  ret <vscale x 1 x double> %vg
1272}
1273
1274define <vscale x 1 x double> @vfwmsac_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, float %c) {
1275; CHECK-LABEL: vfwmsac_vf_nxv1f64:
1276; CHECK:       # %bb.0:
1277; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
1278; CHECK-NEXT:    vfwmsac.vf v8, fa0, v9
1279; CHECK-NEXT:    ret
1280  %head = insertelement <vscale x 1 x float> poison, float %c, i32 0
1281  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
1282  %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>
1283  %ve = fpext <vscale x 1 x float> %splat to <vscale x 1 x double>
1284  %vf = fneg <vscale x 1 x double> %va
1285  %vg = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vd, <vscale x 1 x double> %ve, <vscale x 1 x double> %vf)
1286  ret <vscale x 1 x double> %vg
1287}
1288
1289define <vscale x 1 x double> @vfwnmsac_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) {
1290; CHECK-LABEL: vfwnmsac_vv_nxv1f64:
1291; CHECK:       # %bb.0:
1292; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
1293; CHECK-NEXT:    vfwnmsac.vv v8, v9, v10
1294; CHECK-NEXT:    ret
1295  %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>
1296  %ve = fpext <vscale x 1 x float> %vc to <vscale x 1 x double>
1297  %vf = fneg <vscale x 1 x double> %vd
1298  %vg = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vf, <vscale x 1 x double> %ve, <vscale x 1 x double> %va)
1299  ret <vscale x 1 x double> %vg
1300}
1301
1302define <vscale x 1 x double> @vfwnmsac_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, float %c) {
1303; CHECK-LABEL: vfwnmsac_vf_nxv1f64:
1304; CHECK:       # %bb.0:
1305; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
1306; CHECK-NEXT:    vfwnmsac.vf v8, fa0, v9
1307; CHECK-NEXT:    ret
1308  %head = insertelement <vscale x 1 x float> poison, float %c, i32 0
1309  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
1310  %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>
1311  %ve = fpext <vscale x 1 x float> %splat to <vscale x 1 x double>
1312  %vf = fneg <vscale x 1 x double> %vd
1313  %vg = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vf, <vscale x 1 x double> %ve, <vscale x 1 x double> %va)
1314  ret <vscale x 1 x double> %vg
1315}
1316
1317define <vscale x 1 x double> @vfwnmsac_fv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, float %c) {
1318; CHECK-LABEL: vfwnmsac_fv_nxv1f64:
1319; CHECK:       # %bb.0:
1320; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
1321; CHECK-NEXT:    vfwnmsac.vf v8, fa0, v9
1322; CHECK-NEXT:    ret
1323  %head = insertelement <vscale x 1 x float> poison, float %c, i32 0
1324  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
1325  %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>
1326  %ve = fpext <vscale x 1 x float> %splat to <vscale x 1 x double>
1327  %vf = fneg <vscale x 1 x double> %ve
1328  %vg = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vd, <vscale x 1 x double> %vf, <vscale x 1 x double> %va)
1329  ret <vscale x 1 x double> %vg
1330}
1331
1332declare <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>)
1333
1334define <vscale x 2 x double> @vfwmacc_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) {
1335; CHECK-LABEL: vfwmacc_vv_nxv2f64:
1336; CHECK:       # %bb.0:
1337; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
1338; CHECK-NEXT:    vfwmacc.vv v8, v10, v11
1339; CHECK-NEXT:    ret
1340  %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>
1341  %ve = fpext <vscale x 2 x float> %vc to <vscale x 2 x double>
1342  %vf = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vd, <vscale x 2 x double> %ve, <vscale x 2 x double> %va)
1343  ret <vscale x 2 x double> %vf
1344}
1345
1346define <vscale x 2 x double> @vfwmacc_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, float %c) {
1347; CHECK-LABEL: vfwmacc_vf_nxv2f64:
1348; CHECK:       # %bb.0:
1349; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
1350; CHECK-NEXT:    vfwmacc.vf v8, fa0, v10
1351; CHECK-NEXT:    ret
1352  %head = insertelement <vscale x 2 x float> poison, float %c, i32 0
1353  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
1354  %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>
1355  %ve = fpext <vscale x 2 x float> %splat to <vscale x 2 x double>
1356  %vf = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vd, <vscale x 2 x double> %ve, <vscale x 2 x double> %va)
1357  ret <vscale x 2 x double> %vf
1358}
1359
1360define <vscale x 2 x double> @vfwnmacc_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) {
1361; CHECK-LABEL: vfwnmacc_vv_nxv2f64:
1362; CHECK:       # %bb.0:
1363; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
1364; CHECK-NEXT:    vfwnmacc.vv v8, v10, v11
1365; CHECK-NEXT:    ret
1366  %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>
1367  %ve = fpext <vscale x 2 x float> %vc to <vscale x 2 x double>
1368  %vf = fneg <vscale x 2 x double> %va
1369  %vg = fneg <vscale x 2 x double> %vd
1370  %vh = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vg, <vscale x 2 x double> %ve, <vscale x 2 x double> %vf)
1371  ret <vscale x 2 x double> %vh
1372}
1373
1374define <vscale x 2 x double> @vfwnmacc_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, float %c) {
1375; CHECK-LABEL: vfwnmacc_vf_nxv2f64:
1376; CHECK:       # %bb.0:
1377; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
1378; CHECK-NEXT:    vfwnmacc.vf v8, fa0, v10
1379; CHECK-NEXT:    ret
1380  %head = insertelement <vscale x 2 x float> poison, float %c, i32 0
1381  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
1382  %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>
1383  %ve = fpext <vscale x 2 x float> %splat to <vscale x 2 x double>
1384  %vf = fneg <vscale x 2 x double> %va
1385  %vg = fneg <vscale x 2 x double> %vd
1386  %vh = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vg, <vscale x 2 x double> %ve, <vscale x 2 x double> %vf)
1387  ret <vscale x 2 x double> %vh
1388}
1389
1390define <vscale x 2 x double> @vfwnmacc_fv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, float %c) {
1391; CHECK-LABEL: vfwnmacc_fv_nxv2f64:
1392; CHECK:       # %bb.0:
1393; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
1394; CHECK-NEXT:    vfwnmacc.vf v8, fa0, v10
1395; CHECK-NEXT:    ret
1396  %head = insertelement <vscale x 2 x float> poison, float %c, i32 0
1397  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
1398  %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>
1399  %ve = fpext <vscale x 2 x float> %splat to <vscale x 2 x double>
1400  %vf = fneg <vscale x 2 x double> %va
1401  %vg = fneg <vscale x 2 x double> %ve
1402  %vh = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vd, <vscale x 2 x double> %vg, <vscale x 2 x double> %vf)
1403  ret <vscale x 2 x double> %vh
1404}
1405
1406define <vscale x 2 x double> @vfwmsac_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) {
1407; CHECK-LABEL: vfwmsac_vv_nxv2f64:
1408; CHECK:       # %bb.0:
1409; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
1410; CHECK-NEXT:    vfwmsac.vv v8, v10, v11
1411; CHECK-NEXT:    ret
1412  %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>
1413  %ve = fpext <vscale x 2 x float> %vc to <vscale x 2 x double>
1414  %vf = fneg <vscale x 2 x double> %va
1415  %vg = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vd, <vscale x 2 x double> %ve, <vscale x 2 x double> %vf)
1416  ret <vscale x 2 x double> %vg
1417}
1418
1419define <vscale x 2 x double> @vfwmsac_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, float %c) {
1420; CHECK-LABEL: vfwmsac_vf_nxv2f64:
1421; CHECK:       # %bb.0:
1422; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
1423; CHECK-NEXT:    vfwmsac.vf v8, fa0, v10
1424; CHECK-NEXT:    ret
1425  %head = insertelement <vscale x 2 x float> poison, float %c, i32 0
1426  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
1427  %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>
1428  %ve = fpext <vscale x 2 x float> %splat to <vscale x 2 x double>
1429  %vf = fneg <vscale x 2 x double> %va
1430  %vg = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vd, <vscale x 2 x double> %ve, <vscale x 2 x double> %vf)
1431  ret <vscale x 2 x double> %vg
1432}
1433
1434define <vscale x 2 x double> @vfwnmsac_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) {
1435; CHECK-LABEL: vfwnmsac_vv_nxv2f64:
1436; CHECK:       # %bb.0:
1437; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
1438; CHECK-NEXT:    vfwnmsac.vv v8, v10, v11
1439; CHECK-NEXT:    ret
1440  %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>
1441  %ve = fpext <vscale x 2 x float> %vc to <vscale x 2 x double>
1442  %vf = fneg <vscale x 2 x double> %vd
1443  %vg = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vf, <vscale x 2 x double> %ve, <vscale x 2 x double> %va)
1444  ret <vscale x 2 x double> %vg
1445}
1446
1447define <vscale x 2 x double> @vfwnmsac_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, float %c) {
1448; CHECK-LABEL: vfwnmsac_vf_nxv2f64:
1449; CHECK:       # %bb.0:
1450; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
1451; CHECK-NEXT:    vfwnmsac.vf v8, fa0, v10
1452; CHECK-NEXT:    ret
1453  %head = insertelement <vscale x 2 x float> poison, float %c, i32 0
1454  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
1455  %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>
1456  %ve = fpext <vscale x 2 x float> %splat to <vscale x 2 x double>
1457  %vf = fneg <vscale x 2 x double> %vd
1458  %vg = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vf, <vscale x 2 x double> %ve, <vscale x 2 x double> %va)
1459  ret <vscale x 2 x double> %vg
1460}
1461
1462define <vscale x 2 x double> @vfwnmsac_fv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, float %c) {
1463; CHECK-LABEL: vfwnmsac_fv_nxv2f64:
1464; CHECK:       # %bb.0:
1465; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
1466; CHECK-NEXT:    vfwnmsac.vf v8, fa0, v10
1467; CHECK-NEXT:    ret
1468  %head = insertelement <vscale x 2 x float> poison, float %c, i32 0
1469  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
1470  %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>
1471  %ve = fpext <vscale x 2 x float> %splat to <vscale x 2 x double>
1472  %vf = fneg <vscale x 2 x double> %ve
1473  %vg = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vd, <vscale x 2 x double> %vf, <vscale x 2 x double> %va)
1474  ret <vscale x 2 x double> %vg
1475}
1476
1477
1478declare <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double>, <vscale x 4 x double>, <vscale x 4 x double>)
1479
1480define <vscale x 4 x double> @vfwmacc_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) {
1481; CHECK-LABEL: vfwmacc_vv_nxv4f64:
1482; CHECK:       # %bb.0:
1483; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
1484; CHECK-NEXT:    vfwmacc.vv v8, v12, v14
1485; CHECK-NEXT:    ret
1486  %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>
1487  %ve = fpext <vscale x 4 x float> %vc to <vscale x 4 x double>
1488  %vf = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vd, <vscale x 4 x double> %ve, <vscale x 4 x double> %va)
1489  ret <vscale x 4 x double> %vf
1490}
1491
1492define <vscale x 4 x double> @vfwmacc_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, float %c) {
1493; CHECK-LABEL: vfwmacc_vf_nxv4f64:
1494; CHECK:       # %bb.0:
1495; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
1496; CHECK-NEXT:    vfwmacc.vf v8, fa0, v12
1497; CHECK-NEXT:    ret
1498  %head = insertelement <vscale x 4 x float> poison, float %c, i32 0
1499  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
1500  %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>
1501  %ve = fpext <vscale x 4 x float> %splat to <vscale x 4 x double>
1502  %vf = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vd, <vscale x 4 x double> %ve, <vscale x 4 x double> %va)
1503  ret <vscale x 4 x double> %vf
1504}
1505
1506define <vscale x 4 x double> @vfwnmacc_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) {
1507; CHECK-LABEL: vfwnmacc_vv_nxv4f64:
1508; CHECK:       # %bb.0:
1509; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
1510; CHECK-NEXT:    vfwnmacc.vv v8, v12, v14
1511; CHECK-NEXT:    ret
1512  %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>
1513  %ve = fpext <vscale x 4 x float> %vc to <vscale x 4 x double>
1514  %vf = fneg <vscale x 4 x double> %va
1515  %vg = fneg <vscale x 4 x double> %vd
1516  %vh = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vg, <vscale x 4 x double> %ve, <vscale x 4 x double> %vf)
1517  ret <vscale x 4 x double> %vh
1518}
1519
1520define <vscale x 4 x double> @vfwnmacc_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, float %c) {
1521; CHECK-LABEL: vfwnmacc_vf_nxv4f64:
1522; CHECK:       # %bb.0:
1523; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
1524; CHECK-NEXT:    vfwnmacc.vf v8, fa0, v12
1525; CHECK-NEXT:    ret
1526  %head = insertelement <vscale x 4 x float> poison, float %c, i32 0
1527  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
1528  %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>
1529  %ve = fpext <vscale x 4 x float> %splat to <vscale x 4 x double>
1530  %vf = fneg <vscale x 4 x double> %va
1531  %vg = fneg <vscale x 4 x double> %vd
1532  %vh = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vg, <vscale x 4 x double> %ve, <vscale x 4 x double> %vf)
1533  ret <vscale x 4 x double> %vh
1534}
1535
1536define <vscale x 4 x double> @vfwnmacc_fv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, float %c) {
1537; CHECK-LABEL: vfwnmacc_fv_nxv4f64:
1538; CHECK:       # %bb.0:
1539; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
1540; CHECK-NEXT:    vfwnmacc.vf v8, fa0, v12
1541; CHECK-NEXT:    ret
1542  %head = insertelement <vscale x 4 x float> poison, float %c, i32 0
1543  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
1544  %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>
1545  %ve = fpext <vscale x 4 x float> %splat to <vscale x 4 x double>
1546  %vf = fneg <vscale x 4 x double> %va
1547  %vg = fneg <vscale x 4 x double> %ve
1548  %vh = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vd, <vscale x 4 x double> %vg, <vscale x 4 x double> %vf)
1549  ret <vscale x 4 x double> %vh
1550}
1551
1552define <vscale x 4 x double> @vfwmsac_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) {
1553; CHECK-LABEL: vfwmsac_vv_nxv4f64:
1554; CHECK:       # %bb.0:
1555; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
1556; CHECK-NEXT:    vfwmsac.vv v8, v12, v14
1557; CHECK-NEXT:    ret
1558  %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>
1559  %ve = fpext <vscale x 4 x float> %vc to <vscale x 4 x double>
1560  %vf = fneg <vscale x 4 x double> %va
1561  %vg = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vd, <vscale x 4 x double> %ve, <vscale x 4 x double> %vf)
1562  ret <vscale x 4 x double> %vg
1563}
1564
1565define <vscale x 4 x double> @vfwmsac_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, float %c) {
1566; CHECK-LABEL: vfwmsac_vf_nxv4f64:
1567; CHECK:       # %bb.0:
1568; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
1569; CHECK-NEXT:    vfwmsac.vf v8, fa0, v12
1570; CHECK-NEXT:    ret
1571  %head = insertelement <vscale x 4 x float> poison, float %c, i32 0
1572  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
1573  %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>
1574  %ve = fpext <vscale x 4 x float> %splat to <vscale x 4 x double>
1575  %vf = fneg <vscale x 4 x double> %va
1576  %vg = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vd, <vscale x 4 x double> %ve, <vscale x 4 x double> %vf)
1577  ret <vscale x 4 x double> %vg
1578}
1579
1580define <vscale x 4 x double> @vfwnmsac_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) {
1581; CHECK-LABEL: vfwnmsac_vv_nxv4f64:
1582; CHECK:       # %bb.0:
1583; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
1584; CHECK-NEXT:    vfwnmsac.vv v8, v12, v14
1585; CHECK-NEXT:    ret
1586  %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>
1587  %ve = fpext <vscale x 4 x float> %vc to <vscale x 4 x double>
1588  %vf = fneg <vscale x 4 x double> %vd
1589  %vg = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vf, <vscale x 4 x double> %ve, <vscale x 4 x double> %va)
1590  ret <vscale x 4 x double> %vg
1591}
1592
1593define <vscale x 4 x double> @vfwnmsac_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, float %c) {
1594; CHECK-LABEL: vfwnmsac_vf_nxv4f64:
1595; CHECK:       # %bb.0:
1596; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
1597; CHECK-NEXT:    vfwnmsac.vf v8, fa0, v12
1598; CHECK-NEXT:    ret
1599  %head = insertelement <vscale x 4 x float> poison, float %c, i32 0
1600  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
1601  %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>
1602  %ve = fpext <vscale x 4 x float> %splat to <vscale x 4 x double>
1603  %vf = fneg <vscale x 4 x double> %vd
1604  %vg = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vf, <vscale x 4 x double> %ve, <vscale x 4 x double> %va)
1605  ret <vscale x 4 x double> %vg
1606}
1607
1608define <vscale x 4 x double> @vfwnmsac_fv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, float %c) {
1609; CHECK-LABEL: vfwnmsac_fv_nxv4f64:
1610; CHECK:       # %bb.0:
1611; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
1612; CHECK-NEXT:    vfwnmsac.vf v8, fa0, v12
1613; CHECK-NEXT:    ret
1614  %head = insertelement <vscale x 4 x float> poison, float %c, i32 0
1615  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
1616  %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>
1617  %ve = fpext <vscale x 4 x float> %splat to <vscale x 4 x double>
1618  %vf = fneg <vscale x 4 x double> %ve
1619  %vg = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vd, <vscale x 4 x double> %vf, <vscale x 4 x double> %va)
1620  ret <vscale x 4 x double> %vg
1621}
1622
1623declare <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double>, <vscale x 8 x double>, <vscale x 8 x double>)
1624
1625define <vscale x 8 x double> @vfwmacc_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) {
1626; CHECK-LABEL: vfwmacc_vv_nxv8f64:
1627; CHECK:       # %bb.0:
1628; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
1629; CHECK-NEXT:    vfwmacc.vv v8, v16, v20
1630; CHECK-NEXT:    ret
1631  %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>
1632  %ve = fpext <vscale x 8 x float> %vc to <vscale x 8 x double>
1633  %vf = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vd, <vscale x 8 x double> %ve, <vscale x 8 x double> %va)
1634  ret <vscale x 8 x double> %vf
1635}
1636
1637define <vscale x 8 x double> @vfwmacc_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, float %c) {
1638; CHECK-LABEL: vfwmacc_vf_nxv8f64:
1639; CHECK:       # %bb.0:
1640; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
1641; CHECK-NEXT:    vfwmacc.vf v8, fa0, v16
1642; CHECK-NEXT:    ret
1643  %head = insertelement <vscale x 8 x float> poison, float %c, i32 0
1644  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
1645  %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>
1646  %ve = fpext <vscale x 8 x float> %splat to <vscale x 8 x double>
1647  %vf = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vd, <vscale x 8 x double> %ve, <vscale x 8 x double> %va)
1648  ret <vscale x 8 x double> %vf
1649}
1650
1651define <vscale x 8 x double> @vfwnmacc_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) {
1652; CHECK-LABEL: vfwnmacc_vv_nxv8f64:
1653; CHECK:       # %bb.0:
1654; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
1655; CHECK-NEXT:    vfwnmacc.vv v8, v16, v20
1656; CHECK-NEXT:    ret
1657  %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>
1658  %ve = fpext <vscale x 8 x float> %vc to <vscale x 8 x double>
1659  %vf = fneg <vscale x 8 x double> %va
1660  %vg = fneg <vscale x 8 x double> %vd
1661  %vh = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vg, <vscale x 8 x double> %ve, <vscale x 8 x double> %vf)
1662  ret <vscale x 8 x double> %vh
1663}
1664
1665define <vscale x 8 x double> @vfwnmacc_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, float %c) {
1666; CHECK-LABEL: vfwnmacc_vf_nxv8f64:
1667; CHECK:       # %bb.0:
1668; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
1669; CHECK-NEXT:    vfwnmacc.vf v8, fa0, v16
1670; CHECK-NEXT:    ret
1671  %head = insertelement <vscale x 8 x float> poison, float %c, i32 0
1672  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
1673  %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>
1674  %ve = fpext <vscale x 8 x float> %splat to <vscale x 8 x double>
1675  %vf = fneg <vscale x 8 x double> %va
1676  %vg = fneg <vscale x 8 x double> %vd
1677  %vh = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vg, <vscale x 8 x double> %ve, <vscale x 8 x double> %vf)
1678  ret <vscale x 8 x double> %vh
1679}
1680
1681define <vscale x 8 x double> @vfwnmacc_fv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, float %c) {
1682; CHECK-LABEL: vfwnmacc_fv_nxv8f64:
1683; CHECK:       # %bb.0:
1684; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
1685; CHECK-NEXT:    vfwnmacc.vf v8, fa0, v16
1686; CHECK-NEXT:    ret
1687  %head = insertelement <vscale x 8 x float> poison, float %c, i32 0
1688  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
1689  %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>
1690  %ve = fpext <vscale x 8 x float> %splat to <vscale x 8 x double>
1691  %vf = fneg <vscale x 8 x double> %va
1692  %vg = fneg <vscale x 8 x double> %ve
1693  %vh = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vd, <vscale x 8 x double> %vg, <vscale x 8 x double> %vf)
1694  ret <vscale x 8 x double> %vh
1695}
1696
1697define <vscale x 8 x double> @vfwmsac_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) {
1698; CHECK-LABEL: vfwmsac_vv_nxv8f64:
1699; CHECK:       # %bb.0:
1700; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
1701; CHECK-NEXT:    vfwmsac.vv v8, v16, v20
1702; CHECK-NEXT:    ret
1703  %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>
1704  %ve = fpext <vscale x 8 x float> %vc to <vscale x 8 x double>
1705  %vf = fneg <vscale x 8 x double> %va
1706  %vg = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vd, <vscale x 8 x double> %ve, <vscale x 8 x double> %vf)
1707  ret <vscale x 8 x double> %vg
1708}
1709
1710define <vscale x 8 x double> @vfwmsac_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, float %c) {
1711; CHECK-LABEL: vfwmsac_vf_nxv8f64:
1712; CHECK:       # %bb.0:
1713; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
1714; CHECK-NEXT:    vfwmsac.vf v8, fa0, v16
1715; CHECK-NEXT:    ret
1716  %head = insertelement <vscale x 8 x float> poison, float %c, i32 0
1717  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
1718  %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>
1719  %ve = fpext <vscale x 8 x float> %splat to <vscale x 8 x double>
1720  %vf = fneg <vscale x 8 x double> %va
1721  %vg = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vd, <vscale x 8 x double> %ve, <vscale x 8 x double> %vf)
1722  ret <vscale x 8 x double> %vg
1723}
1724
1725define <vscale x 8 x double> @vfwnmsac_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) {
1726; CHECK-LABEL: vfwnmsac_vv_nxv8f64:
1727; CHECK:       # %bb.0:
1728; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
1729; CHECK-NEXT:    vfwnmsac.vv v8, v16, v20
1730; CHECK-NEXT:    ret
1731  %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>
1732  %ve = fpext <vscale x 8 x float> %vc to <vscale x 8 x double>
1733  %vf = fneg <vscale x 8 x double> %vd
1734  %vg = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vf, <vscale x 8 x double> %ve, <vscale x 8 x double> %va)
1735  ret <vscale x 8 x double> %vg
1736}
1737
1738define <vscale x 8 x double> @vfwnmsac_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, float %c) {
1739; CHECK-LABEL: vfwnmsac_vf_nxv8f64:
1740; CHECK:       # %bb.0:
1741; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
1742; CHECK-NEXT:    vfwnmsac.vf v8, fa0, v16
1743; CHECK-NEXT:    ret
1744  %head = insertelement <vscale x 8 x float> poison, float %c, i32 0
1745  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
1746  %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>
1747  %ve = fpext <vscale x 8 x float> %splat to <vscale x 8 x double>
1748  %vf = fneg <vscale x 8 x double> %vd
1749  %vg = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vf, <vscale x 8 x double> %ve, <vscale x 8 x double> %va)
1750  ret <vscale x 8 x double> %vg
1751}
1752
1753define <vscale x 8 x double> @vfwnmsac_fv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, float %c) {
1754; CHECK-LABEL: vfwnmsac_fv_nxv8f64:
1755; CHECK:       # %bb.0:
1756; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
1757; CHECK-NEXT:    vfwnmsac.vf v8, fa0, v16
1758; CHECK-NEXT:    ret
1759  %head = insertelement <vscale x 8 x float> poison, float %c, i32 0
1760  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
1761  %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>
1762  %ve = fpext <vscale x 8 x float> %splat to <vscale x 8 x double>
1763  %vf = fneg <vscale x 8 x double> %ve
1764  %vg = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vd, <vscale x 8 x double> %vf, <vscale x 8 x double> %va)
1765  ret <vscale x 8 x double> %vg
1766}
1767