Author: tkreuzer Date: Sun Apr 12 17:08:11 2015 New Revision: 67178
URL: http://svn.reactos.org/svn/reactos?rev=67178&view=rev Log: [CRT] Implement __rt_udiv in C.
Added: trunk/reactos/lib/sdk/crt/math/arm/__rt_udiv.c (with props) Removed: trunk/reactos/lib/sdk/crt/math/arm/__rt_udiv.s 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 17:08:11 2015 @@ -475,6 +475,9 @@ except/amd64/cpp.s) endif() elseif(ARCH STREQUAL "arm") + list(APPEND LIBCNTPR_SOURCE + math/arm/__rt_udiv.c + ) list(APPEND CRT_ASM_SOURCE math/arm/floor.s math/arm/log10.s @@ -483,7 +486,6 @@ math/arm/__u64tod.s math/arm/__rt_sdiv.s math/arm/__rt_sdiv64.s - math/arm/__rt_udiv.s math/arm/__rt_udiv64.s ) endif()
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 17:08:11 2015 @@ -134,6 +134,9 @@ math/cos.c math/sin.c) elseif(ARCH STREQUAL "arm") + list(APPEND LIBCNTPR_SOURCE + math/arm/__rt_udiv.c + ) list(APPEND LIBCNTPR_ASM_SOURCE math/arm/floor.s math/arm/log10.s @@ -142,7 +145,6 @@ math/arm/__u64tod.s math/arm/__rt_sdiv.s math/arm/__rt_sdiv64.s - math/arm/__rt_udiv.s math/arm/__rt_udiv64.s ) endif()
Added: 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 (added) +++ trunk/reactos/lib/sdk/crt/math/arm/__rt_udiv.c [iso-8859-1] Sun Apr 12 17:08:11 2015 @@ -0,0 +1,73 @@ +/* + * 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; +} +
Propchange: trunk/reactos/lib/sdk/crt/math/arm/__rt_udiv.c ------------------------------------------------------------------------------ svn:eol-style = native
Removed: trunk/reactos/lib/sdk/crt/math/arm/__rt_udiv.s 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.s [iso-8859-1] (original) +++ trunk/reactos/lib/sdk/crt/math/arm/__rt_udiv.s (removed) @@ -1,20 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * PURPOSE: Implementation of __rt_udiv - * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include <kxarm.h> - -/* CODE **********************************************************************/ - TEXTAREA - - LEAF_ENTRY __rt_udiv - - LEAF_END __rt_udiv - - END -/* EOF */