]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPkg/Library/BaseMemoryLibStm/Arm/SetMem.asm
1d5191f78fe36a0b2ec86f74e5108b9fcfe4b6f3
[mirror_edk2.git] / ArmPkg / Library / BaseMemoryLibStm / Arm / SetMem.asm
1 ;------------------------------------------------------------------------------
2 ;
3 ; SetMem() worker for ARM
4 ;
5 ; This file started out as C code that did 64 bit moves if the buffer was
6 ; 32-bit aligned, else it does a byte copy. It also does a byte copy for
7 ; any trailing bytes. It was updated to do 32-byte at a time.
8 ;
9 ; Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
10 ; This program and the accompanying materials
11 ; are licensed and made available under the terms and conditions of the BSD License
12 ; which accompanies this distribution. The full text of the license may be found at
13 ; http://opensource.org/licenses/bsd-license.php
14 ;
15 ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
16 ; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 ;
18
19 /**
20 Set Buffer to Value for Size bytes.
21
22 @param Buffer Memory to set.
23 @param Length Number of bytes to set
24 @param Value Value of the set operation.
25
26 @return Buffer
27
28 VOID *
29 EFIAPI
30 InternalMemSetMem (
31 OUT VOID *Buffer,
32 IN UINTN Length,
33 IN UINT8 Value
34 )
35 **/
36
37
38 INCLUDE AsmMacroExport.inc
39
40 RVCT_ASM_EXPORT InternalMemSetMem
41 stmfd sp!, {r4-r11, lr}
42 tst r0, #3
43 movne r3, #0
44 moveq r3, #1
45 cmp r1, #31
46 movls lr, #0
47 andhi lr, r3, #1
48 cmp lr, #0
49 mov r12, r0
50 bne L31
51 L32
52 mov r3, #0
53 b L43
54 L31
55 and r4, r2, #0xff
56 orr r4, r4, r4, LSL #8
57 orr r4, r4, r4, LSL #16
58 mov r5, r4
59 mov r6, r4
60 mov r7, r4
61 mov r8, r4
62 mov r9, r4
63 mov r10, r4
64 mov r11, r4
65 b L32
66 L34
67 cmp lr, #0
68 streqb r2, [r12], #1
69 subeq r1, r1, #1
70 beq L43
71 sub r1, r1, #32
72 cmp r1, #31
73 movls lr, r3
74 stmia r12!, {r4-r11}
75 L43
76 cmp r1, #0
77 bne L34
78 ldmfd sp!, {r4-r11, pc}
79
80 END