xref: /openbmc/linux/arch/sparc/lib/strlen.S (revision ae984d72)
1ae984d72SDavid S. Miller/* strlen.S: Sparc optimized strlen code
2ae984d72SDavid S. Miller * Hand optimized from GNU libc's strlen
3ae984d72SDavid S. Miller * Copyright (C) 1991,1996 Free Software Foundation
4ae984d72SDavid S. Miller * Copyright (C) 1996,2008 David S. Miller (davem@davemloft.net)
5ae984d72SDavid S. Miller * Copyright (C) 1996, 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
6ae984d72SDavid S. Miller */
7ae984d72SDavid S. Miller
8ae984d72SDavid S. Miller#include <linux/linkage.h>
9ae984d72SDavid S. Miller#include <asm/asm.h>
10ae984d72SDavid S. Miller
11ae984d72SDavid S. Miller#define LO_MAGIC 0x01010101
12ae984d72SDavid S. Miller#define HI_MAGIC 0x80808080
13ae984d72SDavid S. Miller
14ae984d72SDavid S. Miller	.text
15ae984d72SDavid S. MillerENTRY(strlen)
16ae984d72SDavid S. Miller	mov	%o0, %o1
17ae984d72SDavid S. Miller	andcc	%o0, 3, %g0
18ae984d72SDavid S. Miller	BRANCH32(be, pt, 9f)
19ae984d72SDavid S. Miller	 sethi	%hi(HI_MAGIC), %o4
20ae984d72SDavid S. Miller	ldub	[%o0], %o5
21ae984d72SDavid S. Miller	BRANCH_REG_ZERO(pn, %o5, 11f)
22ae984d72SDavid S. Miller	 add	%o0, 1, %o0
23ae984d72SDavid S. Miller	andcc	%o0, 3, %g0
24ae984d72SDavid S. Miller	BRANCH32(be, pn, 4f)
25ae984d72SDavid S. Miller	 or	%o4, %lo(HI_MAGIC), %o3
26ae984d72SDavid S. Miller	ldub	[%o0], %o5
27ae984d72SDavid S. Miller	BRANCH_REG_ZERO(pn, %o5, 12f)
28ae984d72SDavid S. Miller	 add	%o0, 1, %o0
29ae984d72SDavid S. Miller	andcc	%o0, 3, %g0
30ae984d72SDavid S. Miller	BRANCH32(be, pt, 5f)
31ae984d72SDavid S. Miller	 sethi	%hi(LO_MAGIC), %o4
32ae984d72SDavid S. Miller	ldub	[%o0], %o5
33ae984d72SDavid S. Miller	BRANCH_REG_ZERO(pn, %o5, 13f)
34ae984d72SDavid S. Miller	 add	%o0, 1, %o0
35ae984d72SDavid S. Miller	BRANCH32(ba, pt, 8f)
36ae984d72SDavid S. Miller	 or	%o4, %lo(LO_MAGIC), %o2
37ae984d72SDavid S. Miller9:
38ae984d72SDavid S. Miller	or	%o4, %lo(HI_MAGIC), %o3
39ae984d72SDavid S. Miller4:
40ae984d72SDavid S. Miller	sethi	%hi(LO_MAGIC), %o4
41ae984d72SDavid S. Miller5:
42ae984d72SDavid S. Miller	or	%o4, %lo(LO_MAGIC), %o2
43ae984d72SDavid S. Miller8:
44ae984d72SDavid S. Miller	ld	[%o0], %o5
45ae984d72SDavid S. Miller2:
46ae984d72SDavid S. Miller	sub	%o5, %o2, %o4
47ae984d72SDavid S. Miller	andcc	%o4, %o3, %g0
48ae984d72SDavid S. Miller	BRANCH32(be, pt, 8b)
49ae984d72SDavid S. Miller	 add	%o0, 4, %o0
50ae984d72SDavid S. Miller
51ae984d72SDavid S. Miller	/* Check every byte. */
52ae984d72SDavid S. Miller	srl	%o5, 24, %g7
53ae984d72SDavid S. Miller	andcc	%g7, 0xff, %g0
54ae984d72SDavid S. Miller	BRANCH32(be, pn, 1f)
55ae984d72SDavid S. Miller	 add	%o0, -4, %o4
56ae984d72SDavid S. Miller	srl	%o5, 16, %g7
57ae984d72SDavid S. Miller	andcc	%g7, 0xff, %g0
58ae984d72SDavid S. Miller	BRANCH32(be, pn, 1f)
59ae984d72SDavid S. Miller	 add	%o4, 1, %o4
60ae984d72SDavid S. Miller	srl	%o5, 8, %g7
61ae984d72SDavid S. Miller	andcc	%g7, 0xff, %g0
62ae984d72SDavid S. Miller	BRANCH32(be, pn, 1f)
63ae984d72SDavid S. Miller	 add	%o4, 1, %o4
64ae984d72SDavid S. Miller	andcc	%o5, 0xff, %g0
65ae984d72SDavid S. Miller	BRANCH32_ANNUL(bne, pt, 2b)
66ae984d72SDavid S. Miller	 ld	[%o0], %o5
67ae984d72SDavid S. Miller	add	%o4, 1, %o4
68ae984d72SDavid S. Miller1:
69ae984d72SDavid S. Miller	retl
70ae984d72SDavid S. Miller	 sub	%o4, %o1, %o0
71ae984d72SDavid S. Miller11:
72ae984d72SDavid S. Miller	retl
73ae984d72SDavid S. Miller	 mov	0, %o0
74ae984d72SDavid S. Miller12:
75ae984d72SDavid S. Miller	retl
76ae984d72SDavid S. Miller	 mov	1, %o0
77ae984d72SDavid S. Miller13:
78ae984d72SDavid S. Miller	retl
79ae984d72SDavid S. Miller	 mov	2, %o0
80ae984d72SDavid S. MillerENDPROC(strlen)
81