summaryrefslogtreecommitdiff
path: root/OldMdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S
blob: c4ecdc70eb48584c261af9922f2d6d95fa8ac4a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#------------------------------------------------------------------------------
#
# 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