Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: runtime/vm/assembler_mips.cc

Issue 2452453002: Support unaligned integer loads on ARM and MIPS. (Closed)
Patch Set: review Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/assembler_mips.h ('k') | runtime/vm/assembler_mips_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/assembler_mips.h ('k') | runtime/vm/assembler_mips_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698