;
; Mesa 3-D graphics library
; Version:  2.5
; Copyright (C) 1995-1997  Brian Paul
;
; This library is free software; you can redistribute it and/or
; modify it under the terms of the GNU Library General Public
; License as published by the Free Software Foundation; either
; version 2 of the License, or (at your option) any later version.
;
; This library 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
; Library General Public License for more details.
;
; You should have received a copy of the GNU Library General Public
; License along with this library; if not, write to the Free
; Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
;

;   vbxform_asm68k.s
;   16.5.1998 by Sam Jordan
;
;   68K assembler optimizations of several functions in vbxform.c
;   Originally written for AMIGA OS. To use this source on other 68K
;   based platforms some modifications might be needed.

CLIP_RIGHT_BIT  =       $01
CLIP_LEFT_BIT   =       $02
CLIP_TOP_BIT    =       $04
CLIP_BOTTOM_BIT =       $08
CLIP_NEAR_BIT   =       $10
CLIP_FAR_BIT    =       $20


                XDEF    _asm_transform_points3_general
                XDEF    _asm_transform_points3_identity
                XDEF    _asm_transform_points3_2d
                XDEF    _asm_transform_points3_2d_no_rot
                XDEF    _asm_transform_points3_3d
                XDEF    _asm_transform_points4_general
                XDEF    _asm_transform_points4_identity
                XDEF    _asm_transform_points4_2d
                XDEF    _asm_transform_points4_2d_no_rot
                XDEF    _asm_transform_points4_3d
                XDEF    _asm_project_and_cliptest_general
                XDEF    _asm_project_and_cliptest_identity
                XDEF    _asm_project_and_cliptest_ortho
                XDEF    _asm_project_and_cliptest_perspective

                mc68040


_asm_transform_points3_general

                rsreset
.fpuregs        rs.x    6
.intregs        rs.l    1
                rs.l    1
.n              rs.l    1
.vEye           rs.l    1
.Matrix         rs.l    1
.vObj           rs.l    1


;            const GLfloat *m = ctx->ModelViewMatrix;
;            GLfloat m0 = m[0],  m4 = m[4],  m8 = m[8],  m12 = m[12];
;            GLfloat m1 = m[1],  m5 = m[5],  m9 = m[9],  m13 = m[13];
;            GLfloat m2 = m[2],  m6 = m[6],  m10 = m[10],  m14 = m[14];
;            GLfloat m3 = m[3],  m7 = m[7],  m11 = m[11],  m15 = m[15];
;            GLuint i;
;            for (i=0;i<n;i++) {
;               GLfloat ox = vObj[i][0], oy = vObj[i][1], oz = vObj[i][2];
;               vEye[i][0] = m0 * ox + m4 * oy + m8  * oz + m12;
;               vEye[i][1] = m1 * ox + m5 * oy + m9  * oz + m13;
;               vEye[i][2] = m2 * ox + m6 * oy + m10 * oz + m14;
;               vEye[i][3] = m3 * ox + m7 * oy + m11 * oz + m15;
;            }

                move.l  a2,-(sp)
                fmovem.x        fp2-fp7,-(sp)
                move.l  .n(sp),d0
                beq     .end
                move.l  .Matrix(sp),a0
                fmove.s 0*4(a0),fp0             ;fp0 = m[0]
                fmove.s 1*4(a0),fp1             ;fp1 = m[1]
                fmove.s 2*4(a0),fp2             ;fp2 = m[2]
                move.l  .vObj(sp),a1
                move.l  .vEye(sp),a2
.loop
                fmove.s (a1)+,fp3               ;fp3 = ox
                fmove.s (a1)+,fp4               ;fp4 = oy
                fmove.s (a1)+,fp5               ;fp5 = oz
                addq.l  #4,a1

                fmove   fp0,fp6
                fmul    fp3,fp6
                fmove.s 4*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 8*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 12*4(a0),fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove   fp1,fp6
                fmul    fp3,fp6
                fmove.s 5*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 9*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 13*4(a0),fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove   fp2,fp6
                fmul    fp3,fp6
                fmove.s 6*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 10*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 14*4(a0),fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove.s 3*4(a0),fp6
                fmul    fp3,fp6
                fmove.s 7*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 11*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 15*4(a0),fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                subq.l  #1,d0
                bne.b   .loop
.end
                fmovem.x        (sp)+,fp2-fp7
                move.l  (sp)+,a2
                rts






_asm_transform_points3_identity

                rsreset
                rs.l    1
.n              rs.l    1
.vEye           rs.l    1
.vObj           rs.l    1


;            GLuint i;
;            for (i=0;i<n;i++) {
;               vEye[i][0] = vObj[i][0];
;               vEye[i][1] = vObj[i][1];
;               vEye[i][2] = vObj[i][2];
;               vEye[i][3] = 1.0F;
;            }

                move.l  .n(sp),d0
                beq     .end
                move.l  .vEye(sp),a0
                move.l  .vObj(sp),a1
                move.l  #$3f800000,d1           ;1.0F
.loop
                move.l  (a1)+,(a0)+
                move.l  (a1)+,(a0)+
                move.l  (a1)+,(a0)+
                move.l  d1,(a0)+
                addq.l  #4,a1
                subq.l  #1,d0
                bne.b   .loop
.end
                rts





_asm_transform_points3_2d

                rsreset
.fpuregs        rs.x    6
.intregs        rs.l    1
                rs.l    1
.n              rs.l    1
.vEye           rs.l    1
.Matrix         rs.l    1
.vObj           rs.l    1


;            const GLfloat *m = ctx->ModelViewMatrix;
;            GLfloat m0 = m[0], m1 = m[1], m4 = m[4], m5 = m[5];
;            GLfloat m12 = m[12], m13 = m[13];
;            GLuint i;
;            for (i=0;i<n;i++) {
;               GLfloat ox = vObj[i][0], oy = vObj[i][1], oz = vObj[i][2];
;               vEye[i][0] = m0 * ox + m4 * oy            + m12       ;
;               vEye[i][1] = m1 * ox + m5 * oy            + m13       ;
;               vEye[i][2] =                   +       oz             ;
;               vEye[i][3] =                                      1.0F;
;            }


                move.l  a2,-(sp)
                fmovem.x        fp2-fp7,-(sp)
                move.l  .n(sp),d0
                beq     .end
                move.l  .Matrix(sp),a0
                fmove.s 0*4(a0),fp0             ;fp0 = m[0]
                fmove.s 4*4(a0),fp1             ;fp1 = m[4]
                fmove.s 12*4(a0),fp2            ;fp2 = m[12]
                move.l  .vObj(sp),a1
                move.l  .vEye(sp),a2
                move.l  #$3f800000,d1           ;1.0F
.loop
                fmove.s (a1)+,fp3               ;fp3 = ox
                fmove.s (a1)+,fp4               ;fp4 = oy
                fmove.s (a1)+,fp5               ;fp5 = oz
                addq.l  #4,a1

                fmove   fp0,fp6
                fmul    fp3,fp6
                fmove   fp1,fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fadd    fp2,fp6
                fmove.s fp6,(a2)+

                fmove.s 1*4(a0),fp6
                fmul    fp3,fp6
                fmove.s 5*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 13*4(a0),fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove.s fp5,(a2)+
                move.l  d1,(a2)+
                subq.l  #1,d0
                bne.b   .loop
.end
                fmovem.x        (sp)+,fp2-fp7
                move.l  (sp)+,a2
                rts







_asm_transform_points3_2d_no_rot

                rsreset
.fpuregs        rs.x    6
.intregs        rs.l    1
                rs.l    1
.n              rs.l    1
.vEye           rs.l    1
.Matrix         rs.l    1
.vObj           rs.l    1


;            const GLfloat *m = ctx->ModelViewMatrix;
;            GLfloat m0 = m[0], m5 = m[5], m12 = m[12], m13 = m[13];
;            GLuint i;
;            for (i=0;i<n;i++) {
;               GLfloat ox = vObj[i][0], oy = vObj[i][1], oz = vObj[i][2];
;               vEye[i][0] = m0 * ox                      + m12       ;
;               vEye[i][1] =           m5 * oy            + m13       ;
;               vEye[i][2] =                   +       oz             ;
;               vEye[i][3] =                                      1.0F;
;            }

                move.l  a2,-(sp)
                fmovem.x        fp2-fp7,-(sp)
                move.l  .n(sp),d0
                beq     .end
                move.l  .Matrix(sp),a0
                fmove.s 0*4(a0),fp0             ;fp0 = m[0]
                fmove.s 5*4(a0),fp1             ;fp1 = m[5]
                fmove.s 12*4(a0),fp2            ;fp2 = m[12]
                fmove.s 13*4(a0),fp3            ;fp3 = m[13]
                move.l  .vObj(sp),a1
                move.l  .vEye(sp),a2
                move.l  #$3f800000,d1           ;1.0F
.loop
                fmove.s (a1)+,fp4               ;fp4 = ox
                fmove.s (a1)+,fp5               ;fp5 = oy
                fmove.s (a1)+,fp6               ;fp6 = oz
                addq.l  #4,a1

                fmove   fp0,fp7
                fmul    fp4,fp7
                fadd    fp2,fp7
                fmove.s fp7,(a2)+

                fmove   fp1,fp7
                fmul    fp5,fp7
                fadd    fp3,fp7
                fmove.s fp7,(a2)+

                fmove.s fp6,(a2)+
                move.l  d1,(a2)+
                subq.l  #1,d0
                bne.b   .loop
.end
                fmovem.x        (sp)+,fp2-fp7
                move.l  (sp)+,a2
                rts





_asm_transform_points3_3d

                rsreset
.fpuregs        rs.x    6
.intregs        rs.l    1
                rs.l    1
.n              rs.l    1
.vEye           rs.l    1
.Matrix         rs.l    1
.vObj           rs.l    1


;            const GLfloat *m = ctx->ModelViewMatrix;
;            GLfloat m0 = m[0], m1 = m[1], m2 = m[2], m4 = m[4], m5 = m[5];
;            GLfloat m6 = m[6], m8 = m[8], m9 = m[9], m10 = m[10];
;            GLfloat m12 = m[12], m13 = m[13], m14 = m[14];
;            GLuint i;
;            for (i=0;i<n;i++) {
;               GLfloat ox = vObj[i][0], oy = vObj[i][1], oz = vObj[i][2];
;               vEye[i][0] = m0 * ox + m4 * oy +  m8 * oz + m12       ;
;               vEye[i][1] = m1 * ox + m5 * oy +  m9 * oz + m13       ;
;               vEye[i][2] = m2 * ox + m6 * oy + m10 * oz + m14       ;
;               vEye[i][3] =                                      1.0F;
;            }


                move.l  a2,-(sp)
                fmovem.x        fp2-fp7,-(sp)
                move.l  .n(sp),d0
                beq     .end
                move.l  .Matrix(sp),a0
                fmove.s 0*4(a0),fp0             ;fp0 = m[0]
                fmove.s 1*4(a0),fp1             ;fp1 = m[1]
                fmove.s 2*4(a0),fp2             ;fp2 = m[2]
                move.l  .vObj(sp),a1
                move.l  .vEye(sp),a2
                move.l  #$3f800000,d1           ;1.0F
.loop
                fmove.s (a1)+,fp3               ;fp3 = ox
                fmove.s (a1)+,fp4               ;fp4 = oy
                fmove.s (a1)+,fp5               ;fp5 = oz
                addq.l  #4,a1

                fmove   fp0,fp6
                fmul    fp3,fp6
                fmove.s 4*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 8*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 12*4(a0),fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove   fp1,fp6
                fmul    fp3,fp6
                fmove.s 5*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 9*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 13*4(a0),fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove   fp2,fp6
                fmul    fp3,fp6
                fmove.s 6*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 10*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 14*4(a0),fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                move.l  d1,(a2)+

                subq.l  #1,d0
                bne.b   .loop
.end
                fmovem.x        (sp)+,fp2-fp7
                move.l  (sp)+,a2
                rts







_asm_transform_points4_general

                rsreset
.fpuregs        rs.x    6
.intregs        rs.l    1
                rs.l    1
.n              rs.l    1
.vEye           rs.l    1
.Matrix         rs.l    1
.vObj           rs.l    1

;            const GLfloat *m = ctx->ModelViewMatrix;
;            GLfloat m0 = m[0],  m4 = m[4],  m8 = m[8],  m12 = m[12];
;            GLfloat m1 = m[1],  m5 = m[5],  m9 = m[9],  m13 = m[13];
;            GLfloat m2 = m[2],  m6 = m[6],  m10 = m[10],  m14 = m[14];
;            GLfloat m3 = m[3],  m7 = m[7],  m11 = m[11],  m15 = m[15];
;            GLuint i;
;            for (i=0;i<n;i++) {
;               GLfloat ox = vObj[i][0], oy = vObj[i][1];
;               GLfloat oz = vObj[i][2], ow = vObj[i][3];
;               vEye[i][0] = m0 * ox + m4 * oy + m8  * oz + m12 * ow;
;               vEye[i][1] = m1 * ox + m5 * oy + m9  * oz + m13 * ow;
;               vEye[i][2] = m2 * ox + m6 * oy + m10 * oz + m14 * ow;
;               vEye[i][3] = m3 * ox + m7 * oy + m11 * oz + m15 * ow;


                move.l  a2,-(sp)
                fmovem.x        fp2-fp7,-(sp)
                move.l  .n(sp),d0
                beq     .end
                move.l  .Matrix(sp),a0
                fmove.s 0*4(a0),fp0             ;fp0 = m[0]
                fmove.s 1*4(a0),fp1             ;fp1 = m[1]
                move.l  .vObj(sp),a1
                move.l  .vEye(sp),a2
.loop
                fmove.s (a1)+,fp3               ;fp3 = ox
                fmove.s (a1)+,fp4               ;fp4 = oy
                fmove.s (a1)+,fp5               ;fp5 = oz
                fmove.s (a1)+,fp2               ;fp2 = ow

                fmove   fp0,fp6
                fmul    fp3,fp6
                fmove.s 4*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 8*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 12*4(a0),fp7
                fmul    fp2,fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove   fp1,fp6
                fmul    fp3,fp6
                fmove.s 5*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 9*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 13*4(a0),fp7
                fmul    fp2,fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove.s 2*4(a0),fp6
                fmul    fp3,fp6
                fmove.s 6*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 10*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 14*4(a0),fp7
                fmul    fp2,fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove.s 3*4(a0),fp6
                fmul    fp3,fp6
                fmove.s 7*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 11*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 15*4(a0),fp7
                fmul    fp2,fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                subq.l  #1,d0
                bne.b   .loop
.end
                fmovem.x        (sp)+,fp2-fp7
                move.l  (sp)+,a2
                rts






_asm_transform_points4_identity

                rsreset
                rs.l    1
.n              rs.l    1
.vEye           rs.l    1
.vObj           rs.l    1


;            GLuint i;
;            for (i=0;i<n;i++) {
;               vEye[i][0] = vObj[i][0];
;               vEye[i][1] = vObj[i][1];
;               vEye[i][2] = vObj[i][2];
;               vEye[i][3] = vObj[i][3];
;            }

                move.l  .n(sp),d0
                beq     .end
                move.l  .vEye(sp),a0
                move.l  .vObj(sp),a1
.loop
                move.l  (a1)+,(a0)+
                move.l  (a1)+,(a0)+
                move.l  (a1)+,(a0)+
                move.l  (a1)+,(a0)+
                subq.l  #1,d0
                bne.b   .loop
.end
                rts





_asm_transform_points4_2d

                rsreset
.fpuregs        rs.x    6
.intregs        rs.l    1
                rs.l    1
.n              rs.l    1
.vEye           rs.l    1
.Matrix         rs.l    1
.vObj           rs.l    1


;            const GLfloat *m = ctx->ModelViewMatrix;
;            GLfloat m0 = m[0], m1 = m[1], m4 = m[4], m5 = m[5];
;            GLfloat m12 = m[12], m13 = m[13];
;            GLuint i;
;            for (i=0;i<n;i++) {
;               GLfloat ox = vObj[i][0], oy = vObj[i][1];
;               GLfloat oz = vObj[i][2], ow = vObj[i][3];
;               vEye[i][0] = m0 * ox + m4 * oy            + m12 * ow;
;               vEye[i][1] = m1 * ox + m5 * oy            + m13 * ow;
;               vEye[i][2] =                   +       oz           ;
;               vEye[i][3] =                                      ow;
;            }

                move.l  a2,-(sp)
                fmovem.x        fp2-fp7,-(sp)
                move.l  .n(sp),d0
                beq     .end
                move.l  .Matrix(sp),a0
                fmove.s 0*4(a0),fp0             ;fp0 = m[0]
                fmove.s 4*4(a0),fp1             ;fp1 = m[4]
                move.l  .vObj(sp),a1
                move.l  .vEye(sp),a2
.loop
                fmove.s (a1)+,fp3               ;fp3 = ox
                fmove.s (a1)+,fp4               ;fp4 = oy
                fmove.s (a1)+,fp5               ;fp5 = oz
                fmove.s (a1)+,fp2               ;fp2 = ow

                fmove   fp0,fp6
                fmul    fp3,fp6
                fmove   fp1,fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 12*4(a0),fp7
                fmul    fp2,fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove.s 1*4(a0),fp6
                fmul    fp3,fp6
                fmove.s 5*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 13*4(a0),fp7
                fmul    fp2,fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove.s fp5,(a2)+
                fmove.s fp2,(a2)+
                subq.l  #1,d0
                bne.b   .loop
.end
                fmovem.x        (sp)+,fp2-fp7
                move.l  (sp)+,a2
                rts







_asm_transform_points4_2d_no_rot

                rsreset
.fpuregs        rs.x    6
.intregs        rs.l    1
                rs.l    1
.n              rs.l    1
.vEye           rs.l    1
.Matrix         rs.l    1
.vObj           rs.l    1

;            const GLfloat *m = ctx->ModelViewMatrix;
;            GLfloat m0 = m[0], m5 = m[5], m12 = m[12], m13 = m[13];
;            GLuint i;
;            for (i=0;i<n;i++) {
;               GLfloat ox = vObj[i][0], oy = vObj[i][1];
;               GLfloat oz = vObj[i][2], ow = vObj[i][3];
;               vEye[i][0] = m0 * ox                      + m12 * ow;
;               vEye[i][1] =           m5 * oy            + m13 * ow;
;               vEye[i][2] =                   +       oz           ;
;               vEye[i][3] =                                      ow;
;            }

                move.l  a2,-(sp)
                fmovem.x        fp2-fp7,-(sp)
                move.l  .n(sp),d0
                beq     .end
                move.l  .Matrix(sp),a0
                fmove.s 0*4(a0),fp0             ;fp0 = m[0]
                fmove.s 5*4(a0),fp1             ;fp1 = m[5]
                move.l  .vObj(sp),a1
                move.l  .vEye(sp),a2
.loop
                fmove.s (a1)+,fp4               ;fp4 = ox
                fmove.s (a1)+,fp5               ;fp5 = oy
                fmove.s (a1)+,fp6               ;fp6 = oz
                fmove.s (a1)+,fp3               ;fp3 = ow

                fmove   fp0,fp7
                fmul    fp4,fp7
                fmove.s 12*4(a0),fp2
                fmul    fp3,fp2
                fadd    fp2,fp7
                fmove.s fp7,(a2)+

                fmove   fp1,fp7
                fmul    fp5,fp7
                fmove.s 13*4(a0),fp2
                fmul    fp3,fp2
                fadd    fp2,fp7
                fmove.s fp7,(a2)+

                fmove.s fp6,(a2)+
                fmove.s fp3,(a2)+
                subq.l  #1,d0
                bne.b   .loop
.end
                fmovem.x        (sp)+,fp2-fp7
                move.l  (sp)+,a2
                rts





_asm_transform_points4_3d

                rsreset
.fpuregs        rs.x    6
.intregs        rs.l    1
                rs.l    1
.n              rs.l    1
.vEye           rs.l    1
.Matrix         rs.l    1
.vObj           rs.l    1


;            const GLfloat *m = ctx->ModelViewMatrix;
;            GLfloat m0 = m[0], m1 = m[1], m2 = m[2], m4 = m[4], m5 = m[5];
;            GLfloat m6 = m[6], m8 = m[8], m9 = m[9], m10 = m[10];
;            GLfloat m12 = m[12], m13 = m[13], m14 = m[14];
;            GLuint i;
;            for (i=0;i<n;i++) {
;               GLfloat ox = vObj[i][0], oy = vObj[i][1];
;               GLfloat oz = vObj[i][2], ow = vObj[i][3];
;               vEye[i][0] = m0 * ox + m4 * oy +  m8 * oz + m12 * ow;
;               vEye[i][1] = m1 * ox + m5 * oy +  m9 * oz + m13 * ow;
;               vEye[i][2] = m2 * ox + m6 * oy + m10 * oz + m14 * ow;
;               vEye[i][3] =                                      ow;
;            }

                move.l  a2,-(sp)
                fmovem.x        fp2-fp7,-(sp)
                move.l  .n(sp),d0
                beq     .end
                move.l  .Matrix(sp),a0
                fmove.s 0*4(a0),fp0             ;fp0 = m[0]
                fmove.s 1*4(a0),fp1             ;fp1 = m[1]
                move.l  .vObj(sp),a1
                move.l  .vEye(sp),a2
.loop
                fmove.s (a1)+,fp3               ;fp3 = ox
                fmove.s (a1)+,fp4               ;fp4 = oy
                fmove.s (a1)+,fp5               ;fp5 = oz
                fmove.s (a1)+,fp2               ;fp2 = ow

                fmove   fp0,fp6
                fmul    fp3,fp6
                fmove.s 4*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 8*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 12*4(a0),fp7
                fmul    fp2,fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove   fp1,fp6
                fmul    fp3,fp6
                fmove.s 5*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 9*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 13*4(a0),fp7
                fmul    fp2,fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove.s 2*4(a0),fp6
                fmul    fp3,fp6
                fmove.s 6*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 10*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s 14*4(a0),fp7
                fmul    fp2,fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+

                fmove.s fp2,(a2)+

                subq.l  #1,d0
                bne.b   .loop
.end
                fmovem.x        (sp)+,fp2-fp7
                move.l  (sp)+,a2
                rts





_asm_project_and_cliptest_general

                rsreset
.fpuregs        rs.x    6
.intregs        rs.l    5
                rs.l    1
.n              rs.l    1
.vClip          rs.l    1
.Matrix         rs.l    1
.vEye           rs.l    1
.clipMask       rs.l    1
.orMask         rs.l    1
.andMask        rs.l    1

;            const GLfloat *m = ctx->ProjectionMatrix;
;            GLfloat m0 = m[0],  m4 = m[4],  m8 = m[8],  m12 = m[12];
;            GLfloat m1 = m[1],  m5 = m[5],  m9 = m[9],  m13 = m[13];
;            GLfloat m2 = m[2],  m6 = m[6],  m10 = m[10],  m14 = m[14];
;            GLfloat m3 = m[3],  m7 = m[7],  m11 = m[11],  m15 = m[15];
;            GLuint i;
;            for (i=0;i<n;i++) {
;               GLfloat ex = vEye[i][0], ey = vEye[i][1];
;               GLfloat ez = vEye[i][2], ew = vEye[i][3];
;               GLfloat cx = m0 * ex + m4 * ey + m8  * ez + m12 * ew;
;               GLfloat cy = m1 * ex + m5 * ey + m9  * ez + m13 * ew;
;               GLfloat cz = m2 * ex + m6 * ey + m10 * ez + m14 * ew;
;               GLfloat cw = m3 * ex + m7 * ey + m11 * ez + m15 * ew;
;               GLubyte mask = 0;
;               vClip[i][0] = cx;
;               vClip[i][1] = cy;
;               vClip[i][2] = cz;
;               vClip[i][3] = cw;
;               if (cx >  cw)       mask |= CLIP_RIGHT_BIT;
;               else if (cx < -cw)  mask |= CLIP_LEFT_BIT;
;               if (cy >  cw)       mask |= CLIP_TOP_BIT;
;               else if (cy < -cw)  mask |= CLIP_BOTTOM_BIT;
;               if (cz >  cw)       mask |= CLIP_FAR_BIT;
;               else if (cz < -cw)  mask |= CLIP_NEAR_BIT;
;               if (mask) {
;                  clipMask[i] |= mask;
;                  tmpOrMask |= mask;
;               }
;               tmpAndMask &= mask;
;            }

                movem.l d2-d4/a2/a3,-(sp)
                fmovem.x        fp2-fp7,-(sp)
                move.l  .n(sp),d0
                beq     .end
                move.l  .orMask(sp),a0
                move.b  (a0),d1
                move.l  .andMask(sp),a0
                move.b  (a0),d2
                move.l  .Matrix(sp),a0
                move.l  .vEye(sp),a1
                move.l  .vClip(sp),a2
                move.l  .clipMask(sp),a3
.loop
                moveq   #0,d3
                fmove.s (a1)+,fp2               ;fp2 = ex
                fmove.s (a1)+,fp3               ;fp3 = ey
                fmove.s (a1)+,fp4               ;fp4 = ez
                fmove.s (a1)+,fp5               ;fp5 = ew

                fmove.s 0*4(a0),fp6
                fmul    fp2,fp6
                fmove.s 4*4(a0),fp7
                fmul    fp3,fp7
                fadd    fp7,fp6
                fmove.s 8*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s 12*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+               ;fp6 = cx

                fmove.s 1*4(a0),fp0
                fmul    fp2,fp0
                fmove.s 5*4(a0),fp7
                fmul    fp3,fp7
                fadd    fp7,fp0
                fmove.s 9*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp0
                fmove.s 13*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp0
                fmove.s fp0,(a2)+               ;fp0 = cy

                fmove.s 2*4(a0),fp1
                fmul    fp2,fp1
                fmove.s 6*4(a0),fp7
                fmul    fp3,fp7
                fadd    fp7,fp1
                fmove.s 10*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp1
                fmove.s 14*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp1
                fmove.s fp1,(a2)+               ;fp1 = cz

                fmove.s 3*4(a0),fp7
                fmul    fp2,fp7
                fmove.s 7*4(a0),fp2
                fmul    fp3,fp2
                fadd    fp2,fp7
                fmove.s 11*4(a0),fp2
                fmul    fp4,fp2
                fadd    fp2,fp7
                fmove.s 15*4(a0),fp2
                fmul    fp5,fp2
                fadd    fp2,fp7
                fmove.s fp7,(a2)+               ;fp7 = cw
                fneg    fp7,fp2                 ;fp2 = -cw

                fcmp    fp7,fp6
                fble.b  .cont1
                ori.b   #CLIP_RIGHT_BIT,d3
                bra.b   .cont2
.cont1
                fcmp    fp2,fp6
                fbge.b  .cont2
                ori.b   #CLIP_LEFT_BIT,d3
.cont2
                fcmp    fp7,fp0
                fble.b  .cont3
                ori.b   #CLIP_TOP_BIT,d3
                bra.b   .cont4
.cont3
                fcmp    fp2,fp0
                fbge.b  .cont4
                ori.b   #CLIP_BOTTOM_BIT,d3
.cont4
                fcmp    fp7,fp1
                fble.b  .cont5
                ori.b   #CLIP_FAR_BIT,d3
                bra.b   .cont6
.cont5
                fcmp    fp2,fp1
                fbge.b  .cont6
                ori.b   #CLIP_NEAR_BIT,d3
.cont6
                tst.b   d3
                beq     .cont7
                move.b  (a3),d4
                or.b    d3,d4
                move.b  d4,(a3)
                or.b    d3,d1
.cont7
                and.b   d3,d2
                addq.l  #1,a3
                subq.l  #1,d0
                bne.b   .loop
                move.l  .orMask(sp),a0
                move.b  d1,(a0)
                move.l  .andMask(sp),a0
                move.b  d2,(a0)
.end
                fmovem.x        (sp)+,fp2-fp7
                movem.l (sp)+,d2-d4/a2/a3
                rts






_asm_project_and_cliptest_identity

                rsreset
.fpuregs        rs.x    6
.intregs        rs.l    4
                rs.l    1
.n              rs.l    1
.vClip          rs.l    1
.vEye           rs.l    1
.clipMask       rs.l    1
.orMask         rs.l    1
.andMask        rs.l    1

;            GLuint i;
;            for (i=0;i<n;i++) {
;               GLfloat cx = vClip[i][0] = vEye[i][0];
;               GLfloat cy = vClip[i][1] = vEye[i][1];
;               GLfloat cz = vClip[i][2] = vEye[i][2];
;               GLfloat cw = vClip[i][3] = vEye[i][3];
;               GLubyte mask = 0;
;               if (cx >  cw)       mask |= CLIP_RIGHT_BIT;
;               else if (cx < -cw)  mask |= CLIP_LEFT_BIT;
;               if (cy >  cw)       mask |= CLIP_TOP_BIT;
;               else if (cy < -cw)  mask |= CLIP_BOTTOM_BIT;
;               if (cz >  cw)       mask |= CLIP_FAR_BIT;
;               else if (cz < -cw)  mask |= CLIP_NEAR_BIT;
;               if (mask) {
;                  clipMask[i] |= mask;
;                  tmpOrMask |= mask;
;               }
;               tmpAndMask &= mask;
;            }


                movem.l d2-d4/a2,-(sp)
                fmovem.x        fp2-fp7,-(sp)
                move.l  .n(sp),d0
                beq     .end
                move.l  .orMask(sp),a0
                move.b  (a0),d1
                move.l  .andMask(sp),a0
                move.b  (a0),d2
                move.l  .vEye(sp),a1
                move.l  .vClip(sp),a2
                move.l  .clipMask(sp),a0
.loop
                moveq   #0,d3
                fmove.s (a1)+,fp6               ;fp6 = cx
                fmove.s (a1)+,fp0               ;fp0 = cy
                fmove.s (a1)+,fp1               ;fp1 = cz
                fmove.s (a1)+,fp7               ;fp7 = cw
                fmove.s fp6,(a2)+
                fmove.s fp0,(a2)+
                fmove.s fp1,(a2)+
                fmove.s fp7,(a2)+
                fneg    fp7,fp2                 ;fp2 = -cw

                fcmp    fp7,fp6
                fble.b  .cont1
                ori.b   #CLIP_RIGHT_BIT,d3
                bra.b   .cont2
.cont1
                fcmp    fp2,fp6
                fbge.b  .cont2
                ori.b   #CLIP_LEFT_BIT,d3
.cont2
                fcmp    fp7,fp0
                fble.b  .cont3
                ori.b   #CLIP_TOP_BIT,d3
                bra.b   .cont4
.cont3
                fcmp    fp2,fp0
                fbge.b  .cont4
                ori.b   #CLIP_BOTTOM_BIT,d3
.cont4
                fcmp    fp7,fp1
                fble.b  .cont5
                ori.b   #CLIP_FAR_BIT,d3
                bra.b   .cont6
.cont5
                fcmp    fp2,fp1
                fbge.b  .cont6
                ori.b   #CLIP_NEAR_BIT,d3
.cont6
                tst.b   d3
                beq     .cont7
                move.b  (a0),d4
                or.b    d3,d4
                move.b  d4,(a0)
                or.b    d3,d1
.cont7
                and.b   d3,d2
                addq.l  #1,a3
                subq.l  #1,d0
                bne.b   .loop
                move.l  .orMask(sp),a0
                move.b  d1,(a0)
                move.l  .andMask(sp),a0
                move.b  d2,(a0)
.end
                fmovem.x        (sp)+,fp2-fp7
                movem.l (sp)+,d2-d4/a2
                rts





_asm_project_and_cliptest_ortho

                rsreset
.fpuregs        rs.x    6
.intregs        rs.l    5
                rs.l    1
.n              rs.l    1
.vClip          rs.l    1
.Matrix         rs.l    1
.vEye           rs.l    1
.clipMask       rs.l    1
.orMask         rs.l    1
.andMask        rs.l    1

;            const GLfloat *m = ctx->ProjectionMatrix;
;            GLfloat m0 = m[0], m5 = m[5], m10 = m[10], m12 = m[12];
;            GLfloat m13 = m[13], m14 = m[14];
;            GLuint i;
;            for (i=0;i<n;i++) {
;               GLfloat ex = vEye[i][0], ey = vEye[i][1];
;               GLfloat ez = vEye[i][2], ew = vEye[i][3];
;               GLfloat cx = m0 * ex                      + m12 * ew;
;               GLfloat cy =           m5 * ey            + m13 * ew;
;               GLfloat cz =                     m10 * ez + m14 * ew;
;               GLfloat cw =                                      ew;
;               GLubyte mask = 0;
;               vClip[i][0] = cx;
;               vClip[i][1] = cy;
;               vClip[i][2] = cz;
;               vClip[i][3] = cw;
;               if (cx >  cw)       mask |= CLIP_RIGHT_BIT;
;               else if (cx < -cw)  mask |= CLIP_LEFT_BIT;
;               if (cy >  cw)       mask |= CLIP_TOP_BIT;
;               else if (cy < -cw)  mask |= CLIP_BOTTOM_BIT;
;               if (cz >  cw)       mask |= CLIP_FAR_BIT;
;               else if (cz < -cw)  mask |= CLIP_NEAR_BIT;
;               if (mask) {
;                  clipMask[i] |= mask;
;                  tmpOrMask |= mask;
;               }
;               tmpAndMask &= mask;
;            }

                movem.l d2-d4/a2/a3,-(sp)
                fmovem.x        fp2-fp7,-(sp)
                move.l  .n(sp),d0
                beq     .end
                move.l  .orMask(sp),a0
                move.b  (a0),d1
                move.l  .andMask(sp),a0
                move.b  (a0),d2
                move.l  .Matrix(sp),a0
                move.l  .vEye(sp),a1
                move.l  .vClip(sp),a2
                move.l  .clipMask(sp),a3
.loop
                moveq   #0,d3
                fmove.s (a1)+,fp2               ;fp2 = ex
                fmove.s (a1)+,fp3               ;fp3 = ey
                fmove.s (a1)+,fp4               ;fp4 = ez
                fmove.s (a1)+,fp5               ;fp5 = ew

                fmove.s 0*4(a0),fp6
                fmul    fp2,fp6
                fmove.s 12*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+               ;fp6 = cx

                fmove.s 5*4(a0),fp0
                fmul    fp3,fp0
                fmove.s 13*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp0
                fmove.s fp0,(a2)+               ;fp0 = cy

                fmove.s 10*4(a0),fp1
                fmul    fp4,fp1
                fmove.s 14*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp1
                fmove.s fp1,(a2)+               ;fp1 = cz

                fmove.s fp5,(a2)+
                fmove   fp5,fp7                 ;fp7 = cw
                fneg    fp7,fp2                 ;fp2 = -cw

                fcmp    fp7,fp6
                fble.b  .cont1
                ori.b   #CLIP_RIGHT_BIT,d3
                bra.b   .cont2
.cont1
                fcmp    fp2,fp6
                fbge.b  .cont2
                ori.b   #CLIP_LEFT_BIT,d3
.cont2
                fcmp    fp7,fp0
                fble.b  .cont3
                ori.b   #CLIP_TOP_BIT,d3
                bra.b   .cont4
.cont3
                fcmp    fp2,fp0
                fbge.b  .cont4
                ori.b   #CLIP_BOTTOM_BIT,d3
.cont4
                fcmp    fp7,fp1
                fble.b  .cont5
                ori.b   #CLIP_FAR_BIT,d3
                bra.b   .cont6
.cont5
                fcmp    fp2,fp1
                fbge.b  .cont6
                ori.b   #CLIP_NEAR_BIT,d3
.cont6
                tst.b   d3
                beq     .cont7
                move.b  (a3),d4
                or.b    d3,d4
                move.b  d4,(a3)
                or.b    d3,d1
.cont7
                and.b   d3,d2
                addq.l  #1,a3
                subq.l  #1,d0
                bne.b   .loop
                move.l  .orMask(sp),a0
                move.b  d1,(a0)
                move.l  .andMask(sp),a0
                move.b  d2,(a0)
.end
                fmovem.x        (sp)+,fp2-fp7
                movem.l (sp)+,d2-d4/a2/a3
                rts






_asm_project_and_cliptest_perspective

                rsreset
.fpuregs        rs.x    6
.intregs        rs.l    5
                rs.l    1
.n              rs.l    1
.vClip          rs.l    1
.Matrix         rs.l    1
.vEye           rs.l    1
.clipMask       rs.l    1
.orMask         rs.l    1
.andMask        rs.l    1

;            const GLfloat *m = ctx->ProjectionMatrix;
;            GLfloat m0 = m[0], m5 = m[5], m8 = m[8], m9 = m[9];
;            GLfloat m10 = m[10], m14 = m[14];
;            GLuint i;
;            for (i=0;i<n;i++) {
;               GLfloat ex = vEye[i][0], ey = vEye[i][1];
;               GLfloat ez = vEye[i][2], ew = vEye[i][3];
;               GLfloat cx = m0 * ex           + m8  * ez           ;
;               GLfloat cy =           m5 * ey + m9  * ez           ;
;               GLfloat cz =                     m10 * ez + m14 * ew;
;               GLfloat cw =                          -ez           ;
;               GLubyte mask = 0;
;               vClip[i][0] = cx;
;               vClip[i][1] = cy;
;               vClip[i][2] = cz;
;               vClip[i][3] = cw;
;               if (cx >  cw)       mask |= CLIP_RIGHT_BIT;
;               else if (cx < -cw)  mask |= CLIP_LEFT_BIT;
;               if (cy >  cw)       mask |= CLIP_TOP_BIT;
;               else if (cy < -cw)  mask |= CLIP_BOTTOM_BIT;
;               if (cz >  cw)       mask |= CLIP_FAR_BIT;
;               else if (cz < -cw)  mask |= CLIP_NEAR_BIT;
;               if (mask) {
;                  clipMask[i] |= mask;
;                  tmpOrMask |= mask;
;               }
;               tmpAndMask &= mask;
;            }

                movem.l d2-d4/a2/a3,-(sp)
                fmovem.x        fp2-fp7,-(sp)
                move.l  .n(sp),d0
                beq     .end
                move.l  .orMask(sp),a0
                move.b  (a0),d1
                move.l  .andMask(sp),a0
                move.b  (a0),d2
                move.l  .Matrix(sp),a0
                move.l  .vEye(sp),a1
                move.l  .vClip(sp),a2
                move.l  .clipMask(sp),a3
.loop
                moveq   #0,d3
                fmove.s (a1)+,fp2               ;fp2 = ex
                fmove.s (a1)+,fp3               ;fp3 = ey
                fmove.s (a1)+,fp4               ;fp4 = ez
                fmove.s (a1)+,fp5               ;fp5 = ew

                fmove.s 0*4(a0),fp6
                fmul    fp2,fp6
                fmove.s 8*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp6
                fmove.s fp6,(a2)+               ;fp6 = cx

                fmove.s 5*4(a0),fp0
                fmul    fp3,fp0
                fmove.s 9*4(a0),fp7
                fmul    fp4,fp7
                fadd    fp7,fp0
                fmove.s fp0,(a2)+               ;fp0 = cy

                fmove.s 10*4(a0),fp1
                fmul    fp4,fp1
                fmove.s 14*4(a0),fp7
                fmul    fp5,fp7
                fadd    fp7,fp1
                fmove.s fp1,(a2)+               ;fp1 = cz

                fneg    fp4,fp7                 ;fp7 = cw
                fneg    fp7,fp2                 ;fp2 = -cw
                fmove.s fp7,(a2)+

                fcmp    fp7,fp6
                fble.b  .cont1
                ori.b   #CLIP_RIGHT_BIT,d3
                bra.b   .cont2
.cont1
                fcmp    fp2,fp6
                fbge.b  .cont2
                ori.b   #CLIP_LEFT_BIT,d3
.cont2
                fcmp    fp7,fp0
                fble.b  .cont3
                ori.b   #CLIP_TOP_BIT,d3
                bra.b   .cont4
.cont3
                fcmp    fp2,fp0
                fbge.b  .cont4
                ori.b   #CLIP_BOTTOM_BIT,d3
.cont4
                fcmp    fp7,fp1
                fble.b  .cont5
                ori.b   #CLIP_FAR_BIT,d3
                bra.b   .cont6
.cont5
                fcmp    fp2,fp1
                fbge.b  .cont6
                ori.b   #CLIP_NEAR_BIT,d3
.cont6
                tst.b   d3
                beq     .cont7
                move.b  (a3),d4
                or.b    d3,d4
                move.b  d4,(a3)
                or.b    d3,d1
.cont7
                and.b   d3,d2
                addq.l  #1,a3
                subq.l  #1,d0
                bne.b   .loop
                move.l  .orMask(sp),a0
                move.b  d1,(a0)
                move.l  .andMask(sp),a0
                move.b  d2,(a0)
.end
                fmovem.x        (sp)+,fp2-fp7
                movem.l (sp)+,d2-d4/a2/a3
                rts

