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