Re: Improving string.h memcp()y implementation

From: Denis Vlasenko (vda@port.imtp.ilyichevsk.odessa.ua)
Date: Mon Nov 04 2002 - 11:51:24 EST


On 4 November 2002 14:29, Denis Vlasenko wrote:
> static inline void *
> vda_memcpy3(void * to, const void * from, size_t n)
> {
> int d0, d1, d2;
> __asm__ __volatile__(
> " rep; movsl\n"
> " movl %4, %%ecx\n"
> " rep; movsb\n"
>
> : "=&c" (d0), "=&D" (d1), "=&S" (d2)
> : "0" (n/4), "g" (n&3), "1" ((long) to), "2" ((long)
> : from) "memory"
>
> );
> return (to);
> }
......
> void f5() { vda_memcpy3(to,from,sz); }
......
> Disassembly of section ff5:
>
> 00000000 <f5>:
> 0: 8b 0d 00 00 00 00 mov 0x0,%ecx
> 6: 57 push %edi
> 7: 89 c8 mov %ecx,%eax
> 9: 56 push %esi
> a: 8b 3d 00 00 00 00 mov 0x0,%edi
> 10: 8b 35 00 00 00 00 mov 0x0,%esi
> 16: 83 e0 03 and $0x3,%eax
> 19: c1 e9 02 shr $0x2,%ecx
> 1c: f3 a5 repz movsl %ds:(%esi),%es:(%edi)
> 1e: 89 c1 mov %eax,%ecx
> 20: f3 a4 repz movsb %ds:(%esi),%es:(%edi)
> 22: 5e pop %esi
> 23: 5f pop %edi
> 24: c3 ret
>
> I think I shall not look there for a while ;)
> Please somebody stop me... ;) ;)

...before it will be too late:

static inline void *
vda_memcpy3(void * to, const void * from, size_t n)
{
        int d0, d1, d2;
        __asm__ __volatile__(
        " andb $3, %b4\n" // we can save here a byte if %4 == eax
        " rep; movsl\n"
        " movb %b4, %%cl\n"
        " rep; movsb\n"
                : "=&c" (d0), "=&D" (d1), "=&S" (d2)
                : "0" (n/4), "g" (n), "1" ((long) to), "2" ((long) from)
                : "memory"
        );
        return (to);
}

Disassembly of section ff5:

00000000 <f5>:
   0: a1 00 00 00 00 mov 0x0,%eax
   5: 57 push %edi
   6: 89 c1 mov %eax,%ecx
   8: 56 push %esi
   9: 8b 3d 00 00 00 00 mov 0x0,%edi
   f: 8b 35 00 00 00 00 mov 0x0,%esi
  15: c1 e9 02 shr $0x2,%ecx
  18: 24 03 and $0x3,%al
  1a: f3 a5 repz movsl %ds:(%esi),%es:(%edi)
  1c: 88 c1 mov %al,%cl
  1e: f3 a4 repz movsb %ds:(%esi),%es:(%edi)
  20: 5e pop %esi
  21: 5f pop %edi
  22: c3 ret

;)))

--
vda
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Nov 07 2002 - 22:00:32 EST