| ;------------------------------------------------------------------------------ | |
| ; | |
| ; 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 |