- Make all x86assembly ML compatible
- Remove memcpy, it was duplicated from memmove, copy the label instead
- Guard some code against compilation on msvc, as these functions are intrinsics on MSVC and cannot be implemented
- Fix some x64 assembly (don't modify stack below rsp)

svn path=/branches/cmake-bringup/; revision=49421
This commit is contained in:
Timo Kreuzer 2010-11-02 00:06:33 +00:00
parent 0d7a1c46a0
commit a3623f23de
49 changed files with 912 additions and 918 deletions

View file

@ -335,7 +335,6 @@ list(APPEND CRT_SOURCE
math/i386/ldexp.c math/i386/ldexp.c
math/i386/sqrtf.c math/i386/sqrtf.c
mem/i386/memchr_asm.s mem/i386/memchr_asm.s
mem/i386/memcpy_asm.s
mem/i386/memmove_asm.s mem/i386/memmove_asm.s
mem/i386/memset_asm.s mem/i386/memset_asm.s
string/i386/strcat_asm.s string/i386/strcat_asm.s
@ -516,7 +515,6 @@ endif(ARCH MATCHES i386)
if(ARCH MATCHES i386) if(ARCH MATCHES i386)
list(APPEND LIBCNTPR_SOURCE list(APPEND LIBCNTPR_SOURCE
mem/i386/memchr_asm.s mem/i386/memchr_asm.s
mem/i386/memcpy_asm.s
mem/i386/memmove_asm.s mem/i386/memmove_asm.s
mem/i386/memset_asm.s mem/i386/memset_asm.s
string/i386/strcat_asm.s string/i386/strcat_asm.s

View file

@ -7,8 +7,13 @@
* PROGRAMER: KJK::Hyperion <noog@libero.it> * PROGRAMER: KJK::Hyperion <noog@libero.it>
*/ */
.globl __chkstk #include <reactos/asm.h>
.globl __alloca_probe #include <ndk/asm.h>
#define PAGE_SIZE 4096
PUBLIC __chkstk
PUBLIC __alloca_probe
.code
/* /*
_chkstk() is called by all stack allocations of more than 4 KB. It grows the _chkstk() is called by all stack allocations of more than 4 KB. It grows the
@ -18,49 +23,50 @@
__chkstk: __chkstk:
__alloca_probe: __alloca_probe:
/* EAX = size to be allocated */ /* EAX = size to be allocated */
/* save the ECX register */ /* save the ECX register */
pushl %ecx push ecx
/* ECX = top of the previous stack frame */ /* ECX = top of the previous stack frame */
leal 8(%esp), %ecx lea eax, [esp + 8]
/* probe the desired memory, page by page */ /* probe the desired memory, page by page */
cmpl $0x1000, %eax cmp eax, PAGE_SIZE
jge .l_MoreThanAPage jge .l_MoreThanAPage
jmp .l_LessThanAPage jmp .l_LessThanAPage
.l_MoreThanAPage: .l_MoreThanAPage:
/* raise the top of the stack by a page and probe */ /* raise the top of the stack by a page and probe */
subl $0x1000, %ecx sub ecx, PAGE_SIZE
testl %eax, 0(%ecx) test [ecx], eax
/* loop if still more than a page must be probed */ /* loop if still more than a page must be probed */
subl $0x1000, %eax sub eax, PAGE_SIZE
cmpl $0x1000, %eax cmp eax, PAGE_SIZE
jge .l_MoreThanAPage jge .l_MoreThanAPage
.l_LessThanAPage: .l_LessThanAPage:
/* raise the top of the stack by EAX bytes (size % 4096) and probe */ /* raise the top of the stack by EAX bytes (size % 4096) and probe */
subl %eax, %ecx sub ecx, eax
testl %eax, 0(%ecx) test [ecx], eax
/* EAX = top of the stack */ /* EAX = top of the stack */
movl %esp, %eax mov eax, esp
/* allocate the memory */ /* allocate the memory */
movl %ecx, %esp mov esp, ecx
/* restore ECX */ /* restore ECX */
movl 0(%eax), %ecx mov ecx, [eax]
/* restore the return address */ /* restore the return address */
movl 4(%eax), %eax mov eax, [eax + 4]
pushl %eax push eax
/* return */ /* return */
ret ret
/* EOF */ /* EOF */
END

View file

@ -8,24 +8,26 @@
/* INCLUDES ******************************************************************/ /* INCLUDES ******************************************************************/
#include <reactos/asm.h>
#include <ndk/asm.h> #include <ndk/asm.h>
.intel_syntax noprefix
#define DISPOSITION_DISMISS 0 #define DISPOSITION_DISMISS 0
#define DISPOSITION_CONTINUE_SEARCH 1 #define DISPOSITION_CONTINUE_SEARCH 1
#define DISPOSITION_COLLIDED_UNWIND 3 #define DISPOSITION_COLLIDED_UNWIND 3
EXTERN _RtlUnwind@16:PROC
/* GLOBALS *******************************************************************/ /* GLOBALS *******************************************************************/
.globl __global_unwind2 PUBLIC __global_unwind2
.globl __local_unwind2 PUBLIC __local_unwind2
.globl __abnormal_termination PUBLIC __abnormal_termination
.globl __except_handler2 PUBLIC __except_handler2
.globl __except_handler3 PUBLIC __except_handler3
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
.func unwind_handler .code
_unwind_handler: _unwind_handler:
/* Check if we were unwinding and continue search if not */ /* Check if we were unwinding and continue search if not */
@ -56,9 +58,8 @@ _unwind_handler:
unwind_handler_return: unwind_handler_return:
ret ret
.endfunc
.func _global_unwind2
__global_unwind2: __global_unwind2:
/* Create stack and save all registers */ /* Create stack and save all registers */
@ -85,9 +86,8 @@ glu_return:
mov esp, ebp mov esp, ebp
pop ebp pop ebp
ret ret
.endfunc
.func _abnormal_termination
__abnormal_termination: __abnormal_termination:
/* Assume false */ /* Assume false */
@ -112,9 +112,8 @@ __abnormal_termination:
/* Return */ /* Return */
ab_return: ab_return:
ret ret
.endfunc
.func _local_unwind2
__local_unwind2: __local_unwind2:
/* Save volatiles */ /* Save volatiles */
@ -175,9 +174,8 @@ unwind_return:
pop esi pop esi
pop ebx pop ebx
ret ret
.endfunc
.func _except_handler2
__except_handler2: __except_handler2:
/* Setup stack and save volatiles */ /* Setup stack and save volatiles */
@ -256,7 +254,7 @@ except_loop2:
mov [ebx+12], eax mov [ebx+12], eax
/* Call except handler */ /* Call except handler */
call [edi+ecx*4+8] call dword ptr [edi+ecx*4+8]
except_continue2: except_continue2:
/* Reload try level and except again */ /* Reload try level and except again */
@ -297,9 +295,8 @@ except_return2:
mov esp, ebp mov esp, ebp
pop ebp pop ebp
ret ret
.endfunc
.func _except_handler3
__except_handler3: __except_handler3:
/* Setup stack and save volatiles */ /* Setup stack and save volatiles */
@ -437,4 +434,5 @@ except_return3:
mov esp, ebp mov esp, ebp
pop ebp pop ebp
ret ret
.endfunc
END

View file

@ -1,5 +1,6 @@
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#ifndef _MSC_VER
/* /*
* @implemented * @implemented
*/ */
@ -8,3 +9,4 @@ abs(int j)
{ {
return j<0 ? -j : j; return j<0 ? -j : j;
} }
#endif

View file

@ -17,24 +17,28 @@
PUBLIC ceilf PUBLIC ceilf
ceilf: ceilf:
sub rsp, 16
/* Put parameter on the stack */ /* Put parameter on the stack */
movss [rsp - 0x10], xmm0 movss [rsp], xmm0
fld dword ptr [rsp] fld dword ptr [rsp]
/* Change fpu control word to round up */ /* Change fpu control word to round up */
fstcw [rsp - 0x10] fstcw [rsp + 8]
mov eax, [rsp - 0x10] mov eax, [rsp + 8]
or eax, 0x00800 or eax, 0x00800
and eax, 0x0fbff and eax, 0x0fbff
mov [rsp - 0x08], eax mov [rsp + 12], eax
fldcw [rsp - 0x08] fldcw [rsp + 12]
/* Round to integer */ /* Round to integer */
frndint frndint
/* Restore fpu control word */ /* Restore fpu control word */
fldcw [rsp - 0x10] fldcw [rsp + 8]
fstp dword ptr [rsp - 0x10] fstp dword ptr [rsp]
movss xmm0, [rsp - 0x10] movss xmm0, [rsp]
add rsp, 16
ret ret

View file

@ -17,24 +17,29 @@
PUBLIC floorf PUBLIC floorf
floorf: floorf:
sub rsp, 16
/* Put parameter on the stack */ /* Put parameter on the stack */
movss [rsp - 0x10], xmm0 movss [rsp], xmm0
fld dword ptr [rsp] fld dword ptr [rsp]
/* Change fpu control word to round down */ /* Change fpu control word to round down */
fstcw [rsp - 0x10] fstcw [rsp]
mov eax, [rsp - 0x10] mov eax, [rsp]
or eax, 0x00400 or eax, 0x00400
and eax, 0x0f7ff and eax, 0x0f7ff
mov [rsp - 0x08], eax mov [rsp + 8], eax
fldcw [rsp - 0x08] fldcw [rsp + 8]
/* Round to integer */ /* Round to integer */
frndint frndint
/* Restore fpu control word */ /* Restore fpu control word */
fldcw [rsp - 0x10] fldcw [rsp]
fstp dword ptr [rsp - 0x10] fstp dword ptr [rsp]
movss xmm0, [rsp - 0x10] movss xmm0, [rsp]
add rsp, 16
ret ret
END

View file

@ -34,17 +34,21 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl __alldiv #include <reactos/asm.h>
.globl __fltused
PUBLIC __alldiv
PUBLIC __fltused
/* DATA ********************************************************************/ /* DATA ********************************************************************/
.data
ASSUME CS:NOTHING, DS:NOTHING, ES:NOTHING, FS:NOTHING, GS:NOTHING
__fltused: __fltused:
.long 0x9875 .long HEX(9875)
.intel_syntax noprefix
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
// //
// lldiv - signed long divide // lldiv - signed long divide
@ -222,3 +226,5 @@ L8:
pop edi pop edi
ret 16 ret 16
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl __alldvrm #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC __alldvrm
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
__alldvrm: __alldvrm:
push edi push edi
@ -88,7 +89,7 @@ __alldvrm:
mov eax,DVNDHI // hi word of a mov eax,DVNDHI // hi word of a
or eax,eax // test to see if signed or eax,eax // test to see if signed
jge short ....L1 // skip rest if a is already positive jge short .L1 // skip rest if a is already positive
inc edi // complement result sign flag inc edi // complement result sign flag
inc ebp // complement result sign flag inc ebp // complement result sign flag
mov edx,DVNDLO // lo word of a mov edx,DVNDLO // lo word of a
@ -97,10 +98,10 @@ __alldvrm:
sbb eax,0 sbb eax,0
mov DVNDHI,eax // save positive value mov DVNDHI,eax // save positive value
mov DVNDLO,edx mov DVNDLO,edx
....L1: .L1:
mov eax,DVSRHI // hi word of b mov eax,DVSRHI // hi word of b
or eax,eax // test to see if signed or eax,eax // test to see if signed
jge short ....L2 // skip rest if b is already positive jge short .L2 // skip rest if b is already positive
inc edi // complement the result sign flag inc edi // complement the result sign flag
mov edx,DVSRLO // lo word of a mov edx,DVSRLO // lo word of a
neg eax // make b positive neg eax // make b positive
@ -108,7 +109,7 @@ __alldvrm:
sbb eax,0 sbb eax,0
mov DVSRHI,eax // save positive value mov DVSRHI,eax // save positive value
mov DVSRLO,edx mov DVSRLO,edx
....L2: .L2:
// //
// Now do the divide. First look to see if the divisor is less than 4194304K. // Now do the divide. First look to see if the divisor is less than 4194304K.
@ -119,7 +120,7 @@ __alldvrm:
// //
or eax,eax // check to see if divisor < 4194304K or eax,eax // check to see if divisor < 4194304K
jnz short ....L3 // nope, gotta do this the hard way jnz short .L3 // nope, gotta do this the hard way
mov ecx,DVSRLO // load divisor mov ecx,DVSRLO // load divisor
mov eax,DVNDHI // load high word of dividend mov eax,DVNDHI // load high word of dividend
xor edx,edx xor edx,edx
@ -137,24 +138,24 @@ __alldvrm:
mov eax,esi // set up low word of quotient mov eax,esi // set up low word of quotient
mul dword ptr DVSRLO // LOWORD(QUOT) * DVSR mul dword ptr DVSRLO // LOWORD(QUOT) * DVSR
add edx,ecx // EDX:EAX = QUOT * DVSR add edx,ecx // EDX:EAX = QUOT * DVSR
jmp short ....L4 // complete remainder calculation jmp short .L4 // complete remainder calculation
// //
// Here we do it the hard way. Remember, eax contains the high word of DVSR // Here we do it the hard way. Remember, eax contains the high word of DVSR
// //
....L3: .L3:
mov ebx,eax // ebx:ecx <- divisor mov ebx,eax // ebx:ecx <- divisor
mov ecx,DVSRLO mov ecx,DVSRLO
mov edx,DVNDHI // edx:eax <- dividend mov edx,DVNDHI // edx:eax <- dividend
mov eax,DVNDLO mov eax,DVNDLO
....L5: .L5:
shr ebx,1 // shift divisor right one bit shr ebx,1 // shift divisor right one bit
rcr ecx,1 rcr ecx,1
shr edx,1 // shift dividend right one bit shr edx,1 // shift dividend right one bit
rcr eax,1 rcr eax,1
or ebx,ebx or ebx,ebx
jnz short ....L5 // loop until divisor < 4194304K jnz short .L5 // loop until divisor < 4194304K
div ecx // now divide, ignore remainder div ecx // now divide, ignore remainder
mov esi,eax // save quotient mov esi,eax // save quotient
@ -170,7 +171,7 @@ __alldvrm:
mov eax,DVSRLO mov eax,DVSRLO
mul esi // QUOT * DVSRLO mul esi // QUOT * DVSRLO
add edx,ecx // EDX:EAX = QUOT * DVSR add edx,ecx // EDX:EAX = QUOT * DVSR
jc short ....L6 // carry means Quotient is off by 1 jc short .L6 // carry means Quotient is off by 1
// //
// do long compare here between original dividend and the result of the // do long compare here between original dividend and the result of the
@ -179,18 +180,18 @@ __alldvrm:
// //
cmp edx,DVNDHI // compare hi words of result and original cmp edx,DVNDHI // compare hi words of result and original
ja short ....L6 // if result > original, do subtract ja short .L6 // if result > original, do subtract
jb short ....L7 // if result < original, we are ok jb short .L7 // if result < original, we are ok
cmp eax,DVNDLO // hi words are equal, compare lo words cmp eax,DVNDLO // hi words are equal, compare lo words
jbe short ....L7 // if less or equal we are ok, else subtract jbe short .L7 // if less or equal we are ok, else subtract
....L6: .L6:
dec esi // subtract 1 from quotient dec esi // subtract 1 from quotient
sub eax,DVSRLO // subtract divisor from result sub eax,DVSRLO // subtract divisor from result
sbb edx,DVSRHI sbb edx,DVSRHI
....L7: .L7:
xor ebx,ebx // ebx:esi <- quotient xor ebx,ebx // ebx:esi <- quotient
....L4: .L4:
// //
// Calculate remainder by subtracting the result from the original dividend. // Calculate remainder by subtracting the result from the original dividend.
// Since the result is already in a register, we will do the subtract in the // Since the result is already in a register, we will do the subtract in the
@ -208,7 +209,7 @@ __alldvrm:
// //
dec ebp // check result sign flag dec ebp // check result sign flag
jns short ....L9 // result is ok, set up the quotient jns short .L9 // result is ok, set up the quotient
neg edx // otherwise, negate the result neg edx // otherwise, negate the result
neg eax neg eax
sbb edx,0 sbb edx,0
@ -216,7 +217,7 @@ __alldvrm:
// //
// Now we need to get the quotient into edx:eax and the remainder into ebx:ecx. // Now we need to get the quotient into edx:eax and the remainder into ebx:ecx.
// //
....L9: .L9:
mov ecx,edx mov ecx,edx
mov edx,ebx mov edx,ebx
mov ebx,ecx mov ebx,ecx
@ -229,7 +230,7 @@ __alldvrm:
// //
dec edi // check to see if result is negative dec edi // check to see if result is negative
jnz short ....L8 // if EDI == 0, result should be negative jnz short .L8 // if EDI == 0, result should be negative
neg edx // otherwise, negate the result neg edx // otherwise, negate the result
neg eax neg eax
sbb edx,0 sbb edx,0
@ -238,9 +239,11 @@ __alldvrm:
// Restore the saved registers and return. // Restore the saved registers and return.
// //
....L8: .L8:
pop ebp pop ebp
pop esi pop esi
pop edi pop edi
ret 16 ret 16
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl __allmul #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC __allmul
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
// //
// llmul - long multiply routine // llmul - long multiply routine
@ -113,3 +114,4 @@ hard:
ret 16 // callee restores the stack ret 16 // callee restores the stack
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl __allrem #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC __allrem
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
// //
// llrem - signed long remainder // llrem - signed long remainder
@ -227,3 +228,5 @@ __allrem :
pop ebx pop ebx
ret 16 ret 16
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl __allshl #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC __allshl
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
// //
// llshl - long shift left // llshl - long shift left
@ -92,3 +93,5 @@ RETZERO:
xor eax,eax xor eax,eax
xor edx,edx xor edx,edx
ret ret
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl __allshr #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC __allshr
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
// //
// llshr - long shift right // llshr - long shift right
@ -93,3 +94,5 @@ __allshr:
sar edx,31 sar edx,31
mov eax,edx mov eax,edx
ret ret
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl _atan #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC _atan
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
_atan: _atan:
push ebp push ebp
@ -48,3 +49,5 @@ _atan:
fpatan // Take the arctangent fpatan // Take the arctangent
pop ebp pop ebp
ret ret
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl __aulldiv #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC __aulldiv
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
// //
// ulldiv - unsigned long divide // ulldiv - unsigned long divide
@ -105,7 +106,7 @@ __aulldiv:
mov eax,DVSRHI // check to see if divisor < 4194304K mov eax,DVSRHI // check to see if divisor < 4194304K
or eax,eax or eax,eax
jnz short ..L1 // nope, gotta do this the hard way jnz short .L1 // nope, gotta do this the hard way
mov ecx,DVSRLO // load divisor mov ecx,DVSRLO // load divisor
mov eax,DVNDHI // load high word of dividend mov eax,DVNDHI // load high word of dividend
xor edx,edx xor edx,edx
@ -114,24 +115,24 @@ __aulldiv:
mov eax,DVNDLO // edx:eax <- remainder:lo word of dividend mov eax,DVNDLO // edx:eax <- remainder:lo word of dividend
div ecx // get low order bits of quotient div ecx // get low order bits of quotient
mov edx,ebx // edx:eax <- quotient hi:quotient lo mov edx,ebx // edx:eax <- quotient hi:quotient lo
jmp short ..L2 // restore stack and return jmp short .L2 // restore stack and return
// //
// Here we do it the hard way. Remember, eax contains DVSRHI // Here we do it the hard way. Remember, eax contains DVSRHI
// //
..L1: .L1:
mov ecx,eax // ecx:ebx <- divisor mov ecx,eax // ecx:ebx <- divisor
mov ebx,DVSRLO mov ebx,DVSRLO
mov edx,DVNDHI // edx:eax <- dividend mov edx,DVNDHI // edx:eax <- dividend
mov eax,DVNDLO mov eax,DVNDLO
..L3: .L3:
shr ecx,1 // shift divisor right one bit// hi bit <- 0 shr ecx,1 // shift divisor right one bit// hi bit <- 0
rcr ebx,1 rcr ebx,1
shr edx,1 // shift dividend right one bit// hi bit <- 0 shr edx,1 // shift dividend right one bit// hi bit <- 0
rcr eax,1 rcr eax,1
or ecx,ecx or ecx,ecx
jnz short ..L3 // loop until divisor < 4194304K jnz short .L3 // loop until divisor < 4194304K
div ebx // now divide, ignore remainder div ebx // now divide, ignore remainder
mov esi,eax // save quotient mov esi,eax // save quotient
@ -147,7 +148,7 @@ __aulldiv:
mov eax,DVSRLO mov eax,DVSRLO
mul esi // QUOT * DVSRLO mul esi // QUOT * DVSRLO
add edx,ecx // EDX:EAX = QUOT * DVSR add edx,ecx // EDX:EAX = QUOT * DVSR
jc short ..L4 // carry means Quotient is off by 1 jc short .L4 // carry means Quotient is off by 1
// //
// do long compare here between original dividend and the result of the // do long compare here between original dividend and the result of the
@ -156,13 +157,13 @@ __aulldiv:
// //
cmp edx,DVNDHI // compare hi words of result and original cmp edx,DVNDHI // compare hi words of result and original
ja short ..L4 // if result > original, do subtract ja short .L4 // if result > original, do subtract
jb short ..L5 // if result < original, we are ok jb short .L5 // if result < original, we are ok
cmp eax,DVNDLO // hi words are equal, compare lo words cmp eax,DVNDLO // hi words are equal, compare lo words
jbe short ..L5 // if less or equal we are ok, else subtract jbe short .L5 // if less or equal we are ok, else subtract
..L4: .L4:
dec esi // subtract 1 from quotient dec esi // subtract 1 from quotient
..L5: .L5:
xor edx,edx // edx:eax <- quotient xor edx,edx // edx:eax <- quotient
mov eax,esi mov eax,esi
@ -171,9 +172,11 @@ __aulldiv:
// Restore the saved registers and return. // Restore the saved registers and return.
// //
..L2: .L2:
pop esi pop esi
pop ebx pop ebx
ret 16 ret 16
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl __aulldvrm #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC __aulldvrm
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
__aulldvrm: __aulldvrm:
@ -101,7 +102,7 @@ __aulldvrm:
mov eax,DVSRHI // check to see if divisor < 4194304K mov eax,DVSRHI // check to see if divisor < 4194304K
or eax,eax or eax,eax
jnz short .....L1 // nope, gotta do this the hard way jnz short .L1 // nope, gotta do this the hard way
mov ecx,DVSRLO // load divisor mov ecx,DVSRLO // load divisor
mov eax,DVNDHI // load high word of dividend mov eax,DVNDHI // load high word of dividend
xor edx,edx xor edx,edx
@ -120,24 +121,24 @@ __aulldvrm:
mov eax,esi // set up low word of quotient mov eax,esi // set up low word of quotient
mul dword ptr DVSRLO // LOWORD(QUOT) * DVSR mul dword ptr DVSRLO // LOWORD(QUOT) * DVSR
add edx,ecx // EDX:EAX = QUOT * DVSR add edx,ecx // EDX:EAX = QUOT * DVSR
jmp short .....L2 // complete remainder calculation jmp short .L2 // complete remainder calculation
// //
// Here we do it the hard way. Remember, eax contains DVSRHI // Here we do it the hard way. Remember, eax contains DVSRHI
// //
.....L1: .L1:
mov ecx,eax // ecx:ebx <- divisor mov ecx,eax // ecx:ebx <- divisor
mov ebx,DVSRLO mov ebx,DVSRLO
mov edx,DVNDHI // edx:eax <- dividend mov edx,DVNDHI // edx:eax <- dividend
mov eax,DVNDLO mov eax,DVNDLO
.....L3: .L3:
shr ecx,1 // shift divisor right one bit// hi bit <- 0 shr ecx,1 // shift divisor right one bit// hi bit <- 0
rcr ebx,1 rcr ebx,1
shr edx,1 // shift dividend right one bit// hi bit <- 0 shr edx,1 // shift dividend right one bit// hi bit <- 0
rcr eax,1 rcr eax,1
or ecx,ecx or ecx,ecx
jnz short .....L3 // loop until divisor < 4194304K jnz short .L3 // loop until divisor < 4194304K
div ebx // now divide, ignore remainder div ebx // now divide, ignore remainder
mov esi,eax // save quotient mov esi,eax // save quotient
@ -153,7 +154,7 @@ __aulldvrm:
mov eax,DVSRLO mov eax,DVSRLO
mul esi // QUOT * DVSRLO mul esi // QUOT * DVSRLO
add edx,ecx // EDX:EAX = QUOT * DVSR add edx,ecx // EDX:EAX = QUOT * DVSR
jc short .....L4 // carry means Quotient is off by 1 jc short .L4 // carry means Quotient is off by 1
// //
// do long compare here between original dividend and the result of the // do long compare here between original dividend and the result of the
@ -162,18 +163,18 @@ __aulldvrm:
// //
cmp edx,DVNDHI // compare hi words of result and original cmp edx,DVNDHI // compare hi words of result and original
ja short .....L4 // if result > original, do subtract ja short .L4 // if result > original, do subtract
jb short .....L5 // if result < original, we are ok jb short .L5 // if result < original, we are ok
cmp eax,DVNDLO // hi words are equal, compare lo words cmp eax,DVNDLO // hi words are equal, compare lo words
jbe short .....L5 // if less or equal we are ok, else subtract jbe short .L5 // if less or equal we are ok, else subtract
.....L4: .L4:
dec esi // subtract 1 from quotient dec esi // subtract 1 from quotient
sub eax,DVSRLO // subtract divisor from result sub eax,DVSRLO // subtract divisor from result
sbb edx,DVSRHI sbb edx,DVSRHI
.....L5: .L5:
xor ebx,ebx // ebx:esi <- quotient xor ebx,ebx // ebx:esi <- quotient
.....L2: .L2:
// //
// Calculate remainder by subtracting the result from the original dividend. // Calculate remainder by subtracting the result from the original dividend.
// Since the result is already in a register, we will do the subtract in the // Since the result is already in a register, we will do the subtract in the
@ -202,3 +203,5 @@ __aulldvrm:
pop esi pop esi
ret 16 ret 16
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl __aullrem #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC __aullrem
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
// //
// ullrem - unsigned long remainder // ullrem - unsigned long remainder
@ -101,7 +102,7 @@ __aullrem:
mov eax,DVSRHI // check to see if divisor < 4194304K mov eax,DVSRHI // check to see if divisor < 4194304K
or eax,eax or eax,eax
jnz short ...L1 // nope, gotta do this the hard way jnz short .L1 // nope, gotta do this the hard way
mov ecx,DVSRLO // load divisor mov ecx,DVSRLO // load divisor
mov eax,DVNDHI // load high word of dividend mov eax,DVNDHI // load high word of dividend
xor edx,edx xor edx,edx
@ -110,24 +111,24 @@ __aullrem:
div ecx // edx <- final remainder div ecx // edx <- final remainder
mov eax,edx // edx:eax <- remainder mov eax,edx // edx:eax <- remainder
xor edx,edx xor edx,edx
jmp short ...L2 // restore stack and return jmp short .L2 // restore stack and return
// //
// Here we do it the hard way. Remember, eax contains DVSRHI // Here we do it the hard way. Remember, eax contains DVSRHI
// //
...L1: .L1:
mov ecx,eax // ecx:ebx <- divisor mov ecx,eax // ecx:ebx <- divisor
mov ebx,DVSRLO mov ebx,DVSRLO
mov edx,DVNDHI // edx:eax <- dividend mov edx,DVNDHI // edx:eax <- dividend
mov eax,DVNDLO mov eax,DVNDLO
...L3: .L3:
shr ecx,1 // shift divisor right one bit// hi bit <- 0 shr ecx,1 // shift divisor right one bit// hi bit <- 0
rcr ebx,1 rcr ebx,1
shr edx,1 // shift dividend right one bit// hi bit <- 0 shr edx,1 // shift dividend right one bit// hi bit <- 0
rcr eax,1 rcr eax,1
or ecx,ecx or ecx,ecx
jnz short ...L3 // loop until divisor < 4194304K jnz short .L3 // loop until divisor < 4194304K
div ebx // now divide, ignore remainder div ebx // now divide, ignore remainder
// //
@ -142,7 +143,7 @@ __aullrem:
xchg ecx,eax // put partial product in ECX, get quotient in EAX xchg ecx,eax // put partial product in ECX, get quotient in EAX
mul dword ptr DVSRLO mul dword ptr DVSRLO
add edx,ecx // EDX:EAX = QUOT * DVSR add edx,ecx // EDX:EAX = QUOT * DVSR
jc short ...L4 // carry means Quotient is off by 1 jc short .L4 // carry means Quotient is off by 1
// //
// do long compare here between original dividend and the result of the // do long compare here between original dividend and the result of the
@ -151,14 +152,14 @@ __aullrem:
// //
cmp edx,DVNDHI // compare hi words of result and original cmp edx,DVNDHI // compare hi words of result and original
ja short ...L4 // if result > original, do subtract ja short .L4 // if result > original, do subtract
jb short ...L5 // if result < original, we're ok jb short .L5 // if result < original, we're ok
cmp eax,DVNDLO // hi words are equal, compare lo words cmp eax,DVNDLO // hi words are equal, compare lo words
jbe short ...L5 // if less or equal we're ok, else subtract jbe short .L5 // if less or equal we're ok, else subtract
...L4: .L4:
sub eax,DVSRLO // subtract divisor from result sub eax,DVSRLO // subtract divisor from result
sbb edx,DVSRHI sbb edx,DVSRHI
...L5: .L5:
// //
// Calculate remainder by subtracting the result from the original dividend. // Calculate remainder by subtracting the result from the original dividend.
@ -177,8 +178,10 @@ __aullrem:
// Restore the saved registers and return. // Restore the saved registers and return.
// //
...L2: .L2:
pop ebx pop ebx
ret 16 ret 16
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl __aullshr #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC __aullshr
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
// //
// ullshr - long shift right // ullshr - long shift right
@ -65,13 +66,13 @@ __aullshr:
// depends only on the high order bit of edx). // depends only on the high order bit of edx).
// //
cmp cl,64 cmp cl,64
jae short ..RETZERO jae short .RETZERO
// //
// Handle shifts of between 0 and 31 bits // Handle shifts of between 0 and 31 bits
// //
cmp cl, 32 cmp cl, 32
jae short ..MORE32 jae short .MORE32
shrd eax,edx,cl shrd eax,edx,cl
shr edx,cl shr edx,cl
ret ret
@ -79,7 +80,7 @@ __aullshr:
// //
// Handle shifts of between 32 and 63 bits // Handle shifts of between 32 and 63 bits
// //
..MORE32: .MORE32:
mov eax,edx mov eax,edx
xor edx,edx xor edx,edx
and cl,31 and cl,31
@ -89,7 +90,9 @@ __aullshr:
// //
// return 0 in edx:eax // return 0 in edx:eax
// //
..RETZERO: .RETZERO:
xor eax,eax xor eax,eax
xor edx,edx xor edx,edx
ret ret
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl _ceil #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC _ceil
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
_ceil: _ceil:
push ebp push ebp
@ -47,7 +48,7 @@ _ceil:
fld qword ptr [ebp+8] // Load real from stack fld qword ptr [ebp+8] // Load real from stack
fstcw [ebp-2] // Save control word fstcw [ebp-2] // Save control word
fclex // Clear exceptions fclex // Clear exceptions
mov word ptr [ebp-4],0xb63 // Rounding control word mov word ptr [ebp-4], HEX(0b63) // Rounding control word
fldcw [ebp-4] // Set new rounding control fldcw [ebp-4] // Set new rounding control
frndint // Round to integer frndint // Round to integer
fclex // Clear exceptions fclex // Clear exceptions
@ -55,3 +56,5 @@ _ceil:
mov esp,ebp // Deallocate temporary space mov esp,ebp // Deallocate temporary space
pop ebp pop ebp
ret ret
END

View file

@ -3,53 +3,34 @@
* This file is part of the w64 mingw-runtime package. * This file is part of the w64 mingw-runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package. * No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/ */
#include <_mingw_mac.h>
.file "ceilf.S" #include <reactos/asm.h>
.text
.align 4
.globl __MINGW_USYMBOL(ceilf)
.def __MINGW_USYMBOL(ceilf); .scl 2; .type 32; .endef
__MINGW_USYMBOL(ceilf):
#ifdef _WIN64
subq $24,%rsp
movss %xmm0,8(%rsp)
flds 8(%rsp)
fstcw 4(%rsp) /* store fpu control word */ .code
.align 4
movl $0x0800,%edx /* round towards +oo */ PUBLIC _ceilf
orl 4(%rsp),%edx _ceilf:
andl $0xfbff,%edx
movl %edx,(%rsp)
fldcw (%rsp) /* load modified control word */
frndint /* round */ fld dword ptr [esp + 4]
sub esp, 8
fldcw 4(%rsp) /* restore original control word */ fstcw [esp + 4] /* store fpu control word */
fstps 8(%rsp)
movss 8(%rsp),%xmm0
addq $24,%rsp
ret
#else
flds 4(%esp)
subl $8,%esp
fstcw 4(%esp) /* store fpu control word */
/* We use here %edx although only the low 1 bits are defined. /* We use here %edx although only the low 1 bits are defined.
But none of the operations should care and they are faster But none of the operations should care and they are faster
than the 16 bit operations. */ than the 16 bit operations. */
movl $0x0800,%edx /* round towards +oo */ mov edx, [esp + 4]
orl 4(%esp),%edx or edx, HEX(0800) /* round towards +oo */
andl $0xfbff,%edx and edx, HEX(fbff)
movl %edx,(%esp) mov [esp], edx
fldcw (%esp) /* load modified control word */ fldcw [esp] /* load modified control word */
frndint /* round */ frndint /* round */
fldcw 4(%esp) /* restore original control word */ fldcw [esp + 4] /* restore original control word */
addl $8,%esp add esp, 8
ret ret
#endif
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl _cos #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC _cos
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
_cos: _cos:
push ebp push ebp
@ -47,3 +48,5 @@ _cos:
fcos // Take the cosine fcos // Take the cosine
pop ebp pop ebp
ret ret
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl _fabs #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC _fabs
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
_fabs: _fabs:
push ebp push ebp
@ -47,3 +48,5 @@ _fabs:
fabs // Take the absolute value fabs // Take the absolute value
pop ebp pop ebp
ret ret
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl _floor #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC _floor
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
_floor: _floor:
push ebp push ebp
@ -47,7 +48,7 @@ _floor:
fld qword ptr [ebp+8] // Load real from stack fld qword ptr [ebp+8] // Load real from stack
fstcw [ebp-2] // Save control word fstcw [ebp-2] // Save control word
fclex // Clear exceptions fclex // Clear exceptions
mov word ptr [ebp-4],0x763 // Rounding control word mov word ptr [ebp-4], HEX(0763) // Rounding control word
fldcw [ebp-4] // Set new rounding control fldcw [ebp-4] // Set new rounding control
frndint // Round to integer frndint // Round to integer
fclex // Clear exceptions fclex // Clear exceptions
@ -55,3 +56,5 @@ _floor:
mov esp,ebp mov esp,ebp
pop ebp pop ebp
ret ret
END

View file

@ -7,57 +7,34 @@
* Removed header file dependency for use in libmingwex.a by * Removed header file dependency for use in libmingwex.a by
* Danny Smith <dannysmith@users.sourceforge.net> * Danny Smith <dannysmith@users.sourceforge.net>
*/ */
#include <_mingw_mac.h>
.file "floorf.S" #include <reactos/asm.h>
.text
#ifdef _WIN64
.align 8
#else
.align 4
#endif
.globl __MINGW_USYMBOL(floorf)
.def __MINGW_USYMBOL(floorf); .scl 2; .type 32; .endef
__MINGW_USYMBOL(floorf):
#ifdef _WIN64
subq $24,%rsp
movss %xmm0,8(%rsp)
flds 8(%rsp)
fstcw 4(%rsp) /* store fpu control word */ .code
movl $0x400,%edx /* round towards -oo */ .align 4
orl 4(%rsp),%edx
andl $0xf7ff,%edx
movl %edx,(%rsp)
fldcw (%rsp) /* load modified control word */
frndint /* round */ PUBLIC _floorf
_floorf:
fldcw 4(%rsp) /* restore original control word */ fld dword ptr [esp + 4]
sub esp, 8
fstps 8(%rsp) fstcw [esp + 4] /* store fpu control word */
movss 8(%rsp),%xmm0
addq $24,%rsp
ret
#else
flds 4(%esp)
subl $8,%esp
fstcw 4(%esp) /* store fpu control word */
/* We use here %edx although only the low 1 bits are defined. /* We use here %edx although only the low 1 bits are defined.
But none of the operations should care and they are faster But none of the operations should care and they are faster
than the 16 bit operations. */ than the 16 bit operations. */
movl $0x400,%edx /* round towards -oo */ mov edx, [esp + 4]
orl 4(%esp),%edx or edx, HEX(0400) /* round towards -oo */
andl $0xf7ff,%edx and edx, HEX(0f7ff)
movl %edx,(%esp) mov [esp], edx
fldcw (%esp) /* load modified control word */ fldcw [esp] /* load modified control word */
frndint /* round */ frndint /* round */
fldcw 4(%esp) /* restore original control word */ fldcw [esp + 4] /* restore original control word */
addl $8,%esp add esp, 8
ret ret
#endif
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl __ftol #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC __ftol
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
/* /*
* This routine is called by MSVC-generated code to convert from floating point * This routine is called by MSVC-generated code to convert from floating point
@ -54,7 +55,7 @@ __ftol:
fstcw [ebp-2] fstcw [ebp-2]
wait wait
mov ax, [ebp-2] mov ax, [ebp-2]
or ah, 0xC or ah, 12
mov [ebp-4], ax mov [ebp-4], ax
fldcw [ebp-4] fldcw [ebp-4]
@ -71,3 +72,5 @@ __ftol:
/* Remove stack frame and return*/ /* Remove stack frame and return*/
leave leave
ret ret
END

View file

@ -8,11 +8,12 @@
* *
*/ */
.globl _log10 #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC _log10
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
_log10: _log10:
@ -25,3 +26,4 @@ _log10:
pop ebp pop ebp
ret ret
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl _log #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC _log
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
_log: _log:
push ebp push ebp
@ -49,3 +50,5 @@ _log:
fyl2x // Compute the natural log(x) fyl2x // Compute the natural log(x)
pop ebp pop ebp
ret ret
END

View file

@ -19,41 +19,54 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
/* Reacros modifications */ /* Reactos modifications */
#include <reactos/asm.h>
#define ALIGNARG(log2) log2 #define ALIGNARG(log2) log2
#define ASM_TYPE_DIRECTIVE(name,typearg) #define ASM_TYPE_DIRECTIVE(name,typearg)
#define ASM_SIZE_DIRECTIVE(name) #define ASM_SIZE_DIRECTIVE(name)
#define cfi_adjust_cfa_offset(x) #define cfi_adjust_cfa_offset(x)
#define ENTRY(x)
#define END(x)
.global _pow
PUBLIC _pow
.data
.text .text
ASSUME CS:NOTHING, DS:NOTHING, ES:NOTHING, FS:NOTHING, GS:NOTHING
.align ALIGNARG(4) .align ALIGNARG(4)
ASM_TYPE_DIRECTIVE(infinity,@object) ASM_TYPE_DIRECTIVE(infinity,@object)
inf_zero: inf_zero:
infinity: infinity:
.byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f .byte 0, 0, 0, 0, 0, 0, HEX(f0), HEX(7f)
ASM_SIZE_DIRECTIVE(infinity) ASM_SIZE_DIRECTIVE(infinity)
ASM_TYPE_DIRECTIVE(zero,@object) ASM_TYPE_DIRECTIVE(zero,@object)
zero: .double 0.0 zero:
.double 0.0
ASM_SIZE_DIRECTIVE(zero) ASM_SIZE_DIRECTIVE(zero)
ASM_TYPE_DIRECTIVE(minf_mzero,@object) ASM_TYPE_DIRECTIVE(minf_mzero,@object)
minf_mzero: minf_mzero:
minfinity: minfinity:
.byte 0, 0, 0, 0, 0, 0, 0xf0, 0xff .byte 0, 0, 0, 0, 0, 0, HEX(f0), HEX(ff)
mzero: mzero:
.byte 0, 0, 0, 0, 0, 0, 0, 0x80 .byte 0, 0, 0, 0, 0, 0, 0, HEX(80)
ASM_SIZE_DIRECTIVE(minf_mzero) ASM_SIZE_DIRECTIVE(minf_mzero)
ASM_TYPE_DIRECTIVE(one,@object) ASM_TYPE_DIRECTIVE(one,@object)
one: .double 1.0
one:
.double 1.0
ASM_SIZE_DIRECTIVE(one) ASM_SIZE_DIRECTIVE(one)
ASM_TYPE_DIRECTIVE(limit,@object) ASM_TYPE_DIRECTIVE(limit,@object)
limit: .double 0.29
limit:
.double 0.29
ASM_SIZE_DIRECTIVE(limit) ASM_SIZE_DIRECTIVE(limit)
ASM_TYPE_DIRECTIVE(p63,@object) ASM_TYPE_DIRECTIVE(p63,@object)
p63: .byte 0, 0, 0, 0, 0, 0, 0xe0, 0x43
p63:
.byte 0, 0, 0, 0, 0, 0, HEX(e0), HEX(43)
ASM_SIZE_DIRECTIVE(p63) ASM_SIZE_DIRECTIVE(p63)
#ifdef PIC #ifdef PIC
@ -61,308 +74,310 @@ p63: .byte 0, 0, 0, 0, 0, 0, 0xe0, 0x43
#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f) #define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
#else #else
#define MO(op) op #define MO(op) op
#define MOX(op,x,f) op(,x,f) #define MOX(op,x,f) op[x*f]
#endif #endif
.code
.text .text
_pow: _pow:
ENTRY(__ieee754_pow) fld qword ptr [esp + 12] // y
fldl 12(%esp) // y
fxam fxam
#ifdef PIC #ifdef PIC
LOAD_PIC_REG (cx) LOAD_PIC_REG (cx)
#endif #endif
fnstsw fnstsw ax
movb %ah, %dl mov dl, ah
andb $0x45, %ah and ah, HEX(045)
cmpb $0x40, %ah // is y == 0 ? cmp ah, HEX(040) // is y == 0 ?
je 11f je L11
cmpb $0x05, %ah // is y == ±inf ? cmp ah, 5 // is y == ±inf ?
je 12f je L12
cmpb $0x01, %ah // is y == NaN ? cmp ah, 1 // is y == NaN ?
je 30f je L30
fldl 4(%esp) // x : y fld qword ptr [esp + 4] // x : y
subl $8,%esp sub esp, 8
cfi_adjust_cfa_offset (8) cfi_adjust_cfa_offset (8)
fxam fxam
fnstsw fnstsw ax
movb %ah, %dh mov dh, ah
andb $0x45, %ah and ah, HEX(45)
cmpb $0x40, %ah cmp ah, HEX(040)
je 20f // x is ±0 je L20 // x is ±0
cmpb $0x05, %ah cmp ah, 5
je 15f // x is ±inf je L15 // x is ±inf
fxch // y : x fxch st(1) // y : x
/* fistpll raises invalid exception for |y| >= 1L<<63. */ /* fistpll raises invalid exception for |y| >= 1L<<63. */
fld %st // y : y : x fld st // y : y : x
fabs // |y| : y : x fabs // |y| : y : x
fcompl MO(p63) // y : x fcomp qword ptr MO(p63) // y : x
fnstsw fnstsw ax
sahf sahf
jnc 2f jnc L2
/* First see whether `y' is a natural number. In this case we /* First see whether `y' is a natural number. In this case we
can use a more precise algorithm. */ can use a more precise algorithm. */
fld %st // y : y : x fld st // y : y : x
fistpll (%esp) // y : x fistp qword ptr [esp] // y : x
fildll (%esp) // int(y) : y : x fild qword ptr [esp] // int(y) : y : x
fucomp %st(1) // y : x fucomp st(1) // y : x
fnstsw fnstsw ax
sahf sahf
jne 2f jne L2
/* OK, we have an integer value for y. */ /* OK, we have an integer value for y. */
popl %eax pop eax
cfi_adjust_cfa_offset (-4) cfi_adjust_cfa_offset (-4)
popl %edx pop edx
cfi_adjust_cfa_offset (-4) cfi_adjust_cfa_offset (-4)
orl $0, %edx or edx, 0
fstp %st(0) // x fstp st // x
jns 4f // y >= 0, jump jns L4 // y >= 0, jump
fdivrl MO(one) // 1/x (now referred to as x) fdivr qword ptr MO(one) // 1/x (now referred to as x)
negl %eax neg eax
adcl $0, %edx adc edx, 0
negl %edx neg edx
4: fldl MO(one) // 1 : x L4: fld qword ptr MO(one) // 1 : x
fxch fxch st(1)
6: shrdl $1, %edx, %eax L6: shrd eax, edx, 1
jnc 5f jnc L5
fxch fxch st(1)
fmul %st(1) // x : ST*x fmul st, st(1) // x : ST*x
fxch fxch st(1)
5: fmul %st(0), %st // x*x : ST*x L5: fmul st, st // x*x : ST*x
shrl $1, %edx shr edx, 1
movl %eax, %ecx mov ecx, eax
orl %edx, %ecx or ecx, edx
jnz 6b jnz L6
fstp %st(0) // ST*x fstp st // ST*x
ret ret
/* y is ±NAN */ /* y is ±NAN */
30: fldl 4(%esp) // x : y L30:
fldl MO(one) // 1.0 : x : y fld qword ptr [esp + 4] // x : y
fucomp %st(1) // x : y fld qword ptr MO(one) // 1.0 : x : y
fnstsw fucomp st(1) // x : y
fnstsw ax
sahf sahf
je 31f je L31
fxch // y : x fxch st(1) // y : x
31: fstp %st(1) L31:fstp st(1)
ret ret
cfi_adjust_cfa_offset (8) cfi_adjust_cfa_offset (8)
.align ALIGNARG(4) .align ALIGNARG(4)
2: /* y is a real number. */ L2: /* y is a real number. */
fxch // x : y fxch st(1) // x : y
fldl MO(one) // 1.0 : x : y fld qword ptr MO(one) // 1.0 : x : y
fldl MO(limit) // 0.29 : 1.0 : x : y fld qword ptr MO(limit) // 0.29 : 1.0 : x : y
fld %st(2) // x : 0.29 : 1.0 : x : y fld st(2) // x : 0.29 : 1.0 : x : y
fsub %st(2) // x-1 : 0.29 : 1.0 : x : y fsub st, st(2) // x-1 : 0.29 : 1.0 : x : y
fabs // |x-1| : 0.29 : 1.0 : x : y fabs // |x-1| : 0.29 : 1.0 : x : y
fucompp // 1.0 : x : y fucompp // 1.0 : x : y
fnstsw fnstsw ax
fxch // x : 1.0 : y fxch st(1) // x : 1.0 : y
sahf sahf
ja 7f ja L7
fsub %st(1) // x-1 : 1.0 : y fsub st, st(1) // x-1 : 1.0 : y
fyl2xp1 // log2(x) : y fyl2xp1 // log2(x) : y
jmp 8f jmp L8
7: fyl2x // log2(x) : y L7: fyl2x // log2(x) : y
8: fmul %st(1) // y*log2(x) : y L8: fmul st, st(1) // y*log2(x) : y
fst %st(1) // y*log2(x) : y*log2(x) fst st(1) // y*log2(x) : y*log2(x)
frndint // int(y*log2(x)) : y*log2(x) frndint // int(y*log2(x)) : y*log2(x)
fsubr %st, %st(1) // int(y*log2(x)) : fract(y*log2(x)) fsubr st(1), st // int(y*log2(x)) : fract(y*log2(x))
fxch // fract(y*log2(x)) : int(y*log2(x)) fxch // fract(y*log2(x)) : int(y*log2(x))
f2xm1 // 2^fract(y*log2(x))-1 : int(y*log2(x)) f2xm1 // 2^fract(y*log2(x))-1 : int(y*log2(x))
faddl MO(one) // 2^fract(y*log2(x)) : int(y*log2(x)) fadd qword ptr MO(one) // 2^fract(y*log2(x)) : int(y*log2(x))
fscale // 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x)) fscale // 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x))
addl $8, %esp add esp, 8
cfi_adjust_cfa_offset (-8) cfi_adjust_cfa_offset (-8)
fstp %st(1) // 2^fract(y*log2(x))*2^int(y*log2(x)) fstp st(1) // 2^fract(y*log2(x))*2^int(y*log2(x))
ret ret
// pow(x,±0) = 1 // pow(x,±0) = 1
.align ALIGNARG(4) .align ALIGNARG(4)
11: fstp %st(0) // pop y L11:fstp st(0) // pop y
fldl MO(one) fld qword ptr MO(one)
ret ret
// y == ±inf // y == ±inf
.align ALIGNARG(4) .align ALIGNARG(4)
12: fstp %st(0) // pop y L12: fstp st(0) // pop y
fldl MO(one) // 1 fld qword ptr MO(one) // 1
fldl 4(%esp) // x : 1 fld qword ptr [esp + 4] // x : 1
fabs // abs(x) : 1 fabs // abs(x) : 1
fucompp // < 1, == 1, or > 1 fucompp // < 1, == 1, or > 1
fnstsw fnstsw ax
andb $0x45, %ah and ah, HEX(45)
cmpb $0x45, %ah cmp ah, HEX(45)
je 13f // jump if x is NaN je L13 // jump if x is NaN
cmpb $0x40, %ah cmp ah, HEX(40)
je 14f // jump if |x| == 1 je L14 // jump if |x| == 1
shlb $1, %ah shl ah, 1
xorb %ah, %dl xor dl, ah
andl $2, %edx and edx, 2
fldl MOX(inf_zero, %edx, 4) fld qword ptr MOX(inf_zero, edx, 4)
ret ret
.align ALIGNARG(4) .align ALIGNARG(4)
14: fldl MO(one) L14:fld qword ptr MO(one)
ret ret
.align ALIGNARG(4) .align ALIGNARG(4)
13: fldl 4(%esp) // load x == NaN L13:fld qword ptr [esp + 4] // load x == NaN
ret ret
cfi_adjust_cfa_offset (8) cfi_adjust_cfa_offset (8)
.align ALIGNARG(4) .align ALIGNARG(4)
// x is ±inf // x is ±inf
15: fstp %st(0) // y L15: fstp st(0) // y
testb $2, %dh test dh, 2
jz 16f // jump if x == +inf jz L16 // jump if x == +inf
// We must find out whether y is an odd integer. // We must find out whether y is an odd integer.
fld %st // y : y fld st // y : y
fistpll (%esp) // y fistp qword ptr [esp] // y
fildll (%esp) // int(y) : y fild qword ptr [esp] // int(y) : y
fucompp // <empty> fucompp // <empty>
fnstsw fnstsw ax
sahf sahf
jne 17f jne L17
// OK, the value is an integer, but is the number of bits small // OK, the value is an integer, but is the number of bits small
// enough so that all are coming from the mantissa? // enough so that all are coming from the mantissa?
popl %eax pop eax
cfi_adjust_cfa_offset (-4) cfi_adjust_cfa_offset (-4)
popl %edx pop edx
cfi_adjust_cfa_offset (-4) cfi_adjust_cfa_offset (-4)
andb $1, %al and al, 1
jz 18f // jump if not odd jz L18 // jump if not odd
movl %edx, %eax mov eax, edx
orl %edx, %edx or edx, edx
jns 155f jns L155
negl %eax neg eax
155: cmpl $0x00200000, %eax L155:
ja 18f // does not fit in mantissa bits cmp eax, HEX(000200000)
ja L18 // does not fit in mantissa bits
// It's an odd integer. // It's an odd integer.
shrl $31, %edx shr edx, 31
fldl MOX(minf_mzero, %edx, 8) fld qword ptr MOX(minf_mzero, edx, 8)
ret ret
cfi_adjust_cfa_offset (8) cfi_adjust_cfa_offset (8)
.align ALIGNARG(4) .align ALIGNARG(4)
16: fcompl MO(zero) L16:fcomp qword ptr MO(zero)
addl $8, %esp add esp, 8
cfi_adjust_cfa_offset (-8) cfi_adjust_cfa_offset (-8)
fnstsw fnstsw ax
shrl $5, %eax shr eax, 5
andl $8, %eax and eax, 8
fldl MOX(inf_zero, %eax, 1) fld qword ptr MOX(inf_zero, eax, 1)
ret ret
cfi_adjust_cfa_offset (8) cfi_adjust_cfa_offset (8)
.align ALIGNARG(4) .align ALIGNARG(4)
17: shll $30, %edx // sign bit for y in right position L17: shl ecx, 30 // sign bit for y in right position
addl $8, %esp add esp, 8
cfi_adjust_cfa_offset (-8) cfi_adjust_cfa_offset (-8)
18: shrl $31, %edx L18: shr edx, 31
fldl MOX(inf_zero, %edx, 8) fld qword ptr MOX(inf_zero, edx, 8)
ret ret
cfi_adjust_cfa_offset (8) cfi_adjust_cfa_offset (8)
.align ALIGNARG(4) .align ALIGNARG(4)
// x is ±0 // x is ±0
20: fstp %st(0) // y L20: fstp st(0) // y
testb $2, %dl test dl, 2
jz 21f // y > 0 jz L21 // y > 0
// x is ±0 and y is < 0. We must find out whether y is an odd integer. // x is ±0 and y is < 0. We must find out whether y is an odd integer.
testb $2, %dh test dh, 2
jz 25f jz L25
fld %st // y : y fld st // y : y
fistpll (%esp) // y fistp qword ptr [esp] // y
fildll (%esp) // int(y) : y fild qword ptr [esp] // int(y) : y
fucompp // <empty> fucompp // <empty>
fnstsw fnstsw ax
sahf sahf
jne 26f jne L26
// OK, the value is an integer, but is the number of bits small // OK, the value is an integer, but is the number of bits small
// enough so that all are coming from the mantissa? // enough so that all are coming from the mantissa?
popl %eax pop eax
cfi_adjust_cfa_offset (-4) cfi_adjust_cfa_offset (-4)
popl %edx pop edx
cfi_adjust_cfa_offset (-4) cfi_adjust_cfa_offset (-4)
andb $1, %al and al, 1
jz 27f // jump if not odd jz L27 // jump if not odd
cmpl $0xffe00000, %edx cmp edx, HEX(0ffe00000)
jbe 27f // does not fit in mantissa bits jbe L27 // does not fit in mantissa bits
// It's an odd integer. // It's an odd integer.
// Raise divide-by-zero exception and get minus infinity value. // Raise divide-by-zero exception and get minus infinity value.
fldl MO(one) fld qword ptr MO(one)
fdivl MO(zero) fdiv qword ptr MO(zero)
fchs fchs
ret ret
cfi_adjust_cfa_offset (8) cfi_adjust_cfa_offset (8)
25: fstp %st(0) L25: fstp st(0)
26: addl $8, %esp L26: add esp, 8
cfi_adjust_cfa_offset (-8) cfi_adjust_cfa_offset (-8)
27: // Raise divide-by-zero exception and get infinity value. L27: // Raise divide-by-zero exception and get infinity value.
fldl MO(one) fld qword ptr MO(one)
fdivl MO(zero) fdiv qword ptr MO(zero)
ret ret
cfi_adjust_cfa_offset (8) cfi_adjust_cfa_offset (8)
.align ALIGNARG(4) .align ALIGNARG(4)
// x is ±0 and y is > 0. We must find out whether y is an odd integer. // x is ±0 and y is > 0. We must find out whether y is an odd integer.
21: testb $2, %dh L21:test dh, 2
jz 22f jz L22
fld %st // y : y fld st // y : y
fistpll (%esp) // y fistp qword ptr [esp] // y
fildll (%esp) // int(y) : y fild qword ptr [esp] // int(y) : y
fucompp // <empty> fucompp // <empty>
fnstsw fnstsw ax
sahf sahf
jne 23f jne L23
// OK, the value is an integer, but is the number of bits small // OK, the value is an integer, but is the number of bits small
// enough so that all are coming from the mantissa? // enough so that all are coming from the mantissa?
popl %eax pop eax
cfi_adjust_cfa_offset (-4) cfi_adjust_cfa_offset (-4)
popl %edx pop edx
cfi_adjust_cfa_offset (-4) cfi_adjust_cfa_offset (-4)
andb $1, %al and al, 1
jz 24f // jump if not odd jz L24 // jump if not odd
cmpl $0xffe00000, %edx cmp edx, HEX(0ffe00000)
jae 24f // does not fit in mantissa bits jae L24 // does not fit in mantissa bits
// It's an odd integer. // It's an odd integer.
fldl MO(mzero) fld qword ptr MO(mzero)
ret ret
cfi_adjust_cfa_offset (8) cfi_adjust_cfa_offset (8)
22: fstp %st(0) L22: fstp st(0)
23: addl $8, %esp // Don't use 2 x pop L23: add esp, 8 // Don't use 2 x pop
cfi_adjust_cfa_offset (-8) cfi_adjust_cfa_offset (-8)
24: fldl MO(zero) L24: fld qword ptr MO(zero)
ret ret
END(__ieee754_pow) END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl _sin #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC _sin
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
_sin: _sin:
push ebp // Save register bp push ebp // Save register bp
@ -47,3 +48,5 @@ _sin:
fsin // Take the sine fsin // Take the sine
pop ebp // Restore register bp pop ebp // Restore register bp
ret ret
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl _sqrt #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC _sqrt
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
_sqrt: _sqrt:
push ebp push ebp
@ -47,3 +48,5 @@ _sqrt:
fsqrt // Take the square root fsqrt // Take the square root
pop ebp pop ebp
ret ret
END

View file

@ -34,11 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.globl _tan #include <reactos/asm.h>
.intel_syntax noprefix PUBLIC _tan
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
.code
_tan: _tan:
push ebp push ebp
@ -50,3 +51,5 @@ _tan:
mov esp,ebp // Deallocate temporary space mov esp,ebp // Deallocate temporary space
pop ebp pop ebp
ret ret
END

View file

@ -1,5 +1,6 @@
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#ifndef _MSC_VER
/* /*
* @implemented * @implemented
*/ */
@ -8,3 +9,4 @@ labs(long j)
{ {
return j<0 ? -j : j; return j<0 ? -j : j;
} }
#endif

View file

@ -5,28 +5,33 @@
* FILE: lib/sdk/crt/mem/i386/memchr.s * FILE: lib/sdk/crt/mem/i386/memchr.s
*/ */
#include <reactos/asm.h>
/* /*
* void* memchr(const void* s, int c, size_t n) * void* memchr(const void* s, int c, size_t n)
*/ */
.globl _memchr PUBLIC _memchr
.code
_memchr: _memchr:
push %ebp push ebp
mov %esp,%ebp mov ebp, esp
push %edi push edi
mov 0x8(%ebp),%edi mov edi, [ebp + 8]
mov 0xc(%ebp),%eax mov eax, [ebp + 12]
mov 0x10(%ebp),%ecx mov ecx, [ebp + 16]
cld cld
jecxz .Lnotfound jecxz .Lnotfound
repne scasb repne scasb
je .Lfound je .Lfound
.Lnotfound: .Lnotfound:
mov $1,%edi mov edi, 1
.Lfound: .Lfound:
mov %edi,%eax mov eax, edi
dec %eax dec eax
pop %edi pop edi
leave leave
ret ret
END

View file

@ -1,114 +0,0 @@
/*
* void *memcpy (void *to, const void *from, size_t count)
*
* NOTE: This code is a duplicate of memmove function from memmove_asm.s
*/
.globl _memcpy
_memcpy:
push %ebp
mov %esp,%ebp
push %esi
push %edi
mov 8(%ebp),%edi
mov 12(%ebp),%esi
mov 16(%ebp),%ecx
cmp %esi,%edi
jbe .CopyUp
mov %ecx,%eax
add %esi,%eax
cmp %eax,%edi
jb .CopyDown
.CopyUp:
cld
cmp $16,%ecx
jb .L1
mov %ecx,%edx
test $3,%edi
je .L2
/*
* Make the destination dword aligned
*/
mov %edi,%ecx
and $3,%ecx
sub $5,%ecx
not %ecx
sub %ecx,%edx
rep movsb
mov %edx,%ecx
.L2:
shr $2,%ecx
rep movsl
mov %edx,%ecx
and $3,%ecx
.L1:
test %ecx,%ecx
je .L3
rep movsb
.L3:
mov 8(%ebp),%eax
pop %edi
pop %esi
leave
ret
.CopyDown:
std
add %ecx,%edi
add %ecx,%esi
cmp $16,%ecx
jb .L4
mov %ecx,%edx
test $3,%edi
je .L5
/*
* Make the destination dword aligned
*/
mov %edi,%ecx
and $3,%ecx
sub %ecx,%edx
dec %esi
dec %edi
rep movsb
mov %edx,%ecx
sub $3,%esi
sub $3,%edi
.L6:
shr $2,%ecx
rep movsl
mov %edx,%ecx
and $3,%ecx
je .L7
add $3,%esi
add $3,%edi
.L8:
rep movsb
.L7:
cld
mov 8(%ebp),%eax
pop %edi
pop %esi
leave
ret
.L5:
sub $4,%edi
sub $4,%esi
jmp .L6
.L4:
test %ecx,%ecx
je .L7
dec %esi
dec %edi
jmp .L8

View file

@ -1,114 +1,120 @@
/* /*
* void *memmove (void *to, const void *from, size_t count) * void *memcpy (void *to, const void *from, size_t count)
* *
* NOTE: This code is duplicated in memcpy_asm.s * NOTE: This code is a duplicate of memmove function from memmove_asm.s
*/ */
.globl _memmove #include <reactos/asm.h>
PUBLIC _memcpy
PUBLIC _memmove
.code
_memcpy:
_memmove: _memmove:
push %ebp push ebp
mov %esp,%ebp mov ebp, esp
push %esi push esi
push %edi push edi
mov 8(%ebp),%edi mov edi, [ebp + 8]
mov 12(%ebp),%esi mov esi, [ebp + 12]
mov 16(%ebp),%ecx mov ecx, [ebp + 16]
cmp %esi,%edi cmp edi, esi
jbe .CopyUp jbe .CopyUp
mov %ecx,%eax mov eax, ecx
add %esi,%eax add eax, esi
cmp %eax,%edi cmp edi, eax
jb .CopyDown jb .CopyDown
.CopyUp: .CopyUp:
cld cld
cmp $16,%ecx cmp ecx, 16
jb .L1 jb .L1
mov %ecx,%edx mov edx, ecx
test $3,%edi test edi, 3
je .L2 je .L2
/* /*
* Make the destination dword aligned * Make the destination dword aligned
*/ */
mov %edi,%ecx mov ecx, edi
and $3,%ecx and ecx, 3
sub $5,%ecx sub ecx, 5
not %ecx not ecx
sub %ecx,%edx sub edx, ecx
rep movsb rep movsb
mov %edx,%ecx mov ecx, edx
.L2: .L2:
shr $2,%ecx shr ecx, 2
rep movsl rep movsd
mov %edx,%ecx mov ecx, edx
and $3,%ecx and ecx, 3
.L1: .L1:
test %ecx,%ecx test ecx, ecx
je .L3 je .L3
rep movsb rep movsb
.L3: .L3:
mov 8(%ebp),%eax mov eax, [ebp + 8]
pop %edi pop edi
pop %esi pop esi
leave leave
ret ret
.CopyDown: .CopyDown:
std std
add %ecx,%edi add edi, ecx
add %ecx,%esi add esi, ecx
cmp $16,%ecx cmp ecx, 16
jb .L4 jb .L4
mov %ecx,%edx mov edx, ecx
test $3,%edi test edi, 3
je .L5 je .L5
/* /*
* Make the destination dword aligned * Make the destination dword aligned
*/ */
mov %edi,%ecx mov ecx, edi
and $3,%ecx and ecx, 3
sub %ecx,%edx sub edx, ecx
dec %esi dec esi
dec %edi dec edi
rep movsb rep movsb
mov %edx,%ecx mov ecx, edx
sub $3,%esi sub esi, 3
sub $3,%edi sub edi, 3
.L6: .L6:
shr $2,%ecx shr ecx, 2
rep movsl rep movsd
mov %edx,%ecx mov ecx, edx
and $3,%ecx and ecx, 3
je .L7 je .L7
add $3,%esi add esi, 3
add $3,%edi add edi, 3
.L8: .L8:
rep movsb rep movsb
.L7: .L7:
cld cld
mov 8(%ebp),%eax mov eax, [ebp + 8]
pop %edi pop edi
pop %esi pop esi
leave leave
ret ret
.L5: .L5:
sub $4,%edi sub edi, 4
sub $4,%esi sub esi, 4
jmp .L6 jmp .L6
.L4: .L4:
test %ecx,%ecx test ecx, ecx
je .L7 je .L7
dec %esi dec esi
dec %edi dec edi
jmp .L8 jmp .L8
END

View file

@ -2,46 +2,50 @@
* $Id$ * $Id$
*/ */
#include <reactos/asm.h>
/* /*
* void *memset (void *src, int val, size_t count) * void *memset (void *src, int val, size_t count)
*/ */
.globl _memset PUBLIC _memset
.code
_memset: _memset:
push %ebp push ebp
mov %esp,%ebp mov ebp, esp
push %edi push edi
mov 0x8(%ebp),%edi mov edi, [ebp + 8]
movzb 0xc(%ebp),%eax movzx eax, byte ptr [ebp + 12]
mov 0x10(%ebp),%ecx mov ecx, [ebp + 16]
cld cld
cmp $16,%ecx cmp ecx, 16
jb .L1 jb .L1
mov $0x01010101,%edx mov edx, HEX(01010101)
mul %edx mul edx
mov %ecx,%edx mov edx, ecx
test $3,%edi test edi, 3
je .L2 je .L2
mov %edi,%ecx mov ecx, edi
and $3,%ecx and ecx, 3
sub $5,%ecx sub ecx, 5
not %ecx not ecx
sub %ecx,%edx sub edx, ecx
rep stosb rep stosb
mov %edx,%ecx mov ecx, edx
.L2: .L2:
shr $2,%ecx shr ecx, 2
rep stosl rep stosd
mov %edx,%ecx mov ecx, edx
and $3,%ecx and ecx, 3
.L1: .L1:
test %ecx,%ecx test ecx, ecx
je .L3 je .L3
rep stosb rep stosb
.L3: .L3:
pop %edi pop edi
mov 0x8(%ebp),%eax mov eax, [ebp + 8]
leave leave
ret ret
END

View file

@ -2,6 +2,8 @@
* $Id$ * $Id$
*/ */
#ifndef _MSC_VER
#include <string.h> #include <string.h>
int memcmp(const void *s1, const void *s2, size_t n) int memcmp(const void *s1, const void *s2, size_t n)
@ -15,3 +17,5 @@ int memcmp(const void *s1, const void *s2, size_t n)
} }
return 0; return 0;
} }
#endif

View file

@ -9,6 +9,9 @@
* complete implementation * complete implementation
*/ */
#include <reactos/asm.h>
#include <ndk/asm.h>
#define JB_BP 0 #define JB_BP 0
#define JB_BX 1 #define JB_BX 1
#define JB_DI 2 #define JB_DI 2
@ -20,6 +23,7 @@
#define JMPBUF 4 #define JMPBUF 4
.code
/* /*
* int * int
* _setjmp(jmp_buf env); * _setjmp(jmp_buf env);
@ -33,20 +37,20 @@
* Notes: * Notes:
* Sets up the jmp_buf * Sets up the jmp_buf
*/ */
.globl __setjmp PUBLIC __setjmp
__setjmp: __setjmp:
xorl %eax, %eax xor eax, eax
movl JMPBUF(%esp), %edx mov edx, JMPBUF[esp]
/* Save registers. */ /* Save registers. */
movl %ebp, (JB_BP*4)(%edx) /* Save caller's frame pointer. */ mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */
movl %ebx, (JB_BX*4)(%edx) mov [edx + JB_BX*4], ebx
movl %edi, (JB_DI*4)(%edx) mov [edx + JB_DI*4], edi
movl %esi, (JB_SI*4)(%edx) mov [edx + JB_SI*4], esi
leal JMPBUF(%esp), %ecx /* Save SP as it will be after we return. */ lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */
movl %ecx, (JB_SP*4)(%edx) mov [edx + JB_SP*4], ecx
movl PCOFF(%esp), %ecx /* Save PC we are returning to now. */ mov ecx, PCOFF[esp] /* Save PC we are returning to now. */
movl %ecx, (JB_IP*4)(%edx) mov [edx + JB_IP*4], ecx
ret ret
/* /*
@ -62,24 +66,22 @@ __setjmp:
* Notes: * Notes:
* Sets up the jmp_buf * Sets up the jmp_buf
*/ */
.globl __setjmp3 PUBLIC __setjmp3
__setjmp3: __setjmp3:
xorl %eax, %eax xor eax, eax
movl JMPBUF(%esp), %edx mov edx, JMPBUF[esp]
/* Save registers. */ /* Save registers. */
movl %ebp, (JB_BP*4)(%edx) /* Save caller's frame pointer. */ mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */
movl %ebx, (JB_BX*4)(%edx) mov [edx + JB_BX*4], ebx
movl %edi, (JB_DI*4)(%edx) mov [edx + JB_DI*4], edi
movl %esi, (JB_SI*4)(%edx) mov [edx + JB_SI*4], esi
leal JMPBUF(%esp), %ecx /* Save SP as it will be after we return. */ lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */
movl %ecx, (JB_SP*4)(%edx) mov [edx + JB_SP*4], ecx
movl PCOFF(%esp), %ecx /* Save PC we are returning to now. */ mov ecx, PCOFF[esp] /* Save PC we are returning to now. */
movl %ecx, (JB_IP*4)(%edx) mov [edx + JB_IP*4], ecx
ret ret
#define VAL 8
/* /*
* void * void
* longjmp(jmp_buf env, int value); * longjmp(jmp_buf env, int value);
@ -94,18 +96,20 @@ __setjmp3:
* Notes: * Notes:
* Non-local goto * Non-local goto
*/ */
.globl _longjmp PUBLIC _longjmp
_longjmp: _longjmp:
movl JMPBUF(%esp), %ecx /* User's jmp_buf in %ecx. */ mov ecx, JMPBUF[esp] /* User's jmp_buf in %ecx. */
movl VAL(%esp), %eax /* Second argument is return value. */ mov eax, [esp + 8] /* Second argument is return value. */
/* Save the return address now. */ /* Save the return address now. */
movl (JB_IP*4)(%ecx), %edx mov edx, [edx + JB_IP*4]
/* Restore registers. */ /* Restore registers. */
movl (JB_BP*4)(%ecx), %ebp mov ebp, [edx + JB_BP*4]
movl (JB_BX*4)(%ecx), %ebx mov ebx, [edx + JB_BX*4]
movl (JB_DI*4)(%ecx), %edi mov edi, [edx + JB_DI*4]
movl (JB_SI*4)(%ecx), %esi mov esi, [edx + JB_SI*4]
movl (JB_SP*4)(%ecx), %esp mov esp, [edx + JB_SP*4]
/* Jump to saved PC. */ /* Jump to saved PC. */
jmp *%edx jmp dword ptr [edx]
END

View file

@ -21,12 +21,12 @@
#define _tlods lodsw #define _tlods lodsw
#define _tstos stosw #define _tstos stosw
#define _tsize $2 #define _tsize 2
#define _treg(_O_) _O_ ## x #define _treg(_O_) _O_ ## x
#define _tdec(_O_) sub $2, _O_ #define _tdec(_O_) sub _O_, 2
#define _tinc(_O_) add $2, _O_ #define _tinc(_O_) add _O_, 2
#else #else
@ -45,7 +45,7 @@
#define _tlods lodsb #define _tlods lodsb
#define _tstos stosb #define _tstos stosb
#define _tsize $1 #define _tsize 1
#define _treg(_O_) _O_ ## l #define _treg(_O_) _O_ ## l

View file

@ -2,31 +2,34 @@
*/ */
#include "tchar.h" #include "tchar.h"
#include <reactos/asm.h>
.globl _tcscat PUBLIC _tcscat
.code
_tcscat: _tcscat:
push %esi push esi
push %edi push edi
mov 0x0C(%esp), %edi mov edi, [esp + 12]
mov 0x10(%esp), %esi mov esi, [esp + 16]
xor %eax, %eax xor eax, eax
mov $-1, %ecx mov ecx, -1
cld cld
repne _tscas repne _tscas
_tdec(%edi) _tdec(edi)
.L1: .L1:
_tlods _tlods
_tstos _tstos
test %_treg(a), %_treg(a) test _treg(a), _treg(a)
jnz .L1 jnz .L1
mov 0x0C(%esp), %eax mov eax, [esp + 12]
pop %edi pop edi
pop %esi pop esi
ret ret
END
/* EOF */ /* EOF */

View file

@ -2,29 +2,31 @@
*/ */
#include "tchar.h" #include "tchar.h"
#include <reactos/asm.h>
.globl _tcschr PUBLIC _tcschr
.code
_tcschr: _tcschr:
push %esi push esi
mov 0x8(%esp), %esi mov esi, [esp + 8]
mov 0xC(%esp), %edx mov edx, [esp + 12]
cld cld
.L1: .L1:
_tlods _tlods
cmp %_treg(a), %_treg(d) cmp _treg(d), _treg(a)
je .L2 je .L2
test %_treg(a), %_treg(a) test _treg(a), _treg(a)
jnz .L1 jnz .L1
mov _tsize, %esi mov esi, _tsize
.L2: .L2:
mov %esi, %eax mov eax, esi
_tdec(%eax) _tdec(eax)
pop %esi pop esi
ret ret
END
/* EOF */ /* EOF */

View file

@ -2,33 +2,36 @@
*/ */
#include "tchar.h" #include "tchar.h"
#include <reactos/asm.h>
.globl _tcscmp PUBLIC _tcscmp
.code
_tcscmp: _tcscmp:
push %esi push esi
push %edi push edi
mov 0x0C(%esp), %esi mov esi, [esp + 12]
mov 0x10(%esp), %edi mov edi, [esp + 16]
xor %eax, %eax xor eax, eax
cld cld
.L1: .L1:
_tlods _tlods
_tscas _tscas
jne .L2 jne .L2
test %eax, %eax test eax, eax
jne .L1 jne .L1
xor %eax, %eax xor eax, eax
jmp .L3 jmp .L3
.L2: .L2:
sbb %eax, %eax sbb eax, eax
or $1, %al or al, 1
.L3: .L3:
pop %edi pop edi
pop %esi pop esi
ret ret
END
/* EOF */ /* EOF */

View file

@ -2,26 +2,29 @@
*/ */
#include "tchar.h" #include "tchar.h"
#include <reactos/asm.h>
.globl _tcscpy PUBLIC _tcscpy
.code
_tcscpy: _tcscpy:
push %esi push esi
push %edi push edi
mov 0x0C(%esp), %edi mov edi, [esp + 12]
mov 0x10(%esp), %esi mov esi, [esp + 16]
cld cld
.L1: .L1:
_tlods _tlods
_tstos _tstos
test %_treg(a), %_treg(a) test _treg(a), _treg(a)
jnz .L1 jnz .L1
mov 0x0C(%esp), %eax mov eax, [esp + 12]
pop %edi pop edi
pop %esi pop esi
ret ret
END
/* EOF */ /* EOF */

View file

@ -2,28 +2,31 @@
*/ */
#include "tchar.h" #include "tchar.h"
#include <reactos/asm.h>
.globl _tcslen PUBLIC _tcslen
.code
_tcslen: _tcslen:
push %edi push edi
mov 0x8(%esp), %edi mov edi, [esp + 8]
xor %eax, %eax xor eax, eax
test %edi,%edi test edi, edi
jz _tcslen_end jz _tcslen_end
mov $-1, %ecx mov ecx, -1
cld cld
repne _tscas repne _tscas
not %ecx not ecx
dec %ecx dec ecx
mov %ecx, %eax mov eax, ecx
_tcslen_end: _tcslen_end:
pop %edi pop edi
ret ret
END
/* EOF */ /* EOF */

View file

@ -2,41 +2,44 @@
*/ */
#include "tchar.h" #include "tchar.h"
#include <reactos/asm.h>
.globl _tcsncat PUBLIC _tcsncat
.code
_tcsncat: _tcsncat:
push %esi push esi
push %edi push edi
mov 0x0C(%esp), %edi mov edi, [esp + 12]
mov 0x10(%esp), %esi mov esi, [esp + 16]
cld cld
xor %eax, %eax xor eax, eax
mov $-1, %ecx mov ecx, -1
repne _tscas repne _tscas
_tdec(%edi) _tdec(edi)
mov 0x14(%esp),%ecx mov ecx, [esp + 20]
.L1: .L1:
dec %ecx dec ecx
js .L2 js .L2
_tlods _tlods
_tstos _tstos
test %_treg(a), %_treg(a) test _treg(a), _treg(a)
jne .L1 jne .L1
jmp .L3 jmp .L3
.L2: .L2:
xor %eax, %eax xor eax, eax
_tstos _tstos
.L3: .L3:
mov 0x0C(%esp), %eax mov eax, [esp + 12]
pop %edi pop edi
pop %esi pop esi
ret ret
END
/* EOF */ /* EOF */

View file

@ -2,39 +2,42 @@
*/ */
#include "tchar.h" #include "tchar.h"
#include <reactos/asm.h>
.globl _tcsncmp PUBLIC _tcsncmp
.code
_tcsncmp: _tcsncmp:
push %esi push esi
push %edi push edi
mov 0x0C(%esp), %esi /* s1 */ mov esi, [esp + 12] /* s1 */
mov 0x10(%esp), %edi /* s2 */ mov edi, [esp + 16] /* s2 */
mov 0x14(%esp), %ecx /* n */ mov ecx, [esp + 20] /* n */
xor %eax,%eax xor eax, eax
cld cld
.L1: .L1:
dec %ecx dec ecx
js .L2 js .L2
_tlods _tlods
_tscas _tscas
jne .L3 jne .L3
test %eax, %eax test eax, eax
jne .L1 jne .L1
.L2: .L2:
xor %eax, %eax xor eax, eax
jmp .L4 jmp .L4
.L3: .L3:
sbb %eax, %eax sbb eax, eax
or $1, %al or al, 1
.L4: .L4:
pop %edi pop edi
pop %esi pop esi
ret ret
END
/* EOF */ /* EOF */

View file

@ -2,33 +2,36 @@
*/ */
#include "tchar.h" #include "tchar.h"
#include <reactos/asm.h>
.globl _tcsncpy PUBLIC _tcsncpy
.code
_tcsncpy: _tcsncpy:
push %esi push esi
push %edi push edi
mov 0x0C(%esp), %edi /* s1 */ mov edi, [esp + 12] /* s1 */
mov 0x10(%esp), %esi /* s2 */ mov esi, [esp + 16] /* s2 */
mov 0x14(%esp), %ecx /* n */ mov ecx, [esp + 20] /* n */
xor %eax, %eax xor eax, eax
cld cld
.L1: .L1:
dec %ecx dec ecx
js .L2 js .L2
_tlods _tlods
_tstos _tstos
test %_treg(a), %_treg(a) test _treg(a), _treg(a)
jnz .L1 jnz .L1
rep _tstos rep _tstos
.L2: .L2:
mov 0x0C(%esp), %eax mov eax, [esp + 12]
pop %edi pop edi
pop %esi pop esi
ret ret
END
/* EOF */ /* EOF */

View file

@ -2,29 +2,32 @@
*/ */
#include "tchar.h" #include "tchar.h"
#include <reactos/asm.h>
.globl _tcsnlen PUBLIC _tcsnlen
.code
_tcsnlen: _tcsnlen:
push %edi push edi
mov 0x8(%esp), %edi mov edi, [esp + 8]
mov 0xC(%esp), %ecx mov ecx, [esp + 12]
xor %eax, %eax xor eax, eax
test %ecx, %ecx test ecx, ecx
jz .L1 jz .L1
mov %ecx, %edx mov edx, ecx
cld cld
repne _tscas repne _tscas
sete %al sete al
sub %ecx, %edx sub edx, ecx
sub %eax, %edx sub edx, eax
mov %edx, %eax mov eax, edx
.L1: .L1:
pop %edi pop edi
ret ret
END
/* EOF */ /* EOF */

View file

@ -2,30 +2,33 @@
*/ */
#include "tchar.h" #include "tchar.h"
#include <reactos/asm.h>
.globl _tcsrchr PUBLIC _tcsrchr
.code
_tcsrchr: _tcsrchr:
push %esi push esi
mov 0x8(%esp), %esi mov esi, [esp + 8]
mov 0xC(%esp), %edx mov edx, [esp + 12]
cld cld
mov _tsize, %ecx mov ecx, _tsize
.L1: .L1:
_tlods _tlods
cmp %_treg(a), %_treg(d) cmp _treg(d), _treg(a)
jne .L2 jne .L2
mov %esi, %ecx mov ecx, esi
.L2: .L2:
test %_treg(a), %_treg(a) test _treg(a), _treg(a)
jnz .L1 jnz .L1
mov %ecx, %eax mov eax, ecx
_tdec(%eax) _tdec(eax)
pop %esi pop esi
ret ret
END
/* EOF */ /* EOF */

View file

@ -8,6 +8,8 @@
* 25/11/05: Added license header * 25/11/05: Added license header
*/ */
#ifndef _MSC_VER
#if defined(__GNUC__) && !defined(__clang__) #if defined(__GNUC__) && !defined(__clang__)
#define __int64 long long #define __int64 long long
#endif #endif
@ -49,3 +51,5 @@ char* _strset(char* szToFill, int szFill)
} }
return t; return t;
} }
#endif