SP int, cortex, thumb div_word: fix to work

Cortex builds needed # before number. Arm32 works with or without.
Thumb div_word needed to shift up if divisor too small (like other ARM
implementations).
This commit is contained in:
Sean Parkinson
2022-02-10 12:07:11 +10:00
parent cba262440a
commit e8fb17f7b5

View File

@@ -1017,17 +1017,17 @@ 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" "lsrs r5, %[d], #24\n\t"
"it eq\n\t" "it eq\n\t"
"moveq r5, 8\n\t" "moveq r5, #8\n\t"
"it ne\n\t" "it ne\n\t"
"movne r5, 0\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"
"lsr r7, %[lo], r6\n\t" "lsr r7, %[lo], r6\n\t"
"lsl %[lo], %[lo], r5\n\t" "lsl %[lo], %[lo], r5\n\t"
"orr %[hi], %[hi], r7, lsr 1\n\t" "orr %[hi], %[hi], r7, lsr #1\n\t"
"lsr r5, %[d], #1\n\t" "lsr r5, %[d], #1\n\t"
"add r5, r5, #1\n\t" "add r5, r5, #1\n\t"
@@ -1092,17 +1092,17 @@ static WC_INLINE sp_int_digit sp_div_word(sp_int_digit hi, sp_int_digit lo,
sp_int_digit d) sp_int_digit d)
{ {
__asm__ __volatile__ ( __asm__ __volatile__ (
"lsrs r3, %[d], 24\n\t" "lsrs r3, %[d], #24\n\t"
"it eq\n\t" "it eq\n\t"
"moveq r3, 8\n\t" "moveq r3, #8\n\t"
"it ne\n\t" "it ne\n\t"
"movne r3, 0\n\t" "movne r3, #0\n\t"
"rsb r4, r3, 31\n\t" "rsb r4, r3, #31\n\t"
"lsl %[d], %[d], r3\n\t" "lsl %[d], %[d], r3\n\t"
"lsl %[hi], %[hi], r3\n\t" "lsl %[hi], %[hi], r3\n\t"
"lsr r5, %[lo], r4\n\t" "lsr r5, %[lo], r4\n\t"
"lsl %[lo], %[lo], r3\n\t" "lsl %[lo], %[lo], r3\n\t"
"orr %[hi], %[hi], r5, lsr 1\n\t" "orr %[hi], %[hi], r5, lsr #1\n\t"
"lsr r5, %[d], 16\n\t" "lsr r5, %[d], 16\n\t"
"add r5, r5, 1\n\t" "add r5, r5, 1\n\t"
@@ -2175,6 +2175,58 @@ static WC_INLINE sp_int_digit sp_div_word(sp_int_digit hi, sp_int_digit lo,
sp_int_digit d) sp_int_digit d)
{ {
__asm__ __volatile__ ( __asm__ __volatile__ (
#if defined(__clang__) || defined(WOLFSSL_KEIL)
"lsrs r3, %[d], #24\n\t"
#else
"lsr r3, %[d], #24\n\t"
#endif
"beq 2%=f\n\t"
"1%=:\n\t"
"movs r3, #0\n\t"
"b 3%=f\n\t"
"2%=:\n\t"
"mov r3, #8\n\t"
"3%=:\n\t"
"movs r4, #31\n\t"
#if defined(__clang__) || defined(WOLFSSL_KEIL)
"subs r4, r4, r3\n\t"
#else
"sub r4, r4, r3\n\t"
#endif
#if defined(__clang__) || defined(WOLFSSL_KEIL)
"lsls %[d], %[d], r3\n\t"
#else
"lsl %[d], %[d], r3\n\t"
#endif
#if defined(__clang__) || defined(WOLFSSL_KEIL)
"lsls %[hi], %[hi], r3\n\t"
#else
"lsl %[hi], %[hi], r3\n\t"
#endif
"mov r5, %[lo]\n\t"
#if defined(__clang__) || defined(WOLFSSL_KEIL)
"lsrs r5, r5, r4\n\t"
#else
"lsr r5, r5, r4\n\t"
#endif
#if defined(__clang__) || defined(WOLFSSL_KEIL)
"lsls %[lo], %[lo], r3\n\t"
#else
"lsl %[lo], %[lo], r3\n\t"
#endif
#if defined(__clang__) || defined(WOLFSSL_KEIL)
"lsrs r5, r5, #1\n\t"
#else
"lsr r5, r5, #1\n\t"
#endif
#if defined(WOLFSSL_KEIL)
"orrs %[hi], %[hi], r5\n\t"
#elif defined(__clang__)
"orrs %[hi], r5\n\t"
#else
"orr %[hi], r5\n\t"
#endif
"movs r3, #0\n\t" "movs r3, #0\n\t"
#if defined(__clang__) || defined(WOLFSSL_KEIL) #if defined(__clang__) || defined(WOLFSSL_KEIL)
"lsrs r5, %[d], #1\n\t" "lsrs r5, %[d], #1\n\t"
@@ -4422,7 +4474,8 @@ static int _sp_cmp(sp_int* a, sp_int* b)
#endif #endif
#if (!defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \ #if (!defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \
!defined(NO_DSA) || defined(HAVE_ECC) || !defined(NO_DH) !defined(NO_DSA) || defined(HAVE_ECC) || !defined(NO_DH) || \
defined(WOLFSSL_SP_MATH_ALL)
/* Compare two multi-precision numbers. /* Compare two multi-precision numbers.
* *
* Pointers are compared such that NULL is less than not NULL. * Pointers are compared such that NULL is less than not NULL.
@@ -5449,10 +5502,10 @@ int sp_mod_d(sp_int* a, const sp_int_digit d, sp_int_digit* r)
err = MP_VAL; err = MP_VAL;
} }
#if 0 #if 0
sp_print(a, "a"); sp_print(a, "a");
sp_print_digit(d, "m"); sp_print_digit(d, "m");
#endif #endif
if (err == MP_OKAY) { if (err == MP_OKAY) {
/* Check whether d is a power of 2. */ /* Check whether d is a power of 2. */
@@ -5496,9 +5549,9 @@ int sp_mod_d(sp_int* a, const sp_int_digit d, sp_int_digit* r)
#endif #endif
} }
#if 0 #if 0
sp_print_digit(*r, "rmod"); sp_print_digit(*r, "rmod");
#endif #endif
return err; return err;
} }
@@ -5532,10 +5585,10 @@ int sp_div_2_mod_ct(sp_int* a, sp_int* m, sp_int* r)
sp_int_digit mask; sp_int_digit mask;
int i; int i;
#if 0 #if 0
sp_print(a, "a"); sp_print(a, "a");
sp_print(m, "m"); sp_print(m, "m");
#endif #endif
mask = 0 - (a->dp[0] & 1); mask = 0 - (a->dp[0] & 1);
for (i = 0; i < m->used; i++) { for (i = 0; i < m->used; i++) {
@@ -5554,9 +5607,9 @@ int sp_div_2_mod_ct(sp_int* a, sp_int* m, sp_int* r)
sp_clamp(r); sp_clamp(r);
sp_div_2(r, r); sp_div_2(r, r);
#if 0 #if 0
sp_print(r, "rd2"); sp_print(r, "rd2");
#endif #endif
} }
return err; return err;
@@ -5628,10 +5681,10 @@ static int _sp_add_off(sp_int* a, sp_int* b, sp_int* r, int o)
int j; int j;
sp_int_word t = 0; sp_int_word t = 0;
#if 0 #if 0
sp_print(a, "a"); sp_print(a, "a");
sp_print(b, "b"); sp_print(b, "b");
#endif #endif
#ifdef SP_MATH_NEED_ADD_OFF #ifdef SP_MATH_NEED_ADD_OFF
for (i = 0; (i < o) && (i < a->used); i++) { for (i = 0; (i < o) && (i < a->used); i++) {
@@ -5669,9 +5722,9 @@ static int _sp_add_off(sp_int* a, sp_int* b, sp_int* r, int o)
sp_clamp(r); sp_clamp(r);
#if 0 #if 0
sp_print(r, "radd"); sp_print(r, "radd");
#endif #endif
return MP_OKAY; return MP_OKAY;
} }
@@ -5855,13 +5908,13 @@ int sp_addmod(sp_int* a, sp_int* b, sp_int* m, sp_int* r)
} }
ALLOC_SP_INT_SIZE(t, used, err, NULL); ALLOC_SP_INT_SIZE(t, used, err, NULL);
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(a, "a"); sp_print(a, "a");
sp_print(b, "b"); sp_print(b, "b");
sp_print(m, "m"); sp_print(m, "m");
} }
#endif #endif
if (err == MP_OKAY) { if (err == MP_OKAY) {
err = sp_add(a, b, t); err = sp_add(a, b, t);
@@ -5870,11 +5923,11 @@ int sp_addmod(sp_int* a, sp_int* b, sp_int* m, sp_int* r)
err = sp_mod(t, m, r); err = sp_mod(t, m, r);
} }
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(r, "rma"); sp_print(r, "rma");
} }
#endif #endif
FREE_SP_INT(t, NULL); FREE_SP_INT(t, NULL);
return err; return err;
@@ -5909,13 +5962,13 @@ int sp_submod(sp_int* a, sp_int* b, sp_int* m, sp_int* r)
err = MP_VAL; err = MP_VAL;
} }
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(a, "a"); sp_print(a, "a");
sp_print(b, "b"); sp_print(b, "b");
sp_print(m, "m"); sp_print(m, "m");
} }
#endif #endif
ALLOC_SP_INT_ARRAY(t, used, 2, err, NULL); ALLOC_SP_INT_ARRAY(t, used, 2, err, NULL);
if (err == MP_OKAY) { if (err == MP_OKAY) {
@@ -5942,11 +5995,11 @@ int sp_submod(sp_int* a, sp_int* b, sp_int* m, sp_int* r)
} }
} }
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(r, "rms"); sp_print(r, "rms");
} }
#endif #endif
FREE_SP_INT_ARRAY(t, NULL); FREE_SP_INT_ARRAY(t, NULL);
return err; return err;
@@ -5962,13 +6015,13 @@ int sp_submod(sp_int* a, sp_int* b, sp_int* m, sp_int* r)
err = MP_VAL; err = MP_VAL;
} }
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(a, "a"); sp_print(a, "a");
sp_print(b, "b"); sp_print(b, "b");
sp_print(m, "m"); sp_print(m, "m");
} }
#endif #endif
ALLOC_SP_INT_SIZE(t, used, err, NULL); ALLOC_SP_INT_SIZE(t, used, err, NULL);
if (err == MP_OKAY) { if (err == MP_OKAY) {
@@ -5978,11 +6031,11 @@ int sp_submod(sp_int* a, sp_int* b, sp_int* m, sp_int* r)
err = sp_mod(t, m, r); err = sp_mod(t, m, r);
} }
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(r, "rms"); sp_print(r, "rms");
} }
#endif #endif
FREE_SP_INT(t, NULL); FREE_SP_INT(t, NULL);
return err; return err;
@@ -6367,12 +6420,12 @@ int sp_div(sp_int* a, sp_int* d, sp_int* r, sp_int* rem)
err = MP_VAL; err = MP_VAL;
} }
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(a, "a"); sp_print(a, "a");
sp_print(d, "b"); sp_print(d, "b");
} }
#endif #endif
if (err == MP_OKAY) { if (err == MP_OKAY) {
#ifdef WOLFSSL_SP_INT_NEGATIVE #ifdef WOLFSSL_SP_INT_NEGATIVE
@@ -6574,7 +6627,7 @@ int sp_div(sp_int* a, sp_int* d, sp_int* r, sp_int* rem)
} }
} }
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
if (rem != NULL) { if (rem != NULL) {
sp_print(rem, "rdr"); sp_print(rem, "rdr");
@@ -6583,7 +6636,7 @@ int sp_div(sp_int* a, sp_int* d, sp_int* r, sp_int* rem)
sp_print(r, "rdw"); sp_print(r, "rdw");
} }
} }
#endif #endif
FREE_SP_INT_ARRAY(td, NULL); FREE_SP_INT_ARRAY(td, NULL);
return err; return err;
@@ -9499,12 +9552,12 @@ int sp_mul(sp_int* a, sp_int* b, sp_int* r)
err = MP_VAL; err = MP_VAL;
} }
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(a, "a"); sp_print(a, "a");
sp_print(b, "b"); sp_print(b, "b");
} }
#endif #endif
if (err == MP_OKAY) { if (err == MP_OKAY) {
#ifdef WOLFSSL_SP_INT_NEGATIVE #ifdef WOLFSSL_SP_INT_NEGATIVE
@@ -9605,11 +9658,11 @@ int sp_mul(sp_int* a, sp_int* b, sp_int* r)
} }
#endif #endif
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(r, "rmul"); sp_print(r, "rmul");
} }
#endif #endif
return err; return err;
} }
@@ -10507,13 +10560,13 @@ int sp_exptmod_ex(sp_int* b, sp_int* e, int digits, sp_int* m, sp_int* r)
err = MP_VAL; err = MP_VAL;
} }
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(b, "a"); sp_print(b, "a");
sp_print(e, "b"); sp_print(e, "b");
sp_print(m, "m"); sp_print(m, "m");
} }
#endif #endif
if (err != MP_OKAY) { if (err != MP_OKAY) {
} }
@@ -10622,11 +10675,11 @@ int sp_exptmod_ex(sp_int* b, sp_int* e, int digits, sp_int* m, sp_int* r)
(void)eBits; (void)eBits;
(void)digits; (void)digits;
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(r, "rme"); sp_print(r, "rme");
} }
#endif #endif
return err; return err;
} }
#endif /* WOLFSSL_SP_MATH_ALL || WOLFSSL_HAVE_SP_DH */ #endif /* WOLFSSL_SP_MATH_ALL || WOLFSSL_HAVE_SP_DH */
@@ -11021,13 +11074,13 @@ int sp_exptmod_nct(sp_int* b, sp_int* e, sp_int* m, sp_int* r)
err = MP_VAL; err = MP_VAL;
} }
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(b, "a"); sp_print(b, "a");
sp_print(e, "b"); sp_print(e, "b");
sp_print(m, "m"); sp_print(m, "m");
} }
#endif #endif
if (err != MP_OKAY) { if (err != MP_OKAY) {
} }
@@ -11062,11 +11115,11 @@ int sp_exptmod_nct(sp_int* b, sp_int* e, sp_int* m, sp_int* r)
err = _sp_exptmod_nct(b, e, m, r); err = _sp_exptmod_nct(b, e, m, r);
} }
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(r, "rme"); sp_print(r, "rme");
} }
#endif #endif
return err; return err;
} }
@@ -13529,11 +13582,11 @@ int sp_sqr(sp_int* a, sp_int* r)
err = MP_VAL; err = MP_VAL;
} }
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(a, "a"); sp_print(a, "a");
} }
#endif #endif
if (err == MP_OKAY) { if (err == MP_OKAY) {
if (a->used == 0) { if (a->used == 0) {
@@ -13623,11 +13676,11 @@ int sp_sqr(sp_int* a, sp_int* r)
} }
#endif #endif
#if 0 #if 0
if (err == MP_OKAY) { if (err == MP_OKAY) {
sp_print(r, "rsqr"); sp_print(r, "rsqr");
} }
#endif #endif
return err; return err;
#endif /* WOLFSSL_SP_MATH && WOLFSSL_SP_SMALL */ #endif /* WOLFSSL_SP_MATH && WOLFSSL_SP_SMALL */