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
14Ljmptab:	.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)
26C(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];
43Lcase0:
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];
120Lcase1:
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];
146Lcase2:
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];
172Lcase3:
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];
198Lcase4:
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];
224Lcase5:
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];
250Lcase6:
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];
276Lcase7:
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
298LSetSides:
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
328Lerror:
329	call	C(BOPS_Error)
330
331#endif	// id386
332