]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S
ArmPkg/CompilerIntrinsicesLib: Fixed memmove() and memset()
[mirror_edk2.git] / ArmPkg / Library / CompilerIntrinsicsLib / Arm / memmove.S
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S
new file mode 100644 (file)
index 0000000..79f95b0
--- /dev/null
@@ -0,0 +1,48 @@
+#------------------------------------------------------------------------------\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