< prev index next >
src/cpu/aarch64/vm/aarch64.ad
Print this page
rev 12379 : 8162338: AArch64: Intrinsify fused mac operations
Reviewed-by:
*** 12995,13135 ****
%}
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));
! // 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));
! // %}
! // 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));
! // 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);
! // %}
! // instruct mnsubF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3, immF0 zero) %{
! // match(Set dst (SubF (MulF src1 src2) src3));
! // 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));
! // %}
! // 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));
! // 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);
! // %}
instruct divF_reg_reg(vRegF dst, vRegF src1, vRegF src2) %{
match(Set dst (DivF src1 src2));
--- 12995,13144 ----
%}
ins_pipe(fp_dop_reg_reg_d);
%}
! // 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));
! %}
! ins_pipe(pipe_class_default);
! %}
! // 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);
! %}
! // -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));
! %}
! ins_pipe(pipe_class_default);
! %}
! // -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);
! %}
! // -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));
! %}
! ins_pipe(pipe_class_default);
! %}
! // -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);
! %}
! // 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));
! %}
! ins_pipe(pipe_class_default);
! %}
! // 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);
! %}
instruct divF_reg_reg(vRegF dst, vRegF src1, vRegF src2) %{
match(Set dst (DivF src1 src2));
< prev index next >