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