1#------------------------------------------------------------------------------ 2# 3# SemMem() worker for ARM 4# 5# This file started out as C code that did 64 bit moves if the buffer was 6# 32-bit aligned, else it does a byte copy. It also does a byte copy for 7# any trailing bytes. Update to use VSTM/VLDM to do 128 byte writes. 8# 9# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR> 10# This program and the accompanying materials 11# are licensed and made available under the terms and conditions of the BSD License 12# which accompanies this distribution. The full text of the license may be found at 13# http://opensource.org/licenses/bsd-license.php 14# 15# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 16# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 17# 18#------------------------------------------------------------------------------ 19 20/** 21 Set Buffer to Value for Size bytes. 22 23 @param Buffer Memory to set. 24 @param Length Number of bytes to set 25 @param Value Value of the set operation. 26 27 @return Buffer 28 29VOID * 30EFIAPI 31InternalMemSetMem ( 32 OUT VOID *Buffer, 33 IN UINTN Length, 34 IN UINT8 Value 35 ) 36**/ 37 38.text 39.align 2 40GCC_ASM_EXPORT(InternalMemSetMem) 41 42ASM_PFX(InternalMemSetMem): 43 stmfd sp!, {r4-r7, lr} 44 tst r0, #3 45 movne r3, #0 46 moveq r3, #1 47 cmp r1, #127 48 movls lr, #0 49 andhi lr, r3, #1 50 cmp lr, #0 51 mov r12, r0 52 bne L31 53L32: 54 mov r3, #0 55 b L43 56L31: 57 vdup.8 q0,r2 58 vmov q1,q0 59 vmov q2,q0 60 vmov q3,q0 61 vmov q4,q0 62 vmov q5,q0 63 vmov q6,q0 64 vmov q7,q0 65 b L32 66L34: 67 cmp lr, #0 68 streqb r2, [r12], #1 69 subeq r1, r1, #1 70 beq L43 71 sub r1, r1, #128 72 cmp r1, #127 73 cmp r1, #31 74 movls lr, r3 75 vstm r12!, {d0-d15} 76L43: 77 cmp r1, #0 78 bne L34 79 ldmfd sp!, {pc} 80