Implement remainder
[oota-llvm.git] / lib / VMCore / ConstantFolding.h
index bd59780ef20fd7ca2288f73f6333f757c7135d4c..ef0a810b40139c4373a6c45765018b5340364f2e 100644 (file)
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LLVM_OPT_CONSTANTHANDLING_H
-#define LLVM_OPT_CONSTANTHANDLING_H
+#ifndef LLVM_CONSTANTHANDLING_H
+#define LLVM_CONSTANTHANDLING_H
 
-#include "llvm/ConstantVals.h"
+#include "llvm/Constants.h"
 #include "llvm/Instruction.h"
 #include "llvm/Type.h"
 class PointerType;
 
-namespace opt {
-
 //===----------------------------------------------------------------------===//
 //  Implement == and != directly...
 //===----------------------------------------------------------------------===//
@@ -69,12 +67,11 @@ public:
   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 *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 ConstantBool *lessthan(const Constant *V1, 
                                  const Constant *V2) const = 0;
@@ -127,7 +124,7 @@ private :
 };
 
 
-inline Constant *operator!(const Constant &V) {
+inline Constant *operator~(const Constant &V) {
   return ConstRules::get(V)->op_not(&V);
 }
 
@@ -148,6 +145,16 @@ inline Constant *operator*(const Constant &V1, const Constant &V2) {
   return ConstRules::get(V1)->mul(&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)->div(&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)->rem(&V1, &V2);
+}
+
 inline ConstantBool *operator<(const Constant &V1, 
                                const Constant &V2) {
   assert(V1.getType() == V2.getType() && "Constant types must be identical!");
@@ -187,8 +194,7 @@ inline Constant *ConstantFoldCastInstruction(const Constant *V,
 inline Constant *ConstantFoldUnaryInstruction(unsigned Opcode, 
                                               const Constant *V) {
   switch (Opcode) {
-  case Instruction::Not:  return !*V;
-    // TODO: Handle get element ptr instruction here in the future? GEP null?
+  case Instruction::Not:  return ~*V;
   }
   return 0;
 }
@@ -199,6 +205,9 @@ inline Constant *ConstantFoldBinaryInstruction(unsigned Opcode,
   switch (Opcode) {
   case Instruction::Add:     return *V1 + *V2;
   case Instruction::Sub:     return *V1 - *V2;
+  case Instruction::Mul:     return *V1 * *V2;
+  case Instruction::Div:     return *V1 / *V2;
+  case Instruction::Rem:     return *V1 % *V2;
 
   case Instruction::SetEQ:   return *V1 == *V2;
   case Instruction::SetNE:   return *V1 != *V2;
@@ -210,5 +219,4 @@ inline Constant *ConstantFoldBinaryInstruction(unsigned Opcode,
   return 0;
 }
 
-} // end namespace opt
 #endif