メインページ | アルファベット順一覧 | データ構造 | ファイル一覧 | データフィールド | グローバル | 関連ページ

x86_optimized_memcpy.h

説明を見る。
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 void mem2( void * d, const void* s, size_t _size ) {
00024     _asm {
00025         mov edi,d;
00026         mov esi,s;
00027         mov ecx,_size;
00028         shr ecx,2;
00029 lx:
00030         mov eax,[esi];
00031         add esi,4;
00032         mov [edi],eax;
00033         add edi,4;
00034         dec ecx;
00035         jnz lx;
00036     }
00037 }
00038 
00039 void mem3( void * d, const void* s, size_t _size ) {
00040     _asm {
00041         mov edi,d;
00042         mov esi,s;
00043         mov ecx,_size;
00044         shr ecx,3;
00045 lx:
00046         mov eax,[esi];
00047         mov eax,[esi+4];
00048         add esi,8;
00049         mov [edi],eax;
00050         mov [edi+4],eax;
00051         add edi,8;
00052         dec ecx;
00053         jnz lx;
00054     }
00055 }
00056 */
00057 
00058 DKC_INLINE void optimized_memcpy_12bytes(void *d, const void* s, size_t _size ) {
00059   //if(0==_size) return d;
00060   size_t t = _size / 12;
00061     _asm {
00062     mov edi,d           ;
00063     mov esi,s           ;
00064         mov ecx,t           ;
00065     //mov eax,_size ;
00066         //mov ecx,0Ch       ;12
00067     //div ecx;
00068         //mov ecx,eax;
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

dkutil_cstdに対してSat Sep 10 09:19:18 2005に生成されました。  doxygen 1.4.4