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=6... ============================================================================== --- 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_d... ============================================================================== --- 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_s... ============================================================================== --- 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@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_u... ============================================================================== --- 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/md... - * http://research.microsoft.com/en-us/um/redmond/projects/invisible/src/crt/md... - */ - -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; -} -