From a3623f23de6ce2e46224568380a699a264e9db0a Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 2 Nov 2010 00:06:33 +0000 Subject: [PATCH] [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 --- lib/sdk/crt/CMakeLists.txt | 2 - lib/sdk/crt/except/i386/chkstk_asm.s | 70 ++--- lib/sdk/crt/except/i386/seh.s | 36 ++- lib/sdk/crt/math/abs.c | 2 + lib/sdk/crt/math/amd64/ceilf.S | 26 +- lib/sdk/crt/math/amd64/floorf.S | 21 +- lib/sdk/crt/math/i386/alldiv_asm.s | 18 +- lib/sdk/crt/math/i386/alldvrm_asm.s | 51 ++-- lib/sdk/crt/math/i386/allmul_asm.s | 8 +- lib/sdk/crt/math/i386/allrem_asm.s | 11 +- lib/sdk/crt/math/i386/allshl_asm.s | 9 +- lib/sdk/crt/math/i386/allshr_asm.s | 11 +- lib/sdk/crt/math/i386/atan_asm.s | 11 +- lib/sdk/crt/math/i386/aulldiv_asm.s | 33 +-- lib/sdk/crt/math/i386/aulldvrm_asm.s | 35 +-- lib/sdk/crt/math/i386/aullrem_asm.s | 35 +-- lib/sdk/crt/math/i386/aullshr_asm.s | 19 +- lib/sdk/crt/math/i386/ceil_asm.s | 11 +- lib/sdk/crt/math/i386/ceilf.S | 53 ++-- lib/sdk/crt/math/i386/cos_asm.s | 9 +- lib/sdk/crt/math/i386/fabs_asm.s | 11 +- lib/sdk/crt/math/i386/floor_asm.s | 13 +- lib/sdk/crt/math/i386/floorf.S | 57 ++-- lib/sdk/crt/math/i386/ftol_asm.s | 13 +- lib/sdk/crt/math/i386/log10_asm.s | 8 +- lib/sdk/crt/math/i386/log_asm.s | 11 +- lib/sdk/crt/math/i386/pow_asm.s | 371 ++++++++++++++------------- lib/sdk/crt/math/i386/sin_asm.s | 9 +- lib/sdk/crt/math/i386/sqrt_asm.s | 11 +- lib/sdk/crt/math/i386/tan_asm.s | 11 +- lib/sdk/crt/math/labs.c | 2 + lib/sdk/crt/mem/i386/memchr_asm.s | 33 ++- lib/sdk/crt/mem/i386/memcpy_asm.s | 114 -------- lib/sdk/crt/mem/i386/memmove_asm.s | 158 ++++++------ lib/sdk/crt/mem/i386/memset_asm.s | 64 ++--- lib/sdk/crt/mem/memcmp.c | 4 + lib/sdk/crt/setjmp/i386/setjmp.s | 72 +++--- lib/sdk/crt/string/i386/tchar.h | 8 +- lib/sdk/crt/string/i386/tcscat.h | 39 +-- lib/sdk/crt/string/i386/tcschr.h | 34 +-- lib/sdk/crt/string/i386/tcscmp.h | 41 +-- lib/sdk/crt/string/i386/tcscpy.h | 31 ++- lib/sdk/crt/string/i386/tcslen.h | 31 ++- lib/sdk/crt/string/i386/tcsncat.h | 51 ++-- lib/sdk/crt/string/i386/tcsncmp.h | 47 ++-- lib/sdk/crt/string/i386/tcsncpy.h | 41 +-- lib/sdk/crt/string/i386/tcsnlen.h | 35 +-- lib/sdk/crt/string/i386/tcsrchr.h | 35 +-- lib/sdk/crt/string/strset.c | 4 + 49 files changed, 912 insertions(+), 918 deletions(-) delete mode 100644 lib/sdk/crt/mem/i386/memcpy_asm.s diff --git a/lib/sdk/crt/CMakeLists.txt b/lib/sdk/crt/CMakeLists.txt index 1a9093c4fdc..ff14fc3d8be 100644 --- a/lib/sdk/crt/CMakeLists.txt +++ b/lib/sdk/crt/CMakeLists.txt @@ -335,7 +335,6 @@ list(APPEND CRT_SOURCE math/i386/ldexp.c math/i386/sqrtf.c mem/i386/memchr_asm.s - mem/i386/memcpy_asm.s mem/i386/memmove_asm.s mem/i386/memset_asm.s string/i386/strcat_asm.s @@ -516,7 +515,6 @@ endif(ARCH MATCHES i386) if(ARCH MATCHES i386) list(APPEND LIBCNTPR_SOURCE mem/i386/memchr_asm.s - mem/i386/memcpy_asm.s mem/i386/memmove_asm.s mem/i386/memset_asm.s string/i386/strcat_asm.s diff --git a/lib/sdk/crt/except/i386/chkstk_asm.s b/lib/sdk/crt/except/i386/chkstk_asm.s index 5104a35b1c4..5e41d42d020 100644 --- a/lib/sdk/crt/except/i386/chkstk_asm.s +++ b/lib/sdk/crt/except/i386/chkstk_asm.s @@ -7,8 +7,13 @@ * PROGRAMER: KJK::Hyperion */ -.globl __chkstk -.globl __alloca_probe +#include +#include +#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 @@ -18,49 +23,50 @@ __chkstk: __alloca_probe: -/* EAX = size to be allocated */ -/* save the ECX register */ - pushl %ecx + /* EAX = size to be allocated */ + /* save the ECX register */ + push ecx -/* ECX = top of the previous stack frame */ - leal 8(%esp), %ecx + /* ECX = top of the previous stack frame */ + lea eax, [esp + 8] -/* probe the desired memory, page by page */ - cmpl $0x1000, %eax - jge .l_MoreThanAPage - jmp .l_LessThanAPage + /* probe the desired memory, page by page */ + cmp eax, PAGE_SIZE + jge .l_MoreThanAPage + jmp .l_LessThanAPage .l_MoreThanAPage: -/* raise the top of the stack by a page and probe */ - subl $0x1000, %ecx - testl %eax, 0(%ecx) + /* raise the top of the stack by a page and probe */ + sub ecx, PAGE_SIZE + test [ecx], eax -/* loop if still more than a page must be probed */ - subl $0x1000, %eax - cmpl $0x1000, %eax - jge .l_MoreThanAPage + /* loop if still more than a page must be probed */ + sub eax, PAGE_SIZE + cmp eax, PAGE_SIZE + jge .l_MoreThanAPage .l_LessThanAPage: -/* raise the top of the stack by EAX bytes (size % 4096) and probe */ - subl %eax, %ecx - testl %eax, 0(%ecx) + /* raise the top of the stack by EAX bytes (size % 4096) and probe */ + sub ecx, eax + test [ecx], eax -/* EAX = top of the stack */ - movl %esp, %eax + /* EAX = top of the stack */ + mov eax, esp -/* allocate the memory */ - movl %ecx, %esp + /* allocate the memory */ + mov esp, ecx -/* restore ECX */ - movl 0(%eax), %ecx + /* restore ECX */ + mov ecx, [eax] -/* restore the return address */ - movl 4(%eax), %eax - pushl %eax + /* restore the return address */ + mov eax, [eax + 4] + push eax -/* return */ - ret + /* return */ + ret /* EOF */ +END diff --git a/lib/sdk/crt/except/i386/seh.s b/lib/sdk/crt/except/i386/seh.s index 15a8cc5777a..ae19969ac2c 100644 --- a/lib/sdk/crt/except/i386/seh.s +++ b/lib/sdk/crt/except/i386/seh.s @@ -8,24 +8,26 @@ /* INCLUDES ******************************************************************/ +#include #include -.intel_syntax noprefix #define DISPOSITION_DISMISS 0 #define DISPOSITION_CONTINUE_SEARCH 1 #define DISPOSITION_COLLIDED_UNWIND 3 +EXTERN _RtlUnwind@16:PROC + /* GLOBALS *******************************************************************/ -.globl __global_unwind2 -.globl __local_unwind2 -.globl __abnormal_termination -.globl __except_handler2 -.globl __except_handler3 +PUBLIC __global_unwind2 +PUBLIC __local_unwind2 +PUBLIC __abnormal_termination +PUBLIC __except_handler2 +PUBLIC __except_handler3 /* FUNCTIONS *****************************************************************/ -.func unwind_handler +.code _unwind_handler: /* Check if we were unwinding and continue search if not */ @@ -56,9 +58,8 @@ _unwind_handler: unwind_handler_return: ret -.endfunc -.func _global_unwind2 + __global_unwind2: /* Create stack and save all registers */ @@ -85,9 +86,8 @@ glu_return: mov esp, ebp pop ebp ret -.endfunc -.func _abnormal_termination + __abnormal_termination: /* Assume false */ @@ -112,9 +112,8 @@ __abnormal_termination: /* Return */ ab_return: ret -.endfunc -.func _local_unwind2 + __local_unwind2: /* Save volatiles */ @@ -175,9 +174,8 @@ unwind_return: pop esi pop ebx ret -.endfunc -.func _except_handler2 + __except_handler2: /* Setup stack and save volatiles */ @@ -256,7 +254,7 @@ except_loop2: mov [ebx+12], eax /* Call except handler */ - call [edi+ecx*4+8] + call dword ptr [edi+ecx*4+8] except_continue2: /* Reload try level and except again */ @@ -297,9 +295,8 @@ except_return2: mov esp, ebp pop ebp ret -.endfunc -.func _except_handler3 + __except_handler3: /* Setup stack and save volatiles */ @@ -437,4 +434,5 @@ except_return3: mov esp, ebp pop ebp ret -.endfunc + +END diff --git a/lib/sdk/crt/math/abs.c b/lib/sdk/crt/math/abs.c index a18f19b2666..4690af323a0 100644 --- a/lib/sdk/crt/math/abs.c +++ b/lib/sdk/crt/math/abs.c @@ -1,5 +1,6 @@ /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#ifndef _MSC_VER /* * @implemented */ @@ -8,3 +9,4 @@ abs(int j) { return j<0 ? -j : j; } +#endif diff --git a/lib/sdk/crt/math/amd64/ceilf.S b/lib/sdk/crt/math/amd64/ceilf.S index e3a948fff8a..8a8242e8893 100644 --- a/lib/sdk/crt/math/amd64/ceilf.S +++ b/lib/sdk/crt/math/amd64/ceilf.S @@ -17,24 +17,28 @@ PUBLIC ceilf ceilf: + sub rsp, 16 + /* Put parameter on the stack */ - movss [rsp - 0x10], xmm0 - fld dword ptr [rsp] + movss [rsp], xmm0 + fld dword ptr [rsp] /* Change fpu control word to round up */ - fstcw [rsp - 0x10] - mov eax, [rsp - 0x10] - or eax, 0x00800 - and eax, 0x0fbff - mov [rsp - 0x08], eax - fldcw [rsp - 0x08] + fstcw [rsp + 8] + mov eax, [rsp + 8] + or eax, 0x00800 + and eax, 0x0fbff + mov [rsp + 12], eax + fldcw [rsp + 12] /* Round to integer */ frndint /* Restore fpu control word */ - fldcw [rsp - 0x10] + fldcw [rsp + 8] - fstp dword ptr [rsp - 0x10] - movss xmm0, [rsp - 0x10] + fstp dword ptr [rsp] + movss xmm0, [rsp] + + add rsp, 16 ret diff --git a/lib/sdk/crt/math/amd64/floorf.S b/lib/sdk/crt/math/amd64/floorf.S index e2d02202df7..4a17c9643ba 100644 --- a/lib/sdk/crt/math/amd64/floorf.S +++ b/lib/sdk/crt/math/amd64/floorf.S @@ -17,24 +17,29 @@ PUBLIC floorf floorf: + sub rsp, 16 + /* Put parameter on the stack */ - movss [rsp - 0x10], xmm0 + movss [rsp], xmm0 fld dword ptr [rsp] /* Change fpu control word to round down */ - fstcw [rsp - 0x10] - mov eax, [rsp - 0x10] + fstcw [rsp] + mov eax, [rsp] or eax, 0x00400 and eax, 0x0f7ff - mov [rsp - 0x08], eax - fldcw [rsp - 0x08] + mov [rsp + 8], eax + fldcw [rsp + 8] /* Round to integer */ frndint /* Restore fpu control word */ - fldcw [rsp - 0x10] + fldcw [rsp] - fstp dword ptr [rsp - 0x10] - movss xmm0, [rsp - 0x10] + fstp dword ptr [rsp] + movss xmm0, [rsp] + add rsp, 16 ret + +END diff --git a/lib/sdk/crt/math/i386/alldiv_asm.s b/lib/sdk/crt/math/i386/alldiv_asm.s index 043a8af95c3..eb7cb7566a7 100644 --- a/lib/sdk/crt/math/i386/alldiv_asm.s +++ b/lib/sdk/crt/math/i386/alldiv_asm.s @@ -33,18 +33,22 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - - .globl __alldiv - .globl __fltused - + +#include + +PUBLIC __alldiv +PUBLIC __fltused + /* DATA ********************************************************************/ +.data +ASSUME CS:NOTHING, DS:NOTHING, ES:NOTHING, FS:NOTHING, GS:NOTHING __fltused: - .long 0x9875 + .long HEX(9875) -.intel_syntax noprefix /* FUNCTIONS ***************************************************************/ +.code // // lldiv - signed long divide @@ -222,3 +226,5 @@ L8: pop edi ret 16 + +END diff --git a/lib/sdk/crt/math/i386/alldvrm_asm.s b/lib/sdk/crt/math/i386/alldvrm_asm.s index 8f775d6dac3..bff43509c0c 100644 --- a/lib/sdk/crt/math/i386/alldvrm_asm.s +++ b/lib/sdk/crt/math/i386/alldvrm_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl __alldvrm - -.intel_syntax noprefix +#include + +PUBLIC __alldvrm + /* FUNCTIONS ***************************************************************/ +.code __alldvrm: push edi @@ -88,7 +89,7 @@ __alldvrm: mov eax,DVNDHI // hi word of a 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 ebp // complement result sign flag mov edx,DVNDLO // lo word of a @@ -97,10 +98,10 @@ __alldvrm: sbb eax,0 mov DVNDHI,eax // save positive value mov DVNDLO,edx -....L1: +.L1: mov eax,DVSRHI // hi word of b 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 mov edx,DVSRLO // lo word of a neg eax // make b positive @@ -108,7 +109,7 @@ __alldvrm: sbb eax,0 mov DVSRHI,eax // save positive value mov DVSRLO,edx -....L2: +.L2: // // 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 - 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 eax,DVNDHI // load high word of dividend xor edx,edx @@ -137,24 +138,24 @@ __alldvrm: mov eax,esi // set up low word of quotient mul dword ptr DVSRLO // LOWORD(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 // -....L3: +.L3: mov ebx,eax // ebx:ecx <- divisor mov ecx,DVSRLO mov edx,DVNDHI // edx:eax <- dividend mov eax,DVNDLO -....L5: +.L5: shr ebx,1 // shift divisor right one bit rcr ecx,1 shr edx,1 // shift dividend right one bit rcr eax,1 or ebx,ebx - jnz short ....L5 // loop until divisor < 4194304K + jnz short .L5 // loop until divisor < 4194304K div ecx // now divide, ignore remainder mov esi,eax // save quotient @@ -170,7 +171,7 @@ __alldvrm: mov eax,DVSRLO mul esi // QUOT * DVSRLO 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 @@ -179,18 +180,18 @@ __alldvrm: // cmp edx,DVNDHI // compare hi words of result and original - ja short ....L6 // if result > original, do subtract - jb short ....L7 // if result < original, we are ok + ja short .L6 // if result > original, do subtract + jb short .L7 // if result < original, we are ok cmp eax,DVNDLO // hi words are equal, compare lo words - jbe short ....L7 // if less or equal we are ok, else subtract -....L6: + jbe short .L7 // if less or equal we are ok, else subtract +.L6: dec esi // subtract 1 from quotient sub eax,DVSRLO // subtract divisor from result sbb edx,DVSRHI -....L7: +.L7: xor ebx,ebx // ebx:esi <- quotient -....L4: +.L4: // // 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 @@ -208,7 +209,7 @@ __alldvrm: // 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 eax sbb edx,0 @@ -216,7 +217,7 @@ __alldvrm: // // Now we need to get the quotient into edx:eax and the remainder into ebx:ecx. // -....L9: +.L9: mov ecx,edx mov edx,ebx mov ebx,ecx @@ -229,7 +230,7 @@ __alldvrm: // 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 eax sbb edx,0 @@ -238,9 +239,11 @@ __alldvrm: // Restore the saved registers and return. // -....L8: +.L8: pop ebp pop esi pop edi ret 16 + +END diff --git a/lib/sdk/crt/math/i386/allmul_asm.s b/lib/sdk/crt/math/i386/allmul_asm.s index ddfa7cf7b46..369aa068376 100644 --- a/lib/sdk/crt/math/i386/allmul_asm.s +++ b/lib/sdk/crt/math/i386/allmul_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl __allmul -.intel_syntax noprefix +#include + +PUBLIC __allmul /* FUNCTIONS ***************************************************************/ +.code // // llmul - long multiply routine @@ -113,3 +114,4 @@ hard: ret 16 // callee restores the stack +END diff --git a/lib/sdk/crt/math/i386/allrem_asm.s b/lib/sdk/crt/math/i386/allrem_asm.s index a8e222e25bf..6ffa481199b 100644 --- a/lib/sdk/crt/math/i386/allrem_asm.s +++ b/lib/sdk/crt/math/i386/allrem_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl __allrem - -.intel_syntax noprefix +#include + +PUBLIC __allrem + /* FUNCTIONS ***************************************************************/ +.code // // llrem - signed long remainder @@ -227,3 +228,5 @@ __allrem : pop ebx ret 16 + +END diff --git a/lib/sdk/crt/math/i386/allshl_asm.s b/lib/sdk/crt/math/i386/allshl_asm.s index b5d574aff01..e5ce4a63506 100644 --- a/lib/sdk/crt/math/i386/allshl_asm.s +++ b/lib/sdk/crt/math/i386/allshl_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl __allshl -.intel_syntax noprefix +#include + +PUBLIC __allshl /* FUNCTIONS ***************************************************************/ +.code // // llshl - long shift left @@ -92,3 +93,5 @@ RETZERO: xor eax,eax xor edx,edx ret + +END diff --git a/lib/sdk/crt/math/i386/allshr_asm.s b/lib/sdk/crt/math/i386/allshr_asm.s index 575fc92db9a..69295738fef 100644 --- a/lib/sdk/crt/math/i386/allshr_asm.s +++ b/lib/sdk/crt/math/i386/allshr_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl __allshr - -.intel_syntax noprefix +#include + +PUBLIC __allshr + /* FUNCTIONS ***************************************************************/ +.code // // llshr - long shift right @@ -93,3 +94,5 @@ __allshr: sar edx,31 mov eax,edx ret + +END diff --git a/lib/sdk/crt/math/i386/atan_asm.s b/lib/sdk/crt/math/i386/atan_asm.s index 37554c940ae..df9f37c0ce7 100644 --- a/lib/sdk/crt/math/i386/atan_asm.s +++ b/lib/sdk/crt/math/i386/atan_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl _atan - -.intel_syntax noprefix +#include + +PUBLIC _atan + /* FUNCTIONS ***************************************************************/ +.code _atan: push ebp @@ -48,3 +49,5 @@ _atan: fpatan // Take the arctangent pop ebp ret + +END diff --git a/lib/sdk/crt/math/i386/aulldiv_asm.s b/lib/sdk/crt/math/i386/aulldiv_asm.s index 565914eb87b..2721bfddf9f 100644 --- a/lib/sdk/crt/math/i386/aulldiv_asm.s +++ b/lib/sdk/crt/math/i386/aulldiv_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - - .globl __aulldiv -.intel_syntax noprefix +#include + +PUBLIC __aulldiv /* FUNCTIONS ***************************************************************/ +.code // // ulldiv - unsigned long divide @@ -105,7 +106,7 @@ __aulldiv: mov eax,DVSRHI // check to see if divisor < 4194304K 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 eax,DVNDHI // load high word of dividend xor edx,edx @@ -114,24 +115,24 @@ __aulldiv: mov eax,DVNDLO // edx:eax <- remainder:lo word of dividend div ecx // get low order bits of quotient 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 // -..L1: +.L1: mov ecx,eax // ecx:ebx <- divisor mov ebx,DVSRLO mov edx,DVNDHI // edx:eax <- dividend mov eax,DVNDLO -..L3: +.L3: shr ecx,1 // shift divisor right one bit// hi bit <- 0 rcr ebx,1 shr edx,1 // shift dividend right one bit// hi bit <- 0 rcr eax,1 or ecx,ecx - jnz short ..L3 // loop until divisor < 4194304K + jnz short .L3 // loop until divisor < 4194304K div ebx // now divide, ignore remainder mov esi,eax // save quotient @@ -147,7 +148,7 @@ __aulldiv: mov eax,DVSRLO mul esi // QUOT * DVSRLO 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 @@ -156,13 +157,13 @@ __aulldiv: // cmp edx,DVNDHI // compare hi words of result and original - ja short ..L4 // if result > original, do subtract - jb short ..L5 // if result < original, we are ok + ja short .L4 // if result > original, do subtract + jb short .L5 // if result < original, we are ok cmp eax,DVNDLO // hi words are equal, compare lo words - jbe short ..L5 // if less or equal we are ok, else subtract -..L4: + jbe short .L5 // if less or equal we are ok, else subtract +.L4: dec esi // subtract 1 from quotient -..L5: +.L5: xor edx,edx // edx:eax <- quotient mov eax,esi @@ -171,9 +172,11 @@ __aulldiv: // Restore the saved registers and return. // -..L2: +.L2: pop esi pop ebx ret 16 + +END diff --git a/lib/sdk/crt/math/i386/aulldvrm_asm.s b/lib/sdk/crt/math/i386/aulldvrm_asm.s index 6f7de08f2b2..14c76a5b99c 100644 --- a/lib/sdk/crt/math/i386/aulldvrm_asm.s +++ b/lib/sdk/crt/math/i386/aulldvrm_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl __aulldvrm - -.intel_syntax noprefix +#include + +PUBLIC __aulldvrm + /* FUNCTIONS ***************************************************************/ +.code __aulldvrm: @@ -101,7 +102,7 @@ __aulldvrm: mov eax,DVSRHI // check to see if divisor < 4194304K 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 eax,DVNDHI // load high word of dividend xor edx,edx @@ -120,24 +121,24 @@ __aulldvrm: mov eax,esi // set up low word of quotient mul dword ptr DVSRLO // LOWORD(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 // -.....L1: +.L1: mov ecx,eax // ecx:ebx <- divisor mov ebx,DVSRLO mov edx,DVNDHI // edx:eax <- dividend mov eax,DVNDLO -.....L3: +.L3: shr ecx,1 // shift divisor right one bit// hi bit <- 0 rcr ebx,1 shr edx,1 // shift dividend right one bit// hi bit <- 0 rcr eax,1 or ecx,ecx - jnz short .....L3 // loop until divisor < 4194304K + jnz short .L3 // loop until divisor < 4194304K div ebx // now divide, ignore remainder mov esi,eax // save quotient @@ -153,7 +154,7 @@ __aulldvrm: mov eax,DVSRLO mul esi // QUOT * DVSRLO 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 @@ -162,18 +163,18 @@ __aulldvrm: // cmp edx,DVNDHI // compare hi words of result and original - ja short .....L4 // if result > original, do subtract - jb short .....L5 // if result < original, we are ok + ja short .L4 // if result > original, do subtract + jb short .L5 // if result < original, we are ok cmp eax,DVNDLO // hi words are equal, compare lo words - jbe short .....L5 // if less or equal we are ok, else subtract -.....L4: + jbe short .L5 // if less or equal we are ok, else subtract +.L4: dec esi // subtract 1 from quotient sub eax,DVSRLO // subtract divisor from result sbb edx,DVSRHI -.....L5: +.L5: xor ebx,ebx // ebx:esi <- quotient -.....L2: +.L2: // // 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 @@ -202,3 +203,5 @@ __aulldvrm: pop esi ret 16 + +END diff --git a/lib/sdk/crt/math/i386/aullrem_asm.s b/lib/sdk/crt/math/i386/aullrem_asm.s index bfcb0efb2a0..3f0cd379a11 100644 --- a/lib/sdk/crt/math/i386/aullrem_asm.s +++ b/lib/sdk/crt/math/i386/aullrem_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl __aullrem - -.intel_syntax noprefix +#include + +PUBLIC __aullrem + /* FUNCTIONS ***************************************************************/ +.code // // ullrem - unsigned long remainder @@ -101,7 +102,7 @@ __aullrem: mov eax,DVSRHI // check to see if divisor < 4194304K 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 eax,DVNDHI // load high word of dividend xor edx,edx @@ -110,24 +111,24 @@ __aullrem: div ecx // edx <- final remainder mov eax,edx // edx:eax <- remainder 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 // -...L1: +.L1: mov ecx,eax // ecx:ebx <- divisor mov ebx,DVSRLO mov edx,DVNDHI // edx:eax <- dividend mov eax,DVNDLO -...L3: +.L3: shr ecx,1 // shift divisor right one bit// hi bit <- 0 rcr ebx,1 shr edx,1 // shift dividend right one bit// hi bit <- 0 rcr eax,1 or ecx,ecx - jnz short ...L3 // loop until divisor < 4194304K + jnz short .L3 // loop until divisor < 4194304K div ebx // now divide, ignore remainder // @@ -142,7 +143,7 @@ __aullrem: xchg ecx,eax // put partial product in ECX, get quotient in EAX mul dword ptr DVSRLO 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 @@ -151,14 +152,14 @@ __aullrem: // cmp edx,DVNDHI // compare hi words of result and original - ja short ...L4 // if result > original, do subtract - jb short ...L5 // if result < original, we're ok + ja short .L4 // if result > original, do subtract + jb short .L5 // if result < original, we're ok cmp eax,DVNDLO // hi words are equal, compare lo words - jbe short ...L5 // if less or equal we're ok, else subtract -...L4: + jbe short .L5 // if less or equal we're ok, else subtract +.L4: sub eax,DVSRLO // subtract divisor from result sbb edx,DVSRHI -...L5: +.L5: // // Calculate remainder by subtracting the result from the original dividend. @@ -177,8 +178,10 @@ __aullrem: // Restore the saved registers and return. // -...L2: +.L2: pop ebx ret 16 + +END diff --git a/lib/sdk/crt/math/i386/aullshr_asm.s b/lib/sdk/crt/math/i386/aullshr_asm.s index 1b9f2af9f2e..b838e46847b 100644 --- a/lib/sdk/crt/math/i386/aullshr_asm.s +++ b/lib/sdk/crt/math/i386/aullshr_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl __aullshr - -.intel_syntax noprefix +#include + +PUBLIC __aullshr + /* FUNCTIONS ***************************************************************/ +.code // // ullshr - long shift right @@ -65,13 +66,13 @@ __aullshr: // depends only on the high order bit of edx). // cmp cl,64 - jae short ..RETZERO + jae short .RETZERO // // Handle shifts of between 0 and 31 bits // cmp cl, 32 - jae short ..MORE32 + jae short .MORE32 shrd eax,edx,cl shr edx,cl ret @@ -79,7 +80,7 @@ __aullshr: // // Handle shifts of between 32 and 63 bits // -..MORE32: +.MORE32: mov eax,edx xor edx,edx and cl,31 @@ -89,7 +90,9 @@ __aullshr: // // return 0 in edx:eax // -..RETZERO: +.RETZERO: xor eax,eax xor edx,edx ret + +END diff --git a/lib/sdk/crt/math/i386/ceil_asm.s b/lib/sdk/crt/math/i386/ceil_asm.s index aad69114f5a..b98df48d52d 100644 --- a/lib/sdk/crt/math/i386/ceil_asm.s +++ b/lib/sdk/crt/math/i386/ceil_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl _ceil -.intel_syntax noprefix +#include + +PUBLIC _ceil /* FUNCTIONS ***************************************************************/ +.code _ceil: push ebp @@ -47,7 +48,7 @@ _ceil: fld qword ptr [ebp+8] // Load real from stack fstcw [ebp-2] // Save control word fclex // Clear exceptions - mov word ptr [ebp-4],0xb63 // Rounding control word + mov word ptr [ebp-4], HEX(0b63) // Rounding control word fldcw [ebp-4] // Set new rounding control frndint // Round to integer fclex // Clear exceptions @@ -55,3 +56,5 @@ _ceil: mov esp,ebp // Deallocate temporary space pop ebp ret + +END diff --git a/lib/sdk/crt/math/i386/ceilf.S b/lib/sdk/crt/math/i386/ceilf.S index 9eee272ecb3..d8cc324708e 100644 --- a/lib/sdk/crt/math/i386/ceilf.S +++ b/lib/sdk/crt/math/i386/ceilf.S @@ -3,53 +3,34 @@ * This file is part of the w64 mingw-runtime package. * No warranty is given; refer to the file DISCLAIMER.PD within this package. */ -#include <_mingw_mac.h> - .file "ceilf.S" - .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) +#include - fstcw 4(%rsp) /* store fpu control word */ +.code +.align 4 - movl $0x0800,%edx /* round towards +oo */ - orl 4(%rsp),%edx - andl $0xfbff,%edx - movl %edx,(%rsp) - fldcw (%rsp) /* load modified control word */ +PUBLIC _ceilf +_ceilf: - frndint /* round */ + fld dword ptr [esp + 4] + sub esp, 8 - fldcw 4(%rsp) /* restore original 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 */ + fstcw [esp + 4] /* store fpu control word */ /* We use here %edx although only the low 1 bits are defined. But none of the operations should care and they are faster than the 16 bit operations. */ - movl $0x0800,%edx /* round towards +oo */ - orl 4(%esp),%edx - andl $0xfbff,%edx - movl %edx,(%esp) - fldcw (%esp) /* load modified control word */ + mov edx, [esp + 4] + or edx, HEX(0800) /* round towards +oo */ + and edx, HEX(fbff) + mov [esp], edx + fldcw [esp] /* load modified control word */ frndint /* round */ - fldcw 4(%esp) /* restore original control word */ + fldcw [esp + 4] /* restore original control word */ - addl $8,%esp + add esp, 8 ret -#endif + +END diff --git a/lib/sdk/crt/math/i386/cos_asm.s b/lib/sdk/crt/math/i386/cos_asm.s index b1c6ada49b2..a14f3e5f8c7 100644 --- a/lib/sdk/crt/math/i386/cos_asm.s +++ b/lib/sdk/crt/math/i386/cos_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl _cos -.intel_syntax noprefix +#include + +PUBLIC _cos /* FUNCTIONS ***************************************************************/ +.code _cos: push ebp @@ -47,3 +48,5 @@ _cos: fcos // Take the cosine pop ebp ret + +END diff --git a/lib/sdk/crt/math/i386/fabs_asm.s b/lib/sdk/crt/math/i386/fabs_asm.s index 5c6ce9214ef..6f16dbf5f90 100644 --- a/lib/sdk/crt/math/i386/fabs_asm.s +++ b/lib/sdk/crt/math/i386/fabs_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl _fabs - -.intel_syntax noprefix +#include + +PUBLIC _fabs + /* FUNCTIONS ***************************************************************/ +.code _fabs: push ebp @@ -47,3 +48,5 @@ _fabs: fabs // Take the absolute value pop ebp ret + +END diff --git a/lib/sdk/crt/math/i386/floor_asm.s b/lib/sdk/crt/math/i386/floor_asm.s index f03c85cb4e8..87ebaf246e6 100644 --- a/lib/sdk/crt/math/i386/floor_asm.s +++ b/lib/sdk/crt/math/i386/floor_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl _floor - -.intel_syntax noprefix +#include + +PUBLIC _floor + /* FUNCTIONS ***************************************************************/ +.code _floor: push ebp @@ -47,7 +48,7 @@ _floor: fld qword ptr [ebp+8] // Load real from stack fstcw [ebp-2] // Save control word fclex // Clear exceptions - mov word ptr [ebp-4],0x763 // Rounding control word + mov word ptr [ebp-4], HEX(0763) // Rounding control word fldcw [ebp-4] // Set new rounding control frndint // Round to integer fclex // Clear exceptions @@ -55,3 +56,5 @@ _floor: mov esp,ebp pop ebp ret + +END diff --git a/lib/sdk/crt/math/i386/floorf.S b/lib/sdk/crt/math/i386/floorf.S index eec073b2376..ff2561d1bb7 100644 --- a/lib/sdk/crt/math/i386/floorf.S +++ b/lib/sdk/crt/math/i386/floorf.S @@ -7,57 +7,34 @@ * Removed header file dependency for use in libmingwex.a by * Danny Smith */ -#include <_mingw_mac.h> - .file "floorf.S" - .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) +#include - fstcw 4(%rsp) /* store fpu control word */ - movl $0x400,%edx /* round towards -oo */ - orl 4(%rsp),%edx - andl $0xf7ff,%edx - movl %edx,(%rsp) - fldcw (%rsp) /* load modified control word */ +.code +.align 4 - frndint /* round */ +PUBLIC _floorf +_floorf: - fldcw 4(%rsp) /* restore original control word */ + fld dword ptr [esp + 4] + sub esp, 8 - 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 */ + fstcw [esp + 4] /* store fpu control word */ /* We use here %edx although only the low 1 bits are defined. But none of the operations should care and they are faster than the 16 bit operations. */ - movl $0x400,%edx /* round towards -oo */ - orl 4(%esp),%edx - andl $0xf7ff,%edx - movl %edx,(%esp) - fldcw (%esp) /* load modified control word */ + mov edx, [esp + 4] + or edx, HEX(0400) /* round towards -oo */ + and edx, HEX(0f7ff) + mov [esp], edx + fldcw [esp] /* load modified control word */ frndint /* round */ - fldcw 4(%esp) /* restore original control word */ + fldcw [esp + 4] /* restore original control word */ - addl $8,%esp + add esp, 8 ret -#endif + +END diff --git a/lib/sdk/crt/math/i386/ftol_asm.s b/lib/sdk/crt/math/i386/ftol_asm.s index 4e1445a9988..a83665009f8 100644 --- a/lib/sdk/crt/math/i386/ftol_asm.s +++ b/lib/sdk/crt/math/i386/ftol_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl __ftol - -.intel_syntax noprefix +#include + +PUBLIC __ftol + /* FUNCTIONS ***************************************************************/ +.code /* * This routine is called by MSVC-generated code to convert from floating point @@ -54,7 +55,7 @@ __ftol: fstcw [ebp-2] wait mov ax, [ebp-2] - or ah, 0xC + or ah, 12 mov [ebp-4], ax fldcw [ebp-4] @@ -71,3 +72,5 @@ __ftol: /* Remove stack frame and return*/ leave ret + +END diff --git a/lib/sdk/crt/math/i386/log10_asm.s b/lib/sdk/crt/math/i386/log10_asm.s index 71731816429..dc328aa679a 100644 --- a/lib/sdk/crt/math/i386/log10_asm.s +++ b/lib/sdk/crt/math/i386/log10_asm.s @@ -7,12 +7,13 @@ * PROGRAMER: Magnus Olsen (magnus@greatlord.com) * */ - -.globl _log10 -.intel_syntax noprefix +#include + +PUBLIC _log10 /* FUNCTIONS ***************************************************************/ +.code _log10: @@ -25,3 +26,4 @@ _log10: pop ebp ret +END diff --git a/lib/sdk/crt/math/i386/log_asm.s b/lib/sdk/crt/math/i386/log_asm.s index 0d98279ed41..d0f5ec78534 100644 --- a/lib/sdk/crt/math/i386/log_asm.s +++ b/lib/sdk/crt/math/i386/log_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl _log - -.intel_syntax noprefix +#include + +PUBLIC _log + /* FUNCTIONS ***************************************************************/ +.code _log: push ebp @@ -49,3 +50,5 @@ _log: fyl2x // Compute the natural log(x) pop ebp ret + +END diff --git a/lib/sdk/crt/math/i386/pow_asm.s b/lib/sdk/crt/math/i386/pow_asm.s index 0b79aa5883e..e775e60f740 100644 --- a/lib/sdk/crt/math/i386/pow_asm.s +++ b/lib/sdk/crt/math/i386/pow_asm.s @@ -19,41 +19,54 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -/* Reacros modifications */ +/* Reactos modifications */ +#include + #define ALIGNARG(log2) log2 #define ASM_TYPE_DIRECTIVE(name,typearg) #define ASM_SIZE_DIRECTIVE(name) #define cfi_adjust_cfa_offset(x) -#define ENTRY(x) -#define END(x) -.global _pow +PUBLIC _pow + + .data .text +ASSUME CS:NOTHING, DS:NOTHING, ES:NOTHING, FS:NOTHING, GS:NOTHING .align ALIGNARG(4) ASM_TYPE_DIRECTIVE(infinity,@object) + inf_zero: 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_TYPE_DIRECTIVE(zero,@object) -zero: .double 0.0 +zero: + .double 0.0 ASM_SIZE_DIRECTIVE(zero) ASM_TYPE_DIRECTIVE(minf_mzero,@object) + minf_mzero: minfinity: - .byte 0, 0, 0, 0, 0, 0, 0xf0, 0xff + .byte 0, 0, 0, 0, 0, 0, HEX(f0), HEX(ff) + 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_TYPE_DIRECTIVE(one,@object) -one: .double 1.0 + +one: + .double 1.0 ASM_SIZE_DIRECTIVE(one) ASM_TYPE_DIRECTIVE(limit,@object) -limit: .double 0.29 + +limit: + .double 0.29 ASM_SIZE_DIRECTIVE(limit) 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) #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) #else #define MO(op) op -#define MOX(op,x,f) op(,x,f) +#define MOX(op,x,f) op[x*f] #endif + .code .text _pow: -ENTRY(__ieee754_pow) - fldl 12(%esp) // y + fld qword ptr [esp + 12] // y fxam #ifdef PIC LOAD_PIC_REG (cx) #endif - fnstsw - movb %ah, %dl - andb $0x45, %ah - cmpb $0x40, %ah // is y == 0 ? - je 11f + fnstsw ax + mov dl, ah + and ah, HEX(045) + cmp ah, HEX(040) // is y == 0 ? + je L11 - cmpb $0x05, %ah // is y == ±inf ? - je 12f + cmp ah, 5 // is y == ±inf ? + je L12 - cmpb $0x01, %ah // is y == NaN ? - je 30f + cmp ah, 1 // is y == NaN ? + 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) fxam - fnstsw - movb %ah, %dh - andb $0x45, %ah - cmpb $0x40, %ah - je 20f // x is ±0 + fnstsw ax + mov dh, ah + and ah, HEX(45) + cmp ah, HEX(040) + je L20 // x is ±0 - cmpb $0x05, %ah - je 15f // x is ±inf + cmp ah, 5 + je L15 // x is ±inf - fxch // y : x + fxch st(1) // y : x /* fistpll raises invalid exception for |y| >= 1L<<63. */ - fld %st // y : y : x + fld st // y : y : x fabs // |y| : y : x - fcompl MO(p63) // y : x - fnstsw + fcomp qword ptr MO(p63) // y : x + fnstsw ax sahf - jnc 2f + jnc L2 /* First see whether `y' is a natural number. In this case we can use a more precise algorithm. */ - fld %st // y : y : x - fistpll (%esp) // y : x - fildll (%esp) // int(y) : y : x - fucomp %st(1) // y : x - fnstsw + fld st // y : y : x + fistp qword ptr [esp] // y : x + fild qword ptr [esp] // int(y) : y : x + fucomp st(1) // y : x + fnstsw ax sahf - jne 2f + jne L2 /* OK, we have an integer value for y. */ - popl %eax + pop eax cfi_adjust_cfa_offset (-4) - popl %edx + pop edx cfi_adjust_cfa_offset (-4) - orl $0, %edx - fstp %st(0) // x - jns 4f // y >= 0, jump - fdivrl MO(one) // 1/x (now referred to as x) - negl %eax - adcl $0, %edx - negl %edx -4: fldl MO(one) // 1 : x - fxch + or edx, 0 + fstp st // x + jns L4 // y >= 0, jump + fdivr qword ptr MO(one) // 1/x (now referred to as x) + neg eax + adc edx, 0 + neg edx +L4: fld qword ptr MO(one) // 1 : x + fxch st(1) -6: shrdl $1, %edx, %eax - jnc 5f - fxch - fmul %st(1) // x : ST*x - fxch -5: fmul %st(0), %st // x*x : ST*x - shrl $1, %edx - movl %eax, %ecx - orl %edx, %ecx - jnz 6b - fstp %st(0) // ST*x +L6: shrd eax, edx, 1 + jnc L5 + fxch st(1) + fmul st, st(1) // x : ST*x + fxch st(1) +L5: fmul st, st // x*x : ST*x + shr edx, 1 + mov ecx, eax + or ecx, edx + jnz L6 + fstp st // ST*x ret /* y is ±NAN */ -30: fldl 4(%esp) // x : y - fldl MO(one) // 1.0 : x : y - fucomp %st(1) // x : y - fnstsw +L30: + fld qword ptr [esp + 4] // x : y + fld qword ptr MO(one) // 1.0 : x : y + fucomp st(1) // x : y + fnstsw ax sahf - je 31f - fxch // y : x -31: fstp %st(1) + je L31 + fxch st(1) // y : x +L31:fstp st(1) ret cfi_adjust_cfa_offset (8) .align ALIGNARG(4) -2: /* y is a real number. */ - fxch // x : y - fldl MO(one) // 1.0 : x : y - fldl MO(limit) // 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 +L2: /* y is a real number. */ + fxch st(1) // x : y + fld qword ptr MO(one) // 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 + fsub st, st(2) // x-1 : 0.29 : 1.0 : x : y fabs // |x-1| : 0.29 : 1.0 : x : y fucompp // 1.0 : x : y - fnstsw - fxch // x : 1.0 : y + fnstsw ax + fxch st(1) // x : 1.0 : y sahf - ja 7f - fsub %st(1) // x-1 : 1.0 : y + ja L7 + fsub st, st(1) // x-1 : 1.0 : y fyl2xp1 // log2(x) : y - jmp 8f + jmp L8 -7: fyl2x // log2(x) : y -8: fmul %st(1) // y*log2(x) : y - fst %st(1) // y*log2(x) : y*log2(x) +L7: fyl2x // log2(x) : y +L8: fmul st, st(1) // y*log2(x) : y + fst st(1) // 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)) 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)) - addl $8, %esp + add esp, 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 // pow(x,±0) = 1 .align ALIGNARG(4) -11: fstp %st(0) // pop y - fldl MO(one) +L11:fstp st(0) // pop y + fld qword ptr MO(one) ret // y == ±inf .align ALIGNARG(4) -12: fstp %st(0) // pop y - fldl MO(one) // 1 - fldl 4(%esp) // x : 1 +L12: fstp st(0) // pop y + fld qword ptr MO(one) // 1 + fld qword ptr [esp + 4] // x : 1 fabs // abs(x) : 1 fucompp // < 1, == 1, or > 1 - fnstsw - andb $0x45, %ah - cmpb $0x45, %ah - je 13f // jump if x is NaN + fnstsw ax + and ah, HEX(45) + cmp ah, HEX(45) + je L13 // jump if x is NaN - cmpb $0x40, %ah - je 14f // jump if |x| == 1 + cmp ah, HEX(40) + je L14 // jump if |x| == 1 - shlb $1, %ah - xorb %ah, %dl - andl $2, %edx - fldl MOX(inf_zero, %edx, 4) + shl ah, 1 + xor dl, ah + and edx, 2 + fld qword ptr MOX(inf_zero, edx, 4) ret .align ALIGNARG(4) -14: fldl MO(one) +L14:fld qword ptr MO(one) ret .align ALIGNARG(4) -13: fldl 4(%esp) // load x == NaN +L13:fld qword ptr [esp + 4] // load x == NaN ret cfi_adjust_cfa_offset (8) .align ALIGNARG(4) // x is ±inf -15: fstp %st(0) // y - testb $2, %dh - jz 16f // jump if x == +inf +L15: fstp st(0) // y + test dh, 2 + jz L16 // jump if x == +inf // We must find out whether y is an odd integer. - fld %st // y : y - fistpll (%esp) // y - fildll (%esp) // int(y) : y + fld st // y : y + fistp qword ptr [esp] // y + fild qword ptr [esp] // int(y) : y fucompp // - fnstsw + fnstsw ax sahf - jne 17f + jne L17 // OK, the value is an integer, but is the number of bits small // enough so that all are coming from the mantissa? - popl %eax + pop eax cfi_adjust_cfa_offset (-4) - popl %edx + pop edx cfi_adjust_cfa_offset (-4) - andb $1, %al - jz 18f // jump if not odd - movl %edx, %eax - orl %edx, %edx - jns 155f - negl %eax -155: cmpl $0x00200000, %eax - ja 18f // does not fit in mantissa bits + and al, 1 + jz L18 // jump if not odd + mov eax, edx + or edx, edx + jns L155 + neg eax +L155: + cmp eax, HEX(000200000) + ja L18 // does not fit in mantissa bits // It's an odd integer. - shrl $31, %edx - fldl MOX(minf_mzero, %edx, 8) + shr edx, 31 + fld qword ptr MOX(minf_mzero, edx, 8) ret cfi_adjust_cfa_offset (8) .align ALIGNARG(4) -16: fcompl MO(zero) - addl $8, %esp +L16:fcomp qword ptr MO(zero) + add esp, 8 cfi_adjust_cfa_offset (-8) - fnstsw - shrl $5, %eax - andl $8, %eax - fldl MOX(inf_zero, %eax, 1) + fnstsw ax + shr eax, 5 + and eax, 8 + fld qword ptr MOX(inf_zero, eax, 1) ret cfi_adjust_cfa_offset (8) .align ALIGNARG(4) -17: shll $30, %edx // sign bit for y in right position - addl $8, %esp +L17: shl ecx, 30 // sign bit for y in right position + add esp, 8 cfi_adjust_cfa_offset (-8) -18: shrl $31, %edx - fldl MOX(inf_zero, %edx, 8) +L18: shr edx, 31 + fld qword ptr MOX(inf_zero, edx, 8) ret cfi_adjust_cfa_offset (8) .align ALIGNARG(4) // x is ±0 -20: fstp %st(0) // y - testb $2, %dl - jz 21f // y > 0 +L20: fstp st(0) // y + test dl, 2 + jz L21 // y > 0 // x is ±0 and y is < 0. We must find out whether y is an odd integer. - testb $2, %dh - jz 25f + test dh, 2 + jz L25 - fld %st // y : y - fistpll (%esp) // y - fildll (%esp) // int(y) : y + fld st // y : y + fistp qword ptr [esp] // y + fild qword ptr [esp] // int(y) : y fucompp // - fnstsw + fnstsw ax sahf - jne 26f + jne L26 // OK, the value is an integer, but is the number of bits small // enough so that all are coming from the mantissa? - popl %eax + pop eax cfi_adjust_cfa_offset (-4) - popl %edx + pop edx cfi_adjust_cfa_offset (-4) - andb $1, %al - jz 27f // jump if not odd - cmpl $0xffe00000, %edx - jbe 27f // does not fit in mantissa bits + and al, 1 + jz L27 // jump if not odd + cmp edx, HEX(0ffe00000) + jbe L27 // does not fit in mantissa bits // It's an odd integer. // Raise divide-by-zero exception and get minus infinity value. - fldl MO(one) - fdivl MO(zero) + fld qword ptr MO(one) + fdiv qword ptr MO(zero) fchs ret cfi_adjust_cfa_offset (8) -25: fstp %st(0) -26: addl $8, %esp +L25: fstp st(0) +L26: add esp, 8 cfi_adjust_cfa_offset (-8) -27: // Raise divide-by-zero exception and get infinity value. - fldl MO(one) - fdivl MO(zero) +L27: // Raise divide-by-zero exception and get infinity value. + fld qword ptr MO(one) + fdiv qword ptr MO(zero) ret cfi_adjust_cfa_offset (8) .align ALIGNARG(4) // x is ±0 and y is > 0. We must find out whether y is an odd integer. -21: testb $2, %dh - jz 22f +L21:test dh, 2 + jz L22 - fld %st // y : y - fistpll (%esp) // y - fildll (%esp) // int(y) : y + fld st // y : y + fistp qword ptr [esp] // y + fild qword ptr [esp] // int(y) : y fucompp // - fnstsw + fnstsw ax sahf - jne 23f + jne L23 // OK, the value is an integer, but is the number of bits small // enough so that all are coming from the mantissa? - popl %eax + pop eax cfi_adjust_cfa_offset (-4) - popl %edx + pop edx cfi_adjust_cfa_offset (-4) - andb $1, %al - jz 24f // jump if not odd - cmpl $0xffe00000, %edx - jae 24f // does not fit in mantissa bits + and al, 1 + jz L24 // jump if not odd + cmp edx, HEX(0ffe00000) + jae L24 // does not fit in mantissa bits // It's an odd integer. - fldl MO(mzero) + fld qword ptr MO(mzero) ret cfi_adjust_cfa_offset (8) -22: fstp %st(0) -23: addl $8, %esp // Don't use 2 x pop +L22: fstp st(0) +L23: add esp, 8 // Don't use 2 x pop cfi_adjust_cfa_offset (-8) -24: fldl MO(zero) +L24: fld qword ptr MO(zero) ret -END(__ieee754_pow) +END diff --git a/lib/sdk/crt/math/i386/sin_asm.s b/lib/sdk/crt/math/i386/sin_asm.s index 39791a3e989..4d7a1f4f47e 100644 --- a/lib/sdk/crt/math/i386/sin_asm.s +++ b/lib/sdk/crt/math/i386/sin_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl _sin -.intel_syntax noprefix +#include + +PUBLIC _sin /* FUNCTIONS ***************************************************************/ +.code _sin: push ebp // Save register bp @@ -47,3 +48,5 @@ _sin: fsin // Take the sine pop ebp // Restore register bp ret + +END diff --git a/lib/sdk/crt/math/i386/sqrt_asm.s b/lib/sdk/crt/math/i386/sqrt_asm.s index c953a0350e9..ecc5ba96577 100644 --- a/lib/sdk/crt/math/i386/sqrt_asm.s +++ b/lib/sdk/crt/math/i386/sqrt_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl _sqrt - -.intel_syntax noprefix +#include + +PUBLIC _sqrt + /* FUNCTIONS ***************************************************************/ +.code _sqrt: push ebp @@ -47,3 +48,5 @@ _sqrt: fsqrt // Take the square root pop ebp ret + +END diff --git a/lib/sdk/crt/math/i386/tan_asm.s b/lib/sdk/crt/math/i386/tan_asm.s index 34af2614f89..6882fde51a3 100644 --- a/lib/sdk/crt/math/i386/tan_asm.s +++ b/lib/sdk/crt/math/i386/tan_asm.s @@ -33,12 +33,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - -.globl _tan - -.intel_syntax noprefix +#include + +PUBLIC _tan + /* FUNCTIONS ***************************************************************/ +.code _tan: push ebp @@ -50,3 +51,5 @@ _tan: mov esp,ebp // Deallocate temporary space pop ebp ret + +END diff --git a/lib/sdk/crt/math/labs.c b/lib/sdk/crt/math/labs.c index b4fc33ec0a0..dcfd8644655 100644 --- a/lib/sdk/crt/math/labs.c +++ b/lib/sdk/crt/math/labs.c @@ -1,5 +1,6 @@ /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#ifndef _MSC_VER /* * @implemented */ @@ -8,3 +9,4 @@ labs(long j) { return j<0 ? -j : j; } +#endif diff --git a/lib/sdk/crt/mem/i386/memchr_asm.s b/lib/sdk/crt/mem/i386/memchr_asm.s index f6e8037fc31..aa644433458 100644 --- a/lib/sdk/crt/mem/i386/memchr_asm.s +++ b/lib/sdk/crt/mem/i386/memchr_asm.s @@ -5,28 +5,33 @@ * FILE: lib/sdk/crt/mem/i386/memchr.s */ +#include + /* * void* memchr(const void* s, int c, size_t n) */ -.globl _memchr +PUBLIC _memchr +.code _memchr: - push %ebp - mov %esp,%ebp - push %edi - mov 0x8(%ebp),%edi - mov 0xc(%ebp),%eax - mov 0x10(%ebp),%ecx + push ebp + mov ebp, esp + push edi + mov edi, [ebp + 8] + mov eax, [ebp + 12] + mov ecx, [ebp + 16] cld - jecxz .Lnotfound - repne scasb - je .Lfound + jecxz .Lnotfound + repne scasb + je .Lfound .Lnotfound: - mov $1,%edi + mov edi, 1 .Lfound: - mov %edi,%eax - dec %eax - pop %edi + mov eax, edi + dec eax + pop edi leave ret + +END diff --git a/lib/sdk/crt/mem/i386/memcpy_asm.s b/lib/sdk/crt/mem/i386/memcpy_asm.s deleted file mode 100644 index 36a1a079513..00000000000 --- a/lib/sdk/crt/mem/i386/memcpy_asm.s +++ /dev/null @@ -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 - diff --git a/lib/sdk/crt/mem/i386/memmove_asm.s b/lib/sdk/crt/mem/i386/memmove_asm.s index e27006e3bed..6804f22e93d 100644 --- a/lib/sdk/crt/mem/i386/memmove_asm.s +++ b/lib/sdk/crt/mem/i386/memmove_asm.s @@ -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 +PUBLIC _memcpy +PUBLIC _memmove +.code + +_memcpy: _memmove: - push %ebp - mov %esp,%ebp + push ebp + mov ebp, esp - push %esi - push %edi + push esi + push edi - mov 8(%ebp),%edi - mov 12(%ebp),%esi - mov 16(%ebp),%ecx + mov edi, [ebp + 8] + mov esi, [ebp + 12] + mov ecx, [ebp + 16] - cmp %esi,%edi + cmp edi, esi jbe .CopyUp - mov %ecx,%eax - add %esi,%eax - cmp %eax,%edi - jb .CopyDown - + mov eax, ecx + add eax, esi + cmp edi, eax + jb .CopyDown + .CopyUp: cld - cmp $16,%ecx - jb .L1 - mov %ecx,%edx - test $3,%edi - je .L2 + cmp ecx, 16 + jb .L1 + mov edx, ecx + test edi, 3 + 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 + mov ecx, edi + and ecx, 3 + sub ecx, 5 + not ecx + sub edx, ecx + rep movsb + mov ecx, edx .L2: - shr $2,%ecx - rep movsl - mov %edx,%ecx - and $3,%ecx + shr ecx, 2 + rep movsd + mov ecx, edx + and ecx, 3 .L1: - test %ecx,%ecx - je .L3 - rep movsb + test ecx, ecx + je .L3 + rep movsb .L3: - mov 8(%ebp),%eax - pop %edi - pop %esi + mov eax, [ebp + 8] + pop edi + pop esi leave ret .CopyDown: - std + std - add %ecx,%edi - add %ecx,%esi + add edi, ecx + add esi, ecx - cmp $16,%ecx - jb .L4 - mov %ecx,%edx - test $3,%edi - je .L5 + cmp ecx, 16 + jb .L4 + mov edx, ecx + test edi, 3 + 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 + mov ecx, edi + and ecx, 3 + sub edx, ecx + dec esi + dec edi + rep movsb + mov ecx, edx - sub $3,%esi - sub $3,%edi + sub esi, 3 + sub edi, 3 .L6: - shr $2,%ecx - rep movsl - mov %edx,%ecx - and $3,%ecx - je .L7 - add $3,%esi - add $3,%edi + shr ecx, 2 + rep movsd + mov ecx, edx + and ecx, 3 + je .L7 + add esi, 3 + add edi, 3 .L8: - rep movsb + rep movsb .L7: cld - mov 8(%ebp),%eax - pop %edi - pop %esi + mov eax, [ebp + 8] + 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 + sub edi, 4 + sub esi, 4 + jmp .L6 +.L4: + test ecx, ecx + je .L7 + dec esi + dec edi + jmp .L8 + +END diff --git a/lib/sdk/crt/mem/i386/memset_asm.s b/lib/sdk/crt/mem/i386/memset_asm.s index 4f7c9436e71..4608846b714 100644 --- a/lib/sdk/crt/mem/i386/memset_asm.s +++ b/lib/sdk/crt/mem/i386/memset_asm.s @@ -2,46 +2,50 @@ * $Id$ */ +#include + /* * void *memset (void *src, int val, size_t count) */ -.globl _memset +PUBLIC _memset +.code _memset: - push %ebp - mov %esp,%ebp - push %edi - mov 0x8(%ebp),%edi - movzb 0xc(%ebp),%eax - mov 0x10(%ebp),%ecx + push ebp + mov ebp, esp + push edi + mov edi, [ebp + 8] + movzx eax, byte ptr [ebp + 12] + mov ecx, [ebp + 16] cld - cmp $16,%ecx - jb .L1 - mov $0x01010101,%edx - mul %edx - mov %ecx,%edx - test $3,%edi - je .L2 - mov %edi,%ecx - and $3,%ecx - sub $5,%ecx - not %ecx - sub %ecx,%edx - rep stosb - mov %edx,%ecx + cmp ecx, 16 + jb .L1 + mov edx, HEX(01010101) + mul edx + mov edx, ecx + test edi, 3 + je .L2 + mov ecx, edi + and ecx, 3 + sub ecx, 5 + not ecx + sub edx, ecx + rep stosb + mov ecx, edx .L2: - shr $2,%ecx - rep stosl - mov %edx,%ecx - and $3,%ecx + shr ecx, 2 + rep stosd + mov ecx, edx + and ecx, 3 .L1: - test %ecx,%ecx - je .L3 - rep stosb + test ecx, ecx + je .L3 + rep stosb .L3: - pop %edi - mov 0x8(%ebp),%eax + pop edi + mov eax, [ebp + 8] leave ret +END diff --git a/lib/sdk/crt/mem/memcmp.c b/lib/sdk/crt/mem/memcmp.c index 078238ebd20..e212e82c409 100644 --- a/lib/sdk/crt/mem/memcmp.c +++ b/lib/sdk/crt/mem/memcmp.c @@ -2,6 +2,8 @@ * $Id$ */ +#ifndef _MSC_VER + #include 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; } + +#endif diff --git a/lib/sdk/crt/setjmp/i386/setjmp.s b/lib/sdk/crt/setjmp/i386/setjmp.s index 7cf257cca24..c4b9e1c0793 100644 --- a/lib/sdk/crt/setjmp/i386/setjmp.s +++ b/lib/sdk/crt/setjmp/i386/setjmp.s @@ -9,6 +9,9 @@ * complete implementation */ +#include +#include + #define JB_BP 0 #define JB_BX 1 #define JB_DI 2 @@ -20,6 +23,7 @@ #define JMPBUF 4 +.code /* * int * _setjmp(jmp_buf env); @@ -33,20 +37,20 @@ * Notes: * Sets up the jmp_buf */ -.globl __setjmp +PUBLIC __setjmp __setjmp: - xorl %eax, %eax - movl JMPBUF(%esp), %edx + xor eax, eax + mov edx, JMPBUF[esp] /* Save registers. */ - movl %ebp, (JB_BP*4)(%edx) /* Save caller's frame pointer. */ - movl %ebx, (JB_BX*4)(%edx) - movl %edi, (JB_DI*4)(%edx) - movl %esi, (JB_SI*4)(%edx) - leal JMPBUF(%esp), %ecx /* Save SP as it will be after we return. */ - movl %ecx, (JB_SP*4)(%edx) - movl PCOFF(%esp), %ecx /* Save PC we are returning to now. */ - movl %ecx, (JB_IP*4)(%edx) + mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */ + mov [edx + JB_BX*4], ebx + mov [edx + JB_DI*4], edi + mov [edx + JB_SI*4], esi + lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */ + mov [edx + JB_SP*4], ecx + mov ecx, PCOFF[esp] /* Save PC we are returning to now. */ + mov [edx + JB_IP*4], ecx ret /* @@ -62,24 +66,22 @@ __setjmp: * Notes: * Sets up the jmp_buf */ -.globl __setjmp3 +PUBLIC __setjmp3 __setjmp3: - xorl %eax, %eax - movl JMPBUF(%esp), %edx + xor eax, eax + mov edx, JMPBUF[esp] /* Save registers. */ - movl %ebp, (JB_BP*4)(%edx) /* Save caller's frame pointer. */ - movl %ebx, (JB_BX*4)(%edx) - movl %edi, (JB_DI*4)(%edx) - movl %esi, (JB_SI*4)(%edx) - leal JMPBUF(%esp), %ecx /* Save SP as it will be after we return. */ - movl %ecx, (JB_SP*4)(%edx) - movl PCOFF(%esp), %ecx /* Save PC we are returning to now. */ - movl %ecx, (JB_IP*4)(%edx) + mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */ + mov [edx + JB_BX*4], ebx + mov [edx + JB_DI*4], edi + mov [edx + JB_SI*4], esi + lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */ + mov [edx + JB_SP*4], ecx + mov ecx, PCOFF[esp] /* Save PC we are returning to now. */ + mov [edx + JB_IP*4], ecx ret -#define VAL 8 - /* * void * longjmp(jmp_buf env, int value); @@ -94,18 +96,20 @@ __setjmp3: * Notes: * Non-local goto */ -.globl _longjmp +PUBLIC _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. */ - movl (JB_IP*4)(%ecx), %edx + mov edx, [edx + JB_IP*4] /* Restore registers. */ - movl (JB_BP*4)(%ecx), %ebp - movl (JB_BX*4)(%ecx), %ebx - movl (JB_DI*4)(%ecx), %edi - movl (JB_SI*4)(%ecx), %esi - movl (JB_SP*4)(%ecx), %esp + mov ebp, [edx + JB_BP*4] + mov ebx, [edx + JB_BX*4] + mov edi, [edx + JB_DI*4] + mov esi, [edx + JB_SI*4] + mov esp, [edx + JB_SP*4] /* Jump to saved PC. */ - jmp *%edx + jmp dword ptr [edx] + +END diff --git a/lib/sdk/crt/string/i386/tchar.h b/lib/sdk/crt/string/i386/tchar.h index ce2f1b9666d..a313e86111e 100644 --- a/lib/sdk/crt/string/i386/tchar.h +++ b/lib/sdk/crt/string/i386/tchar.h @@ -21,12 +21,12 @@ #define _tlods lodsw #define _tstos stosw -#define _tsize $2 +#define _tsize 2 #define _treg(_O_) _O_ ## x -#define _tdec(_O_) sub $2, _O_ -#define _tinc(_O_) add $2, _O_ +#define _tdec(_O_) sub _O_, 2 +#define _tinc(_O_) add _O_, 2 #else @@ -45,7 +45,7 @@ #define _tlods lodsb #define _tstos stosb -#define _tsize $1 +#define _tsize 1 #define _treg(_O_) _O_ ## l diff --git a/lib/sdk/crt/string/i386/tcscat.h b/lib/sdk/crt/string/i386/tcscat.h index e50676528d8..878197c8722 100644 --- a/lib/sdk/crt/string/i386/tcscat.h +++ b/lib/sdk/crt/string/i386/tcscat.h @@ -2,31 +2,34 @@ */ #include "tchar.h" +#include -.globl _tcscat +PUBLIC _tcscat +.code _tcscat: - push %esi - push %edi - mov 0x0C(%esp), %edi - mov 0x10(%esp), %esi + push esi + push edi + mov edi, [esp + 12] + mov esi, [esp + 16] - xor %eax, %eax - mov $-1, %ecx - cld + xor eax, eax + mov ecx, -1 + cld - repne _tscas - _tdec(%edi) + repne _tscas + _tdec(edi) .L1: - _tlods - _tstos - test %_treg(a), %_treg(a) - jnz .L1 + _tlods + _tstos + test _treg(a), _treg(a) + jnz .L1 - mov 0x0C(%esp), %eax - pop %edi - pop %esi - ret + mov eax, [esp + 12] + pop edi + pop esi + ret +END /* EOF */ diff --git a/lib/sdk/crt/string/i386/tcschr.h b/lib/sdk/crt/string/i386/tcschr.h index ea08bb8d22e..a1a04155f84 100644 --- a/lib/sdk/crt/string/i386/tcschr.h +++ b/lib/sdk/crt/string/i386/tcschr.h @@ -2,29 +2,31 @@ */ #include "tchar.h" +#include -.globl _tcschr +PUBLIC _tcschr +.code _tcschr: - push %esi - mov 0x8(%esp), %esi - mov 0xC(%esp), %edx - - cld + push esi + mov esi, [esp + 8] + mov edx, [esp + 12] + cld .L1: - _tlods - cmp %_treg(a), %_treg(d) - je .L2 - test %_treg(a), %_treg(a) - jnz .L1 - mov _tsize, %esi + _tlods + cmp _treg(d), _treg(a) + je .L2 + test _treg(a), _treg(a) + jnz .L1 + mov esi, _tsize .L2: - mov %esi, %eax - _tdec(%eax) + mov eax, esi + _tdec(eax) - pop %esi - ret + pop esi + ret +END /* EOF */ diff --git a/lib/sdk/crt/string/i386/tcscmp.h b/lib/sdk/crt/string/i386/tcscmp.h index 6830a0ba0dc..8164455a57d 100644 --- a/lib/sdk/crt/string/i386/tcscmp.h +++ b/lib/sdk/crt/string/i386/tcscmp.h @@ -2,33 +2,36 @@ */ #include "tchar.h" +#include -.globl _tcscmp +PUBLIC _tcscmp +.code _tcscmp: - push %esi - push %edi - mov 0x0C(%esp), %esi - mov 0x10(%esp), %edi - xor %eax, %eax - cld + push esi + push edi + mov esi, [esp + 12] + mov edi, [esp + 16] + xor eax, eax + cld .L1: - _tlods - _tscas - jne .L2 - test %eax, %eax - jne .L1 - xor %eax, %eax - jmp .L3 + _tlods + _tscas + jne .L2 + test eax, eax + jne .L1 + xor eax, eax + jmp .L3 .L2: - sbb %eax, %eax - or $1, %al + sbb eax, eax + or al, 1 .L3: - pop %edi - pop %esi - ret + pop edi + pop esi + ret +END /* EOF */ diff --git a/lib/sdk/crt/string/i386/tcscpy.h b/lib/sdk/crt/string/i386/tcscpy.h index cb89a43a4a8..33702b6960d 100644 --- a/lib/sdk/crt/string/i386/tcscpy.h +++ b/lib/sdk/crt/string/i386/tcscpy.h @@ -2,26 +2,29 @@ */ #include "tchar.h" +#include -.globl _tcscpy +PUBLIC _tcscpy +.code _tcscpy: - push %esi - push %edi - mov 0x0C(%esp), %edi - mov 0x10(%esp), %esi - cld + push esi + push edi + mov edi, [esp + 12] + mov esi, [esp + 16] + cld .L1: - _tlods - _tstos - test %_treg(a), %_treg(a) - jnz .L1 + _tlods + _tstos + test _treg(a), _treg(a) + jnz .L1 - mov 0x0C(%esp), %eax + mov eax, [esp + 12] - pop %edi - pop %esi - ret + pop edi + pop esi + ret +END /* EOF */ diff --git a/lib/sdk/crt/string/i386/tcslen.h b/lib/sdk/crt/string/i386/tcslen.h index 8c9586da70d..2f9301b3666 100644 --- a/lib/sdk/crt/string/i386/tcslen.h +++ b/lib/sdk/crt/string/i386/tcslen.h @@ -2,28 +2,31 @@ */ #include "tchar.h" +#include -.globl _tcslen +PUBLIC _tcslen +.code _tcslen: - push %edi - mov 0x8(%esp), %edi - xor %eax, %eax - test %edi,%edi - jz _tcslen_end + push edi + mov edi, [esp + 8] + xor eax, eax + test edi, edi + jz _tcslen_end - mov $-1, %ecx - cld + mov ecx, -1 + cld - repne _tscas + repne _tscas - not %ecx - dec %ecx + not ecx + dec ecx - mov %ecx, %eax + mov eax, ecx _tcslen_end: - pop %edi - ret + pop edi + ret +END /* EOF */ diff --git a/lib/sdk/crt/string/i386/tcsncat.h b/lib/sdk/crt/string/i386/tcsncat.h index f7a3b616396..8c181b33fea 100644 --- a/lib/sdk/crt/string/i386/tcsncat.h +++ b/lib/sdk/crt/string/i386/tcsncat.h @@ -2,41 +2,44 @@ */ #include "tchar.h" +#include -.globl _tcsncat +PUBLIC _tcsncat +.code _tcsncat: - push %esi - push %edi - mov 0x0C(%esp), %edi - mov 0x10(%esp), %esi - cld + push esi + push edi + mov edi, [esp + 12] + mov esi, [esp + 16] + cld - xor %eax, %eax - mov $-1, %ecx - repne _tscas - _tdec(%edi) + xor eax, eax + mov ecx, -1 + repne _tscas + _tdec(edi) - mov 0x14(%esp),%ecx + mov ecx, [esp + 20] .L1: - dec %ecx - js .L2 - _tlods - _tstos - test %_treg(a), %_treg(a) - jne .L1 - jmp .L3 + dec ecx + js .L2 + _tlods + _tstos + test _treg(a), _treg(a) + jne .L1 + jmp .L3 .L2: - xor %eax, %eax - _tstos + xor eax, eax + _tstos .L3: - mov 0x0C(%esp), %eax - pop %edi - pop %esi + mov eax, [esp + 12] + pop edi + pop esi - ret + ret +END /* EOF */ diff --git a/lib/sdk/crt/string/i386/tcsncmp.h b/lib/sdk/crt/string/i386/tcsncmp.h index 58a30859e73..9e2a098ce26 100644 --- a/lib/sdk/crt/string/i386/tcsncmp.h +++ b/lib/sdk/crt/string/i386/tcsncmp.h @@ -2,39 +2,42 @@ */ #include "tchar.h" +#include -.globl _tcsncmp +PUBLIC _tcsncmp +.code _tcsncmp: - push %esi - push %edi - mov 0x0C(%esp), %esi /* s1 */ - mov 0x10(%esp), %edi /* s2 */ - mov 0x14(%esp), %ecx /* n */ + push esi + push edi + mov esi, [esp + 12] /* s1 */ + mov edi, [esp + 16] /* s2 */ + mov ecx, [esp + 20] /* n */ - xor %eax,%eax - cld + xor eax, eax + cld .L1: - dec %ecx - js .L2 - _tlods - _tscas - jne .L3 - test %eax, %eax - jne .L1 + dec ecx + js .L2 + _tlods + _tscas + jne .L3 + test eax, eax + jne .L1 .L2: - xor %eax, %eax - jmp .L4 + xor eax, eax + jmp .L4 .L3: - sbb %eax, %eax - or $1, %al + sbb eax, eax + or al, 1 .L4: - pop %edi - pop %esi - ret + pop edi + pop esi + ret +END /* EOF */ diff --git a/lib/sdk/crt/string/i386/tcsncpy.h b/lib/sdk/crt/string/i386/tcsncpy.h index ed15334d036..9cb03e5a775 100644 --- a/lib/sdk/crt/string/i386/tcsncpy.h +++ b/lib/sdk/crt/string/i386/tcsncpy.h @@ -2,33 +2,36 @@ */ #include "tchar.h" +#include -.globl _tcsncpy +PUBLIC _tcsncpy +.code _tcsncpy: - push %esi - push %edi - mov 0x0C(%esp), %edi /* s1 */ - mov 0x10(%esp), %esi /* s2 */ - mov 0x14(%esp), %ecx /* n */ + push esi + push edi + mov edi, [esp + 12] /* s1 */ + mov esi, [esp + 16] /* s2 */ + mov ecx, [esp + 20] /* n */ - xor %eax, %eax - cld + xor eax, eax + cld .L1: - dec %ecx - js .L2 - _tlods - _tstos - test %_treg(a), %_treg(a) - jnz .L1 - rep _tstos + dec ecx + js .L2 + _tlods + _tstos + test _treg(a), _treg(a) + jnz .L1 + rep _tstos .L2: - mov 0x0C(%esp), %eax + mov eax, [esp + 12] - pop %edi - pop %esi - ret + pop edi + pop esi + ret +END /* EOF */ diff --git a/lib/sdk/crt/string/i386/tcsnlen.h b/lib/sdk/crt/string/i386/tcsnlen.h index 90a4ec6c88c..8f9b8fe6080 100644 --- a/lib/sdk/crt/string/i386/tcsnlen.h +++ b/lib/sdk/crt/string/i386/tcsnlen.h @@ -2,29 +2,32 @@ */ #include "tchar.h" +#include -.globl _tcsnlen +PUBLIC _tcsnlen +.code _tcsnlen: - push %edi - mov 0x8(%esp), %edi - mov 0xC(%esp), %ecx - xor %eax, %eax - test %ecx, %ecx - jz .L1 - mov %ecx, %edx + push edi + mov edi, [esp + 8] + mov ecx, [esp + 12] + xor eax, eax + test ecx, ecx + jz .L1 + mov edx, ecx - cld + cld - repne _tscas + repne _tscas - sete %al - sub %ecx, %edx - sub %eax, %edx - mov %edx, %eax + sete al + sub edx, ecx + sub edx, eax + mov eax, edx .L1: - pop %edi - ret + pop edi + ret +END /* EOF */ diff --git a/lib/sdk/crt/string/i386/tcsrchr.h b/lib/sdk/crt/string/i386/tcsrchr.h index 61d3a4dd863..116061b6fd2 100644 --- a/lib/sdk/crt/string/i386/tcsrchr.h +++ b/lib/sdk/crt/string/i386/tcsrchr.h @@ -2,30 +2,33 @@ */ #include "tchar.h" +#include -.globl _tcsrchr +PUBLIC _tcsrchr +.code _tcsrchr: - push %esi - mov 0x8(%esp), %esi - mov 0xC(%esp), %edx + push esi + mov esi, [esp + 8] + mov edx, [esp + 12] - cld - mov _tsize, %ecx + cld + mov ecx, _tsize .L1: - _tlods - cmp %_treg(a), %_treg(d) - jne .L2 - mov %esi, %ecx + _tlods + cmp _treg(d), _treg(a) + jne .L2 + mov ecx, esi .L2: - test %_treg(a), %_treg(a) - jnz .L1 + test _treg(a), _treg(a) + jnz .L1 - mov %ecx, %eax - _tdec(%eax) - pop %esi - ret + mov eax, ecx + _tdec(eax) + pop esi + ret +END /* EOF */ diff --git a/lib/sdk/crt/string/strset.c b/lib/sdk/crt/string/strset.c index 29a72121197..5c7ccd6510a 100644 --- a/lib/sdk/crt/string/strset.c +++ b/lib/sdk/crt/string/strset.c @@ -8,6 +8,8 @@ * 25/11/05: Added license header */ +#ifndef _MSC_VER + #if defined(__GNUC__) && !defined(__clang__) #define __int64 long long #endif @@ -49,3 +51,5 @@ char* _strset(char* szToFill, int szFill) } return t; } + +#endif