131914882SAlex Richardson/* 231914882SAlex Richardson * strcmp for ARMv6-M (optimized for performance, not size) 331914882SAlex Richardson * 4*072a4ba8SAndrew Turner * Copyright (c) 2014-2022, Arm Limited. 5*072a4ba8SAndrew Turner * SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception 631914882SAlex Richardson */ 731914882SAlex Richardson 8*072a4ba8SAndrew Turner#include "asmdefs.h" 9*072a4ba8SAndrew Turner 1031914882SAlex Richardson#if __ARM_ARCH == 6 && __ARM_ARCH_6M__ >= 1 1131914882SAlex Richardson 1231914882SAlex Richardson .thumb_func 1331914882SAlex Richardson .syntax unified 1431914882SAlex Richardson .arch armv6-m 1531914882SAlex Richardson 1631914882SAlex Richardson .macro DoSub n, label 1731914882SAlex Richardson subs r0, r0, r1 1831914882SAlex Richardson#ifdef __ARM_BIG_ENDIAN 1931914882SAlex Richardson lsrs r1, r4, \n 2031914882SAlex Richardson#else 2131914882SAlex Richardson lsls r1, r4, \n 2231914882SAlex Richardson#endif 2331914882SAlex Richardson orrs r1, r0 2431914882SAlex Richardson bne \label 2531914882SAlex Richardson .endm 2631914882SAlex Richardson 2731914882SAlex Richardson .macro Byte_Test n, label 2831914882SAlex Richardson lsrs r0, r2, \n 2931914882SAlex Richardson lsrs r1, r3, \n 3031914882SAlex Richardson DoSub \n, \label 3131914882SAlex Richardson .endm 3231914882SAlex Richardson 3331914882SAlex RichardsonENTRY_ALIGN (__strcmp_armv6m, 4) 3431914882SAlex Richardson mov r2, r0 3531914882SAlex Richardson push {r4, r5, r6, lr} 3631914882SAlex Richardson orrs r2, r1 3731914882SAlex Richardson lsls r2, r2, #30 3831914882SAlex Richardson bne 6f 3931914882SAlex Richardson ldr r5, =0x01010101 4031914882SAlex Richardson lsls r6, r5, #7 4131914882SAlex Richardson1: 4231914882SAlex Richardson ldmia r0!, {r2} 4331914882SAlex Richardson ldmia r1!, {r3} 4431914882SAlex Richardson subs r4, r2, r5 4531914882SAlex Richardson bics r4, r2 4631914882SAlex Richardson ands r4, r6 4731914882SAlex Richardson beq 3f 4831914882SAlex Richardson 4931914882SAlex Richardson#ifdef __ARM_BIG_ENDIAN 5031914882SAlex Richardson Byte_Test #24, 4f 5131914882SAlex Richardson Byte_Test #16, 4f 5231914882SAlex Richardson Byte_Test #8, 4f 5331914882SAlex Richardson 5431914882SAlex Richardson b 7f 5531914882SAlex Richardson3: 5631914882SAlex Richardson cmp r2, r3 5731914882SAlex Richardson beq 1b 5831914882SAlex Richardson cmp r2, r3 5931914882SAlex Richardson#else 6031914882SAlex Richardson uxtb r0, r2 6131914882SAlex Richardson uxtb r1, r3 6231914882SAlex Richardson DoSub #24, 2f 6331914882SAlex Richardson 6431914882SAlex Richardson uxth r0, r2 6531914882SAlex Richardson uxth r1, r3 6631914882SAlex Richardson DoSub #16, 2f 6731914882SAlex Richardson 6831914882SAlex Richardson lsls r0, r2, #8 6931914882SAlex Richardson lsls r1, r3, #8 7031914882SAlex Richardson lsrs r0, r0, #8 7131914882SAlex Richardson lsrs r1, r1, #8 7231914882SAlex Richardson DoSub #8, 2f 7331914882SAlex Richardson 7431914882SAlex Richardson lsrs r0, r2, #24 7531914882SAlex Richardson lsrs r1, r3, #24 7631914882SAlex Richardson subs r0, r0, r1 7731914882SAlex Richardson2: 7831914882SAlex Richardson pop {r4, r5, r6, pc} 7931914882SAlex Richardson 8031914882SAlex Richardson3: 8131914882SAlex Richardson cmp r2, r3 8231914882SAlex Richardson beq 1b 8331914882SAlex Richardson rev r0, r2 8431914882SAlex Richardson rev r1, r3 8531914882SAlex Richardson cmp r0, r1 8631914882SAlex Richardson#endif 8731914882SAlex Richardson 8831914882SAlex Richardson bls 5f 8931914882SAlex Richardson movs r0, #1 9031914882SAlex Richardson4: 9131914882SAlex Richardson pop {r4, r5, r6, pc} 9231914882SAlex Richardson5: 9331914882SAlex Richardson movs r0, #0 9431914882SAlex Richardson mvns r0, r0 9531914882SAlex Richardson pop {r4, r5, r6, pc} 9631914882SAlex Richardson6: 9731914882SAlex Richardson ldrb r2, [r0, #0] 9831914882SAlex Richardson ldrb r3, [r1, #0] 9931914882SAlex Richardson adds r0, #1 10031914882SAlex Richardson adds r1, #1 10131914882SAlex Richardson cmp r2, #0 10231914882SAlex Richardson beq 7f 10331914882SAlex Richardson cmp r2, r3 10431914882SAlex Richardson bne 7f 10531914882SAlex Richardson ldrb r2, [r0, #0] 10631914882SAlex Richardson ldrb r3, [r1, #0] 10731914882SAlex Richardson adds r0, #1 10831914882SAlex Richardson adds r1, #1 10931914882SAlex Richardson cmp r2, #0 11031914882SAlex Richardson beq 7f 11131914882SAlex Richardson cmp r2, r3 11231914882SAlex Richardson beq 6b 11331914882SAlex Richardson7: 11431914882SAlex Richardson subs r0, r2, r3 11531914882SAlex Richardson pop {r4, r5, r6, pc} 11631914882SAlex Richardson 11731914882SAlex RichardsonEND (__strcmp_armv6m) 11831914882SAlex Richardson 11931914882SAlex Richardson#endif /* __ARM_ARCH == 6 && __ARM_ARCH_6M__ >= 1 */ 120