1*09a53ad8SAndrew Turner/* 2*09a53ad8SAndrew Turner * Copyright (c) 2014 ARM Ltd 3*09a53ad8SAndrew Turner * All rights reserved. 4*09a53ad8SAndrew Turner * 5*09a53ad8SAndrew Turner * Redistribution and use in source and binary forms, with or without 6*09a53ad8SAndrew Turner * modification, are permitted provided that the following conditions 7*09a53ad8SAndrew Turner * are met: 8*09a53ad8SAndrew Turner * 1. Redistributions of source code must retain the above copyright 9*09a53ad8SAndrew Turner * notice, this list of conditions and the following disclaimer. 10*09a53ad8SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright 11*09a53ad8SAndrew Turner * notice, this list of conditions and the following disclaimer in the 12*09a53ad8SAndrew Turner * documentation and/or other materials provided with the distribution. 13*09a53ad8SAndrew Turner * 3. The name of the company may not be used to endorse or promote 14*09a53ad8SAndrew Turner * products derived from this software without specific prior written 15*09a53ad8SAndrew Turner * permission. 16*09a53ad8SAndrew Turner * 17*09a53ad8SAndrew Turner * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED 18*09a53ad8SAndrew Turner * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19*09a53ad8SAndrew Turner * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20*09a53ad8SAndrew Turner * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21*09a53ad8SAndrew Turner * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 22*09a53ad8SAndrew Turner * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 23*09a53ad8SAndrew Turner * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 24*09a53ad8SAndrew Turner * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 25*09a53ad8SAndrew Turner * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26*09a53ad8SAndrew Turner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27*09a53ad8SAndrew Turner */ 28*09a53ad8SAndrew Turner 29*09a53ad8SAndrew Turner/* Implementation of strcmp for ARMv6m. This version is only used in 30*09a53ad8SAndrew Turner ARMv6-M when we want an efficient implementation. Otherwize if the 31*09a53ad8SAndrew Turner code size is preferred, strcmp-armv4t.S will be used. */ 32*09a53ad8SAndrew Turner 33*09a53ad8SAndrew Turner .thumb_func 34*09a53ad8SAndrew Turner .syntax unified 35*09a53ad8SAndrew Turner .arch armv6-m 36*09a53ad8SAndrew Turner 37*09a53ad8SAndrew Turner .macro DoSub n, label 38*09a53ad8SAndrew Turner subs r0, r0, r1 39*09a53ad8SAndrew Turner#ifdef __ARM_BIG_ENDIAN 40*09a53ad8SAndrew Turner lsrs r1, r4, \n 41*09a53ad8SAndrew Turner#else 42*09a53ad8SAndrew Turner lsls r1, r4, \n 43*09a53ad8SAndrew Turner#endif 44*09a53ad8SAndrew Turner orrs r1, r0 45*09a53ad8SAndrew Turner bne \label 46*09a53ad8SAndrew Turner .endm 47*09a53ad8SAndrew Turner 48*09a53ad8SAndrew Turner .macro Byte_Test n, label 49*09a53ad8SAndrew Turner lsrs r0, r2, \n 50*09a53ad8SAndrew Turner lsrs r1, r3, \n 51*09a53ad8SAndrew Turner DoSub \n, \label 52*09a53ad8SAndrew Turner .endm 53*09a53ad8SAndrew Turner 54*09a53ad8SAndrew Turner .text 55*09a53ad8SAndrew Turner .p2align 0 56*09a53ad8SAndrew Turner .global strcmp 57*09a53ad8SAndrew Turner .type strcmp, %function 58*09a53ad8SAndrew Turnerstrcmp: 59*09a53ad8SAndrew Turner .cfi_startproc 60*09a53ad8SAndrew Turner mov r2, r0 61*09a53ad8SAndrew Turner push {r4, r5, r6, lr} 62*09a53ad8SAndrew Turner orrs r2, r1 63*09a53ad8SAndrew Turner lsls r2, r2, #30 64*09a53ad8SAndrew Turner bne 6f 65*09a53ad8SAndrew Turner ldr r5, =0x01010101 66*09a53ad8SAndrew Turner lsls r6, r5, #7 67*09a53ad8SAndrew Turner1: 68*09a53ad8SAndrew Turner ldmia r0!, {r2} 69*09a53ad8SAndrew Turner ldmia r1!, {r3} 70*09a53ad8SAndrew Turner subs r4, r2, r5 71*09a53ad8SAndrew Turner bics r4, r2 72*09a53ad8SAndrew Turner ands r4, r6 73*09a53ad8SAndrew Turner beq 3f 74*09a53ad8SAndrew Turner 75*09a53ad8SAndrew Turner#ifdef __ARM_BIG_ENDIAN 76*09a53ad8SAndrew Turner Byte_Test #24, 4f 77*09a53ad8SAndrew Turner Byte_Test #16, 4f 78*09a53ad8SAndrew Turner Byte_Test #8, 4f 79*09a53ad8SAndrew Turner 80*09a53ad8SAndrew Turner b 7f 81*09a53ad8SAndrew Turner3: 82*09a53ad8SAndrew Turner cmp r2, r3 83*09a53ad8SAndrew Turner beq 1b 84*09a53ad8SAndrew Turner cmp r2, r3 85*09a53ad8SAndrew Turner#else 86*09a53ad8SAndrew Turner uxtb r0, r2 87*09a53ad8SAndrew Turner uxtb r1, r3 88*09a53ad8SAndrew Turner DoSub #24, 2f 89*09a53ad8SAndrew Turner 90*09a53ad8SAndrew Turner uxth r0, r2 91*09a53ad8SAndrew Turner uxth r1, r3 92*09a53ad8SAndrew Turner DoSub #16, 2f 93*09a53ad8SAndrew Turner 94*09a53ad8SAndrew Turner lsls r0, r2, #8 95*09a53ad8SAndrew Turner lsls r1, r3, #8 96*09a53ad8SAndrew Turner lsrs r0, r0, #8 97*09a53ad8SAndrew Turner lsrs r1, r1, #8 98*09a53ad8SAndrew Turner DoSub #8, 2f 99*09a53ad8SAndrew Turner 100*09a53ad8SAndrew Turner lsrs r0, r2, #24 101*09a53ad8SAndrew Turner lsrs r1, r3, #24 102*09a53ad8SAndrew Turner subs r0, r0, r1 103*09a53ad8SAndrew Turner2: 104*09a53ad8SAndrew Turner pop {r4, r5, r6, pc} 105*09a53ad8SAndrew Turner 106*09a53ad8SAndrew Turner3: 107*09a53ad8SAndrew Turner cmp r2, r3 108*09a53ad8SAndrew Turner beq 1b 109*09a53ad8SAndrew Turner rev r0, r2 110*09a53ad8SAndrew Turner rev r1, r3 111*09a53ad8SAndrew Turner cmp r0, r1 112*09a53ad8SAndrew Turner#endif 113*09a53ad8SAndrew Turner 114*09a53ad8SAndrew Turner bls 5f 115*09a53ad8SAndrew Turner movs r0, #1 116*09a53ad8SAndrew Turner4: 117*09a53ad8SAndrew Turner pop {r4, r5, r6, pc} 118*09a53ad8SAndrew Turner5: 119*09a53ad8SAndrew Turner movs r0, #0 120*09a53ad8SAndrew Turner mvns r0, r0 121*09a53ad8SAndrew Turner pop {r4, r5, r6, pc} 122*09a53ad8SAndrew Turner6: 123*09a53ad8SAndrew Turner ldrb r2, [r0, #0] 124*09a53ad8SAndrew Turner ldrb r3, [r1, #0] 125*09a53ad8SAndrew Turner adds r0, #1 126*09a53ad8SAndrew Turner adds r1, #1 127*09a53ad8SAndrew Turner cmp r2, #0 128*09a53ad8SAndrew Turner beq 7f 129*09a53ad8SAndrew Turner cmp r2, r3 130*09a53ad8SAndrew Turner bne 7f 131*09a53ad8SAndrew Turner ldrb r2, [r0, #0] 132*09a53ad8SAndrew Turner ldrb r3, [r1, #0] 133*09a53ad8SAndrew Turner adds r0, #1 134*09a53ad8SAndrew Turner adds r1, #1 135*09a53ad8SAndrew Turner cmp r2, #0 136*09a53ad8SAndrew Turner beq 7f 137*09a53ad8SAndrew Turner cmp r2, r3 138*09a53ad8SAndrew Turner beq 6b 139*09a53ad8SAndrew Turner7: 140*09a53ad8SAndrew Turner subs r0, r2, r3 141*09a53ad8SAndrew Turner pop {r4, r5, r6, pc} 142*09a53ad8SAndrew Turner .cfi_endproc 143*09a53ad8SAndrew Turner .size strcmp, . - strcmp 144