1;------------------------------------------------------------------------------
2;
3; Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
4; This program and the accompanying materials
5; are licensed and made available under the terms and conditions of the BSD License
6; which accompanies this distribution.  The full text of the license may be found at
7; http://opensource.org/licenses/bsd-license.php.
8;
9; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11;
12; Module Name:
13;
14;   CopyMem.Asm
15;
16; Abstract:
17;
18;   CopyMem function
19;
20; Notes:
21;
22;------------------------------------------------------------------------------
23
24    .386
25    .model  flat,C
26    .code
27
28;------------------------------------------------------------------------------
29;  VOID *
30;  InternalMemCopyMem (
31;    IN VOID   *Destination,
32;    IN VOID   *Source,
33;    IN UINTN  Count
34;    )
35;------------------------------------------------------------------------------
36InternalMemCopyMem  PROC    USES    esi edi
37    mov     esi, [esp + 16]             ; esi <- Source
38    mov     edi, [esp + 12]             ; edi <- Destination
39    mov     edx, [esp + 20]             ; edx <- Count
40    lea     eax, [esi + edx - 1]        ; eax <- End of Source
41    cmp     esi, edi
42    jae     @F
43    cmp     eax, edi
44    jae     @CopyBackward               ; Copy backward if overlapped
45@@:
46    mov     ecx, edx
47    and     edx, 3
48    shr     ecx, 2
49    rep     movsd                       ; Copy as many Dwords as possible
50    jmp     @CopyBytes
51@CopyBackward:
52    mov     esi, eax                    ; esi <- End of Source
53    lea     edi, [edi + edx - 1]        ; edi <- End of Destination
54    std
55@CopyBytes:
56    mov     ecx, edx
57    rep     movsb                       ; Copy bytes backward
58    cld
59    mov     eax, [esp + 12]             ; eax <- Destination as return value
60    ret
61InternalMemCopyMem  ENDP
62
63    END
64