Revert "[InstCombine] Support gep nuw in icmp folds" (#118698)
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vfnmsub-sdnode.ll
bloba356da80e16394d56efa9c7a18447e2ef0fbca41
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
7 ; This tests a mix of vfnmsac and vfnmsub by using different operand orders to
8 ; trigger commuting in TwoAddressInstructionPass.
10 declare <vscale x 1 x half> @llvm.fma.v1f16(<vscale x 1 x half>, <vscale x 1 x half>, <vscale x 1 x half>)
12 define <vscale x 1 x half> @vfnmsub_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) {
13 ; CHECK-LABEL: vfnmsub_vv_nxv1f16:
14 ; CHECK:       # %bb.0:
15 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
16 ; CHECK-NEXT:    vfnmsub.vv v8, v9, v10
17 ; CHECK-NEXT:    ret
18   %neg = fneg <vscale x 1 x half> %va
19   %vd = call <vscale x 1 x half> @llvm.fma.v1f16(<vscale x 1 x half> %neg, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc)
20   ret <vscale x 1 x half> %vd
23 define <vscale x 1 x half> @vfnmsub_vf_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, half %c) {
24 ; CHECK-LABEL: vfnmsub_vf_nxv1f16:
25 ; CHECK:       # %bb.0:
26 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
27 ; CHECK-NEXT:    vfnmsub.vf v8, fa0, v9
28 ; CHECK-NEXT:    ret
29   %head = insertelement <vscale x 1 x half> poison, half %c, i32 0
30   %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
31   %neg = fneg <vscale x 1 x half> %va
32   %vd = call <vscale x 1 x half> @llvm.fma.v1f16(<vscale x 1 x half> %neg, <vscale x 1 x half> %splat, <vscale x 1 x half> %vb)
33   ret <vscale x 1 x half> %vd
36 declare <vscale x 2 x half> @llvm.fma.v2f16(<vscale x 2 x half>, <vscale x 2 x half>, <vscale x 2 x half>)
38 define <vscale x 2 x half> @vfnmsub_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) {
39 ; CHECK-LABEL: vfnmsub_vv_nxv2f16:
40 ; CHECK:       # %bb.0:
41 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
42 ; CHECK-NEXT:    vfnmsub.vv v8, v10, v9
43 ; CHECK-NEXT:    ret
44   %neg = fneg <vscale x 2 x half> %va
45   %vd = call <vscale x 2 x half> @llvm.fma.v2f16(<vscale x 2 x half> %neg, <vscale x 2 x half> %vc, <vscale x 2 x half> %vb)
46   ret <vscale x 2 x half> %vd
49 define <vscale x 2 x half> @vfnmsub_vf_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, half %c) {
50 ; CHECK-LABEL: vfnmsub_vf_nxv2f16:
51 ; CHECK:       # %bb.0:
52 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
53 ; CHECK-NEXT:    vfnmsub.vf v8, fa0, v9
54 ; CHECK-NEXT:    ret
55   %head = insertelement <vscale x 2 x half> poison, half %c, i32 0
56   %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
57   %neg = fneg <vscale x 2 x half> %va
58   %vd = call <vscale x 2 x half> @llvm.fma.v2f16(<vscale x 2 x half> %splat, <vscale x 2 x half> %neg, <vscale x 2 x half> %vb)
59   ret <vscale x 2 x half> %vd
62 declare <vscale x 4 x half> @llvm.fma.v4f16(<vscale x 4 x half>, <vscale x 4 x half>, <vscale x 4 x half>)
64 define <vscale x 4 x half> @vfnmsub_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) {
65 ; CHECK-LABEL: vfnmsub_vv_nxv4f16:
66 ; CHECK:       # %bb.0:
67 ; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
68 ; CHECK-NEXT:    vfnmsub.vv v8, v9, v10
69 ; CHECK-NEXT:    ret
70   %neg = fneg <vscale x 4 x half> %vb
71   %vd = call <vscale x 4 x half> @llvm.fma.v4f16(<vscale x 4 x half> %neg, <vscale x 4 x half> %va, <vscale x 4 x half> %vc)
72   ret <vscale x 4 x half> %vd
75 define <vscale x 4 x half> @vfnmsub_vf_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, half %c) {
76 ; CHECK-LABEL: vfnmsub_vf_nxv4f16:
77 ; CHECK:       # %bb.0:
78 ; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
79 ; CHECK-NEXT:    vfnmsub.vf v8, fa0, v9
80 ; CHECK-NEXT:    ret
81   %head = insertelement <vscale x 4 x half> poison, half %c, i32 0
82   %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
83   %neg = fneg <vscale x 4 x half> %splat
84   %vd = call <vscale x 4 x half> @llvm.fma.v4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %neg, <vscale x 4 x half> %vb)
85   ret <vscale x 4 x half> %vd
88 declare <vscale x 8 x half> @llvm.fma.v8f16(<vscale x 8 x half>, <vscale x 8 x half>, <vscale x 8 x half>)
90 define <vscale x 8 x half> @vfnmsub_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) {
91 ; CHECK-LABEL: vfnmsub_vv_nxv8f16:
92 ; CHECK:       # %bb.0:
93 ; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
94 ; CHECK-NEXT:    vfnmsac.vv v8, v12, v10
95 ; CHECK-NEXT:    ret
96   %neg = fneg <vscale x 8 x half> %vb
97   %vd = call <vscale x 8 x half> @llvm.fma.v8f16(<vscale x 8 x half> %neg, <vscale x 8 x half> %vc, <vscale x 8 x half> %va)
98   ret <vscale x 8 x half> %vd
101 define <vscale x 8 x half> @vfnmsub_vf_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, half %c) {
102 ; CHECK-LABEL: vfnmsub_vf_nxv8f16:
103 ; CHECK:       # %bb.0:
104 ; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
105 ; CHECK-NEXT:    vfnmsac.vf v8, fa0, v10
106 ; CHECK-NEXT:    ret
107   %head = insertelement <vscale x 8 x half> poison, half %c, i32 0
108   %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
109   %neg = fneg <vscale x 8 x half> %splat
110   %vd = call <vscale x 8 x half> @llvm.fma.v8f16(<vscale x 8 x half> %vb, <vscale x 8 x half> %neg, <vscale x 8 x half> %va)
111   ret <vscale x 8 x half> %vd
114 declare <vscale x 16 x half> @llvm.fma.v16f16(<vscale x 16 x half>, <vscale x 16 x half>, <vscale x 16 x half>)
116 define <vscale x 16 x half> @vfnmsub_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) {
117 ; CHECK-LABEL: vfnmsub_vv_nxv16f16:
118 ; CHECK:       # %bb.0:
119 ; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
120 ; CHECK-NEXT:    vfnmsub.vv v8, v16, v12
121 ; CHECK-NEXT:    ret
122   %neg = fneg <vscale x 16 x half> %vc
123   %vd = call <vscale x 16 x half> @llvm.fma.v16f16(<vscale x 16 x half> %neg, <vscale x 16 x half> %va, <vscale x 16 x half> %vb)
124   ret <vscale x 16 x half> %vd
127 define <vscale x 16 x half> @vfnmsub_vf_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, half %c) {
128 ; CHECK-LABEL: vfnmsub_vf_nxv16f16:
129 ; CHECK:       # %bb.0:
130 ; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
131 ; CHECK-NEXT:    vfnmsub.vf v8, fa0, v12
132 ; CHECK-NEXT:    ret
133   %head = insertelement <vscale x 16 x half> poison, half %c, i32 0
134   %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
135   %neg = fneg <vscale x 16 x half> %splat
136   %vd = call <vscale x 16 x half> @llvm.fma.v16f16(<vscale x 16 x half> %neg, <vscale x 16 x half> %va, <vscale x 16 x half> %vb)
137   ret <vscale x 16 x half> %vd
140 declare <vscale x 32 x half> @llvm.fma.v32f16(<vscale x 32 x half>, <vscale x 32 x half>, <vscale x 32 x half>)
142 define <vscale x 32 x half> @vfnmsub_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, <vscale x 32 x half> %vc) {
143 ; CHECK-LABEL: vfnmsub_vv_nxv32f16:
144 ; CHECK:       # %bb.0:
145 ; CHECK-NEXT:    vl8re16.v v24, (a0)
146 ; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
147 ; CHECK-NEXT:    vfnmsub.vv v8, v24, v16
148 ; CHECK-NEXT:    ret
149   %neg = fneg <vscale x 32 x half> %vc
150   %vd = call <vscale x 32 x half> @llvm.fma.v32f16(<vscale x 32 x half> %neg, <vscale x 32 x half> %va, <vscale x 32 x half> %vb)
151   ret <vscale x 32 x half> %vd
154 define <vscale x 32 x half> @vfnmsub_vf_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, half %c) {
155 ; CHECK-LABEL: vfnmsub_vf_nxv32f16:
156 ; CHECK:       # %bb.0:
157 ; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
158 ; CHECK-NEXT:    vfnmsac.vf v8, fa0, v16
159 ; CHECK-NEXT:    ret
160   %head = insertelement <vscale x 32 x half> poison, half %c, i32 0
161   %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer
162   %neg = fneg <vscale x 32 x half> %splat
163   %vd = call <vscale x 32 x half> @llvm.fma.v32f16(<vscale x 32 x half> %neg, <vscale x 32 x half> %vb, <vscale x 32 x half> %va)
164   ret <vscale x 32 x half> %vd
167 declare <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float>, <vscale x 1 x float>, <vscale x 1 x float>)
169 define <vscale x 1 x float> @vfnmsub_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) {
170 ; CHECK-LABEL: vfnmsub_vv_nxv1f32:
171 ; CHECK:       # %bb.0:
172 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
173 ; CHECK-NEXT:    vfnmsub.vv v8, v9, v10
174 ; CHECK-NEXT:    ret
175   %neg = fneg <vscale x 1 x float> %vb
176   %vd = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %neg, <vscale x 1 x float> %vc)
177   ret <vscale x 1 x float> %vd
180 define <vscale x 1 x float> @vfnmsub_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, float %c) {
181 ; CHECK-LABEL: vfnmsub_vf_nxv1f32:
182 ; CHECK:       # %bb.0:
183 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
184 ; CHECK-NEXT:    vfnmsub.vf v8, fa0, v9
185 ; CHECK-NEXT:    ret
186   %head = insertelement <vscale x 1 x float> poison, float %c, i32 0
187   %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
188   %neg = fneg <vscale x 1 x float> %va
189   %vd = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %neg, <vscale x 1 x float> %splat, <vscale x 1 x float> %vb)
190   ret <vscale x 1 x float> %vd
193 declare <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x float>)
195 define <vscale x 2 x float> @vfnmsub_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) {
196 ; CHECK-LABEL: vfnmsub_vv_nxv2f32:
197 ; CHECK:       # %bb.0:
198 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
199 ; CHECK-NEXT:    vfnmsub.vv v8, v10, v9
200 ; CHECK-NEXT:    ret
201   %neg = fneg <vscale x 2 x float> %vc
202   %vd = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %neg, <vscale x 2 x float> %vb)
203   ret <vscale x 2 x float> %vd
206 define <vscale x 2 x float> @vfnmsub_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, float %c) {
207 ; CHECK-LABEL: vfnmsub_vf_nxv2f32:
208 ; CHECK:       # %bb.0:
209 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
210 ; CHECK-NEXT:    vfnmsub.vf v8, fa0, v9
211 ; CHECK-NEXT:    ret
212   %head = insertelement <vscale x 2 x float> poison, float %c, i32 0
213   %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
214   %neg = fneg <vscale x 2 x float> %va
215   %vd = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %splat, <vscale x 2 x float> %neg, <vscale x 2 x float> %vb)
216   ret <vscale x 2 x float> %vd
219 declare <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>)
221 define <vscale x 4 x float> @vfnmsub_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) {
222 ; CHECK-LABEL: vfnmsub_vv_nxv4f32:
223 ; CHECK:       # %bb.0:
224 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
225 ; CHECK-NEXT:    vfnmsub.vv v8, v10, v12
226 ; CHECK-NEXT:    ret
227   %neg = fneg <vscale x 4 x float> %va
228   %vd = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vb, <vscale x 4 x float> %neg, <vscale x 4 x float> %vc)
229   ret <vscale x 4 x float> %vd
232 define <vscale x 4 x float> @vfnmsub_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, float %c) {
233 ; CHECK-LABEL: vfnmsub_vf_nxv4f32:
234 ; CHECK:       # %bb.0:
235 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
236 ; CHECK-NEXT:    vfnmsub.vf v8, fa0, v10
237 ; CHECK-NEXT:    ret
238   %head = insertelement <vscale x 4 x float> poison, float %c, i32 0
239   %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
240   %neg = fneg <vscale x 4 x float> %splat
241   %vd = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %neg, <vscale x 4 x float> %vb)
242   ret <vscale x 4 x float> %vd
245 declare <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float>, <vscale x 8 x float>, <vscale x 8 x float>)
247 define <vscale x 8 x float> @vfnmsub_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) {
248 ; CHECK-LABEL: vfnmsub_vv_nxv8f32:
249 ; CHECK:       # %bb.0:
250 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
251 ; CHECK-NEXT:    vfnmsac.vv v8, v16, v12
252 ; CHECK-NEXT:    ret
253   %neg = fneg <vscale x 8 x float> %vc
254   %vd = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %neg, <vscale x 8 x float> %va)
255   ret <vscale x 8 x float> %vd
258 define <vscale x 8 x float> @vfnmsub_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, float %c) {
259 ; CHECK-LABEL: vfnmsub_vf_nxv8f32:
260 ; CHECK:       # %bb.0:
261 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
262 ; CHECK-NEXT:    vfnmsac.vf v8, fa0, v12
263 ; CHECK-NEXT:    ret
264   %head = insertelement <vscale x 8 x float> poison, float %c, i32 0
265   %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
266   %neg = fneg <vscale x 8 x float> %splat
267   %vd = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %neg, <vscale x 8 x float> %va)
268   ret <vscale x 8 x float> %vd
271 declare <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float>, <vscale x 16 x float>, <vscale x 16 x float>)
273 define <vscale x 16 x float> @vfnmsub_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, <vscale x 16 x float> %vc) {
274 ; CHECK-LABEL: vfnmsub_vv_nxv16f32:
275 ; CHECK:       # %bb.0:
276 ; CHECK-NEXT:    vl8re32.v v24, (a0)
277 ; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
278 ; CHECK-NEXT:    vfnmsub.vv v8, v24, v16
279 ; CHECK-NEXT:    ret
280   %neg = fneg <vscale x 16 x float> %va
281   %vd = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vc, <vscale x 16 x float> %neg, <vscale x 16 x float> %vb)
282   ret <vscale x 16 x float> %vd
285 define <vscale x 16 x float> @vfnmsub_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, float %c) {
286 ; CHECK-LABEL: vfnmsub_vf_nxv16f32:
287 ; CHECK:       # %bb.0:
288 ; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
289 ; CHECK-NEXT:    vfnmsub.vf v8, fa0, v16
290 ; CHECK-NEXT:    ret
291   %head = insertelement <vscale x 16 x float> poison, float %c, i32 0
292   %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer
293   %neg = fneg <vscale x 16 x float> %splat
294   %vd = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %neg, <vscale x 16 x float> %va, <vscale x 16 x float> %vb)
295   ret <vscale x 16 x float> %vd
298 declare <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double>, <vscale x 1 x double>, <vscale x 1 x double>)
300 define <vscale x 1 x double> @vfnmsub_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x double> %vc) {
301 ; CHECK-LABEL: vfnmsub_vv_nxv1f64:
302 ; CHECK:       # %bb.0:
303 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
304 ; CHECK-NEXT:    vfnmsac.vv v8, v10, v9
305 ; CHECK-NEXT:    ret
306   %neg = fneg <vscale x 1 x double> %vb
307   %vd = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vc, <vscale x 1 x double> %neg, <vscale x 1 x double> %va)
308   ret <vscale x 1 x double> %vd
311 define <vscale x 1 x double> @vfnmsub_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, double %c) {
312 ; CHECK-LABEL: vfnmsub_vf_nxv1f64:
313 ; CHECK:       # %bb.0:
314 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
315 ; CHECK-NEXT:    vfnmsub.vf v8, fa0, v9
316 ; CHECK-NEXT:    ret
317   %head = insertelement <vscale x 1 x double> poison, double %c, i32 0
318   %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
319   %neg = fneg <vscale x 1 x double> %va
320   %vd = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %neg, <vscale x 1 x double> %splat, <vscale x 1 x double> %vb)
321   ret <vscale x 1 x double> %vd
324 declare <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>)
326 define <vscale x 2 x double> @vfnmsub_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, <vscale x 2 x double> %vc) {
327 ; CHECK-LABEL: vfnmsub_vv_nxv2f64:
328 ; CHECK:       # %bb.0:
329 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
330 ; CHECK-NEXT:    vfnmsub.vv v8, v12, v10
331 ; CHECK-NEXT:    ret
332   %neg = fneg <vscale x 2 x double> %va
333   %vd = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %neg, <vscale x 2 x double> %vc, <vscale x 2 x double> %vb)
334   ret <vscale x 2 x double> %vd
337 define <vscale x 2 x double> @vfnmsub_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, double %c) {
338 ; CHECK-LABEL: vfnmsub_vf_nxv2f64:
339 ; CHECK:       # %bb.0:
340 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
341 ; CHECK-NEXT:    vfnmsub.vf v8, fa0, v10
342 ; CHECK-NEXT:    ret
343   %head = insertelement <vscale x 2 x double> poison, double %c, i32 0
344   %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
345   %neg = fneg <vscale x 2 x double> %va
346   %vd = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %splat, <vscale x 2 x double> %neg, <vscale x 2 x double> %vb)
347   ret <vscale x 2 x double> %vd
350 declare <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double>, <vscale x 4 x double>, <vscale x 4 x double>)
352 define <vscale x 4 x double> @vfnmsub_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, <vscale x 4 x double> %vc) {
353 ; CHECK-LABEL: vfnmsub_vv_nxv4f64:
354 ; CHECK:       # %bb.0:
355 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
356 ; CHECK-NEXT:    vfnmsub.vv v8, v12, v16
357 ; CHECK-NEXT:    ret
358   %neg = fneg <vscale x 4 x double> %vb
359   %vd = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %neg, <vscale x 4 x double> %va, <vscale x 4 x double> %vc)
360   ret <vscale x 4 x double> %vd
363 define <vscale x 4 x double> @vfnmsub_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, double %c) {
364 ; CHECK-LABEL: vfnmsub_vf_nxv4f64:
365 ; CHECK:       # %bb.0:
366 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
367 ; CHECK-NEXT:    vfnmsub.vf v8, fa0, v12
368 ; CHECK-NEXT:    ret
369   %head = insertelement <vscale x 4 x double> poison, double %c, i32 0
370   %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
371   %neg = fneg <vscale x 4 x double> %splat
372   %vd = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %neg, <vscale x 4 x double> %vb)
373   ret <vscale x 4 x double> %vd
376 declare <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double>, <vscale x 8 x double>, <vscale x 8 x double>)
378 define <vscale x 8 x double> @vfnmsub_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, <vscale x 8 x double> %vc) {
379 ; CHECK-LABEL: vfnmsub_vv_nxv8f64:
380 ; CHECK:       # %bb.0:
381 ; CHECK-NEXT:    vl8re64.v v24, (a0)
382 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
383 ; CHECK-NEXT:    vfnmsac.vv v8, v16, v24
384 ; CHECK-NEXT:    ret
385   %neg = fneg <vscale x 8 x double> %vb
386   %vd = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %neg, <vscale x 8 x double> %vc, <vscale x 8 x double> %va)
387   ret <vscale x 8 x double> %vd
390 define <vscale x 8 x double> @vfnmsub_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, double %c) {
391 ; CHECK-LABEL: vfnmsub_vf_nxv8f64:
392 ; CHECK:       # %bb.0:
393 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
394 ; CHECK-NEXT:    vfnmsac.vf v8, fa0, v16
395 ; CHECK-NEXT:    ret
396   %head = insertelement <vscale x 8 x double> poison, double %c, i32 0
397   %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
398   %neg = fneg <vscale x 8 x double> %splat
399   %vd = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vb, <vscale x 8 x double> %neg, <vscale x 8 x double> %va)
400   ret <vscale x 8 x double> %vd