MIPS: port Better codegen for '<expression> === void <literal>'.
Ported r8420 (fd2ddbb) Original commit message: Detect the pattern in both, the full compiler and crankshaft and generate direct pointer comparisons. Along the way I cleaned up 'typeof <expression> == <string literal>' comparisons as well by lifting platform independent code and checking the symmetric case. BUG=v8:1440 TEST=cctest/test-api.cc Review URL: http://codereview.chromium.org//7262026 Patch from Paul Lind <plind44@gmail.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8427 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
fb4a2d160d
commit
b7850c06d1
@ -3983,26 +3983,13 @@ void FullCodeGenerator::VisitForTypeofValue(Expression* expr) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool FullCodeGenerator::TryLiteralCompare(Token::Value op,
|
||||
Expression* left,
|
||||
Expression* right,
|
||||
Label* if_true,
|
||||
Label* if_false,
|
||||
Label* fall_through) {
|
||||
if (op != Token::EQ && op != Token::EQ_STRICT) return false;
|
||||
|
||||
// Check for the pattern: typeof <expression> == <string literal>.
|
||||
Literal* right_literal = right->AsLiteral();
|
||||
if (right_literal == NULL) return false;
|
||||
Handle<Object> right_literal_value = right_literal->handle();
|
||||
if (!right_literal_value->IsString()) return false;
|
||||
UnaryOperation* left_unary = left->AsUnaryOperation();
|
||||
if (left_unary == NULL || left_unary->op() != Token::TYPEOF) return false;
|
||||
Handle<String> check = Handle<String>::cast(right_literal_value);
|
||||
|
||||
void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr,
|
||||
Handle<String> check,
|
||||
Label* if_true,
|
||||
Label* if_false,
|
||||
Label* fall_through) {
|
||||
{ AccumulatorValueContext context(this);
|
||||
VisitForTypeofValue(left_unary->expression());
|
||||
VisitForTypeofValue(expr);
|
||||
}
|
||||
PrepareForBailoutBeforeSplit(TOS_REG, true, if_true, if_false);
|
||||
|
||||
@ -4056,8 +4043,18 @@ bool FullCodeGenerator::TryLiteralCompare(Token::Value op,
|
||||
} else {
|
||||
if (if_false != fall_through) __ jmp(if_false);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
void FullCodeGenerator::EmitLiteralCompareUndefined(Expression* expr,
|
||||
Label* if_true,
|
||||
Label* if_false,
|
||||
Label* fall_through) {
|
||||
VisitForAccumulatorValue(expr);
|
||||
PrepareForBailoutBeforeSplit(TOS_REG, true, if_true, if_false);
|
||||
|
||||
__ LoadRoot(at, Heap::kUndefinedValueRootIndex);
|
||||
Split(eq, v0, Operand(at), if_true, if_false, fall_through);
|
||||
}
|
||||
|
||||
|
||||
@ -4077,14 +4074,12 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) {
|
||||
|
||||
// First we try a fast inlined version of the compare when one of
|
||||
// the operands is a literal.
|
||||
Token::Value op = expr->op();
|
||||
Expression* left = expr->left();
|
||||
Expression* right = expr->right();
|
||||
if (TryLiteralCompare(op, left, right, if_true, if_false, fall_through)) {
|
||||
if (TryLiteralCompare(expr, if_true, if_false, fall_through)) {
|
||||
context()->Plug(if_true, if_false);
|
||||
return;
|
||||
}
|
||||
|
||||
Token::Value op = expr->op();
|
||||
VisitForStackValue(expr->left());
|
||||
switch (op) {
|
||||
case Token::IN:
|
||||
|
Loading…
Reference in New Issue
Block a user