mirror of
https://github.com/Stichting-MINIX-Research-Foundation/u-boot.git
synced 2025-09-10 12:39:22 -04:00
x86: Import glibc memcpy implementation
Taken from glibc version 2.14.90 -- Changes for v2: - None
This commit is contained in:
parent
bfcc40bb09
commit
b2c2a03842
@ -14,7 +14,7 @@ extern char * strrchr(const char * s, int c);
|
|||||||
#undef __HAVE_ARCH_STRCHR
|
#undef __HAVE_ARCH_STRCHR
|
||||||
extern char * strchr(const char * s, int c);
|
extern char * strchr(const char * s, int c);
|
||||||
|
|
||||||
#undef __HAVE_ARCH_MEMCPY
|
#define __HAVE_ARCH_MEMCPY
|
||||||
extern void * memcpy(void *, const void *, __kernel_size_t);
|
extern void * memcpy(void *, const void *, __kernel_size_t);
|
||||||
|
|
||||||
#undef __HAVE_ARCH_MEMMOVE
|
#undef __HAVE_ARCH_MEMMOVE
|
||||||
|
@ -85,3 +85,64 @@ void *memset(void *dstpp, int c, size_t len)
|
|||||||
|
|
||||||
return dstpp;
|
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;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user