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); |
} |