1. Updated function headers for all assembly function

2. Optimized register usage in SetMemXX functions in all lib instances
3. Fixed a logical error in CopyMem for all lib instances


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1139 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
bxing
2006-07-28 07:28:19 +00:00
parent 27169a56e6
commit eb227e96bd
106 changed files with 1006 additions and 457 deletions

View File

@ -21,32 +21,29 @@
#
#------------------------------------------------------------------------------
.686:
#.MODEL flat,C
.xmm:
.code:
.global _InternalMemCopyMem
#------------------------------------------------------------------------------
# VOID *
# _mem_CopyMem (
# EFIAPI
# InternalMemCopyMem (
# IN VOID *Destination,
# IN VOID *Source,
# IN UINTN Count
# )
# );
#------------------------------------------------------------------------------
.global _InternalMemCopyMem
_InternalMemCopyMem:
push %esi
push %edi
movl 16(%esp), %esi # esi <- Source
movl 12(%esp), %edi # edi <- Destination
movl 20(%esp), %edx # edx <- Count
leal -1(%edi,%edx,), %eax # eax <- End of Destination
leal -1(%esi,%edx,), %eax # eax <- End of Source
cmpl %edi, %esi
jae L0
cmpl %esi, %eax # Overlapped?
cmpl %edi, %eax # Overlapped?
jae @CopyBackward # Copy backward if overlapped
L0:
L0:
xorl %ecx, %ecx
subl %esi, %ecx
andl $7, %ecx # ecx + esi aligns on 8-byte boundary
@ -56,7 +53,7 @@ L0:
subl %ecx, %edx # edx <- remaining bytes to copy
rep
movsb
L1:
L1:
movl %edx, %ecx
andl $7, %edx
shrl $3, %ecx # ecx <- # of Qwords to copy
@ -64,22 +61,21 @@ L1:
pushl %eax
pushl %eax
movq %mm0, (%esp) # save mm0
L2:
L2:
movq (%esi), %mm0
movntq %mm0, (%edi)
movq %mm0, (%edi)
addl $8, %esi
addl $8, %edi
loop L2
mfence
movq (%esp), %mm0 # restore mm0
popl %ecx # stack cleanup
popl %ecx # stack cleanup
jmp @CopyBytes
@CopyBackward:
movl %eax, %edi # edi <- Last byte in Destination
leal -1(%esi,%edx,), %esi # esi <- Last byte in Source
@CopyBackward:
movl %eax, %esi # esi <- Last byte in Source
leal -1(%edi,%edx,), %edi # edi <- Last byte in Destination
std
@CopyBytes:
@CopyBytes:
movl %edx, %ecx
rep
movsb