1/* strlen.S: Sparc64 optimized strlen code
2 * Hand optimized from GNU libc's strlen
3 * Copyright (C) 1991,1996 Free Software Foundation
4 * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
5 * Copyright (C) 1996, 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
6 */
7
8#define LO_MAGIC 0x01010101
9#define HI_MAGIC 0x80808080
10
11	.align	32
12	.global strlen, __strlen
13strlen:
14__strlen:
15	mov	%o0, %o1
16	andcc	%o0, 3, %g0
17	be,pt	%icc, 9f
18	 sethi	%hi(HI_MAGIC), %o4
19	ldub	[%o0], %o5
20	brz,pn	%o5, 11f
21	 add	%o0, 1, %o0
22	andcc	%o0, 3, %g0
23	be,pn	%icc, 4f
24	 or	%o4, %lo(HI_MAGIC), %o3
25	ldub	[%o0], %o5
26	brz,pn	%o5, 12f
27	 add	%o0, 1, %o0
28	andcc	%o0, 3, %g0
29	be,pt	%icc, 5f
30	 sethi	%hi(LO_MAGIC), %o4
31	ldub	[%o0], %o5
32	brz,pn	%o5, 13f
33	 add	%o0, 1, %o0
34	ba,pt	%icc, 8f
35	 or	%o4, %lo(LO_MAGIC), %o2
369:
37	or	%o4, %lo(HI_MAGIC), %o3
384:
39	sethi	%hi(LO_MAGIC), %o4
405:
41	or	%o4, %lo(LO_MAGIC), %o2
428:
43	ld	[%o0], %o5
442:
45	sub	%o5, %o2, %o4
46	andcc	%o4, %o3, %g0
47	be,pt	%icc, 8b
48	 add	%o0, 4, %o0
49
50	/* Check every byte. */
51	srl	%o5, 24, %g5
52	andcc	%g5, 0xff, %g0
53	be,pn	%icc, 1f
54	 add	%o0, -4, %o4
55	srl	%o5, 16, %g5
56	andcc	%g5, 0xff, %g0
57	be,pn	%icc, 1f
58	 add	%o4, 1, %o4
59	srl	%o5, 8, %g5
60	andcc	%g5, 0xff, %g0
61	be,pn	%icc, 1f
62	 add	%o4, 1, %o4
63	andcc	%o5, 0xff, %g0
64	bne,a,pt %icc, 2b
65	 ld	[%o0], %o5
66	add	%o4, 1, %o4
671:
68	retl
69	 sub	%o4, %o1, %o0
7011:
71	retl
72	 mov	0, %o0
7312:
74	retl
75	 mov	1, %o0
7613:
77	retl
78	 mov	2, %o0
79