Index: src/ic/x64/handler-compiler-x64.cc |
diff --git a/src/ic/x64/handler-compiler-x64.cc b/src/ic/x64/handler-compiler-x64.cc |
index fe6d168b52813ad37c38b6ee9d1e698654191a3b..1490c921fc3e1890b33f66418f2f3d484ca65601 100644 |
--- a/src/ic/x64/handler-compiler-x64.cc |
+++ b/src/ic/x64/handler-compiler-x64.cc |
@@ -304,13 +304,26 @@ static void StoreIC_PushArgs(MacroAssembler* masm) { |
Register name = StoreDescriptor::NameRegister(); |
Register value = StoreDescriptor::ValueRegister(); |
- DCHECK(!rbx.is(receiver) && !rbx.is(name) && !rbx.is(value)); |
+ if (FLAG_vector_stores) { |
+ Register slot = VectorStoreICDescriptor::SlotRegister(); |
+ Register vector = VectorStoreICDescriptor::VectorRegister(); |
+ |
+ __ PopReturnAddressTo(r11); |
+ __ Push(receiver); |
+ __ Push(name); |
+ __ Push(value); |
+ __ Push(slot); |
+ __ Push(vector); |
+ __ PushReturnAddressFrom(r11); |
+ } else { |
+ DCHECK(!rbx.is(receiver) && !rbx.is(name) && !rbx.is(value)); |
- __ PopReturnAddressTo(rbx); |
- __ Push(receiver); |
- __ Push(name); |
- __ Push(value); |
- __ PushReturnAddressFrom(rbx); |
+ __ PopReturnAddressTo(rbx); |
+ __ Push(receiver); |
+ __ Push(name); |
+ __ Push(value); |
+ __ PushReturnAddressFrom(rbx); |
+ } |
} |
@@ -319,7 +332,7 @@ void NamedStoreHandlerCompiler::GenerateSlow(MacroAssembler* masm) { |
StoreIC_PushArgs(masm); |
// Do tail-call to runtime routine. |
- __ TailCallRuntime(Runtime::kStoreIC_Slow, 3, 1); |
+ __ TailCallRuntime(Runtime::kStoreIC_Slow, FLAG_vector_stores ? 5 : 3, 1); |
} |
@@ -328,7 +341,8 @@ void ElementHandlerCompiler::GenerateStoreSlow(MacroAssembler* masm) { |
StoreIC_PushArgs(masm); |
// Do tail-call to runtime routine. |
- __ TailCallRuntime(Runtime::kKeyedStoreIC_Slow, 3, 1); |
+ __ TailCallRuntime(Runtime::kKeyedStoreIC_Slow, FLAG_vector_stores ? 5 : 3, |
+ 1); |
} |
@@ -575,6 +589,7 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle<Name> name, Label* miss) { |
Label success; |
__ jmp(&success); |
GenerateRestoreName(miss, name); |
+ if (IC::ICUseVector(kind())) PopVectorAndSlot(); |
TailCallBuiltin(masm(), MissBuiltin(kind())); |
__ bind(&success); |
} |