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

Zhou Sheng zhousheng00 at gmail.com
Thu Feb 8 23:47:41 PST 2007



Changes in directory llvm/include/llvm/ADT:

APInt.h updated: 1.5 -> 1.6
---
Log message:

Eliminates friend function declaration inside APInt, instead, adds public
methods as those global function's internal implementation.


---
Diffs of the changes:  (+103 -43)

 APInt.h |  146 +++++++++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 103 insertions(+), 43 deletions(-)


Index: llvm/include/llvm/ADT/APInt.h
diff -u llvm/include/llvm/ADT/APInt.h:1.5 llvm/include/llvm/ADT/APInt.h:1.6
--- llvm/include/llvm/ADT/APInt.h:1.5	Thu Feb  8 08:30:42 2007
+++ llvm/include/llvm/ADT/APInt.h	Fri Feb  9 01:47:22 2007
@@ -24,15 +24,7 @@
 /// Forward declaration.
 class APInt;
 namespace APIntOps {
-  bool isIntN(unsigned N, const APInt& APIVal);
-  APInt ByteSwap(const APInt& APIVal);
-  APInt LogBase2(const APInt& APIVal);
-  APInt ashr(const APInt& LHS, unsigned shiftAmt);
-  APInt lshr(const APInt& LHS, unsigned shiftAmt);
-  APInt shl(const APInt& LHS, unsigned shiftAmt);
-  APInt sdiv(const APInt& LHS, const APInt& RHS);
   APInt udiv(const APInt& LHS, const APInt& RHS);
-  APInt srem(const APInt& LHS, const APInt& RHS);
   APInt urem(const APInt& LHS, const APInt& RHS);
 }
 
@@ -53,19 +45,6 @@
 /// Note: In this class, all bit/byte/word positions are zero-based.
 ///
 class APInt {
-  /// Friend Functions of APInt declared here. For detailed comments,
-  /// see bottom of this file.
-  friend bool APIntOps::isIntN(unsigned N, const APInt& APIVal);
-  friend APInt APIntOps::ByteSwap(const APInt& APIVal);
-  friend APInt APIntOps::LogBase2(const APInt& APIVal);
-  friend APInt APIntOps::ashr(const APInt& LHS, unsigned shiftAmt);
-  friend APInt APIntOps::lshr(const APInt& LHS, unsigned shiftAmt);
-  friend APInt APIntOps::shl(const APInt& LHS, unsigned shiftAmt);
-  friend APInt APIntOps::sdiv(const APInt& LHS, const APInt& RHS);
-  friend APInt APIntOps::udiv(const APInt& LHS, const APInt& RHS);
-  friend APInt APIntOps::srem(const APInt& LHS, const APInt& RHS);
-  friend APInt APIntOps::urem(const APInt& LHS, const APInt& RHS);
-
   unsigned BitsNum;      ///< The number of bits.
 
   /// This union is used to store the integer value. When the
@@ -387,19 +366,68 @@
   inline unsigned getNumBits() const
   { return BitsNum; }
 
+  /// @brief Check if this APInt has a N-bits integer value.
+  inline bool isIntN(unsigned N) const {
+    if (isSingleWord()) {
+      return VAL == VAL & (~uint64_t(0ULL) >> (64 - N));
+    } else {
+      APInt Tmp(N, pVal);
+      return Tmp == (*this);
+    }
+  }
+
+  /// @returns a byte-swapped representation of this APInt Value.
+  APInt ByteSwap() const;
+
+  /// @returns the floor log base 2 of this APInt.
+  inline unsigned LogBase2() const {
+    return getNumWords() * APINT_BITS_PER_WORD - 
+           CountLeadingZeros();
+  }
+
+  /// Arithmetic right-shift this APInt by shiftAmt.
+  /// @brief Arithmetic right-shift function.
+  APInt ashr(unsigned shiftAmt) const;
+
+  /// Logical right-shift this APInt by shiftAmt.
+  /// @brief Logical right-shift function.
+  APInt lshr(unsigned shiftAmt) const;
+
+  /// Left-shift this APInt by shiftAmt.
+  /// @brief Left-shift function.
+  APInt shl(unsigned shiftAmt) const;
+
+  /// Signed divide this APInt by APInt RHS.
+  /// @brief Signed division function for APInt.
+  inline APInt sdiv(const APInt& RHS) const {
+    bool isSignedLHS = (*this)[BitsNum - 1], isSignedRHS = RHS[RHS.BitsNum - 1];
+    APInt API = APIntOps::udiv(isSignedLHS ? -(*this) : (*this), isSignedRHS ? -RHS : RHS);
+    return isSignedLHS != isSignedRHS ? -API : API;;
+  }
+
+  /// Unsigned divide this APInt by APInt RHS.
+  /// @brief Unsigned division function for APInt.
+  APInt udiv(const APInt& RHS) const;
+
+  /// Signed remainder operation on APInt.
+  /// @brief Function for signed remainder operation.
+  inline APInt srem(const APInt& RHS) const {
+    bool isSignedLHS = (*this)[BitsNum - 1], isSignedRHS = RHS[RHS.BitsNum - 1];
+    APInt API = APIntOps::urem(isSignedLHS ? -(*this) : (*this), isSignedRHS ? -RHS : RHS);
+    return isSignedLHS ? -API : API;
+  }
+
+  /// Unsigned remainder operation on APInt.
+  /// @brief Function for unsigned remainder operation.
+  APInt urem(const APInt& RHS) const;
+
 };
 
 namespace APIntOps {
 
 /// @brief Check if the specified APInt has a N-bits integer value.
 inline bool isIntN(unsigned N, const APInt& APIVal) {
-  if (APIVal.isSingleWord()) {
-    APInt Tmp(N, APIVal.VAL);
-    return Tmp == APIVal;
-  } else {
-    APInt Tmp(N, APIVal.pVal);
-    return Tmp == APIVal;
-  }
+  return APIVal.isIntN(N);
 }
 
 /// @returns true if the argument APInt value is a sequence of ones
@@ -415,12 +443,13 @@
 }
 
 /// @returns a byte-swapped representation of the specified APInt Value.
-APInt ByteSwap(const APInt& APIVal);
+inline APInt ByteSwap(const APInt& APIVal) {
+  return APIVal.ByteSwap();
+}
 
 /// @returns the floor log base 2 of the specified APInt value.
-inline APInt LogBase2(const APInt& APIVal) {
-  return APIVal.getNumWords() * APInt::APINT_BITS_PER_WORD - 
-         APIVal.CountLeadingZeros();
+inline unsigned LogBase2(const APInt& APIVal) {
+  return APIVal.LogBase2(); 
 }
 
 /// @returns the greatest common divisor of the two values 
@@ -429,39 +458,45 @@
 
 /// Arithmetic right-shift the APInt by shiftAmt.
 /// @brief Arithmetic right-shift function.
-APInt ashr(const APInt& LHS, unsigned shiftAmt);
+inline APInt ashr(const APInt& LHS, unsigned shiftAmt) {
+  return LHS.ashr(shiftAmt);
+}
 
 /// Logical right-shift the APInt by shiftAmt.
 /// @brief Logical right-shift function.
-APInt lshr(const APInt& LHS, unsigned shiftAmt);
+inline APInt lshr(const APInt& LHS, unsigned shiftAmt) {
+  return LHS.lshr(shiftAmt);
+}
 
 /// Left-shift the APInt by shiftAmt.
 /// @brief Left-shift function.
-APInt shl(const APInt& LHS, unsigned shiftAmt);
+inline APInt shl(const APInt& LHS, unsigned shiftAmt) {
+  return LHS.shl(shiftAmt);
+}
 
 /// Signed divide APInt LHS by APInt RHS.
 /// @brief Signed division function for APInt.
 inline APInt sdiv(const APInt& LHS, const APInt& RHS) {
-  bool isSignedLHS = LHS[LHS.BitsNum - 1], isSignedRHS = RHS[RHS.BitsNum - 1];
-  APInt API = udiv(isSignedLHS ? -LHS : LHS, isSignedRHS ? -RHS : RHS);
-  return isSignedLHS != isSignedRHS ? -API : API;;
+  return LHS.sdiv(RHS);
 }
 
 /// Unsigned divide APInt LHS by APInt RHS.
 /// @brief Unsigned division function for APInt.
-APInt udiv(const APInt& LHS, const APInt& RHS);
+inline APInt udiv(const APInt& LHS, const APInt& RHS) {
+  return LHS.udiv(RHS);
+}
 
 /// Signed remainder operation on APInt.
 /// @brief Function for signed remainder operation.
 inline APInt srem(const APInt& LHS, const APInt& RHS) {
-  bool isSignedLHS = LHS[LHS.BitsNum - 1], isSignedRHS = RHS[RHS.BitsNum - 1];
-  APInt API = urem(isSignedLHS ? -LHS : LHS, isSignedRHS ? -RHS : RHS);
-  return isSignedLHS ? -API : API;
+  return LHS.srem(RHS);
 }
 
 /// Unsigned remainder operation on APInt.
 /// @brief Function for unsigned remainder operation.
-APInt urem(const APInt& LHS, const APInt& RHS);
+inline APInt urem(const APInt& LHS, const APInt& RHS) {
+  return LHS.urem(RHS);
+}
 
 /// Performs multiplication on APInt values.
 /// @brief Function for multiplication operation.
@@ -481,6 +516,31 @@
   return LHS - RHS;
 }
 
+/// Performs bitwise AND operation on APInt LHS and 
+/// APInt RHS.
+/// @brief Bitwise AND function for APInt.
+inline APInt And(const APInt& LHS, const APInt& RHS) {
+  return LHS & RHS;
+}
+
+/// Performs bitwise OR operation on APInt LHS and APInt RHS.
+/// @brief Bitwise OR function for APInt. 
+inline APInt Or(const APInt& LHS, const APInt& RHS) {
+  return LHS | RHS;
+}
+
+/// Performs bitwise XOR operation on APInt.
+/// @brief Bitwise XOR function for APInt.
+inline APInt Xor(const APInt& LHS, const APInt& RHS) {
+  return LHS ^ RHS;
+} 
+
+/// Performs a bitwise complement operation on APInt.
+/// @brief Bitwise complement function. 
+inline APInt Not(const APInt& APIVal) {
+  return ~APIVal;
+}
+
 } // End of APIntOps namespace
 
 } // End of llvm namespace






More information about the llvm-commits mailing list