diff --git a/sdk/lib/crt/math/arm/__rt_div_worker.h b/sdk/lib/crt/math/arm/__rt_div_worker.h index 2aef926d0d9..035b3abd045 100644 --- a/sdk/lib/crt/math/arm/__rt_div_worker.h +++ b/sdk/lib/crt/math/arm/__rt_div_worker.h @@ -25,10 +25,18 @@ __brkdiv0(void) __emit(0xDEF9); } -typedef struct _ARM_DIVRESULT +typedef union _ARM_DIVRESULT { - UINT3264 quotient; /* to be returned in R0 */ - UINT3264 modulus; /* to be returned in R1 */ +#ifdef _USE_64_BITS_ + unsigned int raw_data[4]; +#else + unsigned long long raw_data; +#endif + struct + { + UINT3264 quotient; /* to be returned in R0(R0,R1) */ + UINT3264 modulus; /* to be returned in R1(R2,R3) */ + } data; } ARM_DIVRESULT; #ifndef _USE_64_BITS_ @@ -36,9 +44,9 @@ __forceinline #endif void __rt_div_worker( - ARM_DIVRESULT *result, UINT3264 divisor, - UINT3264 dividend) + UINT3264 dividend, + ARM_DIVRESULT* result) { UINT3264 shift; UINT3264 mask; @@ -70,8 +78,8 @@ __rt_div_worker( if (divisor > dividend) { - result->quotient = 0; - result->modulus = divisor; + result->data.quotient = 0; + result->data.modulus = divisor; return; } @@ -110,7 +118,6 @@ __rt_div_worker( } #endif // _SIGNED_DIV_ - result->quotient = quotient; - result->modulus = dividend; - return; + result->data.quotient = quotient; + result->data.modulus = dividend; } diff --git a/sdk/lib/crt/math/arm/__rt_sdiv.c b/sdk/lib/crt/math/arm/__rt_sdiv.c index dea2b30e326..302cec422a4 100644 --- a/sdk/lib/crt/math/arm/__rt_sdiv.c +++ b/sdk/lib/crt/math/arm/__rt_sdiv.c @@ -13,14 +13,15 @@ #include "__rt_div_worker.h" -ARM_DIVRESULT +unsigned long long __rt_sdiv( int divisor, int dividend) { ARM_DIVRESULT result; - __rt_sdiv_worker(&result, divisor, dividend); - return result; + __rt_sdiv_worker(divisor, dividend, &result); + + return result.raw_data; } diff --git a/sdk/lib/crt/math/arm/__rt_sdiv64.s b/sdk/lib/crt/math/arm/__rt_sdiv64.s index c5ea8bb15ed..d3515a79729 100644 --- a/sdk/lib/crt/math/arm/__rt_sdiv64.s +++ b/sdk/lib/crt/math/arm/__rt_sdiv64.s @@ -18,19 +18,18 @@ NESTED_ENTRY __rt_sdiv64 /* Allocate stack space and store parameters there */ - stmdb sp!,{r0,r1,r2,r3,lr} + push {lr} + sub sp,sp,0x10 + mov r12,sp + push {r12} PROLOG_END - /* Load pointer to stack structure into R0 */ - mov r0, sp - /* Call the C worker function */ - adr lr, Return - b __rt_sdiv64_worker + bl __rt_sdiv64_worker + add sp,sp,0x04 -Return /* Move result data into the appropriate registers and return */ - ldmia sp!,{r0,r1,r2,r3,pc} + pop {r0,r1,r2,r3,pc} NESTED_END __rt_sdiv64 END diff --git a/sdk/lib/crt/math/arm/__rt_udiv.c b/sdk/lib/crt/math/arm/__rt_udiv.c index 0d047e3c66a..2f47697d8ff 100644 --- a/sdk/lib/crt/math/arm/__rt_udiv.c +++ b/sdk/lib/crt/math/arm/__rt_udiv.c @@ -11,14 +11,15 @@ #include "__rt_div_worker.h" -ARM_DIVRESULT +unsigned long long __rt_udiv( unsigned int divisor, unsigned int dividend) { ARM_DIVRESULT result; - __rt_udiv_worker(&result, divisor, dividend); - return result; + __rt_udiv_worker(divisor, dividend, &result); + + return result.raw_data; } diff --git a/sdk/lib/crt/math/arm/__rt_udiv64.s b/sdk/lib/crt/math/arm/__rt_udiv64.s index 07c90bce81c..d08a02fc463 100644 --- a/sdk/lib/crt/math/arm/__rt_udiv64.s +++ b/sdk/lib/crt/math/arm/__rt_udiv64.s @@ -18,19 +18,18 @@ NESTED_ENTRY __rt_udiv64 /* Allocate stack space and store parameters there */ - stmdb sp!,{r0,r1,r2,r3,lr} + push {lr} + sub sp,sp,0x10 + mov r12,sp + push {r12} PROLOG_END - /* Load pointer to stack structure into R0 */ - mov r0, sp - /* Call the C worker function */ - adr lr, Return - b __rt_udiv64_worker + bl __rt_udiv64_worker + add sp,sp,0x04 -Return /* Move result data into the appropriate registers and return */ - ldmia sp!,{r0,r1,r2,r3,pc} + pop {r0,r1,r2,r3,pc} NESTED_END __rt_udiv64 END