xref: /openbmc/linux/arch/sparc/lib/strlen.S (revision d3867f04)
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>
10d3867f04SAl Viro#include <asm/export.h>
11ae984d72SDavid S. Miller
12ae984d72SDavid S. Miller#define LO_MAGIC 0x01010101
13ae984d72SDavid S. Miller#define HI_MAGIC 0x80808080
14ae984d72SDavid S. Miller
15ae984d72SDavid S. Miller	.text
16ae984d72SDavid S. MillerENTRY(strlen)
17ae984d72SDavid S. Miller	mov	%o0, %o1
18ae984d72SDavid S. Miller	andcc	%o0, 3, %g0
19ae984d72SDavid S. Miller	BRANCH32(be, pt, 9f)
20ae984d72SDavid S. Miller	 sethi	%hi(HI_MAGIC), %o4
21ae984d72SDavid S. Miller	ldub	[%o0], %o5
22ae984d72SDavid S. Miller	BRANCH_REG_ZERO(pn, %o5, 11f)
23ae984d72SDavid S. Miller	 add	%o0, 1, %o0
24ae984d72SDavid S. Miller	andcc	%o0, 3, %g0
25ae984d72SDavid S. Miller	BRANCH32(be, pn, 4f)
26ae984d72SDavid S. Miller	 or	%o4, %lo(HI_MAGIC), %o3
27ae984d72SDavid S. Miller	ldub	[%o0], %o5
28ae984d72SDavid S. Miller	BRANCH_REG_ZERO(pn, %o5, 12f)
29ae984d72SDavid S. Miller	 add	%o0, 1, %o0
30ae984d72SDavid S. Miller	andcc	%o0, 3, %g0
31ae984d72SDavid S. Miller	BRANCH32(be, pt, 5f)
32ae984d72SDavid S. Miller	 sethi	%hi(LO_MAGIC), %o4
33ae984d72SDavid S. Miller	ldub	[%o0], %o5
34ae984d72SDavid S. Miller	BRANCH_REG_ZERO(pn, %o5, 13f)
35ae984d72SDavid S. Miller	 add	%o0, 1, %o0
36ae984d72SDavid S. Miller	BRANCH32(ba, pt, 8f)
37ae984d72SDavid S. Miller	 or	%o4, %lo(LO_MAGIC), %o2
38ae984d72SDavid S. Miller9:
39ae984d72SDavid S. Miller	or	%o4, %lo(HI_MAGIC), %o3
40ae984d72SDavid S. Miller4:
41ae984d72SDavid S. Miller	sethi	%hi(LO_MAGIC), %o4
42ae984d72SDavid S. Miller5:
43ae984d72SDavid S. Miller	or	%o4, %lo(LO_MAGIC), %o2
44ae984d72SDavid S. Miller8:
45ae984d72SDavid S. Miller	ld	[%o0], %o5
46ae984d72SDavid S. Miller2:
47ae984d72SDavid S. Miller	sub	%o5, %o2, %o4
48ae984d72SDavid S. Miller	andcc	%o4, %o3, %g0
49ae984d72SDavid S. Miller	BRANCH32(be, pt, 8b)
50ae984d72SDavid S. Miller	 add	%o0, 4, %o0
51ae984d72SDavid S. Miller
52ae984d72SDavid S. Miller	/* Check every byte. */
53ae984d72SDavid S. Miller	srl	%o5, 24, %g7
54ae984d72SDavid S. Miller	andcc	%g7, 0xff, %g0
55ae984d72SDavid S. Miller	BRANCH32(be, pn, 1f)
56ae984d72SDavid S. Miller	 add	%o0, -4, %o4
57ae984d72SDavid S. Miller	srl	%o5, 16, %g7
58ae984d72SDavid S. Miller	andcc	%g7, 0xff, %g0
59ae984d72SDavid S. Miller	BRANCH32(be, pn, 1f)
60ae984d72SDavid S. Miller	 add	%o4, 1, %o4
61ae984d72SDavid S. Miller	srl	%o5, 8, %g7
62ae984d72SDavid S. Miller	andcc	%g7, 0xff, %g0
63ae984d72SDavid S. Miller	BRANCH32(be, pn, 1f)
64ae984d72SDavid S. Miller	 add	%o4, 1, %o4
65ae984d72SDavid S. Miller	andcc	%o5, 0xff, %g0
66ae984d72SDavid S. Miller	BRANCH32_ANNUL(bne, pt, 2b)
67ae984d72SDavid S. Miller	 ld	[%o0], %o5
68ae984d72SDavid S. Miller	add	%o4, 1, %o4
69ae984d72SDavid S. Miller1:
70ae984d72SDavid S. Miller	retl
71ae984d72SDavid S. Miller	 sub	%o4, %o1, %o0
72ae984d72SDavid S. Miller11:
73ae984d72SDavid S. Miller	retl
74ae984d72SDavid S. Miller	 mov	0, %o0
75ae984d72SDavid S. Miller12:
76ae984d72SDavid S. Miller	retl
77ae984d72SDavid S. Miller	 mov	1, %o0
78ae984d72SDavid S. Miller13:
79ae984d72SDavid S. Miller	retl
80ae984d72SDavid S. Miller	 mov	2, %o0
81ae984d72SDavid S. MillerENDPROC(strlen)
82d3867f04SAl ViroEXPORT_SYMBOL(strlen)
83