Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index 36e5c6fdf51310b0ac222dc58ef92b630c9505d0..5395bbbf230991a4cb9603123dadaecde244790f 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -848,11 +848,45 @@ MaybeObject* Object::GetProperty(String* key, PropertyAttributes* attributes) { |
IsRegionDirty(object->address() + offset)); \ |
} |
-#define READ_DOUBLE_FIELD(p, offset) \ |
- (*reinterpret_cast<double*>(FIELD_ADDR(p, offset))) |
+#ifndef V8_TARGET_ARCH_MIPS |
+ #define READ_DOUBLE_FIELD(p, offset) \ |
+ (*reinterpret_cast<double*>(FIELD_ADDR(p, offset))) |
+#else // V8_TARGET_ARCH_MIPS |
+ // Prevent gcc from using load-double (mips ldc1) on (possibly) |
+ // non-64-bit aligned HeapNumber::value. |
+ static inline double read_double_field(HeapNumber* p, int offset) { |
+ union conversion { |
+ double d; |
+ uint32_t u[2]; |
+ } c; |
+ c.u[0] = (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset))); |
+ c.u[1] = (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset + 4))); |
+ return c.d; |
+ } |
+ #define READ_DOUBLE_FIELD(p, offset) read_double_field(p, offset) |
+#endif // V8_TARGET_ARCH_MIPS |
+ |
+ |
+#ifndef V8_TARGET_ARCH_MIPS |
+ #define WRITE_DOUBLE_FIELD(p, offset, value) \ |
+ (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)) = value) |
+#else // V8_TARGET_ARCH_MIPS |
+ // Prevent gcc from using store-double (mips sdc1) on (possibly) |
+ // non-64-bit aligned HeapNumber::value. |
+ static inline void write_double_field(HeapNumber* p, int offset, |
+ double value) { |
+ union conversion { |
+ double d; |
+ uint32_t u[2]; |
+ } c; |
+ c.d = value; |
+ (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset))) = c.u[0]; |
+ (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset + 4))) = c.u[1]; |
+ } |
+ #define WRITE_DOUBLE_FIELD(p, offset, value) \ |
+ write_double_field(p, offset, value) |
+#endif // V8_TARGET_ARCH_MIPS |
-#define WRITE_DOUBLE_FIELD(p, offset, value) \ |
- (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)) = value) |
#define READ_INT_FIELD(p, offset) \ |
(*reinterpret_cast<int*>(FIELD_ADDR(p, offset))) |