| Index: src/arm/simulator-arm.cc
|
| diff --git a/src/arm/simulator-arm.cc b/src/arm/simulator-arm.cc
|
| index 91df404f9af3a00a191d8d232d4c5858e4d3155b..a75046a195656df32db4edb54b3a4ef51f0f76d2 100644
|
| --- a/src/arm/simulator-arm.cc
|
| +++ b/src/arm/simulator-arm.cc
|
| @@ -1066,111 +1066,83 @@ void Simulator::TrashCallerSaveRegisters() {
|
|
|
|
|
| int Simulator::ReadW(int32_t addr, Instruction* instr) {
|
| -#if V8_TARGET_CAN_READ_UNALIGNED
|
| - intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
|
| - return *ptr;
|
| -#else
|
| - if ((addr & 3) == 0) {
|
| + if (FLAG_enable_unaligned_accesses || (addr & 3) == 0) {
|
| intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
|
| return *ptr;
|
| + } else {
|
| + PrintF("Unaligned read at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
| + addr,
|
| + reinterpret_cast<intptr_t>(instr));
|
| + UNIMPLEMENTED();
|
| + return 0;
|
| }
|
| - PrintF("Unaligned read at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
| - addr,
|
| - reinterpret_cast<intptr_t>(instr));
|
| - UNIMPLEMENTED();
|
| - return 0;
|
| -#endif
|
| }
|
|
|
|
|
| void Simulator::WriteW(int32_t addr, int value, Instruction* instr) {
|
| -#if V8_TARGET_CAN_READ_UNALIGNED
|
| - intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
|
| - *ptr = value;
|
| - return;
|
| -#else
|
| - if ((addr & 3) == 0) {
|
| + if (FLAG_enable_unaligned_accesses || (addr & 3) == 0) {
|
| intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
|
| *ptr = value;
|
| - return;
|
| + } else {
|
| + PrintF("Unaligned write at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
| + addr,
|
| + reinterpret_cast<intptr_t>(instr));
|
| + UNIMPLEMENTED();
|
| }
|
| - PrintF("Unaligned write at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
| - addr,
|
| - reinterpret_cast<intptr_t>(instr));
|
| - UNIMPLEMENTED();
|
| -#endif
|
| }
|
|
|
|
|
| uint16_t Simulator::ReadHU(int32_t addr, Instruction* instr) {
|
| -#if V8_TARGET_CAN_READ_UNALIGNED
|
| - uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
|
| - return *ptr;
|
| -#else
|
| - if ((addr & 1) == 0) {
|
| + if (FLAG_enable_unaligned_accesses || (addr & 1) == 0) {
|
| uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
|
| return *ptr;
|
| + } else {
|
| + PrintF("Unaligned unsigned halfword read at 0x%08x, pc=0x%08"
|
| + V8PRIxPTR "\n",
|
| + addr,
|
| + reinterpret_cast<intptr_t>(instr));
|
| + UNIMPLEMENTED();
|
| + return 0;
|
| }
|
| - PrintF("Unaligned unsigned halfword read at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
| - addr,
|
| - reinterpret_cast<intptr_t>(instr));
|
| - UNIMPLEMENTED();
|
| - return 0;
|
| -#endif
|
| }
|
|
|
|
|
| int16_t Simulator::ReadH(int32_t addr, Instruction* instr) {
|
| -#if V8_TARGET_CAN_READ_UNALIGNED
|
| - int16_t* ptr = reinterpret_cast<int16_t*>(addr);
|
| - return *ptr;
|
| -#else
|
| - if ((addr & 1) == 0) {
|
| + if (FLAG_enable_unaligned_accesses || (addr & 1) == 0) {
|
| int16_t* ptr = reinterpret_cast<int16_t*>(addr);
|
| return *ptr;
|
| + } else {
|
| + PrintF("Unaligned signed halfword read at 0x%08x\n", addr);
|
| + UNIMPLEMENTED();
|
| + return 0;
|
| }
|
| - PrintF("Unaligned signed halfword read at 0x%08x\n", addr);
|
| - UNIMPLEMENTED();
|
| - return 0;
|
| -#endif
|
| }
|
|
|
|
|
| void Simulator::WriteH(int32_t addr, uint16_t value, Instruction* instr) {
|
| -#if V8_TARGET_CAN_READ_UNALIGNED
|
| - uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
|
| - *ptr = value;
|
| - return;
|
| -#else
|
| - if ((addr & 1) == 0) {
|
| + if (FLAG_enable_unaligned_accesses || (addr & 1) == 0) {
|
| uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
|
| *ptr = value;
|
| - return;
|
| + } else {
|
| + PrintF("Unaligned unsigned halfword write at 0x%08x, pc=0x%08"
|
| + V8PRIxPTR "\n",
|
| + addr,
|
| + reinterpret_cast<intptr_t>(instr));
|
| + UNIMPLEMENTED();
|
| }
|
| - PrintF("Unaligned unsigned halfword write at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
| - addr,
|
| - reinterpret_cast<intptr_t>(instr));
|
| - UNIMPLEMENTED();
|
| -#endif
|
| }
|
|
|
|
|
| void Simulator::WriteH(int32_t addr, int16_t value, Instruction* instr) {
|
| -#if V8_TARGET_CAN_READ_UNALIGNED
|
| - int16_t* ptr = reinterpret_cast<int16_t*>(addr);
|
| - *ptr = value;
|
| - return;
|
| -#else
|
| - if ((addr & 1) == 0) {
|
| + if (FLAG_enable_unaligned_accesses || (addr & 1) == 0) {
|
| int16_t* ptr = reinterpret_cast<int16_t*>(addr);
|
| *ptr = value;
|
| - return;
|
| + } else {
|
| + PrintF("Unaligned halfword write at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
| + addr,
|
| + reinterpret_cast<intptr_t>(instr));
|
| + UNIMPLEMENTED();
|
| }
|
| - PrintF("Unaligned halfword write at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
| - addr,
|
| - reinterpret_cast<intptr_t>(instr));
|
| - UNIMPLEMENTED();
|
| -#endif
|
| }
|
|
|
|
|
| @@ -1199,37 +1171,26 @@ void Simulator::WriteB(int32_t addr, int8_t value) {
|
|
|
|
|
| int32_t* Simulator::ReadDW(int32_t addr) {
|
| -#if V8_TARGET_CAN_READ_UNALIGNED
|
| - int32_t* ptr = reinterpret_cast<int32_t*>(addr);
|
| - return ptr;
|
| -#else
|
| - if ((addr & 3) == 0) {
|
| + if (FLAG_enable_unaligned_accesses || (addr & 3) == 0) {
|
| int32_t* ptr = reinterpret_cast<int32_t*>(addr);
|
| return ptr;
|
| + } else {
|
| + PrintF("Unaligned read at 0x%08x\n", addr);
|
| + UNIMPLEMENTED();
|
| + return 0;
|
| }
|
| - PrintF("Unaligned read at 0x%08x\n", addr);
|
| - UNIMPLEMENTED();
|
| - return 0;
|
| -#endif
|
| }
|
|
|
|
|
| void Simulator::WriteDW(int32_t addr, int32_t value1, int32_t value2) {
|
| -#if V8_TARGET_CAN_READ_UNALIGNED
|
| - int32_t* ptr = reinterpret_cast<int32_t*>(addr);
|
| - *ptr++ = value1;
|
| - *ptr = value2;
|
| - return;
|
| -#else
|
| - if ((addr & 3) == 0) {
|
| + if (FLAG_enable_unaligned_accesses || (addr & 3) == 0) {
|
| int32_t* ptr = reinterpret_cast<int32_t*>(addr);
|
| *ptr++ = value1;
|
| *ptr = value2;
|
| - return;
|
| + } else {
|
| + PrintF("Unaligned write at 0x%08x\n", addr);
|
| + UNIMPLEMENTED();
|
| }
|
| - PrintF("Unaligned write at 0x%08x\n", addr);
|
| - UNIMPLEMENTED();
|
| -#endif
|
| }
|
|
|
|
|
|
|