mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-10 02:38:50 +00:00
add support for pattern matching 'neg'
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50883 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7d2cbd2d43
commit
4ca7913072
@ -236,10 +236,8 @@ public:
|
||||
|
||||
/// swapOperands - Exchange the two operands to this instruction.
|
||||
/// This instruction is safe to use on any binary instruction and
|
||||
/// does not modify the semantics of the instruction. If the
|
||||
/// instruction is order dependent (SetLT f.e.) the opcode is
|
||||
/// changed. If the instruction cannot be reversed (ie, it's a Div),
|
||||
/// then return true.
|
||||
/// does not modify the semantics of the instruction. If the instruction
|
||||
/// cannot be reversed (ie, it's a Div), then return true.
|
||||
///
|
||||
bool swapOperands();
|
||||
|
||||
|
@ -385,6 +385,35 @@ template<typename LHS>
|
||||
inline not_match<LHS> m_Not(const LHS &L) { return L; }
|
||||
|
||||
|
||||
template<typename LHS_t>
|
||||
struct neg_match {
|
||||
LHS_t L;
|
||||
|
||||
neg_match(const LHS_t &LHS) : L(LHS) {}
|
||||
|
||||
template<typename OpTy>
|
||||
bool match(OpTy *V) {
|
||||
if (Instruction *I = dyn_cast<Instruction>(V))
|
||||
if (I->getOpcode() == Instruction::Sub)
|
||||
return matchIfNeg(I->getOperand(0), I->getOperand(1));
|
||||
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
|
||||
if (CE->getOpcode() == Instruction::Sub)
|
||||
return matchIfNeg(CE->getOperand(0), CE->getOperand(1));
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(V))
|
||||
return L.match(ConstantExpr::getNeg(CI));
|
||||
return false;
|
||||
}
|
||||
private:
|
||||
bool matchIfNeg(Value *LHS, Value *RHS) {
|
||||
return LHS == ConstantExpr::getZeroValueForNegationExpr(LHS->getType()) &&
|
||||
L.match(RHS);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename LHS>
|
||||
inline neg_match<LHS> m_Neg(const LHS &L) { return L; }
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Matchers for control flow
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user