X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FConstantFold.h;h=546b37e605fc1cd74550e7feb59cd6d700106f74;hb=ec4d36276f3b2916dd2430144dc228759d8b2ea2;hp=97413c59e31c547c3cfb5c831ad28d3010169d52;hpb=a803899af5646af94ebdf6b1f03525c5b91351fd;p=oota-llvm.git diff --git a/lib/VMCore/ConstantFold.h b/lib/VMCore/ConstantFold.h index 97413c59e31..546b37e605f 100644 --- a/lib/VMCore/ConstantFold.h +++ b/lib/VMCore/ConstantFold.h @@ -62,15 +62,15 @@ protected: public: static AnnotationID AID; // AnnotationID for this class - // Unary Operators... - virtual Constant *op_not(const Constant *V) const = 0; - // Binary Operators... virtual Constant *add(const Constant *V1, const Constant *V2) const = 0; virtual Constant *sub(const Constant *V1, const Constant *V2) const = 0; virtual Constant *mul(const Constant *V1, const Constant *V2) const = 0; virtual Constant *div(const Constant *V1, const Constant *V2) const = 0; virtual Constant *rem(const Constant *V1, const Constant *V2) const = 0; + virtual Constant *op_and(const Constant *V1, const Constant *V2) const = 0; + virtual Constant *op_or (const Constant *V1, const Constant *V2) const = 0; + virtual Constant *op_xor(const Constant *V1, const Constant *V2) const = 0; virtual Constant *shl(const Constant *V1, const Constant *V2) const = 0; virtual Constant *shr(const Constant *V1, const Constant *V2) const = 0; @@ -125,12 +125,7 @@ private : }; -inline Constant *operator~(const Constant &V) { - return ConstRules::get(V)->op_not(&V); -} - - - +// Standard binary operators... inline Constant *operator+(const Constant &V1, const Constant &V2) { assert(V1.getType() == V2.getType() && "Constant types must be identical!"); return ConstRules::get(V1)->add(&V1, &V2); @@ -156,13 +151,30 @@ inline Constant *operator%(const Constant &V1, const Constant &V2) { return ConstRules::get(V1)->rem(&V1, &V2); } +// Logical Operators... +inline Constant *operator&(const Constant &V1, const Constant &V2) { + assert(V1.getType() == V2.getType() && "Constant types must be identical!"); + return ConstRules::get(V1)->op_and(&V1, &V2); +} + +inline Constant *operator|(const Constant &V1, const Constant &V2) { + assert(V1.getType() == V2.getType() && "Constant types must be identical!"); + return ConstRules::get(V1)->op_or(&V1, &V2); +} + +inline Constant *operator^(const Constant &V1, const Constant &V2) { + assert(V1.getType() == V2.getType() && "Constant types must be identical!"); + return ConstRules::get(V1)->op_xor(&V1, &V2); +} + +// Shift Instructions... inline Constant *operator<<(const Constant &V1, const Constant &V2) { - assert(V1.getType()->isIntegral() && V2.getType() == Type::UByteTy); + assert(V1.getType()->isInteger() && V2.getType() == Type::UByteTy); return ConstRules::get(V1)->shl(&V1, &V2); } inline Constant *operator>>(const Constant &V1, const Constant &V2) { - assert(V1.getType()->isIntegral() && V2.getType() == Type::UByteTy); + assert(V1.getType()->isInteger() && V2.getType() == Type::UByteTy); return ConstRules::get(V1)->shr(&V1, &V2); } @@ -204,7 +216,6 @@ Constant *ConstantFoldInstruction(Instruction *I); // Constant fold various types of instruction... Constant *ConstantFoldCastInstruction(const Constant *V, const Type *DestTy); -Constant *ConstantFoldUnaryInstruction(unsigned Opcode, const Constant *V); Constant *ConstantFoldBinaryInstruction(unsigned Opcode, const Constant *V1, const Constant *V2); Constant *ConstantFoldShiftInstruction(unsigned Opcode, const Constant *V1,