diff options
Diffstat (limited to 'WinQuake/r_aclipa.s')
| -rw-r--r-- | WinQuake/r_aclipa.s | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/WinQuake/r_aclipa.s b/WinQuake/r_aclipa.s new file mode 100644 index 0000000..aee9837 --- /dev/null +++ b/WinQuake/r_aclipa.s @@ -0,0 +1,216 @@ +/* +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. + +*/ +// +// r_aliasa.s +// x86 assembly-language Alias model transform and project code. +// + +#include "asm_i386.h" +#include "quakeasm.h" +#include "asm_draw.h" +#include "d_ifacea.h" + +#if id386 + + .data +Ltemp0: .long 0 +Ltemp1: .long 0 + + .text + +#define pfv0 8+4 +#define pfv1 8+8 +#define out 8+12 + +.globl C(R_Alias_clip_bottom) +C(R_Alias_clip_bottom): + pushl %esi + pushl %edi + + movl pfv0(%esp),%esi + movl pfv1(%esp),%edi + + movl C(r_refdef)+rd_aliasvrectbottom,%eax + +LDoForwardOrBackward: + + movl fv_v+4(%esi),%edx + movl fv_v+4(%edi),%ecx + + cmpl %ecx,%edx + jl LDoForward + + movl fv_v+4(%esi),%ecx + movl fv_v+4(%edi),%edx + movl pfv0(%esp),%edi + movl pfv1(%esp),%esi + +LDoForward: + + subl %edx,%ecx + subl %edx,%eax + movl %ecx,Ltemp1 + movl %eax,Ltemp0 + fildl Ltemp1 + fildl Ltemp0 + movl out(%esp),%edx + movl $2,%eax + + fdivp %st(0),%st(1) // scale + +LDo3Forward: + fildl fv_v+0(%esi) // fv0v0 | scale + fildl fv_v+0(%edi) // fv1v0 | fv0v0 | scale + fildl fv_v+4(%esi) // fv0v1 | fv1v0 | fv0v0 | scale + fildl fv_v+4(%edi) // fv1v1 | fv0v1 | fv1v0 | fv0v0 | scale + fildl fv_v+8(%esi) // fv0v2 | fv1v1 | fv0v1 | fv1v0 | fv0v0 | scale + fildl fv_v+8(%edi) // fv1v2 | fv0v2 | fv1v1 | fv0v1 | fv1v0 | fv0v0 | + // scale + fxch %st(5) // fv0v0 | fv0v2 | fv1v1 | fv0v1 | fv1v0 | fv1v2 | + // scale + fsubr %st(0),%st(4) // fv0v0 | fv0v2 | fv1v1 | fv0v1 | fv1v0-fv0v0 | + // fv1v2 | scale + fxch %st(3) // fv0v1 | fv0v2 | fv1v1 | fv0v0 | fv1v0-fv0v0 | + // fv1v2 | scale + fsubr %st(0),%st(2) // fv0v1 | fv0v2 | fv1v1-fv0v1 | fv0v0 | + // fv1v0-fv0v0 | fv1v2 | scale + fxch %st(1) // fv0v2 | fv0v1 | fv1v1-fv0v1 | fv0v0 | + // fv1v0-fv0v0 | fv1v2 | scale + fsubr %st(0),%st(5) // fv0v2 | fv0v1 | fv1v1-fv0v1 | fv0v0 | + // fv1v0-fv0v0 | fv1v2-fv0v2 | scale + fxch %st(6) // scale | fv0v1 | fv1v1-fv0v1 | fv0v0 | + // fv1v0-fv0v0 | fv1v2-fv0v2 | fv0v2 + fmul %st(0),%st(4) // scale | fv0v1 | fv1v1-fv0v1 | fv0v0 | + // (fv1v0-fv0v0)*scale | fv1v2-fv0v2 | fv0v2 + addl $12,%edi + fmul %st(0),%st(2) // scale | fv0v1 | (fv1v1-fv0v1)*scale | fv0v0 | + // (fv1v0-fv0v0)*scale | fv1v2-fv0v2 | fv0v2 + addl $12,%esi + addl $12,%edx + fmul %st(0),%st(5) // scale | fv0v1 | (fv1v1-fv0v1)*scale | fv0v0 | + // (fv1v0-fv0v0)*scale | (fv1v2-fv0v2)*scale | + // fv0v2 + fxch %st(3) // fv0v0 | fv0v1 | (fv1v1-fv0v1)*scale | scale | + // (fv1v0-fv0v0)*scale | (fv1v2-fv0v2)*scale | + // fv0v2 + faddp %st(0),%st(4) // fv0v1 | (fv1v1-fv0v1)*scale | scale | + // fv0v0+(fv1v0-fv0v0)*scale | + // (fv1v2-fv0v2)*scale | fv0v2 + faddp %st(0),%st(1) // fv0v1+(fv1v1-fv0v1)*scale | scale | + // fv0v0+(fv1v0-fv0v0)*scale | + // (fv1v2-fv0v2)*scale | fv0v2 + fxch %st(4) // fv0v2 | scale | fv0v0+(fv1v0-fv0v0)*scale | + // (fv1v2-fv0v2)*scale | fv0v1+(fv1v1-fv0v1)*scale + faddp %st(0),%st(3) // scale | fv0v0+(fv1v0-fv0v0)*scale | + // fv0v2+(fv1v2-fv0v2)*scale | + // fv0v1+(fv1v1-fv0v1)*scale + fxch %st(1) // fv0v0+(fv1v0-fv0v0)*scale | scale | + // fv0v2+(fv1v2-fv0v2)*scale | + // fv0v1+(fv1v1-fv0v1)*scale + fadds float_point5 + fxch %st(3) // fv0v1+(fv1v1-fv0v1)*scale | scale | + // fv0v2+(fv1v2-fv0v2)*scale | + // fv0v0+(fv1v0-fv0v0)*scale + fadds float_point5 + fxch %st(2) // fv0v2+(fv1v2-fv0v2)*scale | scale | + // fv0v1+(fv1v1-fv0v1)*scale | + // fv0v0+(fv1v0-fv0v0)*scale + fadds float_point5 + fxch %st(3) // fv0v0+(fv1v0-fv0v0)*scale | scale | + // fv0v1+(fv1v1-fv0v1)*scale | + // fv0v2+(fv1v2-fv0v2)*scale + fistpl fv_v+0-12(%edx) // scale | fv0v1+(fv1v1-fv0v1)*scale | + // fv0v2+(fv1v2-fv0v2)*scale + fxch %st(1) // fv0v1+(fv1v1-fv0v1)*scale | scale | + // fv0v2+(fv1v2-fv0v2)*scale | scale + fistpl fv_v+4-12(%edx) // scale | fv0v2+(fv1v2-fv0v2)*scale + fxch %st(1) // fv0v2+(fv1v2-fv0v2)*sc | scale + fistpl fv_v+8-12(%edx) // scale + + decl %eax + jnz LDo3Forward + + fstp %st(0) + + popl %edi + popl %esi + + ret + + +.globl C(R_Alias_clip_top) +C(R_Alias_clip_top): + pushl %esi + pushl %edi + + movl pfv0(%esp),%esi + movl pfv1(%esp),%edi + + movl C(r_refdef)+rd_aliasvrect+4,%eax + jmp LDoForwardOrBackward + + + +.globl C(R_Alias_clip_right) +C(R_Alias_clip_right): + pushl %esi + pushl %edi + + movl pfv0(%esp),%esi + movl pfv1(%esp),%edi + + movl C(r_refdef)+rd_aliasvrectright,%eax + +LRightLeftEntry: + + + movl fv_v+4(%esi),%edx + movl fv_v+4(%edi),%ecx + + cmpl %ecx,%edx + movl fv_v+0(%esi),%edx + + movl fv_v+0(%edi),%ecx + jl LDoForward2 + + movl fv_v+0(%esi),%ecx + movl fv_v+0(%edi),%edx + movl pfv0(%esp),%edi + movl pfv1(%esp),%esi + +LDoForward2: + + jmp LDoForward + + +.globl C(R_Alias_clip_left) +C(R_Alias_clip_left): + pushl %esi + pushl %edi + + movl pfv0(%esp),%esi + movl pfv1(%esp),%edi + + movl C(r_refdef)+rd_aliasvrect+0,%eax + jmp LRightLeftEntry + + +#endif // id386 + |
