From: palfia@homejinni.com Date: Wed, 22 May 2013 23:09:22 +0000 (+0000) Subject: MIPS: Handle holes in smi-untag from LoadKeyed requiring hole handling. X-Git-Tag: upstream/4.7.83~14164 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=71ab26d2916acec9fc58a9f0cbfaa78b26d843ed;p=platform%2Fupstream%2Fv8.git MIPS: Handle holes in smi-untag from LoadKeyed requiring hole handling. Port r14756 (fda1989f) BUG= Review URL: https://codereview.chromium.org/15690003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14761 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index ae0d628..49743fd 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -4610,6 +4610,22 @@ void LCodeGen::DoSmiUntag(LSmiUntag* instr) { __ And(scratch, input, Operand(kHeapObjectTag)); __ SmiUntag(result, input); DeoptimizeIf(ne, instr->environment(), scratch, Operand(zero_reg)); + } else if (instr->hydrogen()->value()->IsLoadKeyed()) { + HLoadKeyed* load = HLoadKeyed::cast(instr->hydrogen()->value()); + if (load->UsesMustHandleHole()) { + __ And(scratch, input, Operand(kHeapObjectTag)); + __ SmiUntag(result, input); + if (load->hole_mode() == ALLOW_RETURN_HOLE) { + Label done; + __ Branch(&done, eq, scratch, Operand(zero_reg)); + __ li(result, Operand(Smi::FromInt(0))); + __ bind(&done); + } else { + DeoptimizeIf(ne, instr->environment(), scratch, Operand(zero_reg)); + } + } else { + __ SmiUntag(result, input); + } } else { __ SmiUntag(result, input); } diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc index 5ca8cd9..04125d1 100644 --- a/src/mips/lithium-mips.cc +++ b/src/mips/lithium-mips.cc @@ -1773,6 +1773,13 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) { if (instr->value()->type().IsSmi()) { value = UseRegisterAtStart(instr->value()); res = DefineAsRegister(new(zone()) LSmiUntag(value, false)); + if (instr->value()->IsLoadKeyed()) { + HLoadKeyed* load_keyed = HLoadKeyed::cast(instr->value()); + if (load_keyed->UsesMustHandleHole() && + load_keyed->hole_mode() == NEVER_RETURN_HOLE) { + res = AssignEnvironment(res); + } + } } else { value = UseRegister(instr->value()); LOperand* temp1 = TempRegister(); diff --git a/src/mips/lithium-mips.h b/src/mips/lithium-mips.h index 1abea90..197254f 100644 --- a/src/mips/lithium-mips.h +++ b/src/mips/lithium-mips.h @@ -2034,6 +2034,7 @@ class LSmiUntag: public LTemplateInstruction<1, 1, 0> { LOperand* value() { return inputs_[0]; } bool needs_check() const { return needs_check_; } + DECLARE_HYDROGEN_ACCESSOR(Change); DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag") private: