V10/libc/gen/memccpy.s

Compare this file to the similar file:
Show the results in this format:

	.file	"memccpy.s"
#	@(#)memccpy.s	1.5
# Fast assembler language version of the following C-program
#			memccpy
# which represents the `standard' for the C-library.

# Copy s2 to s1, stopping if character c is copied. Copy no more than n bytes.
# Return a pointer to the byte after character c in the copy,
# or NULL if c is not found in the first n bytes.

#	char *
#	memccpy(s1, s2, c, n)
#	register char *s1, *s2;
#	register int c, n;
#	{
#		while (--n >= 0)
#			if ((*s1++ = *s2++) == c)
#				return (s1);
#		return (0);
#	}
	.globl	_memccpy
	.text
	.align	2
_memccpy:
	.word	0x00c0		# uses regs. 0,1,2,3,4,5,6,7
	movq	12(ap),r6	# escape char in r6, len in r7
	tstl	r7		# source length (arg `n')
	bleq	L2		# n <= 0, so return now!
	movq	4(ap),r3	# dest ptr in r3, src ptr in r4
	movl	r4,r1		# src ptr in r1 also
L0:
	cmpl	$65535,r7	# is max len VERY large?
	bgeq	L1		# hop if not
	locc	r6,$65535,(r1)	# look for escape char in src.
	bneq	L3		# found it
	movc3	$65535,(r4),(r3)	# copy all the chars
	movl	r1,r4		# updated src ptr
	subl2	$65535,r7
	jbr	L0		# go look at some more chars
L1:
	locc	r6,r7,(r1)	# look for escape char in src.
	bneq	L4		# found it
	movc3	r7,(r4),(r3)	# copy all the chars
	ret			# done (r0 is now 0)
L2:
	clrl	r0		# char not found, return zero
	ret
L3:
	movl	$65535,r7	# len of BLOCK when len VERY large
L4:
	subl2	r0,r7		# number of bytes to escape char
	incl	r7		# move the escape char also
	movc3	r7,(r4),(r3)	# copy the chars
	movl	r3,r0		# we're done - return ptr to next dest char
	ret