From 6aef61b5ffb4d1f9f721675cfd74309418d3678d Mon Sep 17 00:00:00 2001 From: "palfia@homejinni.com" Date: Fri, 24 May 2013 01:05:42 +0000 Subject: [PATCH] MIPS: Always require exact maps. Port r14768 (5dec309f) BUG= Review URL: https://codereview.chromium.org/15948003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14784 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/lithium-codegen-mips.cc | 17 +++++------------ src/mips/lithium-codegen-mips.h | 3 +-- src/mips/macro-assembler-mips.cc | 31 ++++++------------------------- src/mips/macro-assembler-mips.h | 9 +++------ src/mips/stub-cache-mips.cc | 11 +++++------ 5 files changed, 20 insertions(+), 51 deletions(-) diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index f7cb241..ae3a980 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -2763,9 +2763,7 @@ void LCodeGen::DoLoadNamedFieldPolymorphic(LLoadNamedFieldPolymorphic* instr) { bool last = (i == map_count - 1); Handle map = instr->hydrogen()->types()->at(i); Label check_passed; - __ CompareMapAndBranch( - object_map, map, &check_passed, - eq, &check_passed, ALLOW_ELEMENT_TRANSITION_MAPS); + __ CompareMapAndBranch(object_map, map, &check_passed, eq, &check_passed); if (last && !need_generic) { DeoptimizeIf(al, instr->environment()); __ bind(&check_passed); @@ -5010,10 +5008,9 @@ void LCodeGen::DoCheckFunction(LCheckFunction* instr) { void LCodeGen::DoCheckMapCommon(Register map_reg, Handle map, - CompareMapMode mode, LEnvironment* env) { Label success; - __ CompareMapAndBranch(map_reg, map, &success, eq, &success, mode); + __ CompareMapAndBranch(map_reg, map, &success, eq, &success); DeoptimizeIf(al, env); __ bind(&success); } @@ -5029,11 +5026,10 @@ void LCodeGen::DoCheckMaps(LCheckMaps* instr) { __ lw(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset)); for (int i = 0; i < map_set->length() - 1; i++) { Handle map = map_set->at(i); - __ CompareMapAndBranch( - map_reg, map, &success, eq, &success, REQUIRE_EXACT_MAP); + __ CompareMapAndBranch(map_reg, map, &success, eq, &success); } Handle map = map_set->last(); - DoCheckMapCommon(map_reg, map, REQUIRE_EXACT_MAP, instr->environment()); + DoCheckMapCommon(map_reg, map, instr->environment()); __ bind(&success); } @@ -5105,10 +5101,7 @@ void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) { for (int i = 0; i < prototypes->length(); i++) { __ LoadHeapObject(prototype_reg, prototypes->at(i)); __ lw(map_reg, FieldMemOperand(prototype_reg, HeapObject::kMapOffset)); - DoCheckMapCommon(map_reg, - maps->at(i), - ALLOW_ELEMENT_TRANSITION_MAPS, - instr->environment()); + DoCheckMapCommon(map_reg, maps->at(i), instr->environment()); } } } diff --git a/src/mips/lithium-codegen-mips.h b/src/mips/lithium-codegen-mips.h index deefd06..a575f5d 100644 --- a/src/mips/lithium-codegen-mips.h +++ b/src/mips/lithium-codegen-mips.h @@ -155,8 +155,7 @@ class LCodeGen BASE_EMBEDDED { void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr, Label* map_check); - void DoCheckMapCommon(Register map_reg, Handle map, - CompareMapMode mode, LEnvironment* env); + void DoCheckMapCommon(Register map_reg, Handle map, LEnvironment* env); // Parallel move support. void DoParallelMove(LParallelMove* move); diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc index cea4bc4..e3c8b33 100644 --- a/src/mips/macro-assembler-mips.cc +++ b/src/mips/macro-assembler-mips.cc @@ -3464,10 +3464,9 @@ void MacroAssembler::CompareMapAndBranch(Register obj, Handle map, Label* early_success, Condition cond, - Label* branch_to, - CompareMapMode mode) { + Label* branch_to) { lw(scratch, FieldMemOperand(obj, HeapObject::kMapOffset)); - CompareMapAndBranch(scratch, map, early_success, cond, branch_to, mode); + CompareMapAndBranch(scratch, map, early_success, cond, branch_to); } @@ -3475,25 +3474,8 @@ void MacroAssembler::CompareMapAndBranch(Register obj_map, Handle map, Label* early_success, Condition cond, - Label* branch_to, - CompareMapMode mode) { - Operand right = Operand(map); - if (mode == ALLOW_ELEMENT_TRANSITION_MAPS) { - ElementsKind kind = map->elements_kind(); - if (IsFastElementsKind(kind)) { - bool packed = IsFastPackedElementsKind(kind); - Map* current_map = *map; - while (CanTransitionToMoreGeneralFastElementsKind(kind, packed)) { - kind = GetNextMoreGeneralFastElementsKind(kind, packed); - current_map = current_map->LookupElementsTransitionMap(kind); - if (!current_map) break; - Branch(early_success, eq, obj_map, right); - right = Operand(Handle(current_map)); - } - } - } - - Branch(branch_to, cond, obj_map, right); + Label* branch_to) { + Branch(branch_to, cond, obj_map, Operand(map)); } @@ -3501,13 +3483,12 @@ void MacroAssembler::CheckMap(Register obj, Register scratch, Handle map, Label* fail, - SmiCheckType smi_check_type, - CompareMapMode mode) { + SmiCheckType smi_check_type) { if (smi_check_type == DO_SMI_CHECK) { JumpIfSmi(obj, fail); } Label success; - CompareMapAndBranch(obj, scratch, map, &success, ne, fail, mode); + CompareMapAndBranch(obj, scratch, map, &success, ne, fail); bind(&success); } diff --git a/src/mips/macro-assembler-mips.h b/src/mips/macro-assembler-mips.h index 6511223..3a7febe 100644 --- a/src/mips/macro-assembler-mips.h +++ b/src/mips/macro-assembler-mips.h @@ -1014,8 +1014,7 @@ class MacroAssembler: public Assembler { Handle map, Label* early_success, Condition cond, - Label* branch_to, - CompareMapMode mode = REQUIRE_EXACT_MAP); + Label* branch_to); // As above, but the map of the object is already loaded into the register // which is preserved by the code generated. @@ -1023,8 +1022,7 @@ class MacroAssembler: public Assembler { Handle map, Label* early_success, Condition cond, - Label* branch_to, - CompareMapMode mode = REQUIRE_EXACT_MAP); + Label* branch_to); // Check if the map of an object is equal to a specified map and branch to // label if not. Skip the smi check if not required (object is known to be a @@ -1034,8 +1032,7 @@ class MacroAssembler: public Assembler { Register scratch, Handle map, Label* fail, - SmiCheckType smi_check_type, - CompareMapMode mode = REQUIRE_EXACT_MAP); + SmiCheckType smi_check_type); void CheckMap(Register obj, diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc index aced0ea..d95f3be 100644 --- a/src/mips/stub-cache-mips.cc +++ b/src/mips/stub-cache-mips.cc @@ -453,7 +453,7 @@ void StubCompiler::GenerateStoreTransition(MacroAssembler* masm, // Check that the map of the object hasn't changed. __ CheckMap(receiver_reg, scratch1, Handle(object->map()), miss_label, - DO_SMI_CHECK, REQUIRE_EXACT_MAP); + DO_SMI_CHECK); // Perform global security token check if needed. if (object->IsJSGlobalProxy()) { @@ -662,7 +662,7 @@ void StubCompiler::GenerateStoreField(MacroAssembler* masm, // Check that the map of the object hasn't changed. __ CheckMap(receiver_reg, scratch1, Handle(object->map()), miss_label, - DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS); + DO_SMI_CHECK); // Perform global security token check if needed. if (object->IsJSGlobalProxy()) { @@ -1261,8 +1261,7 @@ Register StubCompiler::CheckPrototypes(Handle object, if (!current.is_identical_to(first) || check == CHECK_ALL_MAPS) { Handle current_map(current->map()); // CheckMap implicitly loads the map of |reg| into |map_reg|. - __ CheckMap(reg, map_reg, current_map, miss, DONT_DO_SMI_CHECK, - ALLOW_ELEMENT_TRANSITION_MAPS); + __ CheckMap(reg, map_reg, current_map, miss, DONT_DO_SMI_CHECK); } else { __ lw(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset)); } @@ -1298,7 +1297,7 @@ Register StubCompiler::CheckPrototypes(Handle object, if (!holder.is_identical_to(first) || check == CHECK_ALL_MAPS) { // Check the holder map. __ CheckMap(reg, scratch1, Handle(holder->map()), miss, - DONT_DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS); + DONT_DO_SMI_CHECK); } // Perform security check for access to the global object. @@ -2861,7 +2860,7 @@ Handle StoreStubCompiler::CompileStoreInterceptor( // Check that the map of the object hasn't changed. __ CheckMap(receiver(), scratch1(), Handle(object->map()), &miss, - DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS); + DO_SMI_CHECK); // Perform global security token check if needed. if (object->IsJSGlobalProxy()) { -- 2.7.4