|
|
1.1 root 1: /*
2: Copyright (C) 1996-1997 Id Software, Inc.
3:
4: This program is free software; you can redistribute it and/or
5: modify it under the terms of the GNU General Public License
6: as published by the Free Software Foundation; either version 2
7: of the License, or (at your option) any later version.
8:
9: This program is distributed in the hope that it will be useful,
10: but WITHOUT ANY WARRANTY; without even the implied warranty of
11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12:
13: See the GNU General Public License for more details.
14:
15: You should have received a copy of the GNU General Public License
16: along with this program; if not, write to the Free Software
17: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18:
19: */
20: //
21: // math.s
22: // x86 assembly-language math routines.
23:
24: #include "asm_i386.h"
25: #include "quakeasm.h"
26:
27:
28: #if id386
29:
30: .data
31:
32: .align 4
33: Ljmptab: .long Lcase0, Lcase1, Lcase2, Lcase3
34: .long Lcase4, Lcase5, Lcase6, Lcase7
35:
36: .text
37:
38: // TODO: rounding needed?
39: // stack parameter offset
40: #define val 4
41:
42: .globl C(Invert24To16)
43: C(Invert24To16):
44:
45: movl val(%esp),%ecx
46: movl $0x100,%edx // 0x10000000000 as dividend
47: cmpl %edx,%ecx
48: jle LOutOfRange
49:
50: subl %eax,%eax
51: divl %ecx
52:
53: ret
54:
55: LOutOfRange:
56: movl $0xFFFFFFFF,%eax
57: ret
58:
59: #define in 4
60: #define out 8
61:
62: .align 2
63: .globl C(TransformVector)
64: C(TransformVector):
65: movl in(%esp),%eax
66: movl out(%esp),%edx
67:
68: flds (%eax) // in[0]
69: fmuls C(vright) // in[0]*vright[0]
70: flds (%eax) // in[0] | in[0]*vright[0]
71: fmuls C(vup) // in[0]*vup[0] | in[0]*vright[0]
72: flds (%eax) // in[0] | in[0]*vup[0] | in[0]*vright[0]
73: fmuls C(vpn) // in[0]*vpn[0] | in[0]*vup[0] | in[0]*vright[0]
74:
75: flds 4(%eax) // in[1] | ...
76: fmuls C(vright)+4 // in[1]*vright[1] | ...
77: flds 4(%eax) // in[1] | in[1]*vright[1] | ...
78: fmuls C(vup)+4 // in[1]*vup[1] | in[1]*vright[1] | ...
79: flds 4(%eax) // in[1] | in[1]*vup[1] | in[1]*vright[1] | ...
80: fmuls C(vpn)+4 // in[1]*vpn[1] | in[1]*vup[1] | in[1]*vright[1] | ...
81: fxch %st(2) // in[1]*vright[1] | in[1]*vup[1] | in[1]*vpn[1] | ...
82:
83: faddp %st(0),%st(5) // in[1]*vup[1] | in[1]*vpn[1] | ...
84: faddp %st(0),%st(3) // in[1]*vpn[1] | ...
85: faddp %st(0),%st(1) // vpn_accum | vup_accum | vright_accum
86:
87: flds 8(%eax) // in[2] | ...
88: fmuls C(vright)+8 // in[2]*vright[2] | ...
89: flds 8(%eax) // in[2] | in[2]*vright[2] | ...
90: fmuls C(vup)+8 // in[2]*vup[2] | in[2]*vright[2] | ...
91: flds 8(%eax) // in[2] | in[2]*vup[2] | in[2]*vright[2] | ...
92: fmuls C(vpn)+8 // in[2]*vpn[2] | in[2]*vup[2] | in[2]*vright[2] | ...
93: fxch %st(2) // in[2]*vright[2] | in[2]*vup[2] | in[2]*vpn[2] | ...
94:
95: faddp %st(0),%st(5) // in[2]*vup[2] | in[2]*vpn[2] | ...
96: faddp %st(0),%st(3) // in[2]*vpn[2] | ...
97: faddp %st(0),%st(1) // vpn_accum | vup_accum | vright_accum
98:
99: fstps 8(%edx) // out[2]
100: fstps 4(%edx) // out[1]
101: fstps (%edx) // out[0]
102:
103: ret
104:
105:
106: #define EMINS 4+4
107: #define EMAXS 4+8
108: #define P 4+12
109:
110: .align 2
111: .globl C(BoxOnPlaneSide)
112: C(BoxOnPlaneSide):
113: pushl %ebx
114:
115: movl P(%esp),%edx
116: movl EMINS(%esp),%ecx
117: xorl %eax,%eax
118: movl EMAXS(%esp),%ebx
119: movb pl_signbits(%edx),%al
120: cmpb $8,%al
121: jge Lerror
122: flds pl_normal(%edx) // p->normal[0]
123: fld %st(0) // p->normal[0] | p->normal[0]
124: jmp Ljmptab(,%eax,4)
125:
126:
127: //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
128: //dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
129: Lcase0:
130: fmuls (%ebx) // p->normal[0]*emaxs[0] | p->normal[0]
131: flds pl_normal+4(%edx) // p->normal[1] | p->normal[0]*emaxs[0] |
132: // p->normal[0]
133: fxch %st(2) // p->normal[0] | p->normal[0]*emaxs[0] |
134: // p->normal[1]
135: fmuls (%ecx) // p->normal[0]*emins[0] |
136: // p->normal[0]*emaxs[0] | p->normal[1]
137: fxch %st(2) // p->normal[1] | p->normal[0]*emaxs[0] |
138: // p->normal[0]*emins[0]
139: fld %st(0) // p->normal[1] | p->normal[1] |
140: // p->normal[0]*emaxs[0] |
141: // p->normal[0]*emins[0]
142: fmuls 4(%ebx) // p->normal[1]*emaxs[1] | p->normal[1] |
143: // p->normal[0]*emaxs[0] |
144: // p->normal[0]*emins[0]
145: flds pl_normal+8(%edx) // p->normal[2] | p->normal[1]*emaxs[1] |
146: // p->normal[1] | p->normal[0]*emaxs[0] |
147: // p->normal[0]*emins[0]
148: fxch %st(2) // p->normal[1] | p->normal[1]*emaxs[1] |
149: // p->normal[2] | p->normal[0]*emaxs[0] |
150: // p->normal[0]*emins[0]
151: fmuls 4(%ecx) // p->normal[1]*emins[1] |
152: // p->normal[1]*emaxs[1] |
153: // p->normal[2] | p->normal[0]*emaxs[0] |
154: // p->normal[0]*emins[0]
155: fxch %st(2) // p->normal[2] | p->normal[1]*emaxs[1] |
156: // p->normal[1]*emins[1] |
157: // p->normal[0]*emaxs[0] |
158: // p->normal[0]*emins[0]
159: fld %st(0) // p->normal[2] | p->normal[2] |
160: // p->normal[1]*emaxs[1] |
161: // p->normal[1]*emins[1] |
162: // p->normal[0]*emaxs[0] |
163: // p->normal[0]*emins[0]
164: fmuls 8(%ebx) // p->normal[2]*emaxs[2] |
165: // p->normal[2] |
166: // p->normal[1]*emaxs[1] |
167: // p->normal[1]*emins[1] |
168: // p->normal[0]*emaxs[0] |
169: // p->normal[0]*emins[0]
170: fxch %st(5) // p->normal[0]*emins[0] |
171: // p->normal[2] |
172: // p->normal[1]*emaxs[1] |
173: // p->normal[1]*emins[1] |
174: // p->normal[0]*emaxs[0] |
175: // p->normal[2]*emaxs[2]
176: faddp %st(0),%st(3) //p->normal[2] |
177: // p->normal[1]*emaxs[1] |
178: // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
179: // p->normal[0]*emaxs[0] |
180: // p->normal[2]*emaxs[2]
181: fmuls 8(%ecx) //p->normal[2]*emins[2] |
182: // p->normal[1]*emaxs[1] |
183: // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
184: // p->normal[0]*emaxs[0] |
185: // p->normal[2]*emaxs[2]
186: fxch %st(1) //p->normal[1]*emaxs[1] |
187: // p->normal[2]*emins[2] |
188: // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
189: // p->normal[0]*emaxs[0] |
190: // p->normal[2]*emaxs[2]
191: faddp %st(0),%st(3) //p->normal[2]*emins[2] |
192: // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
193: // p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
194: // p->normal[2]*emaxs[2]
195: fxch %st(3) //p->normal[2]*emaxs[2] +
196: // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
197: // p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
198: // p->normal[2]*emins[2]
199: faddp %st(0),%st(2) //p->normal[1]*emins[1]+p->normal[0]*emins[0]|
200: // dist1 | p->normal[2]*emins[2]
201:
202: jmp LSetSides
203:
204: //dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
205: //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
206: Lcase1:
207: fmuls (%ecx) // emins[0]
208: flds pl_normal+4(%edx)
209: fxch %st(2)
210: fmuls (%ebx) // emaxs[0]
211: fxch %st(2)
212: fld %st(0)
213: fmuls 4(%ebx) // emaxs[1]
214: flds pl_normal+8(%edx)
215: fxch %st(2)
216: fmuls 4(%ecx) // emins[1]
217: fxch %st(2)
218: fld %st(0)
219: fmuls 8(%ebx) // emaxs[2]
220: fxch %st(5)
221: faddp %st(0),%st(3)
222: fmuls 8(%ecx) // emins[2]
223: fxch %st(1)
224: faddp %st(0),%st(3)
225: fxch %st(3)
226: faddp %st(0),%st(2)
227:
228: jmp LSetSides
229:
230: //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
231: //dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
232: Lcase2:
233: fmuls (%ebx) // emaxs[0]
234: flds pl_normal+4(%edx)
235: fxch %st(2)
236: fmuls (%ecx) // emins[0]
237: fxch %st(2)
238: fld %st(0)
239: fmuls 4(%ecx) // emins[1]
240: flds pl_normal+8(%edx)
241: fxch %st(2)
242: fmuls 4(%ebx) // emaxs[1]
243: fxch %st(2)
244: fld %st(0)
245: fmuls 8(%ebx) // emaxs[2]
246: fxch %st(5)
247: faddp %st(0),%st(3)
248: fmuls 8(%ecx) // emins[2]
249: fxch %st(1)
250: faddp %st(0),%st(3)
251: fxch %st(3)
252: faddp %st(0),%st(2)
253:
254: jmp LSetSides
255:
256: //dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
257: //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
258: Lcase3:
259: fmuls (%ecx) // emins[0]
260: flds pl_normal+4(%edx)
261: fxch %st(2)
262: fmuls (%ebx) // emaxs[0]
263: fxch %st(2)
264: fld %st(0)
265: fmuls 4(%ecx) // emins[1]
266: flds pl_normal+8(%edx)
267: fxch %st(2)
268: fmuls 4(%ebx) // emaxs[1]
269: fxch %st(2)
270: fld %st(0)
271: fmuls 8(%ebx) // emaxs[2]
272: fxch %st(5)
273: faddp %st(0),%st(3)
274: fmuls 8(%ecx) // emins[2]
275: fxch %st(1)
276: faddp %st(0),%st(3)
277: fxch %st(3)
278: faddp %st(0),%st(2)
279:
280: jmp LSetSides
281:
282: //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
283: //dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
284: Lcase4:
285: fmuls (%ebx) // emaxs[0]
286: flds pl_normal+4(%edx)
287: fxch %st(2)
288: fmuls (%ecx) // emins[0]
289: fxch %st(2)
290: fld %st(0)
291: fmuls 4(%ebx) // emaxs[1]
292: flds pl_normal+8(%edx)
293: fxch %st(2)
294: fmuls 4(%ecx) // emins[1]
295: fxch %st(2)
296: fld %st(0)
297: fmuls 8(%ecx) // emins[2]
298: fxch %st(5)
299: faddp %st(0),%st(3)
300: fmuls 8(%ebx) // emaxs[2]
301: fxch %st(1)
302: faddp %st(0),%st(3)
303: fxch %st(3)
304: faddp %st(0),%st(2)
305:
306: jmp LSetSides
307:
308: //dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
309: //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
310: Lcase5:
311: fmuls (%ecx) // emins[0]
312: flds pl_normal+4(%edx)
313: fxch %st(2)
314: fmuls (%ebx) // emaxs[0]
315: fxch %st(2)
316: fld %st(0)
317: fmuls 4(%ebx) // emaxs[1]
318: flds pl_normal+8(%edx)
319: fxch %st(2)
320: fmuls 4(%ecx) // emins[1]
321: fxch %st(2)
322: fld %st(0)
323: fmuls 8(%ecx) // emins[2]
324: fxch %st(5)
325: faddp %st(0),%st(3)
326: fmuls 8(%ebx) // emaxs[2]
327: fxch %st(1)
328: faddp %st(0),%st(3)
329: fxch %st(3)
330: faddp %st(0),%st(2)
331:
332: jmp LSetSides
333:
334: //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
335: //dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
336: Lcase6:
337: fmuls (%ebx) // emaxs[0]
338: flds pl_normal+4(%edx)
339: fxch %st(2)
340: fmuls (%ecx) // emins[0]
341: fxch %st(2)
342: fld %st(0)
343: fmuls 4(%ecx) // emins[1]
344: flds pl_normal+8(%edx)
345: fxch %st(2)
346: fmuls 4(%ebx) // emaxs[1]
347: fxch %st(2)
348: fld %st(0)
349: fmuls 8(%ecx) // emins[2]
350: fxch %st(5)
351: faddp %st(0),%st(3)
352: fmuls 8(%ebx) // emaxs[2]
353: fxch %st(1)
354: faddp %st(0),%st(3)
355: fxch %st(3)
356: faddp %st(0),%st(2)
357:
358: jmp LSetSides
359:
360: //dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
361: //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
362: Lcase7:
363: fmuls (%ecx) // emins[0]
364: flds pl_normal+4(%edx)
365: fxch %st(2)
366: fmuls (%ebx) // emaxs[0]
367: fxch %st(2)
368: fld %st(0)
369: fmuls 4(%ecx) // emins[1]
370: flds pl_normal+8(%edx)
371: fxch %st(2)
372: fmuls 4(%ebx) // emaxs[1]
373: fxch %st(2)
374: fld %st(0)
375: fmuls 8(%ecx) // emins[2]
376: fxch %st(5)
377: faddp %st(0),%st(3)
378: fmuls 8(%ebx) // emaxs[2]
379: fxch %st(1)
380: faddp %st(0),%st(3)
381: fxch %st(3)
382: faddp %st(0),%st(2)
383:
384: LSetSides:
385:
386: // sides = 0;
387: // if (dist1 >= p->dist)
388: // sides = 1;
389: // if (dist2 < p->dist)
390: // sides |= 2;
391:
392: faddp %st(0),%st(2) // dist1 | dist2
393: fcomps pl_dist(%edx)
394: xorl %ecx,%ecx
395: fnstsw %ax
396: fcomps pl_dist(%edx)
397: andb $1,%ah
398: xorb $1,%ah
399: addb %ah,%cl
400:
401: fnstsw %ax
402: andb $1,%ah
403: addb %ah,%ah
404: addb %ah,%cl
405:
406: // return sides;
407:
408: popl %ebx
409: movl %ecx,%eax // return status
410:
411: ret
412:
413:
414: Lerror:
415: call C(BOPS_Error)
416:
417: #endif // id386
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.