Index: src/compiler/arm64/instruction-selector-arm64.cc |
diff --git a/src/compiler/arm64/instruction-selector-arm64.cc b/src/compiler/arm64/instruction-selector-arm64.cc |
index 9ffaa89d02f77fedc655c9b48f9ce5a7da611e78..55d50c18f0499b8f2ee879eac960f39e547e552a 100644 |
--- a/src/compiler/arm64/instruction-selector-arm64.cc |
+++ b/src/compiler/arm64/instruction-selector-arm64.cc |
@@ -34,15 +34,9 @@ class Arm64OperandGenerator FINAL : public OperandGenerator { |
} |
bool CanBeImmediate(Node* node, ImmediateMode mode) { |
- int64_t value; |
- switch (node->opcode()) { |
- // TODO(turbofan): SMI number constants as immediates. |
- case IrOpcode::kInt32Constant: |
- value = ValueOf<int32_t>(node->op()); |
- break; |
- default: |
- return false; |
- } |
+ Int32Matcher m(node); |
+ if (!m.HasValue()) return false; |
+ int64_t value = m.Value(); |
unsigned ignored; |
switch (mode) { |
case kLogical32Imm: |
@@ -259,27 +253,25 @@ void InstructionSelector::VisitWord64Or(Node* node) { |
} |
-template <typename T> |
-static void VisitXor(InstructionSelector* selector, Node* node, |
- ArchOpcode xor_opcode, ArchOpcode not_opcode) { |
- Arm64OperandGenerator g(selector); |
- BinopMatcher<IntMatcher<T>, IntMatcher<T> > m(node); |
+void InstructionSelector::VisitWord32Xor(Node* node) { |
+ Arm64OperandGenerator g(this); |
+ Int32BinopMatcher m(node); |
if (m.right().Is(-1)) { |
- selector->Emit(not_opcode, g.DefineAsRegister(node), |
- g.UseRegister(m.left().node())); |
+ Emit(kArm64Not32, g.DefineAsRegister(node), g.UseRegister(m.left().node())); |
} else { |
- VisitBinop(selector, node, xor_opcode, kLogical32Imm); |
+ VisitBinop(this, node, kArm64Xor32, kLogical32Imm); |
} |
} |
-void InstructionSelector::VisitWord32Xor(Node* node) { |
- VisitXor<int32_t>(this, node, kArm64Xor32, kArm64Not32); |
-} |
- |
- |
void InstructionSelector::VisitWord64Xor(Node* node) { |
- VisitXor<int64_t>(this, node, kArm64Xor, kArm64Not); |
+ Arm64OperandGenerator g(this); |
+ Int64BinopMatcher m(node); |
+ if (m.right().Is(-1)) { |
+ Emit(kArm64Not, g.DefineAsRegister(node), g.UseRegister(m.left().node())); |
+ } else { |
+ VisitBinop(this, node, kArm64Xor, kLogical32Imm); |
+ } |
} |
@@ -333,27 +325,26 @@ void InstructionSelector::VisitInt64Add(Node* node) { |
} |
-template <typename T> |
-static void VisitSub(InstructionSelector* selector, Node* node, |
- ArchOpcode sub_opcode, ArchOpcode neg_opcode) { |
- Arm64OperandGenerator g(selector); |
- BinopMatcher<IntMatcher<T>, IntMatcher<T> > m(node); |
+void InstructionSelector::VisitInt32Sub(Node* node) { |
+ Arm64OperandGenerator g(this); |
+ Int32BinopMatcher m(node); |
if (m.left().Is(0)) { |
- selector->Emit(neg_opcode, g.DefineAsRegister(node), |
- g.UseRegister(m.right().node())); |
+ Emit(kArm64Neg32, g.DefineAsRegister(node), |
+ g.UseRegister(m.right().node())); |
} else { |
- VisitBinop(selector, node, sub_opcode, kArithimeticImm); |
+ VisitBinop(this, node, kArm64Sub32, kArithimeticImm); |
} |
} |
-void InstructionSelector::VisitInt32Sub(Node* node) { |
- VisitSub<int32_t>(this, node, kArm64Sub32, kArm64Neg32); |
-} |
- |
- |
void InstructionSelector::VisitInt64Sub(Node* node) { |
- VisitSub<int64_t>(this, node, kArm64Sub, kArm64Neg); |
+ Arm64OperandGenerator g(this); |
+ Int64BinopMatcher m(node); |
+ if (m.left().Is(0)) { |
+ Emit(kArm64Neg, g.DefineAsRegister(node), g.UseRegister(m.right().node())); |
+ } else { |
+ VisitBinop(this, node, kArm64Sub, kArithimeticImm); |
+ } |
} |