From 616b23c8159a5b643253299ce2493d3a5abd2b81 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Sat, 25 Sep 2021 00:49:45 +0200 Subject: [PATCH] big ints: split lladd/llsub into carry variants lladd is now implemented in terms of lladdcarry, which returns the carry limb. Similarly, llsub is implemented using llsubcarry, which returns the borrow limb. --- lib/std/math/big/int.zig | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/std/math/big/int.zig b/lib/std/math/big/int.zig index b7ea284004..7a1aba1f2f 100644 --- a/lib/std/math/big/int.zig +++ b/lib/std/math/big/int.zig @@ -2133,10 +2133,10 @@ fn llnormalize(a: []const Limb) usize { } /// Knuth 4.3.1, Algorithm S. -fn llsub(r: []Limb, a: []const Limb, b: []const Limb) void { +fn llsubcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb { @setRuntimeSafety(debug_safety); assert(a.len != 0 and b.len != 0); - assert(a.len > b.len or (a.len == b.len and a[a.len - 1] >= b[b.len - 1])); + assert(a.len >= b.len); assert(r.len >= a.len); var i: usize = 0; @@ -2153,15 +2153,21 @@ fn llsub(r: []Limb, a: []const Limb, b: []const Limb) void { borrow = @boolToInt(@subWithOverflow(Limb, a[i], borrow, &r[i])); } - assert(borrow == 0); + return borrow; +} + +fn llsub(r: []Limb, a: []const Limb, b: []const Limb) void { + @setRuntimeSafety(debug_safety); + assert(a.len > b.len or (a.len == b.len and a[a.len - 1] >= b[b.len - 1])); + assert(llsubcarry(r, a, b) == 0); } /// Knuth 4.3.1, Algorithm A. -fn lladd(r: []Limb, a: []const Limb, b: []const Limb) void { +fn lladdcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb { @setRuntimeSafety(debug_safety); assert(a.len != 0 and b.len != 0); assert(a.len >= b.len); - assert(r.len >= a.len + 1); + assert(r.len >= a.len); var i: usize = 0; var carry: Limb = 0; @@ -2177,7 +2183,13 @@ fn lladd(r: []Limb, a: []const Limb, b: []const Limb) void { carry = @boolToInt(@addWithOverflow(Limb, a[i], carry, &r[i])); } - r[i] = carry; + return carry; +} + +fn lladd(r: []Limb, a: []const Limb, b: []const Limb) void { + @setRuntimeSafety(debug_safety); + assert(r.len >= a.len + 1); + r[a.len] = lladdcarry(r, a, b); } /// Knuth 4.3.1, Exercise 16.