src/stdlib/SDL_stdlib.c
author Sam Lantinga <slouken@libsdl.org>
Thu, 09 Feb 2006 09:38:05 +0000
changeset 1354 22f39393668a
parent 1346 1b5fbaf1d2c6
child 1402 d910939febfa
permissions -rw-r--r--
Fixed build problem with SDL_string.c
Officially deprecated SDL_byteorder.h, SDL_getenv.h and SDL_types.h
Moved endian-related SDL_rwops code into SDL_rwops.c
     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 
    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 /* Float to long */
    34 void __declspec(naked) _ftol()
    35 {
    36 	__asm {
    37 		push        ebp
    38 		mov         ebp,esp
    39 		sub         esp,20h
    40 		and         esp,0FFFFFFF0h
    41 		fld         st(0)
    42 		fst         dword ptr [esp+18h]
    43 		fistp       qword ptr [esp+10h]
    44 		fild        qword ptr [esp+10h]
    45 		mov         edx,dword ptr [esp+18h]
    46 		mov         eax,dword ptr [esp+10h]
    47 		test        eax,eax
    48 		je          integer_QnaN_or_zero
    49 arg_is_not_integer_QnaN:
    50 		fsubp       st(1),st
    51 		test        edx,edx
    52 		jns         positive
    53 		fstp        dword ptr [esp]
    54 		mov         ecx,dword ptr [esp]
    55 		xor         ecx,80000000h
    56 		add         ecx,7FFFFFFFh
    57 		adc         eax,0
    58 		mov         edx,dword ptr [esp+14h]
    59 		adc         edx,0
    60 		jmp         localexit
    61 positive:
    62 		fstp        dword ptr [esp]
    63 		mov         ecx,dword ptr [esp]
    64 		add         ecx,7FFFFFFFh
    65 		sbb         eax,0
    66 		mov         edx,dword ptr [esp+14h]
    67 		sbb         edx,0
    68 		jmp         localexit
    69 integer_QnaN_or_zero:
    70 		mov         edx,dword ptr [esp+14h]
    71 		test        edx,7FFFFFFFh
    72 		jne         arg_is_not_integer_QnaN
    73 		fstp        dword ptr [esp+18h]
    74 		fstp        dword ptr [esp+18h]
    75 localexit:
    76 		leave
    77 		ret
    78 	}
    79 }
    80 void __declspec(naked) _ftol2_sse()
    81 {
    82 	_ftol();
    83 }
    84 
    85 /* 64-bit math operators for 32-bit systems */
    86 void __declspec(naked) _allmul()
    87 {
    88 	__asm {
    89 		push        ebp
    90 		mov         ebp,esp
    91 		push        edi
    92 		push        esi
    93 		push        ebx
    94 		sub         esp,0Ch
    95 		mov         eax,dword ptr [ebp+10h]
    96 		mov         edi,dword ptr [ebp+8]
    97 		mov         ebx,eax
    98 		mov         esi,eax
    99 		sar         esi,1Fh
   100 		mov         eax,dword ptr [ebp+8]
   101 		mul         ebx
   102 		imul        edi,esi
   103 		mov         ecx,edx
   104 		mov         dword ptr [ebp-18h],eax
   105 		mov         edx,dword ptr [ebp+0Ch]
   106 		add         ecx,edi
   107 		imul        ebx,edx
   108 		mov         eax,dword ptr [ebp-18h]
   109 		lea         ebx,[ebx+ecx]
   110 		mov         dword ptr [ebp-14h],ebx
   111 		mov         edx,dword ptr [ebp-14h]
   112 		add         esp,0Ch
   113 		pop         ebx
   114 		pop         esi
   115 		pop         edi
   116 		pop         ebp
   117 		ret
   118 	}
   119 }
   120 void __declspec(naked) _alldiv()
   121 {
   122 	__asm {
   123 		push        edi
   124 		push        esi
   125 		push        ebx
   126 		xor         edi,edi
   127 		mov         eax,dword ptr [esp+14h]
   128 		or          eax,eax
   129 		jge         L1
   130 		inc         edi
   131 		mov         edx,dword ptr [esp+10h]
   132 		neg         eax
   133 		neg         edx
   134 		sbb         eax,0
   135 		mov         dword ptr [esp+14h],eax
   136 		mov         dword ptr [esp+10h],edx
   137 L1:
   138 		mov         eax,dword ptr [esp+1Ch]
   139 		or          eax,eax
   140 		jge         L2
   141 		inc         edi
   142 		mov         edx,dword ptr [esp+18h]
   143 		neg         eax
   144 		neg         edx
   145 		sbb         eax,0
   146 		mov         dword ptr [esp+1Ch],eax
   147 		mov         dword ptr [esp+18h],edx
   148 L2:
   149 		or          eax,eax
   150 		jne         L3
   151 		mov         ecx,dword ptr [esp+18h]
   152 		mov         eax,dword ptr [esp+14h]
   153 		xor         edx,edx
   154 		div         ecx
   155 		mov         ebx,eax
   156 		mov         eax,dword ptr [esp+10h]
   157 		div         ecx
   158 		mov         edx,ebx
   159 		jmp         L4
   160 L3:
   161 		mov         ebx,eax
   162 		mov         ecx,dword ptr [esp+18h]
   163 		mov         edx,dword ptr [esp+14h]
   164 		mov         eax,dword ptr [esp+10h]
   165 L5:
   166 		shr         ebx,1
   167 		rcr         ecx,1
   168 		shr         edx,1
   169 		rcr         eax,1
   170 		or          ebx,ebx
   171 		jne         L5
   172 		div         ecx
   173 		mov         esi,eax
   174 		mul         dword ptr [esp+1Ch]
   175 		mov         ecx,eax
   176 		mov         eax,dword ptr [esp+18h]
   177 		mul         esi
   178 		add         edx,ecx
   179 		jb          L6
   180 		cmp         edx,dword ptr [esp+14h]
   181 		ja          L6
   182 		jb          L7
   183 		cmp         eax,dword ptr [esp+10h]
   184 		jbe         L7
   185 L6:
   186 		dec         esi
   187 L7:
   188 		xor         edx,edx
   189 		mov         eax,esi
   190 L4:
   191 		dec         edi
   192 		jne         L8
   193 		neg         edx
   194 		neg         eax
   195 		sbb         edx,0
   196 L8:
   197 		pop         ebx
   198 		pop         esi
   199 		pop         edi
   200 		ret         10h
   201 	}
   202 }
   203 void __declspec(naked) _aulldiv()
   204 {
   205 	__asm {
   206 		push        ebx
   207 		push        esi
   208 		mov         eax,dword ptr [esp+18h]
   209 		or          eax,eax
   210 		jne         L1
   211 		mov         ecx,dword ptr [esp+14h]
   212 		mov         eax,dword ptr [esp+10h]
   213 		xor         edx,edx
   214 		div         ecx
   215 		mov         ebx,eax
   216 		mov         eax,dword ptr [esp+0Ch]
   217 		div         ecx
   218 		mov         edx,ebx
   219 		jmp         L2
   220 L1:
   221 		mov         ecx,eax
   222 		mov         ebx,dword ptr [esp+14h]
   223 		mov         edx,dword ptr [esp+10h]
   224 		mov         eax,dword ptr [esp+0Ch]
   225 L3:
   226 		shr         ecx,1
   227 		rcr         ebx,1
   228 		shr         edx,1
   229 		rcr         eax,1
   230 		or          ecx,ecx
   231 		jne         L3
   232 		div         ebx
   233 		mov         esi,eax
   234 		mul         dword ptr [esp+18h]
   235 		mov         ecx,eax
   236 		mov         eax,dword ptr [esp+14h]
   237 		mul         esi
   238 		add         edx,ecx
   239 		jb          L4
   240 		cmp         edx,dword ptr [esp+10h]
   241 		ja          L4
   242 		jb          L5
   243 		cmp         eax,dword ptr [esp+0Ch]
   244 		jbe         L5
   245 L4:
   246 		dec         esi
   247 L5:
   248 		xor         edx,edx
   249 		mov         eax,esi
   250 L2:
   251 		pop         esi
   252 		pop         ebx
   253 		ret         10h
   254 	}
   255 }
   256 void __declspec(naked) _allrem()
   257 {
   258 	__asm {
   259 		push        ebx
   260 		push        edi
   261 		xor         edi,edi
   262 		mov         eax,dword ptr [esp+10h]
   263 		or          eax,eax
   264 		jge         L1
   265 		inc         edi
   266 		mov         edx,dword ptr [esp+0Ch]
   267 		neg         eax
   268 		neg         edx
   269 		sbb         eax,0
   270 		mov         dword ptr [esp+10h],eax
   271 		mov         dword ptr [esp+0Ch],edx
   272 L1:
   273 		mov         eax,dword ptr [esp+18h]
   274 		or          eax,eax
   275 		jge         L2
   276 		mov         edx,dword ptr [esp+14h]
   277 		neg         eax
   278 		neg         edx
   279 		sbb         eax,0
   280 		mov         dword ptr [esp+18h],eax
   281 		mov         dword ptr [esp+14h],edx
   282 L2:
   283 		or          eax,eax
   284 		jne         L3
   285 		mov         ecx,dword ptr [esp+14h]
   286 		mov         eax,dword ptr [esp+10h]
   287 		xor         edx,edx
   288 		div         ecx
   289 		mov         eax,dword ptr [esp+0Ch]
   290 		div         ecx
   291 		mov         eax,edx
   292 		xor         edx,edx
   293 		dec         edi
   294 		jns         L4
   295 		jmp         L8
   296 L3:
   297 		mov         ebx,eax
   298 		mov         ecx,dword ptr [esp+14h]
   299 		mov         edx,dword ptr [esp+10h]
   300 		mov         eax,dword ptr [esp+0Ch]
   301 L5:
   302 		shr         ebx,1
   303 		rcr         ecx,1
   304 		shr         edx,1
   305 		rcr         eax,1
   306 		or          ebx,ebx
   307 		jne         L5
   308 		div         ecx
   309 		mov         ecx,eax
   310 		mul         dword ptr [esp+18h]
   311 		xchg        eax,ecx
   312 		mul         dword ptr [esp+14h]
   313 		add         edx,ecx
   314 		jb          L6
   315 		cmp         edx,dword ptr [esp+10h]
   316 		ja          L6
   317 		jb          L7
   318 		cmp         eax,dword ptr [esp+0Ch]
   319 		jbe         L7
   320 L6:
   321 		sub         eax,dword ptr [esp+14h]
   322 		sbb         edx,dword ptr [esp+18h]
   323 L7:
   324 		sub         eax,dword ptr [esp+0Ch]
   325 		sbb         edx,dword ptr [esp+10h]
   326 		dec         edi
   327 		jns         L8
   328 L4:
   329 		neg         edx
   330 		neg         eax
   331 		sbb         edx,0
   332 L8:
   333 		pop         edi
   334 		pop         ebx
   335 		ret         10h
   336 	}
   337 }
   338 void __declspec(naked) _aullrem()
   339 {
   340 	__asm {
   341 		push        ebx
   342 		mov         eax,dword ptr [esp+14h]
   343 		or          eax,eax
   344 		jne         L1
   345 		mov         ecx,dword ptr [esp+10h]
   346 		mov         eax,dword ptr [esp+0Ch]
   347 		xor         edx,edx
   348 		div         ecx
   349 		mov         eax,dword ptr [esp+8]
   350 		div         ecx
   351 		mov         eax,edx
   352 		xor         edx,edx
   353 		jmp         L2
   354 L1:
   355 		mov         ecx,eax
   356 		mov         ebx,dword ptr [esp+10h]
   357 		mov         edx,dword ptr [esp+0Ch]
   358 		mov         eax,dword ptr [esp+8]
   359 L3:
   360 		shr         ecx,1
   361 		rcr         ebx,1
   362 		shr         edx,1
   363 		rcr         eax,1
   364 		or          ecx,ecx
   365 		jne         L3
   366 		div         ebx
   367 		mov         ecx,eax
   368 		mul         dword ptr [esp+14h]
   369 		xchg        eax,ecx
   370 		mul         dword ptr [esp+10h]
   371 		add         edx,ecx
   372 		jb          L4
   373 		cmp         edx,dword ptr [esp+0Ch]
   374 		ja          L4
   375 		jb          L5
   376 		cmp         eax,dword ptr [esp+8]
   377 		jbe         L5
   378 L4:
   379 		sub         eax,dword ptr [esp+10h]
   380 		sbb         edx,dword ptr [esp+14h]
   381 L5:
   382 		sub         eax,dword ptr [esp+8]
   383 		sbb         edx,dword ptr [esp+0Ch]
   384 		neg         edx
   385 		neg         eax
   386 		sbb         edx,0
   387 L2:
   388 		pop         ebx
   389 		ret         10h
   390 	}
   391 }
   392 void __declspec(naked) _alldvrm()
   393 {
   394 	__asm {
   395 		push        edi
   396 		push        esi
   397 		push        ebp
   398 		xor         edi,edi
   399 		xor         ebp,ebp
   400 		mov         eax,dword ptr [esp+14h]
   401 		or          eax,eax
   402 		jge         L1
   403 		inc         edi
   404 		inc         ebp
   405 		mov         edx,dword ptr [esp+10h]
   406 		neg         eax
   407 		neg         edx
   408 		sbb         eax,0
   409 		mov         dword ptr [esp+14h],eax
   410 		mov         dword ptr [esp+10h],edx
   411 L1:
   412 		mov         eax,dword ptr [esp+1Ch]
   413 		or          eax,eax
   414 		jge         L2
   415 		inc         edi
   416 		mov         edx,dword ptr [esp+18h]
   417 		neg         eax
   418 		neg         edx
   419 		sbb         eax,0
   420 		mov         dword ptr [esp+1Ch],eax
   421 		mov         dword ptr [esp+18h],edx
   422 L2:
   423 		or          eax,eax
   424 		jne         L3
   425 		mov         ecx,dword ptr [esp+18h]
   426 		mov         eax,dword ptr [esp+14h]
   427 		xor         edx,edx
   428 		div         ecx
   429 		mov         ebx,eax
   430 		mov         eax,dword ptr [esp+10h]
   431 		div         ecx
   432 		mov         esi,eax
   433 		mov         eax,ebx
   434 		mul         dword ptr [esp+18h]
   435 		mov         ecx,eax
   436 		mov         eax,esi
   437 		mul         dword ptr [esp+18h]
   438 		add         edx,ecx
   439 		jmp         L4
   440 L3:
   441 		mov         ebx,eax
   442 		mov         ecx,dword ptr [esp+18h]
   443 		mov         edx,dword ptr [esp+14h]
   444 		mov         eax,dword ptr [esp+10h]
   445 L5:
   446 		shr         ebx,1
   447 		rcr         ecx,1
   448 		shr         edx,1
   449 		rcr         eax,1
   450 		or          ebx,ebx
   451 		jne         L5
   452 		div         ecx
   453 		mov         esi,eax
   454 		mul         dword ptr [esp+1Ch]
   455 		mov         ecx,eax
   456 		mov         eax,dword ptr [esp+18h]
   457 		mul         esi
   458 		add         edx,ecx
   459 		jb          L6
   460 		cmp         edx,dword ptr [esp+14h]
   461 		ja          L6
   462 		jb          L7
   463 		cmp         eax,dword ptr [esp+10h]
   464 		jbe         L7
   465 L6:
   466 		dec         esi
   467 		sub         eax,dword ptr [esp+18h]
   468 		sbb         edx,dword ptr [esp+1Ch]
   469 L7:
   470 		xor         ebx,ebx
   471 L4:
   472 		sub         eax,dword ptr [esp+10h]
   473 		sbb         edx,dword ptr [esp+14h]
   474 		dec         ebp
   475 		jns         L9
   476 		neg         edx
   477 		neg         eax
   478 		sbb         edx,0
   479 L9:
   480 		mov         ecx,edx
   481 		mov         edx,ebx
   482 		mov         ebx,ecx
   483 		mov         ecx,eax
   484 		mov         eax,esi
   485 		dec         edi
   486 		jne         L8
   487 		neg         edx
   488 		neg         eax
   489 		sbb         edx,0
   490 L8:
   491 		pop         ebp
   492 		pop         esi
   493 		pop         edi
   494 		ret         10h
   495 	}
   496 }
   497 void __declspec(naked) _aulldvrm()
   498 {
   499 	__asm {
   500 		push        esi
   501 		mov         eax,dword ptr [esp+14h]
   502 		or          eax,eax
   503 		jne         L1
   504 		mov         ecx,dword ptr [esp+10h]
   505 		mov         eax,dword ptr [esp+0Ch]
   506 		xor         edx,edx
   507 		div         ecx
   508 		mov         ebx,eax
   509 		mov         eax,dword ptr [esp+8]
   510 		div         ecx
   511 		mov         esi,eax
   512 		mov         eax,ebx
   513 		mul         dword ptr [esp+10h]
   514 		mov         ecx,eax
   515 		mov         eax,esi
   516 		mul         dword ptr [esp+10h]
   517 		add         edx,ecx
   518 		jmp         L2
   519 L1:
   520 		mov         ecx,eax
   521 		mov         ebx,dword ptr [esp+10h]
   522 		mov         edx,dword ptr [esp+0Ch]
   523 		mov         eax,dword ptr [esp+8]
   524 L3:
   525 		shr         ecx,1
   526 		rcr         ebx,1
   527 		shr         edx,1
   528 		rcr         eax,1
   529 		or          ecx,ecx
   530 		jne         L3
   531 		div         ebx
   532 		mov         esi,eax
   533 		mul         dword ptr [esp+14h]
   534 		mov         ecx,eax
   535 		mov         eax,dword ptr [esp+10h]
   536 		mul         esi
   537 		add         edx,ecx
   538 		jb          L4
   539 		cmp         edx,dword ptr [esp+0Ch]
   540 		ja          L4
   541 		jb          L5
   542 		cmp         eax,dword ptr [esp+8]
   543 		jbe         L5
   544 L4:
   545 		dec         esi
   546 		sub         eax,dword ptr [esp+10h]
   547 		sbb         edx,dword ptr [esp+14h]
   548 L5:
   549 		xor         ebx,ebx
   550 L2:
   551 		sub         eax,dword ptr [esp+8]
   552 		sbb         edx,dword ptr [esp+0Ch]
   553 		neg         edx
   554 		neg         eax
   555 		sbb         edx,0
   556 		mov         ecx,edx
   557 		mov         edx,ebx
   558 		mov         ebx,ecx
   559 		mov         ecx,eax
   560 		mov         eax,esi
   561 		pop         esi
   562 		ret         10h
   563 	}
   564 }
   565 void __declspec(naked) _allshl()
   566 {
   567 	__asm {
   568 		cmp         cl,40h
   569 		jae         RETZERO
   570 		cmp         cl,20h
   571 		jae         MORE32
   572 		shld        edx,eax,cl
   573 		shl         eax,cl
   574 		ret
   575 MORE32:
   576 		mov         edx,eax
   577 		xor         eax,eax
   578 		and         cl,1Fh
   579 		shl         edx,cl
   580 		ret
   581 RETZERO:
   582 		xor         eax,eax
   583 		xor         edx,edx
   584 		ret
   585 	}
   586 }
   587 void __declspec(naked) _aullshr()
   588 {
   589 	__asm {
   590 		cmp         cl,40h
   591 		jae         RETZERO
   592 		cmp         cl,20h
   593 		jae         MORE32
   594 		shrd        eax,edx,cl
   595 		shr         edx,cl
   596 		ret
   597 MORE32:
   598 		mov         eax,edx
   599 		xor         edx,edx
   600 		and         cl,1Fh
   601 		shr         eax,cl
   602 		ret
   603 RETZERO:
   604 		xor         eax,eax
   605 		xor         edx,edx
   606 		ret
   607 	}
   608 }
   609 
   610 #endif /* MSC_VER */
   611 
   612 #endif /* !HAVE_LIBC */