--- /dev/null
+#------------------------------------------------------------------------------\r
+#\r
+# Copyright (c) 2011-2014, ARM Limited. All rights reserved.\r
+#\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+ .text\r
+ .align 2\r
+ GCC_ASM_EXPORT (memmove)\r
+\r
+# VOID\r
+# EFIAPI\r
+# memmove (\r
+# IN VOID *Destination,\r
+# IN CONST VOID *Source,\r
+# IN UINT32 Size\r
+# );\r
+ASM_PFX(memmove):\r
+ CMP r2, #0\r
+ BXEQ lr\r
+ CMP r0, r1\r
+ BXEQ lr\r
+ BHI memmove_backward\r
+\r
+memmove_forward:\r
+ LDRB r3, [r1], #1\r
+ STRB r3, [r0], #1\r
+ SUBS r2, r2, #1\r
+ BXEQ lr\r
+ B memmove_forward\r
+\r
+memmove_backward:\r
+ add r0, r2\r
+ add r1, r2\r
+memmove_backward_loop:\r
+ LDRB r3, [r1, #-1]!\r
+ STRB r3, [r0, #-1]!\r
+ SUBS r2, r2, #1\r
+ BXEQ lr\r
+ B memmove_backward_loop\r