|
|
Message-ID: <20130811062009.GX221@brightrain.aerifal.cx>
Date: Sun, 11 Aug 2013 02:20:10 -0400
From: Rich Felker <dalias@...ifal.cx>
To: musl@...ts.openwall.com
Subject: Re: Optimized C memcpy [updated]
On Sun, Aug 11, 2013 at 01:11:35AM -0400, Rich Felker wrote:
> struct block32 { uint32_t data[8]; };
> struct block64 { uint64_t data[8]; };
>
> void *memcpy(void *restrict dest, const void *restrict src, size_t n)
> {
> unsigned char *d = dest;
> const unsigned char *s = src;
> uint32_t w, x;
>
> for (; (uintptr_t)s % 8 && n; n--) *d++ = *s++;
> if (!n) return dest;
>
> if (n>=4) switch ((uintptr_t)d % 4) {
> case 0:
> if (!((uintptr_t)d%8)) for (; n>=64; s+=64, d+=64, n-=64)
> *(struct block64 *)d = *(struct block64 *)s;
Unfortunately this case seems to be compiling to a call to memcpy on
powerpc (but nowhere else I found). So I may need to drop the special
case for 64-bit alignment. I wish there was some source for knowledge
of the cases that can trigger gcc's stupidity, though...
Rich
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.