fn subMulLimbWithBorrow(a: Limb, b: Limb, c: Limb, carry: *Limb) Limb
a - b * c - *carry, sets carry to the overflow bits
a: Limb
b: Limb
c: Limb
carry: *Limb
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
fn subMulLimbWithBorrow(a: Limb, b: Limb, c: Limb, carry: *Limb) Limb { // ov1[0] = a - *carry const ov1 = @subWithOverflow(a, carry.*); // r2 = b * c const bc = @as(DoubleLimb, std.math.mulWide(Limb, b, c)); const r2 = @as(Limb, @truncate(bc)); const c2 = @as(Limb, @truncate(bc >> limb_bits)); // ov2[0] = ov1[0] - r2 const ov2 = @subWithOverflow(ov1[0], r2); carry.* = ov1[1] + c2 + ov2[1]; return ov2[0]; }
a - b * c - *carry, sets carry to the overflow bits