X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=ArmPkg%2FLibrary%2FCompilerIntrinsicsLib%2FArm%2Fmemmove.S;fp=ArmPkg%2FLibrary%2FCompilerIntrinsicsLib%2FArm%2Fmemmove.S;h=79f95b007d80a4355c211d62f0b1cd710a79a2bb;hp=0000000000000000000000000000000000000000;hb=284fb5c811fb7784ee3afa753dbdf5b389c4cdce;hpb=fb7ea6114a780b2fe0da56156d65fa7659ffe2e2 diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S new file mode 100644 index 0000000000..79f95b007d --- /dev/null +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S @@ -0,0 +1,48 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2011-2014, ARM Limited. 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. +# +#------------------------------------------------------------------------------ + + .text + .align 2 + GCC_ASM_EXPORT (memmove) + +# VOID +# EFIAPI +# memmove ( +# IN VOID *Destination, +# IN CONST VOID *Source, +# IN UINT32 Size +# ); +ASM_PFX(memmove): + CMP r2, #0 + BXEQ lr + CMP r0, r1 + BXEQ lr + BHI memmove_backward + +memmove_forward: + LDRB r3, [r1], #1 + STRB r3, [r0], #1 + SUBS r2, r2, #1 + BXEQ lr + B memmove_forward + +memmove_backward: + add r0, r2 + add r1, r2 +memmove_backward_loop: + LDRB r3, [r1, #-1]! + STRB r3, [r0, #-1]! + SUBS r2, r2, #1 + BXEQ lr + B memmove_backward_loop