Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
  4.  
  5.     This library is free software; you can redistribute it and/or
  6.     modify it under the terms of the GNU Library General Public
  7.     License as published by the Free Software Foundation; either
  8.     version 2 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.     Library General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU Library General Public
  16.     License along with this library; if not, write to the Free
  17.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  
  19.     Sam Lantinga
  20.     slouken@devolution.com
  21. */
  22.  
  23. #ifdef SAVE_RCSID
  24. static char rcsid =
  25.  "@(#) $Id: SDL_memops.h,v 1.2 2001/04/26 16:50:18 hercules Exp $";
  26. #endif
  27.  
  28. #ifndef _SDL_memops_h
  29. #define _SDL_memops_h
  30.  
  31. /* System dependent optimized memory manipulation routines:
  32. */
  33. #include <string.h>
  34.  
  35. #if defined(__GNUC__) && defined(i386)
  36. /* Thanks to Brennan "Bas" Underwood, for the inspiration. :)
  37.  */
  38. #define SDL_memcpy(dst, src, len)                                         \
  39. do {                                                                      \
  40.         int u0, u1, u2;                                           \
  41.         __asm__ __volatile__ (                                            \
  42.                 "cld\n\t"                                                 \
  43.                 "rep ; movsl\n\t"                                         \
  44.                 "testb $2,%b4\n\t"                                        \
  45.                 "je 1f\n\t"                                               \
  46.                 "movsw\n"                                                 \
  47.                 "1:\ttestb $1,%b4\n\t"                                    \
  48.                 "je 2f\n\t"                                               \
  49.                 "movsb\n"                                                 \
  50.                 "2:"                                                      \
  51.                 : "=&c" (u0), "=&D" (u1), "=&S" (u2)                      \
  52.                 : "0" ((unsigned)(len)/4), "q" (len), "1" (dst),"2" (src) \
  53.                 : "memory" );                                             \
  54. } while(0)
  55.  
  56. #define SDL_memcpy4(dst, src, len)                              \
  57. do {                                                            \
  58.         int ecx, edi, esi;                                      \
  59.         __asm__ __volatile__ (                                  \
  60.                 "cld\n\t"                                       \
  61.                 "rep ; movsl"                                   \
  62.                 : "=&c" (ecx), "=&D" (edi), "=&S" (esi)         \
  63.                 : "0" ((unsigned)(len)), "1" (dst), "2" (src)   \
  64.                 : "memory" );                                   \
  65. } while(0)
  66.  
  67. #define SDL_revcpy(dst, src, len)                       \
  68. do {                                                    \
  69.         int u0, u1, u2;                                 \
  70.         char *dstp = (char *)(dst);                     \
  71.         char *srcp = (char *)(src);                     \
  72.         int n = (len);                                  \
  73.         if ( n >= 4 ) {                                 \
  74.         __asm__ __volatile__ (                          \
  75.                 "std\n\t"                               \
  76.                 "rep ; movsl\n\t"                       \
  77.                 : "=&c" (u0), "=&D" (u1), "=&S" (u2)    \
  78.                 : "0" (n >> 2),                         \
  79.                   "1" (dstp+(n-4)), "2" (srcp+(n-4))    \
  80.                 : "memory" );                           \
  81.         }                                               \
  82.         switch (n & 3) {                                \
  83.                 case 3: dstp[2] = srcp[2];              \
  84.                 case 2: dstp[1] = srcp[1];              \
  85.                 case 1: dstp[0] = srcp[0];              \
  86.                         break;                          \
  87.                 default:                                \
  88.                         break;                          \
  89.         }                                               \
  90. } while(0)
  91.  
  92. #define SDL_memmove(dst, src, len)                      \
  93. do {                                                    \
  94.         if ( (dst) < (src) ) {                          \
  95.                 SDL_memcpy((dst), (src), (len));        \
  96.         } else {                                        \
  97.                 SDL_revcpy((dst), (src), (len));        \
  98.         }                                               \
  99. } while(0)
  100.  
  101. #define SDL_memset4(dst, val, len)                              \
  102. do {                                                            \
  103.         int u0, u1, u2;                                 \
  104.         __asm__ __volatile__ (                                  \
  105.                 "cld\n\t"                                       \
  106.                 "rep ; stosl\n\t"                               \
  107.                 : "=&D" (u0), "=&a" (u1), "=&c" (u2)            \
  108.                 : "0" (dst), "1" (val), "2" ((Uint32)(len))     \
  109.                 : "memory" );                                   \
  110. } while(0)
  111.  
  112. #endif /* GNU C and x86 */
  113.  
  114. /* If there are no optimized versions, define the normal versions */
  115. #ifndef SDL_memcpy
  116. #define SDL_memcpy(dst, src, len)       memcpy(dst, src, len)
  117. #endif
  118.  
  119. #ifndef SDL_memcpy4
  120. #define SDL_memcpy4(dst, src, len)      memcpy(dst, src, (len) << 2)
  121. #endif
  122.  
  123. #ifndef SDL_revcpy
  124. #define SDL_revcpy(dst, src, len)       memmove(dst, src, len)
  125. #endif
  126.  
  127. #ifndef SDL_memset4
  128. #define SDL_memset4(dst, val, len)              \
  129. do {                                            \
  130.         unsigned _count = (len);                \
  131.         unsigned _n = (_count + 3) / 4;         \
  132.         Uint32 *_p = (Uint32 *)(dst);           \
  133.         Uint32 _val = (val);                    \
  134.         switch (_count % 4) {                   \
  135.         case 0: do {    *_p++ = _val;           \
  136.         case 3:         *_p++ = _val;           \
  137.         case 2:         *_p++ = _val;           \
  138.         case 1:         *_p++ = _val;           \
  139.                 } while ( --_n );               \
  140.         }                                       \
  141. } while(0)
  142. #endif
  143.  
  144. #endif /* _SDL_memops_h */
  145.