Index: src/mips64/lithium-codegen-mips64.cc |
diff --git a/src/mips64/lithium-codegen-mips64.cc b/src/mips64/lithium-codegen-mips64.cc |
index 9c20a3697c4575328769d02281098f2d760c7f56..81b87d55c8ccbacbfe95fe2eb60bab1d9790f465 100644 |
--- a/src/mips64/lithium-codegen-mips64.cc |
+++ b/src/mips64/lithium-codegen-mips64.cc |
@@ -2337,6 +2337,8 @@ void LCodeGen::DoCmpHoleAndBranch(LCmpHoleAndBranch* instr) { |
Register scratch = scratch0(); |
__ FmoveHigh(scratch, input_reg); |
+ __ dsll32(scratch, scratch, 0); // FmoveHigh (mfhc1) sign-extends. |
+ __ dsrl32(scratch, scratch, 0); // Use only low 32-bits. |
EmitBranch(instr, eq, scratch, Operand(kHoleNanUpper32)); |
} |
@@ -3248,7 +3250,7 @@ void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) { |
__ ldc1(result, MemOperand(scratch)); |
if (instr->hydrogen()->RequiresHoleCheck()) { |
- __ lw(scratch, MemOperand(scratch, sizeof(kHoleNanLower32))); |
+ __ lwu(scratch, MemOperand(scratch, sizeof(kHoleNanLower32))); |
DeoptimizeIf(eq, instr, "hole", scratch, Operand(kHoleNanUpper32)); |
} |
} |
@@ -4189,6 +4191,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |
Register object = ToRegister(instr->object()); |
Register scratch2 = scratch1(); |
Register scratch1 = scratch0(); |
+ |
HObjectAccess access = instr->hydrogen()->access(); |
int offset = access.offset(); |
if (access.IsExternalMemory()) { |
@@ -4203,7 +4206,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |
DCHECK(!representation.IsSmi() || |
!instr->value()->IsConstantOperand() || |
IsSmi(LConstantOperand::cast(instr->value()))); |
- if (representation.IsDouble()) { |
+ if (!FLAG_unbox_double_fields && representation.IsDouble()) { |
DCHECK(access.IsInobject()); |
DCHECK(!instr->hydrogen()->has_transition()); |
DCHECK(!instr->hydrogen()->NeedsWriteBarrier()); |
@@ -4234,7 +4237,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |
destination = scratch1; |
__ ld(destination, FieldMemOperand(object, JSObject::kPropertiesOffset)); |
} |
- Register value = ToRegister(instr->value()); |
+ |
if (representation.IsSmi() && SmiValuesAre32Bits() && |
instr->hydrogen()->value()->representation().IsInteger32()) { |
DCHECK(instr->hydrogen()->store_mode() == STORE_TO_INITIALIZED_ENTRY); |
@@ -4242,16 +4245,25 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |
__ Load(scratch2, FieldMemOperand(destination, offset), representation); |
__ AssertSmi(scratch2); |
} |
- |
// Store int value directly to upper half of the smi. |
offset += kPointerSize / 2; |
representation = Representation::Integer32(); |
} |
- |
MemOperand operand = FieldMemOperand(destination, offset); |
- __ Store(value, operand, representation); |
+ |
+ if (FLAG_unbox_double_fields && representation.IsDouble()) { |
+ DCHECK(access.IsInobject()); |
+ DoubleRegister value = ToDoubleRegister(instr->value()); |
+ __ sdc1(value, operand); |
+ } else { |
+ DCHECK(instr->value()->IsRegister()); |
+ Register value = ToRegister(instr->value()); |
+ __ Store(value, operand, representation); |
+ } |
+ |
if (instr->hydrogen()->NeedsWriteBarrier()) { |
// Update the write barrier for the object for in-object properties. |
+ Register value = ToRegister(instr->value()); |
__ RecordWriteField(destination, |
offset, |
value, |