1.1 --- a/src/cpu/x86/vm/x86_64.ad Wed Oct 23 16:25:48 2013 -0700 1.2 +++ b/src/cpu/x86/vm/x86_64.ad Fri Oct 18 10:41:56 2013 +0200 1.3 @@ -1653,6 +1653,10 @@ 1.4 return INT_RAX_REG_mask(); 1.5 } 1.6 1.7 +const RegMask Matcher::mathExactL_result_proj_mask() { 1.8 + return LONG_RAX_REG_mask(); 1.9 +} 1.10 + 1.11 const RegMask Matcher::mathExactI_flags_proj_mask() { 1.12 return INT_FLAGS_mask(); 1.13 } 1.14 @@ -6962,6 +6966,58 @@ 1.15 ins_pipe(ialu_reg_reg); 1.16 %} 1.17 1.18 +instruct addExactI_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr) 1.19 +%{ 1.20 + match(AddExactI dst (LoadI src)); 1.21 + effect(DEF cr); 1.22 + 1.23 + ins_cost(125); // XXX 1.24 + format %{ "addl $dst, $src\t# addExact int" %} 1.25 + ins_encode %{ 1.26 + __ addl($dst$$Register, $src$$Address); 1.27 + %} 1.28 + 1.29 + ins_pipe(ialu_reg_mem); 1.30 +%} 1.31 + 1.32 +instruct addExactL_rReg(rax_RegL dst, rRegL src, rFlagsReg cr) 1.33 +%{ 1.34 + match(AddExactL dst src); 1.35 + effect(DEF cr); 1.36 + 1.37 + format %{ "addq $dst, $src\t# addExact long" %} 1.38 + ins_encode %{ 1.39 + __ addq($dst$$Register, $src$$Register); 1.40 + %} 1.41 + ins_pipe(ialu_reg_reg); 1.42 +%} 1.43 + 1.44 +instruct addExactL_rReg_imm(rax_RegL dst, immL32 src, rFlagsReg cr) 1.45 +%{ 1.46 + match(AddExactL dst src); 1.47 + effect(DEF cr); 1.48 + 1.49 + format %{ "addq $dst, $src\t# addExact long" %} 1.50 + ins_encode %{ 1.51 + __ addq($dst$$Register, $src$$constant); 1.52 + %} 1.53 + ins_pipe(ialu_reg_reg); 1.54 +%} 1.55 + 1.56 +instruct addExactL_rReg_mem(rax_RegL dst, memory src, rFlagsReg cr) 1.57 +%{ 1.58 + match(AddExactL dst (LoadL src)); 1.59 + effect(DEF cr); 1.60 + 1.61 + ins_cost(125); // XXX 1.62 + format %{ "addq $dst, $src\t# addExact long" %} 1.63 + ins_encode %{ 1.64 + __ addq($dst$$Register, $src$$Address); 1.65 + %} 1.66 + 1.67 + ins_pipe(ialu_reg_mem); 1.68 +%} 1.69 + 1.70 instruct addI_rReg(rRegI dst, rRegI src, rFlagsReg cr) 1.71 %{ 1.72 match(Set dst (AddI dst src)); 1.73 @@ -7574,6 +7630,80 @@ 1.74 ins_pipe(ialu_mem_imm); 1.75 %} 1.76 1.77 +instruct subExactI_rReg(rax_RegI dst, rRegI src, rFlagsReg cr) 1.78 +%{ 1.79 + match(SubExactI dst src); 1.80 + effect(DEF cr); 1.81 + 1.82 + format %{ "subl $dst, $src\t# subExact int" %} 1.83 + ins_encode %{ 1.84 + __ subl($dst$$Register, $src$$Register); 1.85 + %} 1.86 + ins_pipe(ialu_reg_reg); 1.87 +%} 1.88 + 1.89 +instruct subExactI_rReg_imm(rax_RegI dst, immI src, rFlagsReg cr) 1.90 +%{ 1.91 + match(SubExactI dst src); 1.92 + effect(DEF cr); 1.93 + 1.94 + format %{ "subl $dst, $src\t# subExact int" %} 1.95 + ins_encode %{ 1.96 + __ subl($dst$$Register, $src$$constant); 1.97 + %} 1.98 + ins_pipe(ialu_reg_reg); 1.99 +%} 1.100 + 1.101 +instruct subExactI_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr) 1.102 +%{ 1.103 + match(SubExactI dst (LoadI src)); 1.104 + effect(DEF cr); 1.105 + 1.106 + ins_cost(125); 1.107 + format %{ "subl $dst, $src\t# subExact int" %} 1.108 + ins_encode %{ 1.109 + __ subl($dst$$Register, $src$$Address); 1.110 + %} 1.111 + ins_pipe(ialu_reg_mem); 1.112 +%} 1.113 + 1.114 +instruct subExactL_rReg(rax_RegL dst, rRegL src, rFlagsReg cr) 1.115 +%{ 1.116 + match(SubExactL dst src); 1.117 + effect(DEF cr); 1.118 + 1.119 + format %{ "subq $dst, $src\t# subExact long" %} 1.120 + ins_encode %{ 1.121 + __ subq($dst$$Register, $src$$Register); 1.122 + %} 1.123 + ins_pipe(ialu_reg_reg); 1.124 +%} 1.125 + 1.126 +instruct subExactL_rReg_imm(rax_RegL dst, immL32 src, rFlagsReg cr) 1.127 +%{ 1.128 + match(SubExactL dst (LoadL src)); 1.129 + effect(DEF cr); 1.130 + 1.131 + format %{ "subq $dst, $src\t# subExact long" %} 1.132 + ins_encode %{ 1.133 + __ subq($dst$$Register, $src$$constant); 1.134 + %} 1.135 + ins_pipe(ialu_reg_reg); 1.136 +%} 1.137 + 1.138 +instruct subExactL_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr) 1.139 +%{ 1.140 + match(SubExactI dst src); 1.141 + effect(DEF cr); 1.142 + 1.143 + ins_cost(125); 1.144 + format %{ "subq $dst, $src\t# subExact long" %} 1.145 + ins_encode %{ 1.146 + __ subq($dst$$Register, $src$$Address); 1.147 + %} 1.148 + ins_pipe(ialu_reg_mem); 1.149 +%} 1.150 + 1.151 instruct subL_rReg(rRegL dst, rRegL src, rFlagsReg cr) 1.152 %{ 1.153 match(Set dst (SubL dst src)); 1.154 @@ -7690,6 +7820,30 @@ 1.155 ins_pipe(ialu_reg); 1.156 %} 1.157 1.158 +instruct negExactI_rReg(rax_RegI dst, rFlagsReg cr) 1.159 +%{ 1.160 + match(NegExactI dst); 1.161 + effect(KILL cr); 1.162 + 1.163 + format %{ "negl $dst\t# negExact int" %} 1.164 + ins_encode %{ 1.165 + __ negl($dst$$Register); 1.166 + %} 1.167 + ins_pipe(ialu_reg); 1.168 +%} 1.169 + 1.170 +instruct negExactL_rReg(rax_RegL dst, rFlagsReg cr) 1.171 +%{ 1.172 + match(NegExactL dst); 1.173 + effect(KILL cr); 1.174 + 1.175 + format %{ "negq $dst\t# negExact long" %} 1.176 + ins_encode %{ 1.177 + __ negq($dst$$Register); 1.178 + %} 1.179 + ins_pipe(ialu_reg); 1.180 +%} 1.181 + 1.182 1.183 //----------Multiplication/Division Instructions------------------------------- 1.184 // Integer Multiplication Instructions 1.185 @@ -7807,6 +7961,86 @@ 1.186 ins_pipe(ialu_reg_reg_alu0); 1.187 %} 1.188 1.189 + 1.190 +instruct mulExactI_rReg(rax_RegI dst, rRegI src, rFlagsReg cr) 1.191 +%{ 1.192 + match(MulExactI dst src); 1.193 + effect(DEF cr); 1.194 + 1.195 + ins_cost(300); 1.196 + format %{ "imull $dst, $src\t# mulExact int" %} 1.197 + ins_encode %{ 1.198 + __ imull($dst$$Register, $src$$Register); 1.199 + %} 1.200 + ins_pipe(ialu_reg_reg_alu0); 1.201 +%} 1.202 + 1.203 + 1.204 +instruct mulExactI_rReg_imm(rax_RegI dst, rRegI src, immI imm, rFlagsReg cr) 1.205 +%{ 1.206 + match(MulExactI src imm); 1.207 + effect(DEF cr); 1.208 + 1.209 + ins_cost(300); 1.210 + format %{ "imull $dst, $src, $imm\t# mulExact int" %} 1.211 + ins_encode %{ 1.212 + __ imull($dst$$Register, $src$$Register, $imm$$constant); 1.213 + %} 1.214 + ins_pipe(ialu_reg_reg_alu0); 1.215 +%} 1.216 + 1.217 +instruct mulExactI_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr) 1.218 +%{ 1.219 + match(MulExactI dst (LoadI src)); 1.220 + effect(DEF cr); 1.221 + 1.222 + ins_cost(350); 1.223 + format %{ "imull $dst, $src\t# mulExact int" %} 1.224 + ins_encode %{ 1.225 + __ imull($dst$$Register, $src$$Address); 1.226 + %} 1.227 + ins_pipe(ialu_reg_mem_alu0); 1.228 +%} 1.229 + 1.230 +instruct mulExactL_rReg(rax_RegL dst, rRegL src, rFlagsReg cr) 1.231 +%{ 1.232 + match(MulExactL dst src); 1.233 + effect(DEF cr); 1.234 + 1.235 + ins_cost(300); 1.236 + format %{ "imulq $dst, $src\t# mulExact long" %} 1.237 + ins_encode %{ 1.238 + __ imulq($dst$$Register, $src$$Register); 1.239 + %} 1.240 + ins_pipe(ialu_reg_reg_alu0); 1.241 +%} 1.242 + 1.243 +instruct mulExactL_rReg_imm(rax_RegL dst, rRegL src, immL32 imm, rFlagsReg cr) 1.244 +%{ 1.245 + match(MulExactL src imm); 1.246 + effect(DEF cr); 1.247 + 1.248 + ins_cost(300); 1.249 + format %{ "imulq $dst, $src, $imm\t# mulExact long" %} 1.250 + ins_encode %{ 1.251 + __ imulq($dst$$Register, $src$$Register, $imm$$constant); 1.252 + %} 1.253 + ins_pipe(ialu_reg_reg_alu0); 1.254 +%} 1.255 + 1.256 +instruct mulExactL_rReg_mem(rax_RegL dst, memory src, rFlagsReg cr) 1.257 +%{ 1.258 + match(MulExactL dst (LoadL src)); 1.259 + effect(DEF cr); 1.260 + 1.261 + ins_cost(350); 1.262 + format %{ "imulq $dst, $src\t# mulExact long" %} 1.263 + ins_encode %{ 1.264 + __ imulq($dst$$Register, $src$$Address); 1.265 + %} 1.266 + ins_pipe(ialu_reg_mem_alu0); 1.267 +%} 1.268 + 1.269 instruct divI_rReg(rax_RegI rax, rdx_RegI rdx, no_rax_rdx_RegI div, 1.270 rFlagsReg cr) 1.271 %{