From f496f9a27304f72e11f2514b99f41a99991bc66b Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 28 Mar 2017 04:00:47 +0000 Subject: [PATCH] [APInt] Move the single word cases of the bitwise operators inline. llvm-svn: 298894 --- llvm/include/llvm/ADT/APInt.h | 36 +++++++++++++++++++++++++++++++++--- llvm/lib/Support/APInt.cpp | 21 +++------------------ 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/llvm/include/llvm/ADT/APInt.h b/llvm/include/llvm/ADT/APInt.h index e527ceb..1b17a4d 100644 --- a/llvm/include/llvm/ADT/APInt.h +++ b/llvm/include/llvm/ADT/APInt.h @@ -220,6 +220,15 @@ class LLVM_NODISCARD APInt { /// out-of-line slow case for flipAllBits. void flipAllBitsSlowCase(); + /// out-of-line slow case for operator&=. + APInt& AndAssignSlowCase(const APInt& RHS); + + /// out-of-line slow case for operator|=. + APInt& OrAssignSlowCase(const APInt& RHS); + + /// out-of-line slow case for operator^=. + APInt& XorAssignSlowCase(const APInt& RHS); + public: /// \name Constructors /// @{ @@ -693,7 +702,14 @@ public: /// assigned to *this. /// /// \returns *this after ANDing with RHS. - APInt &operator&=(const APInt &RHS); + APInt &operator&=(const APInt &RHS) { + assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); + if (isSingleWord()) { + VAL &= RHS.VAL; + return *this; + } + return AndAssignSlowCase(RHS); + } /// \brief Bitwise AND assignment operator. /// @@ -716,7 +732,14 @@ public: /// assigned *this; /// /// \returns *this after ORing with RHS. - APInt &operator|=(const APInt &RHS); + APInt &operator|=(const APInt &RHS) { + assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); + if (isSingleWord()) { + VAL |= RHS.VAL; + return *this; + } + return OrAssignSlowCase(RHS); + } /// \brief Bitwise OR assignment operator. /// @@ -739,7 +762,14 @@ public: /// assigned to *this. /// /// \returns *this after XORing with RHS. - APInt &operator^=(const APInt &RHS); + APInt &operator^=(const APInt &RHS) { + assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); + if (isSingleWord()) { + VAL ^= RHS.VAL; + return *this; + } + return XorAssignSlowCase(RHS); + } /// \brief Bitwise XOR assignment operator. /// diff --git a/llvm/lib/Support/APInt.cpp b/llvm/lib/Support/APInt.cpp index f2c3a2d..d5543ca 100644 --- a/llvm/lib/Support/APInt.cpp +++ b/llvm/lib/Support/APInt.cpp @@ -406,36 +406,21 @@ APInt& APInt::operator*=(const APInt& RHS) { return *this; } -APInt& APInt::operator&=(const APInt& RHS) { - assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); - if (isSingleWord()) { - VAL &= RHS.VAL; - return *this; - } +APInt& APInt::AndAssignSlowCase(const APInt& RHS) { unsigned numWords = getNumWords(); for (unsigned i = 0; i < numWords; ++i) pVal[i] &= RHS.pVal[i]; return *this; } -APInt& APInt::operator|=(const APInt& RHS) { - assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); - if (isSingleWord()) { - VAL |= RHS.VAL; - return *this; - } +APInt& APInt::OrAssignSlowCase(const APInt& RHS) { unsigned numWords = getNumWords(); for (unsigned i = 0; i < numWords; ++i) pVal[i] |= RHS.pVal[i]; return *this; } -APInt& APInt::operator^=(const APInt& RHS) { - assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); - if (isSingleWord()) { - VAL ^= RHS.VAL; - return *this; - } +APInt& APInt::XorAssignSlowCase(const APInt& RHS) { unsigned numWords = getNumWords(); for (unsigned i = 0; i < numWords; ++i) pVal[i] ^= RHS.pVal[i]; -- 2.7.4