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
15 define <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
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
31 define <vscale x 1 x bfloat> @vfadd_vf_nxv1bf16(<vscale x 1 x bfloat> %va, bfloat %b) strictfp {
32 ; CHECK-LABEL: vfadd_vf_nxv1bf16:
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
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
50 define <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
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
66 define <vscale x 2 x bfloat> @vfadd_vf_nxv2bf16(<vscale x 2 x bfloat> %va, bfloat %b) strictfp {
67 ; CHECK-LABEL: vfadd_vf_nxv2bf16:
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
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
85 define <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
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
101 define <vscale x 4 x bfloat> @vfadd_vf_nxv4bf16(<vscale x 4 x bfloat> %va, bfloat %b) strictfp {
102 ; CHECK-LABEL: vfadd_vf_nxv4bf16:
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
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
120 define <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
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
136 define <vscale x 8 x bfloat> @vfadd_vf_nxv8bf16(<vscale x 8 x bfloat> %va, bfloat %b) strictfp {
137 ; CHECK-LABEL: vfadd_vf_nxv8bf16:
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
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
155 define <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
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
171 define <vscale x 16 x bfloat> @vfadd_vf_nxv16bf16(<vscale x 16 x bfloat> %va, bfloat %b) strictfp {
172 ; CHECK-LABEL: vfadd_vf_nxv16bf16:
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
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
190 define <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
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
227 define <vscale x 32 x bfloat> @vfadd_vf_nxv32bf16(<vscale x 32 x bfloat> %va, bfloat %b) strictfp {
228 ; CHECK-LABEL: vfadd_vf_nxv32bf16:
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
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
270 declare <vscale x 1 x half> @llvm.experimental.constrained.fadd.nxv1f16(<vscale x 1 x half>, <vscale x 1 x half>, metadata, metadata)
271 define <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
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
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
293 define <vscale x 1 x half> @vfadd_vf_nxv1f16(<vscale x 1 x half> %va, half %b) strictfp {
294 ; ZVFH-LABEL: vfadd_vf_nxv1f16:
296 ; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
297 ; ZVFH-NEXT: vfadd.vf v8, v8, fa0
300 ; ZVFHMIN-LABEL: vfadd_vf_nxv1f16:
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
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
318 declare <vscale x 2 x half> @llvm.experimental.constrained.fadd.nxv2f16(<vscale x 2 x half>, <vscale x 2 x half>, metadata, metadata)
319 define <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
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
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
341 define <vscale x 2 x half> @vfadd_vf_nxv2f16(<vscale x 2 x half> %va, half %b) strictfp {
342 ; ZVFH-LABEL: vfadd_vf_nxv2f16:
344 ; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
345 ; ZVFH-NEXT: vfadd.vf v8, v8, fa0
348 ; ZVFHMIN-LABEL: vfadd_vf_nxv2f16:
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
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
366 declare <vscale x 4 x half> @llvm.experimental.constrained.fadd.nxv4f16(<vscale x 4 x half>, <vscale x 4 x half>, metadata, metadata)
367 define <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
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
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
389 define <vscale x 4 x half> @vfadd_vf_nxv4f16(<vscale x 4 x half> %va, half %b) strictfp {
390 ; ZVFH-LABEL: vfadd_vf_nxv4f16:
392 ; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma
393 ; ZVFH-NEXT: vfadd.vf v8, v8, fa0
396 ; ZVFHMIN-LABEL: vfadd_vf_nxv4f16:
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
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
414 declare <vscale x 8 x half> @llvm.experimental.constrained.fadd.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>, metadata, metadata)
415 define <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
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
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
437 define <vscale x 8 x half> @vfadd_vf_nxv8f16(<vscale x 8 x half> %va, half %b) strictfp {
438 ; ZVFH-LABEL: vfadd_vf_nxv8f16:
440 ; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma
441 ; ZVFH-NEXT: vfadd.vf v8, v8, fa0
444 ; ZVFHMIN-LABEL: vfadd_vf_nxv8f16:
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
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
462 declare <vscale x 16 x half> @llvm.experimental.constrained.fadd.nxv16f16(<vscale x 16 x half>, <vscale x 16 x half>, metadata, metadata)
463 define <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
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
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
485 define <vscale x 16 x half> @vfadd_vf_nxv16f16(<vscale x 16 x half> %va, half %b) strictfp {
486 ; ZVFH-LABEL: vfadd_vf_nxv16f16:
488 ; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma
489 ; ZVFH-NEXT: vfadd.vf v8, v8, fa0
492 ; ZVFHMIN-LABEL: vfadd_vf_nxv16f16:
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
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
510 declare <vscale x 32 x half> @llvm.experimental.constrained.fadd.nxv32f16(<vscale x 32 x half>, <vscale x 32 x half>, metadata, metadata)
511 define <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
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
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
554 define <vscale x 32 x half> @vfadd_vf_nxv32f16(<vscale x 32 x half> %va, half %b) strictfp {
555 ; ZVFH-LABEL: vfadd_vf_nxv32f16:
557 ; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma
558 ; ZVFH-NEXT: vfadd.vf v8, v8, fa0
561 ; ZVFHMIN-LABEL: vfadd_vf_nxv32f16:
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
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
603 declare <vscale x 1 x float> @llvm.experimental.constrained.fadd.nxv1f32(<vscale x 1 x float>, <vscale x 1 x float>, metadata, metadata)
604 define <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
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
615 define <vscale x 1 x float> @vfadd_vf_nxv1f32(<vscale x 1 x float> %va, float %b) strictfp {
616 ; CHECK-LABEL: vfadd_vf_nxv1f32:
618 ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
619 ; CHECK-NEXT: vfadd.vf v8, v8, fa0
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
627 declare <vscale x 2 x float> @llvm.experimental.constrained.fadd.nxv2f32(<vscale x 2 x float>, <vscale x 2 x float>, metadata, metadata)
628 define <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
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
639 define <vscale x 2 x float> @vfadd_vf_nxv2f32(<vscale x 2 x float> %va, float %b) strictfp {
640 ; CHECK-LABEL: vfadd_vf_nxv2f32:
642 ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma
643 ; CHECK-NEXT: vfadd.vf v8, v8, fa0
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
651 declare <vscale x 4 x float> @llvm.experimental.constrained.fadd.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>, metadata, metadata)
652 define <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
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
663 define <vscale x 4 x float> @vfadd_vf_nxv4f32(<vscale x 4 x float> %va, float %b) strictfp {
664 ; CHECK-LABEL: vfadd_vf_nxv4f32:
666 ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma
667 ; CHECK-NEXT: vfadd.vf v8, v8, fa0
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
675 declare <vscale x 8 x float> @llvm.experimental.constrained.fadd.nxv8f32(<vscale x 8 x float>, <vscale x 8 x float>, metadata, metadata)
676 define <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
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
687 define <vscale x 8 x float> @vfadd_vf_nxv8f32(<vscale x 8 x float> %va, float %b) strictfp {
688 ; CHECK-LABEL: vfadd_vf_nxv8f32:
690 ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
691 ; CHECK-NEXT: vfadd.vf v8, v8, fa0
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
699 declare <vscale x 16 x float> @llvm.experimental.constrained.fadd.nxv16f32(<vscale x 16 x float>, <vscale x 16 x float>, metadata, metadata)
700 define <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
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
711 define <vscale x 16 x float> @vfadd_vf_nxv16f32(<vscale x 16 x float> %va, float %b) strictfp {
712 ; CHECK-LABEL: vfadd_vf_nxv16f32:
714 ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma
715 ; CHECK-NEXT: vfadd.vf v8, v8, fa0
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
723 declare <vscale x 1 x double> @llvm.experimental.constrained.fadd.nxv1f64(<vscale x 1 x double>, <vscale x 1 x double>, metadata, metadata)
724 define <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
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
735 define <vscale x 1 x double> @vfadd_vf_nxv1f64(<vscale x 1 x double> %va, double %b) strictfp {
736 ; CHECK-LABEL: vfadd_vf_nxv1f64:
738 ; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma
739 ; CHECK-NEXT: vfadd.vf v8, v8, fa0
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
747 declare <vscale x 2 x double> @llvm.experimental.constrained.fadd.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>, metadata, metadata)
748 define <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
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
759 define <vscale x 2 x double> @vfadd_vf_nxv2f64(<vscale x 2 x double> %va, double %b) strictfp {
760 ; CHECK-LABEL: vfadd_vf_nxv2f64:
762 ; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma
763 ; CHECK-NEXT: vfadd.vf v8, v8, fa0
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
771 declare <vscale x 4 x double> @llvm.experimental.constrained.fadd.nxv4f64(<vscale x 4 x double>, <vscale x 4 x double>, metadata, metadata)
772 define <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
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
783 define <vscale x 4 x double> @vfadd_vf_nxv4f64(<vscale x 4 x double> %va, double %b) strictfp {
784 ; CHECK-LABEL: vfadd_vf_nxv4f64:
786 ; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma
787 ; CHECK-NEXT: vfadd.vf v8, v8, fa0
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
795 declare <vscale x 8 x double> @llvm.experimental.constrained.fadd.nxv8f64(<vscale x 8 x double>, <vscale x 8 x double>, metadata, metadata)
796 define <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
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
807 define <vscale x 8 x double> @vfadd_vf_nxv8f64(<vscale x 8 x double> %va, double %b) strictfp {
808 ; CHECK-LABEL: vfadd_vf_nxv8f64:
810 ; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma
811 ; CHECK-NEXT: vfadd.vf v8, v8, fa0
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