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 (at) 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 */ 621