MdePkg/BaseMemoryLibOptDxe ARM: add missing function annotations
[mirror_edk2.git] / MdePkg / Library / BaseMemoryLibOptDxe / Arm / SetMem.S
1 #------------------------------------------------------------------------------
2 #
3 # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
4 #
5 # This program and the accompanying materials are licensed and made available
6 # under the terms and conditions of the BSD License which accompanies this
7 # distribution. The full text of the license may be found at
8 # http://opensource.org/licenses/bsd-license.php
9 #
10 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 #
13 #------------------------------------------------------------------------------
14
15 .text
16 .thumb
17 .syntax unified
18 .align 5
19 .type ASM_PFX(InternalMemSetMem16), %function
20 ASM_GLOBAL ASM_PFX(InternalMemSetMem16)
21 ASM_PFX(InternalMemSetMem16):
22 uxth r2, r2
23 lsl r1, r1, #1
24 orr r2, r2, r2, lsl #16
25 b 0f
26
27 .type ASM_PFX(InternalMemSetMem32), %function
28 ASM_GLOBAL ASM_PFX(InternalMemSetMem32)
29 ASM_PFX(InternalMemSetMem32):
30 lsl r1, r1, #2
31 b 0f
32
33 .type ASM_PFX(InternalMemSetMem64), %function
34 ASM_GLOBAL ASM_PFX(InternalMemSetMem64)
35 ASM_PFX(InternalMemSetMem64):
36 lsl r1, r1, #3
37 b 1f
38
39 .align 5
40 .type ASM_PFX(InternalMemSetMem), %function
41 ASM_GLOBAL ASM_PFX(InternalMemSetMem)
42 ASM_PFX(InternalMemSetMem):
43 uxtb r2, r2
44 orr r2, r2, r2, lsl #8
45 orr r2, r2, r2, lsl #16
46 b 0f
47
48 .type ASM_PFX(InternalMemZeroMem), %function
49 ASM_GLOBAL ASM_PFX(InternalMemZeroMem)
50 ASM_PFX(InternalMemZeroMem):
51 movs r2, #0
52 0: mov r3, r2
53
54 1: push {r4, lr}
55 cmp r1, #16 // fewer than 16 bytes of input?
56 add r1, r1, r0 // r1 := dst + length
57 add lr, r0, #16
58 blt 2f
59 bic lr, lr, #15 // align output pointer
60
61 str r2, [r0] // potentially unaligned store of 4 bytes
62 str r3, [r0, #4] // potentially unaligned store of 4 bytes
63 str r2, [r0, #8] // potentially unaligned store of 4 bytes
64 str r3, [r0, #12] // potentially unaligned store of 4 bytes
65 beq 1f
66
67 0: add lr, lr, #16 // advance the output pointer by 16 bytes
68 subs r4, r1, lr // past the output?
69 blt 3f // break out of the loop
70 strd r2, r3, [lr, #-16] // aligned store of 16 bytes
71 strd r2, r3, [lr, #-8]
72 bne 0b // goto beginning of loop
73 1: pop {r4, pc}
74
75 2: subs r4, r1, lr
76 3: adds r4, r4, #16
77 subs r1, r1, #8
78 cmp r4, #4 // between 4 and 15 bytes?
79 blt 4f
80 cmp r4, #8 // between 8 and 15 bytes?
81 sub r4, lr, #16
82 str r2, [r4] // overlapping store of 4 + (4 + 4) + 4 bytes
83 it gt
84 strgt.n r3, [r4, #4]
85 it gt
86 strgt.n r2, [r1]
87 str r3, [r1, #4]
88 pop {r4, pc}
89
90 4: cmp r4, #2 // 2 or 3 bytes?
91 strb r2, [lr, #-16] // store 1 byte
92 it ge
93 strhge.n r2, [r1, #6] // store 2 bytes
94 pop {r4, pc}