| Index: src/compiler/instruction-selector.cc
|
| diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc
|
| index a8d53774e83a92b183231ce914d949da226294dc..df27ba40b66059329d100bbd2cf696a9dabd5bf2 100644
|
| --- a/src/compiler/instruction-selector.cc
|
| +++ b/src/compiler/instruction-selector.cc
|
| @@ -532,10 +532,14 @@ void InstructionSelector::VisitNode(Node* node) {
|
| return VisitInt32Add(node);
|
| case IrOpcode::kInt32AddWithOverflow:
|
| return VisitInt32AddWithOverflow(node);
|
| + case IrOpcode::kUint32AddWithOverflow:
|
| + return VisitUint32AddWithOverflow(node);
|
| case IrOpcode::kInt32Sub:
|
| return VisitInt32Sub(node);
|
| case IrOpcode::kInt32SubWithOverflow:
|
| return VisitInt32SubWithOverflow(node);
|
| + case IrOpcode::kUint32SubWithOverflow:
|
| + return VisitUint32SubWithOverflow(node);
|
| case IrOpcode::kInt32Mul:
|
| return VisitInt32Mul(node);
|
| case IrOpcode::kInt32Div:
|
| @@ -653,26 +657,6 @@ void InstructionSelector::VisitWord64Equal(Node* node) {
|
| }
|
|
|
|
|
| -void InstructionSelector::VisitInt32AddWithOverflow(Node* node) {
|
| - if (Node* ovf = node->FindProjection(1)) {
|
| - FlagsContinuation cont(kOverflow, ovf);
|
| - return VisitInt32AddWithOverflow(node, &cont);
|
| - }
|
| - FlagsContinuation cont;
|
| - VisitInt32AddWithOverflow(node, &cont);
|
| -}
|
| -
|
| -
|
| -void InstructionSelector::VisitInt32SubWithOverflow(Node* node) {
|
| - if (Node* ovf = node->FindProjection(1)) {
|
| - FlagsContinuation cont(kOverflow, ovf);
|
| - return VisitInt32SubWithOverflow(node, &cont);
|
| - }
|
| - FlagsContinuation cont;
|
| - VisitInt32SubWithOverflow(node, &cont);
|
| -}
|
| -
|
| -
|
| void InstructionSelector::VisitInt64LessThan(Node* node) {
|
| FlagsContinuation cont(kSignedLessThan, node);
|
| VisitWord64Compare(node, &cont);
|
| @@ -795,7 +779,9 @@ void InstructionSelector::VisitProjection(Node* node) {
|
| Node* value = node->InputAt(0);
|
| switch (value->opcode()) {
|
| case IrOpcode::kInt32AddWithOverflow:
|
| + case IrOpcode::kUint32AddWithOverflow:
|
| case IrOpcode::kInt32SubWithOverflow:
|
| + case IrOpcode::kUint32SubWithOverflow:
|
| if (OpParameter<int32_t>(node) == 0) {
|
| Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(value));
|
| } else {
|
| @@ -829,116 +815,6 @@ void InstructionSelector::VisitGoto(BasicBlock* target) {
|
| }
|
|
|
|
|
| -void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch,
|
| - BasicBlock* fbranch) {
|
| - OperandGenerator g(this);
|
| - Node* user = branch;
|
| - Node* value = branch->InputAt(0);
|
| -
|
| - FlagsContinuation cont(kNotEqual, tbranch, fbranch);
|
| -
|
| - // If we can fall through to the true block, invert the branch.
|
| - if (IsNextInAssemblyOrder(tbranch)) {
|
| - cont.Negate();
|
| - cont.SwapBlocks();
|
| - }
|
| -
|
| - // Try to combine with comparisons against 0 by simply inverting the branch.
|
| - while (CanCover(user, value)) {
|
| - if (value->opcode() == IrOpcode::kWord32Equal) {
|
| - Int32BinopMatcher m(value);
|
| - if (m.right().Is(0)) {
|
| - user = value;
|
| - value = m.left().node();
|
| - cont.Negate();
|
| - } else {
|
| - break;
|
| - }
|
| - } else if (value->opcode() == IrOpcode::kWord64Equal) {
|
| - Int64BinopMatcher m(value);
|
| - if (m.right().Is(0)) {
|
| - user = value;
|
| - value = m.left().node();
|
| - cont.Negate();
|
| - } else {
|
| - break;
|
| - }
|
| - } else {
|
| - break;
|
| - }
|
| - }
|
| -
|
| - // Try to combine the branch with a comparison.
|
| - if (CanCover(user, value)) {
|
| - switch (value->opcode()) {
|
| - case IrOpcode::kWord32Equal:
|
| - cont.OverwriteAndNegateIfEqual(kEqual);
|
| - return VisitWord32Compare(value, &cont);
|
| - case IrOpcode::kInt32LessThan:
|
| - cont.OverwriteAndNegateIfEqual(kSignedLessThan);
|
| - return VisitWord32Compare(value, &cont);
|
| - case IrOpcode::kInt32LessThanOrEqual:
|
| - cont.OverwriteAndNegateIfEqual(kSignedLessThanOrEqual);
|
| - return VisitWord32Compare(value, &cont);
|
| - case IrOpcode::kUint32LessThan:
|
| - cont.OverwriteAndNegateIfEqual(kUnsignedLessThan);
|
| - return VisitWord32Compare(value, &cont);
|
| - case IrOpcode::kUint32LessThanOrEqual:
|
| - cont.OverwriteAndNegateIfEqual(kUnsignedLessThanOrEqual);
|
| - return VisitWord32Compare(value, &cont);
|
| - case IrOpcode::kWord64Equal:
|
| - cont.OverwriteAndNegateIfEqual(kEqual);
|
| - return VisitWord64Compare(value, &cont);
|
| - case IrOpcode::kInt64LessThan:
|
| - cont.OverwriteAndNegateIfEqual(kSignedLessThan);
|
| - return VisitWord64Compare(value, &cont);
|
| - case IrOpcode::kInt64LessThanOrEqual:
|
| - cont.OverwriteAndNegateIfEqual(kSignedLessThanOrEqual);
|
| - return VisitWord64Compare(value, &cont);
|
| - case IrOpcode::kFloat64Equal:
|
| - cont.OverwriteAndNegateIfEqual(kUnorderedEqual);
|
| - return VisitFloat64Compare(value, &cont);
|
| - case IrOpcode::kFloat64LessThan:
|
| - cont.OverwriteAndNegateIfEqual(kUnorderedLessThan);
|
| - return VisitFloat64Compare(value, &cont);
|
| - case IrOpcode::kFloat64LessThanOrEqual:
|
| - cont.OverwriteAndNegateIfEqual(kUnorderedLessThanOrEqual);
|
| - return VisitFloat64Compare(value, &cont);
|
| - case IrOpcode::kProjection:
|
| - // Check if this is the overflow output projection of an
|
| - // <Operation>WithOverflow node.
|
| - if (OpParameter<int32_t>(value) == 1) {
|
| - // We cannot combine the <Operation>WithOverflow with this branch
|
| - // unless the 0th projection (the use of the actual value of the
|
| - // <Operation> is either NULL, which means there's no use of the
|
| - // actual value, or was already defined, which means it is scheduled
|
| - // *AFTER* this branch).
|
| - Node* node = value->InputAt(0);
|
| - Node* result = node->FindProjection(0);
|
| - if (result == NULL || IsDefined(result)) {
|
| - switch (node->opcode()) {
|
| - case IrOpcode::kInt32AddWithOverflow:
|
| - cont.OverwriteAndNegateIfEqual(kOverflow);
|
| - return VisitInt32AddWithOverflow(node, &cont);
|
| - case IrOpcode::kInt32SubWithOverflow:
|
| - cont.OverwriteAndNegateIfEqual(kOverflow);
|
| - return VisitInt32SubWithOverflow(node, &cont);
|
| - default:
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - }
|
| -
|
| - // Branch could not be combined with a compare, emit compare against 0.
|
| - VisitWord32Test(value, &cont);
|
| -}
|
| -
|
| -
|
| void InstructionSelector::VisitReturn(Node* value) {
|
| OperandGenerator g(this);
|
| if (value != NULL) {
|
|
|