##
## vbcc-PowerPC libvc.a
##
## void *memset(void *s,int c,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	memset
memset:
	cmpwi	r5,0
	beqlr
	mr	r6,r3
	cmplwi	r5,BYTECPY
	blt	.byteset
	insrwi	r4,r4,8,16
	insrwi	r4,r4,16,0
	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
	sub	r5,r5,r7
	stw	r4,0(r6)		# store first bytes unaligned
	add	r6,r6,r7
.1:	srwi	r7,r5,2
	mtctr	r7
	subi	r6,r6,4
.2:	stwu	r4,4(r6)
	bdnz	.2
	andi.	r5,r5,3			# remaining bytes?
	beqlr
	addi	r6,r6,4
.byteset:
	mtctr	r5
	subi	r6,r6,1
.3:	stbu	r4,1(r6)
	bdnz	.3
	blr

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