[llvm-commits] CVS: llvm/include/llvm/ADT/APSInt.h

Chris Lattner sabre at nondot.org
Wed Apr 4 22:20:28 PDT 2007



Changes in directory llvm/include/llvm/ADT:

APSInt.h added (r1.1)
---
Log message:

Add a helper class (APSInt) which can represent an APInt along with sign
information.  This is useful when a value does have a sign associated with
it.  This shouldn't be used generally in LLVM for mid-level optimizer stuff.


---
Diffs of the changes:  (+101 -0)

 APSInt.h |  101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 101 insertions(+)


Index: llvm/include/llvm/ADT/APSInt.h
diff -c /dev/null llvm/include/llvm/ADT/APSInt.h:1.1
*** /dev/null	Thu Apr  5 00:20:21 2007
--- llvm/include/llvm/ADT/APSInt.h	Thu Apr  5 00:20:11 2007
***************
*** 0 ****
--- 1,101 ----
+ //===-- llvm/Support/APSInt.h - Arbitrary Precision Signed Int -*- C++ -*--===//
+ //
+ //                     The LLVM Compiler Infrastructure
+ //
+ // This file was developed by Chris Lattner and is distributed under the
+ // University of Illinois Open Source License. See LICENSE.TXT for details.
+ //
+ //===----------------------------------------------------------------------===//
+ //
+ // This file implements the APSInt class, which is a simple class that
+ // represents an arbitrary sized integer that knows its signedness.
+ //
+ //===----------------------------------------------------------------------===//
+ 
+ #ifndef LLVM_APSINT_H
+ #define LLVM_APSINT_H
+ 
+ #include "llvm/ADT/APInt.h"
+ 
+ namespace llvm {
+   
+   
+ class APSInt : public APInt {
+   bool IsUnsigned;
+ public:
+   /// APSInt ctor - Create an APSInt with the specified width, default to
+   /// unsigned.
+   explicit APSInt(unsigned BitWidth) : APInt(BitWidth, 0), IsUnsigned(true) {}
+   APSInt(const APInt &I) : APInt(I), IsUnsigned(true) {}
+ 
+   APSInt &operator=(const APSInt &RHS) {
+     APInt::operator=(RHS); 
+     IsUnsigned = RHS.IsUnsigned;
+     return *this;
+   }
+ 
+   APSInt &operator=(const APInt &RHS) {
+     // Retain our current sign.
+     APInt::operator=(RHS); 
+     return *this;
+   }
+ 
+   APSInt &operator=(uint64_t RHS) {
+     // Retain our current sign.
+     APInt::operator=(RHS); 
+     return *this;
+   }
+ 
+   // Query sign information.
+   bool isSigned() const { return !IsUnsigned; }
+   bool isUnsigned() const { return IsUnsigned; }
+   void setIsUnsigned(bool Val) { IsUnsigned = Val; }
+   
+   
+   const APSInt &operator%=(const APSInt &RHS) {
+     assert(IsUnsigned == RHS.IsUnsigned && "Signedness mismatch!");
+     if (IsUnsigned)
+       *this = urem(RHS);
+     else
+       *this = srem(RHS);
+     return *this;
+   }
+   const APSInt &operator/=(const APSInt &RHS) {
+     assert(IsUnsigned == RHS.IsUnsigned && "Signedness mismatch!");
+     if (IsUnsigned)
+       *this = udiv(RHS);
+     else
+       *this = sdiv(RHS);
+     return *this;
+   }
+   
+   const APSInt &operator>>=(unsigned Amt) {
+     *this = *this >> Amt;
+     return *this;
+   }
+   
+   APSInt operator>>(unsigned Amt) {
+     return IsUnsigned ? lshr(Amt) : ashr(Amt);
+   }
+   
+   inline bool operator<(const APSInt& RHS) const {
+     assert(IsUnsigned == RHS.IsUnsigned && "Signedness mismatch!");
+     return IsUnsigned ? ult(RHS) : slt(RHS);
+   }
+   inline bool operator>(const APSInt& RHS) const {
+     assert(IsUnsigned == RHS.IsUnsigned && "Signedness mismatch!");
+     return IsUnsigned ? ugt(RHS) : sgt(RHS);
+   }
+   inline bool operator<=(const APSInt& RHS) const {
+     assert(IsUnsigned == RHS.IsUnsigned && "Signedness mismatch!");
+     return IsUnsigned ? ule(RHS) : sle(RHS);
+   }
+   inline bool operator>=(const APSInt& RHS) const {
+     assert(IsUnsigned == RHS.IsUnsigned && "Signedness mismatch!");
+     return IsUnsigned ? uge(RHS) : sge(RHS);
+   }
+ };
+   
+ } // end namespace llvm
+ 
+ #endif






More information about the llvm-commits mailing list