@@ -2131,14 +2131,14 @@ instruct vmla_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
21312131%}
21322132
21332133// vector fmla
2134- // dst_src1 = dst_src1 + src2 * src3
2134+ // dst_src1 = src2 * src3 + dst_src1
21352135
21362136instruct vfmla(vReg dst_src1, vReg src2, vReg src3) %{
2137- predicate(UseFMA);
21382137 match(Set dst_src1 (FmaVF dst_src1 (Binary src2 src3)));
21392138 match(Set dst_src1 (FmaVD dst_src1 (Binary src2 src3)));
21402139 format %{ "vfmla $dst_src1, $src2, $src3" %}
21412140 ins_encode %{
2141+ assert(UseFMA, "Needs FMA instructions support.");
21422142 uint length_in_bytes = Matcher::vector_length_in_bytes(this);
21432143 if (VM_Version::use_neon_for_vector(length_in_bytes)) {
21442144 __ fmla($dst_src1$$FloatRegister, get_arrangement(this),
@@ -2157,11 +2157,12 @@ instruct vfmla(vReg dst_src1, vReg src2, vReg src3) %{
21572157// dst_src1 = dst_src1 * src2 + src3
21582158
21592159instruct vfmad_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
2160- predicate(UseFMA && UseSVE > 0);
2160+ predicate(UseSVE > 0);
21612161 match(Set dst_src1 (FmaVF (Binary dst_src1 src2) (Binary src3 pg)));
21622162 match(Set dst_src1 (FmaVD (Binary dst_src1 src2) (Binary src3 pg)));
21632163 format %{ "vfmad_masked $dst_src1, $pg, $src2, $src3" %}
21642164 ins_encode %{
2165+ assert(UseFMA, "Needs FMA instructions support.");
21652166 BasicType bt = Matcher::vector_element_basic_type(this);
21662167 __ sve_fmad($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
21672168 $pg$$PRegister, $src2$$FloatRegister, $src3$$FloatRegister);
@@ -2221,34 +2222,14 @@ instruct vmls_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
22212222
22222223// vector fmls
22232224
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) %{
22482228 match(Set dst_src1 (FmaVF dst_src1 (Binary src2 (NegVF src3))));
22492229 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" %}
22512231 ins_encode %{
2232+ assert(UseFMA, "Needs FMA instructions support.");
22522233 uint length_in_bytes = Matcher::vector_length_in_bytes(this);
22532234 if (VM_Version::use_neon_for_vector(length_in_bytes)) {
22542235 __ fmls($dst_src1$$FloatRegister, get_arrangement(this),
@@ -2265,13 +2246,14 @@ instruct vfmls2(vReg dst_src1, vReg src2, vReg src3) %{
22652246
22662247// vector fmsb - predicated
22672248
2268- // dst_src1 = dst_src1 * -src2 + src3
2249+ // dst_src1 = dst_src1 * ( -src2) + src3
22692250instruct vfmsb_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
2270- predicate(UseFMA && UseSVE > 0);
2251+ predicate(UseSVE > 0);
22712252 match(Set dst_src1 (FmaVF (Binary dst_src1 (NegVF src2)) (Binary src3 pg)));
22722253 match(Set dst_src1 (FmaVD (Binary dst_src1 (NegVD src2)) (Binary src3 pg)));
22732254 format %{ "vfmsb_masked $dst_src1, $pg, $src2, $src3" %}
22742255 ins_encode %{
2256+ assert(UseFMA, "Needs FMA instructions support.");
22752257 BasicType bt = Matcher::vector_element_basic_type(this);
22762258 __ sve_fmsb($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
22772259 $pg$$PRegister, $src2$$FloatRegister, $src3$$FloatRegister);
@@ -2281,27 +2263,15 @@ instruct vfmsb_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
22812263
22822264// vector fnmla (sve)
22832265
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);
23012270 match(Set dst_src1 (FmaVF (NegVF dst_src1) (Binary src2 (NegVF src3))));
23022271 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" %}
23042273 ins_encode %{
2274+ assert(UseFMA, "Needs FMA instructions support.");
23052275 BasicType bt = Matcher::vector_element_basic_type(this);
23062276 __ sve_fnmla($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
23072277 ptrue, $src2$$FloatRegister, $src3$$FloatRegister);
@@ -2311,13 +2281,14 @@ instruct vfnmla2(vReg dst_src1, vReg src2, vReg src3) %{
23112281
23122282// vector fnmad - predicated
23132283
2314- // dst_src1 = -src3 + dst_src1 * -src2
2284+ // dst_src1 = dst_src1 * ( -src2) - src3
23152285instruct vfnmad_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
2316- predicate(UseFMA && UseSVE > 0);
2286+ predicate(UseSVE > 0);
23172287 match(Set dst_src1 (FmaVF (Binary dst_src1 (NegVF src2)) (Binary (NegVF src3) pg)));
23182288 match(Set dst_src1 (FmaVD (Binary dst_src1 (NegVD src2)) (Binary (NegVD src3) pg)));
23192289 format %{ "vfnmad_masked $dst_src1, $pg, $src2, $src3" %}
23202290 ins_encode %{
2291+ assert(UseFMA, "Needs FMA instructions support.");
23212292 BasicType bt = Matcher::vector_element_basic_type(this);
23222293 __ sve_fnmad($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
23232294 $pg$$PRegister, $src2$$FloatRegister, $src3$$FloatRegister);
@@ -2327,13 +2298,14 @@ instruct vfnmad_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
23272298
23282299// vector fnmls (sve)
23292300
2330- // dst_src1 = -dst_src1 + src2 * src3
2301+ // dst_src1 = src2 * src3 - dst_src1
23312302instruct vfnmls(vReg dst_src1, vReg src2, vReg src3) %{
2332- predicate(UseFMA && UseSVE > 0);
2303+ predicate(UseSVE > 0);
23332304 match(Set dst_src1 (FmaVF (NegVF dst_src1) (Binary src2 src3)));
23342305 match(Set dst_src1 (FmaVD (NegVD dst_src1) (Binary src2 src3)));
23352306 format %{ "vfnmls $dst_src1, $src2, $src3" %}
23362307 ins_encode %{
2308+ assert(UseFMA, "Needs FMA instructions support.");
23372309 BasicType bt = Matcher::vector_element_basic_type(this);
23382310 __ sve_fnmls($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
23392311 ptrue, $src2$$FloatRegister, $src3$$FloatRegister);
@@ -2343,13 +2315,14 @@ instruct vfnmls(vReg dst_src1, vReg src2, vReg src3) %{
23432315
23442316// vector fnmsb - predicated
23452317
2346- // dst_src1 = -src3 + dst_src1 * src2
2318+ // dst_src1 = dst_src1 * src2 - src3
23472319instruct vfnmsb_masked(vReg dst_src1, vReg src2, vReg src3, pRegGov pg) %{
2348- predicate(UseFMA && UseSVE > 0);
2320+ predicate(UseSVE > 0);
23492321 match(Set dst_src1 (FmaVF (Binary dst_src1 src2) (Binary (NegVF src3) pg)));
23502322 match(Set dst_src1 (FmaVD (Binary dst_src1 src2) (Binary (NegVD src3) pg)));
23512323 format %{ "vfnmsb_masked $dst_src1, $pg, $src2, $src3" %}
23522324 ins_encode %{
2325+ assert(UseFMA, "Needs FMA instructions support.");
23532326 BasicType bt = Matcher::vector_element_basic_type(this);
23542327 __ sve_fnmsb($dst_src1$$FloatRegister, __ elemType_to_regVariant(bt),
23552328 $pg$$PRegister, $src2$$FloatRegister, $src3$$FloatRegister);
0 commit comments