From: mvstanton@chromium.org Date: Fri, 11 Jul 2014 13:53:19 +0000 (+0000) Subject: Use the same registers for StoreIC and KeyedStoreIC. X-Git-Tag: upstream/4.7.83~8258 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8a0267f96ec32a337fbcfa1aba631e156a8b6597;p=platform%2Fupstream%2Fv8.git Use the same registers for StoreIC and KeyedStoreIC. The x64 and ia32 platforms already did this, port to arm and arm64. R=mstarzinger@chromium.org Review URL: https://codereview.chromium.org/385553004 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22358 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc index 5e0e69e..77eaf22 100644 --- a/src/arm/code-stubs-arm.cc +++ b/src/arm/code-stubs-arm.cc @@ -221,14 +221,6 @@ void InternalArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor( } -void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { r0, r3, r1, r2 }; - descriptor->Initialize(ARRAY_SIZE(registers), registers, - FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss)); -} - - void BinaryOpICStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { Register registers[] = { r1, r0 }; diff --git a/src/arm/ic-arm.cc b/src/arm/ic-arm.cc index c49b161..7b85f43 100644 --- a/src/arm/ic-arm.cc +++ b/src/arm/ic-arm.cc @@ -500,8 +500,8 @@ void KeyedStoreIC::GenerateSloppyArguments(MacroAssembler* masm) { Register receiver = ReceiverRegister(); Register key = NameRegister(); Register value = ValueRegister(); - ASSERT(receiver.is(r2)); - ASSERT(key.is(r1)); + ASSERT(receiver.is(r1)); + ASSERT(key.is(r2)); ASSERT(value.is(r0)); Label slow, notin; @@ -552,9 +552,24 @@ const Register StoreIC::NameRegister() { return r2; } const Register StoreIC::ValueRegister() { return r0; } -const Register KeyedStoreIC::ReceiverRegister() { return r2; } -const Register KeyedStoreIC::NameRegister() { return r1; } -const Register KeyedStoreIC::ValueRegister() { return r0; } +const Register KeyedStoreIC::ReceiverRegister() { + return StoreIC::ReceiverRegister(); +} + + +const Register KeyedStoreIC::NameRegister() { + return StoreIC::NameRegister(); +} + + +const Register KeyedStoreIC::ValueRegister() { + return StoreIC::ValueRegister(); +} + + +const Register KeyedStoreIC::MapRegister() { + return r3; +} void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { @@ -1028,8 +1043,8 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, Register value = ValueRegister(); Register key = NameRegister(); Register receiver = ReceiverRegister(); - ASSERT(receiver.is(r2)); - ASSERT(key.is(r1)); + ASSERT(receiver.is(r1)); + ASSERT(key.is(r2)); ASSERT(value.is(r0)); Register receiver_map = r3; Register elements_map = r6; diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc index 98002dc..1898dbc 100644 --- a/src/arm/stub-cache-arm.cc +++ b/src/arm/stub-cache-arm.cc @@ -1294,10 +1294,11 @@ Register* StoreStubCompiler::registers() { Register* KeyedStoreStubCompiler::registers() { - // receiver, name, scratch1, scratch2, scratch3. + // receiver, name, scratch1/map, scratch2, scratch3. Register receiver = KeyedStoreIC::ReceiverRegister(); Register name = KeyedStoreIC::NameRegister(); - static Register registers[] = { receiver, name, r3, r4, r5 }; + Register map = KeyedStoreIC::MapRegister(); + static Register registers[] = { receiver, name, map, r4, r5 }; return registers; } @@ -1397,7 +1398,10 @@ Handle BaseLoadStoreStubCompiler::CompilePolymorphicIC( Label* smi_target = IncludesNumberType(types) ? &number_case : &miss; __ JumpIfSmi(receiver(), smi_target); + // Polymorphic keyed stores may use the map register Register map_reg = scratch1(); + ASSERT(kind() != Code::KEYED_STORE_IC || + map_reg.is(KeyedStoreIC::MapRegister())); int receiver_count = types->length(); int number_of_handled_maps = 0; diff --git a/src/arm64/code-stubs-arm64.cc b/src/arm64/code-stubs-arm64.cc index 5b76f1a..7126628 100644 --- a/src/arm64/code-stubs-arm64.cc +++ b/src/arm64/code-stubs-arm64.cc @@ -238,18 +238,6 @@ void ToBooleanStub::InitializeInterfaceDescriptor( } -void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - // x0: value - // x3: target map - // x1: key - // x2: receiver - Register registers[] = { x0, x3, x1, x2 }; - descriptor->Initialize(ARRAY_SIZE(registers), registers, - FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss)); -} - - void BinaryOpICStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { // x1: left operand diff --git a/src/arm64/ic-arm64.cc b/src/arm64/ic-arm64.cc index 5a2dde5..9040061 100644 --- a/src/arm64/ic-arm64.cc +++ b/src/arm64/ic-arm64.cc @@ -506,8 +506,8 @@ void KeyedStoreIC::GenerateSloppyArguments(MacroAssembler* masm) { Register value = ValueRegister(); Register key = NameRegister(); Register receiver = ReceiverRegister(); - ASSERT(receiver.is(x2)); - ASSERT(key.is(x1)); + ASSERT(receiver.is(x1)); + ASSERT(key.is(x2)); ASSERT(value.is(x0)); Register map = x3; @@ -574,9 +574,24 @@ const Register StoreIC::NameRegister() { return x2; } const Register StoreIC::ValueRegister() { return x0; } -const Register KeyedStoreIC::ReceiverRegister() { return x2; } -const Register KeyedStoreIC::NameRegister() { return x1; } -const Register KeyedStoreIC::ValueRegister() { return x0; } +const Register KeyedStoreIC::ReceiverRegister() { + return StoreIC::ReceiverRegister(); +} + + +const Register KeyedStoreIC::NameRegister() { + return StoreIC::NameRegister(); +} + + +const Register KeyedStoreIC::ValueRegister() { + return StoreIC::ValueRegister(); +} + + +const Register KeyedStoreIC::MapRegister() { + return x3; +} void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { @@ -1067,8 +1082,8 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, Register value = ValueRegister(); Register key = NameRegister(); Register receiver = ReceiverRegister(); - ASSERT(receiver.is(x2)); - ASSERT(key.is(x1)); + ASSERT(receiver.is(x1)); + ASSERT(key.is(x2)); ASSERT(value.is(x0)); Register receiver_map = x3; diff --git a/src/arm64/stub-cache-arm64.cc b/src/arm64/stub-cache-arm64.cc index d52493e..c3b48a5 100644 --- a/src/arm64/stub-cache-arm64.cc +++ b/src/arm64/stub-cache-arm64.cc @@ -1276,10 +1276,11 @@ Register* StoreStubCompiler::registers() { Register* KeyedStoreStubCompiler::registers() { - // receiver, name, scratch1, scratch2, scratch3. + // receiver, name, scratch1/map, scratch2, scratch3. Register receiver = KeyedStoreIC::ReceiverRegister(); Register name = KeyedStoreIC::NameRegister(); - static Register registers[] = { receiver, name, x3, x4, x5 }; + Register map = KeyedStoreIC::MapRegister(); + static Register registers[] = { receiver, name, map, x4, x5 }; return registers; } @@ -1370,7 +1371,10 @@ Handle BaseLoadStoreStubCompiler::CompilePolymorphicIC( Label* smi_target = IncludesNumberType(types) ? &number_case : &miss; __ JumpIfSmi(receiver(), smi_target); + // Polymorphic keyed stores may use the map register Register map_reg = scratch1(); + ASSERT(kind() != Code::KEYED_STORE_IC || + map_reg.is(KeyedStoreIC::MapRegister())); __ Ldr(map_reg, FieldMemOperand(receiver(), HeapObject::kMapOffset)); int receiver_count = types->length(); int number_of_handled_maps = 0; diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc index bdd168b..547820c 100644 --- a/src/code-stubs-hydrogen.cc +++ b/src/code-stubs-hydrogen.cc @@ -1077,10 +1077,10 @@ Handle StoreGlobalStub::GenerateCode() { template<> HValue* CodeStubGraphBuilder::BuildCodeStub() { - HValue* value = GetParameter(0); - HValue* map = GetParameter(1); - HValue* key = GetParameter(2); - HValue* object = GetParameter(3); + HValue* value = GetParameter(ElementsTransitionAndStoreStub::kValueIndex); + HValue* map = GetParameter(ElementsTransitionAndStoreStub::kMapIndex); + HValue* key = GetParameter(ElementsTransitionAndStoreStub::kKeyIndex); + HValue* object = GetParameter(ElementsTransitionAndStoreStub::kObjectIndex); if (FLAG_trace_elements_transitions) { // Tracing elements transitions is the job of the runtime. diff --git a/src/code-stubs.cc b/src/code-stubs.cc index 5a3f4e4..c36568c 100644 --- a/src/code-stubs.cc +++ b/src/code-stubs.cc @@ -644,6 +644,17 @@ void KeyedStoreFastElementStub::InitializeInterfaceDescriptor( } +void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor( + CodeStubInterfaceDescriptor* descriptor) { + Register registers[] = { ValueRegister(), + MapRegister(), + KeyRegister(), + ObjectRegister() }; + descriptor->Initialize(ARRAY_SIZE(registers), registers, + FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss)); +} + + void StoreGlobalStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { Register registers[] = { StoreIC::ReceiverRegister(), diff --git a/src/code-stubs.h b/src/code-stubs.h index c0ab7e9..7f62b9e 100644 --- a/src/code-stubs.h +++ b/src/code-stubs.h @@ -2455,6 +2455,24 @@ class ElementsTransitionAndStoreStub : public HydrogenCodeStub { virtual void InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; + // Parameters accessed via CodeStubGraphBuilder::GetParameter() + enum RegisterInfo { + kValueIndex, + kMapIndex, + kKeyIndex, + kObjectIndex, + kRegisterArgumentCount + }; + + static const Register ValueRegister() { + return KeyedStoreIC::ValueRegister(); + } + static const Register MapRegister() { return KeyedStoreIC::MapRegister(); } + static const Register KeyRegister() { return KeyedStoreIC::NameRegister(); } + static const Register ObjectRegister() { + return KeyedStoreIC::ReceiverRegister(); + } + private: class FromBits: public BitField {}; class ToBits: public BitField {}; diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc index 1dfd62f..0f01934 100644 --- a/src/ia32/code-stubs-ia32.cc +++ b/src/ia32/code-stubs-ia32.cc @@ -225,14 +225,6 @@ void ToBooleanStub::InitializeInterfaceDescriptor( } -void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { eax, ebx, ecx, edx }; - descriptor->Initialize(ARRAY_SIZE(registers), registers, - FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss)); -} - - void BinaryOpICStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { Register registers[] = { edx, eax }; diff --git a/src/ia32/ic-ia32.cc b/src/ia32/ic-ia32.cc index 379ed0f..a1a3995 100644 --- a/src/ia32/ic-ia32.cc +++ b/src/ia32/ic-ia32.cc @@ -1039,6 +1039,11 @@ const Register KeyedStoreIC::ValueRegister() { } +const Register KeyedStoreIC::MapRegister() { + return ebx; +} + + void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { // Return address is on the stack. LoadIC_PushArgs(masm); diff --git a/src/ia32/stub-cache-ia32.cc b/src/ia32/stub-cache-ia32.cc index 7350319..a35be80 100644 --- a/src/ia32/stub-cache-ia32.cc +++ b/src/ia32/stub-cache-ia32.cc @@ -1314,10 +1314,11 @@ Register* StoreStubCompiler::registers() { Register* KeyedStoreStubCompiler::registers() { - // receiver, name, scratch1, scratch2, scratch3. + // receiver, name, scratch1/map, scratch2, scratch3. Register receiver = KeyedStoreIC::ReceiverRegister(); Register name = KeyedStoreIC::NameRegister(); - static Register registers[] = { receiver, name, ebx, edi, no_reg }; + Register map = KeyedStoreIC::MapRegister(); + static Register registers[] = { receiver, name, map, edi, no_reg }; return registers; } @@ -1418,7 +1419,10 @@ Handle BaseLoadStoreStubCompiler::CompilePolymorphicIC( Label* smi_target = IncludesNumberType(types) ? &number_case : &miss; __ JumpIfSmi(receiver(), smi_target); + // Polymorphic keyed stores may use the map register Register map_reg = scratch1(); + ASSERT(kind() != Code::KEYED_STORE_IC || + map_reg.is(KeyedStoreIC::MapRegister())); __ mov(map_reg, FieldOperand(receiver(), HeapObject::kMapOffset)); int receiver_count = types->length(); int number_of_handled_maps = 0; diff --git a/src/ic.h b/src/ic.h index 47ffd6e..262893f 100644 --- a/src/ic.h +++ b/src/ic.h @@ -705,6 +705,11 @@ class KeyedStoreIC: public StoreIC { static const Register NameRegister(); static const Register ValueRegister(); + // The map register isn't part of the normal call specification, but + // ElementsTransitionAndStoreStub, used in polymorphic keyed store + // stub implementations requires it to be initialized. + static const Register MapRegister(); + KeyedStoreIC(FrameDepth depth, Isolate* isolate) : StoreIC(depth, isolate) { ASSERT(target()->is_keyed_store_stub()); diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc index 486917f..48668d3 100644 --- a/src/x64/code-stubs-x64.cc +++ b/src/x64/code-stubs-x64.cc @@ -222,14 +222,6 @@ void ToBooleanStub::InitializeInterfaceDescriptor( } -void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor( - CodeStubInterfaceDescriptor* descriptor) { - Register registers[] = { rax, rbx, rcx, rdx }; - descriptor->Initialize(ARRAY_SIZE(registers), registers, - FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss)); -} - - void BinaryOpICStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { Register registers[] = { rdx, rax }; diff --git a/src/x64/ic-x64.cc b/src/x64/ic-x64.cc index caa8d4c..40d5646 100644 --- a/src/x64/ic-x64.cc +++ b/src/x64/ic-x64.cc @@ -1065,6 +1065,11 @@ const Register KeyedStoreIC::ValueRegister() { } +const Register KeyedStoreIC::MapRegister() { + return rbx; +} + + void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { // The return address is on the stack. diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc index 886d9ad..508b1b3 100644 --- a/src/x64/stub-cache-x64.cc +++ b/src/x64/stub-cache-x64.cc @@ -1253,10 +1253,11 @@ Register* StoreStubCompiler::registers() { Register* KeyedStoreStubCompiler::registers() { - // receiver, name, scratch1, scratch2, scratch3. + // receiver, name, scratch1/map, scratch2, scratch3. Register receiver = KeyedStoreIC::ReceiverRegister(); Register name = KeyedStoreIC::NameRegister(); - static Register registers[] = { receiver, name, rbx, rdi, r8 }; + Register map = KeyedStoreIC::MapRegister(); + static Register registers[] = { receiver, name, map, rdi, r8 }; return registers; } @@ -1361,7 +1362,10 @@ Handle BaseLoadStoreStubCompiler::CompilePolymorphicIC( Label* smi_target = IncludesNumberType(types) ? &number_case : &miss; __ JumpIfSmi(receiver(), smi_target); + // Polymorphic keyed stores may use the map register Register map_reg = scratch1(); + ASSERT(kind() != Code::KEYED_STORE_IC || + map_reg.is(KeyedStoreIC::MapRegister())); __ movp(map_reg, FieldOperand(receiver(), HeapObject::kMapOffset)); int receiver_count = types->length(); int number_of_handled_maps = 0;