|
|
1.1 root 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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.