forked from wolfSSL/wolfssl
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:
@ -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.
|
||||
|
Reference in New Issue
Block a user