Fix for div_word builds of SP C code

This commit is contained in:
Sean Parkinson
2020-01-10 09:02:26 +10:00
parent d257003341
commit 03c42423eb
2 changed files with 414 additions and 188 deletions

View File

@@ -1844,8 +1844,7 @@ static int sp_2048_div_45(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[45 - 1] += t1[45 - 2] >> 23;
t1[45 - 2] &= 0x7fffff;
d1 = t1[45 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[45 - 1] / dv;
sp_2048_mul_d_45(t2, sd, r1);
sp_2048_sub_45(t1, t1, t2);
@@ -2775,8 +2774,7 @@ static int sp_2048_div_90(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[90 - 1] += t1[90 - 2] >> 23;
t1[90 - 2] &= 0x7fffff;
d1 = t1[90 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[90 - 1] / dv;
sp_2048_mul_d_90(t2, sd, r1);
sp_2048_sub_90(t1, t1, t2);
@@ -5677,8 +5675,7 @@ static int sp_3072_div_67(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[67 - 1] += t1[67 - 2] >> 23;
t1[67 - 2] &= 0x7fffff;
d1 = t1[67 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[67 - 1] / dv;
sp_3072_mul_d_67(t2, d, r1);
(void)sp_3072_sub_67(t1, t1, t2);
@@ -6641,8 +6638,7 @@ static int sp_3072_div_134(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[134 - 1] += t1[134 - 2] >> 23;
t1[134 - 2] &= 0x7fffff;
d1 = t1[134 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[134 - 1] / dv;
sp_3072_mul_d_134(t2, sd, r1);
sp_3072_sub_134(t1, t1, t2);
@@ -9722,8 +9718,7 @@ static int sp_4096_div_98(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[98 - 1] += t1[98 - 2] >> 21;
t1[98 - 2] &= 0x1fffff;
d1 = t1[98 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[98 - 1] / dv;
sp_4096_mul_d_98(t2, sd, r1);
sp_4096_sub_98(t1, t1, t2);
@@ -10665,8 +10660,7 @@ static int sp_4096_div_196(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[196 - 1] += t1[196 - 2] >> 21;
t1[196 - 2] &= 0x1fffff;
d1 = t1[196 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[196 - 1] / dv;
sp_4096_mul_d_196(t2, sd, r1);
sp_4096_sub_196(t1, t1, t2);
@@ -16555,35 +16549,50 @@ SP_NOINLINE static void sp_256_mul_d_10(sp_digit* r, const sp_digit* a,
static WC_INLINE sp_digit sp_256_div_word_10(sp_digit d1, sp_digit d0,
sp_digit dv)
{
sp_digit d, r, t, dv;
int64_t t0, t1;
sp_digit d, r, t;
/* dv has 14 bits. */
dv = (div >> 12) + 1;
/* All 26 bits from d1 and top 5 bits from d0. */
d = (d1 << 5) | (d0 >> 21);
r = d / dv;
d -= r * dv;
/* Up to 17 bits in r */
/* Next 9 bits from d0. */
d <<= 9;
r <<= 9;
d |= (d0 >> 12) & ((1 << 9) - 1);
/* Up to 6 bits in r */
/* Next 5 bits from d0. */
r <<= 5;
d <<= 5;
d |= (d0 >> 16) & ((1 << 5) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 11 bits in r */
/* Next 5 bits from d0. */
r <<= 5;
d <<= 5;
d |= (d0 >> 11) & ((1 << 5) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 16 bits in r */
/* Next 5 bits from d0. */
r <<= 5;
d <<= 5;
d |= (d0 >> 6) & ((1 << 5) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 21 bits in r */
/* Next 5 bits from d0. */
r <<= 5;
d <<= 5;
d |= (d0 >> 1) & ((1 << 5) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 26 bits in r */
/* Handle rounding error with dv - top part */
t0 = ((int64_t)d1 << 26) + d0;
t1 = (int64_t)r * dv;
t1 = t0 - t1;
t = (sp_digit)(t1 >> 12) / dv;
r += t;
/* Handle rounding error with dv - bottom 32 bits */
t1 = (sp_digit)t0 - (r * dv);
t = (sp_digit)t1 / dv;
/* Remaining 1 bits from d0. */
r <<= 1;
d <<= 1;
d |= d0 & ((1 << 1) - 1);
t = d / dv;
r += t;
return r;
@@ -16663,8 +16672,7 @@ static int sp_256_div_10(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[10 - 1] += t1[10 - 2] >> 26;
t1[10 - 2] &= 0x3ffffff;
d1 = t1[10 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[10 - 1] / dv;
sp_256_mul_d_10(t2, d, r1);
(void)sp_256_sub_10(t1, t1, t2);

View File

@@ -1340,35 +1340,82 @@ SP_NOINLINE static int sp_2048_add_18(sp_digit* r, const sp_digit* a,
static WC_INLINE sp_digit sp_2048_div_word_18(sp_digit d1, sp_digit d0,
sp_digit dv)
{
sp_digit d, r, t, dv;
int128_t t0, t1;
sp_digit d, r, t;
/* dv has 29 bits. */
dv = (div >> 28) + 1;
/* All 57 bits from d1 and top 6 bits from d0. */
d = (d1 << 6) | (d0 >> 51);
r = d / dv;
d -= r * dv;
/* Up to 34 bits in r */
/* Next 23 bits from d0. */
d <<= 23;
r <<= 23;
d |= (d0 >> 28) & ((1 << 23) - 1);
/* Up to 7 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 45) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 57 bits in r */
/* Handle rounding error with dv - top part */
t0 = ((int128_t)d1 << 57) + d0;
t1 = (int128_t)r * dv;
t1 = t0 - t1;
t = (sp_digit)(t1 >> 28) / dv;
/* Up to 13 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 39) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Handle rounding error with dv - bottom 64 bits */
t1 = (sp_digit)t0 - (r * dv);
t = (sp_digit)t1 / dv;
/* Up to 19 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 33) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 25 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 27) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 31 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 21) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 37 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 15) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 43 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 9) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 49 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 3) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 55 bits in r */
/* Remaining 3 bits from d0. */
r <<= 3;
d <<= 3;
d |= d0 & ((1 << 3) - 1);
t = d / dv;
r += t;
return r;
@@ -1448,8 +1495,7 @@ static int sp_2048_div_18(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[18 - 1] += t1[18 - 2] >> 57;
t1[18 - 2] &= 0x1ffffffffffffffL;
d1 = t1[18 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[18 - 1] / dv;
sp_2048_mul_d_18(t2, d, r1);
(void)sp_2048_sub_18(t1, t1, t2);
@@ -2216,35 +2262,82 @@ SP_NOINLINE static int sp_2048_add_36(sp_digit* r, const sp_digit* a,
static WC_INLINE sp_digit sp_2048_div_word_36(sp_digit d1, sp_digit d0,
sp_digit dv)
{
sp_digit d, r, t, dv;
int128_t t0, t1;
sp_digit d, r, t;
/* dv has 29 bits. */
dv = (div >> 28) + 1;
/* All 57 bits from d1 and top 6 bits from d0. */
d = (d1 << 6) | (d0 >> 51);
r = d / dv;
d -= r * dv;
/* Up to 34 bits in r */
/* Next 23 bits from d0. */
d <<= 23;
r <<= 23;
d |= (d0 >> 28) & ((1 << 23) - 1);
/* Up to 7 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 45) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 57 bits in r */
/* Handle rounding error with dv - top part */
t0 = ((int128_t)d1 << 57) + d0;
t1 = (int128_t)r * dv;
t1 = t0 - t1;
t = (sp_digit)(t1 >> 28) / dv;
/* Up to 13 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 39) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Handle rounding error with dv - bottom 64 bits */
t1 = (sp_digit)t0 - (r * dv);
t = (sp_digit)t1 / dv;
/* Up to 19 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 33) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 25 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 27) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 31 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 21) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 37 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 15) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 43 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 9) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 49 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 3) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 55 bits in r */
/* Remaining 3 bits from d0. */
r <<= 3;
d <<= 3;
d |= d0 & ((1 << 3) - 1);
t = d / dv;
r += t;
return r;
@@ -2324,8 +2417,7 @@ static int sp_2048_div_36(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[36 - 1] += t1[36 - 2] >> 57;
t1[36 - 2] &= 0x1ffffffffffffffL;
d1 = t1[36 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[36 - 1] / dv;
sp_2048_mul_d_36(t2, d, r1);
(void)sp_2048_sub_36(t1, t1, t2);
@@ -5413,35 +5505,82 @@ static void sp_3072_cond_add_27(sp_digit* r, const sp_digit* a,
static WC_INLINE sp_digit sp_3072_div_word_27(sp_digit d1, sp_digit d0,
sp_digit dv)
{
sp_digit d, r, t, dv;
int128_t t0, t1;
sp_digit d, r, t;
/* dv has 29 bits. */
dv = (div >> 28) + 1;
/* All 57 bits from d1 and top 6 bits from d0. */
d = (d1 << 6) | (d0 >> 51);
r = d / dv;
d -= r * dv;
/* Up to 34 bits in r */
/* Next 23 bits from d0. */
d <<= 23;
r <<= 23;
d |= (d0 >> 28) & ((1 << 23) - 1);
/* Up to 7 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 45) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 57 bits in r */
/* Handle rounding error with dv - top part */
t0 = ((int128_t)d1 << 57) + d0;
t1 = (int128_t)r * dv;
t1 = t0 - t1;
t = (sp_digit)(t1 >> 28) / dv;
/* Up to 13 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 39) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Handle rounding error with dv - bottom 64 bits */
t1 = (sp_digit)t0 - (r * dv);
t = (sp_digit)t1 / dv;
/* Up to 19 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 33) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 25 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 27) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 31 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 21) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 37 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 15) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 43 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 9) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 49 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 3) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 55 bits in r */
/* Remaining 3 bits from d0. */
r <<= 3;
d <<= 3;
d |= d0 & ((1 << 3) - 1);
t = d / dv;
r += t;
return r;
@@ -5521,8 +5660,7 @@ static int sp_3072_div_27(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[27 - 1] += t1[27 - 2] >> 57;
t1[27 - 2] &= 0x1ffffffffffffffL;
d1 = t1[27 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[27 - 1] / dv;
sp_3072_mul_d_27(t2, d, r1);
(void)sp_3072_sub_27(t1, t1, t2);
@@ -6259,35 +6397,82 @@ static void sp_3072_cond_add_54(sp_digit* r, const sp_digit* a,
static WC_INLINE sp_digit sp_3072_div_word_54(sp_digit d1, sp_digit d0,
sp_digit dv)
{
sp_digit d, r, t, dv;
int128_t t0, t1;
sp_digit d, r, t;
/* dv has 29 bits. */
dv = (div >> 28) + 1;
/* All 57 bits from d1 and top 6 bits from d0. */
d = (d1 << 6) | (d0 >> 51);
r = d / dv;
d -= r * dv;
/* Up to 34 bits in r */
/* Next 23 bits from d0. */
d <<= 23;
r <<= 23;
d |= (d0 >> 28) & ((1 << 23) - 1);
/* Up to 7 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 45) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 57 bits in r */
/* Handle rounding error with dv - top part */
t0 = ((int128_t)d1 << 57) + d0;
t1 = (int128_t)r * dv;
t1 = t0 - t1;
t = (sp_digit)(t1 >> 28) / dv;
/* Up to 13 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 39) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Handle rounding error with dv - bottom 64 bits */
t1 = (sp_digit)t0 - (r * dv);
t = (sp_digit)t1 / dv;
/* Up to 19 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 33) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 25 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 27) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 31 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 21) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 37 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 15) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 43 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 9) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 49 bits in r */
/* Next 6 bits from d0. */
r <<= 6;
d <<= 6;
d |= (d0 >> 3) & ((1 << 6) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 55 bits in r */
/* Remaining 3 bits from d0. */
r <<= 3;
d <<= 3;
d |= d0 & ((1 << 3) - 1);
t = d / dv;
r += t;
return r;
@@ -6367,8 +6552,7 @@ static int sp_3072_div_54(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[54 - 1] += t1[54 - 2] >> 57;
t1[54 - 2] &= 0x1ffffffffffffffL;
d1 = t1[54 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[54 - 1] / dv;
sp_3072_mul_d_54(t2, d, r1);
(void)sp_3072_sub_54(t1, t1, t2);
@@ -9623,35 +9807,50 @@ SP_NOINLINE static void sp_4096_rshift_39(sp_digit* r, sp_digit* a, byte n)
static WC_INLINE sp_digit sp_4096_div_word_39(sp_digit d1, sp_digit d0,
sp_digit dv)
{
sp_digit d, r, t, dv;
int128_t t0, t1;
sp_digit d, r, t;
/* dv has 27 bits. */
dv = (div >> 26) + 1;
/* All 53 bits from d1 and top 10 bits from d0. */
d = (d1 << 10) | (d0 >> 43);
r = d / dv;
d -= r * dv;
/* Up to 36 bits in r */
/* Next 17 bits from d0. */
d <<= 17;
r <<= 17;
d |= (d0 >> 26) & ((1 << 17) - 1);
/* Up to 11 bits in r */
/* Next 10 bits from d0. */
r <<= 10;
d <<= 10;
d |= (d0 >> 33) & ((1 << 10) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 53 bits in r */
/* Handle rounding error with dv - top part */
t0 = ((int128_t)d1 << 53) + d0;
t1 = (int128_t)r * dv;
t1 = t0 - t1;
t = (sp_digit)(t1 >> 26) / dv;
/* Up to 21 bits in r */
/* Next 10 bits from d0. */
r <<= 10;
d <<= 10;
d |= (d0 >> 23) & ((1 << 10) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Handle rounding error with dv - bottom 64 bits */
t1 = (sp_digit)t0 - (r * dv);
t = (sp_digit)t1 / dv;
/* Up to 31 bits in r */
/* Next 10 bits from d0. */
r <<= 10;
d <<= 10;
d |= (d0 >> 13) & ((1 << 10) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 41 bits in r */
/* Next 10 bits from d0. */
r <<= 10;
d <<= 10;
d |= (d0 >> 3) & ((1 << 10) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 51 bits in r */
/* Remaining 3 bits from d0. */
r <<= 3;
d <<= 3;
d |= d0 & ((1 << 3) - 1);
t = d / dv;
r += t;
return r;
@@ -9737,8 +9936,7 @@ static int sp_4096_div_39(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[39 - 1] += t1[39 - 2] >> 53;
t1[39 - 2] &= 0x1fffffffffffffL;
d1 = t1[39 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[39 - 1] / dv;
sp_4096_mul_d_39(t2, sd, r1);
sp_4096_sub_39(t1, t1, t2);
@@ -10599,35 +10797,50 @@ SP_NOINLINE static void sp_4096_rshift_78(sp_digit* r, sp_digit* a, byte n)
static WC_INLINE sp_digit sp_4096_div_word_78(sp_digit d1, sp_digit d0,
sp_digit dv)
{
sp_digit d, r, t, dv;
int128_t t0, t1;
sp_digit d, r, t;
/* dv has 27 bits. */
dv = (div >> 26) + 1;
/* All 53 bits from d1 and top 10 bits from d0. */
d = (d1 << 10) | (d0 >> 43);
r = d / dv;
d -= r * dv;
/* Up to 36 bits in r */
/* Next 17 bits from d0. */
d <<= 17;
r <<= 17;
d |= (d0 >> 26) & ((1 << 17) - 1);
/* Up to 11 bits in r */
/* Next 10 bits from d0. */
r <<= 10;
d <<= 10;
d |= (d0 >> 33) & ((1 << 10) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 53 bits in r */
/* Handle rounding error with dv - top part */
t0 = ((int128_t)d1 << 53) + d0;
t1 = (int128_t)r * dv;
t1 = t0 - t1;
t = (sp_digit)(t1 >> 26) / dv;
/* Up to 21 bits in r */
/* Next 10 bits from d0. */
r <<= 10;
d <<= 10;
d |= (d0 >> 23) & ((1 << 10) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Handle rounding error with dv - bottom 64 bits */
t1 = (sp_digit)t0 - (r * dv);
t = (sp_digit)t1 / dv;
/* Up to 31 bits in r */
/* Next 10 bits from d0. */
r <<= 10;
d <<= 10;
d |= (d0 >> 13) & ((1 << 10) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 41 bits in r */
/* Next 10 bits from d0. */
r <<= 10;
d <<= 10;
d |= (d0 >> 3) & ((1 << 10) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 51 bits in r */
/* Remaining 3 bits from d0. */
r <<= 3;
d <<= 3;
d |= d0 & ((1 << 3) - 1);
t = d / dv;
r += t;
return r;
@@ -10713,8 +10926,7 @@ static int sp_4096_div_78(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[78 - 1] += t1[78 - 2] >> 53;
t1[78 - 2] &= 0x1fffffffffffffL;
d1 = t1[78 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[78 - 1] / dv;
sp_4096_mul_d_78(t2, sd, r1);
sp_4096_sub_78(t1, t1, t2);
@@ -16148,35 +16360,42 @@ SP_NOINLINE static void sp_256_mul_d_5(sp_digit* r, const sp_digit* a,
static WC_INLINE sp_digit sp_256_div_word_5(sp_digit d1, sp_digit d0,
sp_digit dv)
{
sp_digit d, r, t, dv;
int128_t t0, t1;
sp_digit d, r, t;
/* dv has 27 bits. */
dv = (div >> 25) + 1;
/* All 52 bits from d1 and top 11 bits from d0. */
d = (d1 << 11) | (d0 >> 41);
r = d / dv;
d -= r * dv;
/* Up to 36 bits in r */
/* Next 16 bits from d0. */
d <<= 16;
r <<= 16;
d |= (d0 >> 25) & ((1 << 16) - 1);
/* Up to 12 bits in r */
/* Next 11 bits from d0. */
r <<= 11;
d <<= 11;
d |= (d0 >> 30) & ((1 << 11) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 52 bits in r */
/* Handle rounding error with dv - top part */
t0 = ((int128_t)d1 << 52) + d0;
t1 = (int128_t)r * dv;
t1 = t0 - t1;
t = (sp_digit)(t1 >> 25) / dv;
/* Up to 23 bits in r */
/* Next 11 bits from d0. */
r <<= 11;
d <<= 11;
d |= (d0 >> 19) & ((1 << 11) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Handle rounding error with dv - bottom 64 bits */
t1 = (sp_digit)t0 - (r * dv);
t = (sp_digit)t1 / dv;
/* Up to 34 bits in r */
/* Next 11 bits from d0. */
r <<= 11;
d <<= 11;
d |= (d0 >> 8) & ((1 << 11) - 1);
t = d / dv;
d -= t * dv;
r += t;
/* Up to 45 bits in r */
/* Remaining 8 bits from d0. */
r <<= 8;
d <<= 8;
d |= d0 & ((1 << 8) - 1);
t = d / dv;
r += t;
return r;
@@ -16256,8 +16475,7 @@ static int sp_256_div_5(const sp_digit* a, const sp_digit* d, sp_digit* m,
}
t1[5 - 1] += t1[5 - 2] >> 52;
t1[5 - 2] &= 0xfffffffffffffL;
d1 = t1[5 - 1];
r1 = (sp_digit)(d1 / dv);
r1 = t1[5 - 1] / dv;
sp_256_mul_d_5(t2, d, r1);
(void)sp_256_sub_5(t1, t1, t2);