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 #------------------------------------------------------------------------------
19 ASM_GLOBAL ASM_PFX(InternalMemSetMem16)
20 ASM_PFX(InternalMemSetMem16):
23 orr r2, r2, r2, lsl #16
26 ASM_GLOBAL ASM_PFX(InternalMemSetMem32)
27 ASM_PFX(InternalMemSetMem32):
31 ASM_GLOBAL ASM_PFX(InternalMemSetMem64)
32 ASM_PFX(InternalMemSetMem64):
37 ASM_GLOBAL ASM_PFX(InternalMemSetMem)
38 ASM_PFX(InternalMemSetMem):
40 orr r2, r2, r2, lsl #8
41 orr r2, r2, r2, lsl #16
44 ASM_GLOBAL ASM_PFX(InternalMemZeroMem)
45 ASM_PFX(InternalMemZeroMem):
50 cmp r1, #16 // fewer than 16 bytes of input?
51 add r1, r1, r0 // r1 := dst + length
54 bic lr, lr, #15 // align output pointer
56 str r2, [r0] // potentially unaligned store of 4 bytes
57 str r3, [r0, #4] // potentially unaligned store of 4 bytes
58 str r2, [r0, #8] // potentially unaligned store of 4 bytes
59 str r3, [r0, #12] // potentially unaligned store of 4 bytes
62 0: add lr, lr, #16 // advance the output pointer by 16 bytes
63 subs r4, r1, lr // past the output?
64 blt 3f // break out of the loop
65 strd r2, r3, [lr, #-16] // aligned store of 16 bytes
66 strd r2, r3, [lr, #-8]
67 bne 0b // goto beginning of loop
73 cmp r4, #4 // between 4 and 15 bytes?
75 cmp r4, #8 // between 8 and 15 bytes?
77 str r2, [r4] // overlapping store of 4 + (4 + 4) + 4 bytes
85 4: cmp r4, #2 // 2 or 3 bytes?
86 strb r2, [lr, #-16] // store 1 byte
88 strhge.n r2, [r1, #6] // store 2 bytes