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