Revision: 16328
          http://sourceforge.net/p/edk2/code/16328
Author:   oliviermartin
Date:     2014-11-11 00:52:11 +0000 (Tue, 11 Nov 2014)
Log Message:
-----------
ArmPkg/CompilerIntrinsicesLib: Fixed memmove() and memset()

- Fixed memmove when going backward: the copy started one byte
  after the end of the region to copy
- memset: - removed unused register
          - fixed arguments size and character arguments were
            actually reversed
- Added memmove() to ARM32 GCC

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <[email protected]>

Modified Paths:
--------------
    trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.asm
    trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S
    trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm
    trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf

Added Paths:
-----------
    trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S

Added: trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S
===================================================================
--- trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S               
                (rev 0)
+++ trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S       
2014-11-11 00:52:11 UTC (rev 16328)
@@ -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

Modified: trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.asm
===================================================================
--- trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.asm     
2014-11-11 00:51:11 UTC (rev 16327)
+++ trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.asm     
2014-11-11 00:52:11 UTC (rev 16328)
@@ -1,6 +1,6 @@
 
//------------------------------------------------------------------------------
 //
-// Copyright (c) 2011, ARM Limited. All rights reserved.
+// 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
@@ -28,27 +28,26 @@
 ;
 __aeabi_memmove
   CMP     r2, #0
-  BXEQ    r14
+  BXEQ    lr
   CMP     r0, r1
-  BXEQ    r14
+  BXEQ    lr
   BHI     memmove_backward
-  BLS     memmove_forward
 
 memmove_forward
   LDRB    r3, [r1], #1
   STRB    r3, [r0], #1
   SUBS    r2, r2, #1
-  BXEQ    r14
-  B       memmove_forward
+  BNE     memmove_forward
+  BX      lr
 
 memmove_backward
   add     r0, r2
   add     r1, r2
 memmove_backward_loop
-  LDRB    r3, [r1], #-1
-  STRB    r3, [r0], #-1
-  SUBS    r2, r2, #-1
-  BXEQ    r14
-  B       memmove_backward_loop
+  LDRB    r3, [r1, #-1]!
+  STRB    r3, [r0, #-1]!
+  SUBS    r2, r2, #1
+  BNE     memmove_backward_loop
+  BX      lr
 
   END

Modified: trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S
===================================================================
--- trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S        
2014-11-11 00:51:11 UTC (rev 16327)
+++ trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S        
2014-11-11 00:52:11 UTC (rev 16328)
@@ -1,6 +1,7 @@
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+# Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
 #
 # This program and the accompanying materials
 # are licensed and made available under the terms and conditions of the BSD 
License
@@ -17,22 +18,21 @@
   .align 2
   GCC_ASM_EXPORT (memset)
 
-
+# VOID
+# EFIAPI
+# memset (
+#  IN  VOID    *Destination,
+#  IN  UINT32  Character,
+#  IN  UINT32  Size
+#  );
 ASM_PFX(memset):
-
+  cmp  r2, #0
+  bxeq lr
   @ args = 0, pretend = 0, frame = 0
   @ frame_needed = 1, uses_anonymous_args = 0
-  stmfd  sp!, {r7, lr}
-  mov  ip, #0
-  add  r7, sp, #0
-  mov  lr, r0
-  b  L9
 L10:
-  and  r3, r1, #255
-  add  ip, ip, #1
-  strb  r3, [lr], #1
-L9:
-  cmp  ip, r2
+  strb  r1, [r0], #1
+  subs  r2, r2, #1
+  @ While size is not 0
   bne  L10
-  ldmfd  sp!, {r7, pc}
-
+  bx   lr

Modified: trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm
===================================================================
--- trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm      
2014-11-11 00:51:11 UTC (rev 16327)
+++ trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm      
2014-11-11 00:52:11 UTC (rev 16328)
@@ -1,6 +1,7 @@
 
//------------------------------------------------------------------------------
 //
 // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+// Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
 //
 // This program and the accompanying materials
 // are licensed and made available under the terms and conditions of the BSD 
License
@@ -19,41 +20,31 @@
 
     AREA    Memset, CODE, READONLY
 
+; void __aeabi_memclr4(void *dest, size_t n);
+; void __aeabi_memclr(void *dest, size_t n);
+__aeabi_memclr
+__aeabi_memclr4
+  mov   r2, #0
+
 ;
 ;VOID
 ;EFIAPI
 ;__aeabi_memset (
 ; IN  VOID    *Destination,
-; IN  UINT32  Character,
-; IN  UINT32  Size
+; IN  UINT32  Size,
+; IN  UINT32  Character
 ; );
 ;
 __aeabi_memset
-
+  cmp  r1, #0
+  bxeq lr
   ; args = 0, pretend = 0, frame = 0
   ; frame_needed = 1, uses_anonymous_args = 0
-  stmfd  sp!, {r7, lr}
-  mov  ip, #0
-  add  r7, sp, #0
-  mov  lr, r0
-  b  L9
 L10
-  and  r3, r1, #255
-  add  ip, ip, #1
-  strb  r3, [lr], #1
-L9
-  cmp  ip, r2
+  strb  r2, [r0], #1
+  subs  r1, r1, #1
+  ; While size is not 0
   bne  L10
-  ldmfd  sp!, {r7, pc}
+  bx   lr
 
-__aeabi_memclr
-  mov   r2, r1
-  mov   r1, #0
-  b     __aeabi_memset
-
-__aeabi_memclr4
-  mov   r2, r1
-  mov   r1, #0
-  b     __aeabi_memset
-
   END

Modified: 
trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
===================================================================
--- trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf   
2014-11-11 00:51:11 UTC (rev 16327)
+++ trunk/edk2/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf   
2014-11-11 00:52:11 UTC (rev 16328)
@@ -60,6 +60,7 @@
 
   Arm/memcpy.S     | GCC
   Arm/memset.S     | GCC
+  Arm/memmove.S    | GCC
 
 #  Arm/modsi3.c     | GCC
 #  Arm/moddi3.c     | GCC


------------------------------------------------------------------------------
Comprehensive Server Monitoring with Site24x7.
Monitor 10 servers for $9/Month.
Get alerted through email, SMS, voice calls or mobile push notifications.
Take corrective actions from your mobile device.
http://pubads.g.doubleclick.net/gampad/clk?id=154624111&iu=/4140/ostg.clktrk
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to