diff options
author | Sanjay Patel <spatel@rotateright.com> | 2018-11-20 16:47:59 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2018-11-20 16:47:59 +0000 |
commit | 7ef0b3138948a7f392305ace2430b728316748ed (patch) | |
tree | 67ba7fca029c2b729e21e46a98cd790b830f26dc /llvm/lib/Support/APInt.cpp | |
parent | 8ce71fb2c743d68a8356a1649fc31c5cb4994140 (diff) | |
download | llvm-7ef0b3138948a7f392305ace2430b728316748ed.zip llvm-7ef0b3138948a7f392305ace2430b728316748ed.tar.gz llvm-7ef0b3138948a7f392305ace2430b728316748ed.tar.bz2 |
[APInt] Add methods for saturated add and sub
This adds the sadd_sat, uadd_sat, ssub_sat, usub_sat methods for performing saturating additions and subtractions to APInt.
Split out from D54237.
Patch by: nikic (Nikita Popov)
Differential Revision: https://reviews.llvm.org/D54332
llvm-svn: 347324
Diffstat (limited to 'llvm/lib/Support/APInt.cpp')
-rw-r--r-- | llvm/lib/Support/APInt.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/llvm/lib/Support/APInt.cpp b/llvm/lib/Support/APInt.cpp index f2f5cca..a5f4f98 100644 --- a/llvm/lib/Support/APInt.cpp +++ b/llvm/lib/Support/APInt.cpp @@ -1947,7 +1947,43 @@ APInt APInt::ushl_ov(const APInt &ShAmt, bool &Overflow) const { return *this << ShAmt; } +APInt APInt::sadd_sat(const APInt &RHS) const { + bool Overflow; + APInt Res = sadd_ov(RHS, Overflow); + if (!Overflow) + return Res; + return isNegative() ? APInt::getSignedMinValue(BitWidth) + : APInt::getSignedMaxValue(BitWidth); +} + +APInt APInt::uadd_sat(const APInt &RHS) const { + bool Overflow; + APInt Res = uadd_ov(RHS, Overflow); + if (!Overflow) + return Res; + + return APInt::getMaxValue(BitWidth); +} + +APInt APInt::ssub_sat(const APInt &RHS) const { + bool Overflow; + APInt Res = ssub_ov(RHS, Overflow); + if (!Overflow) + return Res; + + return isNegative() ? APInt::getSignedMinValue(BitWidth) + : APInt::getSignedMaxValue(BitWidth); +} + +APInt APInt::usub_sat(const APInt &RHS) const { + bool Overflow; + APInt Res = usub_ov(RHS, Overflow); + if (!Overflow) + return Res; + + return APInt(BitWidth, 0); +} void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) { |