\r
This function fills Length bytes of Buffer with zeros, and returns Buffer.\r
If Length > 0 and Buffer is NULL, then ASSERT().\r
- If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT(). \r
+ If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT().\r
\r
@param Buffer Pointer to the target buffer to fill with zeros.\r
@param Length Number of bytes in Buffer to fill with zeros.\r
{\r
ASSERT (!(Buffer == NULL && Length > 0));\r
ASSERT (Length <= (MAX_ADDRESS - (UINTN)Buffer + 1));\r
- return InternalMemSetMem (Buffer, Length, 0);\r
+ return InternalMemZeroMem (Buffer, Length);\r
}\r
<Filename SupArchList="X64">X64/ScanMem16.asm</Filename>\r
<Filename SupArchList="X64">X64/ScanMem32.asm</Filename>\r
<Filename SupArchList="X64">X64/ScanMem64.asm</Filename>\r
+ <Filename SupArchList="X64">X64/ZeroMem.asm</Filename>\r
</SourceFiles>\r
<PackageDependencies>\r
<Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .code:
-
.global _InternalMemCompareMem
+
+#------------------------------------------------------------------------------
+# INTN
+# EFIAPI
+# InternalMemCompareMem (
+# IN CONST VOID *DestinationBuffer,
+# IN CONST VOID *SourceBuffer,
+# IN UINTN Length
+# );
+#------------------------------------------------------------------------------
_InternalMemCompareMem:
push %esi
push %edi
pop %edi
pop %esi
ret
-
-
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; INTN\r
+; EFIAPI\r
+; InternalMemCompareMem (\r
+; IN CONST VOID *DestinationBuffer,\r
+; IN CONST VOID *SourceBuffer,\r
+; IN UINTN Length\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemCompareMem PROC USES esi edi\r
mov esi, [esp + 12]\r
mov edi, [esp + 16]\r
#
#------------------------------------------------------------------------------
- .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
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
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
\r
.686\r
.model flat,C\r
- .xmm\r
+ .mmx\r
.code\r
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_CopyMem (\r
+; EFIAPI\r
+; InternalMemCopyMem (\r
; IN VOID *Destination,\r
; IN VOID *Source,\r
; IN UINTN Count\r
-; )\r
+; );\r
;------------------------------------------------------------------------------\r
InternalMemCopyMem PROC USES esi edi\r
mov esi, [esp + 16] ; esi <- Source\r
mov edi, [esp + 12] ; edi <- Destination\r
mov edx, [esp + 20] ; edx <- Count\r
- lea eax, [edi + edx - 1] ; eax <- End of Destination\r
+ lea eax, [esi + edx - 1] ; eax <- End of Source\r
cmp esi, edi\r
jae @F\r
- cmp eax, esi ; Overlapped?\r
+ cmp eax, edi ; Overlapped?\r
jae @CopyBackward ; Copy backward if overlapped\r
-@@:\r
- xor ecx, ecx\r
- sub ecx, esi\r
- and ecx, 7 ; ecx + esi aligns on 8-byte boundary\r
- jz @F\r
- cmp ecx, edx\r
- cmova ecx, edx\r
- sub edx, ecx ; edx <- remaining bytes to copy\r
- rep movsb\r
@@:\r
mov ecx, edx\r
and edx, 7\r
movq [esp], mm0 ; save mm0\r
@@:\r
movq mm0, [esi]\r
- movntq [edi], mm0\r
+ movq [edi], mm0\r
add esi, 8\r
add edi, 8\r
loop @B\r
- mfence\r
movq mm0, [esp] ; restore mm0\r
pop ecx ; stack cleanup\r
pop ecx ; stack cleanup\r
jmp @CopyBytes\r
@CopyBackward:\r
- mov edi, eax ; edi <- Last byte in Destination\r
- lea esi, [esi + edx - 1] ; esi <- Last byte in Source\r
+ mov esi, eax ; esi <- Last byte in Source\r
+ lea edi, [edi + edx - 1] ; edi <- Last byte in Destination\r
std\r
@CopyBytes:\r
mov ecx, edx\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .code:
-
.global _InternalMemScanMem16
+
+#------------------------------------------------------------------------------
+# CONST VOID *
+# EFIAPI
+# InternalMemScanMem16 (
+# IN CONST VOID *Buffer,
+# IN UINTN Length,
+# IN UINT16 Value
+# );
+#------------------------------------------------------------------------------
_InternalMemScanMem16:
push %edi
movl 12(%esp), %ecx
cmovnz %ecx, %eax
pop %edi
ret
-
-
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem16 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT16 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem16 PROC USES edi\r
mov ecx, [esp + 12]\r
mov edi, [esp + 8]\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .code:
-
.global _InternalMemScanMem32
+
+#------------------------------------------------------------------------------
+# CONST VOID *
+# EFIAPI
+# InternalMemScanMem32 (
+# IN CONST VOID *Buffer,
+# IN UINTN Length,
+# IN UINT32 Value
+# );
+#------------------------------------------------------------------------------
_InternalMemScanMem32:
push %edi
movl 12(%esp), %ecx
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem32 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT32 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem32 PROC USES edi\r
mov ecx, [esp + 12]\r
mov edi, [esp + 8]\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .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
-L0:
+L0:
cmpl (%edi), %eax
leal 8(%edi), %edi
loopne L0
cmpl -4(%edi), %edx
jecxz L1
jne L0
-L1:
+L1:
leal -8(%edi), %eax
cmovne %ecx, %eax
pop %edi
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem64 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT64 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem64 PROC USES edi\r
mov ecx, [esp + 12]\r
mov eax, [esp + 16]\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .code:
-
.global _InternalMemScanMem8
+
+#------------------------------------------------------------------------------
+# CONST VOID *
+# EFIAPI
+# InternalMemScanMem8 (
+# IN CONST VOID *Buffer,
+# IN UINTN Length,
+# IN UINT8 Value
+# );
+#------------------------------------------------------------------------------
_InternalMemScanMem8:
push %edi
movl 12(%esp), %ecx
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem8 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT8 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem8 PROC USES edi\r
mov ecx, [esp + 12]\r
mov edi, [esp + 8]\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .xmm:
- .code:
+.global _InternalMemSetMem
#------------------------------------------------------------------------------
# VOID *
-# _mem_SetMem (
+# InternalMemSetMem (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT8 Value
# )
#------------------------------------------------------------------------------
-.global _InternalMemSetMem
_InternalMemSetMem:
push %edi
+ movb 16(%esp), %al
+ movb %al, %ah
+ shrdl $16, %eax, %edx
+ shldl $16, %edx, %eax
movl 12(%esp), %ecx # ecx <- Count
movl 8(%esp), %edi # edi <- Buffer
movl %ecx, %edx
+ andl $7, %edx
shrl $3, %ecx # # of Qwords to set
- movb 16(%esp), %al # al <- Value
- jz @SetBytes
- movb %al, %ah # ax <- Value | (Value << 8)
- pushl %ecx
- pushl %ecx
+ jz L1
+ addl $0x-10, %esp
movq %mm0, (%esp) # save mm0
+ movq %mm1, 8(%esp) # save mm1
movd %eax, %mm0
- pshufw $0x0,%mm0,%mm0
-L0:
- movntq %mm0, (%edi)
+ movd %eax, %mm1
+ psllq $32, %mm0
+ por %mm1, %mm0 # fill mm0 with 8 Value's
+L0:
+ movq %mm0, (%edi)
addl $8, %edi
- loop L0
- mfence
+ loopl L0
movq (%esp), %mm0 # restore mm0
- popl %ecx # stack cleanup
- popl %ecx
-@SetBytes:
- andl $7, %edx
+ movq 8(%esp), %mm1 # restore mm1
+ addl $0x10, %esp # stack cleanup
+L1:
movl %edx, %ecx
rep
stosb
\r
.686\r
.model flat,C\r
- .xmm\r
+ .mmx\r
.code\r
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_SetMem (\r
+; EFIAPI\r
+; InternalMemSetMem (\r
; IN VOID *Buffer,\r
; IN UINTN Count,\r
; IN UINT8 Value\r
; )\r
;------------------------------------------------------------------------------\r
InternalMemSetMem PROC USES edi\r
+ mov al, [esp + 16]\r
+ mov ah, al\r
+ shrd edx, eax, 16\r
+ shld eax, edx, 16\r
mov ecx, [esp + 12] ; ecx <- Count\r
mov edi, [esp + 8] ; edi <- Buffer\r
mov edx, ecx\r
+ and edx, 7\r
shr ecx, 3 ; # of Qwords to set\r
- mov al, [esp + 16] ; al <- Value\r
jz @SetBytes\r
- mov ah, al ; ax <- Value | (Value << 8)\r
- push ecx\r
- push ecx\r
+ add esp, -10h\r
movq [esp], mm0 ; save mm0\r
+ movq [esp + 8], mm1 ; save mm1\r
movd mm0, eax\r
- pshufw mm0, mm0, 0 ; fill mm0 with 8 Value's\r
+ movd mm1, eax\r
+ psllq mm0, 32\r
+ por mm0, mm1 ; fill mm0 with 8 Value's\r
@@:\r
- movntq [edi], mm0\r
+ movq [edi], mm0\r
add edi, 8\r
loop @B\r
- mfence\r
movq mm0, [esp] ; restore mm0\r
- pop ecx ; stack cleanup\r
- pop ecx\r
+ movq mm1, [esp + 8] ; restore mm1\r
+ add esp, 10h ; stack cleanup\r
@SetBytes:\r
- and edx, 7\r
mov ecx, edx\r
rep stosb\r
mov eax, [esp + 8] ; eax <- Buffer as return value\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .xmm:
- .code:
+.global _InternalMemSetMem16
#------------------------------------------------------------------------------
# VOID *
-# _mem_SetMem16 (
+# InternalMemSetMem16 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT16 Value
# )
#------------------------------------------------------------------------------
-.global _InternalMemSetMem16
_InternalMemSetMem16:
push %edi
+ movl 16(%esp), %eax
+ shrdl $16, %eax, %edx
+ shldl $16, %edx, %eax
movl 12(%esp), %edx
movl 8(%esp), %edi
movl %edx, %ecx
andl $3, %edx
shrl $2, %ecx
- movl 16(%esp), %eax
- jz @SetWords
+ jz L1
movd %eax, %mm0
- pshufw $0, %mm0, %mm0
-L0:
- movntq %mm0, (%edi)
+ movd %eax, %mm1
+ psllq $32, %mm0
+ por %mm1, %mm0
+L0:
+ movq %mm0, (%edi)
addl $8, %edi
- loop L0
- mfence
-@SetWords:
+ loopl L0
+L1:
movl %edx, %ecx
rep
stosw
\r
.686\r
.model flat,C\r
- .xmm\r
+ .mmx\r
.code\r
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_SetMem16 (\r
+; EFIAPI\r
+; InternalMemSetMem16 (\r
; IN VOID *Buffer,\r
; IN UINTN Count,\r
; IN UINT16 Value\r
; )\r
;------------------------------------------------------------------------------\r
InternalMemSetMem16 PROC USES edi\r
+ mov eax, [esp + 16]\r
+ shrd edx, eax, 16\r
+ shld eax, edx, 16\r
mov edx, [esp + 12]\r
mov edi, [esp + 8]\r
mov ecx, edx\r
and edx, 3\r
shr ecx, 2\r
- mov eax, [esp + 16]\r
jz @SetWords\r
movd mm0, eax\r
- pshufw mm0, mm0, 0\r
+ movd mm1, eax\r
+ psllq mm0, 32\r
+ por mm0, mm1\r
@@:\r
- movntq [edi], mm0\r
+ movq [edi], mm0\r
add edi, 8\r
loop @B\r
- mfence\r
@SetWords:\r
mov ecx, edx\r
rep stosw\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .xmm:
- .code:
+.global _InternalMemSetMem32
#------------------------------------------------------------------------------
# VOID *
-# _mem_SetMem32 (
+# InternalMemSetMem32 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT32 Value
# )
#------------------------------------------------------------------------------
-.global _InternalMemSetMem32
_InternalMemSetMem32:
- push %edi
- movl 12(%esp), %edx
- movl 8(%esp), %edi
- movl %edx, %ecx
+ movl 4(%esp), %eax
+ movl 8(%esp), %ecx
+ movd 12(%esp), %mm0
shrl %ecx
- movd 16(%esp), %mm0
- movl %edi, %eax
- jz @SetDwords
- pshufw $0x44, %mm0, %mm0
-L0:
- movntq %mm0, (%edi)
- addl $8, %edi
- loopl L0
- mfence
-@SetDwords:
- testb $1, %dl
+ movl %eax, %edx
jz L1
- movd %mm0, (%edi)
-L1:
- pop %edi
+ movq %mm0, %mm1
+ psllq $32, %mm1
+ por %mm1, %mm0
+L0:
+ movq %mm0, (%edx)
+ lea 8(%edx), %edx
+ loopl L0
+L1:
+ jnc L2
+ movd %mm0, (%edx)
+L2:
ret
\r
.686\r
.model flat,C\r
- .xmm\r
+ .mmx\r
.code\r
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_SetMem32 (\r
+; EFIAPI\r
+; InternalMemSetMem32 (\r
; IN VOID *Buffer,\r
; IN UINTN Count,\r
; IN UINT32 Value\r
-; )\r
+; );\r
;------------------------------------------------------------------------------\r
-InternalMemSetMem32 PROC USES edi\r
- mov edx, [esp + 12]\r
- mov edi, [esp + 8]\r
- mov ecx, edx\r
- shr ecx, 1\r
- movd mm0, [esp + 16]\r
- mov eax, edi\r
+InternalMemSetMem32 PROC\r
+ mov eax, [esp + 4] ; eax <- Buffer as return value\r
+ mov ecx, [esp + 8] ; ecx <- Count\r
+ movd mm0, [esp + 12] ; mm0 <- Value\r
+ shr ecx, 1 ; ecx <- number of qwords to set\r
+ mov edx, eax ; edx <- Buffer\r
jz @SetDwords\r
- pshufw mm0, mm0, 44h\r
+ movq mm1, mm0\r
+ psllq mm1, 32\r
+ por mm0, mm1\r
@@:\r
- movntq [edi], mm0\r
- add edi, 8\r
+ movq [edx], mm0\r
+ lea edx, [edx + 8] ; use "lea" to avoid change in flags\r
loop @B\r
- mfence\r
@SetDwords:\r
- test dl, 1\r
- jz @F\r
- movd [edi], mm0\r
+ jnc @F\r
+ movd [edx], mm0\r
@@:\r
ret\r
InternalMemSetMem32 ENDP\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .xmm:
- .code:
+.global _InternalMemSetMem64
#------------------------------------------------------------------------------
# VOID *
-# _mem_SetMem64 (
+# InternalMemSetMem64 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT64 Value
# )
#------------------------------------------------------------------------------
-.global _InternalMemSetMem64
_InternalMemSetMem64:
- push %edi
- movq 16(%esp), %mm0
- movl 12(%esp), %ecx
- movl 8(%esp), %edi
- movl %edi, %eax
-L0:
- movntq %mm0, (%edi)
- addl $8, %edi
+ movl 4(%esp), %eax
+ movl 8(%esp), %ecx
+ movq 12(%esp), %mm0
+ movl %eax, %edx
+L0:
+ movq %mm0, (%edx)
+ lea 8(%edx), %edx
loopl L0
- mfence
- pop %edi
ret
\r
.686\r
.model flat,C\r
- .xmm\r
+ .mmx\r
.code\r
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_SetMem64 (\r
+; EFIAPI\r
+; InternalMemSetMem64 (\r
; IN VOID *Buffer,\r
; IN UINTN Count,\r
; IN UINT64 Value\r
movq mm0, [esp + 12]\r
mov edx, eax\r
@@:\r
- movntq [edx], mm0\r
+ movq [edx], mm0\r
add edx, 8\r
loop @B\r
- mfence\r
ret\r
InternalMemSetMem64 ENDP\r
\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .xmm:
- .code:
+.global _InternalMemZeroMem
#------------------------------------------------------------------------------
# VOID *
-# _mem_ZeroMem (
+# EFIAPI
+# InternalMemZeroMem (
# IN VOID *Buffer,
# IN UINTN Count
-# )
+# );
#------------------------------------------------------------------------------
-.global _InternalMemZeroMem
_InternalMemZeroMem:
push %edi
movl 8(%esp), %edi
shrl $3, %ecx
jz @ZeroBytes
pxor %mm0, %mm0
-L0:
- movntq %mm0, (%edi)
+L0:
+ movq %mm0, (%edi)
addl $8, %edi
loop L0
- mfence
-@ZeroBytes:
+@ZeroBytes:
andl $7, %edx
xorl %eax, %eax
movl %edx, %ecx
\r
.686\r
.model flat,C\r
- .xmm\r
+ .mmx\r
.code\r
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_ZeroMem (\r
+; InternalMemZeroMem (\r
; IN VOID *Buffer,\r
; IN UINTN Count\r
-; )\r
+; );\r
;------------------------------------------------------------------------------\r
InternalMemZeroMem PROC USES edi\r
mov edi, [esp + 8]\r
jz @ZeroBytes\r
pxor mm0, mm0\r
@@:\r
- movntq [edi], mm0\r
+ movq [edi], mm0\r
add edi, 8\r
loop @B\r
- mfence\r
@ZeroBytes:\r
and edx, 7\r
xor eax, eax\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; INTN\r
+; EFIAPI\r
+; InternalMemCompareMem (\r
+; IN CONST VOID *DestinationBuffer,\r
+; IN CONST VOID *SourceBuffer,\r
+; IN UINTN Length\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemCompareMem PROC USES rsi rdi\r
mov rsi, rcx\r
mov rdi, rdx\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; EFIAPI\r
+; InternalMemCopyMem (\r
+; OUT VOID *DestinationBuffer,\r
+; IN CONST VOID *SourceBuffer,\r
+; IN UINTN Length\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemCopyMem PROC USES rsi rdi\r
mov rsi, rdx ; rsi <- Source\r
mov rdi, rcx ; rdi <- Destination\r
- lea r9, [rdi + r8 - 1] ; r9 <- End of Destination\r
+ lea r9, [rsi + r8 - 1] ; r9 <- End of Source\r
cmp rsi, rdi\r
mov rax, rdi ; rax <- Destination as return value\r
jae @F\r
- cmp r9, rsi\r
+ cmp r9, rdi\r
jae @CopyBackward ; Copy backward if overlapped\r
-@@:\r
- xor rcx, rcx\r
- sub rcx, rsi\r
- and rcx, 7 ; rcx + rsi aligns on 8-byte boundary\r
- jz @F\r
- cmp rcx, r8\r
- cmova rcx, r8\r
- sub r8, rcx ; r8 <- remaining bytes to copy\r
- rep movsb\r
@@:\r
mov rcx, r8\r
and r8, 7\r
shr rcx, 3 ; rcx <- # of Qwords to copy\r
jz @CopyBytes\r
- DB 49h, 0fh, 7eh, 0c2h ; movq r10, mm0 ; save mm0\r
+ DB 49h, 0fh, 7eh, 0c2h ; movd r10, mm0 (Save mm0 in r10)\r
@@:\r
- DB 48h, 0fh, 6fh, 06h ; movq mm0, [rsi]\r
- DB 48h, 0fh, 0e7h, 07h ; movntq [rdi], mm0\r
+ DB 0fh, 6fh, 06h ; movd mm0, [rsi]\r
+ DB 0fh, 0e7h, 07h ; movntq [rdi], mm0\r
add rsi, 8\r
add rdi, 8\r
loop @B\r
mfence\r
- DB 49h, 0fh, 6eh, 0c2h ; movq mm0, r10 ; restore mm0\r
+ DB 49h, 0fh, 6eh, 0c2h ; movd mm0, r10 (Restore mm0)\r
jmp @CopyBytes\r
@CopyBackward:\r
- mov rdi, r9 ; rdi <- End of Destination\r
- lea rsi, [rsi + r8 - 1] ; rsi <- End of Source\r
+ mov rsi, r9 ; rsi <- End of Source\r
+ lea rdi, [rdi + r8 - 1] ; rdi <- End of Destination\r
std ; set direction flag\r
@CopyBytes:\r
mov rcx, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem16 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT16 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem16 PROC USES rdi\r
mov rdi, rcx\r
mov rax, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem32 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT32 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem32 PROC USES rdi\r
mov rdi, rcx\r
mov rax, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem64 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT64 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem64 PROC USES rdi\r
mov rdi, rcx\r
mov rax, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem8 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT8 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem8 PROC USES rdi\r
mov rdi, rcx\r
mov rcx, rdx\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; EFIAPI\r
+; InternalMemSetMem (\r
+; OUT VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT8 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemSetMem PROC USES rdi\r
mov rax, r8\r
mov ah, al\r
- DB 48h, 0fh, 6eh, 0c0h ; movq mm0, rax\r
+ DB 48h, 0fh, 6eh, 0c0h ; movd mm0, rax\r
mov r8, rcx\r
- mov rdi, r8\r
+ mov rdi, r8 ; rdi <- Buffer\r
mov rcx, rdx\r
+ and edx, 7\r
shr rcx, 3\r
jz @SetBytes\r
- DB 0fh, 70h, 0C0h, 00h ; pshufw mm0, mm0, 0h\r
-@@: \r
- DB 48h, 0fh, 0e7h, 07h ; movntq [rdi], mm0\r
+ DB 0fh, 70h, 0C0h, 00h ; pshufw mm0, mm0, 0h\r
+@@:\r
+ DB 0fh, 0e7h, 07h ; movntq [rdi], mm0\r
add rdi, 8\r
loop @B\r
mfence\r
@SetBytes:\r
- and rdx, 7\r
- mov rcx, rdx\r
+ mov ecx, edx\r
rep stosb\r
mov rax, r8\r
ret\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; EFIAPI\r
+; InternalMemSetMem16 (\r
+; OUT VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT16 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemSetMem16 PROC USES rdi\r
mov rax, r8\r
- DB 48h, 0fh, 6eh, 0c0h ; movq mm0, rax\r
+ DB 48h, 0fh, 6eh, 0c0h ; movd mm0, rax\r
mov r8, rcx\r
mov rdi, r8\r
mov rcx, rdx\r
- and rdx, 3\r
+ and edx, 3\r
shr rcx, 2\r
jz @SetWords\r
- DB 0fh, 70h, 0C0h, 00h ; pshufw mm0, mm0, 0h\r
-@@: \r
- DB 48h, 0fh, 0e7h, 07h ; movntq [rdi], mm0\r
+ DB 0fh, 70h, 0C0h, 00h ; pshufw mm0, mm0, 0h\r
+@@:\r
+ DB 0fh, 0e7h, 07h ; movntq [rdi], mm0\r
add rdi, 8\r
loop @B\r
mfence\r
@SetWords:\r
- mov rcx, rdx\r
+ mov ecx, edx\r
rep stosw\r
mov rax, r8\r
ret\r
\r
.code\r
\r
-InternalMemSetMem32 PROC USES rdi\r
- DB 49h, 0fh, 6eh, 0c0h ; movq mm0, r8 ; mm0 <- Value\r
- mov rax, rcx ; rax <- Buffer\r
- mov rdi, rax\r
- mov rcx, rdx\r
- shr rcx, 1 \r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; InternalMemSetMem32 (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count,\r
+; IN UINT32 Value\r
+; )\r
+;------------------------------------------------------------------------------\r
+InternalMemSetMem32 PROC\r
+ DB 49h, 0fh, 6eh, 0c0h ; movd mm0, r8 (Value)\r
+ mov rax, rcx ; rax <- Buffer\r
+ xchg rcx, rdx ; rcx <- Count rdx <- Buffer\r
+ shr rcx, 1 ; rcx <- # of qwords to set\r
jz @SetDwords\r
- DB 0fh, 70h, 0C0h, 44h ; pshufw mm0, mm0, 44h\r
+ DB 0fh, 70h, 0C0h, 44h ; pshufw mm0, mm0, 44h\r
@@:\r
- DB 48h, 0fh, 0e7h, 07h ; movntq [rdi], mm0\r
- add rdi, 8\r
+ DB 0fh, 0e7h, 02h ; movntq [rdx], mm0\r
+ lea rdx, [rdx + 8] ; use "lea" to avoid flag changes\r
loop @B\r
mfence\r
@SetDwords:\r
- test dl, 1\r
- jz @F\r
- DB 0fh, 7eh, 07h ; movd [rdi], mm0\r
+ jnc @F\r
+ DB 0fh, 7eh, 02h ; movd [rdx], mm0\r
@@:\r
ret\r
InternalMemSetMem32 ENDP\r
\r
.code\r
\r
-InternalMemSetMem64 PROC USES rdi\r
- DB 49h, 0fh, 6eh, 0c0h; movq mm0, r8 ; mm0 <- Value\r
- mov rax, rcx ; rax <- Buffer\r
- xchg rcx, rdx ; rcx <- Count\r
- mov rdi, rax\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; InternalMemSetMem64 (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count,\r
+; IN UINT64 Value\r
+; )\r
+;------------------------------------------------------------------------------\r
+InternalMemSetMem64 PROC\r
+ DB 49h, 0fh, 6eh, 0c0h ; movd mm0, r8 (Value)\r
+ mov rax, rcx ; rax <- Buffer\r
+ xchg rcx, rdx ; rcx <- Count\r
@@:\r
- DB 48h, 0fh, 0e7h, 07h; movntq [rdi], mm0\r
- add rdi, 8\r
+ DB 0fh, 0e7h, 02h ; movntq [rdx], mm0\r
+ add rdx, 8\r
loop @B\r
mfence\r
ret\r
--- /dev/null
+;------------------------------------------------------------------------------\r
+;\r
+; Copyright (c) 2006, Intel Corporation\r
+; All rights reserved. This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution. The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;\r
+; Module Name:\r
+;\r
+; ZeroMem.asm\r
+;\r
+; Abstract:\r
+;\r
+; ZeroMem function\r
+;\r
+; Notes:\r
+;\r
+;------------------------------------------------------------------------------\r
+\r
+ .code\r
+\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; InternalMemZeroMem (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count\r
+; );\r
+;------------------------------------------------------------------------------\r
+InternalMemZeroMem PROC USES rdi\r
+ mov rdi, rcx\r
+ mov rcx, rdx\r
+ mov r8, rdi\r
+ and edx, 7\r
+ shr rcx, 3\r
+ jz @ZeroBytes\r
+ DB 0fh, 0efh, 0c0h ; pxor mm0, mm0\r
+@@:\r
+ DB 0fh, 0e7h, 7 ; movntq [rdi], mm0\r
+ add rdi, 8\r
+ loop @B\r
+ DB 0fh, 0aeh, 0f0h ; mfence\r
+@ZeroBytes:\r
+ xor eax, eax\r
+ mov ecx, edx\r
+ rep stosb\r
+ mov rax, r8\r
+ ret\r
+InternalMemZeroMem ENDP\r
+\r
+ END\r
\r
This function fills Length bytes of Buffer with zeros, and returns Buffer.\r
If Length > 0 and Buffer is NULL, then ASSERT().\r
- If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT(). \r
+ If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT().\r
\r
@param Buffer Pointer to the target buffer to fill with zeros.\r
@param Length Number of bytes in Buffer to fill with zeros.\r
{\r
ASSERT (!(Buffer == NULL && Length > 0));\r
ASSERT (Length <= (MAX_ADDRESS - (UINTN)Buffer + 1));\r
- return InternalMemSetMem (Buffer, Length, 0);\r
+ return InternalMemZeroMem (Buffer, Length);\r
}\r
#
#------------------------------------------------------------------------------
- .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
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; INTN\r
+; EFIAPI\r
+; InternalMemCompareMem (\r
+; IN CONST VOID *DestinationBuffer,\r
+; IN CONST VOID *SourceBuffer,\r
+; IN UINTN Length\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemCompareMem PROC USES esi edi\r
mov esi, [esp + 12]\r
mov edi, [esp + 16]\r
#
#------------------------------------------------------------------------------
- .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
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; InternalMemCopyMem (\r
+; IN VOID *Destination,\r
+; IN VOID *Source,\r
+; IN UINTN Count\r
+; )\r
+;------------------------------------------------------------------------------\r
InternalMemCopyMem PROC USES esi edi\r
mov esi, [esp + 16] ; esi <- Source\r
mov edi, [esp + 12] ; edi <- Destination\r
mov edx, [esp + 20] ; edx <- Count\r
- lea eax, [edi + edx - 1] ; eax <- End of Destination\r
+ lea eax, [esi + edx - 1] ; eax <- End of Source\r
cmp esi, edi\r
jae @F\r
- cmp eax, esi\r
+ cmp eax, edi\r
jae @CopyBackward ; Copy backward if overlapped\r
@@:\r
mov ecx, edx\r
rep movsd ; Copy as many Dwords as possible\r
jmp @CopyBytes\r
@CopyBackward:\r
- mov edi, eax ; edi <- End of Destination\r
- lea esi, [esi + edx - 1] ; esi <- End of Source\r
+ mov esi, eax ; esi <- End of Source\r
+ lea edi, [edi + edx - 1] ; edi <- End of Destination\r
std\r
@CopyBytes:\r
mov ecx, edx\r
#
#------------------------------------------------------------------------------
- .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
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem16 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT16 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem16 PROC USES edi\r
mov ecx, [esp + 12]\r
mov edi, [esp + 8]\r
#
#------------------------------------------------------------------------------
- .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
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem32 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT32 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem32 PROC USES edi\r
mov ecx, [esp + 12]\r
mov edi, [esp + 8]\r
#
#------------------------------------------------------------------------------
- .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
-
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem64 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT64 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem64 PROC USES edi\r
mov ecx, [esp + 12]\r
mov eax, [esp + 16]\r
#
#------------------------------------------------------------------------------
- .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
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem8 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT8 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem8 PROC USES edi\r
mov ecx, [esp + 12]\r
mov edi, [esp + 8]\r
#
#------------------------------------------------------------------------------
- .386:
- .code:
+ .386:
+ .code:
.global _InternalMemSetMem
+
+#------------------------------------------------------------------------------
+# VOID *
+# InternalMemSetMem (
+# IN VOID *Buffer,
+# IN UINTN Count,
+# IN UINT8 Value
+# )
+#------------------------------------------------------------------------------
_InternalMemSetMem:
push %edi
movl 16(%esp),%eax
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; InternalMemSetMem (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count,\r
+; IN UINT8 Value\r
+; )\r
+;------------------------------------------------------------------------------\r
InternalMemSetMem PROC USES edi\r
mov eax, [esp + 16]\r
mov edi, [esp + 8]\r
#
#------------------------------------------------------------------------------
- .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
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; InternalMemSetMem16 (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count,\r
+; IN UINT16 Value\r
+; )\r
+;------------------------------------------------------------------------------\r
InternalMemSetMem16 PROC USES edi\r
mov eax, [esp + 16]\r
mov edi, [esp + 8]\r
#
#------------------------------------------------------------------------------
- .386:
- .code:
-
.global _InternalMemSetMem32
+
+#------------------------------------------------------------------------------
+# VOID *
+# InternalMemSetMem32 (
+# IN VOID *Buffer,
+# IN UINTN Count,
+# IN UINT32 Value
+# )
+#------------------------------------------------------------------------------
_InternalMemSetMem32:
push %edi
movl 16(%esp),%eax
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; InternalMemSetMem32 (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count,\r
+; IN UINT32 Value\r
+; )\r
+;------------------------------------------------------------------------------\r
InternalMemSetMem32 PROC USES edi\r
mov eax, [esp + 16]\r
mov edi, [esp + 8]\r
#
#------------------------------------------------------------------------------
- .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
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; InternalMemSetMem64 (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count,\r
+; IN UINT64 Value\r
+; )\r
+;------------------------------------------------------------------------------\r
InternalMemSetMem64 PROC USES edi\r
mov ecx, [esp + 12]\r
mov eax, [esp + 16]\r
#
#------------------------------------------------------------------------------
- .386:
- .code:
-
.global _InternalMemZeroMem
+
+#------------------------------------------------------------------------------
+# VOID *
+# InternalMemZeroMem (
+# IN VOID *Buffer,
+# IN UINTN Count
+# );
+#------------------------------------------------------------------------------
_InternalMemZeroMem:
push %edi
xorl %eax,%eax
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; InternalMemZeroMem (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemZeroMem PROC USES edi\r
xor eax, eax\r
mov edi, [esp + 8]\r
\r
This function fills Length bytes of Buffer with zeros, and returns Buffer.\r
If Length > 0 and Buffer is NULL, then ASSERT().\r
- If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT(). \r
+ If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT().\r
\r
@param Buffer Pointer to the target buffer to fill with zeros.\r
@param Length Number of bytes in Buffer to fill with zeros.\r
{\r
ASSERT (!(Buffer == NULL && Length > 0));\r
ASSERT (Length <= (MAX_ADDRESS - (UINTN)Buffer + 1));\r
- return InternalMemSetMem (Buffer, Length, 0);\r
+ return InternalMemZeroMem (Buffer, Length);\r
}\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; INTN\r
+; EFIAPI\r
+; InternalMemCompareMem (\r
+; IN CONST VOID *DestinationBuffer,\r
+; IN CONST VOID *SourceBuffer,\r
+; IN UINTN Length\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemCompareMem PROC USES rsi rdi\r
mov rsi, rcx\r
mov rdi, rdx\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; EFIAPI\r
+; InternalMemCopyMem (\r
+; IN VOID *Destination,\r
+; IN VOID *Source,\r
+; IN UINTN Count\r
+; )\r
+;------------------------------------------------------------------------------\r
InternalMemCopyMem PROC USES rsi rdi\r
mov rsi, rdx ; rsi <- Source\r
mov rdi, rcx ; rdi <- Destination\r
- lea r9, [rdi + r8 - 1] ; r9 <- End of Destination\r
+ lea r9, [rsi + r8 - 1] ; r9 <- End of Source\r
cmp rsi, rdi\r
mov rax, rdi ; rax <- Destination as return value\r
jae @F\r
rep movsq ; Copy as many Qwords as possible\r
jmp @CopyBytes\r
@CopyBackward:\r
- mov rdi, r9 ; rdi <- End of Destination\r
- lea rsi, [rsi + r8 - 1] ; esi <- End of Source\r
+ mov rsi, r9 ; rsi <- End of Source\r
+ lea rdi, [rdi + r8 - 1] ; esi <- End of Destination\r
std ; set direction flag\r
@CopyBytes:\r
mov rcx, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem16 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT16 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem16 PROC USES rdi\r
mov rdi, rcx\r
mov rax, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem32 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT32 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem32 PROC USES rdi\r
mov rdi, rcx\r
mov rax, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem64 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT64 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem64 PROC USES rdi\r
mov rdi, rcx\r
mov rax, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem8 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT8 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem8 PROC USES rdi\r
mov rdi, rcx\r
mov rcx, rdx\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; EFIAPI\r
+; InternalMemSetMem (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count,\r
+; IN UINT8 Value\r
+; )\r
+;------------------------------------------------------------------------------\r
InternalMemSetMem PROC USES rdi\r
mov rax, r8\r
mov rdi, rcx\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; EFIAPI\r
+; InternalMemSetMem16 (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count,\r
+; IN UINT16 Value\r
+; )\r
+;------------------------------------------------------------------------------\r
InternalMemSetMem16 PROC USES rdi\r
mov rdi, rcx\r
mov rax, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; EFIAPI\r
+; InternalMemSetMem32 (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count,\r
+; IN UINT32 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemSetMem32 PROC USES rdi\r
mov rdi, rcx\r
mov rax, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; InternalMemSetMem64 (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count,\r
+; IN UINT64 Value\r
+; )\r
+;------------------------------------------------------------------------------\r
InternalMemSetMem64 PROC USES rdi\r
mov rdi, rcx\r
mov rax, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; InternalMemZeroMem (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemZeroMem PROC USES rdi\r
push rcx\r
xor rax, rax\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .code:
-
.global _InternalMemCompareMem
+
+#------------------------------------------------------------------------------
+# INTN
+# EFIAPI
+# InternalMemCompareMem (
+# IN CONST VOID *DestinationBuffer,
+# IN CONST VOID *SourceBuffer,
+# IN UINTN Length
+# );
+#------------------------------------------------------------------------------
_InternalMemCompareMem:
push %esi
push %edi
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; INTN\r
+; EFIAPI\r
+; InternalMemCompareMem (\r
+; IN CONST VOID *DestinationBuffer,\r
+; IN CONST VOID *SourceBuffer,\r
+; IN UINTN Length\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemCompareMem PROC USES esi edi\r
mov esi, [esp + 12]\r
mov edi, [esp + 16]\r
#
#------------------------------------------------------------------------------
- .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 %edi, %ecx
andl $15, %ecx # ecx + edi aligns on 16-byte boundary
subl %ecx, %edx # edx <- remaining bytes to copy
rep
movsb
-L1:
+L1:
movl %edx, %ecx
andl $15, %edx
shrl $4, %ecx # ecx <- # of DQwords to copy
jz @CopyBytes
addl $-16, %esp
movdqu %xmm0, (%esp)
-L2:
+L2:
movdqu (%esi), %xmm0
- movntdq %xmm0, (%edi)
+ movntdq %xmm0, (%edi)
addl $16, %esi
addl $16, %edi
loop L2
movdqu (%esp),%xmm0
addl $16, %esp # 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
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_CopyMem (\r
+; InternalMemCopyMem (\r
; IN VOID *Destination,\r
; IN VOID *Source,\r
; IN UINTN Count\r
-; )\r
+; );\r
;------------------------------------------------------------------------------\r
InternalMemCopyMem PROC USES esi edi\r
mov esi, [esp + 16] ; esi <- Source\r
mov edi, [esp + 12] ; edi <- Destination\r
mov edx, [esp + 20] ; edx <- Count\r
- lea eax, [edi + edx - 1] ; eax <- End of Destination\r
+ lea eax, [esi + edx - 1] ; eax <- End of Source\r
cmp esi, edi\r
jae @F\r
- cmp eax, esi ; Overlapped?\r
+ cmp eax, edi ; Overlapped?\r
jae @CopyBackward ; Copy backward if overlapped\r
@@:\r
xor ecx, ecx\r
add esp, 16 ; stack cleanup\r
jmp @CopyBytes\r
@CopyBackward:\r
- mov edi, eax ; edi <- Last byte in Destination\r
- lea esi, [esi + edx - 1] ; esi <- Last byte in Source\r
+ mov esi, eax ; esi <- Last byte in Source\r
+ lea edi, [edi + edx - 1] ; edi <- Last byte in Destination\r
std\r
@CopyBytes:\r
mov ecx, edx\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .code:
-
.global _InternalMemScanMem16
+
+#------------------------------------------------------------------------------
+# CONST VOID *
+# EFIAPI
+# InternalMemScanMem16 (
+# IN CONST VOID *Buffer,
+# IN UINTN Length,
+# IN UINT16 Value
+# );
+#------------------------------------------------------------------------------
_InternalMemScanMem16:
push %edi
movl 12(%esp), %ecx
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem16 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT16 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem16 PROC USES edi\r
mov ecx, [esp + 12]\r
mov edi, [esp + 8]\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .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
- repnz scasl
+ repne scasl
leal -4(%edi), %eax
cmovnz %ecx, %eax
pop %edi
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem32 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT32 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem32 PROC USES edi\r
mov ecx, [esp + 12]\r
mov edi, [esp + 8]\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .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
-L0:
+L0:
cmpl (%edi), %eax
leal 8(%edi), %edi
loopne L0
cmpl -4(%edi), %edx
jecxz L1
jne L0
-L1:
+L1:
leal -8(%edi), %eax
cmovne %ecx, %eax
pop %edi
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem64 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT64 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem64 PROC USES edi\r
mov ecx, [esp + 12]\r
mov eax, [esp + 16]\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .code:
-
.global _InternalMemScanMem8
+
+#------------------------------------------------------------------------------
+# CONST VOID *
+# EFIAPI
+# InternalMemScanMem8 (
+# IN CONST VOID *Buffer,
+# IN UINTN Length,
+# IN UINT8 Value
+# );
+#------------------------------------------------------------------------------
_InternalMemScanMem8:
push %edi
movl 12(%esp), %ecx
.model flat,C\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem8 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT8 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem8 PROC USES edi\r
mov ecx, [esp + 12]\r
mov edi, [esp + 8]\r
#
#------------------------------------------------------------------------------
- .686:
+ .686:
#.MODEL flat,C
- .xmm:
- .code:
+ .xmm:
+ .code:
#------------------------------------------------------------------------------
# VOID *
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT8 Value
-# )
+# );
#------------------------------------------------------------------------------
.global _InternalMemSetMem
_InternalMemSetMem:
subl %ecx, %edx
rep
stosb
-L0:
+L0:
movl %edx, %ecx
andl $15, %edx
shrl $4, %ecx # ecx <- # of DQwords to set
movd %eax, %xmm0
pshuflw $0, %xmm0, %xmm0
movlhps %xmm0, %xmm0
-L1:
+L1:
movntdq %xmm0, (%edi)
addl $16, %edi
loop L1
mfence
movdqu (%esp), %xmm0
addl $16, %esp # stack cleanup
-@SetBytes:
+@SetBytes:
movl %edx, %ecx
rep
stosb
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_SetMem (\r
+; EFIAPI\r
+; InternalMemSetMem (\r
; IN VOID *Buffer,\r
; IN UINTN Count,\r
; IN UINT8 Value\r
-; )\r
+; );\r
;------------------------------------------------------------------------------\r
InternalMemSetMem PROC USES edi\r
mov edx, [esp + 12] ; edx <- Count\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .xmm:
- .code:
+.global _InternalMemSetMem16
#------------------------------------------------------------------------------
# VOID *
-# _mem_SetMem16 (
+# EFIAPI
+# InternalMemSetMem16 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT16 Value
# )
#------------------------------------------------------------------------------
-.global _InternalMemSetMem16
_InternalMemSetMem16:
push %edi
movl 12(%esp), %edx
subl %ecx, %edx
rep
stosw
-L0:
+L0:
movl %edx, %ecx
andl $7, %edx
shrl $3, %ecx
addl $16, %edi
loop L1
mfence
-@SetWords:
+@SetWords:
movl %edx, %ecx
rep
stosw
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_SetMem16 (\r
+; EFIAPI\r
+; InternalMemSetMem16 (\r
; IN VOID *Buffer,\r
; IN UINTN Count,\r
; IN UINT16 Value\r
-; )\r
+; );\r
;------------------------------------------------------------------------------\r
InternalMemSetMem16 PROC USES edi\r
mov edx, [esp + 12]\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .xmm:
- .code:
+.global _InternalMemSetMem32
#------------------------------------------------------------------------------
# VOID *
-# _mem_SetMem32 (
+# EFIAPI
+# InternalMemSetMem32 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT32 Value
-# )
+# );
#------------------------------------------------------------------------------
-.global _InternalMemSetMem32
_InternalMemSetMem32:
push %edi
movl 12(%esp), %edx
subl %ecx, %edx
rep
stosl
-L0:
+L0:
movl %edx, %ecx
andl $3, %edx
shrl $2, %ecx
jz @SetDwords
movd %eax, %xmm0
pshufd $0, %xmm0, %xmm0
-L1:
+L1:
movntdq %xmm0, (%edi)
addl $16, %edi
loop L1
mfence
-@SetDwords:
+@SetDwords:
movl %edx, %ecx
rep
stosl
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_SetMem32 (\r
+; EFIAPI\r
+; InternalMemSetMem32 (\r
; IN VOID *Buffer,\r
; IN UINTN Count,\r
; IN UINT32 Value\r
-; )\r
+; );\r
;------------------------------------------------------------------------------\r
InternalMemSetMem32 PROC USES edi\r
mov edx, [esp + 12]\r
#\r
#------------------------------------------------------------------------------\r
\r
+.globl _InternalMemSetMem64\r
+\r
#------------------------------------------------------------------------------\r
# VOID *\r
+# EFIAPI\r
# InternalMemSetMem64 (\r
# IN VOID *Buffer,\r
# IN UINTN Count,\r
# IN UINT64 Value\r
-# )\r
+# );\r
#------------------------------------------------------------------------------\r
-.globl _InternalMemSetMem64\r
_InternalMemSetMem64:\r
movl 4(%esp), %eax\r
movl 8(%esp), %ecx\r
movq %xmm0, (%edx)\r
addl $8, %edx\r
decl %ecx\r
-L1: \r
+L1:\r
shrl %ecx\r
jz @SetQwords\r
movlhps %xmm0, %xmm0\r
-L2: \r
+L2:\r
movntdq %xmm0, (%edx)\r
leal 16(%edx), %edx\r
loop L2\r
mfence\r
-@SetQwords: \r
+@SetQwords:\r
jnc L3\r
movq %xmm0, (%edx)\r
-L3: \r
+L3:\r
ret\r
-\r
-\r
-\r
\r
;------------------------------------------------------------------------------\r
; VOID *\r
+; EFIAPI\r
; InternalMemSetMem64 (\r
; IN VOID *Buffer,\r
; IN UINTN Count,\r
; )\r
;------------------------------------------------------------------------------\r
InternalMemSetMem64 PROC\r
- mov eax, [esp + 4]\r
- mov ecx, [esp + 8]\r
+ mov eax, [esp + 4] ; eax <- Buffer\r
+ mov ecx, [esp + 8] ; ecx <- Count\r
test al, 8\r
mov edx, eax\r
movq xmm0, [esp + 12]\r
#
#------------------------------------------------------------------------------
- .686:
- #.MODEL flat,C
- .xmm:
- .code:
+.global _InternalMemZeroMem
#------------------------------------------------------------------------------
# VOID *
-# _mem_ZeroMem (
+# EFIAPI
+# InternalMemZeroMem (
# IN VOID *Buffer,
# IN UINTN Count
-# )
+# );
#------------------------------------------------------------------------------
-.global _InternalMemZeroMem
_InternalMemZeroMem:
push %edi
movl 8(%esp), %edi
subl %ecx, %edx
rep
stosb
-L0:
+L0:
movl %edx, %ecx
andl $15, %edx
shrl $4, %ecx
jz @ZeroBytes
pxor %xmm0, %xmm0
-L1:
+L1:
movntdq %xmm0, (%edi)
addl $16, %edi
loop L1
mfence
-@ZeroBytes:
+@ZeroBytes:
movl %edx, %ecx
rep
stosb
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_ZeroMem (\r
+; EFIAPI\r
+; InternalMemZeroMem (\r
; IN VOID *Buffer,\r
; IN UINTN Count\r
-; )\r
+; );\r
;------------------------------------------------------------------------------\r
InternalMemZeroMem PROC USES edi\r
mov edi, [esp + 8]\r
\r
This function fills Length bytes of Buffer with zeros, and returns Buffer.\r
If Length > 0 and Buffer is NULL, then ASSERT().\r
- If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT(). \r
+ If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT().\r
\r
@param Buffer Pointer to the target buffer to fill with zeros.\r
@param Length Number of bytes in Buffer to fill with zeros.\r
{\r
ASSERT (!(Buffer == NULL && Length > 0));\r
ASSERT (Length <= (MAX_ADDRESS - (UINTN)Buffer + 1));\r
- return InternalMemSetMem (Buffer, Length, 0);\r
+ return InternalMemZeroMem (Buffer, Length);\r
}\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; INTN\r
+; EFIAPI\r
+; InternalMemCompareMem (\r
+; IN CONST VOID *DestinationBuffer,\r
+; IN CONST VOID *SourceBuffer,\r
+; IN UINTN Length\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemCompareMem PROC USES rsi rdi\r
mov rsi, rcx\r
mov rdi, rdx\r
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_CopyMem (\r
+; EFIAPI\r
+; InternalMemCopyMem (\r
; IN VOID *Destination,\r
; IN VOID *Source,\r
; IN UINTN Count\r
-; )\r
+; );\r
;------------------------------------------------------------------------------\r
InternalMemCopyMem PROC USES rsi rdi\r
mov rsi, rdx ; rsi <- Source\r
mov rdi, rcx ; rdi <- Destination\r
- lea r9, [rdi + r8 - 1] ; r9 <- Last byte of Destination\r
+ lea r9, [rsi + r8 - 1] ; r9 <- Last byte of Source\r
cmp rsi, rdi\r
mov rax, rdi ; rax <- Destination as return value\r
jae @F ; Copy forward if Source > Destination\r
- cmp r9, rsi ; Overlapped?\r
+ cmp r9, rdi ; Overlapped?\r
jae @CopyBackward ; Copy backward if overlapped\r
@@:\r
xor rcx, rcx\r
movdqa xmm0, [rsp + 18h] ; restore xmm0\r
jmp @CopyBytes ; copy remaining bytes\r
@CopyBackward:\r
- mov rdi, r9 ; rdi <- Last byte of Destination\r
- lea rsi, [rsi + r8 - 1] ; rsi <- Last byte of Source\r
+ mov rsi, r9 ; rsi <- Last byte of Source\r
+ lea rdi, [rdi + r8 - 1] ; rdi <- Last byte of Destination\r
std\r
@CopyBytes:\r
mov rcx, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem16 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT16 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem16 PROC USES rdi\r
mov rdi, rcx\r
mov rax, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem32 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT32 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem32 PROC USES rdi\r
mov rdi, rcx\r
mov rax, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem64 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT64 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem64 PROC USES rdi\r
mov rdi, rcx\r
mov rax, r8\r
\r
.code\r
\r
+;------------------------------------------------------------------------------\r
+; CONST VOID *\r
+; EFIAPI\r
+; InternalMemScanMem8 (\r
+; IN CONST VOID *Buffer,\r
+; IN UINTN Length,\r
+; IN UINT8 Value\r
+; );\r
+;------------------------------------------------------------------------------\r
InternalMemScanMem8 PROC USES rdi\r
mov rdi, rcx\r
mov rcx, rdx\r
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_SetMem (\r
+; InternalMemSetMem (\r
; IN VOID *Buffer,\r
; IN UINTN Count,\r
; IN UINT8 Value\r
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_SetMem16 (\r
+; InternalMemSetMem16 (\r
; IN VOID *Buffer,\r
; IN UINTN Count,\r
; IN UINT16 Value\r
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_SetMem32 (\r
+; InternalMemSetMem32 (\r
; IN VOID *Buffer,\r
; IN UINTN Count,\r
; IN UINT8 Value\r
; )\r
;------------------------------------------------------------------------------\r
InternalMemSetMem64 PROC\r
- mov rax, rcx\r
+ mov rax, rcx ; rax <- Buffer\r
+ xchg rcx, rdx ; rcx <- Count & rdx <- Buffer\r
test dl, 8\r
- xchg rcx, rdx\r
+ movd xmm0, r8\r
jz @F\r
mov [rdx], r8\r
add rdx, 8\r
@@:\r
shr rcx, 1\r
jz @SetQwords\r
- movd xmm0, r8\r
movlhps xmm0, xmm0\r
@@:\r
movntdq [rdx], xmm0\r
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_ZeroMem (\r
+; InternalMemZeroMem (\r
; IN VOID *Buffer,\r
; IN UINTN Count\r
; )\r
\r
This function fills Length bytes of Buffer with zeros, and returns Buffer.\r
If Length > 0 and Buffer is NULL, then ASSERT().\r
- If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT(). \r
+ If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT().\r
\r
@param Buffer Pointer to the target buffer to fill with zeros.\r
@param Length Number of bytes in Buffer to fill with zeros.\r
{\r
ASSERT (!(Buffer == NULL && Length > 0));\r
ASSERT (Length <= (MAX_ADDRESS - (UINTN)Buffer + 1));\r
- return InternalMemSetMem (Buffer, Length, 0);\r
+ return InternalMemZeroMem (Buffer, Length);\r
}\r
\r
This function fills Length bytes of Buffer with zeros, and returns Buffer.\r
If Length > 0 and Buffer is NULL, then ASSERT().\r
- If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT(). \r
+ If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT().\r
\r
@param Buffer Pointer to the target buffer to fill with zeros.\r
@param Length Number of bytes in Buffer to fill with zeros.\r
{\r
ASSERT (!(Buffer == NULL && Length > 0));\r
ASSERT (Length <= (MAX_ADDRESS - (UINTN)Buffer + 1));\r
- return InternalMemSetMem (Buffer, Length, 0);\r
+ return InternalMemZeroMem (Buffer, Length);\r
}\r