diff options
author | Olivier Martin <olivier.martin@arm.com> | 2014-11-11 00:52:11 +0000 |
---|---|---|
committer | oliviermartin <oliviermartin@Edk2> | 2014-11-11 00:52:11 +0000 |
commit | 284fb5c811fb7784ee3afa753dbdf5b389c4cdce (patch) | |
tree | 5c006b75429d4c12199763eb3ba370708ab51181 /ArmPkg/Library | |
parent | fb7ea6114a780b2fe0da56156d65fa7659ffe2e2 (diff) | |
download | edk2-platforms-284fb5c811fb7784ee3afa753dbdf5b389c4cdce.tar.xz |
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 <olivier.martin@arm.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16328 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'ArmPkg/Library')
5 files changed, 88 insertions, 49 deletions
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
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.asm index ff7552d1c6..2147e29dbd 100755 --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.asm +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.asm @@ -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
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S index 7290e85958..0c7789eb58 100644 --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S @@ -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
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm index 74e0243048..bae3c1fada 100755 --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm @@ -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}
-
-__aeabi_memclr
- mov r2, r1
- mov r1, #0
- b __aeabi_memset
-
-__aeabi_memclr4
- mov r2, r1
- mov r1, #0
- b __aeabi_memset
+ bx lr
END
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf index a1c9ae65b0..3487787a9c 100644 --- a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf +++ b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf @@ -60,6 +60,7 @@ Arm/memcpy.S | GCC
Arm/memset.S | GCC
+ Arm/memmove.S | GCC
# Arm/modsi3.c | GCC
# Arm/moddi3.c | GCC
|