< prev index next >

src/cpu/aarch64/vm/aarch64.ad

Print this page
rev 12379 : 8162338: AArch64: Intrinsify fused mac operations
Reviewed-by:


12980   %}
12981 
12982   ins_pipe(fp_dop_reg_reg_s);
12983 %}
12984 
12985 instruct mulD_reg_reg(vRegD dst, vRegD src1, vRegD src2) %{
12986   match(Set dst (MulD src1 src2));
12987 
12988   ins_cost(INSN_COST * 6);
12989   format %{ "fmuld   $dst, $src1, $src2" %}
12990 
12991   ins_encode %{
12992     __ fmuld(as_FloatRegister($dst$$reg),
12993              as_FloatRegister($src1$$reg),
12994              as_FloatRegister($src2$$reg));
12995   %}
12996 
12997   ins_pipe(fp_dop_reg_reg_d);
12998 %}
12999 
13000 // We cannot use these fused mul w add/sub ops because they don't
13001 // produce the same result as the equivalent separated ops
13002 // (essentially they don't round the intermediate result). that's a
13003 // shame. leaving them here in case we can idenitfy cases where it is
13004 // legitimate to use them




































































































































13005 
13006 
13007 // instruct maddF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
13008 //   match(Set dst (AddF (MulF src1 src2) src3));
13009 
13010 //   format %{ "fmadds   $dst, $src1, $src2, $src3" %}
13011 
13012 //   ins_encode %{
13013 //     __ fmadds(as_FloatRegister($dst$$reg),
13014 //              as_FloatRegister($src1$$reg),
13015 //              as_FloatRegister($src2$$reg),
13016 //              as_FloatRegister($src3$$reg));
13017 //   %}
13018 
13019 //   ins_pipe(pipe_class_default);
13020 // %}
13021 
13022 // instruct maddD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
13023 //   match(Set dst (AddD (MulD src1 src2) src3));
13024 
13025 //   format %{ "fmaddd   $dst, $src1, $src2, $src3" %}
13026 
13027 //   ins_encode %{
13028 //     __ fmaddd(as_FloatRegister($dst$$reg),
13029 //              as_FloatRegister($src1$$reg),
13030 //              as_FloatRegister($src2$$reg),
13031 //              as_FloatRegister($src3$$reg));
13032 //   %}
13033 
13034 //   ins_pipe(pipe_class_default);
13035 // %}
13036 
13037 // instruct msubF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
13038 //   match(Set dst (AddF (MulF (NegF src1) src2) src3));
13039 //   match(Set dst (AddF (NegF (MulF src1 src2)) src3));
13040 
13041 //   format %{ "fmsubs   $dst, $src1, $src2, $src3" %}
13042 
13043 //   ins_encode %{
13044 //     __ fmsubs(as_FloatRegister($dst$$reg),
13045 //               as_FloatRegister($src1$$reg),
13046 //               as_FloatRegister($src2$$reg),
13047 //              as_FloatRegister($src3$$reg));
13048 //   %}
13049 
13050 //   ins_pipe(pipe_class_default);
13051 // %}
13052 
13053 // instruct msubD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
13054 //   match(Set dst (AddD (MulD (NegD src1) src2) src3));
13055 //   match(Set dst (AddD (NegD (MulD src1 src2)) src3));
13056 
13057 //   format %{ "fmsubd   $dst, $src1, $src2, $src3" %}
13058 
13059 //   ins_encode %{
13060 //     __ fmsubd(as_FloatRegister($dst$$reg),
13061 //               as_FloatRegister($src1$$reg),
13062 //               as_FloatRegister($src2$$reg),
13063 //               as_FloatRegister($src3$$reg));
13064 //   %}
13065 
13066 //   ins_pipe(pipe_class_default);
13067 // %}
13068 
13069 // instruct mnaddF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
13070 //   match(Set dst (SubF (MulF (NegF src1) src2) src3));
13071 //   match(Set dst (SubF (NegF (MulF src1 src2)) src3));
13072 
13073 //   format %{ "fnmadds  $dst, $src1, $src2, $src3" %}
13074 
13075 //   ins_encode %{
13076 //     __ fnmadds(as_FloatRegister($dst$$reg),
13077 //                as_FloatRegister($src1$$reg),
13078 //                as_FloatRegister($src2$$reg),
13079 //                as_FloatRegister($src3$$reg));
13080 //   %}
13081 
13082 //   ins_pipe(pipe_class_default);
13083 // %}
13084 
13085 // instruct mnaddD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
13086 //   match(Set dst (SubD (MulD (NegD src1) src2) src3));
13087 //   match(Set dst (SubD (NegD (MulD src1 src2)) src3));
13088 
13089 //   format %{ "fnmaddd   $dst, $src1, $src2, $src3" %}
13090 
13091 //   ins_encode %{
13092 //     __ fnmaddd(as_FloatRegister($dst$$reg),
13093 //                as_FloatRegister($src1$$reg),
13094 //                as_FloatRegister($src2$$reg),
13095 //                as_FloatRegister($src3$$reg));
13096 //   %}
13097 
13098 //   ins_pipe(pipe_class_default);
13099 // %}
13100 
13101 // instruct mnsubF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3, immF0 zero) %{
13102 //   match(Set dst (SubF (MulF src1 src2) src3));
13103 
13104 //   format %{ "fnmsubs  $dst, $src1, $src2, $src3" %}
13105 
13106 //   ins_encode %{
13107 //     __ fnmsubs(as_FloatRegister($dst$$reg),
13108 //                as_FloatRegister($src1$$reg),
13109 //                as_FloatRegister($src2$$reg),
13110 //                as_FloatRegister($src3$$reg));
13111 //   %}
13112 
13113 //   ins_pipe(pipe_class_default);
13114 // %}
13115 
13116 // instruct mnsubD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3, immD0 zero) %{
13117 //   match(Set dst (SubD (MulD src1 src2) src3));
13118 
13119 //   format %{ "fnmsubd   $dst, $src1, $src2, $src3" %}
13120 
13121 //   ins_encode %{
13122 //   // n.b. insn name should be fnmsubd
13123 //     __ fnmsub(as_FloatRegister($dst$$reg),
13124 //                as_FloatRegister($src1$$reg),
13125 //                as_FloatRegister($src2$$reg),
13126 //                as_FloatRegister($src3$$reg));
13127 //   %}
13128 
13129 //   ins_pipe(pipe_class_default);
13130 // %}
13131 
13132 
13133 instruct divF_reg_reg(vRegF dst, vRegF src1, vRegF src2) %{
13134   match(Set dst (DivF src1  src2));
13135 
13136   ins_cost(INSN_COST * 18);
13137   format %{ "fdivs   $dst, $src1, $src2" %}
13138 
13139   ins_encode %{
13140     __ fdivs(as_FloatRegister($dst$$reg),
13141              as_FloatRegister($src1$$reg),
13142              as_FloatRegister($src2$$reg));
13143   %}
13144 
13145   ins_pipe(fp_div_s);
13146 %}
13147 
13148 instruct divD_reg_reg(vRegD dst, vRegD src1, vRegD src2) %{
13149   match(Set dst (DivD src1  src2));
13150 




12980   %}
12981 
12982   ins_pipe(fp_dop_reg_reg_s);
12983 %}
12984 
12985 instruct mulD_reg_reg(vRegD dst, vRegD src1, vRegD src2) %{
12986   match(Set dst (MulD src1 src2));
12987 
12988   ins_cost(INSN_COST * 6);
12989   format %{ "fmuld   $dst, $src1, $src2" %}
12990 
12991   ins_encode %{
12992     __ fmuld(as_FloatRegister($dst$$reg),
12993              as_FloatRegister($src1$$reg),
12994              as_FloatRegister($src2$$reg));
12995   %}
12996 
12997   ins_pipe(fp_dop_reg_reg_d);
12998 %}
12999 
13000 // src1 * src2 + src3
13001 instruct maddF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
13002   predicate(UseFMA);
13003   match(Set dst (FmaF src3 (Binary src1 src2)));
13004 
13005   format %{ "fmadds   $dst, $src1, $src2, $src3" %}
13006 
13007   ins_encode %{
13008     __ fmadds(as_FloatRegister($dst$$reg),
13009              as_FloatRegister($src1$$reg),
13010              as_FloatRegister($src2$$reg),
13011              as_FloatRegister($src3$$reg));
13012   %}
13013 
13014   ins_pipe(pipe_class_default);
13015 %}
13016 
13017 // src1 * src2 + src3
13018 instruct maddD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
13019   predicate(UseFMA);
13020   match(Set dst (FmaD src3 (Binary src1 src2)));
13021 
13022   format %{ "fmaddd   $dst, $src1, $src2, $src3" %}
13023 
13024   ins_encode %{
13025     __ fmaddd(as_FloatRegister($dst$$reg),
13026              as_FloatRegister($src1$$reg),
13027              as_FloatRegister($src2$$reg),
13028              as_FloatRegister($src3$$reg));
13029   %}
13030 
13031   ins_pipe(pipe_class_default);
13032 %}
13033 
13034 // -src1 * src2 + src3
13035 instruct msubF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
13036   predicate(UseFMA);
13037   match(Set dst (FmaF src3 (Binary (NegF src1) src2)));
13038   match(Set dst (FmaF src3 (Binary src1 (NegF src2))));
13039 
13040   format %{ "fmsubs   $dst, $src1, $src2, $src3" %}
13041 
13042   ins_encode %{
13043     __ fmsubs(as_FloatRegister($dst$$reg),
13044               as_FloatRegister($src1$$reg),
13045               as_FloatRegister($src2$$reg),
13046               as_FloatRegister($src3$$reg));
13047   %}
13048 
13049   ins_pipe(pipe_class_default);
13050 %}
13051 
13052 // -src1 * src2 + src3
13053 instruct msubD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
13054   predicate(UseFMA);
13055   match(Set dst (FmaD src3 (Binary (NegD src1) src2)));
13056   match(Set dst (FmaD src3 (Binary src1 (NegD src2))));
13057 
13058   format %{ "fmsubd   $dst, $src1, $src2, $src3" %}
13059 
13060   ins_encode %{
13061     __ fmsubd(as_FloatRegister($dst$$reg),
13062               as_FloatRegister($src1$$reg),
13063               as_FloatRegister($src2$$reg),
13064               as_FloatRegister($src3$$reg));
13065   %}
13066 
13067   ins_pipe(pipe_class_default);
13068 %}
13069 
13070 // -src1 * src2 - src3
13071 instruct mnaddF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
13072   predicate(UseFMA);
13073   match(Set dst (FmaF (NegF src3) (Binary (NegF src1) src2)));
13074   match(Set dst (FmaF (NegF src3) (Binary src1 (NegF src2))));
13075 
13076   format %{ "fnmadds  $dst, $src1, $src2, $src3" %}
13077 
13078   ins_encode %{
13079     __ fnmadds(as_FloatRegister($dst$$reg),
13080                as_FloatRegister($src1$$reg),
13081                as_FloatRegister($src2$$reg),
13082                as_FloatRegister($src3$$reg));
13083   %}
13084 
13085   ins_pipe(pipe_class_default);
13086 %}
13087 
13088 // -src1 * src2 - src3
13089 instruct mnaddD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
13090   predicate(UseFMA);
13091   match(Set dst (FmaD (NegD src3) (Binary (NegD src1) src2)));
13092   match(Set dst (FmaD (NegD src3) (Binary src1 (NegD src2))));
13093 
13094   format %{ "fnmaddd   $dst, $src1, $src2, $src3" %}
13095 
13096   ins_encode %{
13097     __ fnmaddd(as_FloatRegister($dst$$reg),
13098                as_FloatRegister($src1$$reg),
13099                as_FloatRegister($src2$$reg),
13100                as_FloatRegister($src3$$reg));
13101   %}
13102 
13103   ins_pipe(pipe_class_default);
13104 %}
13105 
13106 // src1 * src2 - src3
13107 instruct mnsubF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3, immF0 zero) %{
13108   predicate(UseFMA);
13109   match(Set dst (FmaF (NegF src3) (Binary src1 src2)));
13110 
13111   format %{ "fnmsubs  $dst, $src1, $src2, $src3" %}
13112 
13113   ins_encode %{
13114     __ fnmsubs(as_FloatRegister($dst$$reg),
13115                as_FloatRegister($src1$$reg),
13116                as_FloatRegister($src2$$reg),
13117                as_FloatRegister($src3$$reg));
13118   %}
13119 
13120   ins_pipe(pipe_class_default);
13121 %}
13122 
13123 // src1 * src2 - src3
13124 instruct mnsubD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3, immD0 zero) %{
13125   predicate(UseFMA);
13126   match(Set dst (FmaD (NegD src3) (Binary src1 src2)));
13127 
13128   format %{ "fnmsubd   $dst, $src1, $src2, $src3" %}
13129 
13130   ins_encode %{
13131   // n.b. insn name should be fnmsubd
13132     __ fnmsub(as_FloatRegister($dst$$reg),
13133               as_FloatRegister($src1$$reg),
13134               as_FloatRegister($src2$$reg),
13135               as_FloatRegister($src3$$reg));
13136   %}
13137 
13138   ins_pipe(pipe_class_default);
13139 %}



























































































































13140 
13141 
13142 instruct divF_reg_reg(vRegF dst, vRegF src1, vRegF src2) %{
13143   match(Set dst (DivF src1  src2));
13144 
13145   ins_cost(INSN_COST * 18);
13146   format %{ "fdivs   $dst, $src1, $src2" %}
13147 
13148   ins_encode %{
13149     __ fdivs(as_FloatRegister($dst$$reg),
13150              as_FloatRegister($src1$$reg),
13151              as_FloatRegister($src2$$reg));
13152   %}
13153 
13154   ins_pipe(fp_div_s);
13155 %}
13156 
13157 instruct divD_reg_reg(vRegD dst, vRegD src1, vRegD src2) %{
13158   match(Set dst (DivD src1  src2));
13159 


< prev index next >