1.1 --- a/src/cpu/mips/vm/templateTable_mips_64.cpp Thu Mar 09 10:50:10 2017 +0800 1.2 +++ b/src/cpu/mips/vm/templateTable_mips_64.cpp Thu Mar 09 15:11:22 2017 +0800 1.3 @@ -661,39 +661,94 @@ 1.4 void TemplateTable::iaload() { 1.5 transition(itos, itos); 1.6 // __ pop(SSR); 1.7 - index_check(SSR, FSR); 1.8 - __ dsll(FSR, FSR, 2); 1.9 - __ dadd(FSR, SSR, FSR); 1.10 - //FSR: index 1.11 - __ lw(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_INT)); 1.12 + if(UseBoundCheckInstruction) { 1.13 + __ pop(SSR); //SSR:array FSR: index 1.14 + __ dsll(FSR, FSR, 2); 1.15 + __ dadd(FSR, SSR, FSR); 1.16 + __ addi(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_INT)); 1.17 + 1.18 + __ lw(AT, SSR, arrayOopDesc::length_offset_in_bytes()); //bound 1.19 + __ dsll(AT, AT, 2); 1.20 + __ dadd(AT, SSR, AT); 1.21 + __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_INT)); 1.22 + 1.23 + __ gslwle(FSR, FSR, AT); 1.24 + } else { 1.25 + index_check(SSR, FSR); 1.26 + __ dsll(FSR, FSR, 2); 1.27 + __ dadd(FSR, SSR, FSR); 1.28 + //FSR: index 1.29 + __ lw(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_INT)); 1.30 + } 1.31 } 1.32 1.33 - 1.34 void TemplateTable::laload() { 1.35 transition(itos, ltos); 1.36 // __ pop(SSR); 1.37 - index_check(SSR, FSR); 1.38 - __ dsll(AT, FSR, Address::times_8); 1.39 - __ dadd(AT, SSR, AT); 1.40 - __ ld(FSR, AT, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize); 1.41 + if(UseBoundCheckInstruction) { 1.42 + __ pop(SSR); //SSR:array FSR: index 1.43 + __ dsll(FSR, FSR, Address::times_8); 1.44 + __ dadd(FSR, SSR, FSR); 1.45 + __ addi(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize); 1.46 + 1.47 + __ lw(AT, SSR, arrayOopDesc::length_offset_in_bytes()); //bound 1.48 + __ dsll(AT, AT, Address::times_8); 1.49 + __ dadd(AT, SSR, AT); 1.50 + __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize); 1.51 + 1.52 + __ gsldle(FSR, FSR, AT); 1.53 + } else { 1.54 + index_check(SSR, FSR); 1.55 + __ dsll(AT, FSR, Address::times_8); 1.56 + __ dadd(AT, SSR, AT); 1.57 + __ ld(FSR, AT, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize); 1.58 + } 1.59 } 1.60 1.61 void TemplateTable::faload() { 1.62 - transition(itos, ftos); 1.63 - // __ pop(SSR); 1.64 - index_check(SSR, FSR); 1.65 - __ shl(FSR, 2); 1.66 - __ dadd(FSR, SSR, FSR); 1.67 - __ lwc1(FSF, FSR, arrayOopDesc::base_offset_in_bytes(T_FLOAT)); 1.68 + transition(itos, ftos); 1.69 + // __ pop(SSR); 1.70 + if(UseBoundCheckInstruction) { 1.71 + __ pop(SSR); //SSR:array FSR: index 1.72 + __ shl(FSR, 2); 1.73 + __ dadd(FSR, SSR, FSR); 1.74 + __ addi(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_FLOAT)); 1.75 + 1.76 + __ lw(AT, SSR, arrayOopDesc::length_offset_in_bytes()); //bound 1.77 + __ shl(AT, 2); 1.78 + __ dadd(AT, SSR, AT); 1.79 + __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_FLOAT)); 1.80 + 1.81 + __ gslwlec1(FSF, FSR, AT); 1.82 + } else { 1.83 + index_check(SSR, FSR); 1.84 + __ shl(FSR, 2); 1.85 + __ dadd(FSR, SSR, FSR); 1.86 + __ lwc1(FSF, FSR, arrayOopDesc::base_offset_in_bytes(T_FLOAT)); 1.87 + } 1.88 } 1.89 1.90 void TemplateTable::daload() { 1.91 - transition(itos, dtos); 1.92 - //__ pop(SSR); 1.93 - index_check(SSR, FSR); 1.94 - __ dsll(AT, FSR, 3); 1.95 - __ dadd(AT, SSR, AT); 1.96 - __ ldc1(FSF, AT, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize); 1.97 + transition(itos, dtos); 1.98 + //__ pop(SSR); 1.99 + if(UseBoundCheckInstruction) { 1.100 + __ pop(SSR); //SSR:array FSR: index 1.101 + __ dsll(FSR, FSR, 3); 1.102 + __ dadd(FSR, SSR, FSR); 1.103 + __ addi(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize); 1.104 + 1.105 + __ lw(AT, SSR, arrayOopDesc::length_offset_in_bytes()); //bound 1.106 + __ dsll(AT, AT, 3); 1.107 + __ dadd(AT, SSR, AT); 1.108 + __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize); 1.109 + 1.110 + __ gsldlec1(FSF, FSR, AT); 1.111 + } else { 1.112 + index_check(SSR, FSR); 1.113 + __ dsll(AT, FSR, 3); 1.114 + __ dadd(AT, SSR, AT); 1.115 + __ ldc1(FSF, AT, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize); 1.116 + } 1.117 } 1.118 1.119 void TemplateTable::aaload() { 1.120 @@ -709,9 +764,21 @@ 1.121 void TemplateTable::baload() { 1.122 transition(itos, itos); 1.123 //__ pop(SSR); 1.124 - index_check(SSR, FSR); 1.125 - __ dadd(FSR, SSR, FSR); 1.126 - __ lb(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_BYTE)); 1.127 + if(UseBoundCheckInstruction) { 1.128 + __ pop(SSR); //SSR:array FSR:index 1.129 + __ dadd(FSR, SSR, FSR); 1.130 + __ addi(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_BYTE)); //base 1.131 + 1.132 + __ lw(AT, SSR, arrayOopDesc::length_offset_in_bytes()); 1.133 + __ dadd(AT, SSR, AT); 1.134 + __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_BYTE)); //bound 1.135 + 1.136 + __ gslble(FSR, FSR, AT); 1.137 + } else { 1.138 + index_check(SSR, FSR); 1.139 + __ dadd(FSR, SSR, FSR); 1.140 + __ lb(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_BYTE)); 1.141 + } 1.142 } 1.143 1.144 void TemplateTable::caload() { 1.145 @@ -741,10 +808,24 @@ 1.146 void TemplateTable::saload() { 1.147 transition(itos, itos); 1.148 // __ pop(SSR); 1.149 - index_check(SSR, FSR); 1.150 - __ dsll(FSR, FSR, Address::times_2); 1.151 - __ dadd(FSR, SSR, FSR); 1.152 - __ lh(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_SHORT)); 1.153 + if(UseBoundCheckInstruction) { 1.154 + __ pop(SSR); //SSR:array FSR: index 1.155 + __ dsll(FSR, FSR, Address::times_2); 1.156 + __ dadd(FSR, SSR, FSR); 1.157 + __ addi(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_SHORT)); 1.158 + 1.159 + __ lw(AT, SSR, arrayOopDesc::length_offset_in_bytes()); //bound 1.160 + __ dsll(AT, AT, Address::times_2); 1.161 + __ dadd(AT, SSR, AT); 1.162 + __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_SHORT)); 1.163 + 1.164 + __ gslhle(FSR, FSR, AT); 1.165 + } else { 1.166 + index_check(SSR, FSR); 1.167 + __ dsll(FSR, FSR, Address::times_2); 1.168 + __ dadd(FSR, SSR, FSR); 1.169 + __ lh(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_SHORT)); 1.170 + } 1.171 } 1.172 1.173 void TemplateTable::iload(int n) { 1.174 @@ -916,11 +997,25 @@ 1.175 // used register : T2 1.176 void TemplateTable::iastore() { 1.177 transition(itos, vtos); 1.178 - __ pop_i(SSR); 1.179 - index_check(T2, SSR); // prefer index in ebx 1.180 - __ dsll(SSR, SSR, Address::times_4); 1.181 - __ dadd(T2, T2, SSR); 1.182 - __ sw(FSR, T2, arrayOopDesc::base_offset_in_bytes(T_INT)); 1.183 + __ pop_i(SSR); // T2: array SSR: index 1.184 + if(UseBoundCheckInstruction) { 1.185 + __ pop_ptr(T2); 1.186 + __ dsll(SSR, SSR, Address::times_4); 1.187 + __ dadd(SSR, T2, SSR); 1.188 + __ addi(SSR, SSR, arrayOopDesc::base_offset_in_bytes(T_INT)); // base 1.189 + 1.190 + __ lw(AT, T2, arrayOopDesc::length_offset_in_bytes()); 1.191 + __ dsll(AT, AT, Address::times_4); 1.192 + __ dadd(AT, T2, AT); 1.193 + __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_INT)); //bound 1.194 + 1.195 + __ gsswle(FSR, SSR, AT); 1.196 + } else { 1.197 + index_check(T2, SSR); // prefer index in ebx 1.198 + __ dsll(SSR, SSR, Address::times_4); 1.199 + __ dadd(T2, T2, SSR); 1.200 + __ sw(FSR, T2, arrayOopDesc::base_offset_in_bytes(T_INT)); 1.201 + } 1.202 } 1.203 1.204 1.205 @@ -929,31 +1024,72 @@ 1.206 void TemplateTable::lastore() { 1.207 transition(ltos, vtos); 1.208 __ pop_i (T2); 1.209 - index_check(T3, T2); 1.210 - __ dsll(T2, T2, Address::times_8); 1.211 - __ dadd(T3, T3, T2); 1.212 - __ sd(FSR, T3, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize); 1.213 + if(UseBoundCheckInstruction) { 1.214 + __ pop_ptr(T3); 1.215 + __ dsll(T2, T2, Address::times_8); 1.216 + __ dadd(T2, T3, T2); 1.217 + __ addi(T2, T2, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize); // base 1.218 + 1.219 + __ lw(AT, T3, arrayOopDesc::length_offset_in_bytes()); 1.220 + __ dsll(AT, AT, Address::times_8); 1.221 + __ dadd(AT, T3, AT); 1.222 + __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize); //bound 1.223 + 1.224 + __ gssdle(FSR, T2, AT); 1.225 + } else { 1.226 + index_check(T3, T2); 1.227 + __ dsll(T2, T2, Address::times_8); 1.228 + __ dadd(T3, T3, T2); 1.229 + __ sd(FSR, T3, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize); 1.230 + } 1.231 } 1.232 1.233 // used register T2 1.234 void TemplateTable::fastore() { 1.235 transition(ftos, vtos); 1.236 __ pop_i(SSR); 1.237 - index_check(T2, SSR); 1.238 - __ dsll(SSR, SSR, Address::times_4); 1.239 - __ dadd(T2, T2, SSR); 1.240 - __ swc1(FSF, T2, arrayOopDesc::base_offset_in_bytes(T_FLOAT)); 1.241 + if(UseBoundCheckInstruction) { 1.242 + __ pop_ptr(T2); 1.243 + __ dsll(SSR, SSR, Address::times_4); 1.244 + __ dadd(SSR, T2, SSR); 1.245 + __ addi(SSR, SSR, arrayOopDesc::base_offset_in_bytes(T_FLOAT)); // base 1.246 + 1.247 + __ lw(AT, T2, arrayOopDesc::length_offset_in_bytes()); 1.248 + __ dsll(AT, AT, Address::times_4); 1.249 + __ dadd(AT, T2, AT); 1.250 + __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_FLOAT)); //bound 1.251 + 1.252 + __ gsswlec1(FSF, SSR, AT); 1.253 + } else { 1.254 + index_check(T2, SSR); 1.255 + __ dsll(SSR, SSR, Address::times_4); 1.256 + __ dadd(T2, T2, SSR); 1.257 + __ swc1(FSF, T2, arrayOopDesc::base_offset_in_bytes(T_FLOAT)); 1.258 + } 1.259 } 1.260 1.261 // used register T2, T3 1.262 void TemplateTable::dastore() { 1.263 transition(dtos, vtos); 1.264 __ pop_i (T2); 1.265 - index_check(T3, T2); 1.266 - __ dsll(T2, T2, Address::times_8); 1.267 - __ daddu(T3, T3, T2); 1.268 - __ sdc1(FSF, T3, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize); 1.269 - 1.270 + if(UseBoundCheckInstruction) { 1.271 + __ pop_ptr(T3); 1.272 + __ dsll(T2, T2, Address::times_8); 1.273 + __ dadd(T2, T3, T2); 1.274 + __ addi(T2, T2, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize); // base 1.275 + 1.276 + __ lw(AT, T3, arrayOopDesc::length_offset_in_bytes()); 1.277 + __ dsll(AT, AT, Address::times_8); 1.278 + __ dadd(AT, T3, AT); 1.279 + __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize); //bound 1.280 + 1.281 + __ gssdlec1(FSF, T2, AT); 1.282 + } else { 1.283 + index_check(T3, T2); 1.284 + __ dsll(T2, T2, Address::times_8); 1.285 + __ daddu(T3, T3, T2); 1.286 + __ sdc1(FSF, T3, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize); 1.287 + } 1.288 } 1.289 1.290 // used register : T2, T3, T8 1.291 @@ -1019,18 +1155,44 @@ 1.292 void TemplateTable::bastore() { 1.293 transition(itos, vtos); 1.294 __ pop_i (SSR); 1.295 - index_check(T2, SSR); 1.296 - __ dadd(SSR, T2, SSR); 1.297 - __ sb(FSR, SSR, arrayOopDesc::base_offset_in_bytes(T_BYTE)); 1.298 + if(UseBoundCheckInstruction) { 1.299 + __ pop_ptr(T2); 1.300 + __ dadd(SSR, T2, SSR); 1.301 + __ addi(SSR, SSR, arrayOopDesc::base_offset_in_bytes(T_BYTE)); // base 1.302 + 1.303 + __ lw(AT, T2, arrayOopDesc::length_offset_in_bytes()); 1.304 + __ dadd(AT, T2, AT); 1.305 + __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_BYTE)); //bound 1.306 + 1.307 + __ gssble(FSR, SSR, AT); 1.308 + } else { 1.309 + index_check(T2, SSR); 1.310 + __ dadd(SSR, T2, SSR); 1.311 + __ sb(FSR, SSR, arrayOopDesc::base_offset_in_bytes(T_BYTE)); 1.312 + } 1.313 } 1.314 1.315 void TemplateTable::castore() { 1.316 transition(itos, vtos); 1.317 __ pop_i(SSR); 1.318 - index_check(T2, SSR); 1.319 - __ dsll(SSR, SSR, Address::times_2); 1.320 - __ dadd(SSR, T2, SSR); 1.321 - __ sh(FSR, SSR, arrayOopDesc::base_offset_in_bytes(T_CHAR)); 1.322 + if(UseBoundCheckInstruction) { 1.323 + __ pop_ptr(T2); 1.324 + __ dsll(SSR, SSR, Address::times_2); 1.325 + __ dadd(SSR, T2, SSR); 1.326 + __ addi(SSR, SSR, arrayOopDesc::base_offset_in_bytes(T_CHAR)); // base 1.327 + 1.328 + __ lw(AT, T2, arrayOopDesc::length_offset_in_bytes()); 1.329 + __ dsll(AT, AT, Address::times_2); 1.330 + __ dadd(AT, T2, AT); 1.331 + __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_CHAR)); //bound 1.332 + 1.333 + __ gsshle(FSR, SSR, AT); 1.334 + } else { 1.335 + index_check(T2, SSR); 1.336 + __ dsll(SSR, SSR, Address::times_2); 1.337 + __ dadd(SSR, T2, SSR); 1.338 + __ sh(FSR, SSR, arrayOopDesc::base_offset_in_bytes(T_CHAR)); 1.339 + } 1.340 } 1.341 1.342 void TemplateTable::sastore() {