mirror of
https://github.com/reactos/reactos.git
synced 2025-06-25 13:09:42 +00:00
[CRT]
- 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:
parent
0d7a1c46a0
commit
a3623f23de
49 changed files with 912 additions and 918 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -33,18 +33,22 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* 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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl __alldvrm
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl __allmul
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl __allrem
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl __allshl
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl __allshr
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl _atan
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl __aulldiv
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl __aulldvrm
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl __aullrem
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl __aullshr
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl _ceil
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl _cos
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl _fabs
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl _floor
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl __ftol
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -7,12 +7,13 @@
|
||||||
* PROGRAMER: Magnus Olsen (magnus@greatlord.com)
|
* PROGRAMER: Magnus Olsen (magnus@greatlord.com)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl _log10
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
PUBLIC _log10
|
||||||
|
|
||||||
/* FUNCTIONS ***************************************************************/
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
.code
|
||||||
|
|
||||||
_log10:
|
_log10:
|
||||||
|
|
||||||
|
@ -25,3 +26,4 @@ _log10:
|
||||||
pop ebp
|
pop ebp
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
END
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl _log
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl _sin
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl _sqrt
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl _tan
|
|
||||||
|
|
||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
|
#include <reactos/asm.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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:
|
|
||||||
test %ecx,%ecx
|
|
||||||
je .L7
|
|
||||||
dec %esi
|
|
||||||
dec %edi
|
|
||||||
jmp .L8
|
|
||||||
|
|
||||||
|
.L4:
|
||||||
|
test ecx, ecx
|
||||||
|
je .L7
|
||||||
|
dec esi
|
||||||
|
dec edi
|
||||||
|
jmp .L8
|
||||||
|
|
||||||
|
END
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue