inlined asm x86-64 COPY_DWORDS macro

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello everybody,

Here is an inlined asm X86-64 COPY_DWORDS macro I wrote in case
anybody would like to use it. it could be slightly improved by writing
to 16 byte boundaries but its pretty near optimal when writing to
uncached ram.




#ifdef USE_X86_64_ASM
#define COPY_DWORDS( dst, src, nr )                                     \
do {                                            \
uint32_t * _src_ptr;                            \
uint32_t * _dest_ptr;                           \
uint32_t _size;                                 \
                                                \
  _dest_ptr = (uint32_t *)dst;                          \
  _src_ptr = src;                               \
  _size =nr;                                    \
     __asm__ __volatile__ ("testb       $4, %%dil\n"    \
                "je     1f\n"                   \
                "movl   (%%rsi), %%eax\n"       \
                "addq   $4, %%rsi\n"            \
                "movl   %%eax, (%%rdi)\n"       \
                "addq   $4, %%rdi\n"            \
                "decl   %%ecx\n"                \
"1:             movl    %%ecx, %%eax\n"         \
                "shrl   $3, %%ecx\n"            \
                "je     3f\n"                   \
".p2align 4 \n"                                 \
"2:             movq    (%%rsi), %%r8\n"        \
                "movq   8(%%rsi), %%r9\n"       \
                "addq   $32, %%rsi\n"           \
                "movq   %%r8, (%%rdi)\n"        \
                "movq   %%r9, 8(%%rdi)\n"       \
                "addq   $32, %%rdi\n"           \
                "movq   -16(%%rsi), %%r8\n"     \
                "movq   -8(%%rsi), %%r9\n"      \
                "decl   %%ecx\n"                \
                "movq   %%r8, -16(%%rdi)\n"     \
                "movq   %%r9, -8(%%rdi)\n"      \
                "jnz    2b\n"                   \
"3:             testb  $7, %%al\n"              \
                "je     6f\n"                   \
                "testb  $4, %%al\n"             \
                "je     4f\n"                   \
                "movq    (%%rsi), %%r8\n"       \
                "movq    8(%%rsi), %%r9\n"      \
                "addq    $16, %%rsi\n"          \
                "movq   %%r8, (%%rdi)\n"        \
                "movq   %%r9, 8(%%rdi)\n"       \
                "addq    $16, %%rdi\n"          \
"4:     testb   $2, %%al\n"                     \
                "je      5f\n"                  \
                "movq    (%%rsi), %%r8\n"       \
                "addq   $8, %%rsi\n"            \
                "movq  %%r8, (%%rdi)\n"         \
                "addq    $8, %%rdi\n"           \
"5:    testb   $1, %%al\n"                      \
                "je     6f\n"                   \
                "movl   (%%rsi), %%eax\n"       \
                "movl   %%eax, (%%rdi)\n"       \
"6: \n"                                         \
                : "=%c" (_size)                 \
                : "%c" (_size), "S" (_src_ptr), "D" (_dest_ptr)         \
                : "%eax", "%r8", "%r9"                  \
                );                                      \
} while(0)
#endif

-- 

Conn O. Clark

Observation: In formal computer science advances are made
by standing on the shoulders of giants. Linux has proved
that if there are enough of you, you can advance just as
far by stepping on each others toes.


[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux