< prev index next >
src/cpu/aarch64/vm/aarch64.ad
Print this page
rev 12379 : 8162338: AArch64: Intrinsify fused mac operations
Reviewed-by:
@@ -12995,141 +12995,150 @@
%}
ins_pipe(fp_dop_reg_reg_d);
%}
-// We cannot use these fused mul w add/sub ops because they don't
-// produce the same result as the equivalent separated ops
-// (essentially they don't round the intermediate result). that's a
-// shame. leaving them here in case we can idenitfy cases where it is
-// legitimate to use them
-
-
-// instruct maddF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
-// match(Set dst (AddF (MulF src1 src2) src3));
-
-// format %{ "fmadds $dst, $src1, $src2, $src3" %}
-
-// ins_encode %{
-// __ fmadds(as_FloatRegister($dst$$reg),
-// as_FloatRegister($src1$$reg),
-// as_FloatRegister($src2$$reg),
-// as_FloatRegister($src3$$reg));
-// %}
-
-// ins_pipe(pipe_class_default);
-// %}
-
-// instruct maddD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
-// match(Set dst (AddD (MulD src1 src2) src3));
-
-// format %{ "fmaddd $dst, $src1, $src2, $src3" %}
-
-// ins_encode %{
-// __ fmaddd(as_FloatRegister($dst$$reg),
-// as_FloatRegister($src1$$reg),
-// as_FloatRegister($src2$$reg),
-// as_FloatRegister($src3$$reg));
-// %}
-
-// ins_pipe(pipe_class_default);
-// %}
-
-// instruct msubF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
-// match(Set dst (AddF (MulF (NegF src1) src2) src3));
-// match(Set dst (AddF (NegF (MulF src1 src2)) src3));
-
-// format %{ "fmsubs $dst, $src1, $src2, $src3" %}
-
-// ins_encode %{
-// __ fmsubs(as_FloatRegister($dst$$reg),
-// as_FloatRegister($src1$$reg),
-// as_FloatRegister($src2$$reg),
-// as_FloatRegister($src3$$reg));
-// %}
-
-// ins_pipe(pipe_class_default);
-// %}
-
-// instruct msubD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
-// match(Set dst (AddD (MulD (NegD src1) src2) src3));
-// match(Set dst (AddD (NegD (MulD src1 src2)) src3));
-
-// format %{ "fmsubd $dst, $src1, $src2, $src3" %}
-
-// ins_encode %{
-// __ fmsubd(as_FloatRegister($dst$$reg),
-// as_FloatRegister($src1$$reg),
-// as_FloatRegister($src2$$reg),
-// as_FloatRegister($src3$$reg));
-// %}
-
-// ins_pipe(pipe_class_default);
-// %}
-
-// instruct mnaddF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
-// match(Set dst (SubF (MulF (NegF src1) src2) src3));
-// match(Set dst (SubF (NegF (MulF src1 src2)) src3));
+// src1 * src2 + src3
+instruct maddF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
+ predicate(UseFMA);
+ match(Set dst (FmaF src3 (Binary src1 src2)));
+
+ format %{ "fmadds $dst, $src1, $src2, $src3" %}
+
+ ins_encode %{
+ __ fmadds(as_FloatRegister($dst$$reg),
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg),
+ as_FloatRegister($src3$$reg));
+ %}
-// format %{ "fnmadds $dst, $src1, $src2, $src3" %}
+ ins_pipe(pipe_class_default);
+%}
-// ins_encode %{
-// __ fnmadds(as_FloatRegister($dst$$reg),
-// as_FloatRegister($src1$$reg),
-// as_FloatRegister($src2$$reg),
-// as_FloatRegister($src3$$reg));
-// %}
+// src1 * src2 + src3
+instruct maddD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
+ predicate(UseFMA);
+ match(Set dst (FmaD src3 (Binary src1 src2)));
+
+ format %{ "fmaddd $dst, $src1, $src2, $src3" %}
+
+ ins_encode %{
+ __ fmaddd(as_FloatRegister($dst$$reg),
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg),
+ as_FloatRegister($src3$$reg));
+ %}
-// ins_pipe(pipe_class_default);
-// %}
+ ins_pipe(pipe_class_default);
+%}
-// instruct mnaddD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
-// match(Set dst (SubD (MulD (NegD src1) src2) src3));
-// match(Set dst (SubD (NegD (MulD src1 src2)) src3));
+// -src1 * src2 + src3
+instruct msubF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
+ predicate(UseFMA);
+ match(Set dst (FmaF src3 (Binary (NegF src1) src2)));
+ match(Set dst (FmaF src3 (Binary src1 (NegF src2))));
+
+ format %{ "fmsubs $dst, $src1, $src2, $src3" %}
+
+ ins_encode %{
+ __ fmsubs(as_FloatRegister($dst$$reg),
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg),
+ as_FloatRegister($src3$$reg));
+ %}
-// format %{ "fnmaddd $dst, $src1, $src2, $src3" %}
+ ins_pipe(pipe_class_default);
+%}
-// ins_encode %{
-// __ fnmaddd(as_FloatRegister($dst$$reg),
-// as_FloatRegister($src1$$reg),
-// as_FloatRegister($src2$$reg),
-// as_FloatRegister($src3$$reg));
-// %}
+// -src1 * src2 + src3
+instruct msubD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
+ predicate(UseFMA);
+ match(Set dst (FmaD src3 (Binary (NegD src1) src2)));
+ match(Set dst (FmaD src3 (Binary src1 (NegD src2))));
+
+ format %{ "fmsubd $dst, $src1, $src2, $src3" %}
+
+ ins_encode %{
+ __ fmsubd(as_FloatRegister($dst$$reg),
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg),
+ as_FloatRegister($src3$$reg));
+ %}
-// ins_pipe(pipe_class_default);
-// %}
+ ins_pipe(pipe_class_default);
+%}
-// instruct mnsubF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3, immF0 zero) %{
-// match(Set dst (SubF (MulF src1 src2) src3));
+// -src1 * src2 - src3
+instruct mnaddF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
+ predicate(UseFMA);
+ match(Set dst (FmaF (NegF src3) (Binary (NegF src1) src2)));
+ match(Set dst (FmaF (NegF src3) (Binary src1 (NegF src2))));
+
+ format %{ "fnmadds $dst, $src1, $src2, $src3" %}
+
+ ins_encode %{
+ __ fnmadds(as_FloatRegister($dst$$reg),
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg),
+ as_FloatRegister($src3$$reg));
+ %}
-// format %{ "fnmsubs $dst, $src1, $src2, $src3" %}
+ ins_pipe(pipe_class_default);
+%}
-// ins_encode %{
-// __ fnmsubs(as_FloatRegister($dst$$reg),
-// as_FloatRegister($src1$$reg),
-// as_FloatRegister($src2$$reg),
-// as_FloatRegister($src3$$reg));
-// %}
+// -src1 * src2 - src3
+instruct mnaddD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
+ predicate(UseFMA);
+ match(Set dst (FmaD (NegD src3) (Binary (NegD src1) src2)));
+ match(Set dst (FmaD (NegD src3) (Binary src1 (NegD src2))));
+
+ format %{ "fnmaddd $dst, $src1, $src2, $src3" %}
+
+ ins_encode %{
+ __ fnmaddd(as_FloatRegister($dst$$reg),
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg),
+ as_FloatRegister($src3$$reg));
+ %}
-// ins_pipe(pipe_class_default);
-// %}
+ ins_pipe(pipe_class_default);
+%}
-// instruct mnsubD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3, immD0 zero) %{
-// match(Set dst (SubD (MulD src1 src2) src3));
+// src1 * src2 - src3
+instruct mnsubF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3, immF0 zero) %{
+ predicate(UseFMA);
+ match(Set dst (FmaF (NegF src3) (Binary src1 src2)));
+
+ format %{ "fnmsubs $dst, $src1, $src2, $src3" %}
+
+ ins_encode %{
+ __ fnmsubs(as_FloatRegister($dst$$reg),
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg),
+ as_FloatRegister($src3$$reg));
+ %}
-// format %{ "fnmsubd $dst, $src1, $src2, $src3" %}
+ ins_pipe(pipe_class_default);
+%}
-// ins_encode %{
-// // n.b. insn name should be fnmsubd
-// __ fnmsub(as_FloatRegister($dst$$reg),
-// as_FloatRegister($src1$$reg),
-// as_FloatRegister($src2$$reg),
-// as_FloatRegister($src3$$reg));
-// %}
+// src1 * src2 - src3
+instruct mnsubD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3, immD0 zero) %{
+ predicate(UseFMA);
+ match(Set dst (FmaD (NegD src3) (Binary src1 src2)));
+
+ format %{ "fnmsubd $dst, $src1, $src2, $src3" %}
+
+ ins_encode %{
+ // n.b. insn name should be fnmsubd
+ __ fnmsub(as_FloatRegister($dst$$reg),
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg),
+ as_FloatRegister($src3$$reg));
+ %}
-// ins_pipe(pipe_class_default);
-// %}
+ ins_pipe(pipe_class_default);
+%}
instruct divF_reg_reg(vRegF dst, vRegF src1, vRegF src2) %{
match(Set dst (DivF src1 src2));
< prev index next >