1/* strlen_user.S: Sparc optimized strlen_user code
2 *
3 * Return length of string in userspace including terminating 0
4 * or 0 for error
5 *
6 * Copyright (C) 1991,1996 Free Software Foundation
7 * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
8 * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
9 */
10
11#define LO_MAGIC 0x01010101
12#define HI_MAGIC 0x80808080
13
1410:
15	ldub	[%o0], %o5
16	cmp	%o5, 0
17	be	1f
18	 add	%o0, 1, %o0
19	andcc	%o0, 3, %g0
20	be	4f
21	 or	%o4, %lo(HI_MAGIC), %o3
2211:
23	ldub	[%o0], %o5
24	cmp	%o5, 0
25	be	2f
26	 add	%o0, 1, %o0
27	andcc	%o0, 3, %g0
28	be	5f
29	 sethi	%hi(LO_MAGIC), %o4
3012:
31	ldub	[%o0], %o5
32	cmp	%o5, 0
33	be	3f
34	 add	%o0, 1, %o0
35	b	13f
36	 or	%o4, %lo(LO_MAGIC), %o2
371:
38	retl
39	 mov	1, %o0
402:
41	retl
42	 mov	2, %o0
433:
44	retl
45	 mov	3, %o0
46
47	.align 4
48	.global __strlen_user, __strnlen_user
49__strlen_user:
50	sethi	%hi(32768), %o1
51__strnlen_user:
52	mov	%o1, %g1
53	mov	%o0, %o1
54	andcc	%o0, 3, %g0
55	bne	10b
56	 sethi	%hi(HI_MAGIC), %o4
57	or	%o4, %lo(HI_MAGIC), %o3
584:
59	sethi	%hi(LO_MAGIC), %o4
605:
61	or	%o4, %lo(LO_MAGIC), %o2
6213:
63	ld	[%o0], %o5
642:
65	sub	%o5, %o2, %o4
66	andcc	%o4, %o3, %g0
67	bne	82f
68	 add	%o0, 4, %o0
69	sub	%o0, %o1, %g2
7081:	cmp	%g2, %g1
71	blu	13b
72	 mov	%o0, %o4
73	ba,a	1f
74
75	/* Check every byte. */
7682:	srl	%o5, 24, %g5
77	andcc	%g5, 0xff, %g0
78	be	1f
79	 add	%o0, -3, %o4
80	srl	%o5, 16, %g5
81	andcc	%g5, 0xff, %g0
82	be	1f
83	 add	%o4, 1, %o4
84	srl	%o5, 8, %g5
85	andcc	%g5, 0xff, %g0
86	be	1f
87	 add	%o4, 1, %o4
88	andcc	%o5, 0xff, %g0
89	bne	81b
90	 sub	%o0, %o1, %g2
91
92	add	%o4, 1, %o4
931:
94	retl
95	 sub	%o4, %o1, %o0
96
97	.section .fixup,#alloc,#execinstr
98	.align	4
999:
100	retl
101	 clr	%o0
102
103	.section __ex_table,#alloc
104	.align	4
105
106	.word	10b, 9b
107	.word	11b, 9b
108	.word	12b, 9b
109	.word	13b, 9b
110