1#------------------------------------------------------------------------------
2#
3# Copyright (c) 2008, 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#   EfiCopyMemRep1.S
15#
16# Abstract:
17#
18#   CopyMem function
19#
20# Notes:
21#
22#------------------------------------------------------------------------------
23#include <EfiBind.h>
24
25    .code:
26
27.globl ASM_PFX(EfiCommonLibCopyMem)
28
29#------------------------------------------------------------------------------
30# VOID
31# EfiCommonLibCopyMem (
32#   OUT     VOID                      *Destination,
33#   IN      VOID                      *Source,
34#   IN      UINTN                     Count
35#   );
36#------------------------------------------------------------------------------
37ASM_PFX(EfiCommonLibCopyMem):
38      push   %rsi
39      push   %rdi
40      cmp    %rcx,%rdx
41      je     CopyMemDone
42      cmp    $0x0,%r8
43      je     CopyMemDone
44      mov    %rdx,%rsi
45      mov    %rcx,%rdi
46      lea    -1(%r8,%rsi,1),%r9
47      cmp    %rdi,%rsi
48      jae    CopyBytes
49      cmp    %rdi,%r9
50      jb     CopyBytes
51      mov    %r9,%rsi
52      lea    -1(%r8,%rdi,1),%rdi
53      std
54
55CopyBytes:
56      mov    %r8,%rcx
57      rep movsb %ds:(%rsi),%es:(%rdi)
58      cld
59
60CopyMemDone:
61      pop    %rdi
62      pop    %rsi
63      retq
64
65
66
67