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