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