xref: /linux/arch/arc/lib/strcmp-archs.S (revision d2912cb1)
1*d2912cb1SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */
21f7e3dc0SClaudiu Zissulescu/*
31f7e3dc0SClaudiu Zissulescu * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
41f7e3dc0SClaudiu Zissulescu */
51f7e3dc0SClaudiu Zissulescu
61f7e3dc0SClaudiu Zissulescu#include <linux/linkage.h>
71f7e3dc0SClaudiu Zissulescu
886effd0dSVineet GuptaENTRY_CFI(strcmp)
91f7e3dc0SClaudiu Zissulescu	or	r2, r0, r1
101f7e3dc0SClaudiu Zissulescu	bmsk_s	r2, r2, 1
111f7e3dc0SClaudiu Zissulescu	brne	r2, 0, @.Lcharloop
121f7e3dc0SClaudiu Zissulescu
131f7e3dc0SClaudiu Zissulescu;;; s1 and s2 are word aligned
141f7e3dc0SClaudiu Zissulescu	ld.ab	r2, [r0, 4]
151f7e3dc0SClaudiu Zissulescu
161f7e3dc0SClaudiu Zissulescu	mov_s	r12, 0x01010101
171f7e3dc0SClaudiu Zissulescu	ror	r11, r12
181f7e3dc0SClaudiu Zissulescu	.align  4
191f7e3dc0SClaudiu Zissulescu.LwordLoop:
201f7e3dc0SClaudiu Zissulescu	ld.ab	r3, [r1, 4]
211f7e3dc0SClaudiu Zissulescu	;; Detect NULL char in str1
221f7e3dc0SClaudiu Zissulescu	sub	r4, r2, r12
231f7e3dc0SClaudiu Zissulescu	ld.ab	r5, [r0, 4]
241f7e3dc0SClaudiu Zissulescu	bic	r4, r4, r2
251f7e3dc0SClaudiu Zissulescu	and	r4, r4, r11
261f7e3dc0SClaudiu Zissulescu	brne.d.nt	r4, 0, .LfoundNULL
271f7e3dc0SClaudiu Zissulescu	;; Check if the read locations are the same
281f7e3dc0SClaudiu Zissulescu	cmp	r2, r3
291f7e3dc0SClaudiu Zissulescu	beq.d	.LwordLoop
301f7e3dc0SClaudiu Zissulescu	mov.eq	r2, r5
311f7e3dc0SClaudiu Zissulescu
321f7e3dc0SClaudiu Zissulescu	;; A match is found, spot it out
331f7e3dc0SClaudiu Zissulescu#ifdef __LITTLE_ENDIAN__
341f7e3dc0SClaudiu Zissulescu	swape	r3, r3
351f7e3dc0SClaudiu Zissulescu	mov_s	r0, 1
361f7e3dc0SClaudiu Zissulescu	swape	r2, r2
371f7e3dc0SClaudiu Zissulescu#else
381f7e3dc0SClaudiu Zissulescu	mov_s	r0, 1
391f7e3dc0SClaudiu Zissulescu#endif
401f7e3dc0SClaudiu Zissulescu	cmp_s	r2, r3
411f7e3dc0SClaudiu Zissulescu	j_s.d	[blink]
421f7e3dc0SClaudiu Zissulescu	bset.lo	r0, r0, 31
431f7e3dc0SClaudiu Zissulescu
441f7e3dc0SClaudiu Zissulescu	.align 4
451f7e3dc0SClaudiu Zissulescu.LfoundNULL:
461f7e3dc0SClaudiu Zissulescu#ifdef __BIG_ENDIAN__
471f7e3dc0SClaudiu Zissulescu	swape	r4, r4
481f7e3dc0SClaudiu Zissulescu	swape	r2, r2
491f7e3dc0SClaudiu Zissulescu	swape	r3, r3
501f7e3dc0SClaudiu Zissulescu#endif
511f7e3dc0SClaudiu Zissulescu	;; Find null byte
521f7e3dc0SClaudiu Zissulescu	ffs	r0, r4
531f7e3dc0SClaudiu Zissulescu	bmsk	r2, r2, r0
541f7e3dc0SClaudiu Zissulescu	bmsk	r3, r3, r0
551f7e3dc0SClaudiu Zissulescu	swape	r2, r2
561f7e3dc0SClaudiu Zissulescu	swape	r3, r3
571f7e3dc0SClaudiu Zissulescu	;; make the return value
581f7e3dc0SClaudiu Zissulescu	sub.f	r0, r2, r3
591f7e3dc0SClaudiu Zissulescu	mov.hi	r0, 1
601f7e3dc0SClaudiu Zissulescu	j_s.d	[blink]
611f7e3dc0SClaudiu Zissulescu	bset.lo	r0, r0, 31
621f7e3dc0SClaudiu Zissulescu
631f7e3dc0SClaudiu Zissulescu	.align 4
641f7e3dc0SClaudiu Zissulescu.Lcharloop:
651f7e3dc0SClaudiu Zissulescu	ldb.ab	r2, [r0, 1]
661f7e3dc0SClaudiu Zissulescu	ldb.ab	r3, [r1, 1]
671f7e3dc0SClaudiu Zissulescu	nop
681f7e3dc0SClaudiu Zissulescu	breq	r2, 0, .Lcmpend
691f7e3dc0SClaudiu Zissulescu	breq	r2, r3, .Lcharloop
701f7e3dc0SClaudiu Zissulescu
711f7e3dc0SClaudiu Zissulescu	.align 4
721f7e3dc0SClaudiu Zissulescu.Lcmpend:
731f7e3dc0SClaudiu Zissulescu	j_s.d	[blink]
741f7e3dc0SClaudiu Zissulescu	sub	r0, r2, r3
7586effd0dSVineet GuptaEND_CFI(strcmp)
76