• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */
_ftol()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 }
_ftol2_sse()88 void __declspec(naked) _ftol2_sse()
89 {
90 	_ftol();
91 }
92 
93 /* 64-bit math operators for 32-bit systems */
_allmul()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 }
_alldiv()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 }
_aulldiv()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 }
_allrem()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 }
_aullrem()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 }
_alldvrm()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 }
_aulldvrm()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 }
_allshl()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 }
_aullshr()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 */
621