SDL  2.0
SDL_stdlib.c
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
4 
5  This software is provided 'as-is', without any express or implied
6  warranty. In no event will the authors be held liable for any damages
7  arising from the use of this software.
8 
9  Permission is granted to anyone to use this software for any purpose,
10  including commercial applications, and to alter it and redistribute it
11  freely, subject to the following restrictions:
12 
13  1. The origin of this software must not be misrepresented; you must not
14  claim that you wrote the original software. If you use this software
15  in a product, an acknowledgment in the product documentation would be
16  appreciated but is not required.
17  2. Altered source versions must be plainly marked as such, and must not be
18  misrepresented as being the original software.
19  3. This notice may not be removed or altered from any source distribution.
20 */
21 
22 #if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS)
23 #define SDL_DISABLE_ANALYZE_MACROS 1
24 #endif
25 
26 #include "../SDL_internal.h"
27 
28 /* This file contains portable stdlib functions for SDL */
29 
30 #include "SDL_stdinc.h"
31 #include "../libm/math_libm.h"
32 
33 
34 double
35 SDL_atan(double x)
36 {
37 #if defined(HAVE_ATAN)
38  return atan(x);
39 #else
40  return SDL_uclibc_atan(x);
41 #endif
42 }
43 
44 float
45 SDL_atanf(float x)
46 {
47 #if defined(HAVE_ATANF)
48  return atanf(x);
49 #else
50  return (float)SDL_atan((double)x);
51 #endif
52 }
53 
54 double
55 SDL_atan2(double x, double y)
56 {
57 #if defined(HAVE_ATAN2)
58  return atan2(x, y);
59 #else
60  return SDL_uclibc_atan2(x, y);
61 #endif
62 }
63 
64 float
65 SDL_atan2f(float x, float y)
66 {
67 #if defined(HAVE_ATAN2F)
68  return atan2f(x, y);
69 #else
70  return (float)SDL_atan2((double)x, (double)y);
71 #endif
72 }
73 
74 double
75 SDL_acos(double val)
76 {
77 #if defined(HAVE_ACOS)
78  return acos(val);
79 #else
80  double result;
81  if (val == -1.0) {
82  result = M_PI;
83  } else {
84  result = SDL_atan(SDL_sqrt(1.0 - val * val) / val);
85  if (result < 0.0)
86  {
87  result += M_PI;
88  }
89  }
90  return result;
91 #endif
92 }
93 
94 float
95 SDL_acosf(float val)
96 {
97 #if defined(HAVE_ACOSF)
98  return acosf(val);
99 #else
100  return (float)SDL_acos((double)val);
101 #endif
102 }
103 
104 double
105 SDL_asin(double val)
106 {
107 #if defined(HAVE_ASIN)
108  return asin(val);
109 #else
110  double result;
111  if (val == -1.0) {
112  result = -(M_PI / 2.0);
113  } else {
114  result = (M_PI / 2.0) - SDL_acos(val);
115  }
116  return result;
117 #endif
118 }
119 
120 float
122 {
123 #if defined(HAVE_ASINF)
124  return asinf(val);
125 #else
126  return (float)SDL_asin((double)val);
127 #endif
128 }
129 
130 double
131 SDL_ceil(double x)
132 {
133 #if defined(HAVE_CEIL)
134  return ceil(x);
135 #else
136  double integer = SDL_floor(x);
137  double fraction = x - integer;
138  if (fraction > 0.0) {
139  integer += 1.0;
140  }
141  return integer;
142 #endif /* HAVE_CEIL */
143 }
144 
145 float
146 SDL_ceilf(float x)
147 {
148 #if defined(HAVE_CEILF)
149  return ceilf(x);
150 #else
151  return (float)SDL_ceil((float)x);
152 #endif
153 }
154 
155 double
156 SDL_copysign(double x, double y)
157 {
158 #if defined(HAVE_COPYSIGN)
159  return copysign(x, y);
160 #elif defined(HAVE__COPYSIGN)
161  return _copysign(x, y);
162 #elif defined(__WATCOMC__) && defined(__386__)
163  /* this is nasty as hell, but it works.. */
164  unsigned int *xi = (unsigned int *) &x,
165  *yi = (unsigned int *) &y;
166  xi[1] = (yi[1] & 0x80000000) | (xi[1] & 0x7fffffff);
167  return x;
168 #else
169  return SDL_uclibc_copysign(x, y);
170 #endif /* HAVE_COPYSIGN */
171 }
172 
173 float
174 SDL_copysignf(float x, float y)
175 {
176 #if defined(HAVE_COPYSIGNF)
177  return copysignf(x, y);
178 #else
179  return (float)SDL_copysign((double)x, (double)y);
180 #endif
181 }
182 
183 double
184 SDL_cos(double x)
185 {
186 #if defined(HAVE_COS)
187  return cos(x);
188 #else
189  return SDL_uclibc_cos(x);
190 #endif
191 }
192 
193 float
194 SDL_cosf(float x)
195 {
196 #if defined(HAVE_COSF)
197  return cosf(x);
198 #else
199  return (float)SDL_cos((double)x);
200 #endif
201 }
202 
203 double
204 SDL_exp(double x)
205 {
206 #if defined(HAVE_EXP)
207  return exp(x);
208 #else
209  return SDL_uclibc_exp(x);
210 #endif
211 }
212 
213 float
214 SDL_expf(float x)
215 {
216 #if defined(HAVE_EXPF)
217  return expf(x);
218 #else
219  return (float)SDL_exp((double)x);
220 #endif
221 }
222 
223 double
224 SDL_fabs(double x)
225 {
226 #if defined(HAVE_FABS)
227  return fabs(x);
228 #else
229  return SDL_uclibc_fabs(x);
230 #endif
231 }
232 
233 float
234 SDL_fabsf(float x)
235 {
236 #if defined(HAVE_FABSF)
237  return fabsf(x);
238 #else
239  return (float)SDL_fabs((double)x);
240 #endif
241 }
242 
243 double
244 SDL_floor(double x)
245 {
246 #if defined(HAVE_FLOOR)
247  return floor(x);
248 #else
249  return SDL_uclibc_floor(x);
250 #endif
251 }
252 
253 float
254 SDL_floorf(float x)
255 {
256 #if defined(HAVE_FLOORF)
257  return floorf(x);
258 #else
259  return (float)SDL_floor((double)x);
260 #endif
261 }
262 
263 double
264 SDL_trunc(double x)
265 {
266 #if defined(HAVE_TRUNC)
267  return trunc(x);
268 #else
269  if (x >= 0.0f) {
270  return SDL_floor(x);
271  } else {
272  return SDL_ceil(x);
273  }
274 #endif
275 }
276 
277 float
278 SDL_truncf(float x)
279 {
280 #if defined(HAVE_TRUNCF)
281  return truncf(x);
282 #else
283  return (float)SDL_trunc((double)x);
284 #endif
285 }
286 
287 double
288 SDL_fmod(double x, double y)
289 {
290 #if defined(HAVE_FMOD)
291  return fmod(x, y);
292 #else
293  return SDL_uclibc_fmod(x, y);
294 #endif
295 }
296 
297 float
298 SDL_fmodf(float x, float y)
299 {
300 #if defined(HAVE_FMODF)
301  return fmodf(x, y);
302 #else
303  return (float)SDL_fmod((double)x, (double)y);
304 #endif
305 }
306 
307 double
308 SDL_log(double x)
309 {
310 #if defined(HAVE_LOG)
311  return log(x);
312 #else
313  return SDL_uclibc_log(x);
314 #endif
315 }
316 
317 float
318 SDL_logf(float x)
319 {
320 #if defined(HAVE_LOGF)
321  return logf(x);
322 #else
323  return (float)SDL_log((double)x);
324 #endif
325 }
326 
327 double
328 SDL_log10(double x)
329 {
330 #if defined(HAVE_LOG10)
331  return log10(x);
332 #else
333  return SDL_uclibc_log10(x);
334 #endif
335 }
336 
337 float
338 SDL_log10f(float x)
339 {
340 #if defined(HAVE_LOG10F)
341  return log10f(x);
342 #else
343  return (float)SDL_log10((double)x);
344 #endif
345 }
346 
347 double
348 SDL_pow(double x, double y)
349 {
350 #if defined(HAVE_POW)
351  return pow(x, y);
352 #else
353  return SDL_uclibc_pow(x, y);
354 #endif
355 }
356 
357 float
358 SDL_powf(float x, float y)
359 {
360 #if defined(HAVE_POWF)
361  return powf(x, y);
362 #else
363  return (float)SDL_pow((double)x, (double)y);
364 #endif
365 }
366 
367 double
368 SDL_scalbn(double x, int n)
369 {
370 #if defined(HAVE_SCALBN)
371  return scalbn(x, n);
372 #elif defined(HAVE__SCALB)
373  return _scalb(x, n);
374 #elif defined(HAVE_LIBC) && defined(HAVE_FLOAT_H) && (FLT_RADIX == 2)
375 /* from scalbn(3): If FLT_RADIX equals 2 (which is
376  * usual), then scalbn() is equivalent to ldexp(3). */
377  return ldexp(x, n);
378 #else
379  return SDL_uclibc_scalbn(x, n);
380 #endif
381 }
382 
383 float
384 SDL_scalbnf(float x, int n)
385 {
386 #if defined(HAVE_SCALBNF)
387  return scalbnf(x, n);
388 #else
389  return (float)SDL_scalbn((double)x, n);
390 #endif
391 }
392 
393 double
394 SDL_sin(double x)
395 {
396 #if defined(HAVE_SIN)
397  return sin(x);
398 #else
399  return SDL_uclibc_sin(x);
400 #endif
401 }
402 
403 float
404 SDL_sinf(float x)
405 {
406 #if defined(HAVE_SINF)
407  return sinf(x);
408 #else
409  return (float)SDL_sin((double)x);
410 #endif
411 }
412 
413 double
414 SDL_sqrt(double x)
415 {
416 #if defined(HAVE_SQRT)
417  return sqrt(x);
418 #else
419  return SDL_uclibc_sqrt(x);
420 #endif
421 }
422 
423 float
424 SDL_sqrtf(float x)
425 {
426 #if defined(HAVE_SQRTF)
427  return sqrtf(x);
428 #else
429  return (float)SDL_sqrt((double)x);
430 #endif
431 }
432 
433 double
434 SDL_tan(double x)
435 {
436 #if defined(HAVE_TAN)
437  return tan(x);
438 #else
439  return SDL_uclibc_tan(x);
440 #endif
441 }
442 
443 float
444 SDL_tanf(float x)
445 {
446 #if defined(HAVE_TANF)
447  return tanf(x);
448 #else
449  return (float)SDL_tan((double)x);
450 #endif
451 }
452 
453 int SDL_abs(int x)
454 {
455 #if defined(HAVE_ABS)
456  return abs(x);
457 #else
458  return ((x) < 0 ? -(x) : (x));
459 #endif
460 }
461 
462 #if defined(HAVE_CTYPE_H)
463 int SDL_isdigit(int x) { return isdigit(x); }
464 int SDL_isspace(int x) { return isspace(x); }
465 int SDL_isupper(int x) { return isupper(x); }
466 int SDL_islower(int x) { return islower(x); }
467 int SDL_toupper(int x) { return toupper(x); }
468 int SDL_tolower(int x) { return tolower(x); }
469 #else
470 int SDL_isdigit(int x) { return ((x) >= '0') && ((x) <= '9'); }
471 int SDL_isspace(int x) { return ((x) == ' ') || ((x) == '\t') || ((x) == '\r') || ((x) == '\n') || ((x) == '\f') || ((x) == '\v'); }
472 int SDL_isupper(int x) { return ((x) >= 'A') && ((x) <= 'Z'); }
473 int SDL_islower(int x) { return ((x) >= 'a') && ((x) <= 'z'); }
474 int SDL_toupper(int x) { return ((x) >= 'a') && ((x) <= 'z') ? ('A'+((x)-'a')) : (x); }
475 int SDL_tolower(int x) { return ((x) >= 'A') && ((x) <= 'Z') ? ('a'+((x)-'A')) : (x); }
476 #endif
477 
478 
479 #ifndef HAVE_LIBC
480 /* These are some C runtime intrinsics that need to be defined */
481 
482 #if defined(_MSC_VER)
483 
484 #ifndef __FLTUSED__
485 #define __FLTUSED__
486 __declspec(selectany) int _fltused = 1;
487 #endif
488 
489 /* The optimizer on Visual Studio 2005 and later generates memcpy() and memset() calls */
490 #if _MSC_VER >= 1400
491 extern void *memcpy(void* dst, const void* src, size_t len);
492 #pragma intrinsic(memcpy)
493 
494 #pragma function(memcpy)
495 void *
496 memcpy(void *dst, const void *src, size_t len)
497 {
498  return SDL_memcpy(dst, src, len);
499 }
500 
501 extern void *memset(void* dst, int c, size_t len);
502 #pragma intrinsic(memset)
503 
504 #pragma function(memset)
505 void *
506 memset(void *dst, int c, size_t len)
507 {
508  return SDL_memset(dst, c, len);
509 }
510 #endif /* _MSC_VER >= 1400 */
511 
512 #ifdef _M_IX86
513 
514 /* Float to long */
515 void
516 __declspec(naked)
517 _ftol()
518 {
519  /* *INDENT-OFF* */
520  __asm {
521  push ebp
522  mov ebp,esp
523  sub esp,20h
524  and esp,0FFFFFFF0h
525  fld st(0)
526  fst dword ptr [esp+18h]
527  fistp qword ptr [esp+10h]
528  fild qword ptr [esp+10h]
529  mov edx,dword ptr [esp+18h]
530  mov eax,dword ptr [esp+10h]
531  test eax,eax
532  je integer_QnaN_or_zero
533 arg_is_not_integer_QnaN:
534  fsubp st(1),st
535  test edx,edx
536  jns positive
537  fstp dword ptr [esp]
538  mov ecx,dword ptr [esp]
539  xor ecx,80000000h
540  add ecx,7FFFFFFFh
541  adc eax,0
542  mov edx,dword ptr [esp+14h]
543  adc edx,0
544  jmp localexit
545 positive:
546  fstp dword ptr [esp]
547  mov ecx,dword ptr [esp]
548  add ecx,7FFFFFFFh
549  sbb eax,0
550  mov edx,dword ptr [esp+14h]
551  sbb edx,0
552  jmp localexit
553 integer_QnaN_or_zero:
554  mov edx,dword ptr [esp+14h]
555  test edx,7FFFFFFFh
556  jne arg_is_not_integer_QnaN
557  fstp dword ptr [esp+18h]
558  fstp dword ptr [esp+18h]
559 localexit:
560  leave
561  ret
562  }
563  /* *INDENT-ON* */
564 }
565 
566 void
567 _ftol2_sse()
568 {
569  _ftol();
570 }
571 
572 /* 64-bit math operators for 32-bit systems */
573 void
574 __declspec(naked)
575 _allmul()
576 {
577  /* *INDENT-OFF* */
578  __asm {
579  mov eax, dword ptr[esp+8]
580  mov ecx, dword ptr[esp+10h]
581  or ecx, eax
582  mov ecx, dword ptr[esp+0Ch]
583  jne hard
584  mov eax, dword ptr[esp+4]
585  mul ecx
586  ret 10h
587 hard:
588  push ebx
589  mul ecx
590  mov ebx, eax
591  mov eax, dword ptr[esp+8]
592  mul dword ptr[esp+14h]
593  add ebx, eax
594  mov eax, dword ptr[esp+8]
595  mul ecx
596  add edx, ebx
597  pop ebx
598  ret 10h
599  }
600  /* *INDENT-ON* */
601 }
602 
603 void
604 __declspec(naked)
605 _alldiv()
606 {
607  /* *INDENT-OFF* */
608  __asm {
609  push edi
610  push esi
611  push ebx
612  xor edi,edi
613  mov eax,dword ptr [esp+14h]
614  or eax,eax
615  jge L1
616  inc edi
617  mov edx,dword ptr [esp+10h]
618  neg eax
619  neg edx
620  sbb eax,0
621  mov dword ptr [esp+14h],eax
622  mov dword ptr [esp+10h],edx
623 L1:
624  mov eax,dword ptr [esp+1Ch]
625  or eax,eax
626  jge L2
627  inc edi
628  mov edx,dword ptr [esp+18h]
629  neg eax
630  neg edx
631  sbb eax,0
632  mov dword ptr [esp+1Ch],eax
633  mov dword ptr [esp+18h],edx
634 L2:
635  or eax,eax
636  jne L3
637  mov ecx,dword ptr [esp+18h]
638  mov eax,dword ptr [esp+14h]
639  xor edx,edx
640  div ecx
641  mov ebx,eax
642  mov eax,dword ptr [esp+10h]
643  div ecx
644  mov edx,ebx
645  jmp L4
646 L3:
647  mov ebx,eax
648  mov ecx,dword ptr [esp+18h]
649  mov edx,dword ptr [esp+14h]
650  mov eax,dword ptr [esp+10h]
651 L5:
652  shr ebx,1
653  rcr ecx,1
654  shr edx,1
655  rcr eax,1
656  or ebx,ebx
657  jne L5
658  div ecx
659  mov esi,eax
660  mul dword ptr [esp+1Ch]
661  mov ecx,eax
662  mov eax,dword ptr [esp+18h]
663  mul esi
664  add edx,ecx
665  jb L6
666  cmp edx,dword ptr [esp+14h]
667  ja L6
668  jb L7
669  cmp eax,dword ptr [esp+10h]
670  jbe L7
671 L6:
672  dec esi
673 L7:
674  xor edx,edx
675  mov eax,esi
676 L4:
677  dec edi
678  jne L8
679  neg edx
680  neg eax
681  sbb edx,0
682 L8:
683  pop ebx
684  pop esi
685  pop edi
686  ret 10h
687  }
688  /* *INDENT-ON* */
689 }
690 
691 void
692 __declspec(naked)
693 _aulldiv()
694 {
695  /* *INDENT-OFF* */
696  __asm {
697  push ebx
698  push esi
699  mov eax,dword ptr [esp+18h]
700  or eax,eax
701  jne L1
702  mov ecx,dword ptr [esp+14h]
703  mov eax,dword ptr [esp+10h]
704  xor edx,edx
705  div ecx
706  mov ebx,eax
707  mov eax,dword ptr [esp+0Ch]
708  div ecx
709  mov edx,ebx
710  jmp L2
711 L1:
712  mov ecx,eax
713  mov ebx,dword ptr [esp+14h]
714  mov edx,dword ptr [esp+10h]
715  mov eax,dword ptr [esp+0Ch]
716 L3:
717  shr ecx,1
718  rcr ebx,1
719  shr edx,1
720  rcr eax,1
721  or ecx,ecx
722  jne L3
723  div ebx
724  mov esi,eax
725  mul dword ptr [esp+18h]
726  mov ecx,eax
727  mov eax,dword ptr [esp+14h]
728  mul esi
729  add edx,ecx
730  jb L4
731  cmp edx,dword ptr [esp+10h]
732  ja L4
733  jb L5
734  cmp eax,dword ptr [esp+0Ch]
735  jbe L5
736 L4:
737  dec esi
738 L5:
739  xor edx,edx
740  mov eax,esi
741 L2:
742  pop esi
743  pop ebx
744  ret 10h
745  }
746  /* *INDENT-ON* */
747 }
748 
749 void
750 __declspec(naked)
751 _allrem()
752 {
753  /* *INDENT-OFF* */
754  __asm {
755  push ebx
756  push edi
757  xor edi,edi
758  mov eax,dword ptr [esp+10h]
759  or eax,eax
760  jge L1
761  inc edi
762  mov edx,dword ptr [esp+0Ch]
763  neg eax
764  neg edx
765  sbb eax,0
766  mov dword ptr [esp+10h],eax
767  mov dword ptr [esp+0Ch],edx
768 L1:
769  mov eax,dword ptr [esp+18h]
770  or eax,eax
771  jge L2
772  mov edx,dword ptr [esp+14h]
773  neg eax
774  neg edx
775  sbb eax,0
776  mov dword ptr [esp+18h],eax
777  mov dword ptr [esp+14h],edx
778 L2:
779  or eax,eax
780  jne L3
781  mov ecx,dword ptr [esp+14h]
782  mov eax,dword ptr [esp+10h]
783  xor edx,edx
784  div ecx
785  mov eax,dword ptr [esp+0Ch]
786  div ecx
787  mov eax,edx
788  xor edx,edx
789  dec edi
790  jns L4
791  jmp L8
792 L3:
793  mov ebx,eax
794  mov ecx,dword ptr [esp+14h]
795  mov edx,dword ptr [esp+10h]
796  mov eax,dword ptr [esp+0Ch]
797 L5:
798  shr ebx,1
799  rcr ecx,1
800  shr edx,1
801  rcr eax,1
802  or ebx,ebx
803  jne L5
804  div ecx
805  mov ecx,eax
806  mul dword ptr [esp+18h]
807  xchg eax,ecx
808  mul dword ptr [esp+14h]
809  add edx,ecx
810  jb L6
811  cmp edx,dword ptr [esp+10h]
812  ja L6
813  jb L7
814  cmp eax,dword ptr [esp+0Ch]
815  jbe L7
816 L6:
817  sub eax,dword ptr [esp+14h]
818  sbb edx,dword ptr [esp+18h]
819 L7:
820  sub eax,dword ptr [esp+0Ch]
821  sbb edx,dword ptr [esp+10h]
822  dec edi
823  jns L8
824 L4:
825  neg edx
826  neg eax
827  sbb edx,0
828 L8:
829  pop edi
830  pop ebx
831  ret 10h
832  }
833  /* *INDENT-ON* */
834 }
835 
836 void
837 __declspec(naked)
838 _aullrem()
839 {
840  /* *INDENT-OFF* */
841  __asm {
842  push ebx
843  mov eax,dword ptr [esp+14h]
844  or eax,eax
845  jne L1
846  mov ecx,dword ptr [esp+10h]
847  mov eax,dword ptr [esp+0Ch]
848  xor edx,edx
849  div ecx
850  mov eax,dword ptr [esp+8]
851  div ecx
852  mov eax,edx
853  xor edx,edx
854  jmp L2
855 L1:
856  mov ecx,eax
857  mov ebx,dword ptr [esp+10h]
858  mov edx,dword ptr [esp+0Ch]
859  mov eax,dword ptr [esp+8]
860 L3:
861  shr ecx,1
862  rcr ebx,1
863  shr edx,1
864  rcr eax,1
865  or ecx,ecx
866  jne L3
867  div ebx
868  mov ecx,eax
869  mul dword ptr [esp+14h]
870  xchg eax,ecx
871  mul dword ptr [esp+10h]
872  add edx,ecx
873  jb L4
874  cmp edx,dword ptr [esp+0Ch]
875  ja L4
876  jb L5
877  cmp eax,dword ptr [esp+8]
878  jbe L5
879 L4:
880  sub eax,dword ptr [esp+10h]
881  sbb edx,dword ptr [esp+14h]
882 L5:
883  sub eax,dword ptr [esp+8]
884  sbb edx,dword ptr [esp+0Ch]
885  neg edx
886  neg eax
887  sbb edx,0
888 L2:
889  pop ebx
890  ret 10h
891  }
892  /* *INDENT-ON* */
893 }
894 
895 void
896 __declspec(naked)
897 _alldvrm()
898 {
899  /* *INDENT-OFF* */
900  __asm {
901  push edi
902  push esi
903  push ebp
904  xor edi,edi
905  xor ebp,ebp
906  mov eax,dword ptr [esp+14h]
907  or eax,eax
908  jge L1
909  inc edi
910  inc ebp
911  mov edx,dword ptr [esp+10h]
912  neg eax
913  neg edx
914  sbb eax,0
915  mov dword ptr [esp+14h],eax
916  mov dword ptr [esp+10h],edx
917 L1:
918  mov eax,dword ptr [esp+1Ch]
919  or eax,eax
920  jge L2
921  inc edi
922  mov edx,dword ptr [esp+18h]
923  neg eax
924  neg edx
925  sbb eax,0
926  mov dword ptr [esp+1Ch],eax
927  mov dword ptr [esp+18h],edx
928 L2:
929  or eax,eax
930  jne L3
931  mov ecx,dword ptr [esp+18h]
932  mov eax,dword ptr [esp+14h]
933  xor edx,edx
934  div ecx
935  mov ebx,eax
936  mov eax,dword ptr [esp+10h]
937  div ecx
938  mov esi,eax
939  mov eax,ebx
940  mul dword ptr [esp+18h]
941  mov ecx,eax
942  mov eax,esi
943  mul dword ptr [esp+18h]
944  add edx,ecx
945  jmp L4
946 L3:
947  mov ebx,eax
948  mov ecx,dword ptr [esp+18h]
949  mov edx,dword ptr [esp+14h]
950  mov eax,dword ptr [esp+10h]
951 L5:
952  shr ebx,1
953  rcr ecx,1
954  shr edx,1
955  rcr eax,1
956  or ebx,ebx
957  jne L5
958  div ecx
959  mov esi,eax
960  mul dword ptr [esp+1Ch]
961  mov ecx,eax
962  mov eax,dword ptr [esp+18h]
963  mul esi
964  add edx,ecx
965  jb L6
966  cmp edx,dword ptr [esp+14h]
967  ja L6
968  jb L7
969  cmp eax,dword ptr [esp+10h]
970  jbe L7
971 L6:
972  dec esi
973  sub eax,dword ptr [esp+18h]
974  sbb edx,dword ptr [esp+1Ch]
975 L7:
976  xor ebx,ebx
977 L4:
978  sub eax,dword ptr [esp+10h]
979  sbb edx,dword ptr [esp+14h]
980  dec ebp
981  jns L9
982  neg edx
983  neg eax
984  sbb edx,0
985 L9:
986  mov ecx,edx
987  mov edx,ebx
988  mov ebx,ecx
989  mov ecx,eax
990  mov eax,esi
991  dec edi
992  jne L8
993  neg edx
994  neg eax
995  sbb edx,0
996 L8:
997  pop ebp
998  pop esi
999  pop edi
1000  ret 10h
1001  }
1002  /* *INDENT-ON* */
1003 }
1004 
1005 void
1006 __declspec(naked)
1007 _aulldvrm()
1008 {
1009  /* *INDENT-OFF* */
1010  __asm {
1011  push esi
1012  mov eax,dword ptr [esp+14h]
1013  or eax,eax
1014  jne L1
1015  mov ecx,dword ptr [esp+10h]
1016  mov eax,dword ptr [esp+0Ch]
1017  xor edx,edx
1018  div ecx
1019  mov ebx,eax
1020  mov eax,dword ptr [esp+8]
1021  div ecx
1022  mov esi,eax
1023  mov eax,ebx
1024  mul dword ptr [esp+10h]
1025  mov ecx,eax
1026  mov eax,esi
1027  mul dword ptr [esp+10h]
1028  add edx,ecx
1029  jmp L2
1030 L1:
1031  mov ecx,eax
1032  mov ebx,dword ptr [esp+10h]
1033  mov edx,dword ptr [esp+0Ch]
1034  mov eax,dword ptr [esp+8]
1035 L3:
1036  shr ecx,1
1037  rcr ebx,1
1038  shr edx,1
1039  rcr eax,1
1040  or ecx,ecx
1041  jne L3
1042  div ebx
1043  mov esi,eax
1044  mul dword ptr [esp+14h]
1045  mov ecx,eax
1046  mov eax,dword ptr [esp+10h]
1047  mul esi
1048  add edx,ecx
1049  jb L4
1050  cmp edx,dword ptr [esp+0Ch]
1051  ja L4
1052  jb L5
1053  cmp eax,dword ptr [esp+8]
1054  jbe L5
1055 L4:
1056  dec esi
1057  sub eax,dword ptr [esp+10h]
1058  sbb edx,dword ptr [esp+14h]
1059 L5:
1060  xor ebx,ebx
1061 L2:
1062  sub eax,dword ptr [esp+8]
1063  sbb edx,dword ptr [esp+0Ch]
1064  neg edx
1065  neg eax
1066  sbb edx,0
1067  mov ecx,edx
1068  mov edx,ebx
1069  mov ebx,ecx
1070  mov ecx,eax
1071  mov eax,esi
1072  pop esi
1073  ret 10h
1074  }
1075  /* *INDENT-ON* */
1076 }
1077 
1078 void
1079 __declspec(naked)
1080 _allshl()
1081 {
1082  /* *INDENT-OFF* */
1083  __asm {
1084  cmp cl,40h
1085  jae RETZERO
1086  cmp cl,20h
1087  jae MORE32
1088  shld edx,eax,cl
1089  shl eax,cl
1090  ret
1091 MORE32:
1092  mov edx,eax
1093  xor eax,eax
1094  and cl,1Fh
1095  shl edx,cl
1096  ret
1097 RETZERO:
1098  xor eax,eax
1099  xor edx,edx
1100  ret
1101  }
1102  /* *INDENT-ON* */
1103 }
1104 
1105 void
1106 __declspec(naked)
1107 _allshr()
1108 {
1109  /* *INDENT-OFF* */
1110  __asm {
1111  cmp cl,3Fh
1112  jae RETSIGN
1113  cmp cl,20h
1114  jae MORE32
1115  shrd eax,edx,cl
1116  sar edx,cl
1117  ret
1118 MORE32:
1119  mov eax,edx
1120  sar edx,1Fh
1121  and cl,1Fh
1122  sar eax,cl
1123  ret
1124 RETSIGN:
1125  sar edx,1Fh
1126  mov eax,edx
1127  ret
1128  }
1129  /* *INDENT-ON* */
1130 }
1131 
1132 void
1133 __declspec(naked)
1134 _aullshr()
1135 {
1136  /* *INDENT-OFF* */
1137  __asm {
1138  cmp cl,40h
1139  jae RETZERO
1140  cmp cl,20h
1141  jae MORE32
1142  shrd eax,edx,cl
1143  shr edx,cl
1144  ret
1145 MORE32:
1146  mov eax,edx
1147  xor edx,edx
1148  and cl,1Fh
1149  shr eax,cl
1150  ret
1151 RETZERO:
1152  xor eax,eax
1153  xor edx,edx
1154  ret
1155  }
1156  /* *INDENT-ON* */
1157 }
1158 
1159 #endif /* _M_IX86 */
1160 
1161 #endif /* MSC_VER */
1162 
1163 #endif /* !HAVE_LIBC */
1164 
1165 /* vi: set ts=4 sw=4 expandtab: */
#define SDL_memset
#define SDL_memcpy
#define memcpy
Definition: SDL_malloc.c:630
#define memset
Definition: SDL_malloc.c:627
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
GLuint GLfloat * val
GLenum src
GLuint64EXT * result
GLenum GLsizei len
const GLubyte * c
GLenum GLenum dst
GLdouble n
GLfloat GLfloat GLfloat GLfloat h
#define pop
Definition: SDL_qsort.c:195
double SDL_sqrt(double x)
Definition: SDL_stdlib.c:414
float SDL_tanf(float x)
Definition: SDL_stdlib.c:444
int SDL_isspace(int x)
Definition: SDL_stdlib.c:471
float SDL_acosf(float val)
Definition: SDL_stdlib.c:95
int SDL_tolower(int x)
Definition: SDL_stdlib.c:475
int SDL_abs(int x)
Definition: SDL_stdlib.c:453
double SDL_tan(double x)
Definition: SDL_stdlib.c:434
float SDL_ceilf(float x)
Definition: SDL_stdlib.c:146
float SDL_atanf(float x)
Definition: SDL_stdlib.c:45
float SDL_copysignf(float x, float y)
Definition: SDL_stdlib.c:174
int SDL_isdigit(int x)
Definition: SDL_stdlib.c:470
double SDL_sin(double x)
Definition: SDL_stdlib.c:394
float SDL_scalbnf(float x, int n)
Definition: SDL_stdlib.c:384
double SDL_pow(double x, double y)
Definition: SDL_stdlib.c:348
float SDL_sinf(float x)
Definition: SDL_stdlib.c:404
double SDL_ceil(double x)
Definition: SDL_stdlib.c:131
double SDL_exp(double x)
Definition: SDL_stdlib.c:204
double SDL_atan(double x)
Definition: SDL_stdlib.c:35
float SDL_sqrtf(float x)
Definition: SDL_stdlib.c:424
double SDL_scalbn(double x, int n)
Definition: SDL_stdlib.c:368
double SDL_fmod(double x, double y)
Definition: SDL_stdlib.c:288
double SDL_fabs(double x)
Definition: SDL_stdlib.c:224
float SDL_truncf(float x)
Definition: SDL_stdlib.c:278
double SDL_log10(double x)
Definition: SDL_stdlib.c:328
float SDL_expf(float x)
Definition: SDL_stdlib.c:214
double SDL_floor(double x)
Definition: SDL_stdlib.c:244
double SDL_acos(double val)
Definition: SDL_stdlib.c:75
int SDL_islower(int x)
Definition: SDL_stdlib.c:473
float SDL_logf(float x)
Definition: SDL_stdlib.c:318
float SDL_log10f(float x)
Definition: SDL_stdlib.c:338
float SDL_floorf(float x)
Definition: SDL_stdlib.c:254
double SDL_cos(double x)
Definition: SDL_stdlib.c:184
float SDL_fmodf(float x, float y)
Definition: SDL_stdlib.c:298
int SDL_isupper(int x)
Definition: SDL_stdlib.c:472
float SDL_fabsf(float x)
Definition: SDL_stdlib.c:234
double SDL_log(double x)
Definition: SDL_stdlib.c:308
double SDL_asin(double val)
Definition: SDL_stdlib.c:105
float SDL_asinf(float val)
Definition: SDL_stdlib.c:121
int SDL_toupper(int x)
Definition: SDL_stdlib.c:474
float SDL_powf(float x, float y)
Definition: SDL_stdlib.c:358
float SDL_cosf(float x)
Definition: SDL_stdlib.c:194
double SDL_copysign(double x, double y)
Definition: SDL_stdlib.c:156
double SDL_atan2(double x, double y)
Definition: SDL_stdlib.c:55
float SDL_atan2f(float x, float y)
Definition: SDL_stdlib.c:65
double SDL_trunc(double x)
Definition: SDL_stdlib.c:264
static const double L2
Definition: e_pow.c:82
static const double L3
Definition: e_pow.c:83
static const double L4
Definition: e_pow.c:84
static const double L1
Definition: e_pow.c:81
static const double L6
Definition: e_pow.c:86
static const double L5
Definition: e_pow.c:85
double SDL_uclibc_log10(double x)
double SDL_uclibc_atan2(double y, double x)
double SDL_uclibc_pow(double x, double y)
double SDL_uclibc_tan(double x)
double SDL_uclibc_log(double x)
double SDL_uclibc_floor(double x)
double SDL_uclibc_copysign(double x, double y)
double SDL_uclibc_scalbn(double x, int n)
double SDL_uclibc_exp(double x)
double SDL_uclibc_fmod(double x, double y)
double SDL_uclibc_atan(double x)
double SDL_uclibc_sin(double x)
double SDL_uclibc_fabs(double x)
double SDL_uclibc_sqrt(double x)
double SDL_uclibc_cos(double x)
#define scalbn
Definition: math_private.h:46
set set set set set set set set set set set set set set set set set set set set *set set set macro pixldst op &r &cond WK op &r &cond WK op &r &cond WK else op &m &cond &ia op &r &cond WK else op &m &cond &ia elseif elseif else error unsupported base if elseif elseif else error unsupported unaligned pixldst unaligned endm macro pixst base base else pixldst base endif endm macro PF base if bpp PF set rept prefetch_distance PF set OFFSET endr endif endm macro preload_leading_step2 base if bpp ifc DST PF PF else if bpp lsl PF and
set set set set set set set set set set set set set set set set set set set set *set set set macro pixldst op &r &cond WK op &r &cond WK op &r &cond WK else op &m &cond &ia op &r &cond WK else op &m &cond &ia elseif elseif else error unsupported base if elseif elseif else error unsupported unaligned pixldst unaligned endm macro pixst base base else pixldst base endif endm macro PF base if bpp PF set rept prefetch_distance PF set OFFSET endr endif endm macro preload_leading_step2 base if bpp ifc DST PF PF else if bpp lsl PF PF lsl PF sub
set set set set set set set set set set set set set set set set set set set set *set set set macro pixldst op &r &cond WK op &r &cond WK op &r &cond WK else op &m &cond &ia op &r &cond WK else op &m &cond &ia elseif elseif else error unsupported base if elseif elseif else error unsupported unaligned pixldst unaligned endm macro pixst base base else pixldst base endif endm macro PF base if bpp PF set rept prefetch_distance PF set OFFSET endr endif endm macro preload_leading_step2 base if bpp ifc DST PF PF else if bpp lsl PF PF lsl PF PF lsl PF PF PF else PF mov
set set set set set set set set set set set set set set set set set set set set *set set set macro pixldst op &r &cond WK op &r &cond WK op &r &cond WK else op &m &cond &ia op &r &cond WK else op &m &cond &ia elseif elseif else error unsupported base if elseif elseif else error unsupported unaligned pixldst unaligned endm macro pixst base base else pixldst st
set set set set set set set set set set set set set set set set set set set set *set set set macro pixldst op &r &cond WK op &r &cond WK op &r &cond WK else op &m &cond &ia op &r &cond WK else op &m &cond &ia elseif elseif else error unsupported base if elseif elseif else error unsupported unaligned pixldst unaligned endm macro pixst base base else pixldst base endif endm macro PF ptr
set set set set set set set set set set set set set set set set set set set set *set set set macro pixldst op &r &cond WK op &r &cond WK op &r &cond WK else op &m &cond &ia op &r &cond WK else op &m &cond &ia elseif elseif else error unsupported base if elseif elseif else error unsupported unaligned pixldst unaligned endm macro pixst base base else pixldst base endif endm macro PF base if bpp PF set rept prefetch_distance PF set OFFSET endr endif endm macro preload_leading_step2 base if bpp ifc DST PF PF else if bpp lsl PF PF lsl PF PF lsl PF PF PF else PF lsl PF add
double atan(double x)
Definition: s_atan.c:71
double copysign(double x, double y)
Definition: s_copysign.c:21
double cos(double x)
Definition: s_cos.c:46
double fabs(double x)
Definition: s_fabs.c:22
double floor(double x)
Definition: s_floor.c:33
double sin(double x)
Definition: s_sin.c:46
double tan(double x)
Definition: s_tan.c:45
__declspec(dllimport) HINSTANCE __stdcall LoadLibraryA(char const *lpLibFileName)