| Index: src/compiler/mips64/instruction-selector-mips64.cc
 | 
| diff --git a/src/compiler/mips64/instruction-selector-mips64.cc b/src/compiler/mips64/instruction-selector-mips64.cc
 | 
| index 44a5470aca12dc22bbe189510022c4cc71719d35..6c93f939a421208c3e0d4b3b14efbd6bfc85bdf8 100644
 | 
| --- a/src/compiler/mips64/instruction-selector-mips64.cc
 | 
| +++ b/src/compiler/mips64/instruction-selector-mips64.cc
 | 
| @@ -119,8 +119,13 @@ static void VisitBinop(InstructionSelector* selector, Node* node,
 | 
|    DCHECK_GE(arraysize(inputs), input_count);
 | 
|    DCHECK_GE(arraysize(outputs), output_count);
 | 
|  
 | 
| -  selector->Emit(cont->Encode(opcode), output_count, outputs, input_count,
 | 
| -                 inputs);
 | 
| +  opcode = cont->Encode(opcode);
 | 
| +  if (cont->IsDeoptimize()) {
 | 
| +    selector->EmitDeoptimize(opcode, output_count, outputs, input_count, inputs,
 | 
| +                             cont->frame_state());
 | 
| +  } else {
 | 
| +    selector->Emit(opcode, output_count, outputs, input_count, inputs);
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -1431,6 +1436,9 @@ static void VisitCompare(InstructionSelector* selector, InstructionCode opcode,
 | 
|    if (cont->IsBranch()) {
 | 
|      selector->Emit(opcode, g.NoOutput(), left, right,
 | 
|                     g.Label(cont->true_block()), g.Label(cont->false_block()));
 | 
| +  } else if (cont->IsDeoptimize()) {
 | 
| +    selector->EmitDeoptimize(opcode, g.NoOutput(), left, right,
 | 
| +                             cont->frame_state());
 | 
|    } else {
 | 
|      DCHECK(cont->IsSet());
 | 
|      selector->Emit(opcode, g.DefineAsRegister(cont->result()), left, right);
 | 
| @@ -1542,7 +1550,6 @@ void VisitWord64Compare(InstructionSelector* selector, Node* node,
 | 
|    VisitWordCompare(selector, node, kMips64Cmp, cont, false);
 | 
|  }
 | 
|  
 | 
| -}  // namespace
 | 
|  
 | 
|  
 | 
|  void EmitWordCompareZero(InstructionSelector* selector, Node* value,
 | 
| @@ -1677,6 +1684,7 @@ void VisitWordCompareZero(InstructionSelector* selector, Node* user,
 | 
|    EmitWordCompareZero(selector, value, cont);
 | 
|  }
 | 
|  
 | 
| +}  // namespace
 | 
|  
 | 
|  void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch,
 | 
|                                        BasicBlock* fbranch) {
 | 
| @@ -1684,6 +1692,17 @@ void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch,
 | 
|    VisitWordCompareZero(this, branch, branch->InputAt(0), &cont);
 | 
|  }
 | 
|  
 | 
| +void InstructionSelector::VisitDeoptimizeIf(Node* node) {
 | 
| +  FlagsContinuation cont =
 | 
| +      FlagsContinuation::ForDeoptimize(kNotEqual, node->InputAt(1));
 | 
| +  VisitWordCompareZero(this, node, node->InputAt(0), &cont);
 | 
| +}
 | 
| +
 | 
| +void InstructionSelector::VisitDeoptimizeUnless(Node* node) {
 | 
| +  FlagsContinuation cont =
 | 
| +      FlagsContinuation::ForDeoptimize(kEqual, node->InputAt(1));
 | 
| +  VisitWordCompareZero(this, node, node->InputAt(0), &cont);
 | 
| +}
 | 
|  
 | 
|  void InstructionSelector::VisitSwitch(Node* node, const SwitchInfo& sw) {
 | 
|    Mips64OperandGenerator g(this);
 | 
| @@ -1714,7 +1733,7 @@ void InstructionSelector::VisitSwitch(Node* node, const SwitchInfo& sw) {
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitWord32Equal(Node* const node) {
 | 
| -  FlagsContinuation cont(kEqual, node);
 | 
| +  FlagsContinuation cont = FlagsContinuation::ForSet(kEqual, node);
 | 
|    Int32BinopMatcher m(node);
 | 
|    if (m.right().Is(0)) {
 | 
|      return VisitWordCompareZero(this, m.node(), m.left().node(), &cont);
 | 
| @@ -1725,32 +1744,34 @@ void InstructionSelector::VisitWord32Equal(Node* const node) {
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitInt32LessThan(Node* node) {
 | 
| -  FlagsContinuation cont(kSignedLessThan, node);
 | 
| +  FlagsContinuation cont = FlagsContinuation::ForSet(kSignedLessThan, node);
 | 
|    VisitWord32Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitInt32LessThanOrEqual(Node* node) {
 | 
| -  FlagsContinuation cont(kSignedLessThanOrEqual, node);
 | 
| +  FlagsContinuation cont =
 | 
| +      FlagsContinuation::ForSet(kSignedLessThanOrEqual, node);
 | 
|    VisitWord32Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitUint32LessThan(Node* node) {
 | 
| -  FlagsContinuation cont(kUnsignedLessThan, node);
 | 
| +  FlagsContinuation cont = FlagsContinuation::ForSet(kUnsignedLessThan, node);
 | 
|    VisitWord32Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitUint32LessThanOrEqual(Node* node) {
 | 
| -  FlagsContinuation cont(kUnsignedLessThanOrEqual, node);
 | 
| +  FlagsContinuation cont =
 | 
| +      FlagsContinuation::ForSet(kUnsignedLessThanOrEqual, node);
 | 
|    VisitWord32Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitInt32AddWithOverflow(Node* node) {
 | 
|    if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
 | 
| -    FlagsContinuation cont(kOverflow, ovf);
 | 
| +    FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
 | 
|      return VisitBinop(this, node, kMips64Dadd, &cont);
 | 
|    }
 | 
|    FlagsContinuation cont;
 | 
| @@ -1760,7 +1781,7 @@ void InstructionSelector::VisitInt32AddWithOverflow(Node* node) {
 | 
|  
 | 
|  void InstructionSelector::VisitInt32SubWithOverflow(Node* node) {
 | 
|    if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
 | 
| -    FlagsContinuation cont(kOverflow, ovf);
 | 
| +    FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
 | 
|      return VisitBinop(this, node, kMips64Dsub, &cont);
 | 
|    }
 | 
|    FlagsContinuation cont;
 | 
| @@ -1770,7 +1791,7 @@ void InstructionSelector::VisitInt32SubWithOverflow(Node* node) {
 | 
|  
 | 
|  void InstructionSelector::VisitInt64AddWithOverflow(Node* node) {
 | 
|    if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
 | 
| -    FlagsContinuation cont(kOverflow, ovf);
 | 
| +    FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
 | 
|      return VisitBinop(this, node, kMips64DaddOvf, &cont);
 | 
|    }
 | 
|    FlagsContinuation cont;
 | 
| @@ -1780,7 +1801,7 @@ void InstructionSelector::VisitInt64AddWithOverflow(Node* node) {
 | 
|  
 | 
|  void InstructionSelector::VisitInt64SubWithOverflow(Node* node) {
 | 
|    if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
 | 
| -    FlagsContinuation cont(kOverflow, ovf);
 | 
| +    FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
 | 
|      return VisitBinop(this, node, kMips64DsubOvf, &cont);
 | 
|    }
 | 
|    FlagsContinuation cont;
 | 
| @@ -1789,7 +1810,7 @@ void InstructionSelector::VisitInt64SubWithOverflow(Node* node) {
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitWord64Equal(Node* const node) {
 | 
| -  FlagsContinuation cont(kEqual, node);
 | 
| +  FlagsContinuation cont = FlagsContinuation::ForSet(kEqual, node);
 | 
|    Int64BinopMatcher m(node);
 | 
|    if (m.right().Is(0)) {
 | 
|      return VisitWordCompareZero(this, m.node(), m.left().node(), &cont);
 | 
| @@ -1800,61 +1821,65 @@ void InstructionSelector::VisitWord64Equal(Node* const node) {
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitInt64LessThan(Node* node) {
 | 
| -  FlagsContinuation cont(kSignedLessThan, node);
 | 
| +  FlagsContinuation cont = FlagsContinuation::ForSet(kSignedLessThan, node);
 | 
|    VisitWord64Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitInt64LessThanOrEqual(Node* node) {
 | 
| -  FlagsContinuation cont(kSignedLessThanOrEqual, node);
 | 
| +  FlagsContinuation cont =
 | 
| +      FlagsContinuation::ForSet(kSignedLessThanOrEqual, node);
 | 
|    VisitWord64Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitUint64LessThan(Node* node) {
 | 
| -  FlagsContinuation cont(kUnsignedLessThan, node);
 | 
| +  FlagsContinuation cont = FlagsContinuation::ForSet(kUnsignedLessThan, node);
 | 
|    VisitWord64Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitUint64LessThanOrEqual(Node* node) {
 | 
| -  FlagsContinuation cont(kUnsignedLessThanOrEqual, node);
 | 
| +  FlagsContinuation cont =
 | 
| +      FlagsContinuation::ForSet(kUnsignedLessThanOrEqual, node);
 | 
|    VisitWord64Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitFloat32Equal(Node* node) {
 | 
| -  FlagsContinuation cont(kEqual, node);
 | 
| +  FlagsContinuation cont = FlagsContinuation::ForSet(kEqual, node);
 | 
|    VisitFloat32Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitFloat32LessThan(Node* node) {
 | 
| -  FlagsContinuation cont(kUnsignedLessThan, node);
 | 
| +  FlagsContinuation cont = FlagsContinuation::ForSet(kUnsignedLessThan, node);
 | 
|    VisitFloat32Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitFloat32LessThanOrEqual(Node* node) {
 | 
| -  FlagsContinuation cont(kUnsignedLessThanOrEqual, node);
 | 
| +  FlagsContinuation cont =
 | 
| +      FlagsContinuation::ForSet(kUnsignedLessThanOrEqual, node);
 | 
|    VisitFloat32Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitFloat64Equal(Node* node) {
 | 
| -  FlagsContinuation cont(kEqual, node);
 | 
| +  FlagsContinuation cont = FlagsContinuation::ForSet(kEqual, node);
 | 
|    VisitFloat64Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitFloat64LessThan(Node* node) {
 | 
| -  FlagsContinuation cont(kUnsignedLessThan, node);
 | 
| +  FlagsContinuation cont = FlagsContinuation::ForSet(kUnsignedLessThan, node);
 | 
|    VisitFloat64Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) {
 | 
| -  FlagsContinuation cont(kUnsignedLessThanOrEqual, node);
 | 
| +  FlagsContinuation cont =
 | 
| +      FlagsContinuation::ForSet(kUnsignedLessThanOrEqual, node);
 | 
|    VisitFloat64Compare(this, node, &cont);
 | 
|  }
 | 
|  
 | 
| 
 |