1;------------------------------------------------------------------------------ 2; 3; Copyright (c) 2006, Intel Corporation. All rights reserved.<BR> 4; SPDX-License-Identifier: BSD-2-Clause-Patent 5; 6; Module Name: 7; 8; CopyMem.Asm 9; 10; Abstract: 11; 12; CopyMem function 13; 14; Notes: 15; 16;------------------------------------------------------------------------------ 17 18 DEFAULT REL 19 SECTION .text 20 21;------------------------------------------------------------------------------ 22; VOID * 23; EFIAPI 24; InternalMemCopyMem ( 25; IN VOID *Destination, 26; IN VOID *Source, 27; IN UINTN Count 28; ) 29;------------------------------------------------------------------------------ 30global ASM_PFX(InternalMemCopyMem) 31ASM_PFX(InternalMemCopyMem): 32 push rsi 33 push rdi 34 mov rsi, rdx ; rsi <- Source 35 mov rdi, rcx ; rdi <- Destination 36 lea r9, [rsi + r8 - 1] ; r9 <- End of Source 37 cmp rsi, rdi 38 mov rax, rdi ; rax <- Destination as return value 39 jae .0 40 cmp r9, rdi 41 jae @CopyBackward ; Copy backward if overlapped 42.0: 43 mov rcx, r8 44 and r8, 7 45 shr rcx, 3 46 rep movsq ; Copy as many Qwords as possible 47 jmp @CopyBytes 48@CopyBackward: 49 mov rsi, r9 ; rsi <- End of Source 50 lea rdi, [rdi + r8 - 1] ; esi <- End of Destination 51 std ; set direction flag 52@CopyBytes: 53 mov rcx, r8 54 rep movsb ; Copy bytes backward 55 cld 56 pop rdi 57 pop rsi 58 ret 59 60