brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.7 KiB · 462233d Raw
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