xref: /freebsd/contrib/arm-optimized-routines/string/arm/strcmp-armv6m.S (revision 072a4ba82a01476eaee33781ccd241033eefcf0b)
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