1#------------------------------------------------------------------------------
2#
3# Copyright (c) 2011-2014, ARM Limited. All rights reserved.
4#
5# This program and the accompanying materials
6# are licensed and made available under the terms and conditions of the BSD License
7# which accompanies this distribution.  The full text of the license may be found at
8# http://opensource.org/licenses/bsd-license.php
9#
10# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12#
13#------------------------------------------------------------------------------
14
15  .text
16  .align 2
17  GCC_ASM_EXPORT (memmove)
18
19# VOID
20# EFIAPI
21# memmove (
22#  IN  VOID          *Destination,
23#  IN  CONST VOID    *Source,
24#  IN  UINT32        Size
25#  );
26ASM_PFX(memmove):
27  CMP     r2, #0
28  BXEQ    lr
29  CMP     r0, r1
30  BXEQ    lr
31  BHI     memmove_backward
32
33memmove_forward:
34  LDRB    r3, [r1], #1
35  STRB    r3, [r0], #1
36  SUBS    r2, r2, #1
37  BXEQ    lr
38  B       memmove_forward
39
40memmove_backward:
41  add     r0, r2
42  add     r1, r2
43memmove_backward_loop:
44  LDRB    r3, [r1, #-1]!
45  STRB    r3, [r0, #-1]!
46  SUBS    r2, r2, #1
47  BXEQ    lr
48  B       memmove_backward_loop
49