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