/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * memset32.S * */ .text .align .global android_memset32 .type android_memset32, %function .global android_memset16 .type android_memset16, %function /* * Optimized memset32 and memset16 for ARM. * * void android_memset16(uint16_t* dst, uint16_t value, size_t size); * void android_memset32(uint32_t* dst, uint32_t value, size_t size); * */ android_memset16: .fnstart cmp r2, #1 bxle lr /* expand the data to 32 bits */ mov r1, r1, lsl #16 orr r1, r1, r1, lsr #16 /* align to 32 bits */ tst r0, #2 strneh r1, [r0], #2 subne r2, r2, #2 .fnend android_memset32: .fnstart .cfi_startproc str lr, [sp, #-4]! .cfi_def_cfa_offset 4 .cfi_rel_offset lr, 0 /* align the destination to a cache-line */ mov r12, r1 mov lr, r1 rsb r3, r0, #0 ands r3, r3, #0x1C beq .Laligned32 cmp r3, r2 andhi r3, r2, #0x1C sub r2, r2, r3 /* conditionally writes 0 to 7 words (length in r3) */ movs r3, r3, lsl #28 stmcsia r0!, {r1, lr} stmcsia r0!, {r1, lr} stmmiia r0!, {r1, lr} movs r3, r3, lsl #2 strcs r1, [r0], #4 .Laligned32: mov r3, r1 1: subs r2, r2, #32 stmhsia r0!, {r1,r3,r12,lr} stmhsia r0!, {r1,r3,r12,lr} bhs 1b add r2, r2, #32 /* conditionally stores 0 to 30 bytes */ movs r2, r2, lsl #28 stmcsia r0!, {r1,r3,r12,lr} stmmiia r0!, {r1,lr} movs r2, r2, lsl #2 strcs r1, [r0], #4 strmih lr, [r0], #2 ldr lr, [sp], #4 .cfi_def_cfa_offset 0 .cfi_restore lr bx lr .cfi_endproc .fnend