mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 07:56:59 +00:00
- In some far, far away galaxy, a long, long time ago, Greatlord will learn to fix 1-line bugs and/or talk to the developers responsible instead of reverting their code...until then....
svn path=/trunk/; revision=24276
This commit is contained in:
parent
7a0843f8af
commit
54403619f8
3 changed files with 67 additions and 24 deletions
|
@ -1,23 +0,0 @@
|
|||
#include <rtl.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
#undef RtlMoveMemory
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
NTAPI
|
||||
RtlMoveMemory (
|
||||
PVOID Destination,
|
||||
CONST VOID * Source,
|
||||
ULONG Length
|
||||
)
|
||||
{
|
||||
memmove (
|
||||
Destination,
|
||||
Source,
|
||||
Length
|
||||
);
|
||||
}
|
|
@ -214,6 +214,73 @@ ByteZero:
|
|||
ret 8
|
||||
.endfunc
|
||||
|
||||
.func RtlMoveMemory@12
|
||||
_RtlMoveMemory@12:
|
||||
|
||||
/* Save volatiles */
|
||||
push esi
|
||||
push edi
|
||||
|
||||
/* Get pointers and size */
|
||||
mov esi, [esp+16]
|
||||
mov edi, [esp+12]
|
||||
mov ecx, [esp+20]
|
||||
cld
|
||||
|
||||
/* Check if the destination is higher (or equal) */
|
||||
cmp esi, edi
|
||||
jbe Overlap
|
||||
|
||||
/* Set ULONG size and UCHAR remainder */
|
||||
DoMove:
|
||||
mov edx, ecx
|
||||
and edx, 3
|
||||
shr ecx, 2
|
||||
|
||||
/* Do the move */
|
||||
rep movsd
|
||||
or ecx, edx
|
||||
jnz ByteMove
|
||||
|
||||
/* Return */
|
||||
pop edi
|
||||
pop esi
|
||||
ret 12
|
||||
|
||||
ByteMove:
|
||||
/* Move what's left */
|
||||
rep movsb
|
||||
|
||||
DoneMove:
|
||||
/* Restore volatiles */
|
||||
pop edi
|
||||
pop esi
|
||||
ret 12
|
||||
|
||||
Overlap:
|
||||
/* Don't copy if they're equal */
|
||||
jz DoneMove
|
||||
|
||||
/* Compare pointer distance with given length and check for overlap */
|
||||
mov eax, edi
|
||||
sub eax, esi
|
||||
cmp ecx, eax
|
||||
jbe DoMove
|
||||
|
||||
/* Set direction flag for backward move */
|
||||
std
|
||||
|
||||
/* Copy byte-by-byte the non-overlapping distance */
|
||||
add esi, ecx
|
||||
add edi, ecx
|
||||
dec esi
|
||||
dec edi
|
||||
|
||||
/* Do the move, reset flag and return */
|
||||
rep movsb
|
||||
cld
|
||||
jmp DoneMove
|
||||
.endfunc
|
||||
|
||||
.func @RtlPrefetchMemoryNonTemporal@8, @RtlPrefetchMemoryNonTemporal@8
|
||||
@RtlPrefetchMemoryNonTemporal@8:
|
||||
|
|
|
@ -39,7 +39,6 @@
|
|||
<file>sqrt_asm.s</file>
|
||||
<file>tan_asm.s</file>
|
||||
</directory>
|
||||
<file>RtlMoveMemory.c</file>
|
||||
</if>
|
||||
|
||||
<ifnot property="ARCH" value="i386">
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue