< 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 >