Reviewers: Kevin Millikin, iposva, Description: Move implementation of comparisons with constant smis to use virtual frame constant results, not literal AST nodes. Drop smi check for comparisons with non-smi constants.
Please review this at http://codereview.chromium.org/20455 SVN Base: http://v8.googlecode.com/svn/branches/experimental/toiger/ Affected files: M src/codegen-ia32.cc Index: src/codegen-ia32.cc =================================================================== --- src/codegen-ia32.cc (revision 1301) +++ src/codegen-ia32.cc (working copy) @@ -1329,20 +1329,25 @@ dest->Split(cc); } } else { // Neither side is a constant Smi, normal comparison operation. + // If either side is a non-smi constant, skip the smi check. + bool known_non_smi = + left_side.is_constant() && !left_side.handle()->IsSmi() || + right_side.is_constant() && !right_side.handle()->IsSmi(); left_side.ToRegister(); right_side.ToRegister(); ASSERT(left_side.is_valid()); ASSERT(right_side.is_valid()); - // Check for the smi case. JumpTarget is_smi(this); - Result temp = allocator_->Allocate(); - ASSERT(temp.is_valid()); - __ mov(temp.reg(), left_side.reg()); - __ or_(temp.reg(), Operand(right_side.reg())); - __ test(temp.reg(), Immediate(kSmiTagMask)); - temp.Unuse(); - is_smi.Branch(zero, &left_side, &right_side, taken); - + if (!known_non_smi) { + // Check for the smi case. + Result temp = allocator_->Allocate(); + ASSERT(temp.is_valid()); + __ mov(temp.reg(), left_side.reg()); + __ or_(temp.reg(), Operand(right_side.reg())); + __ test(temp.reg(), Immediate(kSmiTagMask)); + temp.Unuse(); + is_smi.Branch(zero, &left_side, &right_side, taken); + } // When non-smi, call out to the compare stub. "parameters" setup by // calling code in edx and eax and "result" is returned in the flags. if (!left_side.reg().is(eax)) { @@ -1366,16 +1371,19 @@ __ cmp(answer.reg(), 0); } answer.Unuse(); - dest->true_target()->Branch(cc); - dest->false_target()->Jump(); - - is_smi.Bind(&left_side, &right_side); - left_side.ToRegister(); - right_side.ToRegister(); - __ cmp(left_side.reg(), Operand(right_side.reg())); - right_side.Unuse(); - left_side.Unuse(); - dest->Split(cc); + if (known_non_smi) { + dest->Split(cc); + } else { + dest->true_target()->Branch(cc); + dest->false_target()->Jump(); + is_smi.Bind(&left_side, &right_side); + left_side.ToRegister(); + right_side.ToRegister(); + __ cmp(left_side.reg(), Operand(right_side.reg())); + right_side.Unuse(); + left_side.Unuse(); + dest->Split(cc); + } } } @@ -4742,20 +4750,9 @@ default: UNREACHABLE(); } - - // Optimize for the case where (at least) one of the expressions - // is a literal small integer. - if (IsInlineSmi(left->AsLiteral())) { - Load(right); - SmiComparison(ReverseCondition(cc), left->AsLiteral()->handle(), strict); - } else if (IsInlineSmi(right->AsLiteral())) { - Load(left); - SmiComparison(cc, right->AsLiteral()->handle(), strict); - } else { - Load(left); - Load(right); - Comparison(cc, strict, destination()); - } + Load(left); + Load(right); + Comparison(cc, strict, destination()); } --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
