diff options
author | bbahnsen <bbahnsen@6f19259b-4bc3-4df7-8a09-765794883524> | 2006-11-23 00:22:20 +0000 |
---|---|---|
committer | bbahnsen <bbahnsen@6f19259b-4bc3-4df7-8a09-765794883524> | 2006-11-23 00:22:20 +0000 |
commit | 02ad42aed8817f35b46be665b4b8d92be7abfa72 (patch) | |
tree | 726f95c5a5238a0e144108975c0af984b1c5cc38 /MdePkg/Library/BaseMemoryLibMmx | |
parent | 45a6b8074a0629de2845ec7aa4f580f9bcdff3ab (diff) | |
download | edk2-platforms-02ad42aed8817f35b46be665b4b8d92be7abfa72.tar.xz |
Port a couple of files to gnu assembly.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2001 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdePkg/Library/BaseMemoryLibMmx')
-rw-r--r-- | MdePkg/Library/BaseMemoryLibMmx/X64/CompareMem.S | 52 | ||||
-rw-r--r-- | MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S | 72 |
2 files changed, 124 insertions, 0 deletions
diff --git a/MdePkg/Library/BaseMemoryLibMmx/X64/CompareMem.S b/MdePkg/Library/BaseMemoryLibMmx/X64/CompareMem.S new file mode 100644 index 0000000000..fb1dccee0b --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibMmx/X64/CompareMem.S @@ -0,0 +1,52 @@ +#------------------------------------------------------------------------------ +# +# 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 +# +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# INTN +# EFIAPI +# InternalMemCompareMem ( +# IN CONST VOID *DestinationBuffer, +# IN CONST VOID *SourceBuffer, +# IN UINTN Length +# ); +#------------------------------------------------------------------------------ +.global _InternalMemCompareMem; +_InternalMemCompareMem: + push %rsi + push %rdi + mov %rcx, %rsi + mov %rdx, %rdi + mov %r8, %rcx + repe cmpsb + movzbq -1(%rsi), %rax + movzbq -1(%rdi), %rdx + sub %rdx, %rax + pop %rdi + pop %rsi + ret diff --git a/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S b/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S new file mode 100644 index 0000000000..c4ecdc70eb --- /dev/null +++ b/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S @@ -0,0 +1,72 @@ +#------------------------------------------------------------------------------ +# +# 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: +# +#------------------------------------------------------------------------------ + + +#------------------------------------------------------------------------------ +# VOID * +# EFIAPI +# InternalMemCopyMem ( +# OUT VOID *DestinationBuffer, +# IN CONST VOID *SourceBuffer, +# IN UINTN Length +# ); +#------------------------------------------------------------------------------ +.global _InternalMemCopyMem; +_InternalMemCopyMem: + push %rsi + push %rdi + mov %rdi, %rsi + mov %rcx, %rdi + lea -1(%r8,%rsi,1),%r9 + cmp %rdi, %rsi + mov %rdi, %rax + jae L1 + cmp %rdi, %r9 + jae LCopyBackward # Copy backward if overlapped +L1: + mov %r8, %rcx + and $7, %r8 + shr $3, %rcx + jz LCopyBytes + movd %mm0, %r10 # (Save mm0 in r10) +L2: + movd (%rsi), %mm0 + movntq %mm0, (%rdi) + add $8, %rsi + add $8, %rdi + loop L2 + mfence + movd %r10, %mm0 #(Restore mm0) + jmp LCopyBytes +LCopyBackward: + mov %r9, %rsi + lea -1(%r8,%rdi,1),%rdi + std # set direction flag +LCopyBytes: + mov %r8, %rcx + rep + movsb # Copy bytes backward + cld + pop %rdi + pop %rsi + ret |