xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/vfadd-sdnode.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v \
3; RUN:     -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \
4; RUN:     --check-prefixes=CHECK,ZVFH
5; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v \
6; RUN:     -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \
7; RUN:     --check-prefixes=CHECK,ZVFH
8; RUN: llc -mtriple=riscv32 -mattr=+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \
9; RUN:     -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \
10; RUN:     --check-prefixes=CHECK,ZVFHMIN
11; RUN: llc -mtriple=riscv64 -mattr=+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \
12; RUN:     -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \
13; RUN:     --check-prefixes=CHECK,ZVFHMIN
14
15define <vscale x 1 x bfloat> @vfadd_vv_nxv1bf16(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %vb) {
16; CHECK-LABEL: vfadd_vv_nxv1bf16:
17; CHECK:       # %bb.0:
18; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
19; CHECK-NEXT:    vfwcvtbf16.f.f.v v10, v9
20; CHECK-NEXT:    vfwcvtbf16.f.f.v v9, v8
21; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
22; CHECK-NEXT:    vfadd.vv v9, v9, v10
23; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
24; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v9
25; CHECK-NEXT:    ret
26  %vc = fadd <vscale x 1 x bfloat> %va, %vb
27  ret <vscale x 1 x bfloat> %vc
28}
29
30define <vscale x 1 x bfloat> @vfadd_vf_nxv1bf16(<vscale x 1 x bfloat> %va, bfloat %b) {
31; CHECK-LABEL: vfadd_vf_nxv1bf16:
32; CHECK:       # %bb.0:
33; CHECK-NEXT:    fmv.x.h a0, fa0
34; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, ma
35; CHECK-NEXT:    vmv.v.x v9, a0
36; CHECK-NEXT:    vfwcvtbf16.f.f.v v10, v8
37; CHECK-NEXT:    vfwcvtbf16.f.f.v v8, v9
38; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
39; CHECK-NEXT:    vfadd.vv v9, v10, v8
40; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
41; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v9
42; CHECK-NEXT:    ret
43  %head = insertelement <vscale x 1 x bfloat> poison, bfloat %b, i32 0
44  %splat = shufflevector <vscale x 1 x bfloat> %head, <vscale x 1 x bfloat> poison, <vscale x 1 x i32> zeroinitializer
45  %vc = fadd <vscale x 1 x bfloat> %va, %splat
46  ret <vscale x 1 x bfloat> %vc
47}
48
49define <vscale x 2 x bfloat> @vfadd_vv_nxv2bf16(<vscale x 2 x bfloat> %va, <vscale x 2 x bfloat> %vb) {
50; CHECK-LABEL: vfadd_vv_nxv2bf16:
51; CHECK:       # %bb.0:
52; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
53; CHECK-NEXT:    vfwcvtbf16.f.f.v v10, v9
54; CHECK-NEXT:    vfwcvtbf16.f.f.v v9, v8
55; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
56; CHECK-NEXT:    vfadd.vv v9, v9, v10
57; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
58; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v9
59; CHECK-NEXT:    ret
60  %vc = fadd <vscale x 2 x bfloat> %va, %vb
61  ret <vscale x 2 x bfloat> %vc
62}
63
64define <vscale x 2 x bfloat> @vfadd_vf_nxv2bf16(<vscale x 2 x bfloat> %va, bfloat %b) {
65; CHECK-LABEL: vfadd_vf_nxv2bf16:
66; CHECK:       # %bb.0:
67; CHECK-NEXT:    fmv.x.h a0, fa0
68; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
69; CHECK-NEXT:    vmv.v.x v9, a0
70; CHECK-NEXT:    vfwcvtbf16.f.f.v v10, v8
71; CHECK-NEXT:    vfwcvtbf16.f.f.v v8, v9
72; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
73; CHECK-NEXT:    vfadd.vv v9, v10, v8
74; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
75; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v9
76; CHECK-NEXT:    ret
77  %head = insertelement <vscale x 2 x bfloat> poison, bfloat %b, i32 0
78  %splat = shufflevector <vscale x 2 x bfloat> %head, <vscale x 2 x bfloat> poison, <vscale x 2 x i32> zeroinitializer
79  %vc = fadd <vscale x 2 x bfloat> %va, %splat
80  ret <vscale x 2 x bfloat> %vc
81}
82
83define <vscale x 4 x bfloat> @vfadd_vv_nxv4bf16(<vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %vb) {
84; CHECK-LABEL: vfadd_vv_nxv4bf16:
85; CHECK:       # %bb.0:
86; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
87; CHECK-NEXT:    vfwcvtbf16.f.f.v v10, v9
88; CHECK-NEXT:    vfwcvtbf16.f.f.v v12, v8
89; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
90; CHECK-NEXT:    vfadd.vv v10, v12, v10
91; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
92; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v10
93; CHECK-NEXT:    ret
94  %vc = fadd <vscale x 4 x bfloat> %va, %vb
95  ret <vscale x 4 x bfloat> %vc
96}
97
98define <vscale x 4 x bfloat> @vfadd_vf_nxv4bf16(<vscale x 4 x bfloat> %va, bfloat %b) {
99; CHECK-LABEL: vfadd_vf_nxv4bf16:
100; CHECK:       # %bb.0:
101; CHECK-NEXT:    fmv.x.h a0, fa0
102; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, ma
103; CHECK-NEXT:    vmv.v.x v9, a0
104; CHECK-NEXT:    vfwcvtbf16.f.f.v v10, v8
105; CHECK-NEXT:    vfwcvtbf16.f.f.v v12, v9
106; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
107; CHECK-NEXT:    vfadd.vv v10, v10, v12
108; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
109; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v10
110; CHECK-NEXT:    ret
111  %head = insertelement <vscale x 4 x bfloat> poison, bfloat %b, i32 0
112  %splat = shufflevector <vscale x 4 x bfloat> %head, <vscale x 4 x bfloat> poison, <vscale x 4 x i32> zeroinitializer
113  %vc = fadd <vscale x 4 x bfloat> %va, %splat
114  ret <vscale x 4 x bfloat> %vc
115}
116
117define <vscale x 8 x bfloat> @vfadd_vv_nxv8bf16(<vscale x 8 x bfloat> %va, <vscale x 8 x bfloat> %vb) {
118; CHECK-LABEL: vfadd_vv_nxv8bf16:
119; CHECK:       # %bb.0:
120; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
121; CHECK-NEXT:    vfwcvtbf16.f.f.v v12, v10
122; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v8
123; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
124; CHECK-NEXT:    vfadd.vv v12, v16, v12
125; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
126; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v12
127; CHECK-NEXT:    ret
128  %vc = fadd <vscale x 8 x bfloat> %va, %vb
129  ret <vscale x 8 x bfloat> %vc
130}
131
132define <vscale x 8 x bfloat> @vfadd_vf_nxv8bf16(<vscale x 8 x bfloat> %va, bfloat %b) {
133; CHECK-LABEL: vfadd_vf_nxv8bf16:
134; CHECK:       # %bb.0:
135; CHECK-NEXT:    fmv.x.h a0, fa0
136; CHECK-NEXT:    vsetvli a1, zero, e16, m2, ta, ma
137; CHECK-NEXT:    vmv.v.x v10, a0
138; CHECK-NEXT:    vfwcvtbf16.f.f.v v12, v8
139; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v10
140; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
141; CHECK-NEXT:    vfadd.vv v12, v12, v16
142; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
143; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v12
144; CHECK-NEXT:    ret
145  %head = insertelement <vscale x 8 x bfloat> poison, bfloat %b, i32 0
146  %splat = shufflevector <vscale x 8 x bfloat> %head, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer
147  %vc = fadd <vscale x 8 x bfloat> %va, %splat
148  ret <vscale x 8 x bfloat> %vc
149}
150
151define <vscale x 8 x bfloat> @vfadd_fv_nxv8bf16(<vscale x 8 x bfloat> %va, bfloat %b) {
152; CHECK-LABEL: vfadd_fv_nxv8bf16:
153; CHECK:       # %bb.0:
154; CHECK-NEXT:    fmv.x.h a0, fa0
155; CHECK-NEXT:    vsetvli a1, zero, e16, m2, ta, ma
156; CHECK-NEXT:    vmv.v.x v10, a0
157; CHECK-NEXT:    vfwcvtbf16.f.f.v v12, v8
158; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v10
159; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
160; CHECK-NEXT:    vfadd.vv v12, v16, v12
161; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
162; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v12
163; CHECK-NEXT:    ret
164  %head = insertelement <vscale x 8 x bfloat> poison, bfloat %b, i32 0
165  %splat = shufflevector <vscale x 8 x bfloat> %head, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer
166  %vc = fadd <vscale x 8 x bfloat> %splat, %va
167  ret <vscale x 8 x bfloat> %vc
168}
169
170define <vscale x 16 x bfloat> @vfadd_vv_nxv16bf16(<vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %vb) {
171; CHECK-LABEL: vfadd_vv_nxv16bf16:
172; CHECK:       # %bb.0:
173; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
174; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v12
175; CHECK-NEXT:    vfwcvtbf16.f.f.v v24, v8
176; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
177; CHECK-NEXT:    vfadd.vv v16, v24, v16
178; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
179; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v16
180; CHECK-NEXT:    ret
181  %vc = fadd <vscale x 16 x bfloat> %va, %vb
182  ret <vscale x 16 x bfloat> %vc
183}
184
185define <vscale x 16 x bfloat> @vfadd_vf_nxv16bf16(<vscale x 16 x bfloat> %va, bfloat %b) {
186; CHECK-LABEL: vfadd_vf_nxv16bf16:
187; CHECK:       # %bb.0:
188; CHECK-NEXT:    fmv.x.h a0, fa0
189; CHECK-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
190; CHECK-NEXT:    vmv.v.x v12, a0
191; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v8
192; CHECK-NEXT:    vfwcvtbf16.f.f.v v24, v12
193; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
194; CHECK-NEXT:    vfadd.vv v16, v16, v24
195; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
196; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v16
197; CHECK-NEXT:    ret
198  %head = insertelement <vscale x 16 x bfloat> poison, bfloat %b, i32 0
199  %splat = shufflevector <vscale x 16 x bfloat> %head, <vscale x 16 x bfloat> poison, <vscale x 16 x i32> zeroinitializer
200  %vc = fadd <vscale x 16 x bfloat> %va, %splat
201  ret <vscale x 16 x bfloat> %vc
202}
203
204define <vscale x 32 x bfloat> @vfadd_vv_nxv32bf16(<vscale x 32 x bfloat> %va, <vscale x 32 x bfloat> %vb) {
205; CHECK-LABEL: vfadd_vv_nxv32bf16:
206; CHECK:       # %bb.0:
207; CHECK-NEXT:    addi sp, sp, -16
208; CHECK-NEXT:    .cfi_def_cfa_offset 16
209; CHECK-NEXT:    csrr a0, vlenb
210; CHECK-NEXT:    slli a0, a0, 3
211; CHECK-NEXT:    sub sp, sp, a0
212; CHECK-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
213; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
214; CHECK-NEXT:    vfwcvtbf16.f.f.v v24, v16
215; CHECK-NEXT:    addi a0, sp, 16
216; CHECK-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
217; CHECK-NEXT:    vfwcvtbf16.f.f.v v0, v8
218; CHECK-NEXT:    vfwcvtbf16.f.f.v v24, v20
219; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v12
220; CHECK-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
221; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
222; CHECK-NEXT:    vfadd.vv v0, v0, v8
223; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
224; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v0
225; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
226; CHECK-NEXT:    vfadd.vv v16, v16, v24
227; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
228; CHECK-NEXT:    vfncvtbf16.f.f.w v12, v16
229; CHECK-NEXT:    csrr a0, vlenb
230; CHECK-NEXT:    slli a0, a0, 3
231; CHECK-NEXT:    add sp, sp, a0
232; CHECK-NEXT:    .cfi_def_cfa sp, 16
233; CHECK-NEXT:    addi sp, sp, 16
234; CHECK-NEXT:    .cfi_def_cfa_offset 0
235; CHECK-NEXT:    ret
236  %vc = fadd <vscale x 32 x bfloat> %va, %vb
237  ret <vscale x 32 x bfloat> %vc
238}
239
240define <vscale x 32 x bfloat> @vfadd_vf_nxv32bf16(<vscale x 32 x bfloat> %va, bfloat %b) {
241; CHECK-LABEL: vfadd_vf_nxv32bf16:
242; CHECK:       # %bb.0:
243; CHECK-NEXT:    addi sp, sp, -16
244; CHECK-NEXT:    .cfi_def_cfa_offset 16
245; CHECK-NEXT:    csrr a0, vlenb
246; CHECK-NEXT:    slli a0, a0, 3
247; CHECK-NEXT:    sub sp, sp, a0
248; CHECK-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
249; CHECK-NEXT:    fmv.x.h a0, fa0
250; CHECK-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
251; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v8
252; CHECK-NEXT:    addi a1, sp, 16
253; CHECK-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
254; CHECK-NEXT:    vfwcvtbf16.f.f.v v24, v12
255; CHECK-NEXT:    vsetvli a1, zero, e16, m8, ta, ma
256; CHECK-NEXT:    vmv.v.x v8, a0
257; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
258; CHECK-NEXT:    vfwcvtbf16.f.f.v v0, v8
259; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v12
260; CHECK-NEXT:    addi a0, sp, 16
261; CHECK-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
262; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
263; CHECK-NEXT:    vfadd.vv v0, v8, v0
264; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
265; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v0
266; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
267; CHECK-NEXT:    vfadd.vv v16, v24, v16
268; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
269; CHECK-NEXT:    vfncvtbf16.f.f.w v12, v16
270; CHECK-NEXT:    csrr a0, vlenb
271; CHECK-NEXT:    slli a0, a0, 3
272; CHECK-NEXT:    add sp, sp, a0
273; CHECK-NEXT:    .cfi_def_cfa sp, 16
274; CHECK-NEXT:    addi sp, sp, 16
275; CHECK-NEXT:    .cfi_def_cfa_offset 0
276; CHECK-NEXT:    ret
277  %head = insertelement <vscale x 32 x bfloat> poison, bfloat %b, i32 0
278  %splat = shufflevector <vscale x 32 x bfloat> %head, <vscale x 32 x bfloat> poison, <vscale x 32 x i32> zeroinitializer
279  %vc = fadd <vscale x 32 x bfloat> %va, %splat
280  ret <vscale x 32 x bfloat> %vc
281}
282
283define <vscale x 1 x half> @vfadd_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb) {
284; ZVFH-LABEL: vfadd_vv_nxv1f16:
285; ZVFH:       # %bb.0:
286; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
287; ZVFH-NEXT:    vfadd.vv v8, v8, v9
288; ZVFH-NEXT:    ret
289;
290; ZVFHMIN-LABEL: vfadd_vv_nxv1f16:
291; ZVFHMIN:       # %bb.0:
292; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
293; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
294; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v8
295; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
296; ZVFHMIN-NEXT:    vfadd.vv v9, v9, v10
297; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
298; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
299; ZVFHMIN-NEXT:    ret
300  %vc = fadd <vscale x 1 x half> %va, %vb
301  ret <vscale x 1 x half> %vc
302}
303
304define <vscale x 1 x half> @vfadd_vf_nxv1f16(<vscale x 1 x half> %va, half %b) {
305; ZVFH-LABEL: vfadd_vf_nxv1f16:
306; ZVFH:       # %bb.0:
307; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
308; ZVFH-NEXT:    vfadd.vf v8, v8, fa0
309; ZVFH-NEXT:    ret
310;
311; ZVFHMIN-LABEL: vfadd_vf_nxv1f16:
312; ZVFHMIN:       # %bb.0:
313; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
314; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, mf4, ta, ma
315; ZVFHMIN-NEXT:    vmv.v.x v9, a0
316; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v8
317; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v9
318; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
319; ZVFHMIN-NEXT:    vfadd.vv v9, v10, v8
320; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
321; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
322; ZVFHMIN-NEXT:    ret
323  %head = insertelement <vscale x 1 x half> poison, half %b, i32 0
324  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
325  %vc = fadd <vscale x 1 x half> %va, %splat
326  ret <vscale x 1 x half> %vc
327}
328
329define <vscale x 2 x half> @vfadd_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb) {
330; ZVFH-LABEL: vfadd_vv_nxv2f16:
331; ZVFH:       # %bb.0:
332; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
333; ZVFH-NEXT:    vfadd.vv v8, v8, v9
334; ZVFH-NEXT:    ret
335;
336; ZVFHMIN-LABEL: vfadd_vv_nxv2f16:
337; ZVFHMIN:       # %bb.0:
338; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
339; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
340; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v8
341; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
342; ZVFHMIN-NEXT:    vfadd.vv v9, v9, v10
343; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
344; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
345; ZVFHMIN-NEXT:    ret
346  %vc = fadd <vscale x 2 x half> %va, %vb
347  ret <vscale x 2 x half> %vc
348}
349
350define <vscale x 2 x half> @vfadd_vf_nxv2f16(<vscale x 2 x half> %va, half %b) {
351; ZVFH-LABEL: vfadd_vf_nxv2f16:
352; ZVFH:       # %bb.0:
353; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
354; ZVFH-NEXT:    vfadd.vf v8, v8, fa0
355; ZVFH-NEXT:    ret
356;
357; ZVFHMIN-LABEL: vfadd_vf_nxv2f16:
358; ZVFHMIN:       # %bb.0:
359; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
360; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
361; ZVFHMIN-NEXT:    vmv.v.x v9, a0
362; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v8
363; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v9
364; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
365; ZVFHMIN-NEXT:    vfadd.vv v9, v10, v8
366; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
367; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
368; ZVFHMIN-NEXT:    ret
369  %head = insertelement <vscale x 2 x half> poison, half %b, i32 0
370  %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
371  %vc = fadd <vscale x 2 x half> %va, %splat
372  ret <vscale x 2 x half> %vc
373}
374
375define <vscale x 4 x half> @vfadd_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb) {
376; ZVFH-LABEL: vfadd_vv_nxv4f16:
377; ZVFH:       # %bb.0:
378; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
379; ZVFH-NEXT:    vfadd.vv v8, v8, v9
380; ZVFH-NEXT:    ret
381;
382; ZVFHMIN-LABEL: vfadd_vv_nxv4f16:
383; ZVFHMIN:       # %bb.0:
384; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
385; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
386; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v8
387; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
388; ZVFHMIN-NEXT:    vfadd.vv v10, v12, v10
389; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
390; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v10
391; ZVFHMIN-NEXT:    ret
392  %vc = fadd <vscale x 4 x half> %va, %vb
393  ret <vscale x 4 x half> %vc
394}
395
396define <vscale x 4 x half> @vfadd_vf_nxv4f16(<vscale x 4 x half> %va, half %b) {
397; ZVFH-LABEL: vfadd_vf_nxv4f16:
398; ZVFH:       # %bb.0:
399; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
400; ZVFH-NEXT:    vfadd.vf v8, v8, fa0
401; ZVFH-NEXT:    ret
402;
403; ZVFHMIN-LABEL: vfadd_vf_nxv4f16:
404; ZVFHMIN:       # %bb.0:
405; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
406; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m1, ta, ma
407; ZVFHMIN-NEXT:    vmv.v.x v9, a0
408; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v8
409; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v9
410; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
411; ZVFHMIN-NEXT:    vfadd.vv v10, v10, v12
412; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
413; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v10
414; ZVFHMIN-NEXT:    ret
415  %head = insertelement <vscale x 4 x half> poison, half %b, i32 0
416  %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
417  %vc = fadd <vscale x 4 x half> %va, %splat
418  ret <vscale x 4 x half> %vc
419}
420
421define <vscale x 8 x half> @vfadd_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb) {
422; ZVFH-LABEL: vfadd_vv_nxv8f16:
423; ZVFH:       # %bb.0:
424; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
425; ZVFH-NEXT:    vfadd.vv v8, v8, v10
426; ZVFH-NEXT:    ret
427;
428; ZVFHMIN-LABEL: vfadd_vv_nxv8f16:
429; ZVFHMIN:       # %bb.0:
430; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
431; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
432; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
433; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
434; ZVFHMIN-NEXT:    vfadd.vv v12, v16, v12
435; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
436; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v12
437; ZVFHMIN-NEXT:    ret
438  %vc = fadd <vscale x 8 x half> %va, %vb
439  ret <vscale x 8 x half> %vc
440}
441
442define <vscale x 8 x half> @vfadd_vf_nxv8f16(<vscale x 8 x half> %va, half %b) {
443; ZVFH-LABEL: vfadd_vf_nxv8f16:
444; ZVFH:       # %bb.0:
445; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
446; ZVFH-NEXT:    vfadd.vf v8, v8, fa0
447; ZVFH-NEXT:    ret
448;
449; ZVFHMIN-LABEL: vfadd_vf_nxv8f16:
450; ZVFHMIN:       # %bb.0:
451; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
452; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m2, ta, ma
453; ZVFHMIN-NEXT:    vmv.v.x v10, a0
454; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v8
455; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v10
456; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
457; ZVFHMIN-NEXT:    vfadd.vv v12, v12, v16
458; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
459; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v12
460; ZVFHMIN-NEXT:    ret
461  %head = insertelement <vscale x 8 x half> poison, half %b, i32 0
462  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
463  %vc = fadd <vscale x 8 x half> %va, %splat
464  ret <vscale x 8 x half> %vc
465}
466
467define <vscale x 8 x half> @vfadd_fv_nxv8f16(<vscale x 8 x half> %va, half %b) {
468; ZVFH-LABEL: vfadd_fv_nxv8f16:
469; ZVFH:       # %bb.0:
470; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
471; ZVFH-NEXT:    vfadd.vf v8, v8, fa0
472; ZVFH-NEXT:    ret
473;
474; ZVFHMIN-LABEL: vfadd_fv_nxv8f16:
475; ZVFHMIN:       # %bb.0:
476; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
477; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m2, ta, ma
478; ZVFHMIN-NEXT:    vmv.v.x v10, a0
479; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v8
480; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v10
481; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
482; ZVFHMIN-NEXT:    vfadd.vv v12, v16, v12
483; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
484; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v12
485; ZVFHMIN-NEXT:    ret
486  %head = insertelement <vscale x 8 x half> poison, half %b, i32 0
487  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
488  %vc = fadd <vscale x 8 x half> %splat, %va
489  ret <vscale x 8 x half> %vc
490}
491
492define <vscale x 16 x half> @vfadd_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb) {
493; ZVFH-LABEL: vfadd_vv_nxv16f16:
494; ZVFH:       # %bb.0:
495; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
496; ZVFH-NEXT:    vfadd.vv v8, v8, v12
497; ZVFH-NEXT:    ret
498;
499; ZVFHMIN-LABEL: vfadd_vv_nxv16f16:
500; ZVFHMIN:       # %bb.0:
501; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
502; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
503; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v8
504; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
505; ZVFHMIN-NEXT:    vfadd.vv v16, v24, v16
506; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
507; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v16
508; ZVFHMIN-NEXT:    ret
509  %vc = fadd <vscale x 16 x half> %va, %vb
510  ret <vscale x 16 x half> %vc
511}
512
513define <vscale x 16 x half> @vfadd_vf_nxv16f16(<vscale x 16 x half> %va, half %b) {
514; ZVFH-LABEL: vfadd_vf_nxv16f16:
515; ZVFH:       # %bb.0:
516; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
517; ZVFH-NEXT:    vfadd.vf v8, v8, fa0
518; ZVFH-NEXT:    ret
519;
520; ZVFHMIN-LABEL: vfadd_vf_nxv16f16:
521; ZVFHMIN:       # %bb.0:
522; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
523; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
524; ZVFHMIN-NEXT:    vmv.v.x v12, a0
525; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
526; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v12
527; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
528; ZVFHMIN-NEXT:    vfadd.vv v16, v16, v24
529; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
530; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v16
531; ZVFHMIN-NEXT:    ret
532  %head = insertelement <vscale x 16 x half> poison, half %b, i32 0
533  %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
534  %vc = fadd <vscale x 16 x half> %va, %splat
535  ret <vscale x 16 x half> %vc
536}
537
538define <vscale x 32 x half> @vfadd_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb) {
539; ZVFH-LABEL: vfadd_vv_nxv32f16:
540; ZVFH:       # %bb.0:
541; ZVFH-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
542; ZVFH-NEXT:    vfadd.vv v8, v8, v16
543; ZVFH-NEXT:    ret
544;
545; ZVFHMIN-LABEL: vfadd_vv_nxv32f16:
546; ZVFHMIN:       # %bb.0:
547; ZVFHMIN-NEXT:    addi sp, sp, -16
548; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16
549; ZVFHMIN-NEXT:    csrr a0, vlenb
550; ZVFHMIN-NEXT:    slli a0, a0, 3
551; ZVFHMIN-NEXT:    sub sp, sp, a0
552; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
553; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
554; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
555; ZVFHMIN-NEXT:    addi a0, sp, 16
556; ZVFHMIN-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
557; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v8
558; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v20
559; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
560; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
561; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
562; ZVFHMIN-NEXT:    vfadd.vv v0, v0, v8
563; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
564; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v0
565; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
566; ZVFHMIN-NEXT:    vfadd.vv v16, v16, v24
567; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
568; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v16
569; ZVFHMIN-NEXT:    csrr a0, vlenb
570; ZVFHMIN-NEXT:    slli a0, a0, 3
571; ZVFHMIN-NEXT:    add sp, sp, a0
572; ZVFHMIN-NEXT:    .cfi_def_cfa sp, 16
573; ZVFHMIN-NEXT:    addi sp, sp, 16
574; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 0
575; ZVFHMIN-NEXT:    ret
576  %vc = fadd <vscale x 32 x half> %va, %vb
577  ret <vscale x 32 x half> %vc
578}
579
580define <vscale x 32 x half> @vfadd_vf_nxv32f16(<vscale x 32 x half> %va, half %b) {
581; ZVFH-LABEL: vfadd_vf_nxv32f16:
582; ZVFH:       # %bb.0:
583; ZVFH-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
584; ZVFH-NEXT:    vfadd.vf v8, v8, fa0
585; ZVFH-NEXT:    ret
586;
587; ZVFHMIN-LABEL: vfadd_vf_nxv32f16:
588; ZVFHMIN:       # %bb.0:
589; ZVFHMIN-NEXT:    addi sp, sp, -16
590; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16
591; ZVFHMIN-NEXT:    csrr a0, vlenb
592; ZVFHMIN-NEXT:    slli a0, a0, 3
593; ZVFHMIN-NEXT:    sub sp, sp, a0
594; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
595; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
596; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
597; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
598; ZVFHMIN-NEXT:    addi a1, sp, 16
599; ZVFHMIN-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
600; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v12
601; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m8, ta, ma
602; ZVFHMIN-NEXT:    vmv.v.x v8, a0
603; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
604; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v8
605; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
606; ZVFHMIN-NEXT:    addi a0, sp, 16
607; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
608; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
609; ZVFHMIN-NEXT:    vfadd.vv v0, v8, v0
610; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
611; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v0
612; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
613; ZVFHMIN-NEXT:    vfadd.vv v16, v24, v16
614; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
615; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v16
616; ZVFHMIN-NEXT:    csrr a0, vlenb
617; ZVFHMIN-NEXT:    slli a0, a0, 3
618; ZVFHMIN-NEXT:    add sp, sp, a0
619; ZVFHMIN-NEXT:    .cfi_def_cfa sp, 16
620; ZVFHMIN-NEXT:    addi sp, sp, 16
621; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 0
622; ZVFHMIN-NEXT:    ret
623  %head = insertelement <vscale x 32 x half> poison, half %b, i32 0
624  %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer
625  %vc = fadd <vscale x 32 x half> %va, %splat
626  ret <vscale x 32 x half> %vc
627}
628
629define <vscale x 1 x float> @vfadd_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb) {
630; CHECK-LABEL: vfadd_vv_nxv1f32:
631; CHECK:       # %bb.0:
632; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
633; CHECK-NEXT:    vfadd.vv v8, v8, v9
634; CHECK-NEXT:    ret
635  %vc = fadd <vscale x 1 x float> %va, %vb
636  ret <vscale x 1 x float> %vc
637}
638
639define <vscale x 1 x float> @vfadd_vf_nxv1f32(<vscale x 1 x float> %va, float %b) {
640; CHECK-LABEL: vfadd_vf_nxv1f32:
641; CHECK:       # %bb.0:
642; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
643; CHECK-NEXT:    vfadd.vf v8, v8, fa0
644; CHECK-NEXT:    ret
645  %head = insertelement <vscale x 1 x float> poison, float %b, i32 0
646  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
647  %vc = fadd <vscale x 1 x float> %va, %splat
648  ret <vscale x 1 x float> %vc
649}
650
651define <vscale x 2 x float> @vfadd_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb) {
652; CHECK-LABEL: vfadd_vv_nxv2f32:
653; CHECK:       # %bb.0:
654; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
655; CHECK-NEXT:    vfadd.vv v8, v8, v9
656; CHECK-NEXT:    ret
657  %vc = fadd <vscale x 2 x float> %va, %vb
658  ret <vscale x 2 x float> %vc
659}
660
661define <vscale x 2 x float> @vfadd_vf_nxv2f32(<vscale x 2 x float> %va, float %b) {
662; CHECK-LABEL: vfadd_vf_nxv2f32:
663; CHECK:       # %bb.0:
664; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
665; CHECK-NEXT:    vfadd.vf v8, v8, fa0
666; CHECK-NEXT:    ret
667  %head = insertelement <vscale x 2 x float> poison, float %b, i32 0
668  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
669  %vc = fadd <vscale x 2 x float> %va, %splat
670  ret <vscale x 2 x float> %vc
671}
672
673define <vscale x 4 x float> @vfadd_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb) {
674; CHECK-LABEL: vfadd_vv_nxv4f32:
675; CHECK:       # %bb.0:
676; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
677; CHECK-NEXT:    vfadd.vv v8, v8, v10
678; CHECK-NEXT:    ret
679  %vc = fadd <vscale x 4 x float> %va, %vb
680  ret <vscale x 4 x float> %vc
681}
682
683define <vscale x 4 x float> @vfadd_vf_nxv4f32(<vscale x 4 x float> %va, float %b) {
684; CHECK-LABEL: vfadd_vf_nxv4f32:
685; CHECK:       # %bb.0:
686; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
687; CHECK-NEXT:    vfadd.vf v8, v8, fa0
688; CHECK-NEXT:    ret
689  %head = insertelement <vscale x 4 x float> poison, float %b, i32 0
690  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
691  %vc = fadd <vscale x 4 x float> %va, %splat
692  ret <vscale x 4 x float> %vc
693}
694
695define <vscale x 8 x float> @vfadd_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb) {
696; CHECK-LABEL: vfadd_vv_nxv8f32:
697; CHECK:       # %bb.0:
698; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
699; CHECK-NEXT:    vfadd.vv v8, v8, v12
700; CHECK-NEXT:    ret
701  %vc = fadd <vscale x 8 x float> %va, %vb
702  ret <vscale x 8 x float> %vc
703}
704
705define <vscale x 8 x float> @vfadd_vf_nxv8f32(<vscale x 8 x float> %va, float %b) {
706; CHECK-LABEL: vfadd_vf_nxv8f32:
707; CHECK:       # %bb.0:
708; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
709; CHECK-NEXT:    vfadd.vf v8, v8, fa0
710; CHECK-NEXT:    ret
711  %head = insertelement <vscale x 8 x float> poison, float %b, i32 0
712  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
713  %vc = fadd <vscale x 8 x float> %va, %splat
714  ret <vscale x 8 x float> %vc
715}
716
717define <vscale x 8 x float> @vfadd_fv_nxv8f32(<vscale x 8 x float> %va, float %b) {
718; CHECK-LABEL: vfadd_fv_nxv8f32:
719; CHECK:       # %bb.0:
720; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
721; CHECK-NEXT:    vfadd.vf v8, v8, fa0
722; CHECK-NEXT:    ret
723  %head = insertelement <vscale x 8 x float> poison, float %b, i32 0
724  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
725  %vc = fadd <vscale x 8 x float> %splat, %va
726  ret <vscale x 8 x float> %vc
727}
728
729define <vscale x 16 x float> @vfadd_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb) {
730; CHECK-LABEL: vfadd_vv_nxv16f32:
731; CHECK:       # %bb.0:
732; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
733; CHECK-NEXT:    vfadd.vv v8, v8, v16
734; CHECK-NEXT:    ret
735  %vc = fadd <vscale x 16 x float> %va, %vb
736  ret <vscale x 16 x float> %vc
737}
738
739define <vscale x 16 x float> @vfadd_vf_nxv16f32(<vscale x 16 x float> %va, float %b) {
740; CHECK-LABEL: vfadd_vf_nxv16f32:
741; CHECK:       # %bb.0:
742; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
743; CHECK-NEXT:    vfadd.vf v8, v8, fa0
744; CHECK-NEXT:    ret
745  %head = insertelement <vscale x 16 x float> poison, float %b, i32 0
746  %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer
747  %vc = fadd <vscale x 16 x float> %va, %splat
748  ret <vscale x 16 x float> %vc
749}
750
751define <vscale x 1 x double> @vfadd_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb) {
752; CHECK-LABEL: vfadd_vv_nxv1f64:
753; CHECK:       # %bb.0:
754; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
755; CHECK-NEXT:    vfadd.vv v8, v8, v9
756; CHECK-NEXT:    ret
757  %vc = fadd <vscale x 1 x double> %va, %vb
758  ret <vscale x 1 x double> %vc
759}
760
761define <vscale x 1 x double> @vfadd_vf_nxv1f64(<vscale x 1 x double> %va, double %b) {
762; CHECK-LABEL: vfadd_vf_nxv1f64:
763; CHECK:       # %bb.0:
764; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
765; CHECK-NEXT:    vfadd.vf v8, v8, fa0
766; CHECK-NEXT:    ret
767  %head = insertelement <vscale x 1 x double> poison, double %b, i32 0
768  %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
769  %vc = fadd <vscale x 1 x double> %va, %splat
770  ret <vscale x 1 x double> %vc
771}
772
773define <vscale x 2 x double> @vfadd_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb) {
774; CHECK-LABEL: vfadd_vv_nxv2f64:
775; CHECK:       # %bb.0:
776; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
777; CHECK-NEXT:    vfadd.vv v8, v8, v10
778; CHECK-NEXT:    ret
779  %vc = fadd <vscale x 2 x double> %va, %vb
780  ret <vscale x 2 x double> %vc
781}
782
783define <vscale x 2 x double> @vfadd_vf_nxv2f64(<vscale x 2 x double> %va, double %b) {
784; CHECK-LABEL: vfadd_vf_nxv2f64:
785; CHECK:       # %bb.0:
786; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
787; CHECK-NEXT:    vfadd.vf v8, v8, fa0
788; CHECK-NEXT:    ret
789  %head = insertelement <vscale x 2 x double> poison, double %b, i32 0
790  %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
791  %vc = fadd <vscale x 2 x double> %va, %splat
792  ret <vscale x 2 x double> %vc
793}
794
795define <vscale x 4 x double> @vfadd_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb) {
796; CHECK-LABEL: vfadd_vv_nxv4f64:
797; CHECK:       # %bb.0:
798; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
799; CHECK-NEXT:    vfadd.vv v8, v8, v12
800; CHECK-NEXT:    ret
801  %vc = fadd <vscale x 4 x double> %va, %vb
802  ret <vscale x 4 x double> %vc
803}
804
805define <vscale x 4 x double> @vfadd_vf_nxv4f64(<vscale x 4 x double> %va, double %b) {
806; CHECK-LABEL: vfadd_vf_nxv4f64:
807; CHECK:       # %bb.0:
808; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
809; CHECK-NEXT:    vfadd.vf v8, v8, fa0
810; CHECK-NEXT:    ret
811  %head = insertelement <vscale x 4 x double> poison, double %b, i32 0
812  %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
813  %vc = fadd <vscale x 4 x double> %va, %splat
814  ret <vscale x 4 x double> %vc
815}
816
817define <vscale x 8 x double> @vfadd_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb) {
818; CHECK-LABEL: vfadd_vv_nxv8f64:
819; CHECK:       # %bb.0:
820; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
821; CHECK-NEXT:    vfadd.vv v8, v8, v16
822; CHECK-NEXT:    ret
823  %vc = fadd <vscale x 8 x double> %va, %vb
824  ret <vscale x 8 x double> %vc
825}
826
827define <vscale x 8 x double> @vfadd_vf_nxv8f64(<vscale x 8 x double> %va, double %b) {
828; CHECK-LABEL: vfadd_vf_nxv8f64:
829; CHECK:       # %bb.0:
830; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
831; CHECK-NEXT:    vfadd.vf v8, v8, fa0
832; CHECK-NEXT:    ret
833  %head = insertelement <vscale x 8 x double> poison, double %b, i32 0
834  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
835  %vc = fadd <vscale x 8 x double> %va, %splat
836  ret <vscale x 8 x double> %vc
837}
838
839define <vscale x 8 x double> @vfadd_fv_nxv8f64(<vscale x 8 x double> %va, double %b) {
840; CHECK-LABEL: vfadd_fv_nxv8f64:
841; CHECK:       # %bb.0:
842; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
843; CHECK-NEXT:    vfadd.vf v8, v8, fa0
844; CHECK-NEXT:    ret
845  %head = insertelement <vscale x 8 x double> poison, double %b, i32 0
846  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
847  %vc = fadd <vscale x 8 x double> %splat, %va
848  ret <vscale x 8 x double> %vc
849}
850
851define <vscale x 8 x float> @vfadd_vv_mask_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, <vscale x 8 x i1> %mask) {
852; CHECK-LABEL: vfadd_vv_mask_nxv8f32:
853; CHECK:       # %bb.0:
854; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
855; CHECK-NEXT:    vfadd.vv v8, v8, v12, v0.t
856; CHECK-NEXT:    ret
857  %vs = select <vscale x 8 x i1> %mask, <vscale x 8 x float> %vb, <vscale x 8 x float> splat (float 0.0)
858  %vc = fadd fast <vscale x 8 x float> %va, %vs
859  ret <vscale x 8 x float> %vc
860}
861
862define <vscale x 8 x float> @vfadd_vf_mask_nxv8f32(<vscale x 8 x float> %va, float %b, <vscale x 8 x i1> %mask) {
863; CHECK-LABEL: vfadd_vf_mask_nxv8f32:
864; CHECK:       # %bb.0:
865; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
866; CHECK-NEXT:    vfadd.vf v8, v8, fa0, v0.t
867; CHECK-NEXT:    ret
868  %head1 = insertelement <vscale x 8 x float> poison, float %b, i32 0
869  %splat1 = shufflevector <vscale x 8 x float> %head1, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
870  %vs = select <vscale x 8 x i1> %mask, <vscale x 8 x float> %splat1, <vscale x 8 x float> splat (float 0.0)
871  %vc = fadd fast <vscale x 8 x float> %va, %vs
872  ret <vscale x 8 x float> %vc
873}
874