]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Library/BaseMemoryLib/CopyMem.c
CodeReview for MdePkg/BaseMemoryXXX libraries. Refine file description, function...
[mirror_edk2.git] / MdePkg / Library / BaseMemoryLib / CopyMem.c
1 /** @file
2 Implementation of the InternalMemCopyMem routine. This function is broken
3 out into its own source file so that it can be excluded from a build for a
4 particular platform easily if an optimized version is desired.
5
6 Copyright (c) 2006 - 2008, Intel Corporation<BR>
7 All rights reserved. This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
11
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14
15 **/
16
17
18
19
20 #include "MemLibInternals.h"
21
22 /**
23 Copy Length bytes from Source to Destination.
24
25 @param Destination Target of copy
26 @param Source Place to copy from
27 @param Length Number of bytes to copy
28
29 @return Destination
30
31 **/
32 VOID *
33 EFIAPI
34 InternalMemCopyMem (
35 OUT VOID *Destination,
36 IN CONST VOID *Source,
37 IN UINTN Length
38 )
39 {
40 //
41 // Declare the local variables that actually move the data elements as
42 // volatile to prevent the optimizer from replacing this function with
43 // the intrinsic memcpy()
44 //
45 volatile UINT8 *Destination8;
46 CONST UINT8 *Source8;
47
48 if (Source > Destination) {
49 Destination8 = (UINT8*)Destination;
50 Source8 = (CONST UINT8*)Source;
51 while (Length-- != 0) {
52 *(Destination8++) = *(Source8++);
53 }
54 } else if (Source < Destination) {
55 Destination8 = (UINT8*)Destination + Length;
56 Source8 = (CONST UINT8*)Source + Length;
57 while (Length-- != 0) {
58 *(--Destination8) = *(--Source8);
59 }
60 }
61 return Destination;
62 }