/*
** Copyright 1991-1993, Silicon Graphics, Inc.
** All Rights Reserved.
**
** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
** the contents of this file may not be disclosed to third parties, copied or
** duplicated in any form, in whole or in part, without the prior written
** permission of Silicon Graphics, Inc.
**
** RESTRICTED RIGHTS LEGEND:
** Use, duplication or disclosure by the Government is subject to restrictions
** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
** rights reserved under the Copyright Laws of the United States.
*/
#include <ksmips.h>
#include "glmips.h"


#define	__FRAMESIZE	40


/*
**
*/
#define RENDERPOINT	t9
#define VALIDATE	t9
#define NEEDS		a2
#define CLIPCODE_0	t1
#define CLIPCODE	t0
#define VX		a1
#define CLIPLINE	t9
#define RENDERLINE	t9
#define V1OUT		a1
#define CODE1		a3
#define V0OUT		a2
#define CODE0		v1
#define V1		v0
#define V0		a1
#define GC		a0

#ifdef __GL_ASM_OTHERLSTRIPVERTEXFAST
	LEAF_ENTRY(__glOtherLStripVertexFast)

/* :invars GC = a0, V0 = a1 */
	.set	noreorder
	lw	V1, __GC_VERTEX_V1(GC)
	lw	CODE0, __VX_CLIPCODE(V0)
	move	V0OUT, V0
	lw	CODE1, __VX_CLIPCODE(V1)
	move	V1OUT, V1	/* Notice that V1OUT is the same as V0 */
	lw	RENDERLINE, __GC_PROCS_RENDERLINE(GC)
	or	CODE0, CODE1
	bne	CODE0, zero, $clipline_L_49
	 sw	V0OUT, __GC_VERTEX_V1(GC)
	j	RENDERLINE
	 sw	V1OUT, __GC_VERTEX_V0(GC)

/* :outvars GC = a0, V1OUT = a1, V0OUT = a2, RENDERLINE = t9 */

$clipline_L_49:
	lw	CLIPLINE, __GC_PROCS_CLIPLINE(GC)
	sw	V1OUT, __GC_VERTEX_V0(GC)
	nop
	j	CLIPLINE
	 nop
/* :outvars GC = a0, V1OUT = a1, V0OUT = a2, CLIPLINE = t9 */

	.set 	reorder
	.end	__glOtherLStripVertexFast
#endif /* __GL_ASM_OTHERLSTRIPVERTEXFAST */

#ifdef __GL_ASM_POINT
/*****************************************************************************/
/*
**  void __glPoint(__GLcontext *gc, __GLvertex *vx)
**  {
**	if (vx->clipCode == 0) {
**	    (*vx->validate)(gc, vx, gc->vertex.needs | __GL_HAS_FRONT_COLOR);
**	    (*gc->procs.renderPoint)(gc, vx);
**	}
**  }
*/

	NESTED_ENTRY(__glPoint, __FRAMESIZE, ra)
	.set	noreorder

/* :invars GC = a0, VX = a1 */
	.mask	0x80000030, -4
	subu	sp, __FRAMESIZE
	sw	ra, __FRAMESIZE-4(sp)
	sw	VX, __FRAMESIZE-12(sp)
	sw	GC, __FRAMESIZE-16(sp)

	PROLOGUE_END
	
	lw	CLIPCODE, __VX_CLIPCODE(VX)
	lw	NEEDS, __GC_VERTEX_FRONTFACE_NEEDS(GC)
	lw	VALIDATE, __VX_VALIDATE(VX)
	bne	CLIPCODE, zero, $clipped_F_101
	 nop

	jal	VALIDATE
	 ori	NEEDS, __GL_HAS_FRONT_COLOR
/* :outvars NEEDS = a2, VALIDATE = t9, GC = a0, VX = a1 */

	lw	GC, __FRAMESIZE-16(sp)
	lw	VX, __FRAMESIZE-12(sp)
	nop
	lw	RENDERPOINT, __GC_PROCS_RENDERPOINT(GC)
	lw	ra, __FRAMESIZE-4(sp)
	nop
	j	RENDERPOINT
	 addu	sp, __FRAMESIZE
/* :outvars GC = a0, VX = a1, RENDERPOINT = t9 */

$clipped_F_101:
	j ra
	 addu	sp, __FRAMESIZE

	.set	reorder
	.end	__glPoint
#endif /* __GL_ASM_POINT */

#ifdef __GL_ASM_POINTFAST
/*****************************************************************************/
/*
**  void __glPointFast(__GLcontext *gc, __GLvertex *vx)
**  {
**	if (vx->clipCode == 0) {
**	    (*gc->procs.renderPoint)(gc, vx);
**	}
**  }
*/

	LEAF_ENTRY(__glPointFast)
	.set	noreorder

/* :invars GC = a0, VX = a1 */
	lw	CLIPCODE_0, __VX_CLIPCODE(VX)
	lw	RENDERPOINT, __GC_PROCS_RENDERPOINT(GC)
	nop
	bne	CLIPCODE_0, zero, $clipped_F_133
	nop

	j	RENDERPOINT
	nop
/* :outvars GC = a0, VX = a1, RENDERPOINT = t9 */

$clipped_F_133:
	j ra
	nop

	.set	reorder
	.end	__glPointFast
#endif /* __GL_ASM_POINTFAST */