SDL_memops.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_memops.h,v 1.4 2002/04/22 21:38:03 wmay Exp $";
  21. #endif
  22. #ifndef _SDL_memops_h
  23. #define _SDL_memops_h
  24. /* System dependent optimized memory manipulation routines:
  25. */
  26. #include <string.h>
  27. #if defined(__GNUC__) && defined(i386)
  28. /* Thanks to Brennan "Bas" Underwood, for the inspiration. :)
  29.  */
  30. #define SDL_memcpy(dst, src, len)   
  31. do {   
  32. int u0, u1, u2;   
  33. __asm__ __volatile__ (   
  34. "cldnt"   
  35. "rep ; movslnt"   
  36. "testb $2,%b4nt"   
  37. "je 1fnt"   
  38. "movswn"   
  39. "1:ttestb $1,%b4nt"   
  40. "je 2fnt"   
  41. "movsbn"   
  42. "2:"   
  43. : "=&c" (u0), "=&D" (u1), "=&S" (u2)   
  44. : "0" ((unsigned)(len)/4), "q" (len), "1" (dst),"2" (src) 
  45. : "memory" );   
  46. } while(0)
  47. #define SDL_memcpy4(dst, src, len)
  48. do {
  49. int ecx, edi, esi;
  50. __asm__ __volatile__ (
  51. "cldnt"
  52. "rep ; movsl"
  53. : "=&c" (ecx), "=&D" (edi), "=&S" (esi)
  54. : "0" ((unsigned)(len)), "1" (dst), "2" (src)
  55. : "memory" );
  56. } while(0)
  57. #define SDL_revcpy(dst, src, len)
  58. do {
  59. int u0, u1, u2;
  60. char *dstp = (char *)(dst);
  61. char *srcp = (char *)(src);
  62. int n = (len);
  63. if ( n >= 4 ) {
  64. __asm__ __volatile__ (
  65. "stdnt"
  66. "rep ; movslnt"
  67. : "=&c" (u0), "=&D" (u1), "=&S" (u2)
  68. : "0" (n >> 2),
  69.   "1" (dstp+(n-4)), "2" (srcp+(n-4))
  70. : "memory" );
  71. }
  72. switch (n & 3) {
  73. case 3: dstp[2] = srcp[2];
  74. case 2: dstp[1] = srcp[1];
  75. case 1: dstp[0] = srcp[0];
  76. break;
  77. default:
  78. break;
  79. }
  80. } while(0)
  81. #define SDL_memmove(dst, src, len)
  82. do {
  83. if ( (dst) < (src) ) {
  84. SDL_memcpy((dst), (src), (len));
  85. } else {
  86. SDL_revcpy((dst), (src), (len));
  87. }
  88. } while(0)
  89. #define SDL_memset4(dst, val, len)
  90. do {
  91. int u0, u1, u2;
  92. __asm__ __volatile__ (
  93. "cldnt"
  94. "rep ; stoslnt"
  95. : "=&D" (u0), "=&a" (u1), "=&c" (u2)
  96. : "0" (dst), "1" (val), "2" ((Uint32)(len))
  97. : "memory" );
  98. } while(0)
  99. #endif /* GNU C and x86 */
  100. /* If there are no optimized versions, define the normal versions */
  101. #ifndef SDL_memcpy
  102. #define SDL_memcpy(dst, src, len) memcpy(dst, src, len)
  103. #endif
  104. #ifndef SDL_memcpy4
  105. #define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len) << 2)
  106. #endif
  107. #ifndef SDL_revcpy
  108. #define SDL_revcpy(dst, src, len) memmove(dst, src, len)
  109. #endif
  110. #ifndef SDL_memset4
  111. #define SDL_memset4(dst, val, len)
  112. do {
  113. unsigned _count = (len);
  114. unsigned _n = (_count + 3) / 4;
  115. Uint32 *_p = (Uint32 *)(dst);
  116. Uint32 _val = (val);
  117.         switch (_count % 4) {
  118.         case 0: do {    *_p++ = _val;
  119.         case 3:         *_p++ = _val;
  120.         case 2:         *_p++ = _val;
  121.         case 1:         *_p++ = _val;
  122. } while ( --_n );
  123. }
  124. } while(0)
  125. #endif
  126. #endif /* _SDL_memops_h */