diff --git a/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/EfiCommonLib_Edk2.inf b/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/EfiCommonLib_Edk2.inf index 529f4923a0..b8fc29a192 100644 --- a/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/EfiCommonLib_Edk2.inf +++ b/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/EfiCommonLib_Edk2.inf @@ -99,6 +99,10 @@ COMPONENT_TYPE = LIBRARY # x64/EfiSetMem.asm | INTEL # x64/EfiZeroMem.asm | INTEL + x64/EfiCopyMemRep1.S | GCC + x64/EfiSetMemRep4.S | GCC + x64/EfiZeroMemRep4.S | GCC + Math.c [includes.common] diff --git a/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/x64/EfiCopyMemRep1.S b/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/x64/EfiCopyMemRep1.S new file mode 100644 index 0000000000..79455cfb79 --- /dev/null +++ b/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/x64/EfiCopyMemRep1.S @@ -0,0 +1,66 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2008, 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: +# +# EfiCopyMemRep1.S +# +# Abstract: +# +# CopyMem function +# +# Notes: +# +#------------------------------------------------------------------------------ +#include + + .code: + +.global ASM_PFX(EfiCommonLibCopyMem) + +#------------------------------------------------------------------------------ +# VOID +# EfiCommonLibCopyMem ( +# OUT VOID *Destination, +# IN VOID *Source, +# IN UINTN Count +# ); +#------------------------------------------------------------------------------ +ASM_PFX(EfiCommonLibCopyMem): + push %rsi + push %rdi + cmp %rcx,%rdx + je CopyMemDone + cmp $0x0,%r8 + je CopyMemDone + mov %rdx,%rsi + mov %rcx,%rdi + lea -1(%r8,%rsi,1),%r9 + cmp %rdi,%rsi + jae CopyBytes + cmp %rdi,%r9 + jb CopyBytes + mov %r9,%rsi + lea -1(%r8,%rdi,1),%rdi + std + +CopyBytes: + mov %r8,%rcx + rep movsb %ds:(%rsi),%es:(%rdi) + cld + +CopyMemDone: + pop %rdi + pop %rsi + retq + + + diff --git a/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/x64/EfiSetMemRep4.S b/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/x64/EfiSetMemRep4.S new file mode 100644 index 0000000000..a9eb76ae67 --- /dev/null +++ b/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/x64/EfiSetMemRep4.S @@ -0,0 +1,54 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2008, 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: +# +# EfiSetMemRep4.S +# +# Abstract: +# +# SetMem function +# +# Notes: +# +#------------------------------------------------------------------------------ +#include + + .code: + +.global ASM_PFX(EfiCommonLibCopyMem) + +#------------------------------------------------------------------------------ +# VOID +# EfiCommonLibSetMem ( +# OUT VOID *Buffer, +# IN UINTN Size, +# IN UINT8 Value +# ); +#------------------------------------------------------------------------------ +ASM_PFX(EfiCommonLibSetMem): + push %rdi + cmp $0x0,%rdx + je SetDone + mov %rcx,%rdi + mov %r8b,%al + mov %al,%ah + shrd $0x10,%eax,%ecx + shld $0x10,%ecx,%eax + mov %rdx,%rcx + shr $0x2,%rcx + rep stos %eax,%es:(%rdi) + mov %rdx,%rcx + and $0x3,%rcx + rep stos %al,%es:(%rdi) +SetDone: + pop %rdi + retq diff --git a/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/x64/EfiZeroMemRep4.S b/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/x64/EfiZeroMemRep4.S new file mode 100644 index 0000000000..11b9b45ab7 --- /dev/null +++ b/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/x64/EfiZeroMemRep4.S @@ -0,0 +1,46 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2008, 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: +# +# EfiZeroMemRep4.S +# +# Abstract: +# +# ZeroMem function +# +# Notes: +# +#------------------------------------------------------------------------------ +#include + + .code: + +.global ASM_PFX(EfiCommonLibZeroMem) +#------------------------------------------------------------------------------ +# VOID +# EfiCommonLibZeroMem ( +# IN VOID *Buffer, +# IN UINTN Size +# ); +#------------------------------------------------------------------------------ +ASM_PFX(EfiCommonLibZeroMem): + push %rdi + xor %rax,%rax + mov %rcx,%rdi + mov %rdx,%rcx + shr $0x2,%rcx + and $0x3,%rdx + rep stos %eax,%es:(%rdi) + mov %rdx,%rcx + rep stos %al,%es:(%rdi) + pop %rdi + retq \ No newline at end of file