173c04b32691cb344cb60289a646ded8fc551d09eJim Huang/* 273c04b32691cb344cb60289a646ded8fc551d09eJim Huang * Copyright (C) 2010 The Android Open Source Project 373c04b32691cb344cb60289a646ded8fc551d09eJim Huang * Copyright (c) 2008 ARM Ltd 473c04b32691cb344cb60289a646ded8fc551d09eJim Huang * All rights reserved. 573c04b32691cb344cb60289a646ded8fc551d09eJim Huang * 673c04b32691cb344cb60289a646ded8fc551d09eJim Huang * Redistribution and use in source and binary forms, with or without 773c04b32691cb344cb60289a646ded8fc551d09eJim Huang * modification, are permitted provided that the following conditions 873c04b32691cb344cb60289a646ded8fc551d09eJim Huang * are met: 973c04b32691cb344cb60289a646ded8fc551d09eJim Huang * 1. Redistributions of source code must retain the above copyright 1073c04b32691cb344cb60289a646ded8fc551d09eJim Huang * notice, this list of conditions and the following disclaimer. 1173c04b32691cb344cb60289a646ded8fc551d09eJim Huang * 2. Redistributions in binary form must reproduce the above copyright 1273c04b32691cb344cb60289a646ded8fc551d09eJim Huang * notice, this list of conditions and the following disclaimer in the 1373c04b32691cb344cb60289a646ded8fc551d09eJim Huang * documentation and/or other materials provided with the distribution. 1473c04b32691cb344cb60289a646ded8fc551d09eJim Huang * 3. The name of the company may not be used to endorse or promote 1573c04b32691cb344cb60289a646ded8fc551d09eJim Huang * products derived from this software without specific prior written 1673c04b32691cb344cb60289a646ded8fc551d09eJim Huang * permission. 1773c04b32691cb344cb60289a646ded8fc551d09eJim Huang * 1873c04b32691cb344cb60289a646ded8fc551d09eJim Huang * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED 1973c04b32691cb344cb60289a646ded8fc551d09eJim Huang * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 2073c04b32691cb344cb60289a646ded8fc551d09eJim Huang * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2173c04b32691cb344cb60289a646ded8fc551d09eJim Huang * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2273c04b32691cb344cb60289a646ded8fc551d09eJim Huang * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 2373c04b32691cb344cb60289a646ded8fc551d09eJim Huang * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2473c04b32691cb344cb60289a646ded8fc551d09eJim Huang * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2573c04b32691cb344cb60289a646ded8fc551d09eJim Huang * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2673c04b32691cb344cb60289a646ded8fc551d09eJim Huang * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 2773c04b32691cb344cb60289a646ded8fc551d09eJim Huang * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2873c04b32691cb344cb60289a646ded8fc551d09eJim Huang * 2973c04b32691cb344cb60289a646ded8fc551d09eJim Huang * Android adaptation and tweak by Jim Huang <jserv@0xlab.org>. 3073c04b32691cb344cb60289a646ded8fc551d09eJim Huang */ 3173c04b32691cb344cb60289a646ded8fc551d09eJim Huang 3273c04b32691cb344cb60289a646ded8fc551d09eJim Huang#include <machine/cpu-features.h> 33851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes#include <private/bionic_asm.h> 3473c04b32691cb344cb60289a646ded8fc551d09eJim Huang 3533f33515b503b634d9fbc57dda7123ea9cf23fc6Chih-Hung Hsieh.syntax unified 3633f33515b503b634d9fbc57dda7123ea9cf23fc6Chih-Hung Hsieh 37420878c6908cf9c2862888477ec3f424a06cf172Kenny RootENTRY(strcpy) 38c54ca40aef48009e7b0e5b2b3069aad62ffd3453Elliott Hughes pld [r1, #0] 3973c04b32691cb344cb60289a646ded8fc551d09eJim Huang eor r2, r0, r1 4073c04b32691cb344cb60289a646ded8fc551d09eJim Huang mov ip, r0 4173c04b32691cb344cb60289a646ded8fc551d09eJim Huang tst r2, #3 4273c04b32691cb344cb60289a646ded8fc551d09eJim Huang bne 4f 4373c04b32691cb344cb60289a646ded8fc551d09eJim Huang tst r1, #3 4473c04b32691cb344cb60289a646ded8fc551d09eJim Huang bne 3f 4573c04b32691cb344cb60289a646ded8fc551d09eJim Huang5: 4673c04b32691cb344cb60289a646ded8fc551d09eJim Huang str r5, [sp, #-4]! 4773c04b32691cb344cb60289a646ded8fc551d09eJim Huang mov r5, #0x01 4873c04b32691cb344cb60289a646ded8fc551d09eJim Huang orr r5, r5, r5, lsl #8 4973c04b32691cb344cb60289a646ded8fc551d09eJim Huang orr r5, r5, r5, lsl #16 5073c04b32691cb344cb60289a646ded8fc551d09eJim Huang 5173c04b32691cb344cb60289a646ded8fc551d09eJim Huang str r4, [sp, #-4]! 5273c04b32691cb344cb60289a646ded8fc551d09eJim Huang tst r1, #4 5373c04b32691cb344cb60289a646ded8fc551d09eJim Huang ldr r3, [r1], #4 5473c04b32691cb344cb60289a646ded8fc551d09eJim Huang beq 2f 5573c04b32691cb344cb60289a646ded8fc551d09eJim Huang sub r2, r3, r5 5673c04b32691cb344cb60289a646ded8fc551d09eJim Huang bics r2, r2, r3 5773c04b32691cb344cb60289a646ded8fc551d09eJim Huang tst r2, r5, lsl #7 5873c04b32691cb344cb60289a646ded8fc551d09eJim Huang itt eq 5973c04b32691cb344cb60289a646ded8fc551d09eJim Huang streq r3, [ip], #4 6073c04b32691cb344cb60289a646ded8fc551d09eJim Huang ldreq r3, [r1], #4 6173c04b32691cb344cb60289a646ded8fc551d09eJim Huang bne 1f 6273c04b32691cb344cb60289a646ded8fc551d09eJim Huang /* Inner loop. We now know that r1 is 64-bit aligned, so we 6373c04b32691cb344cb60289a646ded8fc551d09eJim Huang can safely fetch up to two words. This allows us to avoid 6473c04b32691cb344cb60289a646ded8fc551d09eJim Huang load stalls. */ 6573c04b32691cb344cb60289a646ded8fc551d09eJim Huang .p2align 2 6673c04b32691cb344cb60289a646ded8fc551d09eJim Huang2: 67c54ca40aef48009e7b0e5b2b3069aad62ffd3453Elliott Hughes pld [r1, #8] 6873c04b32691cb344cb60289a646ded8fc551d09eJim Huang ldr r4, [r1], #4 6973c04b32691cb344cb60289a646ded8fc551d09eJim Huang sub r2, r3, r5 7073c04b32691cb344cb60289a646ded8fc551d09eJim Huang bics r2, r2, r3 7173c04b32691cb344cb60289a646ded8fc551d09eJim Huang tst r2, r5, lsl #7 7273c04b32691cb344cb60289a646ded8fc551d09eJim Huang sub r2, r4, r5 7373c04b32691cb344cb60289a646ded8fc551d09eJim Huang bne 1f 7473c04b32691cb344cb60289a646ded8fc551d09eJim Huang str r3, [ip], #4 7573c04b32691cb344cb60289a646ded8fc551d09eJim Huang bics r2, r2, r4 7673c04b32691cb344cb60289a646ded8fc551d09eJim Huang tst r2, r5, lsl #7 7773c04b32691cb344cb60289a646ded8fc551d09eJim Huang itt eq 7873c04b32691cb344cb60289a646ded8fc551d09eJim Huang ldreq r3, [r1], #4 7973c04b32691cb344cb60289a646ded8fc551d09eJim Huang streq r4, [ip], #4 8073c04b32691cb344cb60289a646ded8fc551d09eJim Huang beq 2b 8173c04b32691cb344cb60289a646ded8fc551d09eJim Huang mov r3, r4 8273c04b32691cb344cb60289a646ded8fc551d09eJim Huang1: 8373c04b32691cb344cb60289a646ded8fc551d09eJim Huang#ifdef __ARMEB__ 8473c04b32691cb344cb60289a646ded8fc551d09eJim Huang rors r3, r3, #24 8573c04b32691cb344cb60289a646ded8fc551d09eJim Huang#endif 8673c04b32691cb344cb60289a646ded8fc551d09eJim Huang strb r3, [ip], #1 8773c04b32691cb344cb60289a646ded8fc551d09eJim Huang tst r3, #0xff 8873c04b32691cb344cb60289a646ded8fc551d09eJim Huang#ifdef __ARMEL__ 8973c04b32691cb344cb60289a646ded8fc551d09eJim Huang ror r3, r3, #8 9073c04b32691cb344cb60289a646ded8fc551d09eJim Huang#endif 9173c04b32691cb344cb60289a646ded8fc551d09eJim Huang bne 1b 9273c04b32691cb344cb60289a646ded8fc551d09eJim Huang ldr r4, [sp], #4 9373c04b32691cb344cb60289a646ded8fc551d09eJim Huang ldr r5, [sp], #4 9473c04b32691cb344cb60289a646ded8fc551d09eJim Huang bx lr 9573c04b32691cb344cb60289a646ded8fc551d09eJim Huang 9673c04b32691cb344cb60289a646ded8fc551d09eJim Huang /* Strings have the same offset from word alignment, but it's 9773c04b32691cb344cb60289a646ded8fc551d09eJim Huang not zero. */ 9873c04b32691cb344cb60289a646ded8fc551d09eJim Huang3: 9973c04b32691cb344cb60289a646ded8fc551d09eJim Huang tst r1, #1 10073c04b32691cb344cb60289a646ded8fc551d09eJim Huang beq 1f 10173c04b32691cb344cb60289a646ded8fc551d09eJim Huang ldrb r2, [r1], #1 10273c04b32691cb344cb60289a646ded8fc551d09eJim Huang strb r2, [ip], #1 10373c04b32691cb344cb60289a646ded8fc551d09eJim Huang cmp r2, #0 10473c04b32691cb344cb60289a646ded8fc551d09eJim Huang it eq 10573c04b32691cb344cb60289a646ded8fc551d09eJim Huang bxeq lr 10673c04b32691cb344cb60289a646ded8fc551d09eJim Huang1: 10773c04b32691cb344cb60289a646ded8fc551d09eJim Huang tst r1, #2 10873c04b32691cb344cb60289a646ded8fc551d09eJim Huang beq 5b 10973c04b32691cb344cb60289a646ded8fc551d09eJim Huang ldrh r2, [r1], #2 11073c04b32691cb344cb60289a646ded8fc551d09eJim Huang#ifdef __ARMEB__ 11173c04b32691cb344cb60289a646ded8fc551d09eJim Huang tst r2, #0xff00 11273c04b32691cb344cb60289a646ded8fc551d09eJim Huang iteet ne 11333f33515b503b634d9fbc57dda7123ea9cf23fc6Chih-Hung Hsieh strhne r2, [ip], #2 11473c04b32691cb344cb60289a646ded8fc551d09eJim Huang lsreq r2, r2, #8 11533f33515b503b634d9fbc57dda7123ea9cf23fc6Chih-Hung Hsieh strbeq r2, [ip] 11673c04b32691cb344cb60289a646ded8fc551d09eJim Huang tstne r2, #0xff 11773c04b32691cb344cb60289a646ded8fc551d09eJim Huang#else 11873c04b32691cb344cb60289a646ded8fc551d09eJim Huang tst r2, #0xff 11973c04b32691cb344cb60289a646ded8fc551d09eJim Huang itet ne 12033f33515b503b634d9fbc57dda7123ea9cf23fc6Chih-Hung Hsieh strhne r2, [ip], #2 12133f33515b503b634d9fbc57dda7123ea9cf23fc6Chih-Hung Hsieh strbeq r2, [ip] 12273c04b32691cb344cb60289a646ded8fc551d09eJim Huang tstne r2, #0xff00 12373c04b32691cb344cb60289a646ded8fc551d09eJim Huang#endif 12473c04b32691cb344cb60289a646ded8fc551d09eJim Huang bne 5b 12573c04b32691cb344cb60289a646ded8fc551d09eJim Huang bx lr 12673c04b32691cb344cb60289a646ded8fc551d09eJim Huang 12773c04b32691cb344cb60289a646ded8fc551d09eJim Huang /* src and dst do not have a common word-alignement. Fall back to 12873c04b32691cb344cb60289a646ded8fc551d09eJim Huang byte copying. */ 12973c04b32691cb344cb60289a646ded8fc551d09eJim Huang4: 13073c04b32691cb344cb60289a646ded8fc551d09eJim Huang ldrb r2, [r1], #1 13173c04b32691cb344cb60289a646ded8fc551d09eJim Huang strb r2, [ip], #1 13273c04b32691cb344cb60289a646ded8fc551d09eJim Huang cmp r2, #0 13373c04b32691cb344cb60289a646ded8fc551d09eJim Huang bne 4b 13473c04b32691cb344cb60289a646ded8fc551d09eJim Huang bx lr 135420878c6908cf9c2862888477ec3f424a06cf172Kenny RootEND(strcpy) 136