SDL-1.2.14
[sdl_omap.git] / src / stdlib / SDL_stdlib.c
1 /*
2     SDL - Simple DirectMedia Layer
3     Copyright (C) 1997-2009 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 */