Home | History | Annotate | Download | only in server
      1 //
      2 // math.s
      3 // x86 assembly-language math routines.
      4 
      5 #include "asm_i386.h"
      6 #include "quakeasm.h"
      7 
      8 
      9 #if id386
     10 
     11 	.data
     12 
     13 	.align	4
     14 Ljmptab:	.long	Lcase0, Lcase1, Lcase2, Lcase3
     15 			.long	Lcase4, Lcase5, Lcase6, Lcase7
     16 
     17 	.text
     18 
     19 
     20 #define EMINS	4+4
     21 #define EMAXS	4+8
     22 #define P		4+12
     23 
     24 	.align 2
     25 .globl C(BoxOnPlaneSide)
     26 C(BoxOnPlaneSide):
     27 	pushl	%ebx
     28 
     29 	movl	P(%esp),%edx
     30 	movl	EMINS(%esp),%ecx
     31 	xorl	%eax,%eax
     32 	movl	EMAXS(%esp),%ebx
     33 	movb	pl_signbits(%edx),%al
     34 	cmpl	$8,%al
     35 	jge		Lerror
     36 	flds	pl_normal(%edx)		// p->normal[0]
     37 	fld		%st(0)				// p->normal[0] | p->normal[0]
     38 	jmp		*Ljmptab(,%eax,4)
     39 
     40 
     41 //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
     42 //dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
     43 Lcase0:
     44 	fmuls	(%ebx)				// p->normal[0]*emaxs[0] | p->normal[0]
     45 	flds	pl_normal+4(%edx)	// p->normal[1] | p->normal[0]*emaxs[0] |
     46 								//  p->normal[0]
     47 	fxch	%st(2)				// p->normal[0] | p->normal[0]*emaxs[0] |
     48 								//  p->normal[1]
     49 	fmuls	(%ecx)				// p->normal[0]*emins[0] |
     50 								//  p->normal[0]*emaxs[0] | p->normal[1]
     51 	fxch	%st(2)				// p->normal[1] | p->normal[0]*emaxs[0] |
     52 								//  p->normal[0]*emins[0]
     53 	fld		%st(0)				// p->normal[1] | p->normal[1] |
     54 								//  p->normal[0]*emaxs[0] |
     55 								//  p->normal[0]*emins[0]
     56 	fmuls	4(%ebx)				// p->normal[1]*emaxs[1] | p->normal[1] |
     57 								//  p->normal[0]*emaxs[0] |
     58 								//  p->normal[0]*emins[0]
     59 	flds	pl_normal+8(%edx)	// p->normal[2] | p->normal[1]*emaxs[1] |
     60 								//  p->normal[1] | p->normal[0]*emaxs[0] |
     61 								//  p->normal[0]*emins[0]
     62 	fxch	%st(2)				// p->normal[1] | p->normal[1]*emaxs[1] |
     63 								//  p->normal[2] | p->normal[0]*emaxs[0] |
     64 								//  p->normal[0]*emins[0]
     65 	fmuls	4(%ecx)				// p->normal[1]*emins[1] |
     66 								//  p->normal[1]*emaxs[1] |
     67 								//  p->normal[2] | p->normal[0]*emaxs[0] |
     68 								//  p->normal[0]*emins[0]
     69 	fxch	%st(2)				// p->normal[2] | p->normal[1]*emaxs[1] |
     70 								//  p->normal[1]*emins[1] |
     71 								//  p->normal[0]*emaxs[0] |
     72 								//  p->normal[0]*emins[0]
     73 	fld		%st(0)				// p->normal[2] | p->normal[2] |
     74 								//  p->normal[1]*emaxs[1] |
     75 								//  p->normal[1]*emins[1] |
     76 								//  p->normal[0]*emaxs[0] |
     77 								//  p->normal[0]*emins[0]
     78 	fmuls	8(%ebx)				// p->normal[2]*emaxs[2] |
     79 								//  p->normal[2] |
     80 								//  p->normal[1]*emaxs[1] |
     81 								//  p->normal[1]*emins[1] |
     82 								//  p->normal[0]*emaxs[0] |
     83 								//  p->normal[0]*emins[0]
     84 	fxch	%st(5)				// p->normal[0]*emins[0] |
     85 								//  p->normal[2] |
     86 								//  p->normal[1]*emaxs[1] |
     87 								//  p->normal[1]*emins[1] |
     88 								//  p->normal[0]*emaxs[0] |
     89 								//  p->normal[2]*emaxs[2]
     90 	faddp	%st(0),%st(3)		//p->normal[2] |
     91 								// p->normal[1]*emaxs[1] |
     92 								// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
     93 								// p->normal[0]*emaxs[0] |
     94 								// p->normal[2]*emaxs[2]
     95 	fmuls	8(%ecx)				//p->normal[2]*emins[2] |
     96 								// p->normal[1]*emaxs[1] |
     97 								// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
     98 								// p->normal[0]*emaxs[0] |
     99 								// p->normal[2]*emaxs[2]
    100 	fxch	%st(1)				//p->normal[1]*emaxs[1] |
    101 								// p->normal[2]*emins[2] |
    102 								// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
    103 								// p->normal[0]*emaxs[0] |
    104 								// p->normal[2]*emaxs[2]
    105 	faddp	%st(0),%st(3)		//p->normal[2]*emins[2] |
    106 								// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
    107 								// p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
    108 								// p->normal[2]*emaxs[2]
    109 	fxch	%st(3)				//p->normal[2]*emaxs[2] +
    110 								// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
    111 								// p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
    112 								// p->normal[2]*emins[2]
    113 	faddp	%st(0),%st(2)		//p->normal[1]*emins[1]+p->normal[0]*emins[0]|
    114 								// dist1 | p->normal[2]*emins[2]
    115 
    116 	jmp		LSetSides
    117 
    118 //dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
    119 //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
    120 Lcase1:
    121 	fmuls	(%ecx)				// emins[0]
    122 	flds	pl_normal+4(%edx)
    123 	fxch	%st(2)
    124 	fmuls	(%ebx)				// emaxs[0]
    125 	fxch	%st(2)
    126 	fld		%st(0)
    127 	fmuls	4(%ebx)				// emaxs[1]
    128 	flds	pl_normal+8(%edx)
    129 	fxch	%st(2)
    130 	fmuls	4(%ecx)				// emins[1]
    131 	fxch	%st(2)
    132 	fld		%st(0)
    133 	fmuls	8(%ebx)				// emaxs[2]
    134 	fxch	%st(5)
    135 	faddp	%st(0),%st(3)
    136 	fmuls	8(%ecx)				// emins[2]
    137 	fxch	%st(1)
    138 	faddp	%st(0),%st(3)
    139 	fxch	%st(3)
    140 	faddp	%st(0),%st(2)
    141 
    142 	jmp		LSetSides
    143 
    144 //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
    145 //dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
    146 Lcase2:
    147 	fmuls	(%ebx)				// emaxs[0]
    148 	flds	pl_normal+4(%edx)
    149 	fxch	%st(2)
    150 	fmuls	(%ecx)				// emins[0]
    151 	fxch	%st(2)
    152 	fld		%st(0)
    153 	fmuls	4(%ecx)				// emins[1]
    154 	flds	pl_normal+8(%edx)
    155 	fxch	%st(2)
    156 	fmuls	4(%ebx)				// emaxs[1]
    157 	fxch	%st(2)
    158 	fld		%st(0)
    159 	fmuls	8(%ebx)				// emaxs[2]
    160 	fxch	%st(5)
    161 	faddp	%st(0),%st(3)
    162 	fmuls	8(%ecx)				// emins[2]
    163 	fxch	%st(1)
    164 	faddp	%st(0),%st(3)
    165 	fxch	%st(3)
    166 	faddp	%st(0),%st(2)
    167 
    168 	jmp		LSetSides
    169 
    170 //dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
    171 //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
    172 Lcase3:
    173 	fmuls	(%ecx)				// emins[0]
    174 	flds	pl_normal+4(%edx)
    175 	fxch	%st(2)
    176 	fmuls	(%ebx)				// emaxs[0]
    177 	fxch	%st(2)
    178 	fld		%st(0)
    179 	fmuls	4(%ecx)				// emins[1]
    180 	flds	pl_normal+8(%edx)
    181 	fxch	%st(2)
    182 	fmuls	4(%ebx)				// emaxs[1]
    183 	fxch	%st(2)
    184 	fld		%st(0)
    185 	fmuls	8(%ebx)				// emaxs[2]
    186 	fxch	%st(5)
    187 	faddp	%st(0),%st(3)
    188 	fmuls	8(%ecx)				// emins[2]
    189 	fxch	%st(1)
    190 	faddp	%st(0),%st(3)
    191 	fxch	%st(3)
    192 	faddp	%st(0),%st(2)
    193 
    194 	jmp		LSetSides
    195 
    196 //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
    197 //dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
    198 Lcase4:
    199 	fmuls	(%ebx)				// emaxs[0]
    200 	flds	pl_normal+4(%edx)
    201 	fxch	%st(2)
    202 	fmuls	(%ecx)				// emins[0]
    203 	fxch	%st(2)
    204 	fld		%st(0)
    205 	fmuls	4(%ebx)				// emaxs[1]
    206 	flds	pl_normal+8(%edx)
    207 	fxch	%st(2)
    208 	fmuls	4(%ecx)				// emins[1]
    209 	fxch	%st(2)
    210 	fld		%st(0)
    211 	fmuls	8(%ecx)				// emins[2]
    212 	fxch	%st(5)
    213 	faddp	%st(0),%st(3)
    214 	fmuls	8(%ebx)				// emaxs[2]
    215 	fxch	%st(1)
    216 	faddp	%st(0),%st(3)
    217 	fxch	%st(3)
    218 	faddp	%st(0),%st(2)
    219 
    220 	jmp		LSetSides
    221 
    222 //dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
    223 //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
    224 Lcase5:
    225 	fmuls	(%ecx)				// emins[0]
    226 	flds	pl_normal+4(%edx)
    227 	fxch	%st(2)
    228 	fmuls	(%ebx)				// emaxs[0]
    229 	fxch	%st(2)
    230 	fld		%st(0)
    231 	fmuls	4(%ebx)				// emaxs[1]
    232 	flds	pl_normal+8(%edx)
    233 	fxch	%st(2)
    234 	fmuls	4(%ecx)				// emins[1]
    235 	fxch	%st(2)
    236 	fld		%st(0)
    237 	fmuls	8(%ecx)				// emins[2]
    238 	fxch	%st(5)
    239 	faddp	%st(0),%st(3)
    240 	fmuls	8(%ebx)				// emaxs[2]
    241 	fxch	%st(1)
    242 	faddp	%st(0),%st(3)
    243 	fxch	%st(3)
    244 	faddp	%st(0),%st(2)
    245 
    246 	jmp		LSetSides
    247 
    248 //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
    249 //dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
    250 Lcase6:
    251 	fmuls	(%ebx)				// emaxs[0]
    252 	flds	pl_normal+4(%edx)
    253 	fxch	%st(2)
    254 	fmuls	(%ecx)				// emins[0]
    255 	fxch	%st(2)
    256 	fld		%st(0)
    257 	fmuls	4(%ecx)				// emins[1]
    258 	flds	pl_normal+8(%edx)
    259 	fxch	%st(2)
    260 	fmuls	4(%ebx)				// emaxs[1]
    261 	fxch	%st(2)
    262 	fld		%st(0)
    263 	fmuls	8(%ecx)				// emins[2]
    264 	fxch	%st(5)
    265 	faddp	%st(0),%st(3)
    266 	fmuls	8(%ebx)				// emaxs[2]
    267 	fxch	%st(1)
    268 	faddp	%st(0),%st(3)
    269 	fxch	%st(3)
    270 	faddp	%st(0),%st(2)
    271 
    272 	jmp		LSetSides
    273 
    274 //dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
    275 //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
    276 Lcase7:
    277 	fmuls	(%ecx)				// emins[0]
    278 	flds	pl_normal+4(%edx)
    279 	fxch	%st(2)
    280 	fmuls	(%ebx)				// emaxs[0]
    281 	fxch	%st(2)
    282 	fld		%st(0)
    283 	fmuls	4(%ecx)				// emins[1]
    284 	flds	pl_normal+8(%edx)
    285 	fxch	%st(2)
    286 	fmuls	4(%ebx)				// emaxs[1]
    287 	fxch	%st(2)
    288 	fld		%st(0)
    289 	fmuls	8(%ecx)				// emins[2]
    290 	fxch	%st(5)
    291 	faddp	%st(0),%st(3)
    292 	fmuls	8(%ebx)				// emaxs[2]
    293 	fxch	%st(1)
    294 	faddp	%st(0),%st(3)
    295 	fxch	%st(3)
    296 	faddp	%st(0),%st(2)
    297 
    298 LSetSides:
    299 
    300 //	sides = 0;
    301 //	if (dist1 >= p->dist)
    302 //		sides = 1;
    303 //	if (dist2 < p->dist)
    304 //		sides |= 2;
    305 
    306 	faddp	%st(0),%st(2)		// dist1 | dist2
    307 	fcomps	pl_dist(%edx)
    308 	xorl	%ecx,%ecx
    309 	fnstsw	%ax
    310 	fcomps	pl_dist(%edx)
    311 	andb	$1,%ah
    312 	xorb	$1,%ah
    313 	addb	%ah,%cl
    314 
    315 	fnstsw	%ax
    316 	andb	$1,%ah
    317 	addb	%ah,%ah
    318 	addb	%ah,%cl
    319 
    320 //	return sides;
    321 
    322 	popl	%ebx
    323 	movl	%ecx,%eax	// return status
    324 
    325 	ret
    326 
    327 
    328 Lerror:
    329 	call	C(BOPS_Error)
    330 
    331 #endif	// id386
    332