Blame sysdeps/sparc/sparc32/memchr.S

Packit 6c4009
/* memchr (str, ch, n) -- Return pointer to first occurrence of CH in STR less
Packit 6c4009
   than N.
Packit 6c4009
   For SPARC v7.
Packit 6c4009
   Copyright (C) 1996-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
   Contributed by Jakub Jelinek <jj@ultra.linux.cz> and
Packit 6c4009
		  David S. Miller <davem@caip.rutgers.edu>.
Packit 6c4009
   This version is developed using the same algorithm as the fast C
Packit 6c4009
   version which carries the following introduction:
Packit 6c4009
   Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
Packit 6c4009
   with help from Dan Sahlin (dan@sics.se) and
Packit 6c4009
   commentary by Jim Blandy (jimb@ai.mit.edu);
Packit 6c4009
   adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
Packit 6c4009
   and implemented by Roland McGrath (roland@ai.mit.edu).
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <sysdep.h>
Packit 6c4009
Packit 6c4009
	.text
Packit 6c4009
	.align		4
Packit 6c4009
ENTRY(__memchr)
Packit 6c4009
	andcc		%o1, 0xff, %o1
Packit 6c4009
	sll		%o1, 8, %g6
Packit 6c4009
	andcc		%o0, 3, %g0
Packit 6c4009
	or		%o1, %g6, %g6
Packit 6c4009
	sll		%g6, 16, %o3
Packit 6c4009
	be		10f
Packit 6c4009
	 or		%o3, %g6, %g2
Packit 6c4009
	cmp		%o2, 0
Packit 6c4009
	be		9f
Packit 6c4009
	 sethi		%hi(0x80808080), %o4
Packit 6c4009
	ldub		[%o0], %g4
Packit 6c4009
	cmp		%g4, %o1
Packit 6c4009
	be		1f
Packit 6c4009
	 add		%o0, 1, %o0
Packit 6c4009
	subcc		%o2, 1, %o2
Packit 6c4009
	be		9f
Packit 6c4009
	 andcc		%o0, 3, %g0
Packit 6c4009
	be		4f
Packit 6c4009
	 or		%o4, %lo(0x80808080), %o3
Packit 6c4009
	ldub		[%o0], %g4
Packit 6c4009
	cmp		%g4, %o1
Packit 6c4009
	be		1f
Packit 6c4009
	 add		%o0, 1, %o0
Packit 6c4009
	subcc		%o2, 1, %o2
Packit 6c4009
	be		9f
Packit 6c4009
	 andcc		%o0, 3, %g0
Packit 6c4009
	be		5f
Packit 6c4009
	 sethi		%hi(0x01010101), %o5
Packit 6c4009
	ldub		[%o0], %g4
Packit 6c4009
	cmp		%g4, %o1
Packit 6c4009
	be		1f
Packit 6c4009
	 add		%o0, 1, %o0
Packit 6c4009
	subcc		%o2, 1, %o2
Packit 6c4009
	bne,a		7f
Packit 6c4009
	 and		%o2, 3, %g1
Packit 6c4009
	retl
Packit 6c4009
	 clr		%o0
Packit 6c4009
1:	retl
Packit 6c4009
	 sub		%o0, 1, %o0
Packit 6c4009
10:	sethi		%hi(0x80808080), %o4
Packit 6c4009
	or		%o4, %lo(0x80808080), %o3
Packit 6c4009
4:	sethi		%hi(0x01010101), %o5
Packit 6c4009
5:	and		%o2, 3, %g1
Packit 6c4009
7:	andcc		%o2, 0xfffffffc, %o2
Packit 6c4009
	be		0f
Packit 6c4009
	 or		%o5, %lo(0x01010101), %g6
Packit 6c4009
	ld		[%o0], %g4
Packit 6c4009
6:	xor		%g4, %g2, %g5
Packit 6c4009
	add		%o0, 4, %o0
Packit 6c4009
	sub		%g5, %g6, %g5
Packit 6c4009
	andcc		%g5, %o3, %g0
Packit 6c4009
	bne		8f
Packit 6c4009
	 subcc		%o2, 4, %o2
Packit 6c4009
	bne,a		6b
Packit 6c4009
	 ld		[%o0], %g4
Packit 6c4009
0:	cmp		%g1, 0
Packit 6c4009
1:	be		9f
Packit 6c4009
	 add		%o0, 4, %o0
Packit 6c4009
	ldub		[%o0 - 4], %g4
Packit 6c4009
	cmp		%g4, %o1
Packit 6c4009
	be		4f
Packit 6c4009
	 cmp		%g1, 1
Packit 6c4009
	be		9f
Packit 6c4009
	 ldub		[%o0 - 3], %g4
Packit 6c4009
	cmp		%g4, %o1
Packit 6c4009
	be		3f
Packit 6c4009
	 cmp		%g1, 2
Packit 6c4009
	be		9f
Packit 6c4009
	 ldub		[%o0 - 2], %g4
Packit 6c4009
	cmp		%g4, %o1
Packit 6c4009
	be		2f
Packit 6c4009
	 nop
Packit 6c4009
9:	retl
Packit 6c4009
	 clr		%o0
Packit 6c4009
Packit 6c4009
	/* Check every byte. */
Packit 6c4009
8:	srl		%g4, 24, %g5
Packit 6c4009
	and		%g5, 0xff, %g5
Packit 6c4009
	cmp		%g5, %o1
Packit 6c4009
	be		4f
Packit 6c4009
	 srl		%g4, 16, %g5
Packit 6c4009
	and		%g5, 0xff, %g5
Packit 6c4009
	cmp		%g5, %o1
Packit 6c4009
	be		3f
Packit 6c4009
	 srl		%g4, 8, %g5
Packit 6c4009
	and		%g5, 0xff, %g5
Packit 6c4009
	cmp		%g5, %o1
Packit 6c4009
	be		2f
Packit 6c4009
	 and		%g4, 0xff, %g5
Packit 6c4009
	cmp		%g5, %o1
Packit 6c4009
	be		1f
Packit 6c4009
	 cmp		%o2, 0
Packit 6c4009
	bne,a		6b
Packit 6c4009
	 ld		[%o0], %g4
Packit 6c4009
	b		1b
Packit 6c4009
	 cmp		%g1, 0
Packit 6c4009
1:	retl
Packit 6c4009
	 sub		%o0, 1, %o0
Packit 6c4009
2:	retl
Packit 6c4009
	 sub		%o0, 2, %o0
Packit 6c4009
3:	retl
Packit 6c4009
	 sub		%o0, 3, %o0
Packit 6c4009
4:	retl
Packit 6c4009
	 sub		%o0, 4, %o0
Packit 6c4009
END(__memchr)
Packit 6c4009
Packit 6c4009
weak_alias (__memchr, memchr)
Packit 6c4009
libc_hidden_builtin_def (memchr)