diff options
Diffstat (limited to 'MdePkg/Library/BaseMemoryLibSse2')
-rw-r--r-- | MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf | 47 | ||||
-rw-r--r-- | MdePkg/Library/BaseMemoryLibSse2/X64/CompareMem.S | 60 | ||||
-rw-r--r-- | MdePkg/Library/BaseMemoryLibSse2/X64/CopyMem.S | 84 | ||||
-rw-r--r-- | MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem16.S | 57 | ||||
-rw-r--r-- | MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem32.S | 57 | ||||
-rw-r--r-- | MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem64.S | 57 | ||||
-rw-r--r-- | MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem8.S | 57 | ||||
-rw-r--r-- | MdePkg/Library/BaseMemoryLibSse2/X64/SetMem.S | 73 | ||||
-rw-r--r-- | MdePkg/Library/BaseMemoryLibSse2/X64/SetMem16.S | 71 | ||||
-rw-r--r-- | MdePkg/Library/BaseMemoryLibSse2/X64/SetMem32.S | 70 | ||||
-rw-r--r-- | MdePkg/Library/BaseMemoryLibSse2/X64/SetMem64.S | 61 | ||||
-rw-r--r-- | MdePkg/Library/BaseMemoryLibSse2/X64/ZeroMem.S | 66 |
12 files changed, 736 insertions, 24 deletions
diff --git a/MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf b/MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf index 8de0fffc7e..37171a84c0 100644 --- a/MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf +++ b/MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf @@ -32,6 +32,18 @@ [Sources.common]
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]
Ia32/ScanMem64.S
@@ -56,18 +68,6 @@ Ia32/SetMem16.asm
Ia32/SetMem.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]
X64/ScanMem64.asm
@@ -81,18 +81,17 @@ X64/SetMem16.asm
X64/SetMem.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
+ X64/ScanMem64.S
+ X64/ScanMem32.S
+ X64/ScanMem16.S
+ X64/ScanMem8.S
+ X64/CompareMem.S
+ X64/ZeroMem.S
+ X64/SetMem64.S
+ X64/SetMem32.S
+ X64/SetMem16.S
+ X64/SetMem.S
+ X64/CopyMem.S
[Packages]
MdePkg/MdePkg.dec
diff --git a/MdePkg/Library/BaseMemoryLibSse2/X64/CompareMem.S b/MdePkg/Library/BaseMemoryLibSse2/X64/CompareMem.S new file mode 100644 index 0000000000..5580d6237a --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/X64/CompareMem.S @@ -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 + diff --git a/MdePkg/Library/BaseMemoryLibSse2/X64/CopyMem.S b/MdePkg/Library/BaseMemoryLibSse2/X64/CopyMem.S new file mode 100644 index 0000000000..dc47510874 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/X64/CopyMem.S @@ -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 diff --git a/MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem16.S b/MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem16.S new file mode 100644 index 0000000000..9a94f5d936 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem16.S @@ -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 + diff --git a/MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem32.S b/MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem32.S new file mode 100644 index 0000000000..86a6503fb3 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem32.S @@ -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 + diff --git a/MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem64.S b/MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem64.S new file mode 100644 index 0000000000..f05f7b2b2b --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem64.S @@ -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 + diff --git a/MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem8.S b/MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem8.S new file mode 100644 index 0000000000..1d8b4e1b23 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/X64/ScanMem8.S @@ -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 + diff --git a/MdePkg/Library/BaseMemoryLibSse2/X64/SetMem.S b/MdePkg/Library/BaseMemoryLibSse2/X64/SetMem.S new file mode 100644 index 0000000000..50f6d19886 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/X64/SetMem.S @@ -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 diff --git a/MdePkg/Library/BaseMemoryLibSse2/X64/SetMem16.S b/MdePkg/Library/BaseMemoryLibSse2/X64/SetMem16.S new file mode 100644 index 0000000000..5678fcd192 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/X64/SetMem16.S @@ -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 diff --git a/MdePkg/Library/BaseMemoryLibSse2/X64/SetMem32.S b/MdePkg/Library/BaseMemoryLibSse2/X64/SetMem32.S new file mode 100644 index 0000000000..06ffe768eb --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/X64/SetMem32.S @@ -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 diff --git a/MdePkg/Library/BaseMemoryLibSse2/X64/SetMem64.S b/MdePkg/Library/BaseMemoryLibSse2/X64/SetMem64.S new file mode 100644 index 0000000000..e0aa176d58 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/X64/SetMem64.S @@ -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 + diff --git a/MdePkg/Library/BaseMemoryLibSse2/X64/ZeroMem.S b/MdePkg/Library/BaseMemoryLibSse2/X64/ZeroMem.S new file mode 100644 index 0000000000..2712579db8 --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibSse2/X64/ZeroMem.S @@ -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 |