Commit b7850c06 authored by sgjesse@chromium.org's avatar sgjesse@chromium.org

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
parent fb4a2d16
......@@ -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:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment