mirror of
https://github.com/xcat2/xNBA.git
synced 2025-02-16 18:48:12 +00:00
[libc] Simplify memcpy() implementation
The "rep" prefix can be used with an iteration count of zero, which allows the variable-length memcpy() to be implemented without using any conditional jumps. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
parent
80cdf6acc7
commit
6a4ff519c8
@ -43,21 +43,15 @@ void * __memcpy ( void *dest, const void *src, size_t len ) {
|
||||
* moves. Using movsl rather than movsb speeds these up by
|
||||
* around 32%.
|
||||
*/
|
||||
if ( len >> 2 ) {
|
||||
__asm__ __volatile__ ( "rep movsl"
|
||||
: "=&D" ( edi ), "=&S" ( esi ),
|
||||
"=&c" ( discard_ecx )
|
||||
: "0" ( edi ), "1" ( esi ),
|
||||
"2" ( len >> 2 )
|
||||
: "memory" );
|
||||
}
|
||||
if ( len & 0x02 ) {
|
||||
__asm__ __volatile__ ( "movsw" : "=&D" ( edi ), "=&S" ( esi )
|
||||
: "0" ( edi ), "1" ( esi ) : "memory" );
|
||||
}
|
||||
if ( len & 0x01 ) {
|
||||
__asm__ __volatile__ ( "movsb" : "=&D" ( edi ), "=&S" ( esi )
|
||||
: "0" ( edi ), "1" ( esi ) : "memory" );
|
||||
}
|
||||
__asm__ __volatile__ ( "rep movsl"
|
||||
: "=&D" ( edi ), "=&S" ( esi ),
|
||||
"=&c" ( discard_ecx )
|
||||
: "0" ( edi ), "1" ( esi ), "2" ( len >> 2 )
|
||||
: "memory" );
|
||||
__asm__ __volatile__ ( "rep movsb"
|
||||
: "=&D" ( edi ), "=&S" ( esi ),
|
||||
"=&c" ( discard_ecx )
|
||||
: "0" ( edi ), "1" ( esi ), "2" ( len & 3 )
|
||||
: "memory" );
|
||||
return dest;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user