X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdePkg%2FLibrary%2FBaseMemoryLibMmx%2FX64%2FCopyMem.S;h=3e7a396b5b4feec8e31f857b03d526c0cd1b7b3a;hb=4df876adfb234d0c73b8be407ef3436cdce86af5;hp=c4ecdc70eb48584c261af9922f2d6d95fa8ac4a1;hpb=c5ecf6c197a7105f2a5d09ddf5ff4a78090584c7;p=mirror_edk2.git diff --git a/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S b/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S index c4ecdc70eb..3e7a396b5b 100644 --- a/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S +++ b/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S @@ -1,3 +1,6 @@ +# +# ConvertAsm.py: Automatically generated from CopyMem.asm +# #------------------------------------------------------------------------------ # # Copyright (c) 2006, Intel Corporation @@ -11,7 +14,7 @@ # # Module Name: # -# CopyMem.asm +# CopyMem.S # # Abstract: # @@ -23,50 +26,42 @@ #------------------------------------------------------------------------------ -# VOID * -# EFIAPI -# InternalMemCopyMem ( -# OUT VOID *DestinationBuffer, -# IN CONST VOID *SourceBuffer, -# IN UINTN Length -# ); +# VOID * +# EFIAPI +# InternalMemCopyMem ( +# IN VOID *Destination, +# IN VOID *Source, +# IN UINTN Count +# ) #------------------------------------------------------------------------------ -.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 +.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 <- End of Source + cmp rsi, rdi + mov rax, rdi # rax <- Destination as return value + jae _InternalMemCopyMem_al_0000 + cmp r9, rdi + jae _atSym_CopyBackward # Copy backward if overlapped +_InternalMemCopyMem_al_0000: + mov rcx, r8 + and r8, 7 + shr rcx, 3 + rep movsq # Copy as many Qwords as possible + jmp _atSym_CopyBytes +_atSym_CopyBackward: + mov rsi, r9 # rsi <- End of Source + lea rdi, [rdi + r8 - 1] # esi <- End of Destination std # set direction flag -LCopyBytes: - mov %r8, %rcx - rep - movsb # Copy bytes backward +_atSym_CopyBytes: + mov rcx, r8 + rep movsb # Copy bytes backward cld - pop %rdi - pop %rsi + pop rdi + pop rsi ret +