Provide word-aligned access to memcpy(3) and memset(3)
This commit is contained in:
parent
7de5b52faa
commit
282a7ff1f3
|
@ -10,14 +10,40 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
void *memcpy(void *dst, const void *src, size_t len)
|
void *memcpy(void *const dst, const void *const src, size_t len)
|
||||||
{
|
{
|
||||||
void *dst2 = dst;
|
union
|
||||||
|
{
|
||||||
while(len--)
|
const void *v;
|
||||||
*(((unsigned char*)dst++)) = *(((unsigned char*)src++));
|
const unsigned char *c;
|
||||||
|
const unsigned int *w;
|
||||||
return dst2;
|
} srcl;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
void *v;
|
||||||
|
unsigned char *c;
|
||||||
|
unsigned int *w;
|
||||||
|
} dstl;
|
||||||
|
|
||||||
|
srcl.v = src;
|
||||||
|
dstl.v = dst;
|
||||||
|
|
||||||
|
/* Avoid unaligned access before doing word access. */
|
||||||
|
while (len && (((ptrdiff_t)dstl.v & (sizeof (int) - 1))
|
||||||
|
|| ((ptrdiff_t)srcl.v & (sizeof (int) - 1))))
|
||||||
|
{
|
||||||
|
*dstl.c++ = *srcl.c++;
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; len >= sizeof (int); len -= sizeof (int))
|
||||||
|
*dstl.w++ = *srcl.w++;
|
||||||
|
|
||||||
|
while (len--)
|
||||||
|
*dstl.c++ = *srcl.c++;
|
||||||
|
|
||||||
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *memccpy(void *dst, const void *src, int c, size_t len)
|
void *memccpy(void *dst, const void *src, int c, size_t len)
|
||||||
|
@ -37,11 +63,29 @@ void *memccpy(void *dst, const void *src, int c, size_t len)
|
||||||
|
|
||||||
void *memset(void *dst , int c , size_t len)
|
void *memset(void *dst , int c , size_t len)
|
||||||
{
|
{
|
||||||
unsigned char *dstc = (unsigned char*)dst;
|
union
|
||||||
int x;
|
{
|
||||||
|
void *v;
|
||||||
|
unsigned char *c;
|
||||||
|
unsigned int *w;
|
||||||
|
} dstl;
|
||||||
|
|
||||||
for(x = 0; x < len; x++)
|
const int cw = c | c << 8 | c << 16 | c << 24;
|
||||||
dstc[x] = c;
|
|
||||||
|
dstl.v = dst;
|
||||||
|
|
||||||
|
/* Avoid unaligned access before doing word access. */
|
||||||
|
while (len && ((ptrdiff_t)dstl.v & (sizeof (int) - 1)))
|
||||||
|
{
|
||||||
|
*dstl.c++ = c;
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; len >= sizeof (int); len -= sizeof (int))
|
||||||
|
*dstl.w++ = cw;
|
||||||
|
|
||||||
|
while (len--)
|
||||||
|
*dstl.c++ = c;
|
||||||
|
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue