#------------------------------------------------------------------------------ # # 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