From 878ddf1fc3540a715f63594ed22b6929e881afb4 Mon Sep 17 00:00:00 2001 From: bbahnsen Date: Fri, 21 Apr 2006 22:54:32 +0000 Subject: Initial import. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524 --- .../BaseMemoryLibSse2/BaseMemoryLibSse2.mbd | 29 + .../BaseMemoryLibSse2/BaseMemoryLibSse2.msa | 73 +++ MdePkg/Library/BaseMemoryLibSse2/MemLibGuid.c | 131 +++++ MdePkg/Library/BaseMemoryLibSse2/MemLibWrapper.c | 620 +++++++++++++++++++++ MdePkg/Library/BaseMemoryLibSse2/build.xml | 47 ++ .../Library/BaseMemoryLibSse2/ia32/CompareMem.asm | 46 ++ MdePkg/Library/BaseMemoryLibSse2/ia32/CopyMem.asm | 84 +++ .../Library/BaseMemoryLibSse2/ia32/ScanMem16.asm | 44 ++ .../Library/BaseMemoryLibSse2/ia32/ScanMem32.asm | 44 ++ .../Library/BaseMemoryLibSse2/ia32/ScanMem64.asm | 53 ++ MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem8.asm | 44 ++ MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem.asm | 74 +++ MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem16.asm | 70 +++ MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem32.asm | 69 +++ MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem64.asm | 63 +++ MdePkg/Library/BaseMemoryLibSse2/ia32/ZeroMem.asm | 66 +++ .../Library/BaseMemoryLibSse2/x64/CompareMem.asm | 43 ++ MdePkg/Library/BaseMemoryLibSse2/x64/CopyMem.asm | 78 +++ MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem16.asm | 42 ++ MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem32.asm | 42 ++ MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem64.asm | 42 ++ MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem8.asm | 42 ++ MdePkg/Library/BaseMemoryLibSse2/x64/SetMem.asm | 69 +++ MdePkg/Library/BaseMemoryLibSse2/x64/SetMem16.asm | 67 +++ MdePkg/Library/BaseMemoryLibSse2/x64/SetMem32.asm | 66 +++ MdePkg/Library/BaseMemoryLibSse2/x64/SetMem64.asm | 61 ++ MdePkg/Library/BaseMemoryLibSse2/x64/ZeroMem.asm | 63 +++ 27 files changed, 2172 insertions(+) create mode 100644 MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.mbd create mode 100644 MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.msa create mode 100644 MdePkg/Library/BaseMemoryLibSse2/MemLibGuid.c create mode 100644 MdePkg/Library/BaseMemoryLibSse2/MemLibWrapper.c create mode 100644 MdePkg/Library/BaseMemoryLibSse2/build.xml create mode 100644 MdePkg/Library/BaseMemoryLibSse2/ia32/CompareMem.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/ia32/CopyMem.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem16.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem32.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem64.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem8.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem16.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem32.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem64.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/ia32/ZeroMem.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/CompareMem.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/CopyMem.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem16.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem32.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem64.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem8.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/SetMem.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/SetMem16.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/SetMem32.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/SetMem64.asm create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/ZeroMem.asm (limited to 'MdePkg/Library/BaseMemoryLibSse2') diff --git a/MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.mbd b/MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.mbd new file mode 100644 index 0000000000..346968572a --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.mbd @@ -0,0 +1,29 @@ + + + + + BaseMemoryLibSse2 + 65a18235-5096-4032-8c63-214f0249ce8d + EDK_RELEASE_VERSION 0x00090000 + FIX ME! + 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. + + 2006-04-12 13:46 + + diff --git a/MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.msa b/MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.msa new file mode 100644 index 0000000000..6336f58b85 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.msa @@ -0,0 +1,73 @@ + + + + + BaseMemoryLibSse2 + BASE + LIBRARY + 65a18235-5096-4032-8c63-214f0249ce8d + EDK_RELEASE_VERSION 0x00090000 + Memory-only library functions with no library constructor/destructor + FIX ME! + 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. + + EFI_SPECIFICATION_VERSION 0x00000000 + 2006-04-12 13:46 + + + BaseMemoryLib + BaseLib + DebugLib + + + + MemLibGuid.c + MemLibWrapper.c + Ia32\CopyMem.asm + Ia32\SetMem.asm + Ia32\SetMem16.asm + Ia32\SetMem32.asm + Ia32\SetMem64.asm + Ia32\ZeroMem.asm + Ia32\CompareMem.asm + Ia32\ScanMem8.asm + Ia32\ScanMem16.asm + Ia32\ScanMem32.asm + Ia32\ScanMem64.asm + + + MemLibGuid.c + MemLibWrapper.c + x64\CopyMem.asm + x64\SetMem.asm + x64\SetMem16.asm + x64\SetMem32.asm + x64\SetMem64.asm + x64\ZeroMem.asm + x64\CompareMem.asm + x64\ScanMem8.asm + x64\ScanMem16.asm + x64\ScanMem32.asm + x64\ScanMem64.asm + + + + MdePkg + + diff --git a/MdePkg/Library/BaseMemoryLibSse2/MemLibGuid.c b/MdePkg/Library/BaseMemoryLibSse2/MemLibGuid.c new file mode 100644 index 0000000000..06b2721c64 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/MemLibGuid.c @@ -0,0 +1,131 @@ +/** @file + Implementation of GUID functions. + + 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: MemLibGuid.c + + The following BaseMemoryLib instances share the same version of this file: + + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + PeiMemoryLib + UefiMemoryLib + +**/ + +/** + This function copies a source GUID to a destination GUID. + + This function copies the contents of the 128-bit GUID specified by SourceGuid + to DestinationGuid, and returns DestinationGuid. + + If DestinationGuid is NULL, then ASSERT(). + If SourceGuid is NULL, then ASSERT(). + + @param DestinationGuid Pointer to the destination GUID. + @param SourceGuid Pointer to the source GUID. + + @return DestinationGuid + +**/ +GUID * +EFIAPI +CopyGuid ( + OUT GUID *DestinationGuid, + IN CONST GUID *SourceGuid + ) +{ + WriteUnaligned64 ( + (UINT64*)DestinationGuid, + ReadUnaligned64 ((CONST UINT64*)SourceGuid) + ); + WriteUnaligned64 ( + (UINT64*)DestinationGuid + 1, + ReadUnaligned64 ((CONST UINT64*)SourceGuid + 1) + ); + return DestinationGuid; +} + +/** + Compares two GUIDs + + This function compares Guid1 to Guid2. If the GUIDs are identical then TRUE + is returned. If there are any bit differences in the two GUIDs, then FALSE is + returned. + + If Guid1 is NULL, then ASSERT(). + If Guid2 is NULL, then ASSERT(). + + @param Guid1 guid to compare + @param Guid2 guid to compare + + @retval TRUE if Guid1 == Guid2 + @retval FALSE if Guid1 != Guid2 + +**/ +BOOLEAN +EFIAPI +CompareGuid ( + IN CONST GUID *Guid1, + IN CONST GUID *Guid2 + ) +{ + return (BOOLEAN)( + ReadUnaligned64 ((CONST UINT64*)Guid1) + == ReadUnaligned64 ((CONST UINT64*)Guid2) && + ReadUnaligned64 ((CONST UINT64*)Guid1 + 1) + == ReadUnaligned64 ((CONST UINT64*)Guid2 + 1) + ); +} + +/** + Scans a target buffer for a GUID, and returns a pointer to the matching GUID + in the target buffer. + + This function searches target the buffer specified by Buffer and Length from + the lowest address to the highest address at 128-bit increments for the + 128-bit GUID value that matches Guid. If a match is found, then a pointer to + the matching GUID in the target buffer is returned. If no match is found, + then NULL is returned. If Length is 0, then NULL is returned. + + If Buffer is NULL, then ASSERT(). + If Buffer is not aligned on a 64-bit boundary, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param Buffer Pointer to the target buffer to scan. + @param Length Number of bytes in Buffer to scan. + @param Guid Value to search for in the target buffer. + + @return Pointer to the first occurrence. + @retval NULL if Length == 0 or Guid was not found. +**/ +VOID * +EFIAPI +ScanGuid ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN CONST GUID *Guid + ) +{ + CONST GUID *GuidPtr; + + GuidPtr = (GUID*)Buffer; + Buffer = GuidPtr + Length / sizeof (*GuidPtr); + while (GuidPtr < (CONST GUID*)Buffer) { + if (CompareGuid (GuidPtr, Guid)) { + return (VOID*)GuidPtr; + } + GuidPtr++; + } + return NULL; +} diff --git a/MdePkg/Library/BaseMemoryLibSse2/MemLibWrapper.c b/MdePkg/Library/BaseMemoryLibSse2/MemLibWrapper.c new file mode 100644 index 0000000000..2ef0766242 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/MemLibWrapper.c @@ -0,0 +1,620 @@ +/** @file + Wrapper functions for Base Memory Library. + + 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: MemLibWrapper.c + + The following BaseMemoryLib instances share the same version of this file: + + BaseMemoryLib + BaseMemoryLibMmx + BaseMemoryLibSse2 + BaseMemoryLibRepStr + PeiMemoryLib + UefiMemoryLib + +**/ + +/** + Copy Length bytes from Source to Destination. + + @param Destination Target of copy + @param Source Place to copy from + @param Length Number of bytes to copy + + @return Destination + +**/ +VOID * +EFIAPI +InternalMemCopyMem ( + OUT VOID *DestinationBuffer, + IN CONST VOID *SourceBuffer, + IN UINTN Length + ); + +/** + Set Buffer to Value for Size bytes. + + @param Buffer Memory to set. + @param Size Number of bytes to set + @param Value Value of the set operation. + + @return Buffer + +**/ +VOID * +EFIAPI +InternalMemSetMem ( + OUT VOID *Buffer, + IN UINTN Length, + IN UINT8 Value + ); + +/** + Fills a target buffer with a 16-bit value, and returns the target buffer. + + @param Buffer Pointer to the target buffer to fill. + @param Length Number of bytes in Buffer to fill. + @param Value Value with which to fill Length bytes of Buffer. + + @return Buffer + +**/ +VOID * +EFIAPI +InternalMemSetMem16 ( + OUT VOID *Buffer, + IN UINTN Length, + IN UINT16 Value + ); + +/** + Fills a target buffer with a 32-bit value, and returns the target buffer. + + @param Buffer Pointer to the target buffer to fill. + @param Length Number of bytes in Buffer to fill. + @param Value Value with which to fill Length bytes of Buffer. + + @return Buffer + +**/ +VOID * +EFIAPI +InternalMemSetMem32 ( + OUT VOID *Buffer, + IN UINTN Length, + IN UINT32 Value + ); + +/** + Fills a target buffer with a 64-bit value, and returns the target buffer. + + @param Buffer Pointer to the target buffer to fill. + @param Length Number of bytes in Buffer to fill. + @param Value Value with which to fill Length bytes of Buffer. + + @return Buffer + +**/ +VOID * +EFIAPI +InternalMemSetMem64 ( + OUT VOID *Buffer, + IN UINTN Length, + IN UINT64 Value + ); + +/** + Set Buffer to 0 for Size bytes. + + @param Buffer Memory to set. + @param Size Number of bytes to set + + @return Buffer + +**/ +VOID * +EFIAPI +InternalMemZeroMem ( + OUT VOID *Buffer, + IN UINTN Length + ); + +/** + Compares two memory buffers of a given length. + + @param DestinationBuffer First memory buffer + @param SourceBuffer Second memory buffer + @param Length Length of DestinationBuffer and SourceBuffer memory + regions to compare. Must be non-zero. + + @retval 0 if MemOne == MemTwo + +**/ +INTN +EFIAPI +InternalMemCompareMem ( + IN CONST VOID *DestinationBuffer, + IN CONST VOID *SourceBuffer, + IN UINTN Length + ); + +/** + Scans a target buffer for an 8-bit value, and returns a pointer to the + matching 8-bit value in the target buffer. + + @param Buffer Pointer to the target buffer to scan. + @param Length Number of bytes in Buffer to scan. Must be non-zero. + @param Value Value to search for in the target buffer. + + @return Pointer to the first occurrence or NULL if not found. + +**/ +CONST VOID * +EFIAPI +InternalMemScanMem8 ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINT8 Value + ); + +/** + Scans a target buffer for a 16-bit value, and returns a pointer to the + matching 16-bit value in the target buffer. + + @param Buffer Pointer to the target buffer to scan. + @param Length Number of bytes in Buffer to scan. Must be non-zero. + @param Value Value to search for in the target buffer. + + @return Pointer to the first occurrence or NULL if not found. + +**/ +CONST VOID * +EFIAPI +InternalMemScanMem16 ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINT16 Value + ); + +/** + Scans a target buffer for a 32-bit value, and returns a pointer to the + matching 32-bit value in the target buffer. + + @param Buffer Pointer to the target buffer to scan. + @param Length Number of bytes in Buffer to scan. Must be non-zero. + @param Value Value to search for in the target buffer. + + @return Pointer to the first occurrence or NULL if not found. + +**/ +CONST VOID * +EFIAPI +InternalMemScanMem32 ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINT32 Value + ); + +/** + Scans a target buffer for a 64-bit value, and returns a pointer to the + matching 64-bit value in the target buffer. + + @param Buffer Pointer to the target buffer to scan. + @param Length Number of bytes in Buffer to scan. Must be non-zero. + @param Value Value to search for in the target buffer. + + @return Pointer to the first occurrence or NULL if not found. + +**/ +CONST VOID * +EFIAPI +InternalMemScanMem64 ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINT64 Value + ); + +/** + Copy Length bytes from Source to Destination. + + This function copies Length bytes from SourceBuffer to DestinationBuffer, and + returns DestinationBuffer. The implementation must be reentrant, and it must + handle the case where SourceBuffer overlaps DestinationBuffer. + + If Length is greater than (MAX_ADDRESS - DestinationBuffer + 1), then + ASSERT(). + If Length is greater than (MAX_ADDRESS - SourceBuffer + 1), then ASSERT(). + + @param Destination Target of copy + @param Source Place to copy from + @param Length Number of bytes to copy + + @return Destination + +**/ +VOID * +EFIAPI +CopyMem ( + OUT VOID *Destination, + IN CONST VOID *Source, + IN UINTN Length + ) +{ + ASSERT (Length <= MAX_ADDRESS - (UINTN)Destination + 1); + ASSERT (Length <= MAX_ADDRESS - (UINTN)Source + 1); + return InternalMemCopyMem (Destination, Source, Length); +} + +/** + Set Buffer to Value for Size bytes. + + This function fills Length bytes of Buffer with Value, and returns Buffer. + + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param Buffer Memory to set. + @param Size Number of bytes to set + @param Value Value of the set operation. + + @return Buffer + +**/ +VOID * +EFIAPI +SetMem ( + IN VOID *Buffer, + IN UINTN Size, + IN UINT8 Value + ) +{ + ASSERT (Size <= MAX_ADDRESS - (UINTN)Buffer + 1); + return InternalMemSetMem (Buffer, Size, Value); +} + +/** + Fills a target buffer with a 16-bit value, and returns the target buffer. + + This function fills Length bytes of Buffer with the 16-bit value specified by + Value, and returns Buffer. Value is repeated every 16-bits in for Length + bytes of Buffer. + + If Buffer is NULL and Length > 0, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + If Buffer is not aligned on a 16-bit boundary, then ASSERT(). + If Length is not aligned on a 16-bit boundary, then ASSERT(). + + @param Buffer Pointer to the target buffer to fill. + @param Length Number of bytes in Buffer to fill. + @param Value Value with which to fill Length bytes of Buffer. + + @return Buffer + +**/ +VOID * +EFIAPI +SetMem16 ( + OUT VOID *Buffer, + IN UINTN Length, + IN UINT16 Value + ) +{ + ASSERT (Buffer != NULL); + ASSERT (Length <= MAX_ADDRESS - (UINTN)Buffer + 1); + ASSERT ((((UINTN)Buffer) & 1) != 0); + ASSERT ((Length & 1) != 0); + + if ((Length /= sizeof (Value)) == 0) { + return Buffer; + } + return InternalMemSetMem16 (Buffer, Length, Value); +} + +/** + Fills a target buffer with a 32-bit value, and returns the target buffer. + + This function fills Length bytes of Buffer with the 32-bit value specified by + Value, and returns Buffer. Value is repeated every 32-bits in for Length + bytes of Buffer. + + If Buffer is NULL and Length > 0, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + If Buffer is not aligned on a 32-bit boundary, then ASSERT(). + If Length is not aligned on a 32-bit boundary, then ASSERT(). + + @param Buffer Pointer to the target buffer to fill. + @param Length Number of bytes in Buffer to fill. + @param Value Value with which to fill Length bytes of Buffer. + + @return Buffer + +**/ +VOID * +EFIAPI +SetMem32 ( + OUT VOID *Buffer, + IN UINTN Length, + IN UINT32 Value + ) +{ + ASSERT (Buffer != NULL); + ASSERT (Length <= MAX_ADDRESS - (UINTN)Buffer + 1); + ASSERT ((((UINTN)Buffer) & 1) != 0); + ASSERT ((Length & 1) != 0); + + if ((Length /= sizeof (Value)) == 0) { + return Buffer; + } + return InternalMemSetMem32 (Buffer, Length, Value); +} + +/** + Fills a target buffer with a 64-bit value, and returns the target buffer. + + This function fills Length bytes of Buffer with the 64-bit value specified by + Value, and returns Buffer. Value is repeated every 64-bits in for Length + bytes of Buffer. + + If Buffer is NULL and Length > 0, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + If Buffer is not aligned on a 64-bit boundary, then ASSERT(). + If Length is not aligned on a 64-bit boundary, then ASSERT(). + + @param Buffer Pointer to the target buffer to fill. + @param Length Number of bytes in Buffer to fill. + @param Value Value with which to fill Length bytes of Buffer. + + @return Buffer + +**/ +VOID * +EFIAPI +SetMem64 ( + OUT VOID *Buffer, + IN UINTN Length, + IN UINT64 Value + ) +{ + ASSERT (Buffer != NULL); + ASSERT (Length <= MAX_ADDRESS - (UINTN)Buffer + 1); + ASSERT ((((UINTN)Buffer) & 1) != 0); + ASSERT ((Length & 1) != 0); + + if ((Length /= sizeof (Value)) == 0) { + return Buffer; + } + return InternalMemSetMem64 (Buffer, Length, Value); +} + +/** + Set Buffer to 0 for Size bytes. + + This function fills Length bytes of Buffer with zeros, and returns Buffer. + + If Buffer is NULL and Length > 0, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param Buffer Memory to set. + @param Size Number of bytes to set + + @return Buffer + +**/ +VOID * +EFIAPI +ZeroMem ( + IN VOID *Buffer, + IN UINTN Size + ) +{ + ASSERT (Buffer != NULL); + return InternalMemSetMem (Buffer, Size, 0); +} + +/** + Compares two memory buffers of a given length. + + This function compares Length bytes of SourceBuffer to Length bytes of + DestinationBuffer. If all Length bytes of the two buffers are identical, then + 0 is returned. Otherwise, the value returned is the first mismatched byte in + SourceBuffer subtracted from the first mismatched byte in DestinationBuffer. + + If DestinationBuffer is NULL and Length > 0, then ASSERT(). + If SourceBuffer is NULL and Length > 0, then ASSERT(). + If Length is greater than (MAX_ADDRESS - DestinationBuffer + 1), then + ASSERT(). + If Length is greater than (MAX_ADDRESS - SourceBuffer + 1), then ASSERT(). + + @param DestinationBuffer First memory buffer + @param SourceBuffer Second memory buffer + @param Length Length of DestinationBuffer and SourceBuffer memory + regions to compare + + @retval 0 if DestinationBuffer == SourceBuffer + @retval Non-zero if DestinationBuffer != SourceBuffer + +**/ +INTN +EFIAPI +CompareMem ( + IN CONST VOID *DestinationBuffer, + IN CONST VOID *SourceBuffer, + IN UINTN Length + ) +{ + ASSERT (DestinationBuffer != NULL); + ASSERT (SourceBuffer != NULL); + ASSERT (Length <= MAX_ADDRESS - (UINTN)DestinationBuffer + 1); + ASSERT (Length <= MAX_ADDRESS - (UINTN)SourceBuffer + 1); + if (Length == 0) { + return 0; + } + return InternalMemCompareMem (DestinationBuffer, SourceBuffer, Length); +} + +/** + Scans a target buffer for an 8-bit value, and returns a pointer to the + matching 8-bit value in the target buffer. + + This function searches target the buffer specified by Buffer and Length from + the lowest address to the highest address for an 8-bit value that matches + Value. If a match is found, then a pointer to the matching byte in the target + buffer is returned. If no match is found, then NULL is returned. If Length is + 0, then NULL is returned. + + If Buffer is NULL, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param Buffer Pointer to the target buffer to scan. + @param Length Number of bytes in Buffer to scan. + @param Value Value to search for in the target buffer. + + @return Pointer to the first occurrence or NULL if not found. + @retval NULL if Length == 0 or Value was not found. + +**/ +VOID * +EFIAPI +ScanMem8 ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINT8 Value + ) +{ + ASSERT (Buffer != NULL); + ASSERT (Length <= MAX_ADDRESS + (UINTN)Buffer + 1); + + if ((Length /= sizeof (Value)) == 0) { + return NULL; + } + return (VOID*)InternalMemScanMem8 (Buffer, Length, Value); +} + +/** + Scans a target buffer for a 16-bit value, and returns a pointer to the + matching 16-bit value in the target buffer. + + This function searches target the buffer specified by Buffer and Length from + the lowest address to the highest address at 16-bit increments for a 16-bit + value that matches Value. If a match is found, then a pointer to the matching + value in the target buffer is returned. If no match is found, then NULL is + returned. If Length is 0, then NULL is returned. + + If Buffer is NULL, then ASSERT(). + If Buffer is not aligned on a 16-bit boundary, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param Buffer Pointer to the target buffer to scan. + @param Length Number of bytes in Buffer to scan. + @param Value Value to search for in the target buffer. + + @return Pointer to the first occurrence. + @retval NULL if Length == 0 or Value was not found. + +**/ +VOID * +EFIAPI +ScanMem16 ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINT16 Value + ) +{ + ASSERT (Buffer != NULL); + ASSERT (((UINTN)Buffer & (sizeof (Value) - 1)) == 0); + ASSERT (Length <= MAX_ADDRESS + (UINTN)Buffer + 1); + + if ((Length /= sizeof (Value)) == 0) { + return NULL; + } + return (VOID*)InternalMemScanMem16 (Buffer, Length, Value); +} + +/** + Scans a target buffer for a 32-bit value, and returns a pointer to the + matching 32-bit value in the target buffer. + + This function searches target the buffer specified by Buffer and Length from + the lowest address to the highest address at 32-bit increments for a 32-bit + value that matches Value. If a match is found, then a pointer to the matching + value in the target buffer is returned. If no match is found, then NULL is + returned. If Length is 0, then NULL is returned. + + If Buffer is NULL, then ASSERT(). + If Buffer is not aligned on a 32-bit boundary, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param Buffer Pointer to the target buffer to scan. + @param Length Number of bytes in Buffer to scan. + @param Value Value to search for in the target buffer. + + @return Pointer to the first occurrence or NULL if not found. + @retval NULL if Length == 0 or Value was not found. + +**/ +VOID * +EFIAPI +ScanMem32 ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINT32 Value + ) +{ + ASSERT (Buffer != NULL); + ASSERT (((UINTN)Buffer & (sizeof (Value) - 1)) == 0); + ASSERT (Length <= MAX_ADDRESS + (UINTN)Buffer + 1); + + if ((Length /= sizeof (Value)) == 0) { + return NULL; + } + return (VOID*)InternalMemScanMem32 (Buffer, Length, Value); +} + +/** + Scans a target buffer for a 64-bit value, and returns a pointer to the + matching 64-bit value in the target buffer. + + This function searches target the buffer specified by Buffer and Length from + the lowest address to the highest address at 64-bit increments for a 64-bit + value that matches Value. If a match is found, then a pointer to the matching + value in the target buffer is returned. If no match is found, then NULL is + returned. If Length is 0, then NULL is returned. + + If Buffer is NULL, then ASSERT(). + If Buffer is not aligned on a 64-bit boundary, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param Buffer Pointer to the target buffer to scan. + @param Length Number of bytes in Buffer to scan. + @param Value Value to search for in the target buffer. + + @return Pointer to the first occurrence or NULL if not found. + @retval NULL if Length == 0 or Value was not found. + +**/ +VOID * +EFIAPI +ScanMem64 ( + IN CONST VOID *Buffer, + IN UINTN Length, + IN UINT64 Value + ) +{ + ASSERT (Buffer != NULL); + ASSERT (((UINTN)Buffer & (sizeof (Value) - 1)) == 0); + ASSERT (Length <= MAX_ADDRESS + (UINTN)Buffer + 1); + + if ((Length /= sizeof (Value)) == 0) { + return NULL; + } + return (VOID*)InternalMemScanMem64 (Buffer, Length, Value); +} diff --git a/MdePkg/Library/BaseMemoryLibSse2/build.xml b/MdePkg/Library/BaseMemoryLibSse2/build.xml new file mode 100644 index 0000000000..39482b0bfa --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/build.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MdePkg/Library/BaseMemoryLibSse2/ia32/CompareMem.asm b/MdePkg/Library/BaseMemoryLibSse2/ia32/CompareMem.asm new file mode 100644 index 0000000000..4e35d1c858 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/ia32/CompareMem.asm @@ -0,0 +1,46 @@ +;------------------------------------------------------------------------------ +; +; 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.Asm +; +; Abstract: +; +; CompareMem function +; +; Notes: +; +; The following BaseMemoryLib instances share the same version of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; +;------------------------------------------------------------------------------ + + .686 + .model flat,C + .code + +InternalMemCompareMem PROC USES esi edi + mov esi, [esp + 12] + mov edi, [esp + 16] + mov ecx, [esp + 20] + repe cmpsb + movzx eax, byte ptr [esi - 1] + movzx edx, byte ptr [edi - 1] + sub eax, edx + sub eax, edx + ret +InternalMemCompareMem ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/ia32/CopyMem.asm b/MdePkg/Library/BaseMemoryLibSse2/ia32/CopyMem.asm new file mode 100644 index 0000000000..6127cc2188 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/ia32/CopyMem.asm @@ -0,0 +1,84 @@ +;------------------------------------------------------------------------------ +; +; 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.asm +; +; Abstract: +; +; CopyMem function +; +; Notes: +; +;------------------------------------------------------------------------------ + + .686 + .model flat,C + .xmm + .code + +;------------------------------------------------------------------------------ +; VOID * +; _mem_CopyMem ( +; IN VOID *Destination, +; IN VOID *Source, +; IN UINTN Count +; ) +;------------------------------------------------------------------------------ +InternalMemCopyMem PROC USES esi edi + mov esi, [esp + 16] ; esi <- Source + mov edi, [esp + 12] ; edi <- Destination + mov edx, [esp + 20] ; edx <- Count + lea eax, [edi + edx - 1] ; eax <- End of Destination + cmp esi, edi + jae @F + cmp eax, esi ; Overlapped? + jae @CopyBackward ; Copy backward if overlapped +@@: + xor ecx, ecx + sub ecx, edi + and ecx, 15 ; ecx + edi aligns on 16-byte boundary + jz @F + cmp ecx, edx + cmova ecx, edx + sub edx, ecx ; edx <- remaining bytes to copy + rep movsb +@@: + mov ecx, edx + and edx, 15 + shr ecx, 4 ; ecx <- # of DQwords to copy + jz @CopyBytes + add esp, -16 + movdqu [esp], xmm0 ; save xmm0 +@@: + movdqu xmm0, [esi] ; esi may not be 16-bytes aligned + movntdq [edi], xmm0 ; edi should be 16-bytes aligned + add esi, 16 + add edi, 16 + loop @B + mfence + movdqu xmm0, [esp] ; restore xmm0 + add esp, 16 ; stack cleanup + jmp @CopyBytes +@CopyBackward: + mov edi, eax ; edi <- Last byte in Destination + lea esi, [esi + edx - 1] ; esi <- Last byte in Source + std +@CopyBytes: + mov ecx, edx + rep movsb + cld + mov eax, [esp + 12] ; eax <- Destination as return value + ret +InternalMemCopyMem ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem16.asm b/MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem16.asm new file mode 100644 index 0000000000..7071942ede --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem16.asm @@ -0,0 +1,44 @@ +;------------------------------------------------------------------------------ +; +; 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.Asm +; +; Abstract: +; +; ScanMem16 function +; +; Notes: +; +; The following BaseMemoryLib instances share the same version of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; +;------------------------------------------------------------------------------ + + .686 + .model flat,C + .code + +InternalMemScanMem16 PROC USES edi + mov ecx, [esp + 12] + mov edi, [esp + 8] + mov eax, [esp + 16] + repne scasw + lea eax, [edi - 2] + cmovnz eax, ecx + ret +InternalMemScanMem16 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem32.asm b/MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem32.asm new file mode 100644 index 0000000000..e6aaf02bc3 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem32.asm @@ -0,0 +1,44 @@ +;------------------------------------------------------------------------------ +; +; 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.Asm +; +; Abstract: +; +; ScanMem32 function +; +; Notes: +; +; The following BaseMemoryLib instances share the same version of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; +;------------------------------------------------------------------------------ + + .686 + .model flat,C + .code + +InternalMemScanMem32 PROC USES edi + mov ecx, [esp + 12] + mov edi, [esp + 8] + mov eax, [esp + 16] + repne scasd + lea eax, [edi - 4] + cmovnz eax, ecx + ret +InternalMemScanMem32 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem64.asm b/MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem64.asm new file mode 100644 index 0000000000..f9725a4a5d --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem64.asm @@ -0,0 +1,53 @@ +;------------------------------------------------------------------------------ +; +; 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.Asm +; +; Abstract: +; +; ScanMem64 function +; +; Notes: +; +; The following BaseMemoryLib instances share the same version of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; +;------------------------------------------------------------------------------ + + .686 + .model flat,C + .code + +InternalMemScanMem64 PROC USES edi + mov ecx, [esp + 12] + mov eax, [esp + 16] + mov edx, [esp + 20] + mov edi, [esp + 8] +@@: + cmp eax, [edi] + lea edi, [edi + 8] + loopne @B + jne @F + cmp edx, [edi - 4] + jecxz @F + jne @B +@@: + lea eax, [edi - 8] + cmovne eax, ecx + ret +InternalMemScanMem64 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem8.asm b/MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem8.asm new file mode 100644 index 0000000000..6ae1900189 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/ia32/ScanMem8.asm @@ -0,0 +1,44 @@ +;------------------------------------------------------------------------------ +; +; 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.Asm +; +; Abstract: +; +; ScanMem8 function +; +; Notes: +; +; The following BaseMemoryLib instances share the same version of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; +;------------------------------------------------------------------------------ + + .686 + .model flat,C + .code + +InternalMemScanMem8 PROC USES edi + mov ecx, [esp + 12] + mov edi, [esp + 8] + mov al, [esp + 16] + repne scasb + lea eax, [edi - 1] + cmovnz eax, ecx + ret +InternalMemScanMem8 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem.asm b/MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem.asm new file mode 100644 index 0000000000..62b10cff0a --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem.asm @@ -0,0 +1,74 @@ +;------------------------------------------------------------------------------ +; +; 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.asm +; +; Abstract: +; +; SetMem function +; +; Notes: +; +;------------------------------------------------------------------------------ + + .686 + .model flat,C + .xmm + .code + +;------------------------------------------------------------------------------ +; VOID * +; _mem_SetMem ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT8 Value +; ) +;------------------------------------------------------------------------------ +InternalMemSetMem PROC USES edi + mov edx, [esp + 12] ; edx <- Count + mov edi, [esp + 8] ; edi <- Buffer + mov al, [esp + 16] ; al <- Value + xor ecx, ecx + sub ecx, edi + and ecx, 15 ; ecx + edi aligns on 16-byte boundary + jz @F + cmp ecx, edx + cmova ecx, edx + sub edx, ecx + rep stosb +@@: + mov ecx, edx + and edx, 15 + shr ecx, 4 ; ecx <- # of DQwords to set + jz @SetBytes + mov ah, al ; ax <- Value | (Value << 8) + add esp, -16 + movdqu [esp], xmm0 ; save xmm0 + movd xmm0, eax + pshuflw xmm0, xmm0, 0 ; xmm0[0..63] <- Value repeats 8 times + movlhps xmm0, xmm0 ; xmm0 <- Value repeats 16 times +@@: + movntdq [edi], xmm0 ; edi should be 16-byte aligned + add edi, 16 + loop @B + mfence + movdqu xmm0, [esp] ; restore xmm0 + add esp, 16 ; stack cleanup +@SetBytes: + mov ecx, edx + rep stosb + mov eax, [esp + 8] ; eax <- Buffer as return value + ret +InternalMemSetMem ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem16.asm b/MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem16.asm new file mode 100644 index 0000000000..3fabb00d31 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem16.asm @@ -0,0 +1,70 @@ +;------------------------------------------------------------------------------ +; +; 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.asm +; +; Abstract: +; +; SetMem16 function +; +; Notes: +; +;------------------------------------------------------------------------------ + + .686 + .model flat,C + .xmm + .code + +;------------------------------------------------------------------------------ +; VOID * +; _mem_SetMem16 ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT16 Value +; ) +;------------------------------------------------------------------------------ +InternalMemSetMem16 PROC USES edi + mov edx, [esp + 12] + mov edi, [esp + 8] + xor ecx, ecx + sub ecx, edi + and ecx, 15 ; ecx + edi aligns on 16-byte boundary + mov eax, [esp + 16] + jz @F + shr ecx, 1 + cmp ecx, edx + cmova ecx, edx + sub edx, ecx + rep stosw +@@: + mov ecx, edx + and edx, 7 + shr ecx, 3 + jz @SetWords + movd xmm0, eax + pshuflw xmm0, xmm0, 0 + movlhps xmm0, xmm0 +@@: + movntdq [edi], xmm0 ; edi should be 16-byte aligned + add edi, 16 + loop @B + mfence +@SetWords: + mov ecx, edx + rep stosw + mov eax, [esp + 8] + ret +InternalMemSetMem16 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem32.asm b/MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem32.asm new file mode 100644 index 0000000000..a7f1f0e127 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem32.asm @@ -0,0 +1,69 @@ +;------------------------------------------------------------------------------ +; +; 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.asm +; +; Abstract: +; +; SetMem32 function +; +; Notes: +; +;------------------------------------------------------------------------------ + + .686 + .model flat,C + .xmm + .code + +;------------------------------------------------------------------------------ +; VOID * +; _mem_SetMem32 ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT32 Value +; ) +;------------------------------------------------------------------------------ +InternalMemSetMem32 PROC USES edi + mov edx, [esp + 12] + mov edi, [esp + 8] + xor ecx, ecx + sub ecx, edi + and ecx, 15 ; ecx + edi aligns on 16-byte boundary + mov eax, [esp + 16] + jz @F + shr ecx, 2 + cmp ecx, edx + cmova ecx, edx + sub edx, ecx + rep stosd +@@: + mov ecx, edx + and edx, 3 + shr ecx, 2 + jz @SetDwords + movd xmm0, eax + pshufd xmm0, xmm0, 0 +@@: + movntdq [edi], xmm0 + add edi, 16 + loop @B + mfence +@SetDwords: + mov ecx, edx + rep stosd + mov eax, [esp + 8] + ret +InternalMemSetMem32 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem64.asm b/MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem64.asm new file mode 100644 index 0000000000..1ddc7ea191 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/ia32/SetMem64.asm @@ -0,0 +1,63 @@ +;------------------------------------------------------------------------------ +; +; 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.asm +; +; Abstract: +; +; SetMem64 function +; +; Notes: +; +;------------------------------------------------------------------------------ + + .686 + .model flat,C + .xmm + .code + +;------------------------------------------------------------------------------ +; VOID * +; _mem_SetMem64 ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT64 Value +; ) +;------------------------------------------------------------------------------ +InternalMemSetMem64 PROC USES edi + mov ecx, [esp + 12] + mov edi, [esp + 8] + test edi, 8 + DB 0f2h, 0fh, 12h, 44h, 24h, 16 ; movddup xmm0, [esp + 16] + jz @F + movq [edi], xmm0 + add edi, 8 + dec ecx +@@: + mov edx, ecx + shr ecx, 1 + jz @SetQwords +@@: + movntdq [edi], xmm0 + add edi, 16 + loop @B + mfence +@SetQwords: + test dl, 1 + jz @F + movq [edi], xmm0 +@@: + ret +InternalMemSetMem64 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/ia32/ZeroMem.asm b/MdePkg/Library/BaseMemoryLibSse2/ia32/ZeroMem.asm new file mode 100644 index 0000000000..b532382e2e --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/ia32/ZeroMem.asm @@ -0,0 +1,66 @@ +;------------------------------------------------------------------------------ +; +; 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.asm +; +; Abstract: +; +; ZeroMem function +; +; Notes: +; +;------------------------------------------------------------------------------ + + .686 + .model flat,C + .xmm + .code + +;------------------------------------------------------------------------------ +; VOID * +; _mem_ZeroMem ( +; IN VOID *Buffer, +; IN UINTN Count +; ) +;------------------------------------------------------------------------------ +InternalMemZeroMem PROC USES edi + mov edi, [esp + 8] + mov edx, [esp + 12] + xor ecx, ecx + sub ecx, edi + xor eax, eax + and ecx, 15 + jz @F + cmp ecx, edx + cmova ecx, edx + sub edx, ecx + rep stosb +@@: + mov ecx, edx + and edx, 15 + shr ecx, 4 + jz @ZeroBytes + pxor xmm0, xmm0 +@@: + movntdq [edi], xmm0 + add edi, 16 + loop @B + mfence +@ZeroBytes: + mov ecx, edx + rep stosb + mov eax, [esp + 8] + ret +InternalMemZeroMem ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/CompareMem.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/CompareMem.asm new file mode 100644 index 0000000000..b8e289bb27 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/x64/CompareMem.asm @@ -0,0 +1,43 @@ +;------------------------------------------------------------------------------ +; +; 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.Asm +; +; Abstract: +; +; CompareMem function +; +; Notes: +; +; The following BaseMemoryLib instances share the same version of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; +;------------------------------------------------------------------------------ + + .code + +InternalMemCompareMem PROC USES rsi 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 + ret +InternalMemCompareMem ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/CopyMem.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/CopyMem.asm new file mode 100644 index 0000000000..955cd25f36 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/x64/CopyMem.asm @@ -0,0 +1,78 @@ +;------------------------------------------------------------------------------ +; +; 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.asm +; +; Abstract: +; +; CopyMem function +; +; Notes: +; +;------------------------------------------------------------------------------ + + .code + +;------------------------------------------------------------------------------ +; VOID * +; _mem_CopyMem ( +; IN VOID *Destination, +; IN VOID *Source, +; IN UINTN Count +; ) +;------------------------------------------------------------------------------ +InternalMemCopyMem PROC USES rsi rdi + mov rsi, rdx ; rsi <- Source + mov rdi, rcx ; rdi <- Destination + lea r9, [rdi + r8 - 1] ; r9 <- Last byte of Destination + cmp rsi, rdi + mov rax, rdi ; rax <- Destination as return value + jae @F ; Copy forward if Source > Destination + cmp r9, rsi ; Overlapped? + jae @CopyBackward ; Copy backward if overlapped +@@: + xor rcx, rcx + sub rcx, rdi ; rcx <- -rdi + and rcx, 15 ; rcx + rsi should be 16 bytes aligned + jz @F ; skip if rcx == 0 + cmp rcx, r8 + cmova rcx, r8 + sub r8, rcx + rep movsb +@@: + mov rcx, r8 + and r8, 15 + shr rcx, 4 ; rcx <- # of DQwords to copy + jz @CopyBytes + movdqa [rsp + 18h], xmm0 ; save xmm0 on stack +@@: + 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 @B + mfence + movdqa xmm0, [rsp + 18h] ; restore xmm0 + jmp @CopyBytes ; copy remaining bytes +@CopyBackward: + mov rdi, r9 ; rdi <- Last byte of Destination + lea rsi, [rsi + r8 - 1] ; rsi <- Last byte of Source + std +@CopyBytes: + mov rcx, r8 + rep movsb + cld + ret +InternalMemCopyMem ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem16.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem16.asm new file mode 100644 index 0000000000..6af88fae5b --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem16.asm @@ -0,0 +1,42 @@ +;------------------------------------------------------------------------------ +; +; 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.Asm +; +; Abstract: +; +; ScanMem16 function +; +; Notes: +; +; The following BaseMemoryLib instances share the same version of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; +;------------------------------------------------------------------------------ + + .code + +InternalMemScanMem16 PROC USES rdi + mov rdi, rcx + mov rax, r8 + mov rcx, rdx + repne scasw + lea rax, [rdi - 2] + cmovnz rax, rcx + ret +InternalMemScanMem16 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem32.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem32.asm new file mode 100644 index 0000000000..f9c9feb00e --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem32.asm @@ -0,0 +1,42 @@ +;------------------------------------------------------------------------------ +; +; 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.Asm +; +; Abstract: +; +; ScanMem32 function +; +; Notes: +; +; The following BaseMemoryLib instances share the same version of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; +;------------------------------------------------------------------------------ + + .code + +InternalMemScanMem32 PROC USES rdi + mov rdi, rcx + mov rax, r8 + mov rcx, rdx + repne scasd + lea rax, [rdi - 4] + cmovnz rax, rcx + ret +InternalMemScanMem32 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem64.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem64.asm new file mode 100644 index 0000000000..2f286c9e2f --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem64.asm @@ -0,0 +1,42 @@ +;------------------------------------------------------------------------------ +; +; 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.Asm +; +; Abstract: +; +; ScanMem64 function +; +; Notes: +; +; The following BaseMemoryLib instances share the same version of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; +;------------------------------------------------------------------------------ + + .code + +InternalMemScanMem64 PROC USES rdi + mov rdi, rcx + mov rax, r8 + mov rcx, rdx + repne scasq + lea rax, [rdi - 8] + cmovnz rax, rcx + ret +InternalMemScanMem64 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem8.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem8.asm new file mode 100644 index 0000000000..4027ece768 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem8.asm @@ -0,0 +1,42 @@ +;------------------------------------------------------------------------------ +; +; 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.Asm +; +; Abstract: +; +; ScanMem8 function +; +; Notes: +; +; The following BaseMemoryLib instances share the same version of this file: +; +; BaseMemoryLibRepStr +; BaseMemoryLibMmx +; BaseMemoryLibSse2 +; +;------------------------------------------------------------------------------ + + .code + +InternalMemScanMem8 PROC USES 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 + ret +InternalMemScanMem8 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem.asm new file mode 100644 index 0000000000..2aba207ab9 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem.asm @@ -0,0 +1,69 @@ +;------------------------------------------------------------------------------ +; +; 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.asm +; +; Abstract: +; +; SetMem function +; +; Notes: +; +;------------------------------------------------------------------------------ + + .code + +;------------------------------------------------------------------------------ +; VOID * +; _mem_SetMem ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT8 Value +; ) +;------------------------------------------------------------------------------ +InternalMemSetMem PROC USES 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 @F + cmp rcx, rdx + cmova rcx, rdx + sub rdx, rcx + rep stosb +@@: + mov rcx, rdx + and rdx, 15 + shr rcx, 4 + jz @SetBytes + mov ah, al ; ax <- Value repeats twice + movdqa [rsp + 10h], 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 +@@: + movntdq [rdi], xmm0 ; rdi should be 16-byte aligned + add rdi, 16 + loop @B + mfence + movdqa xmm0, [rsp + 10h] ; restore xmm0 +@SetBytes: + mov ecx, edx ; high 32 bits of rcx are always zero + rep stosb + mov rax, r9 ; rax <- Return value + ret +InternalMemSetMem ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem16.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem16.asm new file mode 100644 index 0000000000..a2f4d0e538 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem16.asm @@ -0,0 +1,67 @@ +;------------------------------------------------------------------------------ +; +; 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.asm +; +; Abstract: +; +; SetMem16 function +; +; Notes: +; +;------------------------------------------------------------------------------ + + .code + +;------------------------------------------------------------------------------ +; VOID * +; _mem_SetMem16 ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT16 Value +; ) +;------------------------------------------------------------------------------ +InternalMemSetMem16 PROC USES rdi + mov rdi, rcx + mov r9, rdi + xor rcx, rcx + sub rcx, rdi + and rcx, 15 + mov rax, r8 + jz @F + shr rcx, 1 + cmp rcx, rdx + cmova rcx, rdx + sub rdx, rcx + rep stosw +@@: + mov rcx, rdx + and edx, 7 + shr rcx, 3 + jz @SetWords + movd xmm0, eax + pshuflw xmm0, xmm0, 0 + movlhps xmm0, xmm0 +@@: + movntdq [rdi], xmm0 + add rdi, 16 + loop @B + mfence +@SetWords: + mov ecx, edx + rep stosw + mov rax, r9 + ret +InternalMemSetMem16 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem32.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem32.asm new file mode 100644 index 0000000000..24207ec699 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem32.asm @@ -0,0 +1,66 @@ +;------------------------------------------------------------------------------ +; +; 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.asm +; +; Abstract: +; +; SetMem32 function +; +; Notes: +; +;------------------------------------------------------------------------------ + + .code + +;------------------------------------------------------------------------------ +; VOID * +; _mem_SetMem32 ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT8 Value +; ) +;------------------------------------------------------------------------------ +InternalMemSetMem32 PROC USES rdi + mov rdi, rcx + mov r9, rdi + xor rcx, rcx + sub rcx, rdi + and rcx, 15 + mov rax, r8 + jz @F + shr rcx, 2 + cmp rcx, rdx + cmova rcx, rdx + sub rdx, rcx + rep stosd +@@: + mov rcx, rdx + and edx, 3 + shr rcx, 2 + jz @SetDwords + movd xmm0, eax + pshufd xmm0, xmm0, 0 +@@: + movntdq [rdi], xmm0 + add rdi, 16 + loop @B + mfence +@SetDwords: + mov ecx, edx + rep stosd + mov rax, r9 + ret +InternalMemSetMem32 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem64.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem64.asm new file mode 100644 index 0000000000..8b33386ad0 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem64.asm @@ -0,0 +1,61 @@ +;------------------------------------------------------------------------------ +; +; 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.asm +; +; Abstract: +; +; SetMem64 function +; +; Notes: +; +;------------------------------------------------------------------------------ + + .code + +;------------------------------------------------------------------------------ +; VOID * +; _mem_SetMem64 ( +; IN VOID *Buffer, +; IN UINTN Count, +; IN UINT8 Value +; ) +;------------------------------------------------------------------------------ +InternalMemSetMem64 PROC USES rdi + mov rdi, rcx + mov r9, rcx + test cl, 8 + jz @F + mov [rdi], r8 + add rdi, 8 + dec rdx +@@: + mov rcx, rdx + shr rcx, 1 + jz @SetQwords + movd xmm0, r8 + movlhps xmm0, xmm0 +@@: + movntdq [rdi], xmm0 + add rdi, 16 + loop @B + mfence +@SetQwords: + test dl, 1 + jz @F + mov [rdi], r8 +@@: + ret +InternalMemSetMem64 ENDP + + END diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/ZeroMem.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/ZeroMem.asm new file mode 100644 index 0000000000..6d0f99ba94 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/x64/ZeroMem.asm @@ -0,0 +1,63 @@ +;------------------------------------------------------------------------------ +; +; 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.asm +; +; Abstract: +; +; ZeroMem function +; +; Notes: +; +;------------------------------------------------------------------------------ + + .code + +;------------------------------------------------------------------------------ +; VOID * +; _mem_ZeroMem ( +; IN VOID *Buffer, +; IN UINTN Count +; ) +;------------------------------------------------------------------------------ +InternalMemZeroMem PROC USES rdi + mov rdi, rcx + xor rcx, rcx + xor eax, eax + sub rcx, rdi + and rcx, 15 + mov r8, rdi + jz @F + cmp rcx, rdx + cmova rcx, rdx + sub rdx, rcx + rep stosb +@@: + mov rcx, rdx + and edx, 15 + shr rcx, 4 + jz @ZeroBytes + pxor xmm0, xmm0 +@@: + movntdq [rdi], xmm0 ; rdi should be 16-byte aligned + add rdi, 16 + loop @B + mfence +@ZeroBytes: + mov ecx, edx + rep stosb + mov rax, r8 + ret +InternalMemZeroMem ENDP + + END -- cgit v1.2.3