00001
00013 #ifndef DKUTIL_CSTD_X86_OPTIMIZED_MEMORY_H
00014 #define DKUTIL_CSTD_X86_OPTIMIZED_MEMORY_H
00015
00016 #include "define.h"
00017 #include "malloc.h"
00018
00019
00020 #if 1==DKUTIL_CSTD_MSVC_IASM
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 DKC_INLINE void optimized_memcpy_12bytes(void *d, const void* s, size_t _size ) {
00059
00060 size_t t = _size / 12;
00061 _asm {
00062 mov edi,d ;
00063 mov esi,s ;
00064 mov ecx,t ;
00065
00066
00067
00068
00069 lx:
00070 mov eax,[esi];
00071 mov ebx,[esi+4];
00072 mov edx,[esi+8];
00073 add esi,12;
00074 mov [edi],eax;
00075 mov [edi+4],ebx;
00076 mov [edi+8],edx;
00077 add edi,12;
00078 dec ecx;
00079 jnz lx;
00080 }
00081 }
00082
00083
00084
00085 DKC_INLINE void optimized_memcpy_mmx_8bytes( void * d, const void* s, size_t _size ) {
00086 _asm {
00087 mov edi,d;
00088 mov esi,s;
00089 mov ecx,_size;
00090 shr ecx,3;
00091 lx:
00092 movq mm0,[esi];
00093 add esi,8;
00094 movq [edi],mm0;
00095 add edi,8;
00096 dec ecx;
00097 jnz lx;
00098 }
00099 }
00100
00101 DKC_INLINE void optimized_memcpy_mmx_16bytes( void * d, const void* s, size_t _size ) {
00102 _asm {
00103 mov edi,d;
00104 mov esi,s;
00105 mov ecx,_size;
00106 shr ecx,4;
00107 lx:
00108 movq mm0,[esi];
00109 movq mm1,[esi+8];
00110 lea esi,[esi+16];
00111 movq [edi],mm0;
00112 movq [edi+8],mm1;
00113 lea edi,[edi+16];
00114 dec ecx;
00115 jnz lx;
00116 }
00117 }
00118
00119 DKC_INLINE void optimized_memcpy_mmx_movntq_8bytes( void * d, const void* s, size_t _size ) {
00120 _asm {
00121 mov edi,d;
00122 mov esi,s;
00123 mov ecx,_size;
00124 shr ecx,3;
00125 lx:
00126 movq mm0,[esi];
00127 lea esi,[esi+8];
00128 movntq [edi],mm0;
00129 lea edi,[edi+8];
00130 dec ecx;
00131 jnz lx;
00132 }
00133 }
00134
00135 DKC_INLINE void optimized_memcpy_mmx_movntq_16bytes( void * d, const void* s, size_t _size ) {
00136 _asm {
00137 mov edi,d;
00138 mov esi,s;
00139 mov ecx,_size;
00140 shr ecx,4;
00141 lx:
00142 movq mm0,[esi];
00143 movq mm1,[esi+8];
00144 lea esi,[esi+16];
00145 movntq [edi],mm0;
00146 movntq [edi+8],mm1;
00147 lea edi,[edi+16];
00148 dec ecx;
00149 jnz lx;
00150 }
00151 }
00152
00153 DKC_INLINE void optimized_memcpy_MMX_movntq_prefetch_16bytes( void * d, const void* s, size_t _size ) {
00154 _asm {
00155 mov edi,d;
00156 mov esi,s;
00157 mov ecx,_size;
00158 shr ecx,4;
00159 lx:
00160 movq mm0,[esi];
00161 movq mm1,[esi+8];
00162 lea esi,[esi+16];
00163 movntq [edi],mm0;
00164 prefetcht0 [esi+768];
00165 movntq [edi+8],mm1;
00166 lea edi,[edi+16];
00167 dec ecx;
00168 jnz lx;
00169 }
00170 }
00171
00172 DKC_INLINE void memcpy_sse_16byte( void * d, const void* s, size_t _size ) {
00173 _asm {
00174 mov edi,d;
00175 mov esi,s;
00176 mov ecx,_size;
00177 shr ecx,4;
00178 lx:
00179 movaps xmm0,[esi];
00180 lea esi,[esi+16];
00181 movaps [edi],xmm0;
00182 lea edi,[edi+16];
00183 dec ecx;
00184 jnz lx;
00185 }
00186 }
00187
00188 DKC_INLINE void memcpy_sse_movntps_16bytes( void * d, const void* s, size_t _size ) {
00189 _asm {
00190 mov edi,d;
00191 mov esi,s;
00192 mov ecx,_size;
00193 shr ecx,4;
00194 lx:
00195 movaps xmm0,[esi];
00196 lea esi,[esi+16];
00197 movntps [edi],xmm0;
00198 lea edi,[edi+16];
00199 dec ecx;
00200 jnz lx;
00201 }
00202 }
00203
00204 DKC_INLINE void optimized_memcpy_sse_movntps_prefetch_32bytes( void * d, const void* s, size_t _size )
00205 {
00206 _asm {
00207 mov edi,d;
00208 mov esi,s;
00209 mov ecx,_size;
00210 shr ecx,5;
00211 lx:
00212 movaps xmm0,[esi];
00213 movaps xmm1,[esi+16];
00214 lea esi,[esi+32];
00215 movntps [edi],xmm0;
00216 prefetcht0 [esi+1024];
00217 movntps [edi+16],xmm1;
00218 lea edi,[edi+32];
00219 dec ecx;
00220 jnz lx;
00221 }
00222 }
00223
00224 DKC_INLINE void optimized_memcpy_fpu_8bytes(
00225 void * d, const void* s, size_t _size )
00226 {
00227 _asm {
00228 mov edi,d;
00229 mov esi,s;
00230 mov ecx,_size;
00231 shr ecx,3;
00232 lx:
00233 fld double ptr [esi];
00234 lea esi,[esi+8];
00235 fstp double ptr [edi];
00236 lea edi,[edi+8];
00237 dec ecx;
00238 jnz lx;
00239 }
00240 }
00241
00242 DKC_INLINE void optimized_memcpy_rep( void * d, const void* s, size_t _size ) {
00243 _asm {
00244 mov edi,d;
00245 mov esi,s;
00246 mov ecx,_size;
00247 shr ecx,2;
00248 rep movsd;
00249 }
00250 }
00251
00252
00253 #endif
00254
00255
00256 #endif //end of include once