| Index: src/x64/full-codegen-x64.cc
 | 
| diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc
 | 
| index adfc72a26c868726de77286845a6fce1baae672d..77c687045c908fd819c0a6a7e3968e16aa1623bb 100644
 | 
| --- a/src/x64/full-codegen-x64.cc
 | 
| +++ b/src/x64/full-codegen-x64.cc
 | 
| @@ -3907,25 +3907,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);
 | 
|  
 | 
| @@ -3976,8 +3964,18 @@ bool FullCodeGenerator::TryLiteralCompare(Token::Value op,
 | 
|    } else {
 | 
|      if (if_false != fall_through) __ jmp(if_false);
 | 
|    }
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void FullCodeGenerator::EmitLiteralCompareUndefined(Expression* expr,
 | 
| +                                                    Label* if_true,
 | 
| +                                                    Label* if_false,
 | 
| +                                                    Label* fall_through) {
 | 
| +  VisitForAccumulatorValue(expr);
 | 
| +  PrepareForBailoutBeforeSplit(TOS_REG, true, if_true, if_false);
 | 
|  
 | 
| -  return true;
 | 
| +  __ CompareRoot(rax, Heap::kUndefinedValueRootIndex);
 | 
| +  Split(equal, if_true, if_false, fall_through);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -3996,14 +3994,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:
 | 
| 
 |