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