From 995a8d3e4e9d3fb177be5753f086961877c212bd Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Mon, 29 Nov 2010 08:51:29 +0900 Subject: [PATCH] Don't use assembly code for SV_HullPointContents. This is the only assembly code dependent on the size of dclipnode_t. Removing it paves the way for fixing clipnodes in large maps. --- include/QF/bspfile.h | 1 - include/asm_i386.h | 10 --- nq/source/Makefile.am | 13 +--- nq/source/world.c | 6 +- nq/source/worlda.S | 150 ------------------------------------------ qw/source/Makefile.am | 18 ++--- qw/source/world.c | 6 +- qw/source/worlda.S | 150 ------------------------------------------ 8 files changed, 11 insertions(+), 343 deletions(-) delete mode 100644 nq/source/worlda.S delete mode 100644 qw/source/worlda.S diff --git a/include/QF/bspfile.h b/include/QF/bspfile.h index 5addb86c6..88397c972 100644 --- a/include/QF/bspfile.h +++ b/include/QF/bspfile.h @@ -157,7 +157,6 @@ typedef struct dplane_s { #define CONTENTS_CURRENT_DOWN -14 -// !!! if this is changed, it must be changed in asm_i386.h too !!! typedef struct dnode_s { int32_t planenum; int16_t children[2]; // negative numbers are -(leafs+1), not nodes diff --git a/include/asm_i386.h b/include/asm_i386.h index 22ea6f417..9a2665422 100644 --- a/include/asm_i386.h +++ b/include/asm_i386.h @@ -67,14 +67,4 @@ #define hu_clip_maxs 28 #define hu_size 40 -// dnode_t structure -// !!! if this is changed, it must be changed in bspfile.h too !!! -#define nd_planenum 0 -#define nd_children 4 -#define nd_mins 8 -#define nd_maxs 20 -#define nd_firstface 32 -#define nd_numfaces 36 -#define nd_size 40 - #endif diff --git a/nq/source/Makefile.am b/nq/source/Makefile.am index eb71cceb9..83738a91d 100644 --- a/nq/source/Makefile.am +++ b/nq/source/Makefile.am @@ -44,17 +44,9 @@ bin_PROGRAMS= @NQ_TARGETS@ EXTRA_PROGRAMS= nq-fbdev nq-glx nq-mgl nq-sdl nq-sdl32 nq-sgl nq-svga nq-3dfx \ nq-wgl nq-x11 nq-server -if ASM_ARCH -asm= libasm.a -else -asm= -endif +noinst_LIBRARIES= @nq_libs@ +EXTRA_LIBRARIES=libnq_client.a libnq_common.a libnq_sdl.a libnq_server.a -noinst_LIBRARIES= @nq_libs@ $(asm) -EXTRA_LIBRARIES=libasm.a libnq_client.a libnq_common.a libnq_sdl.a libnq_server.a - -libasm_a_SOURCES= worlda.S -libasm_la_CCASFLAGS=@PREFER_NON_PIC@ libnq_common_a_SOURCES=game.c world.c com.c libnq_sdl_a_SOURCES= sys_sdl.c libnq_sdl_a_CFLAGS= $(SDL_CFLAGS) @@ -75,7 +67,6 @@ server_LIBFILES= \ $(top_builddir)/libs/models/libQFmodels.la common_LIBFILES= \ - $(asm) \ $(top_builddir)/libs/net/libnet_main.la \ $(top_builddir)/libs/console/libQFconsole.la \ $(top_builddir)/libs/gamecode/builtins/libQFgamecode_builtins.la \ diff --git a/nq/source/world.c b/nq/source/world.c index d617af55a..e38f59946 100644 --- a/nq/source/world.c +++ b/nq/source/world.c @@ -431,7 +431,6 @@ SV_LinkEdict (edict_t *ent, qboolean touch_triggers) /* POINT TESTING IN HULLS */ -#ifndef USE_INTEL_ASM int SV_HullPointContents (hull_t *hull, int num, const vec3_t p) { @@ -440,8 +439,8 @@ SV_HullPointContents (hull_t *hull, int num, const vec3_t p) mplane_t *plane; while (num >= 0) { - if (num < hull->firstclipnode || num > hull->lastclipnode) - Sys_Error ("SV_HullPointContents: bad node number"); + //if (num < hull->firstclipnode || num > hull->lastclipnode) + // Sys_Error ("SV_HullPointContents: bad node number"); node = hull->clipnodes + num; plane = hull->planes + node->planenum; @@ -458,7 +457,6 @@ SV_HullPointContents (hull_t *hull, int num, const vec3_t p) return num; } -#endif // !USE_INTEL_ASM int SV_PointContents (const vec3_t p) diff --git a/nq/source/worlda.S b/nq/source/worlda.S deleted file mode 100644 index cb06d4868..000000000 --- a/nq/source/worlda.S +++ /dev/null @@ -1,150 +0,0 @@ -/* - worlda.S - - x86 assembly-language server testing stuff - - 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: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA - - $Id$ -*/ - -#ifdef HAVE_CONFIG_H -# include -#endif -#include "asm_i386.h" -//#include "quakeasm.h" -//include "d_ifacea.h" - -#ifdef USE_INTEL_ASM - - .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 // USE_INTEL_ASM - diff --git a/qw/source/Makefile.am b/qw/source/Makefile.am index 2ad3da7b9..d3e34bd20 100644 --- a/qw/source/Makefile.am +++ b/qw/source/Makefile.am @@ -45,18 +45,10 @@ EXTRA_PROGRAMS= qw-client-fbdev qw-client-glx qw-client-mgl qw-client-sdl \ qw-client-sdl32 qw-client-sgl qw-client-svga qw-client-3dfx \ qw-client-wgl qw-client-x11 qw-server qw-master -if ASM_ARCH -asm= libasm.a -else -asm= -endif - -noinst_LIBRARIES= @qw_libs@ $(asm) -EXTRA_LIBRARIES=libasm.a libqw_client.a libqw_common.a libqw_sdl.a libqw_server.a +noinst_LIBRARIES= @qw_libs@ +EXTRA_LIBRARIES=libqw_client.a libqw_common.a libqw_sdl.a libqw_server.a -libasm_a_SOURCES= worlda.S -libasm_la_CCASFLAGS=@PREFER_NON_PIC@ libqw_common_a_SOURCES=\ com.c game.c map_cfg.c pmove.c pmovetst.c net_packetlog.c libqw_sdl_a_SOURCES=cl_sys_sdl.c @@ -93,9 +85,9 @@ qw_server_LIBS= \ $(top_builddir)/libs/util/libQFutil.la qw_server_SOURCES= -qw_server_LDADD= libqw_server.a libqw_common.a $(asm) $(qw_server_LIBS) $(NET_LIBS) $(DL_LIBS) $(CURSES_LIBS) +qw_server_LDADD= libqw_server.a libqw_common.a $(qw_server_LIBS) $(NET_LIBS) $(DL_LIBS) $(CURSES_LIBS) qw_server_LDFLAGS= $(common_ldflags) -qw_server_DEPENDENCIES= libqw_common.a libqw_server.a $(asm) $(qw_server_LIBS) +qw_server_DEPENDENCIES= libqw_common.a libqw_server.a $(qw_server_LIBS) qw_master_SOURCES= master.c qw_master_LDADD= $(top_builddir)/libs/util/libQFutil.la $(NET_LIBS) @@ -118,7 +110,7 @@ qw_client_LIBS= \ $(top_builddir)/libs/util/libQFutil.la \ $(top_builddir)/libs/gib/libQFgib.la -client_LIBS= $(asm) $(qw_client_LIBS) +client_LIBS= $(qw_client_LIBS) client_libs= libqw_client.a libqw_common.a libqw_client_a_SOURCES= \ diff --git a/qw/source/world.c b/qw/source/world.c index 09e4efc3f..7bff06369 100644 --- a/qw/source/world.c +++ b/qw/source/world.c @@ -419,7 +419,6 @@ SV_LinkEdict (edict_t *ent, qboolean touch_triggers) /* POINT TESTING IN HULLS */ -#ifndef USE_INTEL_ASM int SV_HullPointContents (hull_t *hull, int num, const vec3_t p) { @@ -428,8 +427,8 @@ SV_HullPointContents (hull_t *hull, int num, const vec3_t p) mplane_t *plane; while (num >= 0) { - if (num < hull->firstclipnode || num > hull->lastclipnode) - Sys_Error ("SV_HullPointContents: bad node number"); + //if (num < hull->firstclipnode || num > hull->lastclipnode) + // Sys_Error ("SV_HullPointContents: bad node number"); node = hull->clipnodes + num; plane = hull->planes + node->planenum; @@ -446,7 +445,6 @@ SV_HullPointContents (hull_t *hull, int num, const vec3_t p) return num; } -#endif // !USE_INTEL_ASM int SV_PointContents (const vec3_t p) diff --git a/qw/source/worlda.S b/qw/source/worlda.S deleted file mode 100644 index cb06d4868..000000000 --- a/qw/source/worlda.S +++ /dev/null @@ -1,150 +0,0 @@ -/* - worlda.S - - x86 assembly-language server testing stuff - - 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: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA - - $Id$ -*/ - -#ifdef HAVE_CONFIG_H -# include -#endif -#include "asm_i386.h" -//#include "quakeasm.h" -//include "d_ifacea.h" - -#ifdef USE_INTEL_ASM - - .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 // USE_INTEL_ASM -