class PointerType;
-//===----------------------------------------------------------------------===//
-// Implement == and != directly...
-//===----------------------------------------------------------------------===//
-
-inline ConstantBool *operator==(const Constant &V1, const Constant &V2) {
- assert(V1.getType() == V2.getType() && "Constant types must be identical!");
- return ConstantBool::get(&V1 == &V2);
-}
-
-inline ConstantBool *operator!=(const Constant &V1, const Constant &V2) {
- return ConstantBool::get(&V1 != &V2);
-}
-
//===----------------------------------------------------------------------===//
// Implement all other operators indirectly through TypeRules system
//===----------------------------------------------------------------------===//
virtual ConstantBool *lessthan(const Constant *V1,
const Constant *V2) const = 0;
+ virtual ConstantBool *equalto(const Constant *V1,
+ const Constant *V2) const = 0;
// Casting operators. ick
virtual ConstantBool *castToBool (const Constant *V) const = 0;
return ConstRules::get(V1, V2).lessthan(&V1, &V2);
}
+inline ConstantBool *operator==(const Constant &V1, const Constant &V2) {
+ assert(V1.getType() == V2.getType() && "Constant types must be identical!");
+ return ConstRules::get(V1, V2).equalto(&V1, &V2);
+}
//===----------------------------------------------------------------------===//
// Implement 'derived' operators based on what we already have...
//===----------------------------------------------------------------------===//
+inline ConstantBool *operator!=(const Constant &V1, const Constant &V2) {
+ if (ConstantBool *V = (V1 == V2))
+ return V->inverted(); // !(V1 == V2)
+ return 0;
+}
+
inline ConstantBool *operator>(const Constant &V1,
const Constant &V2) {
return V2 < V1;
const Constant *V2) const {
return SubClassName::LessThan((const ArgType *)V1, (const ArgType *)V2);
}
+ virtual ConstantBool *equalto(const Constant *V1,
+ const Constant *V2) const {
+ return SubClassName::EqualTo((const ArgType *)V1, (const ArgType *)V2);
+ }
// Casting operators. ick
virtual ConstantBool *castToBool(const Constant *V) const {
static ConstantBool *LessThan(const ArgType *V1, const ArgType *V2) {
return 0;
}
+ static ConstantBool *EqualTo(const ArgType *V1, const ArgType *V2) {
+ return 0;
+ }
// Casting operators. ick
static ConstantBool *CastToBool (const Constant *V) { return 0; }
// EmptyRules provides a concrete base class of ConstRules that does nothing
//
struct EmptyRules : public TemplateRules<Constant, EmptyRules> {
+ static ConstantBool *EqualTo(const Constant *V1, const Constant *V2) {
+ if (V1 == V2) return ConstantBool::True;
+ return 0;
+ }
};
return ConstantBool::get(V1->getValue() < V2->getValue());
}
+ static ConstantBool *EqualTo(const Constant *V1, const Constant *V2) {
+ return ConstantBool::get(V1 == V2);
+ }
+
static Constant *And(const ConstantBool *V1, const ConstantBool *V2) {
return ConstantBool::get(V1->getValue() & V2->getValue());
}
//
struct NullPointerRules : public TemplateRules<ConstantPointerNull,
NullPointerRules> {
+ static ConstantBool *EqualTo(const Constant *V1, const Constant *V2) {
+ return ConstantBool::True; // Null pointers are always equal
+ }
static ConstantBool *CastToBool (const Constant *V) {
return ConstantBool::False;
}
return ConstantBool::get(R);
}
+ static ConstantBool *EqualTo(const ConstantClass *V1,
+ const ConstantClass *V2) {
+ bool R = (BuiltinType)V1->getValue() == (BuiltinType)V2->getValue();
+ return ConstantBool::get(R);
+ }
+
static Constant *CastToPointer(const ConstantClass *V,
const PointerType *PTy) {
if (V->isNullValue()) // Is it a FP or Integral null value?
class PointerType;
-//===----------------------------------------------------------------------===//
-// Implement == and != directly...
-//===----------------------------------------------------------------------===//
-
-inline ConstantBool *operator==(const Constant &V1, const Constant &V2) {
- assert(V1.getType() == V2.getType() && "Constant types must be identical!");
- return ConstantBool::get(&V1 == &V2);
-}
-
-inline ConstantBool *operator!=(const Constant &V1, const Constant &V2) {
- return ConstantBool::get(&V1 != &V2);
-}
-
//===----------------------------------------------------------------------===//
// Implement all other operators indirectly through TypeRules system
//===----------------------------------------------------------------------===//
virtual ConstantBool *lessthan(const Constant *V1,
const Constant *V2) const = 0;
+ virtual ConstantBool *equalto(const Constant *V1,
+ const Constant *V2) const = 0;
// Casting operators. ick
virtual ConstantBool *castToBool (const Constant *V) const = 0;
return ConstRules::get(V1, V2).lessthan(&V1, &V2);
}
+inline ConstantBool *operator==(const Constant &V1, const Constant &V2) {
+ assert(V1.getType() == V2.getType() && "Constant types must be identical!");
+ return ConstRules::get(V1, V2).equalto(&V1, &V2);
+}
//===----------------------------------------------------------------------===//
// Implement 'derived' operators based on what we already have...
//===----------------------------------------------------------------------===//
+inline ConstantBool *operator!=(const Constant &V1, const Constant &V2) {
+ if (ConstantBool *V = (V1 == V2))
+ return V->inverted(); // !(V1 == V2)
+ return 0;
+}
+
inline ConstantBool *operator>(const Constant &V1,
const Constant &V2) {
return V2 < V1;
class PointerType;
-//===----------------------------------------------------------------------===//
-// Implement == and != directly...
-//===----------------------------------------------------------------------===//
-
-inline ConstantBool *operator==(const Constant &V1, const Constant &V2) {
- assert(V1.getType() == V2.getType() && "Constant types must be identical!");
- return ConstantBool::get(&V1 == &V2);
-}
-
-inline ConstantBool *operator!=(const Constant &V1, const Constant &V2) {
- return ConstantBool::get(&V1 != &V2);
-}
-
//===----------------------------------------------------------------------===//
// Implement all other operators indirectly through TypeRules system
//===----------------------------------------------------------------------===//
virtual ConstantBool *lessthan(const Constant *V1,
const Constant *V2) const = 0;
+ virtual ConstantBool *equalto(const Constant *V1,
+ const Constant *V2) const = 0;
// Casting operators. ick
virtual ConstantBool *castToBool (const Constant *V) const = 0;
return ConstRules::get(V1, V2).lessthan(&V1, &V2);
}
+inline ConstantBool *operator==(const Constant &V1, const Constant &V2) {
+ assert(V1.getType() == V2.getType() && "Constant types must be identical!");
+ return ConstRules::get(V1, V2).equalto(&V1, &V2);
+}
//===----------------------------------------------------------------------===//
// Implement 'derived' operators based on what we already have...
//===----------------------------------------------------------------------===//
+inline ConstantBool *operator!=(const Constant &V1, const Constant &V2) {
+ if (ConstantBool *V = (V1 == V2))
+ return V->inverted(); // !(V1 == V2)
+ return 0;
+}
+
inline ConstantBool *operator>(const Constant &V1,
const Constant &V2) {
return V2 < V1;