From ab301a54b3c3a9234fea3461248dbf742d9f6a64 Mon Sep 17 00:00:00 2001 From: "danno@chromium.org" Date: Mon, 7 Jan 2013 10:10:38 +0000 Subject: [PATCH] MIPS: Remove redundant loads in DoCheckMaps Hoist the loop-invariant load out of the loop and call the other CheckMap function Port r13253 (5af29105) BUG= TEST= Review URL: https://codereview.chromium.org/11784014 Patch from Akos Palfi . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13321 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/lithium-codegen-mips.cc | 26 ++++++++++++++------------ src/mips/lithium-codegen-mips.h | 2 +- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index b2cb03aaa9..0c02579db4 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -4645,32 +4645,32 @@ void LCodeGen::DoCheckFunction(LCheckFunction* instr) { } -void LCodeGen::DoCheckMapCommon(Register reg, - Register scratch, +void LCodeGen::DoCheckMapCommon(Register map_reg, Handle map, CompareMapMode mode, LEnvironment* env) { Label success; - __ CompareMapAndBranch(reg, scratch, map, &success, eq, &success, mode); + __ CompareMapAndBranch(map_reg, map, &success, eq, &success, mode); DeoptimizeIf(al, env); __ bind(&success); } void LCodeGen::DoCheckMaps(LCheckMaps* instr) { - Register scratch = scratch0(); + Register map_reg = scratch0(); LOperand* input = instr->value(); ASSERT(input->IsRegister()); Register reg = ToRegister(input); Label success; SmallMapList* map_set = instr->hydrogen()->map_set(); + __ lw(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset)); for (int i = 0; i < map_set->length() - 1; i++) { Handle map = map_set->at(i); __ CompareMapAndBranch( - reg, scratch, map, &success, eq, &success, REQUIRE_EXACT_MAP); + map_reg, map, &success, eq, &success, REQUIRE_EXACT_MAP); } Handle map = map_set->last(); - DoCheckMapCommon(reg, scratch, map, REQUIRE_EXACT_MAP, instr->environment()); + DoCheckMapCommon(map_reg, map, REQUIRE_EXACT_MAP, instr->environment()); __ bind(&success); } @@ -4727,28 +4727,30 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) { void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) { ASSERT(instr->temp()->Equals(instr->result())); - Register temp1 = ToRegister(instr->temp()); - Register temp2 = ToRegister(instr->temp2()); + Register prototype_reg = ToRegister(instr->temp()); + Register map_reg = ToRegister(instr->temp2()); Handle holder = instr->holder(); Handle current_prototype = instr->prototype(); // Load prototype object. - __ LoadHeapObject(temp1, current_prototype); + __ LoadHeapObject(prototype_reg, current_prototype); // Check prototype maps up to the holder. while (!current_prototype.is_identical_to(holder)) { - DoCheckMapCommon(temp1, temp2, + __ lw(map_reg, FieldMemOperand(prototype_reg, HeapObject::kMapOffset)); + DoCheckMapCommon(map_reg, Handle(current_prototype->map()), ALLOW_ELEMENT_TRANSITION_MAPS, instr->environment()); current_prototype = Handle(JSObject::cast(current_prototype->GetPrototype())); // Load next prototype object. - __ LoadHeapObject(temp1, current_prototype); + __ LoadHeapObject(prototype_reg, current_prototype); } // Check the holder map. - DoCheckMapCommon(temp1, temp2, + __ lw(map_reg, FieldMemOperand(prototype_reg, HeapObject::kMapOffset)); + DoCheckMapCommon(map_reg, Handle(current_prototype->map()), ALLOW_ELEMENT_TRANSITION_MAPS, instr->environment()); } diff --git a/src/mips/lithium-codegen-mips.h b/src/mips/lithium-codegen-mips.h index 7363eb8efe..118adf47aa 100644 --- a/src/mips/lithium-codegen-mips.h +++ b/src/mips/lithium-codegen-mips.h @@ -126,7 +126,7 @@ class LCodeGen BASE_EMBEDDED { void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr, Label* map_check); - void DoCheckMapCommon(Register reg, Register scratch, Handle map, + void DoCheckMapCommon(Register map_reg, Handle map, CompareMapMode mode, LEnvironment* env); // Parallel move support.