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
|