|
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 #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 */ |