# 
# Copyright (C) 1996-1997 Id Software, Inc. 
# 
# This program is free software; you can redistribute it and/or 
# modify it under the terms of the GNU General Public License 
# as published by the Free Software Foundation; either version 2 
# of the License, or (at your option) any later version. 
# 
# This program is distributed in the hope that it will be useful, 
# but WITHOUT ANY WARRANTY; without even the implied warranty of 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   
# 
# See the GNU General Public License for more details. 
# 
# You should have received a copy of the GNU General Public License 
# along with this program; if not, write to the Free Software 
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
# 

##
## Quake for AMIGA
##
## r_aclipPPC.s
##
## Define WOS for PowerOpen ABI, otherwise SVR4-ABI is used.
##

.include	"macrosPPC.i"

#
# external references
#

	xrefa	r_refdef
	xrefv	INT2DBL_0
	xrefv	c0_5


#
# defines
#

.set	ALIAS_LEFT_CLIP        ,1
.set	ALIAS_TOP_CLIP         ,2
.set	ALIAS_RIGHT_CLIP       ,4
.set	ALIAS_BOTTOM_CLIP      ,8

.set	FV_V                   ,0
.set	FV_FLAGS               ,24
.set	FV_RESERVED            ,28
.set	FV_SIZEOF              ,32
.set	FV_SIZEOF_EXP          ,5

.set	REFDEF_VRECT           ,0
.set	REFDEF_ALIASVRECT      ,20
.set	REFDEF_VRECTRIGHT      ,40
.set	REFDEF_VRECTBOTTOM     ,44
.set	REFDEF_ALIASVRECTRIGHT ,48
.set	REFDEF_ALIASVRECTBOTTOM,52

.set	VRECT_X                ,0
.set	VRECT_Y                ,4
.set	VRECT_WIDTH            ,8
.set	VRECT_HEIGHT           ,12
.set	VRECT_PNEXT            ,16




###########################################################################
#
#       void _R_Alias_clip_left (finalvert_t *pfv0, finalvert_t *pfv1,
#                                finalvert_t *out)
#
###########################################################################

	funcdef	R_Alias_clip_left

	init	0,16,0,0

	lf      f1,INT2DBL_0		#for int2dbl setup, tmp=r6
	stfd	f1,local(r1)
	lxa     r7,r_refdef
	lwz     r7,REFDEF_ALIASVRECT+VRECT_X(r7)
	ls      f2,c0_5
	subi    r3,r3,4
	subi    r4,r4,4
	subi    r5,r5,4
	lwzu    r8,4(r3)
	lwzu    r9,4(r3)
	lwzu    r10,4(r4)
	lwzu    r11,4(r4)
	cmpw    r9,r11
	blt     .lcont
	subf    r12,r8,r7
	int2dbl f3,r12,r6,local,f1
	fadd    f4,f2,f3
	subf    r12,r8,r10
	int2dbl f5,r12,r6,local,f1
	fdivs   f6,f3,f5
	fctiwz  f0,f4
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r8
	stwu    r12,4(r5)
	li      r0,5
	mtctr   r0
	b       .lentry
.lloop:
	lwzu    r9,4(r3)
	lwzu    r11,4(r4)
.lentry:
	subf    r12,r9,r11
	int2dbl f3,r12,r6,local,f1
	fmadds  f3,f3,f6,f2
	fctiwz  f0,f3
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r9
	stwu    r12,4(r5)
	bdnz    .lloop
	b       .lexit
.lcont:
	subf    r12,r10,r7
	int2dbl f3,r12,r6,local,f1
	fadd    f4,f2,f3
	subf    r12,r10,r8
	int2dbl f5,r12,r6,local,f1
	fdivs   f6,f3,f5
	fctiwz  f0,f4
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r10
	stwu    r12,4(r5)
	li      r0,5
	mtctr   r0
	b       .lentry2
.lloop2:
	lwzu    r9,4(r3)
	lwzu    r11,4(r4)
.lentry2:
	subf    r12,r11,r9
	int2dbl f3,r12,r6,local,f1
	fmadds  f3,f3,f6,f2
	fctiwz  f0,f3
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r11
	stwu    r12,4(r5)
	bdnz    .lloop2
.lexit:
	exit

	funcend	R_Alias_clip_left




###########################################################################
#
#       void R_Alias_clip_right (finalvert_t *pfv0, finalvert_t *pfv1,
#                                finalvert_t *out)
#
###########################################################################

	funcdef	R_Alias_clip_right

	init	0,16,0,0

	lf      f1,INT2DBL_0		#for int2dbl_setup, tmp=r6
	stfd	f1,local(r1)
	lxa     r7,r_refdef
	lwz     r7,REFDEF_ALIASVRECTRIGHT(r7)
	ls      f2,c0_5
	subi    r3,r3,4
	subi    r4,r4,4
	subi    r5,r5,4
	lwzu    r8,4(r3)
	lwzu    r9,4(r3)
	lwzu    r10,4(r4)
	lwzu    r11,4(r4)
	cmpw    r9,r11
	blt     .rcont
	subf    r12,r8,r7
	int2dbl f3,r12,r6,local,f1
	fadd    f4,f2,f3
	subf    r12,r8,r10
	int2dbl f5,r12,r6,local,f1
	fdivs   f6,f3,f5
	fctiwz  f0,f4
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r8
	stwu    r12,4(r5)
	li      r0,5
	mtctr   r0
	b       .rentry
.rloop:
	lwzu    r9,4(r3)
	lwzu    r11,4(r4)
.rentry:
	subf    r12,r9,r11
	int2dbl f3,r12,r6,local,f1
	fmadds  f3,f3,f6,f2
	fctiwz  f0,f3
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r9
	stwu    r12,4(r5)
	bdnz    .rloop
	b       .rexit
.rcont:
	subf    r12,r10,r7
	int2dbl f3,r12,r6,local,f1
	fadd    f4,f2,f3
	subf    r12,r10,r8
	int2dbl f5,r12,r6,local,f1
	fdivs   f6,f3,f5
	fctiwz  f0,f4
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r10
	stwu    r12,4(r5)
	li      r0,5
	mtctr   r0
	b       .rentry2
.rloop2:
	lwzu    r9,4(r3)
	lwzu    r11,4(r4)
.rentry2:
	subf    r12,r11,r9
	int2dbl f3,r12,r6,local,f1
	fmadds  f3,f3,f6,f2
	fctiwz  f0,f3
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r11
	stwu    r12,4(r5)
	bdnz    .rloop2
.rexit:
	exit

	funcend	R_Alias_clip_right




###########################################################################
#
#       void R_Alias_clip_top (finalvert_t *pfv0, finalvert_t *pfv1,
#                                finalvert_t *out)
#
###########################################################################

	funcdef	R_Alias_clip_top

	init	0,16,0,0

	lf      f1,INT2DBL_0		#for int2dbl_setup, tmp=r6
	stfd	f1,local(r1)
	lxa     r7,r_refdef
	lwz     r7,REFDEF_ALIASVRECT+VRECT_Y(r7)
	ls      f2,c0_5
	subi    r3,r3,4
	subi    r4,r4,4
	subi    r5,r5,4
	lwzu    r8,4(r3)
	lwzu    r9,4(r3)
	lwzu    r10,4(r4)
	lwzu    r11,4(r4)
	cmpw    r9,r11
	blt     .tcont
	subf    r12,r9,r7
	int2dbl f3,r12,r6,local,f1
	fadd    f4,f2,f3
	subf    r12,r9,r11
	int2dbl f5,r12,r6,local,f1
	fdivs   f6,f3,f5
	fctiwz  f0,f4
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r9
	stwu    r12,4(r5)
	li      r0,5
	mtctr   r0
	b       .tentry
.tloop:
	lwzu    r8,4(r3)
	lwzu    r10,4(r4)
.tentry:
	subf    r12,r8,r10
	int2dbl f3,r12,r6,local,f1
	fmadds  f3,f3,f6,f2
	fctiwz  f0,f3
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r8
	stwu    r12,4(r5)
	bdnz    .tloop
	b       .texit
.tcont:
	subf    r12,r11,r7
	int2dbl f3,r12,r6,local,f1
	fadd    f4,f2,f3
	subf    r12,r11,r9
	int2dbl f5,r12,r6,local,f1
	fdivs   f6,f3,f5
	fctiwz  f0,f4
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r11
	stwu    r12,4(r5)
	li      r0,5
	mtctr   r0
	b       .tentry2
.tloop2:
	lwzu    r8,4(r3)
	lwzu    r10,4(r4)
.tentry2:
	subf    r12,r10,r8
	int2dbl f3,r12,r6,local,f1
	fmadds  f3,f3,f6,f2
	fctiwz  f0,f3
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r10
	stwu    r12,4(r5)
	bdnz    .tloop2
.texit:
	lwz     r3,-20(r5)
	lwz     r4,-16(r5)
	stw     r4,-20(r5)
	stw     r3,-16(r5)
	exit

	funcend	R_Alias_clip_top




###########################################################################
#
#       void R_Alias_clip_bottom (finalvert_t *pfv0, finalvert_t *pfv1,
#                                finalvert_t *out)
#
###########################################################################

	funcdef	R_Alias_clip_bottom

	init	0,16,0,0

	lf      f1,INT2DBL_0		#for int2dbl_setup, tmp=r6
	stfd	f1,local(r1)
	lxa     r7,r_refdef
	lwz     r7,REFDEF_ALIASVRECTBOTTOM(r7)
	ls      f2,c0_5
	subi    r3,r3,4
	subi    r4,r4,4
	subi    r5,r5,4
	lwzu    r8,4(r3)
	lwzu    r9,4(r3)
	lwzu    r10,4(r4)
	lwzu    r11,4(r4)
	cmpw    r9,r11
	blt     .bcont
	subf    r12,r9,r7
	int2dbl f3,r12,r6,local,f1
	fadd    f4,f2,f3
	subf    r12,r9,r11
	int2dbl f5,r12,r6,local,f1
	fdivs   f6,f3,f5
	fctiwz  f0,f4
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r9
	stwu    r12,4(r5)
	li      r0,5
	mtctr   r0
	b       .bentry
.bloop:
	lwzu    r8,4(r3)
	lwzu    r10,4(r4)
.bentry:
	subf    r12,r8,r10
	int2dbl f3,r12,r6,local,f1
	fmadds  f3,f3,f6,f2
	fctiwz  f0,f3
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r8
	stwu    r12,4(r5)
	bdnz    .bloop
	b       .bexit
.bcont:
	subf    r12,r11,r7
	int2dbl f3,r12,r6,local,f1
	fadd    f4,f2,f3
	subf    r12,r11,r9
	int2dbl f5,r12,r6,local,f1
	fdivs   f6,f3,f5
	fctiwz  f0,f4
	stfd    f0,local+8(r1)
	lwz     r12,local+12(r1)
	add     r12,r12,r11
	stwu    r12,4(r5)
	li      r0,5
	mtctr   r0
	b       .bentry2
.bloop2:
	lwzu    r8,4(r3)
	lwzu    r10,4(r4)
.bentry2:
	subf    r12,r10,r8
	int2dbl f3,r12,r6,local,f1
	fmadds  f3,f3,f6,f2
	fctiwz  f0,f3
	stfd    f0,-8(r1)
	lwz     r12,-4(r1)
	add     r12,r12,r10
	stwu    r12,4(r5)
	bdnz    .bloop2
.bexit:
	lwz     r3,-20(r5)
	lwz     r4,-16(r5)
	stw     r4,-20(r5)
	stw     r3,-16(r5)
	exit

	funcend	R_Alias_clip_bottom




###########################################################################
#
#       int R_AliasClip  (finalvert_t *in, finalvert_t *out, int flag,
#                          int count, void(*clip)(...)
#
###########################################################################

	funcdef	R_AliasClip

	init	0,0,13,0
	stmw	r19,gb(r1)

#        j = count-1;
#        k = 0;
#        for (i=0 ; i<count ; j = i, i++)
#        {

	mr      r20,r6
	subic.  r8,r6,1
	blt     .acskip
	slwi    r8,r8,FV_SIZEOF_EXP
	add     r31,r3,r8               #r31 = in[j]
	lxa     r10,r_refdef
	lwz     r30,REFDEF_ALIASVRECT+VRECT_X(r10)
	lwz     r29,REFDEF_ALIASVRECT+VRECT_Y(r10)
	lwz     r28,REFDEF_ALIASVRECTRIGHT(r10)
	lwz     r27,REFDEF_ALIASVRECTBOTTOM(r10)
	mr      r26,r3
	mr      r25,r3
	mr      r24,r5
	mr      r22,r7
	mr      r21,r4
	mr      r19,r4

#                oldflags = in[j].flags & flag;
#                flags = in[i].flags & flag;
#                if (flags && oldflags)
#                        continue;

.acloop:
	lwz     r0,FV_FLAGS(r31)
	and     r0,r0,r24
	lwz     r23,FV_FLAGS(r25)
	and.    r23,r23,r24
	beq     .acdo
	mr.     r0,r0
	bne     .acnext
.acdo:

#                if (oldflags ^ flags)
#                {
#                        clip (&in[j], &in[i], &out[k]);
#                        out[k].flags = 0;
#                        if (out[k].v[0] < r_refdef.aliasvrect.x)
#                                out[k].flags |= ALIAS_LEFT_CLIP;
#                        if (out[k].v[1] < r_refdef.aliasvrect.y)
#                                out[k].flags |= ALIAS_TOP_CLIP;
#                        if (out[k].v[0] > r_refdef.aliasvrectright)
#                                out[k].flags |= ALIAS_RIGHT_CLIP;
#                        if (out[k].v[1] > r_refdef.aliasvrectbottom)
#                                out[k].flags |= ALIAS_BOTTOM_CLIP;
#                        k++;
#                }

	xor.    r0,r0,r23
	beq     .accont
	mtlr    r22
	mr      r3,r31
	mr      r4,r25
	mr      r5,r21
	blrl
	li      r3,0
	lwz     r0,0(r21)
	cmpw    r0,r30
	bge     .ac1
	ori     r3,r3,ALIAS_LEFT_CLIP
.ac1:
	cmpw    r0,r28
	ble     .ac2
	ori     r3,r3,ALIAS_RIGHT_CLIP
.ac2:
	lwz     r0,4(r21)
	cmpw    r0,r29
	bge     .ac3
	ori     r3,r3,ALIAS_TOP_CLIP
.ac3:
	cmpw    r0,r27
	ble     .ac4
	ori     r3,r3,ALIAS_BOTTOM_CLIP
.ac4:
	stw     r3,FV_FLAGS(r21)
	la      r21,FV_SIZEOF(r21)

#                if (!flags)
#                {
#                        out[k] = in[i];
#                        k++;
#                }

.accont:
	mr.     r23,r23
	bne     .acnext
	lwz     r0,0(r25)
	stw     r0,0(r21)
	lwz     r3,4(r25)
	stw     r3,4(r21)
	lwz     r0,8(r25)
	stw     r0,8(r21)
	lwz     r3,12(r25)
	stw     r3,12(r21)
	lwz     r0,16(r25)
	stw     r0,16(r21)
	lwz     r3,20(r25)
	stw     r3,20(r21)
	lwz     r0,24(r25)
	stw     r0,24(r21)
	la      r21,FV_SIZEOF(r21)
.acnext:
	mr      r31,r26
	la      r26,FV_SIZEOF(r26)
	la      r25,FV_SIZEOF(r25)
	subic.  r20,r20,1
	bne     .acloop

#        return k;

.acskip:
	subf    r3,r19,r21
	srawi   r3,r3,FV_SIZEOF_EXP

	lmw	r19,gb(r1)
	exit

	funcend	R_AliasClip
