- 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:
Alex Ionescu 2006-09-26 05:29:46 +00:00
parent 7a0843f8af
commit 54403619f8
3 changed files with 67 additions and 24 deletions

View file

@ -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
);
}

View file

@ -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:

View file

@ -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">