| Index: src/deoptimizer.h
|
| diff --git a/src/deoptimizer.h b/src/deoptimizer.h
|
| index edf6c504f1c1340ae9345dd510a7dbc8c34d5f11..7d18a6466172c8be2d955280e9e0b5106bd9ed52 100644
|
| --- a/src/deoptimizer.h
|
| +++ b/src/deoptimizer.h
|
| @@ -38,6 +38,24 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| +
|
| +static inline double read_double_value(Address p) {
|
| +#ifdef V8_HOST_CAN_READ_UNALIGNED
|
| + return Memory::double_at(p);
|
| +#else // V8_HOST_CAN_READ_UNALIGNED
|
| + // Prevent gcc from using load-double (mips ldc1) on (possibly)
|
| + // non-64-bit aligned address.
|
| + union conversion {
|
| + double d;
|
| + uint32_t u[2];
|
| + } c;
|
| + c.u[0] = *reinterpret_cast<uint32_t*>(p);
|
| + c.u[1] = *reinterpret_cast<uint32_t*>(p + 4);
|
| + return c.d;
|
| +#endif // V8_HOST_CAN_READ_UNALIGNED
|
| +}
|
| +
|
| +
|
| class FrameDescription;
|
| class TranslationIterator;
|
| class DeoptimizingCodeListNode;
|
| @@ -492,19 +510,7 @@ class FrameDescription {
|
|
|
| double GetDoubleFrameSlot(unsigned offset) {
|
| intptr_t* ptr = GetFrameSlotPointer(offset);
|
| -#if V8_TARGET_ARCH_MIPS
|
| - // Prevent gcc from using load-double (mips ldc1) on (possibly)
|
| - // non-64-bit aligned double. Uses two lwc1 instructions.
|
| - union conversion {
|
| - double d;
|
| - uint32_t u[2];
|
| - } c;
|
| - c.u[0] = *reinterpret_cast<uint32_t*>(ptr);
|
| - c.u[1] = *(reinterpret_cast<uint32_t*>(ptr) + 1);
|
| - return c.d;
|
| -#else
|
| - return *reinterpret_cast<double*>(ptr);
|
| -#endif
|
| + return read_double_value(reinterpret_cast<Address>(ptr));
|
| }
|
|
|
| void SetFrameSlot(unsigned offset, intptr_t value) {
|
| @@ -800,7 +806,7 @@ class SlotRef BASE_EMBEDDED {
|
| }
|
|
|
| case DOUBLE: {
|
| - double value = Memory::double_at(addr_);
|
| + double value = read_double_value(addr_);
|
| return isolate->factory()->NewNumber(value);
|
| }
|
|
|
|
|