ref: 8723be0d01ab4150ed6ca63649a6ec1ddcc06efb
dir: /worlda.s/
/* 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. */ // // worlda.s // x86 assembly-language server testing stuff // #define GLQUAKE 1 // don't include unneeded defs #include "asm_i386.h" #include "quakeasm.h" #include "d_ifacea.h" #if id386 .data Ltemp: .long 0 .text //---------------------------------------------------------------------- // hull-point test //---------------------------------------------------------------------- #define hull 4+8 // because only partially pushed #define num 8+4 // because only partially pushed #define p 12+12 // because only partially pushed .align 4 .globl C(SV_HullPointContents) C(SV_HullPointContents): pushl %edi // preserve register variables movl num(%esp),%eax testl %eax,%eax js Lhquickout // float d; // dclipnode_t *node; // mplane_t *plane; pushl %ebx movl hull(%esp),%ebx pushl %ebp movl p(%esp),%edx movl hu_clipnodes(%ebx),%edi movl hu_planes(%ebx),%ebp subl %ebx,%ebx pushl %esi // %ebx: 0 // %eax: num // %edx: p // %edi: hull->clipnodes // %ebp: hull->planes // while (num >= 0) // { Lhloop: // node = hull->clipnodes + num; // plane = hull->planes + node->planenum; // !!! if the size of dclipnode_t changes, the scaling of %eax needs to be // changed !!! movl nd_planenum(%edi,%eax,8),%ecx movl nd_children(%edi,%eax,8),%eax movl %eax,%esi rorl $16,%eax leal (%ecx,%ecx,4),%ecx // if (plane->type < 3) // d = p[plane->type] - plane->dist; movb pl_type(%ebp,%ecx,4),%bl cmpb $3,%bl jb Lnodot // else // d = DotProduct (plane->normal, p) - plane->dist; flds pl_normal(%ebp,%ecx,4) fmuls 0(%edx) flds pl_normal+4(%ebp,%ecx,4) fmuls 4(%edx) flds pl_normal+8(%ebp,%ecx,4) fmuls 8(%edx) fxch %st(1) faddp %st(0),%st(2) faddp %st(0),%st(1) fsubs pl_dist(%ebp,%ecx,4) jmp Lsub Lnodot: flds pl_dist(%ebp,%ecx,4) fsubrs (%edx,%ebx,4) Lsub: sarl $16,%eax sarl $16,%esi // if (d < 0) // num = node->children[1]; // else // num = node->children[0]; fstps Ltemp movl Ltemp,%ecx sarl $31,%ecx andl %ecx,%esi xorl $0xFFFFFFFF,%ecx andl %ecx,%eax orl %esi,%eax jns Lhloop // return num; Lhdone: popl %esi popl %ebp popl %ebx // restore register variables Lhquickout: popl %edi ret #endif // id386