mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-24 23:28:41 +00:00
add a few operations for signed operations that also
return an overflow flag. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116452 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -2046,6 +2046,52 @@ void APInt::udivrem(const APInt &LHS, const APInt &RHS,
|
||||
divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
|
||||
}
|
||||
|
||||
APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) {
|
||||
APInt Res = *this+RHS;
|
||||
Overflow = isNonNegative() == RHS.isNonNegative() &&
|
||||
Res.isNonNegative() != isNonNegative();
|
||||
return Res;
|
||||
}
|
||||
|
||||
APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) {
|
||||
APInt Res = *this - RHS;
|
||||
Overflow = isNonNegative() != RHS.isNonNegative() &&
|
||||
Res.isNonNegative() != isNonNegative();
|
||||
return Res;
|
||||
}
|
||||
|
||||
APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) {
|
||||
// MININT/-1 --> overflow.
|
||||
Overflow = isMinSignedValue() && RHS.isAllOnesValue();
|
||||
return sdiv(RHS);
|
||||
}
|
||||
|
||||
APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) {
|
||||
APInt Res = *this * RHS;
|
||||
|
||||
if (*this != 0 && RHS != 0)
|
||||
Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
|
||||
else
|
||||
Overflow = false;
|
||||
return Res;
|
||||
}
|
||||
|
||||
APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) {
|
||||
Overflow = ShAmt >= getBitWidth();
|
||||
if (Overflow)
|
||||
ShAmt = getBitWidth()-1;
|
||||
|
||||
if (isNonNegative()) // Don't allow sign change.
|
||||
Overflow = ShAmt >= countLeadingZeros();
|
||||
else
|
||||
Overflow = ShAmt >= countLeadingOnes();
|
||||
|
||||
return *this << ShAmt;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
|
||||
// Check our assumptions here
|
||||
assert(!str.empty() && "Invalid string length");
|
||||
|
Reference in New Issue
Block a user