SDL_mslibc.c 18 KB

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