mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-08-01 19:54:40 +02:00
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;
|
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.
|
||||||
|
Reference in New Issue
Block a user