feature. See also
. The project being documented here (as the example) is the Zig library itself.
limb64.__addo_limb64
fn __addo_limb64(out_ptr: [*]u64, a_ptr: [*]const u64, b_ptr: [*]const u64, is_signed: bool, bits: u16) callconv(.c) bool
File
Code
fn __addo_limb64(out_ptr: [*]u64, a_ptr: [*]const u64, b_ptr: [*]const u64, is_signed: bool, bits: u16) callconv(.c) bool {
const limb_cnt = usedLimbCount(bits);
const out = varLimbs(out_ptr, bits);
const a = constLimbs(a_ptr, bits);
const b = constLimbs(b_ptr, bits);
var carry: u1 = 0;
var i: usize = 0;
while (i < limb_cnt - 1) : (i += 1) {
const s1 = @addWithOverflow(limbGet(a, i), limbGet(b, i));
const s2 = @addWithOverflow(s1[0], carry);
carry = s1[1] | s2[1];
limbSet(out, i, s2[0]);
}
const limb: u64 = b: {
if (!is_signed) {
const s1 = @addWithOverflow(limbGet(a, i), limbGet(b, i));
const s2 = @addWithOverflow(s1[0], carry);
carry = s1[1] | s2[1];
break :b s2[0];
} else {
const as: i64 = @bitCast(limbGet(a, i));
const bs: i64 = @bitCast(limbGet(b, i));
const s1 = @addWithOverflow(as, bs);
const s2 = @addWithOverflow(s1[0], carry);
carry = s1[1] | s2[1];
break :b @bitCast(s2[0]);
}
};
if (bits % 64 == 0) {
limbSet(out, i, limb);
fixLastLimb(out_ptr, is_signed, bits);
return carry != 0;
} else {
assert(carry == 0);
const wrapped_limb = limbWrap(limb, is_signed, bits);
limbSet(out, i, wrapped_limb);
fixLastLimb(out_ptr, is_signed, bits);
return wrapped_limb != limb;
}
}