xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/vfwadd-sdnode.ll (revision 1cb599835ccf7ee8b2d1d5a7f3107e19a26fc6f5)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v -target-abi=ilp32d \
3; RUN:     -verify-machineinstrs < %s | FileCheck %s
4; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v -target-abi=lp64d \
5; RUN:     -verify-machineinstrs < %s | FileCheck %s
6
7define <vscale x 1 x double> @vfwadd_vv_nxv1f64(<vscale x 1 x float> %va, <vscale x 1 x float> %vb) {
8; CHECK-LABEL: vfwadd_vv_nxv1f64:
9; CHECK:       # %bb.0:
10; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
11; CHECK-NEXT:    vfwadd.vv v10, v8, v9
12; CHECK-NEXT:    vmv1r.v v8, v10
13; CHECK-NEXT:    ret
14  %vc = fpext <vscale x 1 x float> %va to <vscale x 1 x double>
15  %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>
16  %ve = fadd <vscale x 1 x double> %vc, %vd
17  ret <vscale x 1 x double> %ve
18}
19
20define <vscale x 1 x double> @vfwadd_vf_nxv1f64(<vscale x 1 x float> %va, float %b) {
21; CHECK-LABEL: vfwadd_vf_nxv1f64:
22; CHECK:       # %bb.0:
23; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
24; CHECK-NEXT:    vfwadd.vf v9, v8, fa0
25; CHECK-NEXT:    vmv1r.v v8, v9
26; CHECK-NEXT:    ret
27  %head = insertelement <vscale x 1 x float> poison, float %b, i32 0
28  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
29  %vc = fpext <vscale x 1 x float> %va to <vscale x 1 x double>
30  %vd = fpext <vscale x 1 x float> %splat to <vscale x 1 x double>
31  %ve = fadd <vscale x 1 x double> %vc, %vd
32  ret <vscale x 1 x double> %ve
33}
34
35define <vscale x 1 x double> @vfwadd_vf_nxv1f64_2(<vscale x 1 x float> %va, float %b) {
36; CHECK-LABEL: vfwadd_vf_nxv1f64_2:
37; CHECK:       # %bb.0:
38; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
39; CHECK-NEXT:    vfwadd.vf v9, v8, fa0
40; CHECK-NEXT:    vmv1r.v v8, v9
41; CHECK-NEXT:    ret
42  %fpext = fpext float %b to double
43  %head = insertelement <vscale x 1 x double> poison, double %fpext, i32 0
44  %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
45  %vc = fpext <vscale x 1 x float> %va to <vscale x 1 x double>
46  %ve = fadd <vscale x 1 x double> %vc, %splat
47  ret <vscale x 1 x double> %ve
48}
49
50define <vscale x 1 x double> @vfwadd_wv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb) {
51; CHECK-LABEL: vfwadd_wv_nxv1f64:
52; CHECK:       # %bb.0:
53; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
54; CHECK-NEXT:    vfwadd.wv v8, v8, v9
55; CHECK-NEXT:    ret
56  %vc = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>
57  %vd = fadd <vscale x 1 x double> %va, %vc
58  ret <vscale x 1 x double> %vd
59}
60
61define <vscale x 1 x double> @vfwadd_wf_nxv1f64(<vscale x 1 x double> %va, float %b) {
62; CHECK-LABEL: vfwadd_wf_nxv1f64:
63; CHECK:       # %bb.0:
64; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
65; CHECK-NEXT:    vfwadd.wf v8, v8, fa0
66; CHECK-NEXT:    ret
67  %head = insertelement <vscale x 1 x float> poison, float %b, i32 0
68  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
69  %vc = fpext <vscale x 1 x float> %splat to <vscale x 1 x double>
70  %vd = fadd <vscale x 1 x double> %va, %vc
71  ret <vscale x 1 x double> %vd
72}
73
74define <vscale x 1 x double> @vfwadd_wf_nxv1f64_2(<vscale x 1 x double> %va, float %b) {
75; CHECK-LABEL: vfwadd_wf_nxv1f64_2:
76; CHECK:       # %bb.0:
77; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
78; CHECK-NEXT:    vfwadd.wf v8, v8, fa0
79; CHECK-NEXT:    ret
80  %fpext = fpext float %b to double
81  %head = insertelement <vscale x 1 x double> poison, double %fpext, i32 0
82  %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
83  %vd = fadd <vscale x 1 x double> %va, %splat
84  ret <vscale x 1 x double> %vd
85}
86
87define <vscale x 2 x double> @vfwadd_vv_nxv2f64(<vscale x 2 x float> %va, <vscale x 2 x float> %vb) {
88; CHECK-LABEL: vfwadd_vv_nxv2f64:
89; CHECK:       # %bb.0:
90; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
91; CHECK-NEXT:    vfwadd.vv v10, v8, v9
92; CHECK-NEXT:    vmv2r.v v8, v10
93; CHECK-NEXT:    ret
94  %vc = fpext <vscale x 2 x float> %va to <vscale x 2 x double>
95  %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>
96  %ve = fadd <vscale x 2 x double> %vc, %vd
97  ret <vscale x 2 x double> %ve
98}
99
100define <vscale x 2 x double> @vfwadd_vf_nxv2f64(<vscale x 2 x float> %va, float %b) {
101; CHECK-LABEL: vfwadd_vf_nxv2f64:
102; CHECK:       # %bb.0:
103; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
104; CHECK-NEXT:    vfwadd.vf v10, v8, fa0
105; CHECK-NEXT:    vmv2r.v v8, v10
106; CHECK-NEXT:    ret
107  %head = insertelement <vscale x 2 x float> poison, float %b, i32 0
108  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
109  %vc = fpext <vscale x 2 x float> %va to <vscale x 2 x double>
110  %vd = fpext <vscale x 2 x float> %splat to <vscale x 2 x double>
111  %ve = fadd <vscale x 2 x double> %vc, %vd
112  ret <vscale x 2 x double> %ve
113}
114
115define <vscale x 2 x double> @vfwadd_vf_nxv2f64_2(<vscale x 2 x float> %va, float %b) {
116; CHECK-LABEL: vfwadd_vf_nxv2f64_2:
117; CHECK:       # %bb.0:
118; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
119; CHECK-NEXT:    vfwadd.vf v10, v8, fa0
120; CHECK-NEXT:    vmv2r.v v8, v10
121; CHECK-NEXT:    ret
122  %fpext = fpext float %b to double
123  %head = insertelement <vscale x 2 x double> poison, double %fpext, i32 0
124  %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
125  %vc = fpext <vscale x 2 x float> %va to <vscale x 2 x double>
126  %ve = fadd <vscale x 2 x double> %vc, %splat
127  ret <vscale x 2 x double> %ve
128}
129
130define <vscale x 2 x double> @vfwadd_wv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb) {
131; CHECK-LABEL: vfwadd_wv_nxv2f64:
132; CHECK:       # %bb.0:
133; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
134; CHECK-NEXT:    vfwadd.wv v8, v8, v10
135; CHECK-NEXT:    ret
136  %vc = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>
137  %vd = fadd <vscale x 2 x double> %va, %vc
138  ret <vscale x 2 x double> %vd
139}
140
141define <vscale x 2 x double> @vfwadd_wf_nxv2f64(<vscale x 2 x double> %va, float %b) {
142; CHECK-LABEL: vfwadd_wf_nxv2f64:
143; CHECK:       # %bb.0:
144; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
145; CHECK-NEXT:    vfwadd.wf v8, v8, fa0
146; CHECK-NEXT:    ret
147  %head = insertelement <vscale x 2 x float> poison, float %b, i32 0
148  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
149  %vc = fpext <vscale x 2 x float> %splat to <vscale x 2 x double>
150  %vd = fadd <vscale x 2 x double> %va, %vc
151  ret <vscale x 2 x double> %vd
152}
153
154define <vscale x 2 x double> @vfwadd_wf_nxv2f64_2(<vscale x 2 x double> %va, float %b) {
155; CHECK-LABEL: vfwadd_wf_nxv2f64_2:
156; CHECK:       # %bb.0:
157; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
158; CHECK-NEXT:    vfwadd.wf v8, v8, fa0
159; CHECK-NEXT:    ret
160  %fpext = fpext float %b to double
161  %head = insertelement <vscale x 2 x double> poison, double %fpext, i32 0
162  %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
163  %vd = fadd <vscale x 2 x double> %va, %splat
164  ret <vscale x 2 x double> %vd
165}
166
167define <vscale x 4 x double> @vfwadd_vv_nxv4f64(<vscale x 4 x float> %va, <vscale x 4 x float> %vb) {
168; CHECK-LABEL: vfwadd_vv_nxv4f64:
169; CHECK:       # %bb.0:
170; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
171; CHECK-NEXT:    vfwadd.vv v12, v8, v10
172; CHECK-NEXT:    vmv4r.v v8, v12
173; CHECK-NEXT:    ret
174  %vc = fpext <vscale x 4 x float> %va to <vscale x 4 x double>
175  %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>
176  %ve = fadd <vscale x 4 x double> %vc, %vd
177  ret <vscale x 4 x double> %ve
178}
179
180define <vscale x 4 x double> @vfwadd_vf_nxv4f64(<vscale x 4 x float> %va, float %b) {
181; CHECK-LABEL: vfwadd_vf_nxv4f64:
182; CHECK:       # %bb.0:
183; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
184; CHECK-NEXT:    vfwadd.vf v12, v8, fa0
185; CHECK-NEXT:    vmv4r.v v8, v12
186; CHECK-NEXT:    ret
187  %head = insertelement <vscale x 4 x float> poison, float %b, i32 0
188  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
189  %vc = fpext <vscale x 4 x float> %va to <vscale x 4 x double>
190  %vd = fpext <vscale x 4 x float> %splat to <vscale x 4 x double>
191  %ve = fadd <vscale x 4 x double> %vc, %vd
192  ret <vscale x 4 x double> %ve
193}
194
195define <vscale x 4 x double> @vfwadd_vf_nxv4f64_2(<vscale x 4 x float> %va, float %b) {
196; CHECK-LABEL: vfwadd_vf_nxv4f64_2:
197; CHECK:       # %bb.0:
198; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
199; CHECK-NEXT:    vfwadd.vf v12, v8, fa0
200; CHECK-NEXT:    vmv4r.v v8, v12
201; CHECK-NEXT:    ret
202  %fpext = fpext float %b to double
203  %head = insertelement <vscale x 4 x double> poison, double %fpext, i32 0
204  %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
205  %vc = fpext <vscale x 4 x float> %va to <vscale x 4 x double>
206  %ve = fadd <vscale x 4 x double> %vc, %splat
207  ret <vscale x 4 x double> %ve
208}
209
210define <vscale x 4 x double> @vfwadd_wv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb) {
211; CHECK-LABEL: vfwadd_wv_nxv4f64:
212; CHECK:       # %bb.0:
213; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
214; CHECK-NEXT:    vfwadd.wv v8, v8, v12
215; CHECK-NEXT:    ret
216  %vc = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>
217  %vd = fadd <vscale x 4 x double> %va, %vc
218  ret <vscale x 4 x double> %vd
219}
220
221define <vscale x 4 x double> @vfwadd_wf_nxv4f64(<vscale x 4 x double> %va, float %b) {
222; CHECK-LABEL: vfwadd_wf_nxv4f64:
223; CHECK:       # %bb.0:
224; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
225; CHECK-NEXT:    vfwadd.wf v8, v8, fa0
226; CHECK-NEXT:    ret
227  %head = insertelement <vscale x 4 x float> poison, float %b, i32 0
228  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
229  %vc = fpext <vscale x 4 x float> %splat to <vscale x 4 x double>
230  %vd = fadd <vscale x 4 x double> %va, %vc
231  ret <vscale x 4 x double> %vd
232}
233
234define <vscale x 4 x double> @vfwadd_wf_nxv4f64_2(<vscale x 4 x double> %va, float %b) {
235; CHECK-LABEL: vfwadd_wf_nxv4f64_2:
236; CHECK:       # %bb.0:
237; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
238; CHECK-NEXT:    vfwadd.wf v8, v8, fa0
239; CHECK-NEXT:    ret
240  %fpext = fpext float %b to double
241  %head = insertelement <vscale x 4 x double> poison, double %fpext, i32 0
242  %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
243  %vd = fadd <vscale x 4 x double> %va, %splat
244  ret <vscale x 4 x double> %vd
245}
246
247define <vscale x 8 x double> @vfwadd_vv_nxv8f64(<vscale x 8 x float> %va, <vscale x 8 x float> %vb) {
248; CHECK-LABEL: vfwadd_vv_nxv8f64:
249; CHECK:       # %bb.0:
250; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
251; CHECK-NEXT:    vfwadd.vv v16, v8, v12
252; CHECK-NEXT:    vmv8r.v v8, v16
253; CHECK-NEXT:    ret
254  %vc = fpext <vscale x 8 x float> %va to <vscale x 8 x double>
255  %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>
256  %ve = fadd <vscale x 8 x double> %vc, %vd
257  ret <vscale x 8 x double> %ve
258}
259
260define <vscale x 8 x double> @vfwadd_vf_nxv8f64(<vscale x 8 x float> %va, float %b) {
261; CHECK-LABEL: vfwadd_vf_nxv8f64:
262; CHECK:       # %bb.0:
263; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
264; CHECK-NEXT:    vfwadd.vf v16, v8, fa0
265; CHECK-NEXT:    vmv8r.v v8, v16
266; CHECK-NEXT:    ret
267  %head = insertelement <vscale x 8 x float> poison, float %b, i32 0
268  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
269  %vc = fpext <vscale x 8 x float> %va to <vscale x 8 x double>
270  %vd = fpext <vscale x 8 x float> %splat to <vscale x 8 x double>
271  %ve = fadd <vscale x 8 x double> %vc, %vd
272  ret <vscale x 8 x double> %ve
273}
274
275define <vscale x 8 x double> @vfwadd_vf_nxv8f64_2(<vscale x 8 x float> %va, float %b) {
276; CHECK-LABEL: vfwadd_vf_nxv8f64_2:
277; CHECK:       # %bb.0:
278; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
279; CHECK-NEXT:    vfwadd.vf v16, v8, fa0
280; CHECK-NEXT:    vmv8r.v v8, v16
281; CHECK-NEXT:    ret
282  %fpext = fpext float %b to double
283  %head = insertelement <vscale x 8 x double> poison, double %fpext, i32 0
284  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
285  %vc = fpext <vscale x 8 x float> %va to <vscale x 8 x double>
286  %ve = fadd <vscale x 8 x double> %vc, %splat
287  ret <vscale x 8 x double> %ve
288}
289
290define <vscale x 8 x double> @vfwadd_wv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb) {
291; CHECK-LABEL: vfwadd_wv_nxv8f64:
292; CHECK:       # %bb.0:
293; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
294; CHECK-NEXT:    vfwadd.wv v8, v8, v16
295; CHECK-NEXT:    ret
296  %vc = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>
297  %vd = fadd <vscale x 8 x double> %va, %vc
298  ret <vscale x 8 x double> %vd
299}
300
301define <vscale x 8 x double> @vfwadd_wf_nxv8f64(<vscale x 8 x double> %va, float %b) {
302; CHECK-LABEL: vfwadd_wf_nxv8f64:
303; CHECK:       # %bb.0:
304; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
305; CHECK-NEXT:    vfwadd.wf v8, v8, fa0
306; CHECK-NEXT:    ret
307  %head = insertelement <vscale x 8 x float> poison, float %b, i32 0
308  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
309  %vc = fpext <vscale x 8 x float> %splat to <vscale x 8 x double>
310  %vd = fadd <vscale x 8 x double> %va, %vc
311  ret <vscale x 8 x double> %vd
312}
313
314define <vscale x 8 x double> @vfwadd_wf_nxv8f64_2(<vscale x 8 x double> %va, float %b) {
315; CHECK-LABEL: vfwadd_wf_nxv8f64_2:
316; CHECK:       # %bb.0:
317; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
318; CHECK-NEXT:    vfwadd.wf v8, v8, fa0
319; CHECK-NEXT:    ret
320  %fpext = fpext float %b to double
321  %head = insertelement <vscale x 8 x double> poison, double %fpext, i32 0
322  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
323  %vd = fadd <vscale x 8 x double> %va, %splat
324  ret <vscale x 8 x double> %vd
325}
326