mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-11 14:28:08 +01:00
7c0aa811ec
Signed-off-by: Sergey Isakov <isakov-sl@bk.ru>
91 lines
2.5 KiB
NASM
91 lines
2.5 KiB
NASM
;------------------------------------------------------------------------------
|
|
;
|
|
; Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
|
|
;
|
|
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
EXPORT InternalMemZeroMem
|
|
EXPORT InternalMemSetMem
|
|
EXPORT InternalMemSetMem16
|
|
EXPORT InternalMemSetMem32
|
|
EXPORT InternalMemSetMem64
|
|
|
|
AREA SetMem, CODE, READONLY, CODEALIGN, ALIGN=5
|
|
THUMB
|
|
|
|
InternalMemSetMem16
|
|
uxth r2, r2
|
|
lsl r1, r1, #1
|
|
orr r2, r2, r2, lsl #16
|
|
b B0
|
|
|
|
InternalMemSetMem32
|
|
lsl r1, r1, #2
|
|
b B0
|
|
|
|
InternalMemSetMem64
|
|
lsl r1, r1, #3
|
|
b B1
|
|
|
|
ALIGN 32
|
|
InternalMemSetMem
|
|
uxtb r2, r2
|
|
orr r2, r2, r2, lsl #8
|
|
orr r2, r2, r2, lsl #16
|
|
b B0
|
|
|
|
InternalMemZeroMem
|
|
movs r2, #0
|
|
B0
|
|
mov r3, r2
|
|
|
|
B1
|
|
push {r4, lr}
|
|
cmp r1, #16 ; fewer than 16 bytes of input?
|
|
add r1, r1, r0 ; r1 := dst + length
|
|
add lr, r0, #16
|
|
blt L2
|
|
bic lr, lr, #15 ; align output pointer
|
|
|
|
str r2, [r0] ; potentially unaligned store of 4 bytes
|
|
str r3, [r0, #4] ; potentially unaligned store of 4 bytes
|
|
str r2, [r0, #8] ; potentially unaligned store of 4 bytes
|
|
str r3, [r0, #12] ; potentially unaligned store of 4 bytes
|
|
beq L1
|
|
|
|
L0
|
|
add lr, lr, #16 ; advance the output pointer by 16 bytes
|
|
subs r4, r1, lr ; past the output?
|
|
blt L3 ; break out of the loop
|
|
strd r2, r3, [lr, #-16] ; aligned store of 16 bytes
|
|
strd r2, r3, [lr, #-8]
|
|
bne L0 ; goto beginning of loop
|
|
L1
|
|
pop {r4, pc}
|
|
|
|
L2
|
|
subs r4, r1, lr
|
|
L3
|
|
adds r4, r4, #16
|
|
subs r1, r1, #8
|
|
cmp r4, #4 ; between 4 and 15 bytes?
|
|
blt L4
|
|
cmp r4, #8 ; between 8 and 15 bytes?
|
|
str r2, [lr, #-16] ; overlapping store of 4 + (4 + 4) + 4 bytes
|
|
itt gt
|
|
strgt r3, [lr, #-12]
|
|
strgt r2, [r1]
|
|
str r3, [r1, #4]
|
|
pop {r4, pc}
|
|
|
|
L4
|
|
cmp r4, #2 ; 2 or 3 bytes?
|
|
strb r2, [lr, #-16] ; store 1 byte
|
|
it ge
|
|
strhge r2, [r1, #6] ; store 2 bytes
|
|
pop {r4, pc}
|
|
|
|
END
|