src/stdlib/SDL_stdlib.c
author Ozkan Sezer <sezeroz@gmail.com>
Sun, 14 Oct 2018 15:25:04 +0300
branchSDL-1.2
changeset 12325 c4f2eeda176f
parent 6137 4720145f848b
permissions -rw-r--r--
remove symlink for libSDL-1.0.so.0 from the rpm spec file.

also fix a changelog date.
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2012 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 */