symbian-qemu-0.9.1-12/libsdl-trunk/src/stdlib/SDL_stdlib.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /*
       
     2     SDL - Simple DirectMedia Layer
       
     3     Copyright (C) 1997-2006 Sam Lantinga
       
     4 
       
     5     This library is free software; you can redistribute it and/or
       
     6     modify it under the terms of the GNU Lesser General Public
       
     7     License as published by the Free Software Foundation; either
       
     8     version 2.1 of the License, or (at your option) any later version.
       
     9 
       
    10     This library is distributed in the hope that it will be useful,
       
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       
    13     Lesser General Public License for more details.
       
    14 
       
    15     You should have received a copy of the GNU Lesser General Public
       
    16     License along with this library; if not, write to the Free Software
       
    17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
       
    18 
       
    19     Sam Lantinga
       
    20     slouken@libsdl.org
       
    21 */
       
    22 #include "SDL_config.h"
       
    23 
       
    24 /* This file contains portable stdlib functions for SDL */
       
    25 
       
    26 #include "SDL_stdinc.h"
       
    27 
       
    28 #ifndef HAVE_LIBC
       
    29 /* These are some C runtime intrinsics that need to be defined */
       
    30 
       
    31 #if defined(_MSC_VER)
       
    32 
       
    33 #ifndef __FLTUSED__
       
    34 #define __FLTUSED__
       
    35 #ifdef __cplusplus
       
    36    extern "C"
       
    37 #endif
       
    38 	   __declspec(selectany) int _fltused=1;
       
    39 #endif
       
    40 
       
    41 /* Float to long */
       
    42 void __declspec(naked) _ftol()
       
    43 {
       
    44 	__asm {
       
    45 		push        ebp
       
    46 		mov         ebp,esp
       
    47 		sub         esp,20h
       
    48 		and         esp,0FFFFFFF0h
       
    49 		fld         st(0)
       
    50 		fst         dword ptr [esp+18h]
       
    51 		fistp       qword ptr [esp+10h]
       
    52 		fild        qword ptr [esp+10h]
       
    53 		mov         edx,dword ptr [esp+18h]
       
    54 		mov         eax,dword ptr [esp+10h]
       
    55 		test        eax,eax
       
    56 		je          integer_QnaN_or_zero
       
    57 arg_is_not_integer_QnaN:
       
    58 		fsubp       st(1),st
       
    59 		test        edx,edx
       
    60 		jns         positive
       
    61 		fstp        dword ptr [esp]
       
    62 		mov         ecx,dword ptr [esp]
       
    63 		xor         ecx,80000000h
       
    64 		add         ecx,7FFFFFFFh
       
    65 		adc         eax,0
       
    66 		mov         edx,dword ptr [esp+14h]
       
    67 		adc         edx,0
       
    68 		jmp         localexit
       
    69 positive:
       
    70 		fstp        dword ptr [esp]
       
    71 		mov         ecx,dword ptr [esp]
       
    72 		add         ecx,7FFFFFFFh
       
    73 		sbb         eax,0
       
    74 		mov         edx,dword ptr [esp+14h]
       
    75 		sbb         edx,0
       
    76 		jmp         localexit
       
    77 integer_QnaN_or_zero:
       
    78 		mov         edx,dword ptr [esp+14h]
       
    79 		test        edx,7FFFFFFFh
       
    80 		jne         arg_is_not_integer_QnaN
       
    81 		fstp        dword ptr [esp+18h]
       
    82 		fstp        dword ptr [esp+18h]
       
    83 localexit:
       
    84 		leave
       
    85 		ret
       
    86 	}
       
    87 }
       
    88 void __declspec(naked) _ftol2_sse()
       
    89 {
       
    90 	_ftol();
       
    91 }
       
    92 
       
    93 /* 64-bit math operators for 32-bit systems */
       
    94 void __declspec(naked) _allmul()
       
    95 {
       
    96 	__asm {
       
    97 		push        ebp
       
    98 		mov         ebp,esp
       
    99 		push        edi
       
   100 		push        esi
       
   101 		push        ebx
       
   102 		sub         esp,0Ch
       
   103 		mov         eax,dword ptr [ebp+10h]
       
   104 		mov         edi,dword ptr [ebp+8]
       
   105 		mov         ebx,eax
       
   106 		mov         esi,eax
       
   107 		sar         esi,1Fh
       
   108 		mov         eax,dword ptr [ebp+8]
       
   109 		mul         ebx
       
   110 		imul        edi,esi
       
   111 		mov         ecx,edx
       
   112 		mov         dword ptr [ebp-18h],eax
       
   113 		mov         edx,dword ptr [ebp+0Ch]
       
   114 		add         ecx,edi
       
   115 		imul        ebx,edx
       
   116 		mov         eax,dword ptr [ebp-18h]
       
   117 		lea         ebx,[ebx+ecx]
       
   118 		mov         dword ptr [ebp-14h],ebx
       
   119 		mov         edx,dword ptr [ebp-14h]
       
   120 		add         esp,0Ch
       
   121 		pop         ebx
       
   122 		pop         esi
       
   123 		pop         edi
       
   124 		pop         ebp
       
   125 		ret
       
   126 	}
       
   127 }
       
   128 void __declspec(naked) _alldiv()
       
   129 {
       
   130 	__asm {
       
   131 		push        edi
       
   132 		push        esi
       
   133 		push        ebx
       
   134 		xor         edi,edi
       
   135 		mov         eax,dword ptr [esp+14h]
       
   136 		or          eax,eax
       
   137 		jge         L1
       
   138 		inc         edi
       
   139 		mov         edx,dword ptr [esp+10h]
       
   140 		neg         eax
       
   141 		neg         edx
       
   142 		sbb         eax,0
       
   143 		mov         dword ptr [esp+14h],eax
       
   144 		mov         dword ptr [esp+10h],edx
       
   145 L1:
       
   146 		mov         eax,dword ptr [esp+1Ch]
       
   147 		or          eax,eax
       
   148 		jge         L2
       
   149 		inc         edi
       
   150 		mov         edx,dword ptr [esp+18h]
       
   151 		neg         eax
       
   152 		neg         edx
       
   153 		sbb         eax,0
       
   154 		mov         dword ptr [esp+1Ch],eax
       
   155 		mov         dword ptr [esp+18h],edx
       
   156 L2:
       
   157 		or          eax,eax
       
   158 		jne         L3
       
   159 		mov         ecx,dword ptr [esp+18h]
       
   160 		mov         eax,dword ptr [esp+14h]
       
   161 		xor         edx,edx
       
   162 		div         ecx
       
   163 		mov         ebx,eax
       
   164 		mov         eax,dword ptr [esp+10h]
       
   165 		div         ecx
       
   166 		mov         edx,ebx
       
   167 		jmp         L4
       
   168 L3:
       
   169 		mov         ebx,eax
       
   170 		mov         ecx,dword ptr [esp+18h]
       
   171 		mov         edx,dword ptr [esp+14h]
       
   172 		mov         eax,dword ptr [esp+10h]
       
   173 L5:
       
   174 		shr         ebx,1
       
   175 		rcr         ecx,1
       
   176 		shr         edx,1
       
   177 		rcr         eax,1
       
   178 		or          ebx,ebx
       
   179 		jne         L5
       
   180 		div         ecx
       
   181 		mov         esi,eax
       
   182 		mul         dword ptr [esp+1Ch]
       
   183 		mov         ecx,eax
       
   184 		mov         eax,dword ptr [esp+18h]
       
   185 		mul         esi
       
   186 		add         edx,ecx
       
   187 		jb          L6
       
   188 		cmp         edx,dword ptr [esp+14h]
       
   189 		ja          L6
       
   190 		jb          L7
       
   191 		cmp         eax,dword ptr [esp+10h]
       
   192 		jbe         L7
       
   193 L6:
       
   194 		dec         esi
       
   195 L7:
       
   196 		xor         edx,edx
       
   197 		mov         eax,esi
       
   198 L4:
       
   199 		dec         edi
       
   200 		jne         L8
       
   201 		neg         edx
       
   202 		neg         eax
       
   203 		sbb         edx,0
       
   204 L8:
       
   205 		pop         ebx
       
   206 		pop         esi
       
   207 		pop         edi
       
   208 		ret         10h
       
   209 	}
       
   210 }
       
   211 void __declspec(naked) _aulldiv()
       
   212 {
       
   213 	__asm {
       
   214 		push        ebx
       
   215 		push        esi
       
   216 		mov         eax,dword ptr [esp+18h]
       
   217 		or          eax,eax
       
   218 		jne         L1
       
   219 		mov         ecx,dword ptr [esp+14h]
       
   220 		mov         eax,dword ptr [esp+10h]
       
   221 		xor         edx,edx
       
   222 		div         ecx
       
   223 		mov         ebx,eax
       
   224 		mov         eax,dword ptr [esp+0Ch]
       
   225 		div         ecx
       
   226 		mov         edx,ebx
       
   227 		jmp         L2
       
   228 L1:
       
   229 		mov         ecx,eax
       
   230 		mov         ebx,dword ptr [esp+14h]
       
   231 		mov         edx,dword ptr [esp+10h]
       
   232 		mov         eax,dword ptr [esp+0Ch]
       
   233 L3:
       
   234 		shr         ecx,1
       
   235 		rcr         ebx,1
       
   236 		shr         edx,1
       
   237 		rcr         eax,1
       
   238 		or          ecx,ecx
       
   239 		jne         L3
       
   240 		div         ebx
       
   241 		mov         esi,eax
       
   242 		mul         dword ptr [esp+18h]
       
   243 		mov         ecx,eax
       
   244 		mov         eax,dword ptr [esp+14h]
       
   245 		mul         esi
       
   246 		add         edx,ecx
       
   247 		jb          L4
       
   248 		cmp         edx,dword ptr [esp+10h]
       
   249 		ja          L4
       
   250 		jb          L5
       
   251 		cmp         eax,dword ptr [esp+0Ch]
       
   252 		jbe         L5
       
   253 L4:
       
   254 		dec         esi
       
   255 L5:
       
   256 		xor         edx,edx
       
   257 		mov         eax,esi
       
   258 L2:
       
   259 		pop         esi
       
   260 		pop         ebx
       
   261 		ret         10h
       
   262 	}
       
   263 }
       
   264 void __declspec(naked) _allrem()
       
   265 {
       
   266 	__asm {
       
   267 		push        ebx
       
   268 		push        edi
       
   269 		xor         edi,edi
       
   270 		mov         eax,dword ptr [esp+10h]
       
   271 		or          eax,eax
       
   272 		jge         L1
       
   273 		inc         edi
       
   274 		mov         edx,dword ptr [esp+0Ch]
       
   275 		neg         eax
       
   276 		neg         edx
       
   277 		sbb         eax,0
       
   278 		mov         dword ptr [esp+10h],eax
       
   279 		mov         dword ptr [esp+0Ch],edx
       
   280 L1:
       
   281 		mov         eax,dword ptr [esp+18h]
       
   282 		or          eax,eax
       
   283 		jge         L2
       
   284 		mov         edx,dword ptr [esp+14h]
       
   285 		neg         eax
       
   286 		neg         edx
       
   287 		sbb         eax,0
       
   288 		mov         dword ptr [esp+18h],eax
       
   289 		mov         dword ptr [esp+14h],edx
       
   290 L2:
       
   291 		or          eax,eax
       
   292 		jne         L3
       
   293 		mov         ecx,dword ptr [esp+14h]
       
   294 		mov         eax,dword ptr [esp+10h]
       
   295 		xor         edx,edx
       
   296 		div         ecx
       
   297 		mov         eax,dword ptr [esp+0Ch]
       
   298 		div         ecx
       
   299 		mov         eax,edx
       
   300 		xor         edx,edx
       
   301 		dec         edi
       
   302 		jns         L4
       
   303 		jmp         L8
       
   304 L3:
       
   305 		mov         ebx,eax
       
   306 		mov         ecx,dword ptr [esp+14h]
       
   307 		mov         edx,dword ptr [esp+10h]
       
   308 		mov         eax,dword ptr [esp+0Ch]
       
   309 L5:
       
   310 		shr         ebx,1
       
   311 		rcr         ecx,1
       
   312 		shr         edx,1
       
   313 		rcr         eax,1
       
   314 		or          ebx,ebx
       
   315 		jne         L5
       
   316 		div         ecx
       
   317 		mov         ecx,eax
       
   318 		mul         dword ptr [esp+18h]
       
   319 		xchg        eax,ecx
       
   320 		mul         dword ptr [esp+14h]
       
   321 		add         edx,ecx
       
   322 		jb          L6
       
   323 		cmp         edx,dword ptr [esp+10h]
       
   324 		ja          L6
       
   325 		jb          L7
       
   326 		cmp         eax,dword ptr [esp+0Ch]
       
   327 		jbe         L7
       
   328 L6:
       
   329 		sub         eax,dword ptr [esp+14h]
       
   330 		sbb         edx,dword ptr [esp+18h]
       
   331 L7:
       
   332 		sub         eax,dword ptr [esp+0Ch]
       
   333 		sbb         edx,dword ptr [esp+10h]
       
   334 		dec         edi
       
   335 		jns         L8
       
   336 L4:
       
   337 		neg         edx
       
   338 		neg         eax
       
   339 		sbb         edx,0
       
   340 L8:
       
   341 		pop         edi
       
   342 		pop         ebx
       
   343 		ret         10h
       
   344 	}
       
   345 }
       
   346 void __declspec(naked) _aullrem()
       
   347 {
       
   348 	__asm {
       
   349 		push        ebx
       
   350 		mov         eax,dword ptr [esp+14h]
       
   351 		or          eax,eax
       
   352 		jne         L1
       
   353 		mov         ecx,dword ptr [esp+10h]
       
   354 		mov         eax,dword ptr [esp+0Ch]
       
   355 		xor         edx,edx
       
   356 		div         ecx
       
   357 		mov         eax,dword ptr [esp+8]
       
   358 		div         ecx
       
   359 		mov         eax,edx
       
   360 		xor         edx,edx
       
   361 		jmp         L2
       
   362 L1:
       
   363 		mov         ecx,eax
       
   364 		mov         ebx,dword ptr [esp+10h]
       
   365 		mov         edx,dword ptr [esp+0Ch]
       
   366 		mov         eax,dword ptr [esp+8]
       
   367 L3:
       
   368 		shr         ecx,1
       
   369 		rcr         ebx,1
       
   370 		shr         edx,1
       
   371 		rcr         eax,1
       
   372 		or          ecx,ecx
       
   373 		jne         L3
       
   374 		div         ebx
       
   375 		mov         ecx,eax
       
   376 		mul         dword ptr [esp+14h]
       
   377 		xchg        eax,ecx
       
   378 		mul         dword ptr [esp+10h]
       
   379 		add         edx,ecx
       
   380 		jb          L4
       
   381 		cmp         edx,dword ptr [esp+0Ch]
       
   382 		ja          L4
       
   383 		jb          L5
       
   384 		cmp         eax,dword ptr [esp+8]
       
   385 		jbe         L5
       
   386 L4:
       
   387 		sub         eax,dword ptr [esp+10h]
       
   388 		sbb         edx,dword ptr [esp+14h]
       
   389 L5:
       
   390 		sub         eax,dword ptr [esp+8]
       
   391 		sbb         edx,dword ptr [esp+0Ch]
       
   392 		neg         edx
       
   393 		neg         eax
       
   394 		sbb         edx,0
       
   395 L2:
       
   396 		pop         ebx
       
   397 		ret         10h
       
   398 	}
       
   399 }
       
   400 void __declspec(naked) _alldvrm()
       
   401 {
       
   402 	__asm {
       
   403 		push        edi
       
   404 		push        esi
       
   405 		push        ebp
       
   406 		xor         edi,edi
       
   407 		xor         ebp,ebp
       
   408 		mov         eax,dword ptr [esp+14h]
       
   409 		or          eax,eax
       
   410 		jge         L1
       
   411 		inc         edi
       
   412 		inc         ebp
       
   413 		mov         edx,dword ptr [esp+10h]
       
   414 		neg         eax
       
   415 		neg         edx
       
   416 		sbb         eax,0
       
   417 		mov         dword ptr [esp+14h],eax
       
   418 		mov         dword ptr [esp+10h],edx
       
   419 L1:
       
   420 		mov         eax,dword ptr [esp+1Ch]
       
   421 		or          eax,eax
       
   422 		jge         L2
       
   423 		inc         edi
       
   424 		mov         edx,dword ptr [esp+18h]
       
   425 		neg         eax
       
   426 		neg         edx
       
   427 		sbb         eax,0
       
   428 		mov         dword ptr [esp+1Ch],eax
       
   429 		mov         dword ptr [esp+18h],edx
       
   430 L2:
       
   431 		or          eax,eax
       
   432 		jne         L3
       
   433 		mov         ecx,dword ptr [esp+18h]
       
   434 		mov         eax,dword ptr [esp+14h]
       
   435 		xor         edx,edx
       
   436 		div         ecx
       
   437 		mov         ebx,eax
       
   438 		mov         eax,dword ptr [esp+10h]
       
   439 		div         ecx
       
   440 		mov         esi,eax
       
   441 		mov         eax,ebx
       
   442 		mul         dword ptr [esp+18h]
       
   443 		mov         ecx,eax
       
   444 		mov         eax,esi
       
   445 		mul         dword ptr [esp+18h]
       
   446 		add         edx,ecx
       
   447 		jmp         L4
       
   448 L3:
       
   449 		mov         ebx,eax
       
   450 		mov         ecx,dword ptr [esp+18h]
       
   451 		mov         edx,dword ptr [esp+14h]
       
   452 		mov         eax,dword ptr [esp+10h]
       
   453 L5:
       
   454 		shr         ebx,1
       
   455 		rcr         ecx,1
       
   456 		shr         edx,1
       
   457 		rcr         eax,1
       
   458 		or          ebx,ebx
       
   459 		jne         L5
       
   460 		div         ecx
       
   461 		mov         esi,eax
       
   462 		mul         dword ptr [esp+1Ch]
       
   463 		mov         ecx,eax
       
   464 		mov         eax,dword ptr [esp+18h]
       
   465 		mul         esi
       
   466 		add         edx,ecx
       
   467 		jb          L6
       
   468 		cmp         edx,dword ptr [esp+14h]
       
   469 		ja          L6
       
   470 		jb          L7
       
   471 		cmp         eax,dword ptr [esp+10h]
       
   472 		jbe         L7
       
   473 L6:
       
   474 		dec         esi
       
   475 		sub         eax,dword ptr [esp+18h]
       
   476 		sbb         edx,dword ptr [esp+1Ch]
       
   477 L7:
       
   478 		xor         ebx,ebx
       
   479 L4:
       
   480 		sub         eax,dword ptr [esp+10h]
       
   481 		sbb         edx,dword ptr [esp+14h]
       
   482 		dec         ebp
       
   483 		jns         L9
       
   484 		neg         edx
       
   485 		neg         eax
       
   486 		sbb         edx,0
       
   487 L9:
       
   488 		mov         ecx,edx
       
   489 		mov         edx,ebx
       
   490 		mov         ebx,ecx
       
   491 		mov         ecx,eax
       
   492 		mov         eax,esi
       
   493 		dec         edi
       
   494 		jne         L8
       
   495 		neg         edx
       
   496 		neg         eax
       
   497 		sbb         edx,0
       
   498 L8:
       
   499 		pop         ebp
       
   500 		pop         esi
       
   501 		pop         edi
       
   502 		ret         10h
       
   503 	}
       
   504 }
       
   505 void __declspec(naked) _aulldvrm()
       
   506 {
       
   507 	__asm {
       
   508 		push        esi
       
   509 		mov         eax,dword ptr [esp+14h]
       
   510 		or          eax,eax
       
   511 		jne         L1
       
   512 		mov         ecx,dword ptr [esp+10h]
       
   513 		mov         eax,dword ptr [esp+0Ch]
       
   514 		xor         edx,edx
       
   515 		div         ecx
       
   516 		mov         ebx,eax
       
   517 		mov         eax,dword ptr [esp+8]
       
   518 		div         ecx
       
   519 		mov         esi,eax
       
   520 		mov         eax,ebx
       
   521 		mul         dword ptr [esp+10h]
       
   522 		mov         ecx,eax
       
   523 		mov         eax,esi
       
   524 		mul         dword ptr [esp+10h]
       
   525 		add         edx,ecx
       
   526 		jmp         L2
       
   527 L1:
       
   528 		mov         ecx,eax
       
   529 		mov         ebx,dword ptr [esp+10h]
       
   530 		mov         edx,dword ptr [esp+0Ch]
       
   531 		mov         eax,dword ptr [esp+8]
       
   532 L3:
       
   533 		shr         ecx,1
       
   534 		rcr         ebx,1
       
   535 		shr         edx,1
       
   536 		rcr         eax,1
       
   537 		or          ecx,ecx
       
   538 		jne         L3
       
   539 		div         ebx
       
   540 		mov         esi,eax
       
   541 		mul         dword ptr [esp+14h]
       
   542 		mov         ecx,eax
       
   543 		mov         eax,dword ptr [esp+10h]
       
   544 		mul         esi
       
   545 		add         edx,ecx
       
   546 		jb          L4
       
   547 		cmp         edx,dword ptr [esp+0Ch]
       
   548 		ja          L4
       
   549 		jb          L5
       
   550 		cmp         eax,dword ptr [esp+8]
       
   551 		jbe         L5
       
   552 L4:
       
   553 		dec         esi
       
   554 		sub         eax,dword ptr [esp+10h]
       
   555 		sbb         edx,dword ptr [esp+14h]
       
   556 L5:
       
   557 		xor         ebx,ebx
       
   558 L2:
       
   559 		sub         eax,dword ptr [esp+8]
       
   560 		sbb         edx,dword ptr [esp+0Ch]
       
   561 		neg         edx
       
   562 		neg         eax
       
   563 		sbb         edx,0
       
   564 		mov         ecx,edx
       
   565 		mov         edx,ebx
       
   566 		mov         ebx,ecx
       
   567 		mov         ecx,eax
       
   568 		mov         eax,esi
       
   569 		pop         esi
       
   570 		ret         10h
       
   571 	}
       
   572 }
       
   573 void __declspec(naked) _allshl()
       
   574 {
       
   575 	__asm {
       
   576 		cmp         cl,40h
       
   577 		jae         RETZERO
       
   578 		cmp         cl,20h
       
   579 		jae         MORE32
       
   580 		shld        edx,eax,cl
       
   581 		shl         eax,cl
       
   582 		ret
       
   583 MORE32:
       
   584 		mov         edx,eax
       
   585 		xor         eax,eax
       
   586 		and         cl,1Fh
       
   587 		shl         edx,cl
       
   588 		ret
       
   589 RETZERO:
       
   590 		xor         eax,eax
       
   591 		xor         edx,edx
       
   592 		ret
       
   593 	}
       
   594 }
       
   595 void __declspec(naked) _aullshr()
       
   596 {
       
   597 	__asm {
       
   598 		cmp         cl,40h
       
   599 		jae         RETZERO
       
   600 		cmp         cl,20h
       
   601 		jae         MORE32
       
   602 		shrd        eax,edx,cl
       
   603 		shr         edx,cl
       
   604 		ret
       
   605 MORE32:
       
   606 		mov         eax,edx
       
   607 		xor         edx,edx
       
   608 		and         cl,1Fh
       
   609 		shr         eax,cl
       
   610 		ret
       
   611 RETZERO:
       
   612 		xor         eax,eax
       
   613 		xor         edx,edx
       
   614 		ret
       
   615 	}
       
   616 }
       
   617 
       
   618 #endif /* MSC_VER */
       
   619 
       
   620 #endif /* !HAVE_LIBC */