| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" // NOLINT | 5 #include "vm/globals.h" // NOLINT |
| 6 #if defined(TARGET_ARCH_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/longjump.h" | 9 #include "vm/longjump.h" |
| 10 #include "vm/runtime_entry.h" | 10 #include "vm/runtime_entry.h" |
| (...skipping 1218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1229 Register array, | 1229 Register array, |
| 1230 intptr_t index) const { | 1230 intptr_t index) const { |
| 1231 const int64_t offset = index * index_scale + | 1231 const int64_t offset = index * index_scale + |
| 1232 (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag)); | 1232 (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag)); |
| 1233 ASSERT(Utils::IsInt(32, offset)); | 1233 ASSERT(Utils::IsInt(32, offset)); |
| 1234 ASSERT(Address::CanHoldOffset(offset)); | 1234 ASSERT(Address::CanHoldOffset(offset)); |
| 1235 return Address(array, static_cast<int32_t>(offset)); | 1235 return Address(array, static_cast<int32_t>(offset)); |
| 1236 } | 1236 } |
| 1237 | 1237 |
| 1238 | 1238 |
| 1239 void Assembler::LoadElementAddressForIntIndex(Register address, |
| 1240 bool is_external, |
| 1241 intptr_t cid, |
| 1242 intptr_t index_scale, |
| 1243 Register array, |
| 1244 intptr_t index) { |
| 1245 const int64_t offset = index * index_scale + |
| 1246 (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag)); |
| 1247 AddImmediate(address, array, offset); |
| 1248 } |
| 1249 |
| 1250 |
| 1239 Address Assembler::ElementAddressForRegIndex(bool is_load, | 1251 Address Assembler::ElementAddressForRegIndex(bool is_load, |
| 1240 bool is_external, | 1252 bool is_external, |
| 1241 intptr_t cid, | 1253 intptr_t cid, |
| 1242 intptr_t index_scale, | 1254 intptr_t index_scale, |
| 1243 Register array, | 1255 Register array, |
| 1244 Register index) { | 1256 Register index) { |
| 1245 // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays. | 1257 // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays. |
| 1246 const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift; | 1258 const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift; |
| 1247 const int32_t offset = | 1259 const int32_t offset = |
| 1248 is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag); | 1260 is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag); |
| 1249 ASSERT(array != TMP); | 1261 ASSERT(array != TMP); |
| 1250 ASSERT(index != TMP); | 1262 ASSERT(index != TMP); |
| 1251 const Register base = is_load ? TMP : index; | 1263 const Register base = is_load ? TMP : index; |
| 1252 if (shift < 0) { | 1264 if (shift < 0) { |
| 1253 ASSERT(shift == -1); | 1265 ASSERT(shift == -1); |
| 1254 sra(TMP, index, 1); | 1266 sra(TMP, index, 1); |
| 1255 addu(base, array, TMP); | 1267 addu(base, array, TMP); |
| 1256 } else if (shift == 0) { | 1268 } else if (shift == 0) { |
| 1257 addu(base, array, index); | 1269 addu(base, array, index); |
| 1258 } else { | 1270 } else { |
| 1259 sll(TMP, index, shift); | 1271 sll(TMP, index, shift); |
| 1260 addu(base, array, TMP); | 1272 addu(base, array, TMP); |
| 1261 } | 1273 } |
| 1262 ASSERT(Address::CanHoldOffset(offset)); | 1274 ASSERT(Address::CanHoldOffset(offset)); |
| 1263 return Address(base, offset); | 1275 return Address(base, offset); |
| 1264 } | 1276 } |
| 1265 | 1277 |
| 1266 | 1278 |
| 1279 void Assembler::LoadElementAddressForRegIndex(Register address, |
| 1280 bool is_load, |
| 1281 bool is_external, |
| 1282 intptr_t cid, |
| 1283 intptr_t index_scale, |
| 1284 Register array, |
| 1285 Register index) { |
| 1286 // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays. |
| 1287 const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift; |
| 1288 const int32_t offset = |
| 1289 is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag); |
| 1290 if (shift < 0) { |
| 1291 ASSERT(shift == -1); |
| 1292 sra(address, index, 1); |
| 1293 addu(address, array, address); |
| 1294 } else if (shift == 0) { |
| 1295 addu(address, array, index); |
| 1296 } else { |
| 1297 sll(address, index, shift); |
| 1298 addu(address, array, address); |
| 1299 } |
| 1300 if (offset != 0) { |
| 1301 AddImmediate(address, offset); |
| 1302 } |
| 1303 } |
| 1304 |
| 1305 |
| 1306 void Assembler::LoadHalfWordUnaligned(Register dst, |
| 1307 Register addr, |
| 1308 Register tmp) { |
| 1309 ASSERT(dst != addr); |
| 1310 lbu(dst, Address(addr, 0)); |
| 1311 lb(tmp, Address(addr, 1)); |
| 1312 sll(tmp, tmp, 8); |
| 1313 or_(dst, dst, tmp); |
| 1314 } |
| 1315 |
| 1316 |
| 1317 void Assembler::LoadHalfWordUnsignedUnaligned(Register dst, |
| 1318 Register addr, |
| 1319 Register tmp) { |
| 1320 ASSERT(dst != addr); |
| 1321 lbu(dst, Address(addr, 0)); |
| 1322 lbu(tmp, Address(addr, 1)); |
| 1323 sll(tmp, tmp, 8); |
| 1324 or_(dst, dst, tmp); |
| 1325 } |
| 1326 |
| 1327 |
| 1328 void Assembler::StoreHalfWordUnaligned(Register src, |
| 1329 Register addr, |
| 1330 Register tmp) { |
| 1331 sb(src, Address(addr, 0)); |
| 1332 srl(tmp, src, 8); |
| 1333 sb(tmp, Address(addr, 1)); |
| 1334 } |
| 1335 |
| 1336 |
| 1337 void Assembler::LoadWordUnaligned(Register dst, Register addr, Register tmp) { |
| 1338 // TODO(rmacnak): LWL + LWR |
| 1339 ASSERT(dst != addr); |
| 1340 lbu(dst, Address(addr, 0)); |
| 1341 lbu(tmp, Address(addr, 1)); |
| 1342 sll(tmp, tmp, 8); |
| 1343 or_(dst, dst, tmp); |
| 1344 lbu(tmp, Address(addr, 2)); |
| 1345 sll(tmp, tmp, 16); |
| 1346 or_(dst, dst, tmp); |
| 1347 lbu(tmp, Address(addr, 3)); |
| 1348 sll(tmp, tmp, 24); |
| 1349 or_(dst, dst, tmp); |
| 1350 } |
| 1351 |
| 1352 |
| 1353 void Assembler::StoreWordUnaligned(Register src, Register addr, Register tmp) { |
| 1354 // TODO(rmacnak): SWL + SWR |
| 1355 sb(src, Address(addr, 0)); |
| 1356 srl(tmp, src, 8); |
| 1357 sb(tmp, Address(addr, 1)); |
| 1358 srl(tmp, src, 16); |
| 1359 sb(tmp, Address(addr, 2)); |
| 1360 srl(tmp, src, 24); |
| 1361 sb(tmp, Address(addr, 3)); |
| 1362 } |
| 1363 |
| 1364 |
| 1267 static const char* cpu_reg_names[kNumberOfCpuRegisters] = { | 1365 static const char* cpu_reg_names[kNumberOfCpuRegisters] = { |
| 1268 "zr", "tmp", "v0", "v1", "a0", "a1", "a2", "a3", | 1366 "zr", "tmp", "v0", "v1", "a0", "a1", "a2", "a3", |
| 1269 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", | 1367 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", |
| 1270 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", | 1368 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", |
| 1271 "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra", | 1369 "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra", |
| 1272 }; | 1370 }; |
| 1273 | 1371 |
| 1274 | 1372 |
| 1275 const char* Assembler::RegisterName(Register reg) { | 1373 const char* Assembler::RegisterName(Register reg) { |
| 1276 ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters)); | 1374 ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1297 Label stop; | 1395 Label stop; |
| 1298 b(&stop); | 1396 b(&stop); |
| 1299 Emit(reinterpret_cast<int32_t>(message)); | 1397 Emit(reinterpret_cast<int32_t>(message)); |
| 1300 Bind(&stop); | 1398 Bind(&stop); |
| 1301 break_(Instr::kStopMessageCode); | 1399 break_(Instr::kStopMessageCode); |
| 1302 } | 1400 } |
| 1303 | 1401 |
| 1304 } // namespace dart | 1402 } // namespace dart |
| 1305 | 1403 |
| 1306 #endif // defined TARGET_ARCH_MIPS | 1404 #endif // defined TARGET_ARCH_MIPS |
| OLD | NEW |