Author: tkreuzer
Date: Sun Apr 12 18:07:19 2015
New Revision: 67179
URL:
http://svn.reactos.org/svn/reactos?rev=67179&view=rev
Log:
[CRT]
Implement __rt_sdiv as a wrapper around the unsigned divide (now factored out into an
inline worker function)
Added:
trunk/reactos/lib/sdk/crt/math/arm/__rt_div.c
- copied, changed from r67178, trunk/reactos/lib/sdk/crt/math/arm/__rt_udiv.c
Removed:
trunk/reactos/lib/sdk/crt/math/arm/__rt_sdiv.s
trunk/reactos/lib/sdk/crt/math/arm/__rt_udiv.c
Modified:
trunk/reactos/lib/sdk/crt/crt.cmake
trunk/reactos/lib/sdk/crt/libcntpr.cmake
Modified: trunk/reactos/lib/sdk/crt/crt.cmake
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/crt.cmake?rev=…
==============================================================================
--- trunk/reactos/lib/sdk/crt/crt.cmake [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/crt.cmake [iso-8859-1] Sun Apr 12 18:07:19 2015
@@ -476,7 +476,7 @@
endif()
elseif(ARCH STREQUAL "arm")
list(APPEND LIBCNTPR_SOURCE
- math/arm/__rt_udiv.c
+ math/arm/__rt_div.c
)
list(APPEND CRT_ASM_SOURCE
math/arm/floor.s
@@ -484,7 +484,6 @@
math/arm/pow.s
math/arm/__dtou64.s
math/arm/__u64tod.s
- math/arm/__rt_sdiv.s
math/arm/__rt_sdiv64.s
math/arm/__rt_udiv64.s
)
Modified: trunk/reactos/lib/sdk/crt/libcntpr.cmake
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/libcntpr.cmake…
==============================================================================
--- trunk/reactos/lib/sdk/crt/libcntpr.cmake [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/libcntpr.cmake [iso-8859-1] Sun Apr 12 18:07:19 2015
@@ -135,7 +135,7 @@
math/sin.c)
elseif(ARCH STREQUAL "arm")
list(APPEND LIBCNTPR_SOURCE
- math/arm/__rt_udiv.c
+ math/arm/__rt_div.c
)
list(APPEND LIBCNTPR_ASM_SOURCE
math/arm/floor.s
@@ -143,7 +143,6 @@
math/arm/pow.s
math/arm/__dtou64.s
math/arm/__u64tod.s
- math/arm/__rt_sdiv.s
math/arm/__rt_sdiv64.s
math/arm/__rt_udiv64.s
)
Copied: trunk/reactos/lib/sdk/crt/math/arm/__rt_div.c (from r67178,
trunk/reactos/lib/sdk/crt/math/arm/__rt_udiv.c)
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/math/arm/__rt_…
==============================================================================
--- trunk/reactos/lib/sdk/crt/math/arm/__rt_udiv.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/math/arm/__rt_div.c [iso-8859-1] Sun Apr 12 18:07:19 2015
@@ -21,15 +21,16 @@
__emit(0xDEF9);
}
-ARM_UDIVRESULT
-__rt_udiv(
+__forceinline
+void
+__rt_udiv_internal(
+ ARM_UDIVRESULT *result,
unsigned int divisor,
unsigned int dividend)
{
- ARM_UDIVRESULT result;
- unsigned int BitShift;
- unsigned int BitMask;
- unsigned int Quotient;
+ unsigned int shift;
+ unsigned int mask;
+ unsigned int quotient;
if (divisor == 0)
{
@@ -39,35 +40,87 @@
if (divisor > dividend)
{
- result.quotient = 0;
- result.modulus = divisor;
- return result;
+ result->quotient = 0;
+ result->modulus = divisor;
+ return;
}
/* Get the difference in count of leading zeros between dividend and divisor */
- BitShift = _CountLeadingZeros(divisor);
- BitShift -= _CountLeadingZeros(dividend);
+ shift = _CountLeadingZeros(divisor);
+ shift -= _CountLeadingZeros(dividend);
/* Shift the divisor to the left, so that it's highest bit is the same
as the highest bit of the dividend */
- divisor <<= BitShift;
+ divisor <<= shift;
- BitMask = 1 << BitShift;
+ mask = 1 << shift;
+ quotient = 0;
do
{
if (dividend >= divisor)
{
- Quotient |= BitMask;
+ quotient |= mask;
dividend -= divisor;
}
divisor >>= 1;
- BitMask >>= 1;
+ mask >>= 1;
}
- while (BitMask);
+ while (mask);
- result.quotient = Quotient;
- result.modulus = dividend;
+ result->quotient = quotient;
+ result->modulus = dividend;
+ return;
+}
+
+ARM_UDIVRESULT
+__rt_udiv(
+ unsigned int divisor,
+ unsigned int dividend)
+{
+ ARM_UDIVRESULT result;
+
+ __rt_udiv_internal(&result, divisor, dividend);
return result;
}
+typedef struct _ARM_SDIVRESULT
+{
+ int quotient; /* to be returned in R0 */
+ int modulus; /* to be returned in R1 */
+} ARM_SDIVRESULT;
+
+ARM_SDIVRESULT
+__rt_sdiv(
+ int divisor,
+ int dividend)
+{
+ ARM_SDIVRESULT result;
+ int divisor_sign, dividend_sign;
+
+ dividend_sign = divisor & 0x80000000;
+ if (dividend_sign)
+ {
+ dividend = -dividend;
+ }
+
+ divisor_sign = divisor & 0x80000000;
+ if (divisor_sign)
+ {
+ divisor = -divisor;
+ }
+
+ __rt_udiv_internal((ARM_UDIVRESULT*)&result, divisor, dividend);
+
+ if (dividend_sign ^ divisor_sign)
+ {
+ result.quotient = -result.quotient;
+ }
+
+ if (dividend_sign)
+ {
+ result.modulus = -result.modulus;
+ }
+
+ return result;
+}
Removed: trunk/reactos/lib/sdk/crt/math/arm/__rt_sdiv.s
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/math/arm/__rt_…
==============================================================================
--- trunk/reactos/lib/sdk/crt/math/arm/__rt_sdiv.s [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/math/arm/__rt_sdiv.s (removed)
@@ -1,20 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS system libraries
- * PURPOSE: Implementation of __rt_sdiv
- * PROGRAMMER: Timo Kreuzer (timo.kreuzer(a)reactos.org)
- */
-
-/* INCLUDES ******************************************************************/
-
-#include <kxarm.h>
-
-/* CODE **********************************************************************/
- TEXTAREA
-
- LEAF_ENTRY __rt_sdiv
-
- LEAF_END __rt_sdiv
-
- END
-/* EOF */
Removed: trunk/reactos/lib/sdk/crt/math/arm/__rt_udiv.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/math/arm/__rt_…
==============================================================================
--- trunk/reactos/lib/sdk/crt/math/arm/__rt_udiv.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/math/arm/__rt_udiv.c (removed)
@@ -1,73 +0,0 @@
-/*
- * COPYRIGHT: BSD, see COPYING.ARM in the top level directory
- * PROJECT: ReactOS crt library
- * FILE: lib/sdk/crt/math/arm/__rt_udiv.c
- * PURPOSE: Implementation of __rt_udiv
- * PROGRAMMER: Timo Kreuzer
- * REFERENCE:
http://research.microsoft.com/en-us/um/redmond/projects/invisible/src/crt/m…
- *
http://research.microsoft.com/en-us/um/redmond/projects/invisible/src/crt/m…
- */
-
-typedef struct _ARM_UDIVRESULT
-{
- unsigned int quotient; /* to be returned in R0 */
- unsigned int modulus; /* to be returned in R1 */
-} ARM_UDIVRESULT;
-
-__forceinline
-void
-__brkdiv0(void)
-{
- __emit(0xDEF9);
-}
-
-ARM_UDIVRESULT
-__rt_udiv(
- unsigned int divisor,
- unsigned int dividend)
-{
- ARM_UDIVRESULT result;
- unsigned int BitShift;
- unsigned int BitMask;
- unsigned int Quotient;
-
- if (divisor == 0)
- {
- /* Raise divide by zero error */
- __brkdiv0();
- }
-
- if (divisor > dividend)
- {
- result.quotient = 0;
- result.modulus = divisor;
- return result;
- }
-
- /* Get the difference in count of leading zeros between dividend and divisor */
- BitShift = _CountLeadingZeros(divisor);
- BitShift -= _CountLeadingZeros(dividend);
-
- /* Shift the divisor to the left, so that it's highest bit is the same
- as the highest bit of the dividend */
- divisor <<= BitShift;
-
- BitMask = 1 << BitShift;
-
- do
- {
- if (dividend >= divisor)
- {
- Quotient |= BitMask;
- dividend -= divisor;
- }
- divisor >>= 1;
- BitMask >>= 1;
- }
- while (BitMask);
-
- result.quotient = Quotient;
- result.modulus = dividend;
- return result;
-}
-