]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Library/BaseMemoryLibOptDxe/Arm/SetMem.asm
2a8dc7d019f4e39d7bb55c2ed68c503ae66853c1
[mirror_edk2.git] / MdePkg / Library / BaseMemoryLibOptDxe / Arm / SetMem.asm
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 EXPORT InternalMemZeroMem
16 EXPORT InternalMemSetMem
17 EXPORT InternalMemSetMem16
18 EXPORT InternalMemSetMem32
19 EXPORT InternalMemSetMem64
20
21 AREA SetMem, CODE, READONLY, CODEALIGN, ALIGN=5
22 THUMB
23
24 InternalMemZeroMem
25 movs r2, #0
26
27 InternalMemSetMem
28 uxtb r2, r2
29 orr r2, r2, r2, lsl #8
30
31 InternalMemSetMem16
32 uxth r2, r2
33 orr r2, r2, r2, lsr #16
34
35 InternalMemSetMem32
36 mov r3, r2
37
38 InternalMemSetMem64
39 push {r4, lr}
40 cmp r1, #16 ; fewer than 16 bytes of input?
41 add r1, r1, r0 ; r1 := dst + length
42 add lr, r0, #16
43 blt L2
44 bic lr, lr, #15 ; align output pointer
45
46 str r2, [r0] ; potentially unaligned store of 4 bytes
47 str r3, [r0, #4] ; potentially unaligned store of 4 bytes
48 str r2, [r0, #8] ; potentially unaligned store of 4 bytes
49 str r3, [r0, #12] ; potentially unaligned store of 4 bytes
50 beq L1
51
52 L0
53 add lr, lr, #16 ; advance the output pointer by 16 bytes
54 subs r4, r1, lr ; past the output?
55 blt L3 ; break out of the loop
56 strd r2, r3, [lr, #-16] ; aligned store of 16 bytes
57 strd r2, r3, [lr, #-8]
58 bne L0 ; goto beginning of loop
59 L1
60 pop {r4, pc}
61
62 L2
63 subs r4, r1, lr
64 L3
65 adds r4, r4, #16
66 subs r1, r1, #8
67 cmp r4, #4 ; between 4 and 15 bytes?
68 blt L4
69 cmp r4, #8 ; between 8 and 15 bytes?
70 str r2, [lr, #-16] ; overlapping store of 4 + (4 + 4) + 4 bytes
71 itt gt
72 strgt r3, [lr, #-12]
73 strgt r2, [r1]
74 str r3, [r1, #4]
75 pop {r4, pc}
76
77 L4
78 cmp r4, #2 ; 2 or 3 bytes?
79 strb r2, [lr, #-16] ; store 1 byte
80 it ge
81 strhge r2, [r1, #6] ; store 2 bytes
82 pop {r4, pc}
83
84 END