Atlas - SDL_mslibc.c
Home / ext / SDL / src / stdlib Lines: 1 | Size: 19783 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)][FILE BEGIN]1/* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2025 Sam Lantinga <[email protected]> 4 5 This software is provided 'as-is', without any express or implied 6 warranty. In no event will the authors be held liable for any damages 7 arising from the use of this software. 8 9 Permission is granted to anyone to use this software for any purpose, 10 including commercial applications, and to alter it and redistribute it 11 freely, subject to the following restrictions: 12 13 1. The origin of this software must not be misrepresented; you must not 14 claim that you wrote the original software. If you use this software 15 in a product, an acknowledgment in the product documentation would be 16 appreciated but is not required. 17 2. Altered source versions must be plainly marked as such, and must not be 18 misrepresented as being the original software. 19 3. This notice may not be removed or altered from any source distribution. 20*/ 21#include "SDL_internal.h" 22 23// This file contains SDL replacements for functions in the C library 24 25#if !defined(HAVE_LIBC) && !defined(SDL_STATIC_LIB) 26 27// These are some C runtime intrinsics that need to be defined 28 29#ifdef _MSC_VER 30 31#ifndef __FLTUSED__ 32#define __FLTUSED__ 33__declspec(selectany) int _fltused = 1; 34#endif 35 36#ifdef _M_IX86 37 38// Float to long 39void __declspec(naked) _ftol() 40{ 41 /* *INDENT-OFF* */ 42 __asm { 43 push ebp 44 mov ebp,esp 45 sub esp,20h 46 and esp,0FFFFFFF0h 47 fld st(0) 48 fst dword ptr [esp+18h] 49 fistp qword ptr [esp+10h] 50 fild qword ptr [esp+10h] 51 mov edx,dword ptr [esp+18h] 52 mov eax,dword ptr [esp+10h] 53 test eax,eax 54 je integer_QnaN_or_zero 55arg_is_not_integer_QnaN: 56 fsubp st(1),st 57 test edx,edx 58 jns positive 59 fstp dword ptr [esp] 60 mov ecx,dword ptr [esp] 61 xor ecx,80000000h 62 add ecx,7FFFFFFFh 63 adc eax,0 64 mov edx,dword ptr [esp+14h] 65 adc edx,0 66 jmp localexit 67positive: 68 fstp dword ptr [esp] 69 mov ecx,dword ptr [esp] 70 add ecx,7FFFFFFFh 71 sbb eax,0 72 mov edx,dword ptr [esp+14h] 73 sbb edx,0 74 jmp localexit 75integer_QnaN_or_zero: 76 mov edx,dword ptr [esp+14h] 77 test edx,7FFFFFFFh 78 jne arg_is_not_integer_QnaN 79 fstp dword ptr [esp+18h] 80 fstp dword ptr [esp+18h] 81localexit: 82 leave 83 ret 84 } 85 /* *INDENT-ON* */ 86} 87 88void _ftol2_sse() 89{ 90 _ftol(); 91} 92 93void _ftol2() 94{ 95 _ftol(); 96} 97 98void __declspec(naked) _ftoul2_legacy() 99{ 100 static const Uint64 LLONG_MAX_PLUS_ONE = 0x43e0000000000000ULL; 101 /* *INDENT-OFF* */ 102 __asm { 103 fld qword ptr [LLONG_MAX_PLUS_ONE] 104 fcom 105 fnstsw ax 106 test ah, 41h 107 jnp greater_than_int64 108 109 fstp st(0) 110 jmp _ftol 111 112greater_than_int64: 113 fsub st(1), st(0) 114 fcomp 115 fnstsw ax 116 test ah, 41h 117 jnz greater_than_uint64 118 119 call _ftol 120 add edx, 80000000h 121 ret 122 123greater_than_uint64: 124 xor eax, eax 125 mov edx, 80000000h 126 ret 127 } 128 /* *INDENT-ON* */ 129} 130 131// 64-bit math operators for 32-bit systems 132void __declspec(naked) _allmul() 133{ 134 /* *INDENT-OFF* */ 135 __asm { 136 mov eax, dword ptr[esp+8] 137 mov ecx, dword ptr[esp+10h] 138 or ecx, eax 139 mov ecx, dword ptr[esp+0Ch] 140 jne hard 141 mov eax, dword ptr[esp+4] 142 mul ecx 143 ret 10h 144hard: 145 push ebx 146 mul ecx 147 mov ebx, eax 148 mov eax, dword ptr[esp+8] 149 mul dword ptr[esp+14h] 150 add ebx, eax 151 mov eax, dword ptr[esp+8] 152 mul ecx 153 add edx, ebx 154 pop ebx 155 ret 10h 156 } 157 /* *INDENT-ON* */ 158} 159 160void __declspec(naked) _alldiv() 161{ 162 /* *INDENT-OFF* */ 163 __asm { 164 push edi 165 push esi 166 push ebx 167 xor edi,edi 168 mov eax,dword ptr [esp+14h] 169 or eax,eax 170 jge L1 171 inc edi 172 mov edx,dword ptr [esp+10h] 173 neg eax 174 neg edx 175 sbb eax,0 176 mov dword ptr [esp+14h],eax 177 mov dword ptr [esp+10h],edx 178L1: 179 mov eax,dword ptr [esp+1Ch] 180 or eax,eax 181 jge L2 182 inc edi 183 mov edx,dword ptr [esp+18h] 184 neg eax 185 neg edx 186 sbb eax,0 187 mov dword ptr [esp+1Ch],eax 188 mov dword ptr [esp+18h],edx 189L2: 190 or eax,eax 191 jne L3 192 mov ecx,dword ptr [esp+18h] 193 mov eax,dword ptr [esp+14h] 194 xor edx,edx 195 div ecx 196 mov ebx,eax 197 mov eax,dword ptr [esp+10h] 198 div ecx 199 mov edx,ebx 200 jmp L4 201L3: 202 mov ebx,eax 203 mov ecx,dword ptr [esp+18h] 204 mov edx,dword ptr [esp+14h] 205 mov eax,dword ptr [esp+10h] 206L5: 207 shr ebx,1 208 rcr ecx,1 209 shr edx,1 210 rcr eax,1 211 or ebx,ebx 212 jne L5 213 div ecx 214 mov esi,eax 215 mul dword ptr [esp+1Ch] 216 mov ecx,eax 217 mov eax,dword ptr [esp+18h] 218 mul esi 219 add edx,ecx 220 jb L6 221 cmp edx,dword ptr [esp+14h] 222 ja L6 223 jb L7 224 cmp eax,dword ptr [esp+10h] 225 jbe L7 226L6: 227 dec esi 228L7: 229 xor edx,edx 230 mov eax,esi 231L4: 232 dec edi 233 jne L8 234 neg edx 235 neg eax 236 sbb edx,0 237L8: 238 pop ebx 239 pop esi 240 pop edi 241 ret 10h 242 } 243 /* *INDENT-ON* */ 244} 245 246void __declspec(naked) _aulldiv() 247{ 248 /* *INDENT-OFF* */ 249 __asm { 250 push ebx 251 push esi 252 mov eax,dword ptr [esp+18h] 253 or eax,eax 254 jne L1 255 mov ecx,dword ptr [esp+14h] 256 mov eax,dword ptr [esp+10h] 257 xor edx,edx 258 div ecx 259 mov ebx,eax 260 mov eax,dword ptr [esp+0Ch] 261 div ecx 262 mov edx,ebx 263 jmp L2 264L1: 265 mov ecx,eax 266 mov ebx,dword ptr [esp+14h] 267 mov edx,dword ptr [esp+10h] 268 mov eax,dword ptr [esp+0Ch] 269L3: 270 shr ecx,1 271 rcr ebx,1 272 shr edx,1 273 rcr eax,1 274 or ecx,ecx 275 jne L3 276 div ebx 277 mov esi,eax 278 mul dword ptr [esp+18h] 279 mov ecx,eax 280 mov eax,dword ptr [esp+14h] 281 mul esi 282 add edx,ecx 283 jb L4 284 cmp edx,dword ptr [esp+10h] 285 ja L4 286 jb L5 287 cmp eax,dword ptr [esp+0Ch] 288 jbe L5 289L4: 290 dec esi 291L5: 292 xor edx,edx 293 mov eax,esi 294L2: 295 pop esi 296 pop ebx 297 ret 10h 298 } 299 /* *INDENT-ON* */ 300} 301 302void __declspec(naked) _allrem() 303{ 304 /* *INDENT-OFF* */ 305 __asm { 306 push ebx 307 push edi 308 xor edi,edi 309 mov eax,dword ptr [esp+10h] 310 or eax,eax 311 jge L1 312 inc edi 313 mov edx,dword ptr [esp+0Ch] 314 neg eax 315 neg edx 316 sbb eax,0 317 mov dword ptr [esp+10h],eax 318 mov dword ptr [esp+0Ch],edx 319L1: 320 mov eax,dword ptr [esp+18h] 321 or eax,eax 322 jge L2 323 mov edx,dword ptr [esp+14h] 324 neg eax 325 neg edx 326 sbb eax,0 327 mov dword ptr [esp+18h],eax 328 mov dword ptr [esp+14h],edx 329L2: 330 or eax,eax 331 jne L3 332 mov ecx,dword ptr [esp+14h] 333 mov eax,dword ptr [esp+10h] 334 xor edx,edx 335 div ecx 336 mov eax,dword ptr [esp+0Ch] 337 div ecx 338 mov eax,edx 339 xor edx,edx 340 dec edi 341 jns L4 342 jmp L8 343L3: 344 mov ebx,eax 345 mov ecx,dword ptr [esp+14h] 346 mov edx,dword ptr [esp+10h] 347 mov eax,dword ptr [esp+0Ch] 348L5: 349 shr ebx,1 350 rcr ecx,1 351 shr edx,1 352 rcr eax,1 353 or ebx,ebx 354 jne L5 355 div ecx 356 mov ecx,eax 357 mul dword ptr [esp+18h] 358 xchg eax,ecx 359 mul dword ptr [esp+14h] 360 add edx,ecx 361 jb L6 362 cmp edx,dword ptr [esp+10h] 363 ja L6 364 jb L7 365 cmp eax,dword ptr [esp+0Ch] 366 jbe L7 367L6: 368 sub eax,dword ptr [esp+14h] 369 sbb edx,dword ptr [esp+18h] 370L7: 371 sub eax,dword ptr [esp+0Ch] 372 sbb edx,dword ptr [esp+10h] 373 dec edi 374 jns L8 375L4: 376 neg edx 377 neg eax 378 sbb edx,0 379L8: 380 pop edi 381 pop ebx 382 ret 10h 383 } 384 /* *INDENT-ON* */ 385} 386 387void __declspec(naked) _aullrem() 388{ 389 /* *INDENT-OFF* */ 390 __asm { 391 push ebx 392 mov eax,dword ptr [esp+14h] 393 or eax,eax 394 jne L1 395 mov ecx,dword ptr [esp+10h] 396 mov eax,dword ptr [esp+0Ch] 397 xor edx,edx 398 div ecx 399 mov eax,dword ptr [esp+8] 400 div ecx 401 mov eax,edx 402 xor edx,edx 403 jmp L2 404L1: 405 mov ecx,eax 406 mov ebx,dword ptr [esp+10h] 407 mov edx,dword ptr [esp+0Ch] 408 mov eax,dword ptr [esp+8] 409L3: 410 shr ecx,1 411 rcr ebx,1 412 shr edx,1 413 rcr eax,1 414 or ecx,ecx 415 jne L3 416 div ebx 417 mov ecx,eax 418 mul dword ptr [esp+14h] 419 xchg eax,ecx 420 mul dword ptr [esp+10h] 421 add edx,ecx 422 jb L4 423 cmp edx,dword ptr [esp+0Ch] 424 ja L4 425 jb L5 426 cmp eax,dword ptr [esp+8] 427 jbe L5 428L4: 429 sub eax,dword ptr [esp+10h] 430 sbb edx,dword ptr [esp+14h] 431L5: 432 sub eax,dword ptr [esp+8] 433 sbb edx,dword ptr [esp+0Ch] 434 neg edx 435 neg eax 436 sbb edx,0 437L2: 438 pop ebx 439 ret 10h 440 } 441 /* *INDENT-ON* */ 442} 443 444void __declspec(naked) _alldvrm() 445{ 446 /* *INDENT-OFF* */ 447 __asm { 448 push edi 449 push esi 450 push ebp 451 xor edi,edi 452 xor ebp,ebp 453 mov eax,dword ptr [esp+14h] 454 or eax,eax 455 jge L1 456 inc edi 457 inc ebp 458 mov edx,dword ptr [esp+10h] 459 neg eax 460 neg edx 461 sbb eax,0 462 mov dword ptr [esp+14h],eax 463 mov dword ptr [esp+10h],edx 464L1: 465 mov eax,dword ptr [esp+1Ch] 466 or eax,eax 467 jge L2 468 inc edi 469 mov edx,dword ptr [esp+18h] 470 neg eax 471 neg edx 472 sbb eax,0 473 mov dword ptr [esp+1Ch],eax 474 mov dword ptr [esp+18h],edx 475L2: 476 or eax,eax 477 jne L3 478 mov ecx,dword ptr [esp+18h] 479 mov eax,dword ptr [esp+14h] 480 xor edx,edx 481 div ecx 482 mov ebx,eax 483 mov eax,dword ptr [esp+10h] 484 div ecx 485 mov esi,eax 486 mov eax,ebx 487 mul dword ptr [esp+18h] 488 mov ecx,eax 489 mov eax,esi 490 mul dword ptr [esp+18h] 491 add edx,ecx 492 jmp L4 493L3: 494 mov ebx,eax 495 mov ecx,dword ptr [esp+18h] 496 mov edx,dword ptr [esp+14h] 497 mov eax,dword ptr [esp+10h] 498L5: 499 shr ebx,1 500 rcr ecx,1 501 shr edx,1 502 rcr eax,1 503 or ebx,ebx 504 jne L5 505 div ecx 506 mov esi,eax 507 mul dword ptr [esp+1Ch] 508 mov ecx,eax 509 mov eax,dword ptr [esp+18h] 510 mul esi 511 add edx,ecx 512 jb L6 513 cmp edx,dword ptr [esp+14h] 514 ja L6 515 jb L7 516 cmp eax,dword ptr [esp+10h] 517 jbe L7 518L6: 519 dec esi 520 sub eax,dword ptr [esp+18h] 521 sbb edx,dword ptr [esp+1Ch] 522L7: 523 xor ebx,ebx 524L4: 525 sub eax,dword ptr [esp+10h] 526 sbb edx,dword ptr [esp+14h] 527 dec ebp 528 jns L9 529 neg edx 530 neg eax 531 sbb edx,0 532L9: 533 mov ecx,edx 534 mov edx,ebx 535 mov ebx,ecx 536 mov ecx,eax 537 mov eax,esi 538 dec edi 539 jne L8 540 neg edx 541 neg eax 542 sbb edx,0 543L8: 544 pop ebp 545 pop esi 546 pop edi 547 ret 10h 548 } 549 /* *INDENT-ON* */ 550} 551 552void __declspec(naked) _aulldvrm() 553{ 554 /* *INDENT-OFF* */ 555 __asm { 556 push esi 557 mov eax,dword ptr [esp+14h] 558 or eax,eax 559 jne L1 560 mov ecx,dword ptr [esp+10h] 561 mov eax,dword ptr [esp+0Ch] 562 xor edx,edx 563 div ecx 564 mov ebx,eax 565 mov eax,dword ptr [esp+8] 566 div ecx 567 mov esi,eax 568 mov eax,ebx 569 mul dword ptr [esp+10h] 570 mov ecx,eax 571 mov eax,esi 572 mul dword ptr [esp+10h] 573 add edx,ecx 574 jmp L2 575L1: 576 mov ecx,eax 577 mov ebx,dword ptr [esp+10h] 578 mov edx,dword ptr [esp+0Ch] 579 mov eax,dword ptr [esp+8] 580L3: 581 shr ecx,1 582 rcr ebx,1 583 shr edx,1 584 rcr eax,1 585 or ecx,ecx 586 jne L3 587 div ebx 588 mov esi,eax 589 mul dword ptr [esp+14h] 590 mov ecx,eax 591 mov eax,dword ptr [esp+10h] 592 mul esi 593 add edx,ecx 594 jb L4 595 cmp edx,dword ptr [esp+0Ch] 596 ja L4 597 jb L5 598 cmp eax,dword ptr [esp+8] 599 jbe L5 600L4: 601 dec esi 602 sub eax,dword ptr [esp+10h] 603 sbb edx,dword ptr [esp+14h] 604L5: 605 xor ebx,ebx 606L2: 607 sub eax,dword ptr [esp+8] 608 sbb edx,dword ptr [esp+0Ch] 609 neg edx 610 neg eax 611 sbb edx,0 612 mov ecx,edx 613 mov edx,ebx 614 mov ebx,ecx 615 mov ecx,eax 616 mov eax,esi 617 pop esi 618 ret 10h 619 } 620 /* *INDENT-ON* */ 621} 622 623void __declspec(naked) _allshl() 624{ 625 /* *INDENT-OFF* */ 626 __asm { 627 cmp cl,40h 628 jae RETZERO 629 cmp cl,20h 630 jae MORE32 631 shld edx,eax,cl 632 shl eax,cl 633 ret 634MORE32: 635 mov edx,eax 636 xor eax,eax 637 and cl,1Fh 638 shl edx,cl 639 ret 640RETZERO: 641 xor eax,eax 642 xor edx,edx 643 ret 644 } 645 /* *INDENT-ON* */ 646} 647 648void __declspec(naked) _allshr() 649{ 650 /* *INDENT-OFF* */ 651 __asm { 652 cmp cl,3Fh 653 jae RETSIGN 654 cmp cl,20h 655 jae MORE32 656 shrd eax,edx,cl 657 sar edx,cl 658 ret 659MORE32: 660 mov eax,edx 661 sar edx,1Fh 662 and cl,1Fh 663 sar eax,cl 664 ret 665RETSIGN: 666 sar edx,1Fh 667 mov eax,edx 668 ret 669 } 670 /* *INDENT-ON* */ 671} 672 673void __declspec(naked) _aullshr() 674{ 675 /* *INDENT-OFF* */ 676 __asm { 677 cmp cl,40h 678 jae RETZERO 679 cmp cl,20h 680 jae MORE32 681 shrd eax,edx,cl 682 shr edx,cl 683 ret 684MORE32: 685 mov eax,edx 686 xor edx,edx 687 and cl,1Fh 688 shr eax,cl 689 ret 690RETZERO: 691 xor eax,eax 692 xor edx,edx 693 ret 694 } 695 /* *INDENT-ON* */ 696} 697 698void __declspec(naked) _chkstk(void) 699{ 700 __asm { 701 push ecx 702 mov ecx,esp ; lea ecx,dword ptr [esp]+4 703 add ecx,4 704 sub ecx,eax 705 sbb eax,eax 706 not eax 707 and ecx,eax 708 mov eax,esp 709 and eax,0xfffff000 710L1: 711 cmp ecx,eax 712 jb short L2 713 mov eax,ecx 714 pop ecx 715 xchg esp,eax 716 mov eax,dword ptr [eax] 717 mov dword ptr [esp],eax 718 ret 719L2: 720 sub eax,0x1000 721 test dword ptr [eax],eax 722 jmp short L1 723 } 724} 725 726void __declspec(naked) _alloca_probe_8(void) 727{ 728 /* *INDENT-OFF* */ 729 __asm { 730 push ecx 731 mov ecx,esp ; lea ecx,dword ptr [esp]+8 732 add ecx,8 733 sub ecx,eax 734 and ecx,0x7 735 add eax,ecx 736 sbb ecx,ecx 737 or eax,ecx 738 pop ecx 739 jmp _chkstk 740 } 741 /* *INDENT-ON* */ 742} 743 744void __declspec(naked) _alloca_probe_16(void) 745{ 746 /* *INDENT-OFF* */ 747 __asm { 748 push ecx 749 mov ecx,esp ; lea ecx,dword ptr [esp]+8 750 add ecx,8 751 sub ecx,eax 752 and ecx,0xf 753 add eax,ecx 754 sbb ecx,ecx 755 or eax,ecx 756 pop ecx 757 jmp _chkstk 758 } 759 /* *INDENT-ON* */ 760} 761 762#endif // _M_IX86 763 764#endif // MSC_VER 765 766#ifdef __ICL 767/* The classic Intel compiler generates calls to _intel_fast_memcpy 768 * and _intel_fast_memset when building an optimized SDL library */ 769void *_intel_fast_memcpy(void *dst, const void *src, size_t len) 770{ 771 return SDL_memcpy(dst, src, len); 772} 773void *_intel_fast_memset(void *dst, int c, size_t len) 774{ 775 return SDL_memset(dst, c, len); 776} 777#endif 778 779#endif // !HAVE_LIBC && !SDL_STATIC_LIB 780[FILE END](C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.