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;
__asm__ __volatile__ (
"lsrs r5, %[d], 24\n\t"
"lsrs r5, %[d], #24\n\t"
"it eq\n\t"
"moveq r5, 8\n\t"
"moveq r5, #8\n\t"
"it ne\n\t"
"movne r5, 0\n\t"
"rsb r6, r5, 31\n\t"
"movne r5, #0\n\t"
"rsb r6, r5, #31\n\t"
"lsl %[d], %[d], r5\n\t"
"lsl %[hi], %[hi], r5\n\t"
"lsr r7, %[lo], r6\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"
"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)
{
__asm__ __volatile__ (
"lsrs r3, %[d], 24\n\t"
"lsrs r3, %[d], #24\n\t"
"it eq\n\t"
"moveq r3, 8\n\t"
"moveq r3, #8\n\t"
"it ne\n\t"
"movne r3, 0\n\t"
"rsb r4, r3, 31\n\t"
"movne r3, #0\n\t"
"rsb r4, r3, #31\n\t"
"lsl %[d], %[d], r3\n\t"
"lsl %[hi], %[hi], r3\n\t"
"lsr r5, %[lo], r4\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"
"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)
{
__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"
#if defined(__clang__) || defined(WOLFSSL_KEIL)
"lsrs r5, %[d], #1\n\t"
@ -4422,7 +4474,8 @@ static int _sp_cmp(sp_int* a, sp_int* b)
#endif
#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.
*
* Pointers are compared such that NULL is less than not NULL.