As reported by Vishal, CompareGuid() is a hotspot, and switching from BaseMemoryLibStm in ArmPkg/ to BaseMemoryLibOptDxe causes a noticeable performance regression due to the fact that BaseMemoryLibOptDxe uses unaligned accessors explicitly to implement CompareGuid() and the related functions. Since BaseMemoryLibOptDxe on ARM and AARCH64 can only be used in contexts where unaligned accesses are allowed, reimplement these functions for ARM and AARCH64 specifically, using wide accessors that can tolerate any misalignment. Reported-by: "Oliyil Kunnil, Vishal" <vishalo@qti.qualcomm.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reviewed-by: Liming Gao <liming.gao@intel.com>
175 lines
4.1 KiB
INI
175 lines
4.1 KiB
INI
## @file
|
|
# Instance of Base Memory Library optimized for use in DXE phase.
|
|
#
|
|
# Base Memory Library that is optimized for use in DXE phase.
|
|
# Uses REP, MMX, XMM registers as required for best performance.
|
|
#
|
|
# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
|
|
#
|
|
# 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.
|
|
#
|
|
#
|
|
##
|
|
|
|
[Defines]
|
|
INF_VERSION = 0x00010005
|
|
BASE_NAME = BaseMemoryLibOptDxe
|
|
MODULE_UNI_FILE = BaseMemoryLibOptDxe.uni
|
|
FILE_GUID = 02BD55C2-AB1D-4b75-B0FD-9A63AE09B31D
|
|
MODULE_TYPE = BASE
|
|
VERSION_STRING = 1.0
|
|
LIBRARY_CLASS = BaseMemoryLib
|
|
|
|
|
|
#
|
|
# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64
|
|
#
|
|
|
|
[Sources]
|
|
MemLibInternals.h
|
|
|
|
[Sources.Ia32]
|
|
Ia32/ScanMem64.nasm
|
|
Ia32/ScanMem64.S
|
|
Ia32/ScanMem32.nasm
|
|
Ia32/ScanMem32.S
|
|
Ia32/ScanMem16.nasm
|
|
Ia32/ScanMem16.S
|
|
Ia32/ScanMem8.nasm
|
|
Ia32/ScanMem8.S
|
|
Ia32/CompareMem.nasm
|
|
Ia32/CompareMem.S
|
|
Ia32/ZeroMem.nasm
|
|
Ia32/ZeroMem.S
|
|
Ia32/SetMem64.nasm
|
|
Ia32/SetMem64.S
|
|
Ia32/SetMem32.nasm
|
|
Ia32/SetMem32.S
|
|
Ia32/SetMem16.nasm
|
|
Ia32/SetMem16.S
|
|
Ia32/SetMem.nasm
|
|
Ia32/SetMem.S
|
|
Ia32/CopyMem.nasm
|
|
Ia32/CopyMem.S
|
|
Ia32/ScanMem64.nasm
|
|
Ia32/ScanMem64.asm
|
|
Ia32/ScanMem32.nasm
|
|
Ia32/ScanMem32.asm
|
|
Ia32/ScanMem16.nasm
|
|
Ia32/ScanMem16.asm
|
|
Ia32/ScanMem8.nasm
|
|
Ia32/ScanMem8.asm
|
|
Ia32/CompareMem.nasm
|
|
Ia32/CompareMem.asm
|
|
Ia32/ZeroMem.nasm
|
|
Ia32/ZeroMem.asm
|
|
Ia32/SetMem64.nasm
|
|
Ia32/SetMem64.asm
|
|
Ia32/SetMem32.nasm
|
|
Ia32/SetMem32.asm
|
|
Ia32/SetMem16.nasm
|
|
Ia32/SetMem16.asm
|
|
Ia32/SetMem.nasm
|
|
Ia32/SetMem.asm
|
|
Ia32/CopyMem.nasm
|
|
Ia32/CopyMem.asm
|
|
Ia32/IsZeroBuffer.nasm
|
|
MemLibGuid.c
|
|
|
|
[Sources.X64]
|
|
X64/ScanMem64.nasm
|
|
X64/ScanMem64.asm
|
|
X64/ScanMem64.S
|
|
X64/ScanMem32.nasm
|
|
X64/ScanMem32.asm
|
|
X64/ScanMem32.S
|
|
X64/ScanMem16.nasm
|
|
X64/ScanMem16.asm
|
|
X64/ScanMem16.S
|
|
X64/ScanMem8.nasm
|
|
X64/ScanMem8.asm
|
|
X64/ScanMem8.S
|
|
X64/CompareMem.nasm
|
|
X64/CompareMem.asm
|
|
X64/CompareMem.S
|
|
X64/ZeroMem.nasm
|
|
X64/ZeroMem.asm
|
|
X64/ZeroMem.S
|
|
X64/SetMem64.nasm
|
|
X64/SetMem64.asm
|
|
X64/SetMem64.S
|
|
X64/SetMem32.nasm
|
|
X64/SetMem32.asm
|
|
X64/SetMem32.S
|
|
X64/SetMem16.nasm
|
|
X64/SetMem16.asm
|
|
X64/SetMem16.S
|
|
X64/SetMem.nasm
|
|
X64/SetMem.asm
|
|
X64/SetMem.S
|
|
X64/CopyMem.nasm
|
|
X64/CopyMem.asm
|
|
X64/CopyMem.S
|
|
X64/IsZeroBuffer.nasm
|
|
MemLibGuid.c
|
|
|
|
[Defines.ARM, Defines.AARCH64]
|
|
#
|
|
# The ARM implementations of this library may perform unaligned accesses, and
|
|
# may use DC ZVA instructions that are only allowed when the MMU and D-cache
|
|
# are on. Since SEC, PEI_CORE and PEIM modules may execute with the MMU off,
|
|
# omit them from the supported module types list for this library.
|
|
#
|
|
LIBRARY_CLASS = BaseMemoryLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER UEFI_APPLICATION
|
|
|
|
[Sources.ARM]
|
|
Arm/ScanMem.S |GCC
|
|
Arm/SetMem.S |GCC
|
|
Arm/CopyMem.S |GCC
|
|
Arm/CompareMem.S |GCC
|
|
Arm/CompareGuid.S |GCC
|
|
|
|
Arm/ScanMem.asm |RVCT
|
|
Arm/SetMem.asm |RVCT
|
|
Arm/CopyMem.asm |RVCT
|
|
Arm/CompareMem.asm |RVCT
|
|
Arm/CompareGuid.asm |RVCT
|
|
|
|
[Sources.AARCH64]
|
|
AArch64/ScanMem.S
|
|
AArch64/SetMem.S
|
|
AArch64/CopyMem.S
|
|
AArch64/CompareMem.S
|
|
AArch64/CompareGuid.S
|
|
|
|
[Sources.ARM, Sources.AARCH64]
|
|
Arm/ScanMemGeneric.c
|
|
Arm/MemLibGuid.c
|
|
|
|
[Sources]
|
|
ScanMem64Wrapper.c
|
|
ScanMem32Wrapper.c
|
|
ScanMem16Wrapper.c
|
|
ScanMem8Wrapper.c
|
|
ZeroMemWrapper.c
|
|
CompareMemWrapper.c
|
|
SetMem64Wrapper.c
|
|
SetMem32Wrapper.c
|
|
SetMem16Wrapper.c
|
|
SetMemWrapper.c
|
|
CopyMemWrapper.c
|
|
IsZeroBufferWrapper.c
|
|
|
|
[Packages]
|
|
MdePkg/MdePkg.dec
|
|
|
|
[LibraryClasses]
|
|
DebugLib
|
|
BaseLib
|
|
|