From: palfia@homejinni.com Date: Mon, 2 Dec 2013 21:15:31 +0000 (+0000) Subject: MIPS: Optimize WrapReceiver X-Git-Tag: upstream/4.7.83~11454 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f8542470765093c68d84fad6ddf57d5558a35308;p=platform%2Fupstream%2Fv8.git MIPS: Optimize WrapReceiver Port r18180 (56666385) Original commit message: Optimize register constraints and code generated for WrapReceiver Lithium instruction. BUG= R=plind44@gmail.com Review URL: https://codereview.chromium.org/100013002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18211 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index 3fb08ef..8bfce05 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -3373,12 +3373,13 @@ void LCodeGen::DoArgumentsLength(LArgumentsLength* instr) { void LCodeGen::DoWrapReceiver(LWrapReceiver* instr) { Register receiver = ToRegister(instr->receiver()); Register function = ToRegister(instr->function()); + Register result = ToRegister(instr->result()); Register scratch = scratch0(); // If the receiver is null or undefined, we have to pass the global // object as a receiver to normal functions. Values have to be // passed unchanged to builtins and strict-mode functions. - Label global_object, receiver_ok; + Label global_object, result_in_receiver; // Do not transform the receiver to object for strict mode // functions. @@ -3392,7 +3393,7 @@ void LCodeGen::DoWrapReceiver(LWrapReceiver* instr) { 1 << (SharedFunctionInfo::kStrictModeFunction + kSmiTagSize); int32_t native_mask = 1 << (SharedFunctionInfo::kNative + kSmiTagSize); __ And(scratch, scratch, Operand(strict_mode_function_mask | native_mask)); - __ Branch(&receiver_ok, ne, scratch, Operand(zero_reg)); + __ Branch(&result_in_receiver, ne, scratch, Operand(zero_reg)); // Normal function. Replace undefined or null with global receiver. __ LoadRoot(scratch, Heap::kNullValueRootIndex); @@ -3407,13 +3408,21 @@ void LCodeGen::DoWrapReceiver(LWrapReceiver* instr) { __ GetObjectType(receiver, scratch, scratch); DeoptimizeIf(lt, instr->environment(), scratch, Operand(FIRST_SPEC_OBJECT_TYPE)); - __ Branch(&receiver_ok); + __ Branch(&result_in_receiver); __ bind(&global_object); - __ lw(receiver, GlobalObjectOperand()); - __ lw(receiver, - FieldMemOperand(receiver, JSGlobalObject::kGlobalReceiverOffset)); - __ bind(&receiver_ok); + __ lw(result, GlobalObjectOperand()); + __ lw(result, + FieldMemOperand(result, JSGlobalObject::kGlobalReceiverOffset)); + if (result.is(receiver)) { + __ bind(&result_in_receiver); + } else { + Label result_ok; + __ Branch(&result_ok); + __ bind(&result_in_receiver); + __ mov(result, receiver); + __ bind(&result_ok); + } } diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc index 4b161d6..a7760d1 100644 --- a/src/mips/lithium-mips.cc +++ b/src/mips/lithium-mips.cc @@ -1087,7 +1087,7 @@ LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { LOperand* receiver = UseRegisterAtStart(instr->receiver()); LOperand* function = UseRegisterAtStart(instr->function()); LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); - return AssignEnvironment(DefineSameAsFirst(result)); + return AssignEnvironment(DefineAsRegister(result)); }