X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Futil.h;h=c95bcf53bf0ff838087fb0e13dd0a49f613f14b8;hb=d54a3962dcb42f9921be75cf3754525ecef2bab6;hp=6d869ebec22169441afcde79fb10f102e8220e47;hpb=cfe889ac035848dbe4c3a89afb7c8c37a574163e;p=eradicate diff --git a/src/util.h b/src/util.h index 6d869eb..c95bcf5 100644 --- a/src/util.h +++ b/src/util.h @@ -30,6 +30,23 @@ static INLINE int32_t cround64(double val) extern uint32_t perf_start_count, perf_interval_count; #ifdef __WATCOMC__ +#ifdef USE_MMX +void memcpy64(void *dest, void *src, int count); +#pragma aux memcpy64 = \ + "cploop:" \ + "movq mm0, [edx]" \ + "movq [ebx], mm0" \ + "add edx, 8" \ + "add ebx, 8" \ + "dec ecx" \ + "jnz cploop" \ + "emms" \ + parm[ebx][edx][ecx] \ + modify[8087]; +#else +#define memcpy64(dest, src, count) memcpy(dest, src, (count) << 3) +#endif + void perf_start(void); #pragma aux perf_start = \ "xor eax, eax" \ @@ -52,6 +69,22 @@ void debug_break(void); #endif #ifdef __GNUC__ +#ifdef USE_MMX +#define memcpy64(dest, src, count) asm volatile ( \ + "0:\n\t" \ + "movq (%1), %%mm0\n\t" \ + "movq %%mm0, (%0)\n\t" \ + "add $8, %1\n\t" \ + "add $8, %0\n\t" \ + "dec %2\n\t" \ + "jnz 0b\n\t" \ + "emms\n\t" \ + :: "r"(dest), "r"(src), "r"(count) \ + : "%mm0") +#else +#define memcpy64(dest, src, count) memcpy(dest, src, (count) << 3) +#endif + #define perf_start() asm volatile ( \ "xor %%eax, %%eax\n" \ "cpuid\n" \