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

# 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