Function addWrap [src]

r = a + b with 2s-complement wrapping semantics. Returns whether overflow occurred. r, a and b may be aliases Asserts the result fits in r. An upper bound on the number of limbs needed by r is calcTwosCompLimbCount(bit_count).

Prototype

pub fn addWrap(r: *Mutable, a: Const, b: Const, signedness: Signedness, bit_count: usize) bool

Parameters

r: *Mutablea: Constb: Constsignedness: Signednessbit_count: usize

Source

pub fn addWrap(r: *Mutable, a: Const, b: Const, signedness: Signedness, bit_count: usize) bool { const req_limbs = calcTwosCompLimbCount(bit_count); // Slice of the upper bits if they exist, these will be ignored and allows us to use addCarry to determine // if an overflow occurred. const x = Const{ .positive = a.positive, .limbs = a.limbs[0..@min(req_limbs, a.limbs.len)], }; const y = Const{ .positive = b.positive, .limbs = b.limbs[0..@min(req_limbs, b.limbs.len)], }; var carry_truncated = false; if (r.addCarry(x, y)) { // There are two possibilities here: // - We overflowed req_limbs. In this case, the carry is ignored, as it would be removed by // truncate anyway. // - a and b had less elements than req_limbs, and those were overflowed. This case needs to be handled. // Note: after this we still might need to wrap. const msl = @max(a.limbs.len, b.limbs.len); if (msl < req_limbs) { r.limbs[msl] = 1; r.len = req_limbs; @memset(r.limbs[msl + 1 .. req_limbs], 0); } else { carry_truncated = true; } } if (!r.toConst().fitsInTwosComp(signedness, bit_count)) { r.truncate(r.toConst(), signedness, bit_count); return true; } return carry_truncated; }