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

Side by Side Diff: src/a64/simulator-a64.cc

Issue 172223002: A64: Use fixed width MemoryRead/Write in simulator. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 10 months 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 | Annotate | Revision Log
« no previous file with comments | « src/a64/simulator-a64.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1204 matching lines...) Expand 10 before | Expand all | Expand 10 after
1215 LoadStoreHelper(instr, offset, Offset); 1215 LoadStoreHelper(instr, offset, Offset);
1216 } 1216 }
1217 1217
1218 1218
1219 void Simulator::LoadStoreHelper(Instruction* instr, 1219 void Simulator::LoadStoreHelper(Instruction* instr,
1220 int64_t offset, 1220 int64_t offset,
1221 AddrMode addrmode) { 1221 AddrMode addrmode) {
1222 unsigned srcdst = instr->Rt(); 1222 unsigned srcdst = instr->Rt();
1223 unsigned addr_reg = instr->Rn(); 1223 unsigned addr_reg = instr->Rn();
1224 uint8_t* address = LoadStoreAddress(addr_reg, offset, addrmode); 1224 uint8_t* address = LoadStoreAddress(addr_reg, offset, addrmode);
1225 int num_bytes = 1 << instr->SizeLS();
1226 uint8_t* stack = NULL; 1225 uint8_t* stack = NULL;
1227 1226
1228 // Handle the writeback for stores before the store. On a CPU the writeback 1227 // Handle the writeback for stores before the store. On a CPU the writeback
1229 // and the store are atomic, but when running on the simulator it is possible 1228 // and the store are atomic, but when running on the simulator it is possible
1230 // to be interrupted in between. The simulator is not thread safe and V8 does 1229 // to be interrupted in between. The simulator is not thread safe and V8 does
1231 // not require it to be to run JavaScript therefore the profiler may sample 1230 // not require it to be to run JavaScript therefore the profiler may sample
1232 // the "simulated" CPU in the middle of load/store with writeback. The code 1231 // the "simulated" CPU in the middle of load/store with writeback. The code
1233 // below ensures that push operations are safe even when interrupted: the 1232 // below ensures that push operations are safe even when interrupted: the
1234 // stack pointer will be decremented before adding an element to the stack. 1233 // stack pointer will be decremented before adding an element to the stack.
1235 if (instr->IsStore()) { 1234 if (instr->IsStore()) {
1236 LoadStoreWriteBack(addr_reg, offset, addrmode); 1235 LoadStoreWriteBack(addr_reg, offset, addrmode);
1237 1236
1238 // For store the address post writeback is used to check access below the 1237 // For store the address post writeback is used to check access below the
1239 // stack. 1238 // stack.
1240 stack = reinterpret_cast<uint8_t*>(sp()); 1239 stack = reinterpret_cast<uint8_t*>(sp());
1241 } 1240 }
1242 1241
1243 LoadStoreOp op = static_cast<LoadStoreOp>(instr->Mask(LoadStoreOpMask)); 1242 LoadStoreOp op = static_cast<LoadStoreOp>(instr->Mask(LoadStoreOpMask));
1244 switch (op) { 1243 switch (op) {
1245 case LDRB_w: 1244 case LDRB_w: set_xreg(srcdst, MemoryRead8(address)); break;
1246 case LDRH_w: 1245 case LDRH_w: set_xreg(srcdst, MemoryRead16(address)); break;
1247 case LDR_w: 1246 case LDR_w: set_xreg(srcdst, MemoryRead32(address)); break;
1248 case LDR_x: set_xreg(srcdst, MemoryRead(address, num_bytes)); break; 1247 case LDR_x: set_xreg(srcdst, MemoryRead64(address)); break;
1249 case STRB_w: 1248 case STRB_w: MemoryWrite8(address, reg<uint8_t>(srcdst)); break;
1250 case STRH_w: 1249 case STRH_w: MemoryWrite16(address, reg<uint16_t>(srcdst)); break;
1251 case STR_w: 1250 case STR_w: MemoryWrite32(address, reg<uint32_t>(srcdst)); break;
1252 case STR_x: MemoryWrite(address, xreg(srcdst), num_bytes); break; 1251 case STR_x: MemoryWrite64(address, reg<uint64_t>(srcdst)); break;
1253 case LDRSB_w: { 1252 case LDRSB_w: {
1254 set_wreg(srcdst, ExtendValue(kWRegSize, MemoryRead8(address), SXTB)); 1253 set_wreg(srcdst, ExtendValue(kWRegSize, MemoryRead8(address), SXTB));
1255 break; 1254 break;
1256 } 1255 }
1257 case LDRSB_x: { 1256 case LDRSB_x: {
1258 set_xreg(srcdst, ExtendValue(kXRegSize, MemoryRead8(address), SXTB)); 1257 set_xreg(srcdst, ExtendValue(kXRegSize, MemoryRead8(address), SXTB));
1259 break; 1258 break;
1260 } 1259 }
1261 case LDRSH_w: { 1260 case LDRSH_w: {
1262 set_wreg(srcdst, ExtendValue(kWRegSize, MemoryRead16(address), SXTH)); 1261 set_wreg(srcdst, ExtendValue(kWRegSize, MemoryRead16(address), SXTH));
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
1472 1471
1473 uint64_t Simulator::MemoryRead(uint8_t* address, unsigned num_bytes) { 1472 uint64_t Simulator::MemoryRead(uint8_t* address, unsigned num_bytes) {
1474 ASSERT(address != NULL); 1473 ASSERT(address != NULL);
1475 ASSERT((num_bytes > 0) && (num_bytes <= sizeof(uint64_t))); 1474 ASSERT((num_bytes > 0) && (num_bytes <= sizeof(uint64_t)));
1476 uint64_t read = 0; 1475 uint64_t read = 0;
1477 memcpy(&read, address, num_bytes); 1476 memcpy(&read, address, num_bytes);
1478 return read; 1477 return read;
1479 } 1478 }
1480 1479
1481 1480
1482 uint8_t Simulator::MemoryRead8(uint8_t* address) {
1483 return MemoryRead(address, sizeof(uint8_t));
1484 }
1485
1486
1487 uint16_t Simulator::MemoryRead16(uint8_t* address) {
1488 return MemoryRead(address, sizeof(uint16_t));
1489 }
1490
1491
1492 uint32_t Simulator::MemoryRead32(uint8_t* address) {
1493 return MemoryRead(address, sizeof(uint32_t));
1494 }
1495
1496
1497 float Simulator::MemoryReadFP32(uint8_t* address) { 1481 float Simulator::MemoryReadFP32(uint8_t* address) {
1498 return rawbits_to_float(MemoryRead32(address)); 1482 return rawbits_to_float(MemoryRead32(address));
1499 } 1483 }
1500 1484
1501 1485
1502 uint64_t Simulator::MemoryRead64(uint8_t* address) {
1503 return MemoryRead(address, sizeof(uint64_t));
1504 }
1505
1506
1507 double Simulator::MemoryReadFP64(uint8_t* address) { 1486 double Simulator::MemoryReadFP64(uint8_t* address) {
1508 return rawbits_to_double(MemoryRead64(address)); 1487 return rawbits_to_double(MemoryRead64(address));
1509 } 1488 }
1510 1489
1511 1490
1512 void Simulator::MemoryWrite(uint8_t* address, 1491 void Simulator::MemoryWrite(uint8_t* address,
1513 uint64_t value, 1492 uint64_t value,
1514 unsigned num_bytes) { 1493 unsigned num_bytes) {
1515 ASSERT(address != NULL); 1494 ASSERT(address != NULL);
1516 ASSERT((num_bytes > 0) && (num_bytes <= sizeof(uint64_t))); 1495 ASSERT((num_bytes > 0) && (num_bytes <= sizeof(uint64_t)));
1517 1496
1518 LogWrite(address, value, num_bytes); 1497 LogWrite(address, value, num_bytes);
1519 memcpy(address, &value, num_bytes); 1498 memcpy(address, &value, num_bytes);
1520 } 1499 }
1521 1500
1522 1501
1523 void Simulator::MemoryWrite32(uint8_t* address, uint32_t value) {
1524 MemoryWrite(address, value, sizeof(uint32_t));
1525 }
1526
1527
1528 void Simulator::MemoryWriteFP32(uint8_t* address, float value) { 1502 void Simulator::MemoryWriteFP32(uint8_t* address, float value) {
1529 MemoryWrite32(address, float_to_rawbits(value)); 1503 MemoryWrite32(address, float_to_rawbits(value));
1530 } 1504 }
1531 1505
1532 1506
1533 void Simulator::MemoryWrite64(uint8_t* address, uint64_t value) {
1534 MemoryWrite(address, value, sizeof(uint64_t));
1535 }
1536
1537
1538 void Simulator::MemoryWriteFP64(uint8_t* address, double value) { 1507 void Simulator::MemoryWriteFP64(uint8_t* address, double value) {
1539 MemoryWrite64(address, double_to_rawbits(value)); 1508 MemoryWrite64(address, double_to_rawbits(value));
1540 } 1509 }
1541 1510
1542 1511
1543 void Simulator::VisitMoveWideImmediate(Instruction* instr) { 1512 void Simulator::VisitMoveWideImmediate(Instruction* instr) {
1544 MoveWideImmediateOp mov_op = 1513 MoveWideImmediateOp mov_op =
1545 static_cast<MoveWideImmediateOp>(instr->Mask(MoveWideImmediateMask)); 1514 static_cast<MoveWideImmediateOp>(instr->Mask(MoveWideImmediateMask));
1546 int64_t new_xn_val = 0; 1515 int64_t new_xn_val = 0;
1547 1516
(...skipping 1857 matching lines...) Expand 10 before | Expand all | Expand 10 after
3405 default: 3374 default:
3406 UNIMPLEMENTED(); 3375 UNIMPLEMENTED();
3407 } 3376 }
3408 } 3377 }
3409 3378
3410 #endif // USE_SIMULATOR 3379 #endif // USE_SIMULATOR
3411 3380
3412 } } // namespace v8::internal 3381 } } // namespace v8::internal
3413 3382
3414 #endif // V8_TARGET_ARCH_A64 3383 #endif // V8_TARGET_ARCH_A64
OLDNEW
« no previous file with comments | « src/a64/simulator-a64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698