11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved. 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions of source code must retain the above copyright 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the documentation and/or other materials provided with the 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * distribution. 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 29420878c6908cf9c2862888477ec3f424a06cf172Kenny Root#include <machine/asm.h> 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Optimized memset() for ARM. 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * memset() returns its first argument. 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 37420878c6908cf9c2862888477ec3f424a06cf172Kenny RootENTRY(bzero) 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mov r2, r1 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mov r1, #0 40420878c6908cf9c2862888477ec3f424a06cf172Kenny RootEND(bzero) 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 42420878c6908cf9c2862888477ec3f424a06cf172Kenny RootENTRY(memset) 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* compute the offset to align the destination 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * offset = (4-(src&3))&3 = -src & 3 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project .save {r0, r4-r7, lr} 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project stmfd sp!, {r0, r4-r7, lr} 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rsb r3, r0, #0 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ands r3, r3, #3 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cmp r3, r2 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project movhi r3, r2 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* splat r1 */ 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mov r1, r1, lsl #24 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project orr r1, r1, r1, lsr #8 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project orr r1, r1, r1, lsr #16 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project movs r12, r3, lsl #31 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcsb r1, [r0], #1 /* can't use strh (alignment unknown) */ 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcsb r1, [r0], #1 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strmib r1, [r0], #1 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project subs r2, r2, r3 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ldmlsfd sp!, {r0, r4-r7, lr} /* return */ 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project bxls lr 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* align the destination to a cache-line */ 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mov r12, r1 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mov lr, r1 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mov r4, r1 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mov r5, r1 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mov r6, r1 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mov r7, r1 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rsb r3, r0, #0 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ands r3, r3, #0x1C 767e7d6c48a064af82f0ec39f47b9eb803a6e1df4cMathias Agopian beq 3f 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cmp r3, r2 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project andhi r3, r2, #0x1C 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sub r2, r2, r3 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* conditionnaly writes 0 to 7 words (length in r3) */ 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project movs r3, r3, lsl #28 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project stmcsia r0!, {r1, lr} 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project stmcsia r0!, {r1, lr} 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project stmmiia r0!, {r1, lr} 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project movs r3, r3, lsl #2 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcs r1, [r0], #4 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 897e7d6c48a064af82f0ec39f47b9eb803a6e1df4cMathias Agopian3: 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project subs r2, r2, #32 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mov r3, r1 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project bmi 2f 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project1: subs r2, r2, #32 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project stmia r0!, {r1,r3,r4,r5,r6,r7,r12,lr} 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project bhs 1b 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project2: add r2, r2, #32 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* conditionnaly stores 0 to 31 bytes */ 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project movs r2, r2, lsl #28 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project stmcsia r0!, {r1,r3,r12,lr} 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project stmmiia r0!, {r1, lr} 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project movs r2, r2, lsl #2 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcs r1, [r0], #4 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strmih r1, [r0], #2 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project movs r2, r2, lsl #2 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcsb r1, [r0] 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ldmfd sp!, {r0, r4-r7, lr} 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project bx lr 109420878c6908cf9c2862888477ec3f424a06cf172Kenny RootEND(memset) 110