Index: src/compiler/s390/instruction-selector-s390.cc |
diff --git a/src/compiler/s390/instruction-selector-s390.cc b/src/compiler/s390/instruction-selector-s390.cc |
index 566b9654551625e57e5325df0241335d1f3dc9b6..e70399f3e8c19162a4a04dff7d30fd602b0a9c1a 100644 |
--- a/src/compiler/s390/instruction-selector-s390.cc |
+++ b/src/compiler/s390/instruction-selector-s390.cc |
@@ -422,52 +422,6 @@ void InstructionSelector::VisitCheckedStore(Node* node) { |
g.UseOperand(length, kInt16Imm_Unsigned), g.UseRegister(value)); |
} |
-template <typename Matcher> |
-static void VisitLogical(InstructionSelector* selector, Node* node, Matcher* m, |
- ArchOpcode opcode, bool left_can_cover, |
- bool right_can_cover, ImmediateMode imm_mode) { |
- S390OperandGenerator g(selector); |
- |
- // Map instruction to equivalent operation with inverted right input. |
- ArchOpcode inv_opcode = opcode; |
- switch (opcode) { |
- case kS390_And: |
- inv_opcode = kS390_AndComplement; |
- break; |
- case kS390_Or: |
- inv_opcode = kS390_OrComplement; |
- break; |
- default: |
- UNREACHABLE(); |
- } |
- |
- // Select Logical(y, ~x) for Logical(Xor(x, -1), y). |
- if ((m->left().IsWord32Xor() || m->left().IsWord64Xor()) && left_can_cover) { |
- Matcher mleft(m->left().node()); |
- if (mleft.right().Is(-1)) { |
- selector->Emit(inv_opcode, g.DefineAsRegister(node), |
- g.UseRegister(m->right().node()), |
- g.UseRegister(mleft.left().node())); |
- return; |
- } |
- } |
- |
- // Select Logical(x, ~y) for Logical(x, Xor(y, -1)). |
- if ((m->right().IsWord32Xor() || m->right().IsWord64Xor()) && |
- right_can_cover) { |
- Matcher mright(m->right().node()); |
- if (mright.right().Is(-1)) { |
- // TODO(all): support shifted operand on right. |
- selector->Emit(inv_opcode, g.DefineAsRegister(node), |
- g.UseRegister(m->left().node()), |
- g.UseRegister(mright.left().node())); |
- return; |
- } |
- } |
- |
- VisitBinop<Matcher>(selector, node, opcode, imm_mode); |
-} |
- |
static inline bool IsContiguousMask32(uint32_t value, int* mb, int* me) { |
int mask_width = base::bits::CountPopulation32(value); |
int mask_msb = base::bits::CountLeadingZeros32(value); |
@@ -523,9 +477,7 @@ void InstructionSelector::VisitWord32And(Node* node) { |
return; |
} |
} |
- VisitLogical<Int32BinopMatcher>( |
- this, node, &m, kS390_And, CanCover(node, m.left().node()), |
- CanCover(node, m.right().node()), kInt16Imm_Unsigned); |
+ VisitBinop<Int32BinopMatcher>(this, node, kS390_And, kInt16Imm_Unsigned); |
} |
#if V8_TARGET_ARCH_S390X |
@@ -577,25 +529,19 @@ void InstructionSelector::VisitWord64And(Node* node) { |
} |
} |
} |
- VisitLogical<Int64BinopMatcher>( |
- this, node, &m, kS390_And, CanCover(node, m.left().node()), |
- CanCover(node, m.right().node()), kInt16Imm_Unsigned); |
+ VisitBinop<Int64BinopMatcher>(this, node, kS390_And, kInt16Imm_Unsigned); |
} |
#endif |
void InstructionSelector::VisitWord32Or(Node* node) { |
Int32BinopMatcher m(node); |
- VisitLogical<Int32BinopMatcher>( |
- this, node, &m, kS390_Or, CanCover(node, m.left().node()), |
- CanCover(node, m.right().node()), kInt16Imm_Unsigned); |
+ VisitBinop<Int32BinopMatcher>(this, node, kS390_Or, kInt16Imm_Unsigned); |
} |
#if V8_TARGET_ARCH_S390X |
void InstructionSelector::VisitWord64Or(Node* node) { |
Int64BinopMatcher m(node); |
- VisitLogical<Int64BinopMatcher>( |
- this, node, &m, kS390_Or, CanCover(node, m.left().node()), |
- CanCover(node, m.right().node()), kInt16Imm_Unsigned); |
+ VisitBinop<Int64BinopMatcher>(this, node, kS390_Or, kInt16Imm_Unsigned); |
} |
#endif |