symbian-qemu-0.9.1-12/libsdl-trunk/src/stdlib/SDL_stdlib.c
changeset 1 2fb8b9db1c86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symbian-qemu-0.9.1-12/libsdl-trunk/src/stdlib/SDL_stdlib.c	Fri Jul 31 15:01:17 2009 +0100
@@ -0,0 +1,620 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2006 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 */