diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-08-15 14:15:48 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-08-15 14:15:48 +0000 |
commit | 1718337cf7e42f38b34be31c7b74e9907a276584 (patch) | |
tree | 190532240d386d48247bd20e5b0b18f57d465c9a /lib/VMCore/iOperators.cpp | |
parent | 0f63e22e843e750ab89617824183d2821563f5e7 (diff) | |
download | external_llvm-1718337cf7e42f38b34be31c7b74e9907a276584.zip external_llvm-1718337cf7e42f38b34be31c7b74e9907a276584.tar.gz external_llvm-1718337cf7e42f38b34be31c7b74e9907a276584.tar.bz2 |
Added more helper functions for binary instructions emulating
unary Neg and Not: isNeg, isNot, getNegArgument, and getNotArgument.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3341 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/iOperators.cpp')
-rw-r--r-- | lib/VMCore/iOperators.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/lib/VMCore/iOperators.cpp b/lib/VMCore/iOperators.cpp index 5b8c26a..c905329 100644 --- a/lib/VMCore/iOperators.cpp +++ b/lib/VMCore/iOperators.cpp @@ -37,6 +37,71 @@ BinaryOperator *BinaryOperator::createNot(Value *Op, const std::string &Name) { } +// isConstantZero - Helper function for several functions below +inline bool isConstantZero(const Value* V) { + return isa<Constant>(V) && dyn_cast<Constant>(V)->isNullValue(); +} + +// isConstantAllOnes - Helper function for several functions below +inline bool isConstantAllOnes(const Value* V) { + return (isa<ConstantIntegral>(V) && + dyn_cast<ConstantIntegral>(V)->isAllOnesValue()); +} + +bool BinaryOperator::isNeg(const Value *V) { + if (const BinaryOperator* Bop = dyn_cast<BinaryOperator>(V)) + return (Bop->getOpcode() == Instruction::Sub && + isConstantZero(Bop->getOperand(0))); + return false; +} + +bool BinaryOperator::isNot(const Value *V) { + if (const BinaryOperator* Bop = dyn_cast<BinaryOperator>(V)) + return (Bop->getOpcode() == Instruction::Xor && + (isConstantAllOnes(Bop->getOperand(1)) || + isConstantAllOnes(Bop->getOperand(0)))); + return false; +} + +// getNegArg -- Helper function for getNegArgument operations. +// Note: This function requires that Bop is a Neg operation. +// +inline Value* getNegArg(BinaryOperator* Bop) { + assert(BinaryOperator::isNeg(Bop)); + return Bop->getOperand(1); +} + +// getNotArg -- Helper function for getNotArgument operations. +// Note: This function requires that Bop is a Not operation. +// +inline Value* getNotArg(BinaryOperator* Bop) { + assert(Bop->getOpcode() == Instruction::Xor); + Value* notArg = Bop->getOperand(0); + Value* constArg = Bop->getOperand(1); + if (! isConstantAllOnes(constArg)) { + assert(isConstantAllOnes(notArg)); + notArg = constArg; + } + return notArg; +} + +const Value* BinaryOperator::getNegArgument(const BinaryOperator* Bop) { + return getNegArg((BinaryOperator*) Bop); +} + +Value* BinaryOperator::getNegArgument(BinaryOperator* Bop) { + return getNegArg(Bop); +} + +const Value* BinaryOperator::getNotArgument(const BinaryOperator* Bop) { + return getNotArg((BinaryOperator*) Bop); +} + +Value* BinaryOperator::getNotArgument(BinaryOperator* Bop) { + return getNotArg(Bop); +} + + // 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 |