]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Library/BaseMemoryLibOptDxe/Arm/SetMem.S
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdePkg / Library / BaseMemoryLibOptDxe / Arm / SetMem.S
1 #------------------------------------------------------------------------------
2 #
3 # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
4 #
5 # SPDX-License-Identifier: BSD-2-Clause-Patent
6 #
7 #------------------------------------------------------------------------------
8
9 .text
10 .thumb
11 .syntax unified
12 .align 5
13 .type ASM_PFX(InternalMemSetMem16), %function
14 ASM_GLOBAL ASM_PFX(InternalMemSetMem16)
15 ASM_PFX(InternalMemSetMem16):
16 uxth r2, r2
17 lsl r1, r1, #1
18 orr r2, r2, r2, lsl #16
19 b 0f
20
21 .type ASM_PFX(InternalMemSetMem32), %function
22 ASM_GLOBAL ASM_PFX(InternalMemSetMem32)
23 ASM_PFX(InternalMemSetMem32):
24 lsl r1, r1, #2
25 b 0f
26
27 .type ASM_PFX(InternalMemSetMem64), %function
28 ASM_GLOBAL ASM_PFX(InternalMemSetMem64)
29 ASM_PFX(InternalMemSetMem64):
30 lsl r1, r1, #3
31 b 1f
32
33 .align 5
34 .type ASM_PFX(InternalMemSetMem), %function
35 ASM_GLOBAL ASM_PFX(InternalMemSetMem)
36 ASM_PFX(InternalMemSetMem):
37 uxtb r2, r2
38 orr r2, r2, r2, lsl #8
39 orr r2, r2, r2, lsl #16
40 b 0f
41
42 .type ASM_PFX(InternalMemZeroMem), %function
43 ASM_GLOBAL ASM_PFX(InternalMemZeroMem)
44 ASM_PFX(InternalMemZeroMem):
45 movs r2, #0
46 0: mov r3, r2
47
48 1: push {r4, lr}
49 cmp r1, #16 // fewer than 16 bytes of input?
50 add r1, r1, r0 // r1 := dst + length
51 add lr, r0, #16
52 blt 2f
53 bic lr, lr, #15 // align output pointer
54
55 str r2, [r0] // potentially unaligned store of 4 bytes
56 str r3, [r0, #4] // potentially unaligned store of 4 bytes
57 str r2, [r0, #8] // potentially unaligned store of 4 bytes
58 str r3, [r0, #12] // potentially unaligned store of 4 bytes
59 beq 1f
60
61 0: add lr, lr, #16 // advance the output pointer by 16 bytes
62 subs r4, r1, lr // past the output?
63 blt 3f // break out of the loop
64 strd r2, r3, [lr, #-16] // aligned store of 16 bytes
65 strd r2, r3, [lr, #-8]
66 bne 0b // goto beginning of loop
67 1: pop {r4, pc}
68
69 2: subs r4, r1, lr
70 3: adds r4, r4, #16
71 subs r1, r1, #8
72 cmp r4, #4 // between 4 and 15 bytes?
73 blt 4f
74 cmp r4, #8 // between 8 and 15 bytes?
75 sub r4, lr, #16
76 str r2, [r4] // overlapping store of 4 + (4 + 4) + 4 bytes
77 it gt
78 strgt.n r3, [r4, #4]
79 it gt
80 strgt.n r2, [r1]
81 str r3, [r1, #4]
82 pop {r4, pc}
83
84 4: cmp r4, #2 // 2 or 3 bytes?
85 strb r2, [lr, #-16] // store 1 byte
86 it ge
87 strhge.n r2, [r1, #6] // store 2 bytes
88 pop {r4, pc}