;------------------------------------------------------------------------------ ; ; Copyright (c) 2016, Linaro Ltd. All rights reserved.
; ; 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