mirror of
https://github.com/etlegacy/etlegacy-libs.git
synced 2024-11-13 07:57:45 +00:00
620 lines
13 KiB
C
620 lines
13 KiB
C
/*
|
|
SDL - Simple DirectMedia Layer
|
|
Copyright (C) 1997-2012 Sam Lantinga
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
Sam Lantinga
|
|
slouken@libsdl.org
|
|
*/
|
|
#include "SDL_config.h"
|
|
|
|
/* This file contains portable stdlib functions for SDL */
|
|
|
|
#include "SDL_stdinc.h"
|
|
|
|
#ifndef HAVE_LIBC
|
|
/* These are some C runtime intrinsics that need to be defined */
|
|
|
|
#if defined(_MSC_VER)
|
|
|
|
#ifndef __FLTUSED__
|
|
#define __FLTUSED__
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
#endif
|
|
__declspec(selectany) int _fltused=1;
|
|
#endif
|
|
|
|
/* Float to long */
|
|
void __declspec(naked) _ftol()
|
|
{
|
|
__asm {
|
|
push ebp
|
|
mov ebp,esp
|
|
sub esp,20h
|
|
and esp,0FFFFFFF0h
|
|
fld st(0)
|
|
fst dword ptr [esp+18h]
|
|
fistp qword ptr [esp+10h]
|
|
fild qword ptr [esp+10h]
|
|
mov edx,dword ptr [esp+18h]
|
|
mov eax,dword ptr [esp+10h]
|
|
test eax,eax
|
|
je integer_QnaN_or_zero
|
|
arg_is_not_integer_QnaN:
|
|
fsubp st(1),st
|
|
test edx,edx
|
|
jns positive
|
|
fstp dword ptr [esp]
|
|
mov ecx,dword ptr [esp]
|
|
xor ecx,80000000h
|
|
add ecx,7FFFFFFFh
|
|
adc eax,0
|
|
mov edx,dword ptr [esp+14h]
|
|
adc edx,0
|
|
jmp localexit
|
|
positive:
|
|
fstp dword ptr [esp]
|
|
mov ecx,dword ptr [esp]
|
|
add ecx,7FFFFFFFh
|
|
sbb eax,0
|
|
mov edx,dword ptr [esp+14h]
|
|
sbb edx,0
|
|
jmp localexit
|
|
integer_QnaN_or_zero:
|
|
mov edx,dword ptr [esp+14h]
|
|
test edx,7FFFFFFFh
|
|
jne arg_is_not_integer_QnaN
|
|
fstp dword ptr [esp+18h]
|
|
fstp dword ptr [esp+18h]
|
|
localexit:
|
|
leave
|
|
ret
|
|
}
|
|
}
|
|
void __declspec(naked) _ftol2_sse()
|
|
{
|
|
_ftol();
|
|
}
|
|
|
|
/* 64-bit math operators for 32-bit systems */
|
|
void __declspec(naked) _allmul()
|
|
{
|
|
__asm {
|
|
push ebp
|
|
mov ebp,esp
|
|
push edi
|
|
push esi
|
|
push ebx
|
|
sub esp,0Ch
|
|
mov eax,dword ptr [ebp+10h]
|
|
mov edi,dword ptr [ebp+8]
|
|
mov ebx,eax
|
|
mov esi,eax
|
|
sar esi,1Fh
|
|
mov eax,dword ptr [ebp+8]
|
|
mul ebx
|
|
imul edi,esi
|
|
mov ecx,edx
|
|
mov dword ptr [ebp-18h],eax
|
|
mov edx,dword ptr [ebp+0Ch]
|
|
add ecx,edi
|
|
imul ebx,edx
|
|
mov eax,dword ptr [ebp-18h]
|
|
lea ebx,[ebx+ecx]
|
|
mov dword ptr [ebp-14h],ebx
|
|
mov edx,dword ptr [ebp-14h]
|
|
add esp,0Ch
|
|
pop ebx
|
|
pop esi
|
|
pop edi
|
|
pop ebp
|
|
ret
|
|
}
|
|
}
|
|
void __declspec(naked) _alldiv()
|
|
{
|
|
__asm {
|
|
push edi
|
|
push esi
|
|
push ebx
|
|
xor edi,edi
|
|
mov eax,dword ptr [esp+14h]
|
|
or eax,eax
|
|
jge L1
|
|
inc edi
|
|
mov edx,dword ptr [esp+10h]
|
|
neg eax
|
|
neg edx
|
|
sbb eax,0
|
|
mov dword ptr [esp+14h],eax
|
|
mov dword ptr [esp+10h],edx
|
|
L1:
|
|
mov eax,dword ptr [esp+1Ch]
|
|
or eax,eax
|
|
jge L2
|
|
inc edi
|
|
mov edx,dword ptr [esp+18h]
|
|
neg eax
|
|
neg edx
|
|
sbb eax,0
|
|
mov dword ptr [esp+1Ch],eax
|
|
mov dword ptr [esp+18h],edx
|
|
L2:
|
|
or eax,eax
|
|
jne L3
|
|
mov ecx,dword ptr [esp+18h]
|
|
mov eax,dword ptr [esp+14h]
|
|
xor edx,edx
|
|
div ecx
|
|
mov ebx,eax
|
|
mov eax,dword ptr [esp+10h]
|
|
div ecx
|
|
mov edx,ebx
|
|
jmp L4
|
|
L3:
|
|
mov ebx,eax
|
|
mov ecx,dword ptr [esp+18h]
|
|
mov edx,dword ptr [esp+14h]
|
|
mov eax,dword ptr [esp+10h]
|
|
L5:
|
|
shr ebx,1
|
|
rcr ecx,1
|
|
shr edx,1
|
|
rcr eax,1
|
|
or ebx,ebx
|
|
jne L5
|
|
div ecx
|
|
mov esi,eax
|
|
mul dword ptr [esp+1Ch]
|
|
mov ecx,eax
|
|
mov eax,dword ptr [esp+18h]
|
|
mul esi
|
|
add edx,ecx
|
|
jb L6
|
|
cmp edx,dword ptr [esp+14h]
|
|
ja L6
|
|
jb L7
|
|
cmp eax,dword ptr [esp+10h]
|
|
jbe L7
|
|
L6:
|
|
dec esi
|
|
L7:
|
|
xor edx,edx
|
|
mov eax,esi
|
|
L4:
|
|
dec edi
|
|
jne L8
|
|
neg edx
|
|
neg eax
|
|
sbb edx,0
|
|
L8:
|
|
pop ebx
|
|
pop esi
|
|
pop edi
|
|
ret 10h
|
|
}
|
|
}
|
|
void __declspec(naked) _aulldiv()
|
|
{
|
|
__asm {
|
|
push ebx
|
|
push esi
|
|
mov eax,dword ptr [esp+18h]
|
|
or eax,eax
|
|
jne L1
|
|
mov ecx,dword ptr [esp+14h]
|
|
mov eax,dword ptr [esp+10h]
|
|
xor edx,edx
|
|
div ecx
|
|
mov ebx,eax
|
|
mov eax,dword ptr [esp+0Ch]
|
|
div ecx
|
|
mov edx,ebx
|
|
jmp L2
|
|
L1:
|
|
mov ecx,eax
|
|
mov ebx,dword ptr [esp+14h]
|
|
mov edx,dword ptr [esp+10h]
|
|
mov eax,dword ptr [esp+0Ch]
|
|
L3:
|
|
shr ecx,1
|
|
rcr ebx,1
|
|
shr edx,1
|
|
rcr eax,1
|
|
or ecx,ecx
|
|
jne L3
|
|
div ebx
|
|
mov esi,eax
|
|
mul dword ptr [esp+18h]
|
|
mov ecx,eax
|
|
mov eax,dword ptr [esp+14h]
|
|
mul esi
|
|
add edx,ecx
|
|
jb L4
|
|
cmp edx,dword ptr [esp+10h]
|
|
ja L4
|
|
jb L5
|
|
cmp eax,dword ptr [esp+0Ch]
|
|
jbe L5
|
|
L4:
|
|
dec esi
|
|
L5:
|
|
xor edx,edx
|
|
mov eax,esi
|
|
L2:
|
|
pop esi
|
|
pop ebx
|
|
ret 10h
|
|
}
|
|
}
|
|
void __declspec(naked) _allrem()
|
|
{
|
|
__asm {
|
|
push ebx
|
|
push edi
|
|
xor edi,edi
|
|
mov eax,dword ptr [esp+10h]
|
|
or eax,eax
|
|
jge L1
|
|
inc edi
|
|
mov edx,dword ptr [esp+0Ch]
|
|
neg eax
|
|
neg edx
|
|
sbb eax,0
|
|
mov dword ptr [esp+10h],eax
|
|
mov dword ptr [esp+0Ch],edx
|
|
L1:
|
|
mov eax,dword ptr [esp+18h]
|
|
or eax,eax
|
|
jge L2
|
|
mov edx,dword ptr [esp+14h]
|
|
neg eax
|
|
neg edx
|
|
sbb eax,0
|
|
mov dword ptr [esp+18h],eax
|
|
mov dword ptr [esp+14h],edx
|
|
L2:
|
|
or eax,eax
|
|
jne L3
|
|
mov ecx,dword ptr [esp+14h]
|
|
mov eax,dword ptr [esp+10h]
|
|
xor edx,edx
|
|
div ecx
|
|
mov eax,dword ptr [esp+0Ch]
|
|
div ecx
|
|
mov eax,edx
|
|
xor edx,edx
|
|
dec edi
|
|
jns L4
|
|
jmp L8
|
|
L3:
|
|
mov ebx,eax
|
|
mov ecx,dword ptr [esp+14h]
|
|
mov edx,dword ptr [esp+10h]
|
|
mov eax,dword ptr [esp+0Ch]
|
|
L5:
|
|
shr ebx,1
|
|
rcr ecx,1
|
|
shr edx,1
|
|
rcr eax,1
|
|
or ebx,ebx
|
|
jne L5
|
|
div ecx
|
|
mov ecx,eax
|
|
mul dword ptr [esp+18h]
|
|
xchg eax,ecx
|
|
mul dword ptr [esp+14h]
|
|
add edx,ecx
|
|
jb L6
|
|
cmp edx,dword ptr [esp+10h]
|
|
ja L6
|
|
jb L7
|
|
cmp eax,dword ptr [esp+0Ch]
|
|
jbe L7
|
|
L6:
|
|
sub eax,dword ptr [esp+14h]
|
|
sbb edx,dword ptr [esp+18h]
|
|
L7:
|
|
sub eax,dword ptr [esp+0Ch]
|
|
sbb edx,dword ptr [esp+10h]
|
|
dec edi
|
|
jns L8
|
|
L4:
|
|
neg edx
|
|
neg eax
|
|
sbb edx,0
|
|
L8:
|
|
pop edi
|
|
pop ebx
|
|
ret 10h
|
|
}
|
|
}
|
|
void __declspec(naked) _aullrem()
|
|
{
|
|
__asm {
|
|
push ebx
|
|
mov eax,dword ptr [esp+14h]
|
|
or eax,eax
|
|
jne L1
|
|
mov ecx,dword ptr [esp+10h]
|
|
mov eax,dword ptr [esp+0Ch]
|
|
xor edx,edx
|
|
div ecx
|
|
mov eax,dword ptr [esp+8]
|
|
div ecx
|
|
mov eax,edx
|
|
xor edx,edx
|
|
jmp L2
|
|
L1:
|
|
mov ecx,eax
|
|
mov ebx,dword ptr [esp+10h]
|
|
mov edx,dword ptr [esp+0Ch]
|
|
mov eax,dword ptr [esp+8]
|
|
L3:
|
|
shr ecx,1
|
|
rcr ebx,1
|
|
shr edx,1
|
|
rcr eax,1
|
|
or ecx,ecx
|
|
jne L3
|
|
div ebx
|
|
mov ecx,eax
|
|
mul dword ptr [esp+14h]
|
|
xchg eax,ecx
|
|
mul dword ptr [esp+10h]
|
|
add edx,ecx
|
|
jb L4
|
|
cmp edx,dword ptr [esp+0Ch]
|
|
ja L4
|
|
jb L5
|
|
cmp eax,dword ptr [esp+8]
|
|
jbe L5
|
|
L4:
|
|
sub eax,dword ptr [esp+10h]
|
|
sbb edx,dword ptr [esp+14h]
|
|
L5:
|
|
sub eax,dword ptr [esp+8]
|
|
sbb edx,dword ptr [esp+0Ch]
|
|
neg edx
|
|
neg eax
|
|
sbb edx,0
|
|
L2:
|
|
pop ebx
|
|
ret 10h
|
|
}
|
|
}
|
|
void __declspec(naked) _alldvrm()
|
|
{
|
|
__asm {
|
|
push edi
|
|
push esi
|
|
push ebp
|
|
xor edi,edi
|
|
xor ebp,ebp
|
|
mov eax,dword ptr [esp+14h]
|
|
or eax,eax
|
|
jge L1
|
|
inc edi
|
|
inc ebp
|
|
mov edx,dword ptr [esp+10h]
|
|
neg eax
|
|
neg edx
|
|
sbb eax,0
|
|
mov dword ptr [esp+14h],eax
|
|
mov dword ptr [esp+10h],edx
|
|
L1:
|
|
mov eax,dword ptr [esp+1Ch]
|
|
or eax,eax
|
|
jge L2
|
|
inc edi
|
|
mov edx,dword ptr [esp+18h]
|
|
neg eax
|
|
neg edx
|
|
sbb eax,0
|
|
mov dword ptr [esp+1Ch],eax
|
|
mov dword ptr [esp+18h],edx
|
|
L2:
|
|
or eax,eax
|
|
jne L3
|
|
mov ecx,dword ptr [esp+18h]
|
|
mov eax,dword ptr [esp+14h]
|
|
xor edx,edx
|
|
div ecx
|
|
mov ebx,eax
|
|
mov eax,dword ptr [esp+10h]
|
|
div ecx
|
|
mov esi,eax
|
|
mov eax,ebx
|
|
mul dword ptr [esp+18h]
|
|
mov ecx,eax
|
|
mov eax,esi
|
|
mul dword ptr [esp+18h]
|
|
add edx,ecx
|
|
jmp L4
|
|
L3:
|
|
mov ebx,eax
|
|
mov ecx,dword ptr [esp+18h]
|
|
mov edx,dword ptr [esp+14h]
|
|
mov eax,dword ptr [esp+10h]
|
|
L5:
|
|
shr ebx,1
|
|
rcr ecx,1
|
|
shr edx,1
|
|
rcr eax,1
|
|
or ebx,ebx
|
|
jne L5
|
|
div ecx
|
|
mov esi,eax
|
|
mul dword ptr [esp+1Ch]
|
|
mov ecx,eax
|
|
mov eax,dword ptr [esp+18h]
|
|
mul esi
|
|
add edx,ecx
|
|
jb L6
|
|
cmp edx,dword ptr [esp+14h]
|
|
ja L6
|
|
jb L7
|
|
cmp eax,dword ptr [esp+10h]
|
|
jbe L7
|
|
L6:
|
|
dec esi
|
|
sub eax,dword ptr [esp+18h]
|
|
sbb edx,dword ptr [esp+1Ch]
|
|
L7:
|
|
xor ebx,ebx
|
|
L4:
|
|
sub eax,dword ptr [esp+10h]
|
|
sbb edx,dword ptr [esp+14h]
|
|
dec ebp
|
|
jns L9
|
|
neg edx
|
|
neg eax
|
|
sbb edx,0
|
|
L9:
|
|
mov ecx,edx
|
|
mov edx,ebx
|
|
mov ebx,ecx
|
|
mov ecx,eax
|
|
mov eax,esi
|
|
dec edi
|
|
jne L8
|
|
neg edx
|
|
neg eax
|
|
sbb edx,0
|
|
L8:
|
|
pop ebp
|
|
pop esi
|
|
pop edi
|
|
ret 10h
|
|
}
|
|
}
|
|
void __declspec(naked) _aulldvrm()
|
|
{
|
|
__asm {
|
|
push esi
|
|
mov eax,dword ptr [esp+14h]
|
|
or eax,eax
|
|
jne L1
|
|
mov ecx,dword ptr [esp+10h]
|
|
mov eax,dword ptr [esp+0Ch]
|
|
xor edx,edx
|
|
div ecx
|
|
mov ebx,eax
|
|
mov eax,dword ptr [esp+8]
|
|
div ecx
|
|
mov esi,eax
|
|
mov eax,ebx
|
|
mul dword ptr [esp+10h]
|
|
mov ecx,eax
|
|
mov eax,esi
|
|
mul dword ptr [esp+10h]
|
|
add edx,ecx
|
|
jmp L2
|
|
L1:
|
|
mov ecx,eax
|
|
mov ebx,dword ptr [esp+10h]
|
|
mov edx,dword ptr [esp+0Ch]
|
|
mov eax,dword ptr [esp+8]
|
|
L3:
|
|
shr ecx,1
|
|
rcr ebx,1
|
|
shr edx,1
|
|
rcr eax,1
|
|
or ecx,ecx
|
|
jne L3
|
|
div ebx
|
|
mov esi,eax
|
|
mul dword ptr [esp+14h]
|
|
mov ecx,eax
|
|
mov eax,dword ptr [esp+10h]
|
|
mul esi
|
|
add edx,ecx
|
|
jb L4
|
|
cmp edx,dword ptr [esp+0Ch]
|
|
ja L4
|
|
jb L5
|
|
cmp eax,dword ptr [esp+8]
|
|
jbe L5
|
|
L4:
|
|
dec esi
|
|
sub eax,dword ptr [esp+10h]
|
|
sbb edx,dword ptr [esp+14h]
|
|
L5:
|
|
xor ebx,ebx
|
|
L2:
|
|
sub eax,dword ptr [esp+8]
|
|
sbb edx,dword ptr [esp+0Ch]
|
|
neg edx
|
|
neg eax
|
|
sbb edx,0
|
|
mov ecx,edx
|
|
mov edx,ebx
|
|
mov ebx,ecx
|
|
mov ecx,eax
|
|
mov eax,esi
|
|
pop esi
|
|
ret 10h
|
|
}
|
|
}
|
|
void __declspec(naked) _allshl()
|
|
{
|
|
__asm {
|
|
cmp cl,40h
|
|
jae RETZERO
|
|
cmp cl,20h
|
|
jae MORE32
|
|
shld edx,eax,cl
|
|
shl eax,cl
|
|
ret
|
|
MORE32:
|
|
mov edx,eax
|
|
xor eax,eax
|
|
and cl,1Fh
|
|
shl edx,cl
|
|
ret
|
|
RETZERO:
|
|
xor eax,eax
|
|
xor edx,edx
|
|
ret
|
|
}
|
|
}
|
|
void __declspec(naked) _aullshr()
|
|
{
|
|
__asm {
|
|
cmp cl,40h
|
|
jae RETZERO
|
|
cmp cl,20h
|
|
jae MORE32
|
|
shrd eax,edx,cl
|
|
shr edx,cl
|
|
ret
|
|
MORE32:
|
|
mov eax,edx
|
|
xor edx,edx
|
|
and cl,1Fh
|
|
shr eax,cl
|
|
ret
|
|
RETZERO:
|
|
xor eax,eax
|
|
xor edx,edx
|
|
ret
|
|
}
|
|
}
|
|
|
|
#endif /* MSC_VER */
|
|
|
|
#endif /* !HAVE_LIBC */
|