]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Library/BaseMemoryLibMmx/Ia32/CopyMem.nasm
MdePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdePkg / Library / BaseMemoryLibMmx / Ia32 / CopyMem.nasm
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.nasm
9 ;
10 ; Abstract:
11 ;
12 ; CopyMem function
13 ;
14 ; Notes:
15 ;
16 ;------------------------------------------------------------------------------
17
18 SECTION .text
19
20 ;------------------------------------------------------------------------------
21 ; VOID *
22 ; EFIAPI
23 ; InternalMemCopyMem (
24 ; IN VOID *Destination,
25 ; IN VOID *Source,
26 ; IN UINTN Count
27 ; );
28 ;------------------------------------------------------------------------------
29 global ASM_PFX(InternalMemCopyMem)
30 ASM_PFX(InternalMemCopyMem):
31 push esi
32 push edi
33 mov esi, [esp + 16] ; esi <- Source
34 mov edi, [esp + 12] ; edi <- Destination
35 mov edx, [esp + 20] ; edx <- Count
36 lea eax, [esi + edx - 1] ; eax <- End of Source
37 cmp esi, edi
38 jae .0
39 cmp eax, edi ; Overlapped?
40 jae @CopyBackward ; Copy backward if overlapped
41 .0:
42 mov ecx, edx
43 and edx, 7
44 shr ecx, 3 ; ecx <- # of Qwords to copy
45 jz @CopyBytes
46 push eax
47 push eax
48 movq [esp], mm0 ; save mm0
49 .1:
50 movq mm0, [esi]
51 movq [edi], mm0
52 add esi, 8
53 add edi, 8
54 loop .1
55 movq mm0, [esp] ; restore mm0
56 pop ecx ; stack cleanup
57 pop ecx ; stack cleanup
58 jmp @CopyBytes
59 @CopyBackward:
60 mov esi, eax ; esi <- Last byte in Source
61 lea edi, [edi + edx - 1] ; edi <- Last byte in Destination
62 std
63 @CopyBytes:
64 mov ecx, edx
65 rep movsb
66 cld
67 mov eax, [esp + 12]
68 pop edi
69 pop esi
70 ret
71