diff options
Diffstat (limited to 'apps/plugins/sdl/src/stdlib/SDL_stdlib.c')
-rw-r--r-- | apps/plugins/sdl/src/stdlib/SDL_stdlib.c | 620 |
1 files changed, 620 insertions, 0 deletions
diff --git a/apps/plugins/sdl/src/stdlib/SDL_stdlib.c b/apps/plugins/sdl/src/stdlib/SDL_stdlib.c new file mode 100644 index 0000000000..5c88fe72c9 --- /dev/null +++ b/apps/plugins/sdl/src/stdlib/SDL_stdlib.c | |||
@@ -0,0 +1,620 @@ | |||
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 */ | ||