add corresponding .S files for BaseMemoryLibXXX X64 arch. Note that we use ".intel_syntax noprefix" directive to simplify the .S implementation.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6184 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
eric_tian 2008-10-22 08:36:39 +00:00
parent 710a5b3584
commit 4df876adfb
36 changed files with 1362 additions and 139 deletions

View File

@ -85,6 +85,17 @@
X64/SetMem16.asm X64/SetMem16.asm
X64/SetMem.asm X64/SetMem.asm
X64/CopyMem.asm X64/CopyMem.asm
X64/ScanMem64.S
X64/ScanMem32.S
X64/ScanMem16.S
X64/ScanMem8.S
X64/CompareMem.S
X64/SetMem64.S
X64/SetMem32.S
X64/SetMem16.S
X64/ZeroMem.S
X64/SetMem.S
X64/CopyMem.S
[LibraryClasses] [LibraryClasses]

View File

@ -1,3 +1,6 @@
#
# ConvertAsm.py: Automatically generated from CompareMem.asm
#
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# #
# Copyright (c) 2006, Intel Corporation # Copyright (c) 2006, Intel Corporation
@ -11,7 +14,7 @@
# #
# Module Name: # Module Name:
# #
# CompareMem.Asm # CompareMem.S
# #
# Abstract: # Abstract:
# #
@ -29,6 +32,7 @@
# #
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# INTN # INTN
# EFIAPI # EFIAPI
@ -38,17 +42,19 @@
# IN UINTN Length # IN UINTN Length
# ); # );
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.global _InternalMemCompareMem; .intel_syntax noprefix
_InternalMemCompareMem: .globl ASM_PFX(InternalMemCompareMem)
push %rsi ASM_PFX(InternalMemCompareMem):
push %rdi push rsi
mov %rcx, %rsi push rdi
mov %rdx, %rdi mov rsi, rcx
mov %r8, %rcx mov rdi, rdx
mov rcx, r8
repe cmpsb repe cmpsb
movzbq -1(%rsi), %rax movzx rax, byte ptr [rsi - 1]
movzbq -1(%rdi), %rdx movzx rdx, byte ptr [rdi - 1]
sub %rdx, %rax sub rax, rdx
pop %rdi pop rdi
pop %rsi pop rsi
ret ret

View File

@ -1,3 +1,6 @@
#
# ConvertAsm.py: Automatically generated from CopyMem.asm
#
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# #
# Copyright (c) 2006, Intel Corporation # Copyright (c) 2006, Intel Corporation
@ -11,7 +14,7 @@
# #
# Module Name: # Module Name:
# #
# CopyMem.asm # CopyMem.S
# #
# Abstract: # Abstract:
# #
@ -23,50 +26,42 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# VOID * # VOID *
# EFIAPI # EFIAPI
# InternalMemCopyMem ( # InternalMemCopyMem (
# OUT VOID *DestinationBuffer, # IN VOID *Destination,
# IN CONST VOID *SourceBuffer, # IN VOID *Source,
# IN UINTN Length # IN UINTN Count
# ); # )
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.global _InternalMemCopyMem; .intel_syntax noprefix
_InternalMemCopyMem: .globl ASM_PFX(InternalMemCopyMem)
push %rsi ASM_PFX(InternalMemCopyMem):
push %rdi push rsi
mov %rdi, %rsi push rdi
mov %rcx, %rdi mov rsi, rdx # rsi <- Source
lea -1(%r8,%rsi,1),%r9 mov rdi, rcx # rdi <- Destination
cmp %rdi, %rsi lea r9, [rsi + r8 - 1] # r9 <- End of Source
mov %rdi, %rax cmp rsi, rdi
jae L1 mov rax, rdi # rax <- Destination as return value
cmp %rdi, %r9 jae _InternalMemCopyMem_al_0000
jae LCopyBackward # Copy backward if overlapped cmp r9, rdi
L1: jae _atSym_CopyBackward # Copy backward if overlapped
mov %r8, %rcx _InternalMemCopyMem_al_0000:
and $7, %r8 mov rcx, r8
shr $3, %rcx and r8, 7
jz LCopyBytes shr rcx, 3
movd %mm0, %r10 # (Save mm0 in r10) rep movsq # Copy as many Qwords as possible
L2: jmp _atSym_CopyBytes
movd (%rsi), %mm0 _atSym_CopyBackward:
movntq %mm0, (%rdi) mov rsi, r9 # rsi <- End of Source
add $8, %rsi lea rdi, [rdi + r8 - 1] # esi <- End of Destination
add $8, %rdi
loop L2
mfence
movd %r10, %mm0 #(Restore mm0)
jmp LCopyBytes
LCopyBackward:
mov %r9, %rsi
lea -1(%r8,%rdi,1),%rdi
std # set direction flag std # set direction flag
LCopyBytes: _atSym_CopyBytes:
mov %r8, %rcx mov rcx, r8
rep rep movsb # Copy bytes backward
movsb # Copy bytes backward
cld cld
pop %rdi pop rdi
pop %rsi pop rsi
ret ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem16.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# ScanMem16.S
#
# Abstract:
#
# ScanMem16 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem16 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT16 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem16)
ASM_PFX(InternalMemScanMem16):
push rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasw
lea rax, [rdi - 2]
cmovnz rax, rcx
pop rdi
ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem32.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# ScanMem32.S
#
# Abstract:
#
# ScanMem32 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem32 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT32 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem32)
ASM_PFX(InternalMemScanMem32):
push rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasd
lea rax, [rdi - 4]
cmovnz rax, rcx
pop rdi
ret

View File

@ -0,0 +1,56 @@
#
# ConvertAsm.py: Automatically generated from ScanMem64.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# ScanMem64.S
#
# Abstract:
#
# ScanMem64 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem64 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT64 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem64)
ASM_PFX(InternalMemScanMem64):
push rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasq
lea rax, [rdi - 8]
cmovnz rax, rcx
pop rdi
ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem8.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# ScanMem8.S
#
# Abstract:
#
# ScanMem8 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem8 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT8 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem8)
ASM_PFX(InternalMemScanMem8):
push rdi
mov rdi, rcx
mov rcx, rdx
mov rax, r8
repne scasb
lea rax, [rdi - 1]
cmovnz rax, rcx # set rax to 0 if not found
pop rdi
ret

View File

@ -0,0 +1,62 @@
#
# ConvertAsm.py: Automatically generated from SetMem.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# SetMem.S
#
# Abstract:
#
# SetMem function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemSetMem (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT8 Value
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem)
ASM_PFX(InternalMemSetMem):
push rdi
mov rax, r8
mov ah, al
movq mm0, rax
mov r8, rcx
mov rdi, r8 # rdi <- Buffer
mov rcx, rdx
and edx, 7
shr rcx, 3
jz L_SetBytes
pshufw mm0, mm0, 0x0
L0:
movntq [rdi], mm0
add rdi, 8
loop L0
mfence
L_SetBytes:
mov ecx, edx
rep stosb
mov rax, r8
pop rdi
ret

View File

@ -0,0 +1,61 @@
#
# ConvertAsm.py: Automatically generated from SetMem16.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# SetMem16.S
#
# Abstract:
#
# SetMem16 function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemSetMem16 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT16 Value
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem16)
ASM_PFX(InternalMemSetMem16):
push rdi
mov rax, r8
movq mm0, rax
mov r8, rcx
mov rdi, r8
mov rcx, rdx
and edx, 3
shr rcx, 2
jz L_SetWords
pshufw mm0, mm0, 0x0
L0:
movntq [rdi], mm0
add rdi, 8
loop L0
mfence
L_SetWords:
mov ecx, edx
rep stosw
mov rax, r8
pop rdi
ret

View File

@ -0,0 +1,56 @@
#
# ConvertAsm.py: Automatically generated from SetMem32.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# SetMem32.S
#
# Abstract:
#
# SetMem32 function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemSetMem32 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT32 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem32)
ASM_PFX(InternalMemSetMem32):
movq mm0, r8 # mm0 <- Value
mov rax, rcx # rax <- Buffer
xchg rcx, rdx # rcx <- Count rdx <- Buffer
shr rcx, 1 # rcx <- # of qwords to set
jz L_SetDwords
pshufw mm0, mm0, 0x44
L0:
movntq [rdx], mm0
lea rdx, [rdx + 8] # use "lea" to avoid flag changes
loop L0
mfence
L_SetDwords:
jnc L1
movd [rdx], mm0
L1:
ret

View File

@ -0,0 +1,48 @@
#
# ConvertAsm.py: Automatically generated from SetMem64.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# SetMem64.S
#
# Abstract:
#
# SetMem64 function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# InternalMemSetMem64 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT64 Value
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem64)
ASM_PFX(InternalMemSetMem64):
movq mm0, r8 #Value
mov rax, rcx #rax <- Buffer
xchg rcx, rdx #rcx <- Count
L0:
movntq [rdx], mm0
add rdx, 8
loop L0
mfence
ret

View File

@ -0,0 +1,58 @@
#
# ConvertAsm.py: Automatically generated from ZeroMem.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# ZeroMem.S
#
# Abstract:
#
# ZeroMem function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# InternalMemZeroMem (
# IN VOID *Buffer,
# IN UINTN Count
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemZeroMem)
ASM_PFX(InternalMemZeroMem):
push rdi
mov rdi, rcx
mov rcx, rdx
mov r8, rdi
and edx, 7
shr rcx, 3
jz L_ZeroBytes
pxor mm0, mm0
L0:
movntq [rdi], mm0
add rdi, 8
loop L0
mfence
L_ZeroBytes:
xor eax, eax
mov ecx, edx
rep stosb
mov rax, r8
pop rdi
ret

View File

@ -32,6 +32,18 @@
[Sources.common] [Sources.common]
MemLibInternals.h MemLibInternals.h
ScanMem64Wrapper.c
ScanMem32Wrapper.c
ScanMem16Wrapper.c
ScanMem8Wrapper.c
ZeroMemWrapper.c
CompareMemWrapper.c
SetMem64Wrapper.c
SetMem32Wrapper.c
SetMem16Wrapper.c
SetMemWrapper.c
CopyMemWrapper.c
MemLibGuid.c
[Sources.Ia32] [Sources.Ia32]
Ia32/ScanMem64.S Ia32/ScanMem64.S
@ -56,18 +68,6 @@
Ia32/SetMem16.asm Ia32/SetMem16.asm
Ia32/SetMem.asm Ia32/SetMem.asm
Ia32/CopyMem.asm Ia32/CopyMem.asm
ScanMem64Wrapper.c
ScanMem32Wrapper.c
ScanMem16Wrapper.c
ScanMem8Wrapper.c
ZeroMemWrapper.c
CompareMemWrapper.c
SetMem64Wrapper.c
SetMem32Wrapper.c
SetMem16Wrapper.c
SetMemWrapper.c
CopyMemWrapper.c
MemLibGuid.c
[Sources.X64] [Sources.X64]
X64/ScanMem64.S X64/ScanMem64.S
@ -92,19 +92,6 @@
X64/SetMem16.asm X64/SetMem16.asm
X64/SetMem.asm X64/SetMem.asm
X64/CopyMem.asm X64/CopyMem.asm
ScanMem64Wrapper.c
ScanMem32Wrapper.c
ScanMem16Wrapper.c
ScanMem8Wrapper.c
ZeroMemWrapper.c
CompareMemWrapper.c
SetMem64Wrapper.c
SetMem32Wrapper.c
SetMem16Wrapper.c
SetMemWrapper.c
CopyMemWrapper.c
MemLibGuid.c
[Packages] [Packages]
MdePkg/MdePkg.dec MdePkg/MdePkg.dec

View File

@ -42,9 +42,9 @@
# IN UINTN Length # IN UINTN Length
# ); # );
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.intel_syntax .intel_syntax noprefix
.globl _InternalMemCompareMem .globl ASM_PFX(InternalMemCompareMem)
_InternalMemCompareMem: ASM_PFX(InternalMemCompareMem):
push rsi push rsi
push rdi push rdi
mov rsi, rcx mov rsi, rcx

View File

@ -34,9 +34,9 @@
# IN UINTN Count # IN UINTN Count
# ) # )
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.intel_syntax .intel_syntax noprefix
.globl _InternalMemCopyMem .globl ASM_PFX(InternalMemCopyMem)
_InternalMemCopyMem: ASM_PFX(InternalMemCopyMem):
push rsi push rsi
push rdi push rdi
mov rsi, rdx # rsi <- Source mov rsi, rdx # rsi <- Source

View File

@ -42,9 +42,9 @@
# IN UINT16 Value # IN UINT16 Value
# ); # );
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.intel_syntax .intel_syntax noprefix
.globl _InternalMemScanMem16 .globl ASM_PFX(InternalMemScanMem16)
_InternalMemScanMem16: ASM_PFX(InternalMemScanMem16):
push rdi push rdi
mov rdi, rcx mov rdi, rcx
mov rax, r8 mov rax, r8

View File

@ -42,9 +42,9 @@
# IN UINT32 Value # IN UINT32 Value
# ); # );
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.intel_syntax .intel_syntax noprefix
.globl _InternalMemScanMem32 .globl ASM_PFX(InternalMemScanMem32)
_InternalMemScanMem32: ASM_PFX(InternalMemScanMem32):
push rdi push rdi
mov rdi, rcx mov rdi, rcx
mov rax, r8 mov rax, r8

View File

@ -42,9 +42,9 @@
# IN UINT64 Value # IN UINT64 Value
# ); # );
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.intel_syntax .intel_syntax noprefix
.globl _InternalMemScanMem64 .globl ASM_PFX(InternalMemScanMem64)
_InternalMemScanMem64: ASM_PFX(InternalMemScanMem64):
push rdi push rdi
mov rdi, rcx mov rdi, rcx
mov rax, r8 mov rax, r8

View File

@ -42,9 +42,9 @@
# IN UINT8 Value # IN UINT8 Value
# ); # );
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.intel_syntax .intel_syntax noprefix
.globl _InternalMemScanMem8 .globl ASM_PFX(InternalMemScanMem8)
_InternalMemScanMem8: ASM_PFX(InternalMemScanMem8):
push rdi push rdi
mov rdi, rcx mov rdi, rcx
mov rcx, rdx mov rcx, rdx

View File

@ -34,9 +34,9 @@
# IN UINT8 Value # IN UINT8 Value
# ) # )
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.intel_syntax .intel_syntax noprefix
.globl _InternalMemSetMem .globl ASM_PFX(InternalMemSetMem)
_InternalMemSetMem: ASM_PFX(InternalMemSetMem):
push rdi push rdi
mov rax, r8 # rax = Value mov rax, r8 # rax = Value
mov rdi, rcx # rdi = Buffer mov rdi, rcx # rdi = Buffer

View File

@ -34,9 +34,9 @@
# IN UINT16 Value # IN UINT16 Value
# ) # )
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.intel_syntax .intel_syntax noprefix
.globl _InternalMemSetMem16 .globl ASM_PFX(InternalMemSetMem16)
_InternalMemSetMem16: ASM_PFX(InternalMemSetMem16):
push rdi push rdi
mov rdi, rcx mov rdi, rcx
mov rax, r8 mov rax, r8

View File

@ -34,9 +34,9 @@
# IN UINT32 Value # IN UINT32 Value
# ); # );
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.intel_syntax .intel_syntax noprefix
.globl _InternalMemSetMem32 .globl ASM_PFX(InternalMemSetMem32)
_InternalMemSetMem32: ASM_PFX(InternalMemSetMem32):
push rdi push rdi
mov rdi, rcx mov rdi, rcx
mov rax, r8 mov rax, r8

View File

@ -33,9 +33,9 @@
# IN UINT64 Value # IN UINT64 Value
# ) # )
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.intel_syntax .intel_syntax noprefix
.globl _InternalMemSetMem64 .globl ASM_PFX(InternalMemSetMem64)
_InternalMemSetMem64: ASM_PFX(InternalMemSetMem64):
push rdi push rdi
mov rdi, rcx mov rdi, rcx
mov rax, r8 mov rax, r8

View File

@ -32,9 +32,9 @@
# IN UINTN Count # IN UINTN Count
# ); # );
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.intel_syntax .intel_syntax noprefix
.globl _InternalMemZeroMem .globl ASM_PFX(InternalMemZeroMem)
_InternalMemZeroMem: ASM_PFX(InternalMemZeroMem):
push rdi push rdi
push rcx push rcx
xor rax, rax xor rax, rax

View File

@ -32,6 +32,18 @@
[Sources.common] [Sources.common]
MemLibInternals.h MemLibInternals.h
ScanMem64Wrapper.c
ScanMem32Wrapper.c
ScanMem16Wrapper.c
ScanMem8Wrapper.c
ZeroMemWrapper.c
CompareMemWrapper.c
SetMem64Wrapper.c
SetMem32Wrapper.c
SetMem16Wrapper.c
SetMemWrapper.c
CopyMemWrapper.c
MemLibGuid.c
[Sources.Ia32] [Sources.Ia32]
Ia32/ScanMem64.S Ia32/ScanMem64.S
@ -56,18 +68,6 @@
Ia32/SetMem16.asm Ia32/SetMem16.asm
Ia32/SetMem.asm Ia32/SetMem.asm
Ia32/CopyMem.asm Ia32/CopyMem.asm
ScanMem64Wrapper.c
ScanMem32Wrapper.c
ScanMem16Wrapper.c
ScanMem8Wrapper.c
ZeroMemWrapper.c
CompareMemWrapper.c
SetMem64Wrapper.c
SetMem32Wrapper.c
SetMem16Wrapper.c
SetMemWrapper.c
CopyMemWrapper.c
MemLibGuid.c
[Sources.X64] [Sources.X64]
X64/ScanMem64.asm X64/ScanMem64.asm
@ -81,18 +81,17 @@
X64/SetMem16.asm X64/SetMem16.asm
X64/SetMem.asm X64/SetMem.asm
X64/CopyMem.asm X64/CopyMem.asm
ScanMem64Wrapper.c X64/ScanMem64.S
ScanMem32Wrapper.c X64/ScanMem32.S
ScanMem16Wrapper.c X64/ScanMem16.S
ScanMem8Wrapper.c X64/ScanMem8.S
ZeroMemWrapper.c X64/CompareMem.S
CompareMemWrapper.c X64/ZeroMem.S
SetMem64Wrapper.c X64/SetMem64.S
SetMem32Wrapper.c X64/SetMem32.S
SetMem16Wrapper.c X64/SetMem16.S
SetMemWrapper.c X64/SetMem.S
CopyMemWrapper.c X64/CopyMem.S
MemLibGuid.c
[Packages] [Packages]
MdePkg/MdePkg.dec MdePkg/MdePkg.dec

View File

@ -0,0 +1,60 @@
#
# ConvertAsm.py: Automatically generated from CompareMem.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# CompareMem.S
#
# Abstract:
#
# CompareMem function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# INTN
# EFIAPI
# InternalMemCompareMem (
# IN CONST VOID *DestinationBuffer,
# IN CONST VOID *SourceBuffer,
# IN UINTN Length
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemCompareMem)
ASM_PFX(InternalMemCompareMem):
push rsi
push rdi
mov rsi, rcx
mov rdi, rdx
mov rcx, r8
repe cmpsb
movzx rax, byte ptr [rsi - 1]
movzx rdx, byte ptr [rdi - 1]
sub rax, rdx
pop rdi
pop rsi
ret

View File

@ -0,0 +1,84 @@
#
# ConvertAsm.py: Automatically generated from CopyMem.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# CopyMem.S
#
# Abstract:
#
# CopyMem function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemCopyMem (
# IN VOID *Destination,
# IN VOID *Source,
# IN UINTN Count
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemCopyMem)
ASM_PFX(InternalMemCopyMem):
push rsi
push rdi
mov rsi, rdx # rsi <- Source
mov rdi, rcx # rdi <- Destination
lea r9, [rsi + r8 - 1] # r9 <- Last byte of Source
cmp rsi, rdi
mov rax, rdi # rax <- Destination as return value
jae _InternalMemCopyMem_al_0000 # Copy forward if Source > Destination
cmp r9, rdi # Overlapped?
jae _atSym_CopyBackward # Copy backward if overlapped
_InternalMemCopyMem_al_0000:
xor rcx, rcx
sub rcx, rdi # rcx <- -rdi
and rcx, 15 # rcx + rsi should be 16 bytes aligned
jz _InternalMemCopyMem_al_0001 # skip if rcx == 0
cmp rcx, r8
cmova rcx, r8
sub r8, rcx
rep movsb
_InternalMemCopyMem_al_0001:
mov rcx, r8
and r8, 15
shr rcx, 4 # rcx <- # of DQwords to copy
jz _atSym_CopyBytes
movdqa [rsp + 0x18], xmm0 # save xmm0 on stack
_InternalMemCopyMem_al_0002:
movdqu xmm0, [rsi] # rsi may not be 16-byte aligned
movntdq [rdi], xmm0 # rdi should be 16-byte aligned
add rsi, 16
add rdi, 16
loop _InternalMemCopyMem_al_0002
mfence
movdqa xmm0, [rsp + 0x18] # restore xmm0
jmp _atSym_CopyBytes # copy remaining bytes
_atSym_CopyBackward:
mov rsi, r9 # rsi <- Last byte of Source
lea rdi, [rdi + r8 - 1] # rdi <- Last byte of Destination
std
_atSym_CopyBytes:
mov rcx, r8
rep movsb
cld
pop rdi
pop rsi
ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem16.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# ScanMem16.S
#
# Abstract:
#
# ScanMem16 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem16 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT16 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem16)
ASM_PFX(InternalMemScanMem16):
push rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasw
lea rax, [rdi - 2]
cmovnz rax, rcx
pop rdi
ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem32.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# ScanMem32.S
#
# Abstract:
#
# ScanMem32 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem32 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT32 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem32)
ASM_PFX(InternalMemScanMem32):
push rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasd
lea rax, [rdi - 4]
cmovnz rax, rcx
pop rdi
ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem64.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# ScanMem64.S
#
# Abstract:
#
# ScanMem64 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem64 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT64 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem64)
ASM_PFX(InternalMemScanMem64):
push rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasq
lea rax, [rdi - 8]
cmovnz rax, rcx
pop rdi
ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem8.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# ScanMem8.S
#
# Abstract:
#
# ScanMem8 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem8 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT8 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem8)
ASM_PFX(InternalMemScanMem8):
push rdi
mov rdi, rcx
mov rcx, rdx
mov rax, r8
repne scasb
lea rax, [rdi - 1]
cmovnz rax, rcx # set rax to 0 if not found
pop rdi
ret

View File

@ -0,0 +1,73 @@
#
# ConvertAsm.py: Automatically generated from SetMem.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# SetMem.S
#
# Abstract:
#
# SetMem function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemSetMem (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT8 Value
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem)
ASM_PFX(InternalMemSetMem):
push rdi
mov rdi, rcx # rdi <- Buffer
mov al, r8b # al <- Value
mov r9, rdi # r9 <- Buffer as return value
xor rcx, rcx
sub rcx, rdi
and rcx, 15 # rcx + rdi aligns on 16-byte boundary
jz L0
cmp rcx, rdx
cmova rcx, rdx
sub rdx, rcx
rep stosb
L0:
mov rcx, rdx
and rdx, 15
shr rcx, 4
jz _SetBytes_L2
mov ah, al # ax <- Value repeats twice
movdqa [rsp + 0x10], xmm0 # save xmm0
movd xmm0, eax # xmm0[0..16] <- Value repeats twice
pshuflw xmm0, xmm0, 0 # xmm0[0..63] <- Value repeats 8 times
movlhps xmm0, xmm0 # xmm0 <- Value repeats 16 times
L1:
movntdq [rdi], xmm0 # rdi should be 16-byte aligned
add rdi, 16
loop L1
mfence
movdqa xmm0, [rsp + 0x10] # restore xmm0
_SetBytes_L2:
mov ecx, edx # high 32 bits of rcx are always zero
rep stosb
mov rax, r9 # rax <- Return value
pop rdi
ret

View File

@ -0,0 +1,71 @@
#
# ConvertAsm.py: Automatically generated from SetMem16.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# SetMem16.S
#
# Abstract:
#
# SetMem16 function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemSetMem16 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT16 Value
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem16)
ASM_PFX(InternalMemSetMem16):
push rdi
mov rdi, rcx
mov r9, rdi
xor rcx, rcx
sub rcx, rdi
and rcx, 15
mov rax, r8
jz L0
shr rcx, 1
cmp rcx, rdx
cmova rcx, rdx
sub rdx, rcx
rep stosw
L0:
mov rcx, rdx
and edx, 7
shr rcx, 3
jz _SetWords_L2
movd xmm0, eax
pshuflw xmm0, xmm0, 0
movlhps xmm0, xmm0
L1:
movntdq [rdi], xmm0
add rdi, 16
loop L1
mfence
_SetWords_L2:
mov ecx, edx
rep stosw
mov rax, r9
pop rdi
ret

View File

@ -0,0 +1,70 @@
#
# ConvertAsm.py: Automatically generated from SetMem32.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# SetMem32.S
#
# Abstract:
#
# SetMem32 function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemSetMem32 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT32 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem32)
ASM_PFX(InternalMemSetMem32):
push rdi
mov rdi, rcx
mov r9, rdi
xor rcx, rcx
sub rcx, rdi
and rcx, 15
mov rax, r8
jz L0
shr rcx, 2
cmp rcx, rdx
cmova rcx, rdx
sub rdx, rcx
rep stosd
L0:
mov rcx, rdx
and edx, 3
shr rcx, 2
jz _SetDwords_L2
movd xmm0, eax
pshufd xmm0, xmm0, 0
L1:
movntdq [rdi], xmm0
add rdi, 16
loop L1
mfence
_SetDwords_L2:
mov ecx, edx
rep stosd
mov rax, r9
pop rdi
ret

View File

@ -0,0 +1,61 @@
#
# ConvertAsm.py: Automatically generated from SetMem64.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# SetMem64.S
#
# Abstract:
#
# SetMem64 function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# InternalMemSetMem64 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT64 Value
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem64)
ASM_PFX(InternalMemSetMem64):
mov rax, rcx # rax <- Buffer
xchg rcx, rdx # rcx <- Count & rdx <- Buffer
test dl, 8
movq xmm0, r8
jz L0
mov [rdx], r8
add rdx, 8
dec rcx
L0:
shr rcx, 1
jz _SetQwords_L2
movlhps xmm0, xmm0
L1:
movntdq [rdx], xmm0
lea rdx, [rdx + 16]
loop L1
mfence
_SetQwords_L2:
jnc L2
mov [rdx], r8
L2:
ret

View File

@ -0,0 +1,66 @@
#
# ConvertAsm.py: Automatically generated from ZeroMem.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# ZeroMem.S
#
# Abstract:
#
# ZeroMem function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# InternalMemZeroMem (
# IN VOID *Buffer,
# IN UINTN Count
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemZeroMem)
ASM_PFX(InternalMemZeroMem):
push rdi
mov rdi, rcx
xor rcx, rcx
xor eax, eax
sub rcx, rdi
and rcx, 15
mov r8, rdi
jz L0
cmp rcx, rdx
cmova rcx, rdx
sub rdx, rcx
rep stosb
L0:
mov rcx, rdx
and edx, 15
shr rcx, 4
jz _ZeroBytes_L2
pxor xmm0, xmm0
L1:
movntdq [rdi], xmm0 # rdi should be 16-byte aligned
add rdi, 16
loop L1
mfence
_ZeroBytes_L2:
mov ecx, edx
rep stosb
mov rax, r8
pop rdi
ret