diff options
author | Roman Lebedev <lebedev.ri@gmail.com> | 2019-11-08 17:19:45 +0300 |
---|---|---|
committer | Roman Lebedev <lebedev.ri@gmail.com> | 2019-11-08 17:52:43 +0300 |
commit | 9ca363d89c103b06b986f87c0eaf3e8a00b06947 (patch) | |
tree | c0ae13a3fa5aa40ff16443bb9cf3861e41fb3c5e /llvm/lib | |
parent | 1f592ecf82381f8689c4a4c6c863591679b2f665 (diff) | |
download | bcm5719-llvm-9ca363d89c103b06b986f87c0eaf3e8a00b06947.tar.gz bcm5719-llvm-9ca363d89c103b06b986f87c0eaf3e8a00b06947.zip |
[APInt] Add saturating truncation methods
Summary:
The signed one is needed for implementation of `ConstantRange::smul_sat()`,
unsigned is for completeness only.
Reviewers: nikic, RKSimon, spatel
Reviewed By: nikic
Subscribers: hiraditya, dexonsmith, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D69993
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Support/APInt.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/Support/APInt.cpp b/llvm/lib/Support/APInt.cpp index 431e2b70df0..9b9cd70078b 100644 --- a/llvm/lib/Support/APInt.cpp +++ b/llvm/lib/Support/APInt.cpp @@ -884,6 +884,31 @@ APInt APInt::trunc(unsigned width) const { return Result; } +// Truncate to new width with unsigned saturation. +APInt APInt::truncUSat(unsigned width) const { + assert(width < BitWidth && "Invalid APInt Truncate request"); + assert(width && "Can't truncate to 0 bits"); + + // Can we just losslessly truncate it? + if (isIntN(width)) + return trunc(width); + // If not, then just return the new limit. + return APInt::getMaxValue(width); +} + +// Truncate to new width with signed saturation. +APInt APInt::truncSSat(unsigned width) const { + assert(width < BitWidth && "Invalid APInt Truncate request"); + assert(width && "Can't truncate to 0 bits"); + + // Can we just losslessly truncate it? + if (isSignedIntN(width)) + return trunc(width); + // If not, then just return the new limits. + return isNegative() ? APInt::getSignedMinValue(width) + : APInt::getSignedMaxValue(width); +} + // Sign extend to a new width. APInt APInt::sext(unsigned Width) const { assert(Width > BitWidth && "Invalid APInt SignExtend request"); |