From ed4d3c8c668ccff823dfb8a2ed36cfac4e73e147 Mon Sep 17 00:00:00 2001 From: "palfia@homejinni.com" Date: Fri, 21 Jun 2013 20:31:06 +0000 Subject: [PATCH] MIPS: Use AST's type field and merge types for unary, binary & compare ICs. Port r15264 (d4c3767) Missing fixed_right_arg().has_value cases added also. BUG= Review URL: https://codereview.chromium.org/17552008 Patch from Balazs Kilvady . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15273 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/code-stubs-mips.cc | 4 ++-- src/mips/lithium-codegen-mips.cc | 32 ++++++++++++++++++++++++++++++-- src/mips/lithium-mips.cc | 4 ++++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc index cb59779..9c12a54 100644 --- a/src/mips/code-stubs-mips.cc +++ b/src/mips/code-stubs-mips.cc @@ -2326,7 +2326,7 @@ void BinaryOpStub_GenerateSmiCode( void BinaryOpStub::GenerateSmiStub(MacroAssembler* masm) { Label right_arg_changed, call_runtime; - if (op_ == Token::MOD && has_fixed_right_arg_) { + if (op_ == Token::MOD && encoded_right_arg_.has_value) { // It is guaranteed that the value will fit into a Smi, because if it // didn't, we wouldn't be here, see BinaryOp_Patch. __ Branch(&right_arg_changed, @@ -2541,7 +2541,7 @@ void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) { // to type transition. } else { - if (has_fixed_right_arg_) { + if (encoded_right_arg_.has_value) { __ Move(f16, fixed_right_arg_value()); __ BranchF(&transition, NULL, ne, f14, f16); } diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index d05cd28..044b9c7 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -1136,9 +1136,37 @@ void LCodeGen::DoModI(LModI* instr) { __ And(result_reg, scratch, divisor - 1); __ bind(&done); - } else { - // TODO(svenpanne) Add right->has_fixed_right_arg() case. + } else if (hmod->fixed_right_arg().has_value) { + const Register scratch = scratch0(); + const Register left_reg = ToRegister(instr->left()); + const Register result_reg = ToRegister(instr->result()); + + Register right_reg = EmitLoadRegister(instr->right(), scratch); + + int32_t divisor = hmod->fixed_right_arg().value; + ASSERT(IsPowerOf2(divisor)); + // Check if our assumption of a fixed right operand still holds. + DeoptimizeIf(ne, instr->environment(), right_reg, Operand(divisor)); + + Label left_is_not_negative, done; + if (left->CanBeNegative()) { + __ Branch(USE_DELAY_SLOT, &left_is_not_negative, + ge, left_reg, Operand(zero_reg)); + __ subu(result_reg, zero_reg, left_reg); + __ And(result_reg, result_reg, divisor - 1); + if (hmod->CheckFlag(HValue::kBailoutOnMinusZero)) { + DeoptimizeIf(eq, instr->environment(), result_reg, Operand(zero_reg)); + } + __ Branch(USE_DELAY_SLOT, &done); + __ subu(result_reg, zero_reg, result_reg); + } + + __ bind(&left_is_not_negative); + __ And(result_reg, left_reg, divisor - 1); + __ bind(&done); + + } else { const Register scratch = scratch0(); const Register left_reg = ToRegister(instr->left()); const Register result_reg = ToRegister(instr->result()); diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc index 293ecb0..c784f91 100644 --- a/src/mips/lithium-mips.cc +++ b/src/mips/lithium-mips.cc @@ -1440,6 +1440,10 @@ LInstruction* LChunkBuilder::DoMod(HMod* instr) { instr->CheckFlag(HValue::kBailoutOnMinusZero)) ? AssignEnvironment(result) : result; + } else if (instr->fixed_right_arg().has_value) { + LModI* mod = new(zone()) LModI(UseRegisterAtStart(left), + UseRegisterAtStart(right)); + return AssignEnvironment(DefineAsRegister(mod)); } else { LModI* mod = new(zone()) LModI(UseRegister(left), UseRegister(right), -- 2.7.4