|
|
|
@ -85,3 +85,64 @@ void *memset(void *dstpp, int c, size_t len) |
|
|
|
|
|
|
|
|
|
return dstpp; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define OP_T_THRES 8 |
|
|
|
|
#define OPSIZ (sizeof(op_t)) |
|
|
|
|
|
|
|
|
|
#define BYTE_COPY_FWD(dst_bp, src_bp, nbytes) \ |
|
|
|
|
do { \
|
|
|
|
|
int __d0; \
|
|
|
|
|
asm volatile( \
|
|
|
|
|
/* Clear the direction flag, so copying goes forward. */ \
|
|
|
|
|
"cld\n" \
|
|
|
|
|
/* Copy bytes. */ \
|
|
|
|
|
"rep\n" \
|
|
|
|
|
"movsb" : \
|
|
|
|
|
"=D" (dst_bp), "=S" (src_bp), "=c" (__d0) : \
|
|
|
|
|
"0" (dst_bp), "1" (src_bp), "2" (nbytes) : \
|
|
|
|
|
"memory"); \
|
|
|
|
|
} while (0) |
|
|
|
|
|
|
|
|
|
#define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes) \ |
|
|
|
|
do { \
|
|
|
|
|
int __d0; \
|
|
|
|
|
asm volatile( \
|
|
|
|
|
/* Clear the direction flag, so copying goes forward. */ \
|
|
|
|
|
"cld\n" \
|
|
|
|
|
/* Copy longwords. */ \
|
|
|
|
|
"rep\n" \
|
|
|
|
|
"movsl" : \
|
|
|
|
|
"=D" (dst_bp), "=S" (src_bp), "=c" (__d0) : \
|
|
|
|
|
"0" (dst_bp), "1" (src_bp), "2" ((nbytes) / 4) : \
|
|
|
|
|
"memory"); \
|
|
|
|
|
(nbytes_left) = (nbytes) % 4; \
|
|
|
|
|
} while (0) |
|
|
|
|
|
|
|
|
|
void *memcpy(void *dstpp, const void *srcpp, size_t len) |
|
|
|
|
{ |
|
|
|
|
unsigned long int dstp = (long int)dstpp; |
|
|
|
|
unsigned long int srcp = (long int)srcpp; |
|
|
|
|
|
|
|
|
|
/* Copy from the beginning to the end. */ |
|
|
|
|
|
|
|
|
|
/* If there not too few bytes to copy, use word copy. */ |
|
|
|
|
if (len >= OP_T_THRES) { |
|
|
|
|
/* Copy just a few bytes to make DSTP aligned. */ |
|
|
|
|
len -= (-dstp) % OPSIZ; |
|
|
|
|
BYTE_COPY_FWD(dstp, srcp, (-dstp) % OPSIZ); |
|
|
|
|
|
|
|
|
|
/* Copy from SRCP to DSTP taking advantage of the known
|
|
|
|
|
* alignment of DSTP. Number of bytes remaining is put |
|
|
|
|
* in the third argument, i.e. in LEN. This number may |
|
|
|
|
* vary from machine to machine. |
|
|
|
|
*/ |
|
|
|
|
WORD_COPY_FWD(dstp, srcp, len, len); |
|
|
|
|
|
|
|
|
|
/* Fall out and copy the tail. */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* There are just a few bytes to copy. Use byte memory operations. */ |
|
|
|
|
BYTE_COPY_FWD(dstp, srcp, len); |
|
|
|
|
|
|
|
|
|
return dstpp; |
|
|
|
|
} |
|
|
|
|