[PATCH] D151420: [APInt] Add unsigned overloads of shift functions
Jay Foad via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu May 25 04:07:15 PDT 2023
foad created this revision.
Herald added subscribers: StephenFan, hiraditya.
Herald added a project: All.
foad requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Add overloads of sshl_ov, ushl_ov, sshl_sat and ushl_sat that take the
shift amount as unsigned instead of APInt. This matches what we do for
the normal shift operators and can help to avoid creating temporary
APInts in some cases.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D151420
Files:
llvm/include/llvm/ADT/APInt.h
llvm/lib/Support/APInt.cpp
Index: llvm/lib/Support/APInt.cpp
===================================================================
--- llvm/lib/Support/APInt.cpp
+++ llvm/lib/Support/APInt.cpp
@@ -1984,24 +1984,32 @@
}
APInt APInt::sshl_ov(const APInt &ShAmt, bool &Overflow) const {
- Overflow = ShAmt.uge(getBitWidth());
+ return sshl_ov(ShAmt.getLimitedValue(getBitWidth()), Overflow);
+}
+
+APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
+ Overflow = ShAmt >= getBitWidth();
if (Overflow)
return APInt(BitWidth, 0);
if (isNonNegative()) // Don't allow sign change.
- Overflow = ShAmt.uge(countl_zero());
+ Overflow = ShAmt >= countl_zero();
else
- Overflow = ShAmt.uge(countl_one());
+ Overflow = ShAmt >= countl_one();
return *this << ShAmt;
}
APInt APInt::ushl_ov(const APInt &ShAmt, bool &Overflow) const {
- Overflow = ShAmt.uge(getBitWidth());
+ return ushl_ov(ShAmt.getLimitedValue(getBitWidth()), Overflow);
+}
+
+APInt APInt::ushl_ov(unsigned ShAmt, bool &Overflow) const {
+ Overflow = ShAmt >= getBitWidth();
if (Overflow)
return APInt(BitWidth, 0);
- Overflow = ShAmt.ugt(countl_zero());
+ Overflow = ShAmt > countl_zero();
return *this << ShAmt;
}
@@ -2067,6 +2075,10 @@
}
APInt APInt::sshl_sat(const APInt &RHS) const {
+ return sshl_sat(RHS.getLimitedValue(getBitWidth()));
+}
+
+APInt APInt::sshl_sat(unsigned RHS) const {
bool Overflow;
APInt Res = sshl_ov(RHS, Overflow);
if (!Overflow)
@@ -2077,6 +2089,10 @@
}
APInt APInt::ushl_sat(const APInt &RHS) const {
+ return ushl_sat(RHS.getLimitedValue(getBitWidth()));
+}
+
+APInt APInt::ushl_sat(unsigned RHS) const {
bool Overflow;
APInt Res = ushl_ov(RHS, Overflow);
if (!Overflow)
Index: llvm/include/llvm/ADT/APInt.h
===================================================================
--- llvm/include/llvm/ADT/APInt.h
+++ llvm/include/llvm/ADT/APInt.h
@@ -1003,7 +1003,9 @@
APInt smul_ov(const APInt &RHS, bool &Overflow) const;
APInt umul_ov(const APInt &RHS, bool &Overflow) const;
APInt sshl_ov(const APInt &Amt, bool &Overflow) const;
+ APInt sshl_ov(unsigned Amt, bool &Overflow) const;
APInt ushl_ov(const APInt &Amt, bool &Overflow) const;
+ APInt ushl_ov(unsigned Amt, bool &Overflow) const;
// Operations that saturate
APInt sadd_sat(const APInt &RHS) const;
@@ -1013,7 +1015,9 @@
APInt smul_sat(const APInt &RHS) const;
APInt umul_sat(const APInt &RHS) const;
APInt sshl_sat(const APInt &RHS) const;
+ APInt sshl_sat(unsigned RHS) const;
APInt ushl_sat(const APInt &RHS) const;
+ APInt ushl_sat(unsigned RHS) const;
/// Array-indexing support.
///
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D151420.525537.patch
Type: text/x-patch
Size: 2653 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230525/c2e4e625/attachment.bin>
More information about the llvm-commits
mailing list