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

@@ -27,20 +27,27 @@
#
#------------------------------------------------------------------------------
.686:
.code:
.global _InternalMemCompareMem
#------------------------------------------------------------------------------
# INTN
# EFIAPI
# InternalMemCompareMem (
# IN CONST VOID *DestinationBuffer,
# IN CONST VOID *SourceBuffer,
# IN UINTN Length
# );
#------------------------------------------------------------------------------
_InternalMemCompareMem:
push %esi
push %edi
movl 12(%esp),%esi
movl 16(%esp),%edi
movl 20(%esp),%ecx
movl 12(%esp), %esi
movl 16(%esp), %edi
movl 20(%esp), %ecx
repe cmpsb
movzbl -1(%esi), %eax
movzbl -1(%edi), %edx
subl %edx,%eax
subl %edx, %eax
pop %edi
pop %esi
ret

View File

@@ -31,6 +31,15 @@
.model flat,C
.code
;------------------------------------------------------------------------------
; INTN
; EFIAPI
; InternalMemCompareMem (
; IN CONST VOID *DestinationBuffer,
; IN CONST VOID *SourceBuffer,
; IN UINTN Length
; );
;------------------------------------------------------------------------------
InternalMemCompareMem PROC USES esi edi
mov esi, [esp + 12]
mov edi, [esp + 16]

View File

@@ -21,38 +21,45 @@
#
#------------------------------------------------------------------------------
.386:
.code:
.global _InternalMemCopyMem
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemCopyMem (
# IN VOID *Destination,
# IN VOID *Source,
# IN UINTN Count
# );
#------------------------------------------------------------------------------
_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
cmpl %edi,%esi
movl 16(%esp), %esi # esi <- Source
movl 12(%esp), %edi # edi <- Destination
movl 20(%esp), %edx # edx <- Count
leal -1(%esi, %edx), %eax # eax <- End of Source
cmpl %edi, %esi
jae L0
cmpl %esi,%eax
cmpl %edi, %eax
jae @CopyBackward # Copy backward if overlapped
L0:
movl %edx,%ecx
andl $3,%edx
shrl $2,%ecx
L0:
movl %edx, %ecx
andl $3, %edx
shrl $2, %ecx
rep
movsl # Copy as many Dwords as possible
jmp @CopyBytes
@CopyBackward:
movl %eax,%edi # edi <- End of Destination
leal -1(%esi,%edx),%esi # esi <- End of Source
@CopyBackward:
movl %eax, %esi # esi <- End of Source
leal -1(%edi, %edx), %edi # edi <- End of Destination
std
@CopyBytes:
movl %edx,%ecx
@CopyBytes:
movl %edx, %ecx
rep
movsb # Copy bytes backward
cld
movl 12(%esp),%eax # eax <- Destination as return value
movl 12(%esp), %eax # eax <- Destination as return value
pop %edi
pop %esi
ret

View File

@@ -25,14 +25,22 @@
.model flat,C
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemCopyMem (
; IN VOID *Destination,
; IN VOID *Source,
; IN UINTN Count
; )
;------------------------------------------------------------------------------
InternalMemCopyMem PROC USES esi edi
mov esi, [esp + 16] ; esi <- Source
mov edi, [esp + 12] ; edi <- Destination
mov edx, [esp + 20] ; edx <- Count
lea eax, [edi + edx - 1] ; eax <- End of Destination
lea eax, [esi + edx - 1] ; eax <- End of Source
cmp esi, edi
jae @F
cmp eax, esi
cmp eax, edi
jae @CopyBackward ; Copy backward if overlapped
@@:
mov ecx, edx
@@ -41,8 +49,8 @@ InternalMemCopyMem PROC USES esi edi
rep movsd ; Copy as many Dwords as possible
jmp @CopyBytes
@CopyBackward:
mov edi, eax ; edi <- End of Destination
lea esi, [esi + edx - 1] ; esi <- End of Source
mov esi, eax ; esi <- End of Source
lea edi, [edi + edx - 1] ; edi <- End of Destination
std
@CopyBytes:
mov ecx, edx

View File

@@ -27,17 +27,24 @@
#
#------------------------------------------------------------------------------
.686:
.code:
.global _InternalMemScanMem16
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem16 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT16 Value
# );
#------------------------------------------------------------------------------
_InternalMemScanMem16:
push %edi
movl 12(%esp),%ecx
movl 8(%esp),%edi
movl 16(%esp),%eax
movl 12(%esp), %ecx
movl 8(%esp), %edi
movl 16(%esp), %eax
repne scasw
leal -2(%edi),%eax
leal -2(%edi), %eax
cmovnz %ecx, %eax
pop %edi
ret

View File

@@ -31,6 +31,15 @@
.model flat,C
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem16 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT16 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem16 PROC USES edi
mov ecx, [esp + 12]
mov edi, [esp + 8]

View File

@@ -27,17 +27,24 @@
#
#------------------------------------------------------------------------------
.686:
.code:
.global _InternalMemScanMem32
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem32 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT32 Value
# );
#------------------------------------------------------------------------------
_InternalMemScanMem32:
push %edi
movl 12(%esp),%ecx
movl 8(%esp),%edi
movl 16(%esp),%eax
movl 12(%esp), %ecx
movl 8(%esp), %edi
movl 16(%esp), %eax
repne scasl
leal -4(%edi),%eax
leal -4(%edi), %eax
cmovnz %ecx, %eax
pop %edi
ret

View File

@@ -31,6 +31,15 @@
.model flat,C
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem32 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT32 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem32 PROC USES edi
mov ecx, [esp + 12]
mov edi, [esp + 8]

View File

@@ -27,27 +27,33 @@
#
#------------------------------------------------------------------------------
.686:
.code:
.global _InternalMemScanMem64
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem64 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT64 Value
# );
#------------------------------------------------------------------------------
_InternalMemScanMem64:
push %edi
movl 12(%esp),%ecx
movl 16(%esp),%eax
movl 20(%esp),%edx
movl 8(%esp),%edi
movl 12(%esp), %ecx
movl 16(%esp), %eax
movl 20(%esp), %edx
movl 8(%esp), %edi
L0:
cmpl (%edi),%eax
leal 8(%edi),%edi
cmpl (%edi), %eax
leal 8(%edi), %edi
loopne L0
jne L1
cmpl -4(%edi),%edx
cmpl -4(%edi), %edx
jecxz L1
jne L0
L1:
leal -8(%edi),%eax
leal -8(%edi), %eax
cmovne %ecx, %eax
pop %edi
ret

View File

@@ -31,6 +31,15 @@
.model flat,C
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem64 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT64 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem64 PROC USES edi
mov ecx, [esp + 12]
mov eax, [esp + 16]

View File

@@ -27,17 +27,24 @@
#
#------------------------------------------------------------------------------
.686:
.code:
.global _InternalMemScanMem8
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem8 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT8 Value
# );
#------------------------------------------------------------------------------
_InternalMemScanMem8:
push %edi
movl 12(%esp),%ecx
movl 8(%esp),%edi
movb 16(%esp),%al
movl 12(%esp), %ecx
movl 8(%esp), %edi
movb 16(%esp), %al
repne scasb
leal -1(%edi),%eax
leal -1(%edi), %eax
cmovnz %ecx, %eax
pop %edi
ret

View File

@@ -31,6 +31,15 @@
.model flat,C
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem8 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT8 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem8 PROC USES edi
mov ecx, [esp + 12]
mov edi, [esp + 8]

View File

@@ -21,10 +21,19 @@
#
#------------------------------------------------------------------------------
.386:
.code:
.386:
.code:
.global _InternalMemSetMem
#------------------------------------------------------------------------------
# VOID *
# InternalMemSetMem (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT8 Value
# )
#------------------------------------------------------------------------------
_InternalMemSetMem:
push %edi
movl 16(%esp),%eax

View File

@@ -25,6 +25,14 @@
.model flat,C
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemSetMem (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT8 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem PROC USES edi
mov eax, [esp + 16]
mov edi, [esp + 8]

View File

@@ -21,17 +21,23 @@
#
#------------------------------------------------------------------------------
.386:
.code:
.global _InternalMemSetMem16
#------------------------------------------------------------------------------
# VOID *
# InternalMemSetMem16 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT16 Value
# )
#------------------------------------------------------------------------------
_InternalMemSetMem16:
push %edi
movl 16(%esp),%eax
movl 8(%esp),%edi
movl 12(%esp),%ecx
movl 16(%esp), %eax
movl 8(%esp), %edi
movl 12(%esp), %ecx
rep
stosw
movl 8(%esp),%eax
movl 8(%esp), %eax
pop %edi
ret

View File

@@ -25,6 +25,14 @@
.model flat,C
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemSetMem16 (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT16 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem16 PROC USES edi
mov eax, [esp + 16]
mov edi, [esp + 8]

View File

@@ -21,10 +21,16 @@
#
#------------------------------------------------------------------------------
.386:
.code:
.global _InternalMemSetMem32
#------------------------------------------------------------------------------
# VOID *
# InternalMemSetMem32 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT32 Value
# )
#------------------------------------------------------------------------------
_InternalMemSetMem32:
push %edi
movl 16(%esp),%eax

View File

@@ -25,6 +25,14 @@
.model flat,C
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemSetMem32 (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT32 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem32 PROC USES edi
mov eax, [esp + 16]
mov edi, [esp + 8]

View File

@@ -21,20 +21,25 @@
#
#------------------------------------------------------------------------------
.386:
#.MODEL flat,C
.code:
.global _InternalMemSetMem64
#------------------------------------------------------------------------------
# VOID *
# InternalMemSetMem64 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT64 Value
# )
#------------------------------------------------------------------------------
_InternalMemSetMem64:
push %edi
movl 12(%esp), %ecx
movl 16(%esp), %eax
movl 20(%esp), %edx
movl 8(%esp), %edi
L0:
mov %eax,-8(%edi,%ecx,8)
mov %edx,-4(%edi,%ecx,8)
L0:
mov %eax, -8(%edi, %ecx, 8)
mov %edx, -4(%edi, %ecx, 8)
loop L0
movl %edi, %eax
pop %edi

View File

@@ -25,6 +25,14 @@
.model flat,C
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemSetMem64 (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT64 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem64 PROC USES edi
mov ecx, [esp + 12]
mov eax, [esp + 16]

View File

@@ -21,10 +21,15 @@
#
#------------------------------------------------------------------------------
.386:
.code:
.global _InternalMemZeroMem
#------------------------------------------------------------------------------
# VOID *
# InternalMemZeroMem (
# IN VOID *Buffer,
# IN UINTN Count
# );
#------------------------------------------------------------------------------
_InternalMemZeroMem:
push %edi
xorl %eax,%eax

View File

@@ -25,6 +25,13 @@
.model flat,C
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemZeroMem (
; IN VOID *Buffer,
; IN UINTN Count
; );
;------------------------------------------------------------------------------
InternalMemZeroMem PROC USES edi
xor eax, eax
mov edi, [esp + 8]

View File

@@ -30,7 +30,7 @@
This function fills Length bytes of Buffer with zeros, and returns Buffer.
If Length > 0 and Buffer is NULL, then ASSERT().
If Length is greater than (MAX_ADDRESS <20> Buffer + 1), then ASSERT().
If Length is greater than (MAX_ADDRESS <20> Buffer + 1), then ASSERT().
@param Buffer Pointer to the target buffer to fill with zeros.
@param Length Number of bytes in Buffer to fill with zeros.
@@ -47,5 +47,5 @@ ZeroMem (
{
ASSERT (!(Buffer == NULL && Length > 0));
ASSERT (Length <= (MAX_ADDRESS - (UINTN)Buffer + 1));
return InternalMemSetMem (Buffer, Length, 0);
return InternalMemZeroMem (Buffer, Length);
}

View File

@@ -29,6 +29,15 @@
.code
;------------------------------------------------------------------------------
; INTN
; EFIAPI
; InternalMemCompareMem (
; IN CONST VOID *DestinationBuffer,
; IN CONST VOID *SourceBuffer,
; IN UINTN Length
; );
;------------------------------------------------------------------------------
InternalMemCompareMem PROC USES rsi rdi
mov rsi, rcx
mov rdi, rdx

View File

@@ -23,10 +23,19 @@
.code
;------------------------------------------------------------------------------
; VOID *
; EFIAPI
; InternalMemCopyMem (
; IN VOID *Destination,
; IN VOID *Source,
; IN UINTN Count
; )
;------------------------------------------------------------------------------
InternalMemCopyMem PROC USES rsi rdi
mov rsi, rdx ; rsi <- Source
mov rdi, rcx ; rdi <- Destination
lea r9, [rdi + r8 - 1] ; r9 <- End of Destination
lea r9, [rsi + r8 - 1] ; r9 <- End of Source
cmp rsi, rdi
mov rax, rdi ; rax <- Destination as return value
jae @F
@@ -39,8 +48,8 @@ InternalMemCopyMem PROC USES rsi rdi
rep movsq ; Copy as many Qwords as possible
jmp @CopyBytes
@CopyBackward:
mov rdi, r9 ; rdi <- End of Destination
lea rsi, [rsi + r8 - 1] ; esi <- End of Source
mov rsi, r9 ; rsi <- End of Source
lea rdi, [rdi + r8 - 1] ; esi <- End of Destination
std ; set direction flag
@CopyBytes:
mov rcx, r8

View File

@@ -29,6 +29,15 @@
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem16 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT16 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem16 PROC USES rdi
mov rdi, rcx
mov rax, r8

View File

@@ -29,6 +29,15 @@
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem32 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT32 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem32 PROC USES rdi
mov rdi, rcx
mov rax, r8

View File

@@ -29,6 +29,15 @@
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem64 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT64 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem64 PROC USES rdi
mov rdi, rcx
mov rax, r8

View File

@@ -29,6 +29,15 @@
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem8 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT8 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem8 PROC USES rdi
mov rdi, rcx
mov rcx, rdx

View File

@@ -23,6 +23,15 @@
.code
;------------------------------------------------------------------------------
; VOID *
; EFIAPI
; InternalMemSetMem (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT8 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem PROC USES rdi
mov rax, r8
mov rdi, rcx

View File

@@ -23,6 +23,15 @@
.code
;------------------------------------------------------------------------------
; VOID *
; EFIAPI
; InternalMemSetMem16 (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT16 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem16 PROC USES rdi
mov rdi, rcx
mov rax, r8

View File

@@ -23,6 +23,15 @@
.code
;------------------------------------------------------------------------------
; VOID *
; EFIAPI
; InternalMemSetMem32 (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT32 Value
; );
;------------------------------------------------------------------------------
InternalMemSetMem32 PROC USES rdi
mov rdi, rcx
mov rax, r8

View File

@@ -23,6 +23,14 @@
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemSetMem64 (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT64 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem64 PROC USES rdi
mov rdi, rcx
mov rax, r8

View File

@@ -23,6 +23,13 @@
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemZeroMem (
; IN VOID *Buffer,
; IN UINTN Count
; );
;------------------------------------------------------------------------------
InternalMemZeroMem PROC USES rdi
push rcx
xor rax, rax