From 2272aa71d9b0020925f9cd85d09467f5a356d3ce Mon Sep 17 00:00:00 2001 From: "jkummerow@chromium.org" Date: Wed, 5 Jun 2013 11:12:49 +0000 Subject: [PATCH] Add LoadIC_Slow builtin and use it for loading properties from primitive values. This fixes recent performance regressions on Dromaeo. BUG=chromium:242512 R=verwaest@chromium.org Review URL: https://codereview.chromium.org/16226024 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14950 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/ic-arm.cc | 21 +++++++++++++++------ src/builtins.cc | 5 +++++ src/builtins.h | 2 ++ src/ia32/ic-ia32.cc | 17 +++++++++++++++++ src/ic.cc | 8 +++++++- src/ic.h | 4 ++-- src/x64/ic-x64.cc | 17 +++++++++++++++++ 7 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/arm/ic-arm.cc b/src/arm/ic-arm.cc index 14c4794..35a9e01 100644 --- a/src/arm/ic-arm.cc +++ b/src/arm/ic-arm.cc @@ -646,9 +646,6 @@ void KeyedCallIC::GenerateNormal(MacroAssembler* masm, int argc) { } -// Defined in ic.cc. -Object* LoadIC_Miss(Arguments args); - void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { // ----------- S t a t e ------------- // -- r2 : name @@ -711,6 +708,21 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) { } +void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { + // ---------- S t a t e -------------- + // -- r2 : name + // -- lr : return address + // -- r0 : receiver + // -- sp[0] : receiver + // ----------------------------------- + + __ mov(r3, r0); + __ Push(r3, r2); + + __ TailCallRuntime(Runtime::kGetProperty, 2, 1); +} + + static MemOperand GenerateMappedArgumentsLookup(MacroAssembler* masm, Register object, Register key, @@ -878,9 +890,6 @@ void KeyedCallIC::GenerateNonStrictArguments(MacroAssembler* masm, } -Object* KeyedLoadIC_Miss(Arguments args); - - void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) { // ---------- S t a t e -------------- // -- lr : return address diff --git a/src/builtins.cc b/src/builtins.cc index 5b2d9af..b42fd5a 100644 --- a/src/builtins.cc +++ b/src/builtins.cc @@ -1495,6 +1495,11 @@ static void Generate_LoadIC_Getter_ForDeopt(MacroAssembler* masm) { } +static void Generate_LoadIC_Slow(MacroAssembler* masm) { + LoadIC::GenerateRuntimeGetProperty(masm); +} + + static void Generate_KeyedLoadIC_Initialize(MacroAssembler* masm) { KeyedLoadIC::GenerateInitialize(masm); } diff --git a/src/builtins.h b/src/builtins.h index 58d1a8b..c45fbfd 100644 --- a/src/builtins.h +++ b/src/builtins.h @@ -144,6 +144,8 @@ enum BuiltinExtraArguments { Code::kNoExtraICState) \ V(LoadIC_Getter_ForDeopt, LOAD_IC, MONOMORPHIC, \ Code::kNoExtraICState) \ + V(LoadIC_Slow, LOAD_IC, GENERIC, \ + Code::kNoExtraICState) \ \ V(KeyedLoadIC_Initialize, KEYED_LOAD_IC, UNINITIALIZED, \ Code::kNoExtraICState) \ diff --git a/src/ia32/ic-ia32.cc b/src/ia32/ic-ia32.cc index 5f32910..95c7c02 100644 --- a/src/ia32/ic-ia32.cc +++ b/src/ia32/ic-ia32.cc @@ -1354,6 +1354,23 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) { } +void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { + // ----------- S t a t e ------------- + // -- ecx : key + // -- edx : receiver + // -- esp[0] : return address + // ----------------------------------- + + __ pop(ebx); + __ push(edx); // receiver + __ push(ecx); // name + __ push(ebx); // return address + + // Perform tail call to the entry. + __ TailCallRuntime(Runtime::kGetProperty, 2, 1); +} + + void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) { // ----------- S t a t e ------------- // -- ecx : key diff --git a/src/ic.cc b/src/ic.cc index 148e069..ef8ab8a 100644 --- a/src/ic.cc +++ b/src/ic.cc @@ -937,7 +937,13 @@ MaybeObject* LoadIC::Load(State state, // Update inline cache and stub cache. if (FLAG_use_ic) { - UpdateCaches(&lookup, state, object, name); + if (!object->IsJSObject()) { + // TODO(jkummerow): It would be nice to support non-JSObjects in + // UpdateCaches, then we wouldn't need to go generic here. + set_target(*generic_stub()); + } else { + UpdateCaches(&lookup, state, object, name); + } } PropertyAttributes attr; diff --git a/src/ic.h b/src/ic.h index 4715f0e..dadb743 100644 --- a/src/ic.h +++ b/src/ic.h @@ -369,6 +369,7 @@ class LoadIC: public IC { static void GenerateMiss(MacroAssembler* masm); static void GenerateMegamorphic(MacroAssembler* masm); static void GenerateNormal(MacroAssembler* masm); + static void GenerateRuntimeGetProperty(MacroAssembler* masm); MUST_USE_RESULT MaybeObject* Load(State state, Handle object, @@ -378,8 +379,7 @@ class LoadIC: public IC { virtual Code::Kind kind() const { return Code::LOAD_IC; } virtual Handle generic_stub() const { - UNREACHABLE(); - return Handle::null(); + return isolate()->builtins()->LoadIC_Slow(); } virtual Handle megamorphic_stub() { diff --git a/src/x64/ic-x64.cc b/src/x64/ic-x64.cc index 6425f89..efb41c8 100644 --- a/src/x64/ic-x64.cc +++ b/src/x64/ic-x64.cc @@ -1380,6 +1380,23 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) { } +void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { + // ----------- S t a t e ------------- + // -- rax : receiver + // -- rcx : name + // -- rsp[0] : return address + // ----------------------------------- + + __ pop(rbx); + __ push(rax); // receiver + __ push(rcx); // name + __ push(rbx); // return address + + // Perform tail call to the entry. + __ TailCallRuntime(Runtime::kGetProperty, 2, 1); +} + + void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) { // ----------- S t a t e ------------- // -- rax : key -- 2.7.4