| ... | ... | @@ -17,7 +17,6 @@ const Endian = std.builtin.Endian; |
| 17 | 17 | const Signedness = std.builtin.Signedness; |
| 18 | 18 | const native_endian = builtin.cpu.arch.endian(); |
| 19 | 19 | |
| 20 | | const debug_safety = false; |
| 21 | 20 | |
| 22 | 21 | /// Returns the number of limbs needed to store `scalar`, which must be a |
| 23 | 22 | /// primitive integer value. |
| ... | ... | @@ -92,8 +91,6 @@ pub fn calcTwosCompLimbCount(bit_count: usize) usize { |
| 92 | 91 | |
| 93 | 92 | /// a + b * c + *carry, sets carry to the overflow bits |
| 94 | 93 | pub fn addMulLimbWithCarry(a: Limb, b: Limb, c: Limb, carry: *Limb) Limb { |
| 95 | | @setRuntimeSafety(debug_safety); |
| 96 | | |
| 97 | 94 | // ov1[0] = a + *carry |
| 98 | 95 | const ov1 = @addWithOverflow(a, carry.*); |
| 99 | 96 | |
| ... | ... | @@ -3277,7 +3274,6 @@ const AccOp = enum { |
| 3277 | 3274 | /// |
| 3278 | 3275 | /// The result is computed modulo `r.len`. When `r.len >= a.len + b.len`, no overflow occurs. |
| 3279 | 3276 | fn llmulacc(comptime op: AccOp, opt_allocator: ?Allocator, r: []Limb, a: []const Limb, b: []const Limb) void { |
| 3280 | | @setRuntimeSafety(debug_safety); |
| 3281 | 3277 | assert(r.len >= a.len); |
| 3282 | 3278 | assert(r.len >= b.len); |
| 3283 | 3279 | |
| ... | ... | @@ -3316,7 +3312,6 @@ fn llmulaccKaratsuba( |
| 3316 | 3312 | a: []const Limb, |
| 3317 | 3313 | b: []const Limb, |
| 3318 | 3314 | ) error{OutOfMemory}!void { |
| 3319 | | @setRuntimeSafety(debug_safety); |
| 3320 | 3315 | assert(r.len >= a.len); |
| 3321 | 3316 | assert(a.len >= b.len); |
| 3322 | 3317 | |
| ... | ... | @@ -3479,7 +3474,6 @@ fn llmulaccKaratsuba( |
| 3479 | 3474 | /// r = r (op) a. |
| 3480 | 3475 | /// The result is computed modulo `r.len`. |
| 3481 | 3476 | fn llaccum(comptime op: AccOp, r: []Limb, a: []const Limb) void { |
| 3482 | | @setRuntimeSafety(debug_safety); |
| 3483 | 3477 | if (op == .sub) { |
| 3484 | 3478 | _ = llsubcarry(r, r, a); |
| 3485 | 3479 | return; |
| ... | ... | @@ -3508,7 +3502,6 @@ fn llaccum(comptime op: AccOp, r: []Limb, a: []const Limb) void { |
| 3508 | 3502 | |
| 3509 | 3503 | /// Returns -1, 0, 1 if |a| < |b|, |a| == |b| or |a| > |b| respectively for limbs. |
| 3510 | 3504 | pub fn llcmp(a: []const Limb, b: []const Limb) i8 { |
| 3511 | | @setRuntimeSafety(debug_safety); |
| 3512 | 3505 | const a_len = llnormalize(a); |
| 3513 | 3506 | const b_len = llnormalize(b); |
| 3514 | 3507 | if (a_len < b_len) { |
| ... | ... | @@ -3537,7 +3530,6 @@ pub fn llcmp(a: []const Limb, b: []const Limb) i8 { |
| 3537 | 3530 | /// r = r (op) y * xi |
| 3538 | 3531 | /// The result is computed modulo `r.len`. When `r.len >= a.len + b.len`, no overflow occurs. |
| 3539 | 3532 | fn llmulaccLong(comptime op: AccOp, r: []Limb, a: []const Limb, b: []const Limb) void { |
| 3540 | | @setRuntimeSafety(debug_safety); |
| 3541 | 3533 | assert(r.len >= a.len); |
| 3542 | 3534 | assert(a.len >= b.len); |
| 3543 | 3535 | |
| ... | ... | @@ -3551,7 +3543,6 @@ fn llmulaccLong(comptime op: AccOp, r: []Limb, a: []const Limb, b: []const Limb) |
| 3551 | 3543 | /// The result is computed modulo `r.len`. |
| 3552 | 3544 | /// Returns whether the operation overflowed. |
| 3553 | 3545 | fn llmulLimb(comptime op: AccOp, acc: []Limb, y: []const Limb, xi: Limb) bool { |
| 3554 | | @setRuntimeSafety(debug_safety); |
| 3555 | 3546 | if (xi == 0) { |
| 3556 | 3547 | return false; |
| 3557 | 3548 | } |
| ... | ... | @@ -3598,7 +3589,6 @@ fn llmulLimb(comptime op: AccOp, acc: []Limb, y: []const Limb, xi: Limb) bool { |
| 3598 | 3589 | |
| 3599 | 3590 | /// returns the min length the limb could be. |
| 3600 | 3591 | fn llnormalize(a: []const Limb) usize { |
| 3601 | | @setRuntimeSafety(debug_safety); |
| 3602 | 3592 | var j = a.len; |
| 3603 | 3593 | while (j > 0) : (j -= 1) { |
| 3604 | 3594 | if (a[j - 1] != 0) { |
| ... | ... | @@ -3612,7 +3602,6 @@ fn llnormalize(a: []const Limb) usize { |
| 3612 | 3602 | |
| 3613 | 3603 | /// Knuth 4.3.1, Algorithm S. |
| 3614 | 3604 | fn llsubcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb { |
| 3615 | | @setRuntimeSafety(debug_safety); |
| 3616 | 3605 | assert(a.len != 0 and b.len != 0); |
| 3617 | 3606 | assert(a.len >= b.len); |
| 3618 | 3607 | assert(r.len >= a.len); |
| ... | ... | @@ -3638,14 +3627,12 @@ fn llsubcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb { |
| 3638 | 3627 | } |
| 3639 | 3628 | |
| 3640 | 3629 | fn llsub(r: []Limb, a: []const Limb, b: []const Limb) void { |
| 3641 | | @setRuntimeSafety(debug_safety); |
| 3642 | 3630 | assert(a.len > b.len or (a.len == b.len and a[a.len - 1] >= b[b.len - 1])); |
| 3643 | 3631 | assert(llsubcarry(r, a, b) == 0); |
| 3644 | 3632 | } |
| 3645 | 3633 | |
| 3646 | 3634 | /// Knuth 4.3.1, Algorithm A. |
| 3647 | 3635 | fn lladdcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb { |
| 3648 | | @setRuntimeSafety(debug_safety); |
| 3649 | 3636 | assert(a.len != 0 and b.len != 0); |
| 3650 | 3637 | assert(a.len >= b.len); |
| 3651 | 3638 | assert(r.len >= a.len); |
| ... | ... | @@ -3671,14 +3658,12 @@ fn lladdcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb { |
| 3671 | 3658 | } |
| 3672 | 3659 | |
| 3673 | 3660 | fn lladd(r: []Limb, a: []const Limb, b: []const Limb) void { |
| 3674 | | @setRuntimeSafety(debug_safety); |
| 3675 | 3661 | assert(r.len >= a.len + 1); |
| 3676 | 3662 | r[a.len] = lladdcarry(r, a, b); |
| 3677 | 3663 | } |
| 3678 | 3664 | |
| 3679 | 3665 | /// Knuth 4.3.1, Exercise 16. |
| 3680 | 3666 | fn lldiv1(quo: []Limb, rem: *Limb, a: []const Limb, b: Limb) void { |
| 3681 | | @setRuntimeSafety(debug_safety); |
| 3682 | 3667 | assert(a.len > 1 or a[0] >= b); |
| 3683 | 3668 | assert(quo.len >= a.len); |
| 3684 | 3669 | |
| ... | ... | @@ -3704,7 +3689,6 @@ fn lldiv1(quo: []Limb, rem: *Limb, a: []const Limb, b: Limb) void { |
| 3704 | 3689 | } |
| 3705 | 3690 | |
| 3706 | 3691 | fn lldiv0p5(quo: []Limb, rem: *Limb, a: []const Limb, b: HalfLimb) void { |
| 3707 | | @setRuntimeSafety(debug_safety); |
| 3708 | 3692 | assert(a.len > 1 or a[0] >= b); |
| 3709 | 3693 | assert(quo.len >= a.len); |
| 3710 | 3694 | |
| ... | ... | @@ -3788,7 +3772,6 @@ fn llshr(r: []Limb, a: []const Limb, shift: usize) void { |
| 3788 | 3772 | |
| 3789 | 3773 | // r = ~r |
| 3790 | 3774 | fn llnot(r: []Limb) void { |
| 3791 | | @setRuntimeSafety(debug_safety); |
| 3792 | 3775 | |
| 3793 | 3776 | for (r) |*elem| { |
| 3794 | 3777 | elem.* = ~elem.*; |
| ... | ... | @@ -3802,7 +3785,6 @@ fn llnot(r: []Limb) void { |
| 3802 | 3785 | // When b is positive, r requires at least `a.len` limbs of storage. |
| 3803 | 3786 | // When b is negative, r requires at least `b.len` limbs of storage. |
| 3804 | 3787 | fn llsignedor(r: []Limb, a: []const Limb, a_positive: bool, b: []const Limb, b_positive: bool) bool { |
| 3805 | | @setRuntimeSafety(debug_safety); |
| 3806 | 3788 | assert(r.len >= a.len); |
| 3807 | 3789 | assert(a.len >= b.len); |
| 3808 | 3790 | |
| ... | ... | @@ -3933,7 +3915,6 @@ fn llsignedor(r: []Limb, a: []const Limb, a_positive: bool, b: []const Limb, b_p |
| 3933 | 3915 | // 2. when b is negative but a is positive, r requires at least `a.len` limbs of storage, |
| 3934 | 3916 | // 3. when both a and b are negative, r requires at least `a.len + 1` limbs of storage. |
| 3935 | 3917 | fn llsignedand(r: []Limb, a: []const Limb, a_positive: bool, b: []const Limb, b_positive: bool) bool { |
| 3936 | | @setRuntimeSafety(debug_safety); |
| 3937 | 3918 | assert(a.len != 0 and b.len != 0); |
| 3938 | 3919 | assert(a.len >= b.len); |
| 3939 | 3920 | assert(r.len >= if (b_positive) b.len else if (a_positive) a.len else a.len + 1); |
| ... | ... | @@ -4043,7 +4024,6 @@ fn llsignedand(r: []Limb, a: []const Limb, a_positive: bool, b: []const Limb, b_ |
| 4043 | 4024 | // If the sign of a and b is equal, then r requires at least `@max(a.len, b.len)` limbs are required. |
| 4044 | 4025 | // Otherwise, r requires at least `@max(a.len, b.len) + 1` limbs. |
| 4045 | 4026 | fn llsignedxor(r: []Limb, a: []const Limb, a_positive: bool, b: []const Limb, b_positive: bool) bool { |
| 4046 | | @setRuntimeSafety(debug_safety); |
| 4047 | 4027 | assert(a.len != 0 and b.len != 0); |
| 4048 | 4028 | assert(r.len >= a.len); |
| 4049 | 4029 | assert(a.len >= b.len); |
| ... | ... | @@ -4102,8 +4082,6 @@ fn llsignedxor(r: []Limb, a: []const Limb, a_positive: bool, b: []const Limb, b_ |
| 4102 | 4082 | |
| 4103 | 4083 | /// r MUST NOT alias x. |
| 4104 | 4084 | fn llsquareBasecase(r: []Limb, x: []const Limb) void { |
| 4105 | | @setRuntimeSafety(debug_safety); |
| 4106 | | |
| 4107 | 4085 | const x_norm = x; |
| 4108 | 4086 | assert(r.len >= 2 * x_norm.len + 1); |
| 4109 | 4087 | |