< prev index next >

src/hotspot/cpu/aarch64/aarch64.ad

Print this page
rev 53034 : 8212043: Add floating-point Math.min/max intrinsics
Summary: Floating-point Math.min() and Math.max() intrinsics are enabled on AArch64 platform
Reviewed-by: adinn, aph


12584 
12585 // src1 * src2 - src3
12586 instruct mnsubD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3, immD0 zero) %{
12587   predicate(UseFMA);
12588   match(Set dst (FmaD (NegD src3) (Binary src1 src2)));
12589 
12590   format %{ "fnmsubd   $dst, $src1, $src2, $src3" %}
12591 
12592   ins_encode %{
12593   // n.b. insn name should be fnmsubd
12594     __ fnmsub(as_FloatRegister($dst$$reg),
12595               as_FloatRegister($src1$$reg),
12596               as_FloatRegister($src2$$reg),
12597               as_FloatRegister($src3$$reg));
12598   %}
12599 
12600   ins_pipe(pipe_class_default);
12601 %}
12602 
12603 

























































12604 instruct divF_reg_reg(vRegF dst, vRegF src1, vRegF src2) %{
12605   match(Set dst (DivF src1  src2));
12606 
12607   ins_cost(INSN_COST * 18);
12608   format %{ "fdivs   $dst, $src1, $src2" %}
12609 
12610   ins_encode %{
12611     __ fdivs(as_FloatRegister($dst$$reg),
12612              as_FloatRegister($src1$$reg),
12613              as_FloatRegister($src2$$reg));
12614   %}
12615 
12616   ins_pipe(fp_div_s);
12617 %}
12618 
12619 instruct divD_reg_reg(vRegD dst, vRegD src1, vRegD src2) %{
12620   match(Set dst (DivD src1  src2));
12621 
12622   ins_cost(INSN_COST * 32);
12623   format %{ "fdivd   $dst, $src1, $src2" %}




12584 
12585 // src1 * src2 - src3
12586 instruct mnsubD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3, immD0 zero) %{
12587   predicate(UseFMA);
12588   match(Set dst (FmaD (NegD src3) (Binary src1 src2)));
12589 
12590   format %{ "fnmsubd   $dst, $src1, $src2, $src3" %}
12591 
12592   ins_encode %{
12593   // n.b. insn name should be fnmsubd
12594     __ fnmsub(as_FloatRegister($dst$$reg),
12595               as_FloatRegister($src1$$reg),
12596               as_FloatRegister($src2$$reg),
12597               as_FloatRegister($src3$$reg));
12598   %}
12599 
12600   ins_pipe(pipe_class_default);
12601 %}
12602 
12603 
12604 // Math.max(FF)F
12605 instruct maxF_reg_reg(vRegF dst, vRegF src1, vRegF src2) %{
12606   match(Set dst (MaxF src1 src2));
12607 
12608   format %{ "fmaxs   $dst, $src1, $src2" %}
12609   ins_encode %{
12610     __ fmaxs(as_FloatRegister($dst$$reg),
12611              as_FloatRegister($src1$$reg),
12612              as_FloatRegister($src2$$reg));
12613   %}
12614 
12615   ins_pipe(fp_dop_reg_reg_s);
12616 %}
12617 
12618 // Math.min(FF)F
12619 instruct minF_reg_reg(vRegF dst, vRegF src1, vRegF src2) %{
12620   match(Set dst (MinF src1 src2));
12621 
12622   format %{ "fmins   $dst, $src1, $src2" %}
12623   ins_encode %{
12624     __ fmins(as_FloatRegister($dst$$reg),
12625              as_FloatRegister($src1$$reg),
12626              as_FloatRegister($src2$$reg));
12627   %}
12628 
12629   ins_pipe(fp_dop_reg_reg_s);
12630 %}
12631 
12632 // Math.max(DD)D
12633 instruct maxD_reg_reg(vRegD dst, vRegD src1, vRegD src2) %{
12634   match(Set dst (MaxD src1 src2));
12635 
12636   format %{ "fmaxd   $dst, $src1, $src2" %}
12637   ins_encode %{
12638     __ fmaxd(as_FloatRegister($dst$$reg),
12639              as_FloatRegister($src1$$reg),
12640              as_FloatRegister($src2$$reg));
12641   %}
12642 
12643   ins_pipe(fp_dop_reg_reg_d);
12644 %}
12645 
12646 // Math.min(DD)D
12647 instruct minD_reg_reg(vRegD dst, vRegD src1, vRegD src2) %{
12648   match(Set dst (MinD src1 src2));
12649 
12650   format %{ "fmind   $dst, $src1, $src2" %}
12651   ins_encode %{
12652     __ fmind(as_FloatRegister($dst$$reg),
12653              as_FloatRegister($src1$$reg),
12654              as_FloatRegister($src2$$reg));
12655   %}
12656 
12657   ins_pipe(fp_dop_reg_reg_d);
12658 %}
12659 
12660 
12661 instruct divF_reg_reg(vRegF dst, vRegF src1, vRegF src2) %{
12662   match(Set dst (DivF src1  src2));
12663 
12664   ins_cost(INSN_COST * 18);
12665   format %{ "fdivs   $dst, $src1, $src2" %}
12666 
12667   ins_encode %{
12668     __ fdivs(as_FloatRegister($dst$$reg),
12669              as_FloatRegister($src1$$reg),
12670              as_FloatRegister($src2$$reg));
12671   %}
12672 
12673   ins_pipe(fp_div_s);
12674 %}
12675 
12676 instruct divD_reg_reg(vRegD dst, vRegD src1, vRegD src2) %{
12677   match(Set dst (DivD src1  src2));
12678 
12679   ins_cost(INSN_COST * 32);
12680   format %{ "fdivd   $dst, $src1, $src2" %}


< prev index next >