@@ -2131,14 +2131,14 @@ instruct vmla_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
2131
2131
%}
2132
2132
2133
2133
// vector fmla
2134
- // dst_src1 = dst_src1 + src2 * src3
2134
+ // dst_src1 = src2 * src3 + dst_src1
2135
2135
2136
2136
instruct vfmla(vReg dst_src1, vReg src2, vReg src3) %{
2137
- predicate(UseFMA);
2138
2137
match(Set dst_src1 (FmaVF dst_src1 (Binary src2 src3)));
2139
2138
match(Set dst_src1 (FmaVD dst_src1 (Binary src2 src3)));
2140
2139
format %{ "vfmla $dst_src1, $src2, $src3" %}
2141
2140
ins_encode %{
2141
+ assert(UseFMA, "Needs FMA instructions support.");
2142
2142
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
2143
2143
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
2144
2144
__ fmla($dst_src1$$FloatRegister, get_arrangement(this),
@@ -2157,11 +2157,12 @@ instruct vfmla(vReg dst_src1, vReg src2, vReg src3) %{
2157
2157
// dst_src1 = dst_src1 * src2 + src3
2158
2158
2159
2159
instruct vfmad_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
2160
- predicate(UseFMA && UseSVE > 0);
2160
+ predicate(UseSVE > 0);
2161
2161
match(Set dst_src1 (FmaVF (Binary dst_src1 src2) (Binary src3 pg)));
2162
2162
match(Set dst_src1 (FmaVD (Binary dst_src1 src2) (Binary src3 pg)));
2163
2163
format %{ "vfmad_masked $dst_src1, $pg, $src2, $src3" %}
2164
2164
ins_encode %{
2165
+ assert(UseFMA, "Needs FMA instructions support.");
2165
2166
BasicType bt = Matcher::vector_element_basic_type(this);
2166
2167
__ sve_fmad($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
2167
2168
$pg$$PRegister, $src2$$FloatRegister, $src3$$FloatRegister);
@@ -2221,34 +2222,14 @@ instruct vmls_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
2221
2222
2222
2223
// vector fmls
2223
2224
2224
- // dst_src1 = dst_src1 + -src2 * src3
2225
- instruct vfmls1(vReg dst_src1, vReg src2, vReg src3) %{
2226
- predicate(UseFMA);
2227
- match(Set dst_src1 (FmaVF dst_src1 (Binary (NegVF src2) src3)));
2228
- match(Set dst_src1 (FmaVD dst_src1 (Binary (NegVD src2) src3)));
2229
- format %{ "vfmls1 $dst_src1, $src2, $src3" %}
2230
- ins_encode %{
2231
- uint length_in_bytes = Matcher::vector_length_in_bytes(this);
2232
- if (VM_Version::use_neon_for_vector(length_in_bytes)) {
2233
- __ fmls($dst_src1$$FloatRegister, get_arrangement(this),
2234
- $src2$$FloatRegister, $src3$$FloatRegister);
2235
- } else {
2236
- assert(UseSVE > 0, "must be sve");
2237
- BasicType bt = Matcher::vector_element_basic_type(this);
2238
- __ sve_fmls($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
2239
- ptrue, $src2$$FloatRegister, $src3$$FloatRegister);
2240
- }
2241
- %}
2242
- ins_pipe(pipe_slow);
2243
- %}
2244
-
2245
- // dst_src1 = dst_src1 + src2 * -src3
2246
- instruct vfmls2(vReg dst_src1, vReg src2, vReg src3) %{
2247
- predicate(UseFMA);
2225
+ // dst_src1 = src2 * (-src3) + dst_src1
2226
+ // "(-src2) * src3 + dst_src1" has been idealized to "src3 * (-src2) + dst_src1"
2227
+ instruct vfmls(vReg dst_src1, vReg src2, vReg src3) %{
2248
2228
match(Set dst_src1 (FmaVF dst_src1 (Binary src2 (NegVF src3))));
2249
2229
match(Set dst_src1 (FmaVD dst_src1 (Binary src2 (NegVD src3))));
2250
- format %{ "vfmls2 $dst_src1, $src2, $src3" %}
2230
+ format %{ "vfmls $dst_src1, $src2, $src3" %}
2251
2231
ins_encode %{
2232
+ assert(UseFMA, "Needs FMA instructions support.");
2252
2233
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
2253
2234
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
2254
2235
__ fmls($dst_src1$$FloatRegister, get_arrangement(this),
@@ -2265,13 +2246,14 @@ instruct vfmls2(vReg dst_src1, vReg src2, vReg src3) %{
2265
2246
2266
2247
// vector fmsb - predicated
2267
2248
2268
- // dst_src1 = dst_src1 * -src2 + src3
2249
+ // dst_src1 = dst_src1 * ( -src2) + src3
2269
2250
instruct vfmsb_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
2270
- predicate(UseFMA && UseSVE > 0);
2251
+ predicate(UseSVE > 0);
2271
2252
match(Set dst_src1 (FmaVF (Binary dst_src1 (NegVF src2)) (Binary src3 pg)));
2272
2253
match(Set dst_src1 (FmaVD (Binary dst_src1 (NegVD src2)) (Binary src3 pg)));
2273
2254
format %{ "vfmsb_masked $dst_src1, $pg, $src2, $src3" %}
2274
2255
ins_encode %{
2256
+ assert(UseFMA, "Needs FMA instructions support.");
2275
2257
BasicType bt = Matcher::vector_element_basic_type(this);
2276
2258
__ sve_fmsb($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
2277
2259
$pg$$PRegister, $src2$$FloatRegister, $src3$$FloatRegister);
@@ -2281,27 +2263,15 @@ instruct vfmsb_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
2281
2263
2282
2264
// vector fnmla (sve)
2283
2265
2284
- // dst_src1 = -dst_src1 + -src2 * src3
2285
- instruct vfnmla1(vReg dst_src1, vReg src2, vReg src3) %{
2286
- predicate(UseFMA && UseSVE > 0);
2287
- match(Set dst_src1 (FmaVF (NegVF dst_src1) (Binary (NegVF src2) src3)));
2288
- match(Set dst_src1 (FmaVD (NegVD dst_src1) (Binary (NegVD src2) src3)));
2289
- format %{ "vfnmla1 $dst_src1, $src2, $src3" %}
2290
- ins_encode %{
2291
- BasicType bt = Matcher::vector_element_basic_type(this);
2292
- __ sve_fnmla($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
2293
- ptrue, $src2$$FloatRegister, $src3$$FloatRegister);
2294
- %}
2295
- ins_pipe(pipe_slow);
2296
- %}
2297
-
2298
- // dst_src1 = -dst_src1 + src2 * -src3
2299
- instruct vfnmla2(vReg dst_src1, vReg src2, vReg src3) %{
2300
- predicate(UseFMA && UseSVE > 0);
2266
+ // dst_src1 = src2 * (-src3) - dst_src1
2267
+ // "(-src2) * src3 - dst_src1" has been idealized to "src3 * (-src2) - dst_src1"
2268
+ instruct vfnmla(vReg dst_src1, vReg src2, vReg src3) %{
2269
+ predicate(UseSVE > 0);
2301
2270
match(Set dst_src1 (FmaVF (NegVF dst_src1) (Binary src2 (NegVF src3))));
2302
2271
match(Set dst_src1 (FmaVD (NegVD dst_src1) (Binary src2 (NegVD src3))));
2303
- format %{ "vfnmla2 $dst_src1, $src2, $src3" %}
2272
+ format %{ "vfnmla $dst_src1, $src2, $src3" %}
2304
2273
ins_encode %{
2274
+ assert(UseFMA, "Needs FMA instructions support.");
2305
2275
BasicType bt = Matcher::vector_element_basic_type(this);
2306
2276
__ sve_fnmla($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
2307
2277
ptrue, $src2$$FloatRegister, $src3$$FloatRegister);
@@ -2311,13 +2281,14 @@ instruct vfnmla2(vReg dst_src1, vReg src2, vReg src3) %{
2311
2281
2312
2282
// vector fnmad - predicated
2313
2283
2314
- // dst_src1 = -src3 + dst_src1 * -src2
2284
+ // dst_src1 = dst_src1 * ( -src2) - src3
2315
2285
instruct vfnmad_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
2316
- predicate(UseFMA && UseSVE > 0);
2286
+ predicate(UseSVE > 0);
2317
2287
match(Set dst_src1 (FmaVF (Binary dst_src1 (NegVF src2)) (Binary (NegVF src3) pg)));
2318
2288
match(Set dst_src1 (FmaVD (Binary dst_src1 (NegVD src2)) (Binary (NegVD src3) pg)));
2319
2289
format %{ "vfnmad_masked $dst_src1, $pg, $src2, $src3" %}
2320
2290
ins_encode %{
2291
+ assert(UseFMA, "Needs FMA instructions support.");
2321
2292
BasicType bt = Matcher::vector_element_basic_type(this);
2322
2293
__ sve_fnmad($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
2323
2294
$pg$$PRegister, $src2$$FloatRegister, $src3$$FloatRegister);
@@ -2327,13 +2298,14 @@ instruct vfnmad_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
2327
2298
2328
2299
// vector fnmls (sve)
2329
2300
2330
- // dst_src1 = -dst_src1 + src2 * src3
2301
+ // dst_src1 = src2 * src3 - dst_src1
2331
2302
instruct vfnmls(vReg dst_src1, vReg src2, vReg src3) %{
2332
- predicate(UseFMA && UseSVE > 0);
2303
+ predicate(UseSVE > 0);
2333
2304
match(Set dst_src1 (FmaVF (NegVF dst_src1) (Binary src2 src3)));
2334
2305
match(Set dst_src1 (FmaVD (NegVD dst_src1) (Binary src2 src3)));
2335
2306
format %{ "vfnmls $dst_src1, $src2, $src3" %}
2336
2307
ins_encode %{
2308
+ assert(UseFMA, "Needs FMA instructions support.");
2337
2309
BasicType bt = Matcher::vector_element_basic_type(this);
2338
2310
__ sve_fnmls($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
2339
2311
ptrue, $src2$$FloatRegister, $src3$$FloatRegister);
@@ -2343,13 +2315,14 @@ instruct vfnmls(vReg dst_src1, vReg src2, vReg src3) %{
2343
2315
2344
2316
// vector fnmsb - predicated
2345
2317
2346
- // dst_src1 = -src3 + dst_src1 * src2
2318
+ // dst_src1 = dst_src1 * src2 - src3
2347
2319
instruct vfnmsb_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
2348
- predicate(UseFMA && UseSVE > 0);
2320
+ predicate(UseSVE > 0);
2349
2321
match(Set dst_src1 (FmaVF (Binary dst_src1 src2) (Binary (NegVF src3) pg)));
2350
2322
match(Set dst_src1 (FmaVD (Binary dst_src1 src2) (Binary (NegVD src3) pg)));
2351
2323
format %{ "vfnmsb_masked $dst_src1, $pg, $src2, $src3" %}
2352
2324
ins_encode %{
2325
+ assert(UseFMA, "Needs FMA instructions support.");
2353
2326
BasicType bt = Matcher::vector_element_basic_type(this);
2354
2327
__ sve_fnmsb($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
2355
2328
$pg$$PRegister, $src2$$FloatRegister, $src3$$FloatRegister);
0 commit comments