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