##
## vbcc-PowerPC libvc.a
##
## void *memcpy(void *s1,const void *s2,size_t n)
## r3           r3       r4             r5
##
## v0.2 23.12.97 phx
##      check n=0
## v0.1 23.11.97 phx
##

.set	BYTECPY,16			# do byte-copy for n < 16

	.text
	.global	memcpy
memcpy:
	cmpwi	r5,0
	beqlr
	mr	r6,r3
	cmplwi	r5,BYTECPY
	blt	.bytecpy
	extrwi	r7,r6,2,30
	extrwi.	r8,r4,2,30
	cmpw	cr1,r7,r8		# same alignment?
	bne	cr1,.1
	beq	.1			# 32-bit alignment
	li	r7,4
	sub	r7,r7,r8
	lwz	r0,0(r4)
	sub	r5,r5,r7
	add	r4,r4,r7
	stw	r0,0(r6)		# store first bytes unaligned
	add	r6,r6,r7
.1:	srwi	r7,r5,2
	mtctr	r7
	subi	r4,r4,4
	subi	r6,r6,4
.2:	lwzu	r0,4(r4)		# word-copy
	stwu	r0,4(r6)
	bdnz	.2
	andi.	r5,r5,3			# remaining bytes?
	beqlr
	addi	r4,r4,4
	addi	r6,r6,4
.bytecpy:
	mtctr	r5
	subi	r6,r6,1
	subi	r4,r4,1
.3:	lbzu	r0,1(r4)
	stbu	r0,1(r6)
	bdnz	.3
	blr

	.type	memcpy,@function
	.size	memcpy,$-memcpy
