119 lines · plain
1/*2 * strcmp for ARMv6-M (optimized for performance, not size)3 *4 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5 * See https://llvm.org/LICENSE.txt for license information.6 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7 */8 9#if __ARM_ARCH == 6 && __ARM_ARCH_6M__ >= 110 11 .thumb_func12 .syntax unified13 .arch armv6-m14 15 .macro DoSub n, label16 subs r0, r0, r117#ifdef __ARM_BIG_ENDIAN18 lsrs r1, r4, \n19#else20 lsls r1, r4, \n21#endif22 orrs r1, r023 bne \label24 .endm25 26 .macro Byte_Test n, label27 lsrs r0, r2, \n28 lsrs r1, r3, \n29 DoSub \n, \label30 .endm31 32ENTRY_ALIGN (__strcmp_armv6m, 4)33 mov r2, r034 push {r4, r5, r6, lr}35 orrs r2, r136 lsls r2, r2, #3037 bne 6f38 ldr r5, =0x0101010139 lsls r6, r5, #7401:41 ldmia r0!, {r2}42 ldmia r1!, {r3}43 subs r4, r2, r544 bics r4, r245 ands r4, r646 beq 3f47 48#ifdef __ARM_BIG_ENDIAN49 Byte_Test #24, 4f50 Byte_Test #16, 4f51 Byte_Test #8, 4f52 53 b 7f543:55 cmp r2, r356 beq 1b57 cmp r2, r358#else59 uxtb r0, r260 uxtb r1, r361 DoSub #24, 2f62 63 uxth r0, r264 uxth r1, r365 DoSub #16, 2f66 67 lsls r0, r2, #868 lsls r1, r3, #869 lsrs r0, r0, #870 lsrs r1, r1, #871 DoSub #8, 2f72 73 lsrs r0, r2, #2474 lsrs r1, r3, #2475 subs r0, r0, r1762:77 pop {r4, r5, r6, pc}78 793:80 cmp r2, r381 beq 1b82 rev r0, r283 rev r1, r384 cmp r0, r185#endif86 87 bls 5f88 movs r0, #1894:90 pop {r4, r5, r6, pc}915:92 movs r0, #093 mvns r0, r094 pop {r4, r5, r6, pc}956:96 ldrb r2, [r0, #0]97 ldrb r3, [r1, #0]98 adds r0, #199 adds r1, #1100 cmp r2, #0101 beq 7f102 cmp r2, r3103 bne 7f104 ldrb r2, [r0, #0]105 ldrb r3, [r1, #0]106 adds r0, #1107 adds r1, #1108 cmp r2, #0109 beq 7f110 cmp r2, r3111 beq 6b1127:113 subs r0, r2, r3114 pop {r4, r5, r6, pc}115 116END (__strcmp_armv6m)117 118#endif /* __ARM_ARCH == 6 && __ARM_ARCH_6M__ >= 1 */119