| ... | @@ -3630,6 +3630,7 @@ fn llmulaccKaratsuba( | ... | @@ -3630,6 +3630,7 @@ fn llmulaccKaratsuba( |
| 3630 | /// r = r (op) a. | 3630 | /// r = r (op) a. |
| 3631 | /// The result is computed modulo `r.len`. | 3631 | /// The result is computed modulo `r.len`. |
| 3632 | fn llaccum(comptime op: AccOp, r: []Limb, a: []const Limb) void { | 3632 | fn llaccum(comptime op: AccOp, r: []Limb, a: []const Limb) void { |
| | 3633 | assert(!slicesOverlap(r, a) or @intFromPtr(r.ptr) <= @intFromPtr(a.ptr)); |
| 3633 | if (op == .sub) { | 3634 | if (op == .sub) { |
| 3634 | _ = llsubcarry(r, r, a); | 3635 | _ = llsubcarry(r, r, a); |
| 3635 | return; | 3636 | return; |
| ... | @@ -3699,6 +3700,8 @@ fn llmulaccLong(comptime op: AccOp, r: []Limb, a: []const Limb, b: []const Limb) | ... | @@ -3699,6 +3700,8 @@ fn llmulaccLong(comptime op: AccOp, r: []Limb, a: []const Limb, b: []const Limb) |
| 3699 | /// The result is computed modulo `r.len`. | 3700 | /// The result is computed modulo `r.len`. |
| 3700 | /// Returns whether the operation overflowed. | 3701 | /// Returns whether the operation overflowed. |
| 3701 | fn llmulLimb(comptime op: AccOp, acc: []Limb, y: []const Limb, xi: Limb) bool { | 3702 | fn llmulLimb(comptime op: AccOp, acc: []Limb, y: []const Limb, xi: Limb) bool { |
| | 3703 | assert(!slicesOverlap(acc, y) or @intFromPtr(acc.ptr) <= @intFromPtr(y.ptr)); |
| | 3704 | |
| 3702 | if (xi == 0) { | 3705 | if (xi == 0) { |
| 3703 | return false; | 3706 | return false; |
| 3704 | } | 3707 | } |
| ... | @@ -3761,6 +3764,8 @@ fn llsubcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb { | ... | @@ -3761,6 +3764,8 @@ fn llsubcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb { |
| 3761 | assert(a.len != 0 and b.len != 0); | 3764 | assert(a.len != 0 and b.len != 0); |
| 3762 | assert(a.len >= b.len); | 3765 | assert(a.len >= b.len); |
| 3763 | assert(r.len >= a.len); | 3766 | assert(r.len >= a.len); |
| | 3767 | assert(!slicesOverlap(r, a) or @intFromPtr(r.ptr) <= @intFromPtr(a.ptr)); |
| | 3768 | assert(!slicesOverlap(r, b) or @intFromPtr(r.ptr) <= @intFromPtr(b.ptr)); |
| 3764 | | 3769 | |
| 3765 | var i: usize = 0; | 3770 | var i: usize = 0; |
| 3766 | var borrow: Limb = 0; | 3771 | var borrow: Limb = 0; |
| ... | @@ -3792,6 +3797,8 @@ fn lladdcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb { | ... | @@ -3792,6 +3797,8 @@ fn lladdcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb { |
| 3792 | assert(a.len != 0 and b.len != 0); | 3797 | assert(a.len != 0 and b.len != 0); |
| 3793 | assert(a.len >= b.len); | 3798 | assert(a.len >= b.len); |
| 3794 | assert(r.len >= a.len); | 3799 | assert(r.len >= a.len); |
| | 3800 | assert(!slicesOverlap(r, a) or @intFromPtr(r.ptr) <= @intFromPtr(a.ptr)); |
| | 3801 | assert(!slicesOverlap(r, b) or @intFromPtr(r.ptr) <= @intFromPtr(b.ptr)); |
| 3795 | | 3802 | |
| 3796 | var i: usize = 0; | 3803 | var i: usize = 0; |
| 3797 | var carry: Limb = 0; | 3804 | var carry: Limb = 0; |