xref: /linux/arch/arc/lib/strlen.S (revision ec7ac6afd07b2d958aab9dfc0a686300b856922a)
15210d1e6SVineet Gupta/*
25210d1e6SVineet Gupta * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
35210d1e6SVineet Gupta *
45210d1e6SVineet Gupta * This program is free software; you can redistribute it and/or modify
55210d1e6SVineet Gupta * it under the terms of the GNU General Public License version 2 as
65210d1e6SVineet Gupta * published by the Free Software Foundation.
75210d1e6SVineet Gupta */
85210d1e6SVineet Gupta
9*ec7ac6afSVineet Gupta#include <linux/linkage.h>
105210d1e6SVineet Gupta
11*ec7ac6afSVineet GuptaENTRY(strlen)
125210d1e6SVineet Gupta	or	r3,r0,7
135210d1e6SVineet Gupta	ld	r2,[r3,-7]
145210d1e6SVineet Gupta	ld.a	r6,[r3,-3]
155210d1e6SVineet Gupta	mov	r4,0x01010101
165210d1e6SVineet Gupta	; uses long immediate
175210d1e6SVineet Gupta#ifdef __LITTLE_ENDIAN__
185210d1e6SVineet Gupta	asl_s	r1,r0,3
195210d1e6SVineet Gupta	btst_s	r0,2
205210d1e6SVineet Gupta	asl	r7,r4,r1
215210d1e6SVineet Gupta	ror	r5,r4
225210d1e6SVineet Gupta	sub	r1,r2,r7
235210d1e6SVineet Gupta	bic_s	r1,r1,r2
245210d1e6SVineet Gupta	mov.eq	r7,r4
255210d1e6SVineet Gupta	sub	r12,r6,r7
265210d1e6SVineet Gupta	bic	r12,r12,r6
275210d1e6SVineet Gupta	or.eq	r12,r12,r1
285210d1e6SVineet Gupta	and	r12,r12,r5
295210d1e6SVineet Gupta	brne	r12,0,.Learly_end
305210d1e6SVineet Gupta#else /* BIG ENDIAN */
315210d1e6SVineet Gupta	ror	r5,r4
325210d1e6SVineet Gupta	btst_s	r0,2
335210d1e6SVineet Gupta	mov_s	r1,31
345210d1e6SVineet Gupta	sub3	r7,r1,r0
355210d1e6SVineet Gupta	sub	r1,r2,r4
365210d1e6SVineet Gupta	bic_s	r1,r1,r2
375210d1e6SVineet Gupta	bmsk	r1,r1,r7
385210d1e6SVineet Gupta	sub	r12,r6,r4
395210d1e6SVineet Gupta	bic	r12,r12,r6
405210d1e6SVineet Gupta	bmsk.ne	r12,r12,r7
415210d1e6SVineet Gupta	or.eq	r12,r12,r1
425210d1e6SVineet Gupta	and	r12,r12,r5
435210d1e6SVineet Gupta	brne	r12,0,.Learly_end
445210d1e6SVineet Gupta#endif /* ENDIAN */
455210d1e6SVineet Gupta
465210d1e6SVineet Gupta.Loop:
475210d1e6SVineet Gupta	ld_s	r2,[r3,4]
485210d1e6SVineet Gupta	ld.a	r6,[r3,8]
495210d1e6SVineet Gupta	; stall for load result
505210d1e6SVineet Gupta	sub	r1,r2,r4
515210d1e6SVineet Gupta	bic_s	r1,r1,r2
525210d1e6SVineet Gupta	sub	r12,r6,r4
535210d1e6SVineet Gupta	bic	r12,r12,r6
545210d1e6SVineet Gupta	or	r12,r12,r1
555210d1e6SVineet Gupta	and	r12,r12,r5
565210d1e6SVineet Gupta	breq r12,0,.Loop
575210d1e6SVineet Gupta.Lend:
585210d1e6SVineet Gupta	and.f	r1,r1,r5
595210d1e6SVineet Gupta	sub.ne	r3,r3,4
605210d1e6SVineet Gupta	mov.eq	r1,r12
615210d1e6SVineet Gupta#ifdef __LITTLE_ENDIAN__
625210d1e6SVineet Gupta	sub_s	r2,r1,1
635210d1e6SVineet Gupta	bic_s	r2,r2,r1
645210d1e6SVineet Gupta	norm	r1,r2
655210d1e6SVineet Gupta	sub_s	r0,r0,3
665210d1e6SVineet Gupta	lsr_s	r1,r1,3
675210d1e6SVineet Gupta	sub	    r0,r3,r0
685210d1e6SVineet Gupta	j_s.d	[blink]
695210d1e6SVineet Gupta	sub	    r0,r0,r1
705210d1e6SVineet Gupta#else /* BIG ENDIAN */
715210d1e6SVineet Gupta	lsr_s	r1,r1,7
725210d1e6SVineet Gupta	mov.eq	r2,r6
735210d1e6SVineet Gupta	bic_s	r1,r1,r2
745210d1e6SVineet Gupta	norm	r1,r1
755210d1e6SVineet Gupta	sub	    r0,r3,r0
765210d1e6SVineet Gupta	lsr_s	r1,r1,3
775210d1e6SVineet Gupta	j_s.d	[blink]
785210d1e6SVineet Gupta	add	    r0,r0,r1
795210d1e6SVineet Gupta#endif /* ENDIAN */
805210d1e6SVineet Gupta.Learly_end:
815210d1e6SVineet Gupta	b.d	.Lend
825210d1e6SVineet Gupta	sub_s.ne r1,r1,r1
83*ec7ac6afSVineet GuptaEND(strlen)
84