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=…
==============================================================================
--- 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_…
==============================================================================
--- 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/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;
+}
+
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_…
==============================================================================
--- 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(a)reactos.org)
- */
-
-/* INCLUDES ******************************************************************/
-
-#include <kxarm.h>
-
-/* CODE **********************************************************************/
- TEXTAREA
-
- LEAF_ENTRY __rt_udiv
-
- LEAF_END __rt_udiv
-
- END
-/* EOF */