summaryrefslogtreecommitdiff
path: root/ArmPkg/Library/BaseMemoryLibStm/Arm/SetMem.asm
diff options
context:
space:
mode:
Diffstat (limited to 'ArmPkg/Library/BaseMemoryLibStm/Arm/SetMem.asm')
-rwxr-xr-xArmPkg/Library/BaseMemoryLibStm/Arm/SetMem.asm83
1 files changed, 83 insertions, 0 deletions
diff --git a/ArmPkg/Library/BaseMemoryLibStm/Arm/SetMem.asm b/ArmPkg/Library/BaseMemoryLibStm/Arm/SetMem.asm
new file mode 100755
index 0000000000..7304f1c509
--- /dev/null
+++ b/ArmPkg/Library/BaseMemoryLibStm/Arm/SetMem.asm
@@ -0,0 +1,83 @@
+;------------------------------------------------------------------------------
+;
+; SetMem() 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. It was updated to do 32-byte at a time.
+;
+; 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
+ )
+**/
+
+ EXPORT InternalMemSetMem
+
+ AREA AsmMemStuff, CODE, READONLY
+
+InternalMemSetMem
+ stmfd sp!, {r4-r11, lr}
+ tst r0, #3
+ movne r3, #0
+ moveq r3, #1
+ cmp r1, #31
+ movls lr, #0
+ andhi lr, r3, #1
+ cmp lr, #0
+ mov r12, r0
+ bne L31
+L32
+ mov r3, #0
+ b L43
+L31
+ and r4, r2, #0xff
+ orr r4, r4, r4, LSL #8
+ orr r4, r4, r4, LSL #16
+ mov r5, r4
+ mov r5, r4
+ mov r6, r4
+ mov r7, r4
+ mov r8, r4
+ mov r9, r4
+ mov r10, r4
+ mov r11, r4
+ b L32
+L34
+ cmp lr, #0
+ streqb r2, [r12], #1
+ subeq r1, r1, #1
+ beq L43
+ sub r1, r1, #32
+ cmp r1, #31
+ movls lr, r3
+ stmia r12!, {r4-r11}
+L43
+ cmp r1, #0
+ bne L34
+ ldmfd sp!, {r4-r11, pc}
+
+ END
+ \ No newline at end of file