- Remove inlined gas assembly + c code mix in math.c and write the
functions in real assembly code.
- Fix pch usage and qsort callback definition.
RTL can now be built with msvc.
Modified: trunk/reactos/lib/rtl/i386/math_asm.S
Modified: trunk/reactos/lib/rtl/largeint.c
Deleted: trunk/reactos/lib/rtl/math.c
Modified: trunk/reactos/lib/rtl/qsort.c
Modified: trunk/reactos/lib/rtl/rtl.h
Modified: trunk/reactos/lib/rtl/rtl.xml
_____
Modified: trunk/reactos/lib/rtl/i386/math_asm.S
--- trunk/reactos/lib/rtl/i386/math_asm.S 2005-11-28 22:03:22 UTC
(rev 19728)
+++ trunk/reactos/lib/rtl/i386/math_asm.S 2005-11-28 22:24:37 UTC
(rev 19729)
@@ -28,7 +28,7 @@
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION)
+ * OR SERVICES// LOSS OF USE, DATA, OR PROFITS// OR BUSINESS
INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
OF
@@ -48,12 +48,32 @@
.globl __alldiv
.globl __aulldvrm
.globl __alldvrm
+.globl _atan
+.globl _ceil
+.globl _cos
+.globl _fabs
+.globl _floor
+.globl _log
+.globl _pow
+.globl _sin
+.globl _sqrt
+.globl _tan
+.globl __fltused
+/* DATA
********************************************************************/
+
+fzero:
+ .long 0 // Floating point zero
+ .long 0 // Floating point zero
+
+__fltused:
+ .long 0x9875
+
/* FUNCTIONS
***************************************************************/
/*
* long long
- * __alldiv(long long Dividend, long long Divisor);
+ * __alldiv(long long Dividend, long long Divisor)//
*
* Parameters:
* [ESP+04h] - long long Dividend
@@ -71,7 +91,7 @@
/*
* long long
- * __allmul(long long Multiplier, long long Multiplicand);
+ * __allmul(long long Multiplier, long long Multiplicand)//
*
* Parameters:
* [ESP+04h] - long long Multiplier
@@ -114,7 +134,7 @@
/*
* unsigned long long
- * __aullrem(unsigned long long Dividend, unsigned long long Divisor);
+ * __aullrem(unsigned long long Dividend, unsigned long long Divisor)//
*
* Parameters:
* [ESP+04h] - unsigned long long Dividend
@@ -132,7 +152,7 @@
/*
* long long
- * __allshl(long long Value, unsigned char Shift);
+ * __allshl(long long Value, unsigned char Shift)//
*
* Parameters:
* EDX:EAX - signed long long value to be shifted left
@@ -154,7 +174,7 @@
/*
* long long
- * __allshr(long long Value, unsigned char Shift);
+ * __allshr(long long Value, unsigned char Shift)//
*
* Parameters:
* EDX:EAX - signed long long value to be shifted right
@@ -176,7 +196,7 @@
/*
* unsigned long long
- * __aulldiv(unsigned long long Dividend, unsigned long long Divisor);
+ * __aulldiv(unsigned long long Dividend, unsigned long long Divisor)//
*
* Parameters:
* [ESP+04h] - unsigned long long Dividend
@@ -194,7 +214,7 @@
/*
* unsigned long long
- * __aullshr(unsigned long long Value, unsigned char Shift);
+ * __aullshr(unsigned long long Value, unsigned char Shift)//
*
* Parameters:
* EDX:EAX - unsigned long long value to be shifted right
@@ -215,7 +235,7 @@
/*
* long long
- * __allrem(long long Dividend, long long Divisor);
+ * __allrem(long long Dividend, long long Divisor)//
*
* Parameters:
* [ESP+04h] - long long Dividend
@@ -629,3 +649,188 @@
ret 16
+_atan:
+ push ebp
+ mov ebp,esp
+ fld qword ptr [ebp+8] // Load real from stack
+ fld1 // Load constant 1
+ fpatan // Take the arctangent
+ pop ebp
+ ret
+
+_ceil:
+ push ebp
+ mov ebp,esp
+ sub esp,4 // Allocate temporary space
+ fld qword ptr [ebp+8] // Load real from stack
+ fstcw [ebp-2] // Save control word
+ fclex // Clear exceptions
+ mov word ptr [ebp-4],0xb63 // Rounding control word
+ fldcw [ebp-4] // Set new rounding control
+ frndint // Round to integer
+ fclex // Clear exceptions
+ fldcw [ebp-2] // Restore control word
+ mov esp,ebp // Deallocate temporary space
+ pop ebp
+ ret
+
+_cos:
+ push ebp
+ mov ebp,esp // Point to the stack frame
+ fld qword ptr [ebp+8] // Load real from stack
+ fcos // Take the cosine
+ pop ebp
+ ret
+
+_fabs:
+ push ebp
+ mov ebp,esp
+ fld qword ptr [ebp+8] // Load real from stack
+ fabs // Take the absolute value
+ pop ebp
+ ret
+
+_floor:
+ push ebp
+ mov ebp,esp
+ sub esp,4 // Allocate temporary space
+ fld qword ptr [ebp+8] // Load real from stack
+ fstcw [ebp-2] // Save control word
+ fclex // Clear exceptions
+ mov word ptr [ebp-4],0x763 // Rounding control word
+ fldcw [ebp-4] // Set new rounding control
+ frndint // Round to integer
+ fclex // Clear exceptions
+ fldcw [ebp-2] // Restore control word
+ mov esp,ebp
+ pop ebp
+ ret
+
+_log:
+ push ebp
+ mov ebp,esp
+ fld qword ptr [ebp+8] // Load real from stack
+ fldln2 // Load log base e of 2
+ fxch st(1) // Exchange st, st(1)
+ fyl2x // Compute the natural log(x)
+ pop ebp
+ ret
+
+_pow:
+ push ebp
+ mov ebp,esp
+ sub esp,12 // Allocate temporary space
+ push edi // Save register edi
+ push eax // Save register eax
+ mov dword ptr [ebp-12],0 // Set negation flag to zero
+ fld qword ptr [ebp+16] // Load real from stack
+ fld qword ptr [ebp+8] // Load real from stack
+ mov edi,offset flat:fzero // Point to real zero
+ fcom qword ptr [edi] // Compare x with zero
+ fstsw ax // Get the FPU status word
+ mov al,ah // Move condition flags to AL
+ lahf // Load Flags into AH
+ and al, 0b01000101 // Isolate C0, C2 and C3
+ and ah,not 0b01000101 // Turn off CF, PF and ZF
+ or ah,al // Set new CF, PF and ZF
+ sahf // Store AH into Flags
+ jb __fpow1 // Re-direct if x < 0
+ ja __fpow3 // Re-direct if x > 0
+ fxch // Swap st, st(1)
+ fcom qword ptr [edi] // Compare y with zero
+ fxch // Restore x as top of stack
+ fstsw ax // Get the FPU status word
+ mov al,ah // Move condition flags to AL
+ lahf // Load Flags into AH
+ and al, 0b01000101 // Isolate C0, C2 and C3
+ and ah,not 0b01000101 // Turn off CF, PF and ZF
+ or ah,al // Set new CF, PF and ZF
+ sahf // Store AH into Flags
+ ja __fpow3 // Re-direct if y > 0
+ fstp st(1) // Set new stack top and pop
+ mov eax,1 // Set domain error (EDOM)
+ jmp __fpow5 // End of case
+__fpow1: fxch // Put y on top of
stack
+ fld st // Duplicate y as st(1)
+ frndint // Round to integer
+ fxch // Put y on top of stack
+ fcomp // y = int(y) ?
+ fstsw ax // Get the FPU status word
+ mov al,ah // Move condition flags to AL
+ lahf // Load Flags into AH
+ and al, 0b01000101 // Isolate C0, C2 and C3
+ and ah,not 0b01000101 // Turn off CF, PF and ZF
+ or ah,al // Set new CF, PF and ZF
+ sahf // Store AH into Flags
+ je __fpow2 // Proceed if y = int(y)
+ fstp st(1) // Set new stack top and pop
+ fldz // Set result to zero
+ fstp st(1) // Set new stack top and pop
+ mov eax,1 // Set domain error (EDOM)
+ jmp __fpow5 // End of case
+__fpow2: fist dword ptr [ebp-12] // Store y as integer
+ and dword ptr [ebp-12],1 // Set bit if y is odd
+ fxch // Put x on top of stack
+ fabs // x = |x|
+__fpow3: fldln2 // Load log base e of 2
+ fxch st(1) // Exchange st, st(1)
+ fyl2x // Compute the natural log(x)
+ fmulp // Compute y * ln(x)
+ fldl2e // Load log base 2(e)
+ fmulp st(1),st // Multiply x * log base 2(e)
+ fst st(1) // Push result
+ frndint // Round to integer
+ fsub st(1),st // Subtract
+ fxch // Exchange st, st(1)
+ f2xm1 // Compute 2 to the (x - 1)
+ fld1 // Load real number 1
+ faddp // 2 to the x
+ fscale // Scale by power of 2
+ fstp st(1) // Set new stack top and pop
+ test dword ptr [ebp-12],1 // Negation required ?
+ jz __fpow4 // No, re-direct
+ fchs // Negate the result
+__fpow4: fstp qword ptr [ebp-8] // Save (double)pow(x,
y)
+ fld qword ptr [ebp-8] // Load (double)pow(x, y)
+ fxam // Examine st
+ fstsw ax // Get the FPU status word
+ cmp ah,5 // Infinity ?
+ jne __fpow6 // No, end of case
+ mov eax,2 // Set range error (ERANGE)
+ // Get errno pointer offset
+__fpow5: int 3
+ mov edi,0 // TODO: offset
flat:__crt_errno
+ mov edi,[edi] // Get C errno variable pointer
+ mov dword ptr [edi],eax // Set errno
+__fpow6: pop eax // Restore register eax
+ pop edi // Restore register edi
+ mov esp,ebp // Deallocate temporary space
+ pop ebp
+ ret
+
+_sin:
+ push ebp // Save register bp
+ mov ebp,esp // Point to the stack frame
+ fld qword ptr [ebp+8] // Load real from stack
+ fsin // Take the sine
+ pop ebp // Restore register bp
+ ret
+
+_sqrt:
+ push ebp
+ mov ebp,esp
+ fld qword ptr [ebp+8] // Load real from stack
+ fsqrt // Take the square root
+ pop ebp
+ ret
+
+_tan:
+ push ebp
+ mov ebp,esp
+ sub esp,4 // Allocate temporary space
+ fld qword ptr [ebp+8] // Load real from stack
+ fptan // Take the tangent
+ fstp dword ptr [ebp-4] // Throw away the constant 1
+ mov esp,ebp // Deallocate temporary space
+ pop ebp
+ ret
_____
Modified: trunk/reactos/lib/rtl/largeint.c
--- trunk/reactos/lib/rtl/largeint.c 2005-11-28 22:03:22 UTC (rev
19728)
+++ trunk/reactos/lib/rtl/largeint.c 2005-11-28 22:24:37 UTC (rev
19729)
@@ -7,7 +7,6 @@
/* INCLUDES
*****************************************************************/
-#define NO_RTL_INLINES
#include <rtl.h>
#define NDEBUG
_____
Deleted: trunk/reactos/lib/rtl/math.c
--- trunk/reactos/lib/rtl/math.c 2005-11-28 22:03:22 UTC (rev
19728)
+++ trunk/reactos/lib/rtl/math.c 2005-11-28 22:24:37 UTC (rev
19729)
@@ -1,215 +0,0 @@
-/* COPYRIGHT: See COPYING in the top level directory
- * Copyright (C) 1995, 1996, 1997 Free Software
Foundation, Inc.
- * PROJECT: ReactOS system libraries
- * FILE: lib/rtl/math.c
- * PURPOSE: Math functions for i387.
- * PROGRAMMER: John C. Bowman <bowman(a)ipp-garching.mpg.de>
- */
-
-/* INCLUDES
*****************************************************************/
-
-#include <rtl.h>
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS
*****************************************************************/
-
-double atan (double __x);
-double ceil (double __x);
-double cos (double __x);
-double fabs (double __x);
-double floor (double __x);
-double log (double __x);
-double __log2 (double __x);
-double pow (double __x, double __y);
-double sin (double __x);
-double sqrt (double __x);
-double tan (double __x);
-
-int _fltused = 0x9875;
-
-double atan (double __x)
-{
- register double __val;
- __asm __volatile__
- ("fld1\n\t"
- "fpatan"
- : "=t" (__val) : "0" (__x));
-
- return __val;
-}
-
-/*
- * @implemented
- */
-double ceil (double __x)
-{
- register double __val;
- __volatile unsigned short int __cw, __cwtmp;
-
- __asm __volatile ("fnstcw %0" : "=m" (__cw));
- __cwtmp = (__cw & 0xf3ff) | 0x0800; /* rounding up */
- __asm __volatile ("fldcw %0" : : "m" (__cwtmp));
- __asm __volatile ("frndint" : "=t" (__val) : "0" (__x));
- __asm __volatile ("fldcw %0" : : "m" (__cw));
-
- return __val;
-}
-
-/*
- * @implemented
- */
-double cos (double __x)
-{
- register double __val;
- __asm __volatile__
- ("fcos"
- : "=t" (__val): "0" (__x));
-
- return __val;
-}
-
-/*
- * @implemented
- */
-double fabs (double __x)
-{
- register double __val;
- __asm __volatile__
- ("fabs"
- : "=t" (__val) : "0" (__x));
-
- return __val;
-}
-
-/*
- * @implemented
- */
-double floor (double __x)
-{
- register double __val;
- __volatile unsigned short int __cw, __cwtmp;
-
- __asm __volatile ("fnstcw %0" : "=m" (__cw));
- __cwtmp = (__cw & 0xf3ff) | 0x0400; /* rounding down */
- __asm __volatile ("fldcw %0" : : "m" (__cwtmp));
- __asm __volatile ("frndint" : "=t" (__val) : "0" (__x));
- __asm __volatile ("fldcw %0" : : "m" (__cw));
-
- return __val;
-}
-
-/*
- * @implemented
- */
-double log (double __x)
-{
- register double __val;
- __asm __volatile__
- ("fldln2\n\t"
- "fxch\n\t"
- "fyl2x"
- : "=t" (__val) : "0" (__x));
-
- return __val;
-}
-
-double __log2 (double __x)
-{
- register double __val;
- __asm __volatile__
- ("fld1\n\t"
- "fxch\n\t"
- "fyl2x"
- : "=t" (__val) : "0" (__x));
-
- return __val;
-}
-
-/*
- * @implemented
- */
-double pow (double __x, double __y)
-{
- register double __val, __exponent;
- long __p = (long) __y;
-
- if (__x == 0.0 && __y > 0.0)
- return 0.0;
- if (__y == (double) __p)
- {
- double __r = 1.0;
- if (__p == 0)
- return 1.0;
- if (__p < 0)
- {
- __p = -__p;
- __x = 1.0 / __x;
- }
- while (1)
- {
- if (__p & 1)
- __r *= __x;
- __p >>= 1;
- if (__p == 0)
- return __r;
- __x *= __x;
- }
- /* NOTREACHED */
- }
- __asm __volatile__
- ("fmul %%st(1) # y * log2(x)\n\t"
- "fst %%st(1)\n\t"
- "frndint # int(y * log2(x))\n\t"
- "fxch\n\t"
- "fsub %%st(1) # fract(y * log2(x))\n\t"
- "f2xm1 # 2^(fract(y * log2(x))) - 1\n\t"
- : "=t" (__val), "=u" (__exponent) : "0" (__log2
(__x)), "1"
(__y));
- __val += 1.0;
- __asm __volatile__
- ("fscale"
- : "=t" (__val) : "0" (__val), "u" (__exponent));
-
- return __val;
-}
-
-/*
- * @implemented
- */
-double sin (double __x)
-{
- register double __val;
- __asm __volatile__
- ("fsin"
- : "=t" (__val) : "0" (__x));
-
- return __val;
-}
-
-/*
- * @implemented
- */
-double sqrt (double __x)
-{
- register double __val;
- __asm __volatile__
- ("fsqrt"
- : "=t" (__val) : "0" (__x));
-
- return __val;
-}
-
-/*
- * @implemented
- */
-double tan (double __x)
-{
- register double __val;
- register double __val2 __attribute__ ((unused));
- __asm __volatile__
- ("fptan"
- : "=t" (__val2), "=u" (__val) : "0" (__x));
-
- return __val;
-}
_____
Modified: trunk/reactos/lib/rtl/qsort.c
--- trunk/reactos/lib/rtl/qsort.c 2005-11-28 22:03:22 UTC (rev
19728)
+++ trunk/reactos/lib/rtl/qsort.c 2005-11-28 22:24:37 UTC (rev
19729)
@@ -37,16 +37,15 @@
* FILE: lib/rtl/qsort.c
* PROGRAMMER: Adapted from CygWin newlib 2000-03-12.
*/
+#include <rtl.h>
-#include <stddef.h>
-
#ifndef __GNUC__
#define inline
#endif
/* FIXME: these types should be from the default includes */
-typedef int (* _pfunccmp_t) (char *, char *);
+typedef int (* _pfunccmp_t) (const void *, const void *);
#define min(a,b) ((a)<(b)?(a):(b))
_____
Modified: trunk/reactos/lib/rtl/rtl.h
--- trunk/reactos/lib/rtl/rtl.h 2005-11-28 22:03:22 UTC (rev 19728)
+++ trunk/reactos/lib/rtl/rtl.h 2005-11-28 22:24:37 UTC (rev 19729)
@@ -12,8 +12,9 @@
#define _NTSYSTEM_
#define _NTDLLBUILD_
#define WIN32_NO_STATUS
-#define NTOS_MODE_USER
#define _INC_SWPRINTF_INL_
+#define _CRT_SECURE_NO_DEPRECATE
+#define NO_RTL_INLINES
/* C Headers */
#include <stdio.h>
_____
Modified: trunk/reactos/lib/rtl/rtl.xml
--- trunk/reactos/lib/rtl/rtl.xml 2005-11-28 22:03:22 UTC (rev
19728)
+++ trunk/reactos/lib/rtl/rtl.xml 2005-11-28 22:24:37 UTC (rev
19729)
@@ -34,7 +34,6 @@
<file>handle.c</file>
<file>heap.c</file>
<file>image.c</file>
- <file>math.c</file>
<file>mem.c</file>
<file>message.c</file>
<file>largeint.c</file>