diff options
Diffstat (limited to 'deps/v8/src/ic/mips64/ic-mips64.cc')
-rw-r--r-- | deps/v8/src/ic/mips64/ic-mips64.cc | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/deps/v8/src/ic/mips64/ic-mips64.cc b/deps/v8/src/ic/mips64/ic-mips64.cc index b551bc70f6..c2f3cb6024 100644 --- a/deps/v8/src/ic/mips64/ic-mips64.cc +++ b/deps/v8/src/ic/mips64/ic-mips64.cc @@ -496,7 +496,8 @@ static void KeyedStoreGenerateMegamorphicHelper( __ SmiScale(scratch, key, kPointerSizeLog2); __ Daddu(address, address, scratch); __ sd(value, MemOperand(address)); - __ Ret(); + __ Ret(USE_DELAY_SLOT); + __ Move(v0, value); // Ensure the stub returns correct value. __ bind(&non_smi_value); // Escape to elements kind transition case. @@ -518,7 +519,8 @@ static void KeyedStoreGenerateMegamorphicHelper( __ mov(scratch, value); // Preserve the value which is returned. __ RecordWrite(elements, address, scratch, kRAHasNotBeenSaved, kDontSaveFPRegs, EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); - __ Ret(); + __ Ret(USE_DELAY_SLOT); + __ Move(v0, value); // Ensure the stub returns correct value. __ bind(fast_double); if (check_map == kCheckMap) { @@ -549,7 +551,8 @@ static void KeyedStoreGenerateMegamorphicHelper( __ Daddu(scratch, key, Operand(Smi::FromInt(1))); __ sd(scratch, FieldMemOperand(receiver, JSArray::kLengthOffset)); } - __ Ret(); + __ Ret(USE_DELAY_SLOT); + __ Move(v0, value); // Ensure the stub returns correct value. __ bind(&transition_smi_elements); // Transition the array appropriately depending on the value type. @@ -714,10 +717,11 @@ void KeyedStoreIC::GenerateMegamorphic(MacroAssembler* masm, static void StoreIC_PushArgs(MacroAssembler* masm) { - __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), - StoreDescriptor::ValueRegister(), + __ Push(StoreWithVectorDescriptor::ValueRegister(), StoreWithVectorDescriptor::SlotRegister(), - StoreWithVectorDescriptor::VectorRegister()); + StoreWithVectorDescriptor::VectorRegister(), + StoreWithVectorDescriptor::ReceiverRegister(), + StoreWithVectorDescriptor::NameRegister()); } @@ -727,6 +731,14 @@ void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { __ TailCallRuntime(Runtime::kKeyedStoreIC_Miss); } +void KeyedStoreIC::GenerateSlow(MacroAssembler* masm) { + StoreIC_PushArgs(masm); + + // The slow case calls into the runtime to complete the store without causing + // an IC miss that would otherwise cause a transition to the generic stub. + __ TailCallRuntime(Runtime::kKeyedStoreIC_Slow); +} + void StoreIC::GenerateMiss(MacroAssembler* masm) { StoreIC_PushArgs(masm); @@ -750,7 +762,8 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) { GenerateDictionaryStore(masm, &miss, dictionary, name, value, a6, a7); Counters* counters = masm->isolate()->counters(); __ IncrementCounter(counters->ic_store_normal_hit(), 1, a6, a7); - __ Ret(); + __ Ret(USE_DELAY_SLOT); + __ Move(v0, value); // Ensure the stub returns correct value. __ bind(&miss); __ IncrementCounter(counters->ic_store_normal_miss(), 1, a6, a7); |