Author: [email protected]
Date: Thu Feb 19 04:34:34 2009
New Revision: 1314
Modified:
branches/experimental/toiger/src/codegen-ia32.cc
branches/experimental/toiger/src/codegen-ia32.h
Log:
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.
Review URL: http://codereview.chromium.org/20455
Modified: branches/experimental/toiger/src/codegen-ia32.cc
==============================================================================
--- branches/experimental/toiger/src/codegen-ia32.cc (original)
+++ branches/experimental/toiger/src/codegen-ia32.cc Thu Feb 19 04:34:34
2009
@@ -1329,20 +1329,23 @@
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,56 +1369,23 @@
__ 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);
+ }
}
}
-void CodeGenerator::SmiComparison(Condition cc,
- Handle<Object> smi_value,
- bool strict) {
- // Strict only makes sense for equality comparisons.
- ASSERT(!strict || cc == equal);
- ASSERT(is_intn(Smi::cast(*smi_value)->value(), kMaxSmiInlinedBits));
-
- JumpTarget is_smi(this);
- Result comparee = frame_->Pop();
- comparee.ToRegister();
- // Check whether the other operand is a smi.
- __ test(comparee.reg(), Immediate(kSmiTagMask));
- is_smi.Branch(zero, &comparee, taken);
-
- // Setup and call the compare stub, which expects arguments in edx
- // and eax.
- CompareStub stub(cc, strict);
- comparee.ToRegister(edx);
- Result value = allocator_->Allocate(eax);
- ASSERT(value.is_valid());
- __ Set(value.reg(), Immediate(smi_value));
- Result result = frame_->CallStub(&stub, &comparee, &value, 0);
- __ cmp(result.reg(), 0);
- result.Unuse();
- destination()->true_target()->Branch(cc);
- destination()->false_target()->Jump();
-
- is_smi.Bind(&comparee);
- comparee.ToRegister();
- // Test smi equality and comparison by signed int comparison.
- __ cmp(Operand(comparee.reg()), Immediate(smi_value));
- comparee.Unuse();
- destination()->Split(cc);
-}
-
-
class CallFunctionStub: public CodeStub {
public:
explicit CallFunctionStub(int argc) : argc_(argc) { }
@@ -4742,20 +4712,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());
}
Modified: branches/experimental/toiger/src/codegen-ia32.h
==============================================================================
--- branches/experimental/toiger/src/codegen-ia32.h (original)
+++ branches/experimental/toiger/src/codegen-ia32.h Thu Feb 19 04:34:34 2009
@@ -474,7 +474,6 @@
void LoadUnsafeSmi(Register target, Handle<Object> value);
bool IsInlineSmi(Literal* literal);
- void SmiComparison(Condition cc, Handle<Object> value, bool strict);
void SmiOperation(Token::Value op,
StaticType* type,
Handle<Object> value,
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---