https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f2bc1f0e11187e84230fb…
commit f2bc1f0e11187e84230fb3319f7b6a281b8d2ffa
Author: Roman Masanin <52833910+theR4K(a)users.noreply.github.com>
AuthorDate: Sat Jul 24 21:23:58 2021 +0300
Commit: GitHub <noreply(a)github.com>
CommitDate: Sat Jul 24 20:23:58 2021 +0200
__rt_div fixes for arm (#3843)
[CRT/arm] Fix __rt_udiv and __rt_sdiv
---
sdk/lib/crt/math/arm/__rt_div_worker.h | 27 +++++++++++++++++----------
sdk/lib/crt/math/arm/__rt_sdiv.c | 7 ++++---
sdk/lib/crt/math/arm/__rt_sdiv64.s | 15 +++++++--------
sdk/lib/crt/math/arm/__rt_udiv.c | 7 ++++---
sdk/lib/crt/math/arm/__rt_udiv64.s | 15 +++++++--------
5 files changed, 39 insertions(+), 32 deletions(-)
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