Index: src/mips64/codegen-mips64.cc |
diff --git a/src/mips64/codegen-mips64.cc b/src/mips64/codegen-mips64.cc |
index eb108daf172f8ea3fcfc9354eaff629a0d0c6d12..facce27557285fe2821a92790f9a7f821fd5d4df 100644 |
--- a/src/mips64/codegen-mips64.cc |
+++ b/src/mips64/codegen-mips64.cc |
@@ -661,17 +661,17 @@ void ElementsTransitionGenerator::GenerateSmiToDouble( |
__ SmiScale(array_end, length, kDoubleSizeLog2); |
__ Daddu(array_end, array_end, scratch3); |
-// Repurpose registers no longer in use. |
+ // Repurpose registers no longer in use. |
Register hole_lower = elements; |
Register hole_upper = length; |
__ li(hole_lower, Operand(kHoleNanLower32)); |
- __ li(hole_upper, Operand(kHoleNanUpper32)); |
// scratch1: begin of source FixedArray element fields, not tagged |
// hole_lower: kHoleNanLower32 |
// hole_upper: kHoleNanUpper32 |
// array_end: end of destination FixedDoubleArray, not tagged |
// scratch3: begin of FixedDoubleArray element fields, not tagged |
- __ Branch(&entry); |
+ __ Branch(USE_DELAY_SLOT, &entry); |
+ __ li(hole_upper, Operand(kHoleNanUpper32)); // In delay slot. |
__ bind(&only_change_map); |
__ sd(target_map, FieldMemOperand(receiver, HeapObject::kMapOffset)); |
@@ -679,7 +679,7 @@ void ElementsTransitionGenerator::GenerateSmiToDouble( |
HeapObject::kMapOffset, |
target_map, |
scratch2, |
- kRAHasNotBeenSaved, |
+ kRAHasBeenSaved, |
kDontSaveFPRegs, |
OMIT_REMEMBERED_SET, |
OMIT_SMI_CHECK); |
@@ -687,8 +687,9 @@ void ElementsTransitionGenerator::GenerateSmiToDouble( |
// Call into runtime if GC is required. |
__ bind(&gc_required); |
- __ pop(ra); |
- __ Branch(fail); |
+ __ ld(ra, MemOperand(sp, 0)); |
+ __ Branch(USE_DELAY_SLOT, fail); |
+ __ daddiu(sp, sp, kPointerSize); // In delay slot. |
// Convert and copy elements. |
__ bind(&loop); |
@@ -702,9 +703,8 @@ void ElementsTransitionGenerator::GenerateSmiToDouble( |
__ mtc1(scratch2, f0); |
__ cvt_d_w(f0, f0); |
__ sdc1(f0, MemOperand(scratch3)); |
- __ Daddu(scratch3, scratch3, kDoubleSize); |
- |
- __ Branch(&entry); |
+ __ Branch(USE_DELAY_SLOT, &entry); |
+ __ daddiu(scratch3, scratch3, kDoubleSize); // In delay slot. |
// Hole found, store the-hole NaN. |
__ bind(&convert_hole); |
@@ -723,8 +723,8 @@ void ElementsTransitionGenerator::GenerateSmiToDouble( |
__ bind(&entry); |
__ Branch(&loop, lt, scratch3, Operand(array_end)); |
- __ pop(ra); |
__ bind(&done); |
+ __ pop(ra); |
} |