# FastCode.ASM

#include <asm.h>
#include <regdef.h>
#include <R4300.h>

// This is really, really broken, since we don't export anything
// and I've commented out all the AT stuff. 


	.text


#	xdef	TransformVectors

#	xdef	Copy8s
#	xdef	Copy16s
#	xdef	Copy32s
#	xdef	Copy64s

#	xdef	Set8s
#	xdef	Set16s
#	xdef	Set32s
#	xdef	Set64s


# TransformVectors( src, count, matrix, offset, dst )

.set noat
.set noreorder

LEAF(TransformVectors)
	lw	v0,16(sp)
	sub	sp,(3*4)
	sw	s0,0(sp)
	sw	s1,4(sp)
	sw	s2,8(sp)
	move	v1,a1

	lw	t0,(0*4)(a2)	#xX
	lw	t1,(3*4)(a2)	#yX
	lw	t2,(6*4)(a2)	#zX

	lw	t3,(1*4)(a2)	#xY
	lw	t4,(4*4)(a2)	#yY
	lw	t5,(7*4)(a2)	#zY

	lw	t6,(2*4)(a2)	#xZ
	lw	t7,(5*4)(a2)	#yZ
	lw	t8,(8*4)(a2)	#zZ

	lh	a1,0(a3)
	lh	a2,2(a3)
	lh	a3,4(a3)

repeat:
	lh	s0,0(a0)
	lh	s1,2(a0)
	lh	s2,4(a0)
	sub	v1,1

	mult	s0,t0		#xX
	mflo	t9
	mult	s1,t1		#yX
	mflo	AT
	add	t9,AT
	mult	s2,t2		#zX
	mflo	AT
	add	t9,AT
	sra	t9,14
	add	t9,a1
	sh	t9,0(v0)

	mult	s0,t3		#xY
	mflo	t9
	mult	s1,t4		#yY
	mflo	AT
	add	t9,AT
	mult	s2,t5		#zY
	mflo	AT
	add	t9,AT
	sra	t9,14
	add	t9,a2
	sh	t9,2(v0)

	mult	s0,t6		#xZ
	mflo	t9
	mult	s1,t7		#yZ
	mflo	AT
	add	t9,AT
	mult	s2,t8		#zZ
	mflo	AT
	add	t9,AT
	sra	t9,14
	add	t9,a3
	sh	t9,4(v0)

	add	v0,(4*2)

	bnez	v1,repeat
	add	a0,(4*2)

	lw	s0,0(sp)
	lw	s1,4(sp)
	lw	s2,8(sp)

	jr	ra
	add	sp,(3*4)

END(TransformVectors)

# Copy8s( src, dst, count )

LEAF(Copy8s)
	lbu	v0,(a0)
	add	a0,1
	sb	v0,(a1)
	sub	a2,1
	bnez	a2,Copy8s
	add	a1,1

	jr	ra
	nop
END(Copy8s)


# Copy16s( src, dst, count )

LEAF(Copy16s)
	lhu	v0,(a0)
	add	a0,2
	sh	v0,(a1)
	sub	a2,1
	bnez	a2,Copy16s
	add	a1,2

	jr	ra
	nop
END(Copy16s)


# Copy32s( src, dst, count )

LEAF(Copy32s)
	lw	v0,(a0)
	add	a0,4
	sw	v0,(a1)
	sub	a2,1
	bnez	a2,Copy32s
	add	a1,4

	jr	ra
	nop
END(Copy32s)


# Copy64s( src, dst, count )

LEAF(Copy64s)
	ld	v0,(a0)
	add	a0,8
	sd	v0,(a1)
	sub	a2,1
	bnez	a2,Copy64s
	add	a1,8

	jr	ra
	nop
END(Copy64s)


#Set8s( dst, value, count )

LEAF(Set8s)
	sb	a1,(a0)
	sub	a2,1
	bnez	a2,Set8s
	add	a0,1

	jr	ra
	nop
END(Set8s)


#Set16s( dst, value, count )

LEAF(Set16s)
	sh	a1,(a0)
	sub	a2,1
	bnez	a2,Set16s
	add	a0,2

	jr	ra
	nop
END(Set16s)


#Set32s( dst, value, count )

LEAF(Set32s)
	sw	a1,(a0)
	sub	a2,1
	bnez	a2,Set32s
	add	a0,4

	jr	ra
	nop
END(Set32s)


#Set64s( dst, value, count )

LEAF(Set64s)
	sd	a1,(a0)
	sub	a2,1
	bnez	a2,Set64s
	add	a0,8

	jr	ra
	nop
END(Set64s)
