mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-31 19:24:42 +02:00
Merge pull request #5322 from SparkiDev/sp_math_all_arm32_div_word_fix
SP math all: fix div word for ARM32
This commit is contained in:
@@ -1024,11 +1024,8 @@ static WC_INLINE sp_int_digit sp_div_word(sp_int_digit hi, sp_int_digit lo,
|
|||||||
sp_int_digit r = 0;
|
sp_int_digit r = 0;
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"lsrs r5, %[d], #24\n\t"
|
/* Shift d so that top bit is set. */
|
||||||
"it eq\n\t"
|
"clz r5, %[d]\n\t"
|
||||||
"moveq r5, #8\n\t"
|
|
||||||
"it ne\n\t"
|
|
||||||
"movne r5, #0\n\t"
|
|
||||||
"rsb r6, r5, #31\n\t"
|
"rsb r6, r5, #31\n\t"
|
||||||
"lsl %[d], %[d], r5\n\t"
|
"lsl %[d], %[d], r5\n\t"
|
||||||
"lsl %[hi], %[hi], r5\n\t"
|
"lsl %[hi], %[hi], r5\n\t"
|
||||||
@@ -1060,8 +1057,11 @@ static WC_INLINE sp_int_digit sp_div_word(sp_int_digit hi, sp_int_digit lo,
|
|||||||
"subs r9, r9, r8\n\t"
|
"subs r9, r9, r8\n\t"
|
||||||
"subs r4, r4, #1\n\t"
|
"subs r4, r4, #1\n\t"
|
||||||
"bpl 1b\n\t"
|
"bpl 1b\n\t"
|
||||||
|
|
||||||
"add %[r], %[r], %[r]\n\t"
|
"add %[r], %[r], %[r]\n\t"
|
||||||
"add %[r], %[r], #1\n\t"
|
"add %[r], %[r], #1\n\t"
|
||||||
|
|
||||||
|
/* Handle difference has hi word > 0. */
|
||||||
"umull r4, r5, %[r], %[d]\n\t"
|
"umull r4, r5, %[r], %[d]\n\t"
|
||||||
"subs r4, %[lo], r4\n\t"
|
"subs r4, %[lo], r4\n\t"
|
||||||
"sbc r5, %[hi], r5\n\t"
|
"sbc r5, %[hi], r5\n\t"
|
||||||
@@ -1070,11 +1070,14 @@ static WC_INLINE sp_int_digit sp_div_word(sp_int_digit hi, sp_int_digit lo,
|
|||||||
"subs r4, %[lo], r4\n\t"
|
"subs r4, %[lo], r4\n\t"
|
||||||
"sbc r5, %[hi], r5\n\t"
|
"sbc r5, %[hi], r5\n\t"
|
||||||
"add %[r], %[r], r5\n\t"
|
"add %[r], %[r], r5\n\t"
|
||||||
"umull r4, r5, %[r], %[d]\n\t"
|
|
||||||
|
/* Add 1 to result if bottom half of difference is >= d. */
|
||||||
|
"mul r4, %[r], %[d]\n\t"
|
||||||
"subs r4, %[lo], r4\n\t"
|
"subs r4, %[lo], r4\n\t"
|
||||||
"sbc r5, %[hi], r5\n\t"
|
"subs r9, %[d], r4\n\t"
|
||||||
"add %[r], %[r], r5\n\t"
|
"sbc r8, r8, r8\n\t"
|
||||||
"subs r8, %[d], r4\n\t"
|
"sub %[r], %[r], r8\n\t"
|
||||||
|
"subs r9, r9, #1\n\t"
|
||||||
"sbc r8, r8, r8\n\t"
|
"sbc r8, r8, r8\n\t"
|
||||||
"sub %[r], %[r], r8\n\t"
|
"sub %[r], %[r], r8\n\t"
|
||||||
: [r] "+r" (r), [hi] "+r" (hi), [lo] "+r" (lo), [d] "+r" (d)
|
: [r] "+r" (r), [hi] "+r" (hi), [lo] "+r" (lo), [d] "+r" (d)
|
||||||
@@ -10397,8 +10400,10 @@ int sp_mulmod(sp_int* a, sp_int* b, sp_int* m, sp_int* r)
|
|||||||
err = MP_VAL;
|
err = MP_VAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (err == MP_OKAY) {
|
||||||
if ((r == m) || (r->size < a->used + b->used)) {
|
if ((r == m) || (r->size < a->used + b->used)) {
|
||||||
DECL_SP_INT(t, ((a == NULL) || (b == NULL)) ? 1 : a->used + b->used);
|
DECL_SP_INT(t, ((a == NULL) || (b == NULL)) ? 1 :
|
||||||
|
a->used + b->used);
|
||||||
ALLOC_SP_INT(t, a->used + b->used, err, NULL);
|
ALLOC_SP_INT(t, a->used + b->used, err, NULL);
|
||||||
if (err == MP_OKAY) {
|
if (err == MP_OKAY) {
|
||||||
err = sp_init_size(t, a->used + b->used);
|
err = sp_init_size(t, a->used + b->used);
|
||||||
@@ -10413,13 +10418,12 @@ int sp_mulmod(sp_int* a, sp_int* b, sp_int* m, sp_int* r)
|
|||||||
FREE_SP_INT(t, NULL);
|
FREE_SP_INT(t, NULL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (err == MP_OKAY) {
|
|
||||||
err = sp_mul(a, b, r);
|
err = sp_mul(a, b, r);
|
||||||
}
|
|
||||||
if (err == MP_OKAY) {
|
if (err == MP_OKAY) {
|
||||||
err = sp_mod(r, m, r);
|
err = sp_mod(r, m, r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -38216,7 +38216,10 @@ static int mp_test_mont(mp_int* a, mp_int* m, mp_int* n, mp_int* r, WC_RNG* rng)
|
|||||||
0x1f, 0x13d, 0x45, 0x615
|
0x1f, 0x13d, 0x45, 0x615
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
int bits[] = { 256, 384, 2048,
|
int bits[] = { 256, 384,
|
||||||
|
#if defined(SP_INT_MAX_BITS) && SP_INT_MAX_BITS > 4096
|
||||||
|
2048,
|
||||||
|
#endif
|
||||||
#if defined(SP_INT_MAX_BITS) && SP_INT_MAX_BITS > 6144
|
#if defined(SP_INT_MAX_BITS) && SP_INT_MAX_BITS > 6144
|
||||||
3072
|
3072
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user