summaryrefslogtreecommitdiff
path: root/ArmPkg/Library/BaseMemoryLibVstm/Arm/SetMem.S
diff options
context:
space:
mode:
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2010-04-21 22:04:35 +0000
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2010-04-21 22:04:35 +0000
commitd39eb83cc5ce2147264e2ea3566c4dbf7eb9888d (patch)
treeb606874083dc56330d7b1650599d620f39f0b1df /ArmPkg/Library/BaseMemoryLibVstm/Arm/SetMem.S
parentd02b28d736c19b9a59690008e56c63e839fcf28f (diff)
downloadedk2-platforms-d39eb83cc5ce2147264e2ea3566c4dbf7eb9888d.tar.xz
Add some ldm/vldm optimized CopyMem routines. Add performance macros to BDS
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10388 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'ArmPkg/Library/BaseMemoryLibVstm/Arm/SetMem.S')
-rwxr-xr-xArmPkg/Library/BaseMemoryLibVstm/Arm/SetMem.S80
1 files changed, 80 insertions, 0 deletions
diff --git a/ArmPkg/Library/BaseMemoryLibVstm/Arm/SetMem.S b/ArmPkg/Library/BaseMemoryLibVstm/Arm/SetMem.S
new file mode 100755
index 0000000000..44c6d4bece
--- /dev/null
+++ b/ArmPkg/Library/BaseMemoryLibVstm/Arm/SetMem.S
@@ -0,0 +1,80 @@
+#------------------------------------------------------------------------------
+#
+# SemMem() worker for ARM
+#
+# This file started out as C code that did 64 bit moves if the buffer was
+# 32-bit aligned, else it does a byte copy. It also does a byte copy for
+# any trailing bytes. Update to use VSTM/VLDM to do 128 byte writes.
+#
+# Copyright (c) 2008-2010 Apple Inc. All rights reserved.<BR>
+# 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.
+#
+#------------------------------------------------------------------------------
+
+/**
+ Set Buffer to Value for Size bytes.
+
+ @param Buffer Memory to set.
+ @param Length Number of bytes to set
+ @param Value Value of the set operation.
+
+ @return Buffer
+
+VOID *
+EFIAPI
+InternalMemSetMem (
+ OUT VOID *Buffer,
+ IN UINTN Length,
+ IN UINT8 Value
+ )
+**/
+
+.text
+.align 2
+.globl ASM_PFX(InternalMemSetMem)
+
+ASM_PFX(InternalMemSetMem):
+ stmfd sp!, {r4-r7, lr}
+ tst r0, #3
+ movne r3, #0
+ moveq r3, #1
+ cmp r1, #127
+ movls lr, #0
+ andhi lr, r3, #1
+ cmp lr, #0
+ mov r12, r0
+ bne L31
+L32:
+ mov r3, #0
+ b L43
+L31:
+ vdup.8 q0,r2
+ vmov q1,q0
+ vmov q2,q0
+ vmov q3,q0
+ vmov q4,q0
+ vmov q5,q0
+ vmov q6,q0
+ vmov q7,q0
+ b L32
+L34:
+ cmp lr, #0
+ streqb r2, [r12], #1
+ subeq r1, r1, #1
+ beq L43
+ sub r1, r1, #128
+ cmp r1, #127
+ cmp r1, #31
+ movls lr, r3
+ vstm r12!, {d0-d15}
+L43:
+ cmp r1, #0
+ bne L34
+ ldmfd sp!, {pc}
+ \ No newline at end of file