1 ;------------------------------------------------------------------------------
3 ; Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
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
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.
13 ;------------------------------------------------------------------------------
15 EXPORT InternalMemZeroMem
16 EXPORT InternalMemSetMem
17 EXPORT InternalMemSetMem16
18 EXPORT InternalMemSetMem32
19 EXPORT InternalMemSetMem64
21 AREA SetMem, CODE, READONLY, CODEALIGN, ALIGN=5
29 orr r2, r2, r2, lsl #8
33 orr r2, r2, r2, lsr #16
40 cmp r1, #16 ; fewer than 16 bytes of input?
41 add r1, r1, r0 ; r1 := dst + length
44 bic lr, lr, #15 ; align output pointer
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
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
67 cmp r4, #4 ; between 4 and 15 bytes?
69 cmp r4, #8 ; between 8 and 15 bytes?
70 str r2, [lr, #-16] ; overlapping store of 4 + (4 + 4) + 4 bytes
78 cmp r4, #2 ; 2 or 3 bytes?
79 strb r2, [lr, #-16] ; store 1 byte
81 strhge r2, [r1, #6] ; store 2 bytes