##
## vbcc-PowerPC libvc.a
##
## void *memmove(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
	.extern memcpy

	.global	memmove
memmove:
	cmpwi	r5,0
	beqlr
	cmplw	r3,r4
	blt	.memcpy			# copy ascending? -> memcpy()
	add	r6,r3,r5
	add	r4,r4,r5
	cmplwi	r5,BYTECPY
	blt	.bytecpy
	extrwi	r7,r6,2,30
	extrwi.	r8,r4,2,30
	cmpw	cr1,r7,r8		# same alignment?
	bne	cr1,.2
	beq	.2			# 32-bit alignment
	sub	r5,r5,r7
	mtctr	r7
.1:	lbzu	r0,-1(r4)		# copy 1-3 bytes to achieve alignment
	stbu	r0,-1(r6)
	bdnz	.1
.2:	srwi	r7,r5,2
	mtctr	r7
.3:	lwzu	r0,-4(r4)		# word-copy
	stwu	r0,-4(r6)
	bdnz	.3
	andi.	r5,r5,3			# remaining bytes?
	beqlr
.bytecpy:
	mtctr	r5
.4:	lbzu	r0,-1(r4)
	stbu	r0,-1(r6)
	bdnz	.4
	blr
.memcpy:
	b	memcpy

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