|
|
1.1 root 1: //
2: // r_edgea.s
3: // x86 assembly-language edge-processing code.
4: //
5:
6: #include "qasm.h"
7:
8: #if id386
9:
10: .data
11: Ltemp: .long 0
12: float_1_div_0100000h: .long 0x35800000 // 1.0/(float)0x100000
13: float_point_999: .single 0.999
14: float_1_point_001: .single 1.001
15:
16: .text
17:
18: //--------------------------------------------------------------------
19:
20: #define edgestoadd 4+8 // note odd stack offsets because of interleaving
21: #define edgelist 8+12 // with pushes
22:
23: .globl C(R_EdgeCodeStart)
24: C(R_EdgeCodeStart):
25:
26: .globl C(R_InsertNewEdges)
27: C(R_InsertNewEdges):
28: pushl %edi
29: pushl %esi // preserve register variables
30: movl edgestoadd(%esp),%edx
31: pushl %ebx
32: movl edgelist(%esp),%ecx
33:
34: LDoNextEdge:
35: movl et_u(%edx),%eax
36: movl %edx,%edi
37:
38: LContinueSearch:
39: movl et_u(%ecx),%ebx
40: movl et_next(%ecx),%esi
41: cmpl %ebx,%eax
42: jle LAddedge
43: movl et_u(%esi),%ebx
44: movl et_next(%esi),%ecx
45: cmpl %ebx,%eax
46: jle LAddedge2
47: movl et_u(%ecx),%ebx
48: movl et_next(%ecx),%esi
49: cmpl %ebx,%eax
50: jle LAddedge
51: movl et_u(%esi),%ebx
52: movl et_next(%esi),%ecx
53: cmpl %ebx,%eax
54: jg LContinueSearch
55:
56: LAddedge2:
57: movl et_next(%edx),%edx
58: movl et_prev(%esi),%ebx
59: movl %esi,et_next(%edi)
60: movl %ebx,et_prev(%edi)
61: movl %edi,et_next(%ebx)
62: movl %edi,et_prev(%esi)
63: movl %esi,%ecx
64:
65: cmpl $0,%edx
66: jnz LDoNextEdge
67: jmp LDone
68:
69: .align 4
70: LAddedge:
71: movl et_next(%edx),%edx
72: movl et_prev(%ecx),%ebx
73: movl %ecx,et_next(%edi)
74: movl %ebx,et_prev(%edi)
75: movl %edi,et_next(%ebx)
76: movl %edi,et_prev(%ecx)
77:
78: cmpl $0,%edx
79: jnz LDoNextEdge
80:
81: LDone:
82: popl %ebx // restore register variables
83: popl %esi
84: popl %edi
85:
86: ret
87:
88: //--------------------------------------------------------------------
89:
90: #define predge 4+4
91:
92: .globl C(R_RemoveEdges)
93: C(R_RemoveEdges):
94: pushl %ebx
95: movl predge(%esp),%eax
96:
97: Lre_loop:
98: movl et_next(%eax),%ecx
99: movl et_nextremove(%eax),%ebx
100: movl et_prev(%eax),%edx
101: testl %ebx,%ebx
102: movl %edx,et_prev(%ecx)
103: jz Lre_done
104: movl %ecx,et_next(%edx)
105:
106: movl et_next(%ebx),%ecx
107: movl et_prev(%ebx),%edx
108: movl et_nextremove(%ebx),%eax
109: movl %edx,et_prev(%ecx)
110: testl %eax,%eax
111: movl %ecx,et_next(%edx)
112: jnz Lre_loop
113:
114: popl %ebx
115: ret
116:
117: Lre_done:
118: movl %ecx,et_next(%edx)
119: popl %ebx
120:
121: ret
122:
123: //--------------------------------------------------------------------
124:
125: #define pedgelist 4+4 // note odd stack offset because of interleaving
126: // with pushes
127:
128: .globl C(R_StepActiveU)
129: C(R_StepActiveU):
130: pushl %edi
131: movl pedgelist(%esp),%edx
132: pushl %esi // preserve register variables
133: pushl %ebx
134:
135: movl et_prev(%edx),%esi
136:
137: LNewEdge:
138: movl et_u(%esi),%edi
139:
140: LNextEdge:
141: movl et_u(%edx),%eax
142: movl et_u_step(%edx),%ebx
143: addl %ebx,%eax
144: movl et_next(%edx),%esi
145: movl %eax,et_u(%edx)
146: cmpl %edi,%eax
147: jl LPushBack
148:
149: movl et_u(%esi),%edi
150: movl et_u_step(%esi),%ebx
151: addl %ebx,%edi
152: movl et_next(%esi),%edx
153: movl %edi,et_u(%esi)
154: cmpl %eax,%edi
155: jl LPushBack2
156:
157: movl et_u(%edx),%eax
158: movl et_u_step(%edx),%ebx
159: addl %ebx,%eax
160: movl et_next(%edx),%esi
161: movl %eax,et_u(%edx)
162: cmpl %edi,%eax
163: jl LPushBack
164:
165: movl et_u(%esi),%edi
166: movl et_u_step(%esi),%ebx
167: addl %ebx,%edi
168: movl et_next(%esi),%edx
169: movl %edi,et_u(%esi)
170: cmpl %eax,%edi
171: jnl LNextEdge
172:
173: LPushBack2:
174: movl %edx,%ebx
175: movl %edi,%eax
176: movl %esi,%edx
177: movl %ebx,%esi
178:
179: LPushBack:
180: // push it back to keep it sorted
181: movl et_prev(%edx),%ecx
182: movl et_next(%edx),%ebx
183:
184: // done if the -1 in edge_aftertail triggered this
185: cmpl $(C(edge_aftertail)),%edx
186: jz LUDone
187:
188: // pull the edge out of the edge list
189: movl et_prev(%ecx),%edi
190: movl %ecx,et_prev(%esi)
191: movl %ebx,et_next(%ecx)
192:
193: // find out where the edge goes in the edge list
194: LPushBackLoop:
195: movl et_prev(%edi),%ecx
196: movl et_u(%edi),%ebx
197: cmpl %ebx,%eax
198: jnl LPushBackFound
199:
200: movl et_prev(%ecx),%edi
201: movl et_u(%ecx),%ebx
202: cmpl %ebx,%eax
203: jl LPushBackLoop
204:
205: movl %ecx,%edi
206:
207: // put the edge back into the edge list
208: LPushBackFound:
209: movl et_next(%edi),%ebx
210: movl %edi,et_prev(%edx)
211: movl %ebx,et_next(%edx)
212: movl %edx,et_next(%edi)
213: movl %edx,et_prev(%ebx)
214:
215: movl %esi,%edx
216: movl et_prev(%esi),%esi
217:
218: cmpl $(C(edge_tail)),%edx
219: jnz LNewEdge
220:
221: LUDone:
222: popl %ebx // restore register variables
223: popl %esi
224: popl %edi
225:
226: ret
227:
228: //--------------------------------------------------------------------
229:
230: #define surf 4 // note this is loaded before any pushes
231:
232: .align 4
233: TrailingEdge:
234: movl st_spanstate(%esi),%eax // check for edge inversion
235: decl %eax
236: jnz LInverted
237:
238: movl %eax,st_spanstate(%esi)
239: movl st_insubmodel(%esi),%ecx
240: movl 0x12345678,%edx // surfaces[1].st_next
241: LPatch0:
242: movl C(r_bmodelactive),%eax
243: subl %ecx,%eax
244: cmpl %esi,%edx
245: movl %eax,C(r_bmodelactive)
246: jnz LNoEmit // surface isn't on top, just remove
247:
248: // emit a span (current top going away)
249: movl et_u(%ebx),%eax
250: shrl $20,%eax // iu = integral pixel u
251: movl st_last_u(%esi),%edx
252: movl st_next(%esi),%ecx
253: cmpl %edx,%eax
254: jle LNoEmit2 // iu <= surf->last_u, so nothing to emit
255:
256: movl %eax,st_last_u(%ecx) // surf->next->last_u = iu;
257: subl %edx,%eax
258: movl %edx,espan_t_u(%ebp) // span->u = surf->last_u;
259:
260: movl %eax,espan_t_count(%ebp) // span->count = iu - span->u;
261: movl C(current_iv),%eax
262: movl %eax,espan_t_v(%ebp) // span->v = current_iv;
263: movl st_spans(%esi),%eax
264: movl %eax,espan_t_pnext(%ebp) // span->pnext = surf->spans;
265: movl %ebp,st_spans(%esi) // surf->spans = span;
266: addl $(espan_t_size),%ebp
267:
268: movl st_next(%esi),%edx // remove the surface from the surface
269: movl st_prev(%esi),%esi // stack
270:
271: movl %edx,st_next(%esi)
272: movl %esi,st_prev(%edx)
273: ret
274:
275: LNoEmit2:
276: movl %eax,st_last_u(%ecx) // surf->next->last_u = iu;
277: movl st_next(%esi),%edx // remove the surface from the surface
278: movl st_prev(%esi),%esi // stack
279:
280: movl %edx,st_next(%esi)
281: movl %esi,st_prev(%edx)
282: ret
283:
284: LNoEmit:
285: movl st_next(%esi),%edx // remove the surface from the surface
286: movl st_prev(%esi),%esi // stack
287:
288: movl %edx,st_next(%esi)
289: movl %esi,st_prev(%edx)
290: ret
291:
292: LInverted:
293: movl %eax,st_spanstate(%esi)
294: ret
295:
296: //--------------------------------------------------------------------
297:
298: // trailing edge only
299: Lgs_trailing:
300: pushl $Lgs_nextedge
301: jmp TrailingEdge
302:
303:
304: .globl C(R_GenerateSpans)
305: C(R_GenerateSpans):
306: pushl %ebp // preserve caller's stack frame
307: pushl %edi
308: pushl %esi // preserve register variables
309: pushl %ebx
310:
311: // clear active surfaces to just the background surface
312: movl C(surfaces),%eax
313: movl C(edge_head_u_shift20),%edx
314: addl $(st_size),%eax
315: // %ebp = span_p throughout
316: movl C(span_p),%ebp
317:
318: movl $0,C(r_bmodelactive)
319:
320: movl %eax,st_next(%eax)
321: movl %eax,st_prev(%eax)
322: movl %edx,st_last_u(%eax)
323: movl C(edge_head)+et_next,%ebx // edge=edge_head.next
324:
325: // generate spans
326: cmpl $(C(edge_tail)),%ebx // done if empty list
327: jz Lgs_lastspan
328:
329: Lgs_edgeloop:
330:
331: movl et_surfs(%ebx),%edi
332: movl C(surfaces),%eax
333: movl %edi,%esi
334: andl $0xFFFF0000,%edi
335: andl $0xFFFF,%esi
336: jz Lgs_leading // not a trailing edge
337:
338: // it has a left surface, so a surface is going away for this span
339: shll $(SURF_T_SHIFT),%esi
340: addl %eax,%esi
341: testl %edi,%edi
342: jz Lgs_trailing
343:
344: // both leading and trailing
345: call TrailingEdge
346: movl C(surfaces),%eax
347:
348: // ---------------------------------------------------------------
349: // handle a leading edge
350: // ---------------------------------------------------------------
351:
352: Lgs_leading:
353: shrl $16-SURF_T_SHIFT,%edi
354: movl C(surfaces),%eax
355: addl %eax,%edi
356: movl 0x12345678,%esi // surf2 = surfaces[1].next;
357: LPatch2:
358: movl st_spanstate(%edi),%edx
359: movl st_insubmodel(%edi),%eax
360: testl %eax,%eax
361: jnz Lbmodel_leading
362:
363: // handle a leading non-bmodel edge
364:
365: // don't start a span if this is an inverted span, with the end edge preceding
366: // the start edge (that is, we've already seen the end edge)
367: testl %edx,%edx
368: jnz Lxl_done
369:
370:
371: // if (surf->key < surf2->key)
372: // goto newtop;
373: incl %edx
374: movl st_key(%edi),%eax
375: movl %edx,st_spanstate(%edi)
376: movl st_key(%esi),%ecx
377: cmpl %ecx,%eax
378: jl Lnewtop
379:
380: // main sorting loop to search through surface stack until insertion point
381: // found. Always terminates because background surface is sentinel
382: // do
383: // {
384: // surf2 = surf2->next;
385: // } while (surf->key >= surf2->key);
386: Lsortloopnb:
387: movl st_next(%esi),%esi
388: movl st_key(%esi),%ecx
389: cmpl %ecx,%eax
390: jge Lsortloopnb
391:
392: jmp LInsertAndExit
393:
394:
395: // handle a leading bmodel edge
396: .align 4
397: Lbmodel_leading:
398:
399: // don't start a span if this is an inverted span, with the end edge preceding
400: // the start edge (that is, we've already seen the end edge)
401: testl %edx,%edx
402: jnz Lxl_done
403:
404: movl C(r_bmodelactive),%ecx
405: incl %edx
406: incl %ecx
407: movl %edx,st_spanstate(%edi)
408: movl %ecx,C(r_bmodelactive)
409:
410: // if (surf->key < surf2->key)
411: // goto newtop;
412: movl st_key(%edi),%eax
413: movl st_key(%esi),%ecx
414: cmpl %ecx,%eax
415: jl Lnewtop
416:
417: // if ((surf->key == surf2->key) && surf->insubmodel)
418: // {
419: jz Lzcheck_for_newtop
420:
421: // main sorting loop to search through surface stack until insertion point
422: // found. Always terminates because background surface is sentinel
423: // do
424: // {
425: // surf2 = surf2->next;
426: // } while (surf->key > surf2->key);
427: Lsortloop:
428: movl st_next(%esi),%esi
429: movl st_key(%esi),%ecx
430: cmpl %ecx,%eax
431: jg Lsortloop
432:
433: jne LInsertAndExit
434:
435: // Do 1/z sorting to see if we've arrived in the right position
436: movl et_u(%ebx),%eax
437: subl $0xFFFFF,%eax
438: movl %eax,Ltemp
439: fildl Ltemp
440:
441: fmuls float_1_div_0100000h // fu = (float)(edge->u - 0xFFFFF) *
442: // (1.0 / 0x100000);
443:
444: fld %st(0) // fu | fu
445: fmuls st_d_zistepu(%edi) // fu*surf->d_zistepu | fu
446: flds C(fv) // fv | fu*surf->d_zistepu | fu
447: fmuls st_d_zistepv(%edi) // fv*surf->d_zistepv | fu*surf->d_zistepu | fu
448: fxch %st(1) // fu*surf->d_zistepu | fv*surf->d_zistepv | fu
449: fadds st_d_ziorigin(%edi) // fu*surf->d_zistepu + surf->d_ziorigin |
450: // fv*surf->d_zistepv | fu
451:
452: flds st_d_zistepu(%esi) // surf2->d_zistepu |
453: // fu*surf->d_zistepu + surf->d_ziorigin |
454: // fv*surf->d_zistepv | fu
455: fmul %st(3),%st(0) // fu*surf2->d_zistepu |
456: // fu*surf->d_zistepu + surf->d_ziorigin |
457: // fv*surf->d_zistepv | fu
458: fxch %st(1) // fu*surf->d_zistepu + surf->d_ziorigin |
459: // fu*surf2->d_zistepu |
460: // fv*surf->d_zistepv | fu
461: faddp %st(0),%st(2) // fu*surf2->d_zistepu | newzi | fu
462:
463: flds C(fv) // fv | fu*surf2->d_zistepu | newzi | fu
464: fmuls st_d_zistepv(%esi) // fv*surf2->d_zistepv |
465: // fu*surf2->d_zistepu | newzi | fu
466: fld %st(2) // newzi | fv*surf2->d_zistepv |
467: // fu*surf2->d_zistepu | newzi | fu
468: fmuls float_point_999 // newzibottom | fv*surf2->d_zistepv |
469: // fu*surf2->d_zistepu | newzi | fu
470:
471: fxch %st(2) // fu*surf2->d_zistepu | fv*surf2->d_zistepv |
472: // newzibottom | newzi | fu
473: fadds st_d_ziorigin(%esi) // fu*surf2->d_zistepu + surf2->d_ziorigin |
474: // fv*surf2->d_zistepv | newzibottom | newzi |
475: // fu
476: faddp %st(0),%st(1) // testzi | newzibottom | newzi | fu
477: fxch %st(1) // newzibottom | testzi | newzi | fu
478:
479: // if (newzibottom >= testzi)
480: // goto Lgotposition;
481:
482: fcomp %st(1) // testzi | newzi | fu
483:
484: fxch %st(1) // newzi | testzi | fu
485: fmuls float_1_point_001 // newzitop | testzi | fu
486: fxch %st(1) // testzi | newzitop | fu
487:
488: fnstsw %ax
489: testb $0x01,%ah
490: jz Lgotposition_fpop3
491:
492: // if (newzitop >= testzi)
493: // {
494:
495: fcomp %st(1) // newzitop | fu
496: fnstsw %ax
497: testb $0x45,%ah
498: jz Lsortloop_fpop2
499:
500: // if (surf->d_zistepu >= surf2->d_zistepu)
501: // goto newtop;
502:
503: flds st_d_zistepu(%edi) // surf->d_zistepu | newzitop| fu
504: fcomps st_d_zistepu(%esi) // newzitop | fu
505: fnstsw %ax
506: testb $0x01,%ah
507: jz Lgotposition_fpop2
508:
509: fstp %st(0) // clear the FPstack
510: fstp %st(0)
511: movl st_key(%edi),%eax
512: jmp Lsortloop
513:
514:
515: Lgotposition_fpop3:
516: fstp %st(0)
517: Lgotposition_fpop2:
518: fstp %st(0)
519: fstp %st(0)
520: jmp LInsertAndExit
521:
522:
523: // emit a span (obscures current top)
524:
525: Lnewtop_fpop3:
526: fstp %st(0)
527: Lnewtop_fpop2:
528: fstp %st(0)
529: fstp %st(0)
530: movl st_key(%edi),%eax // reload the sorting key
531:
532: Lnewtop:
533: movl et_u(%ebx),%eax
534: movl st_last_u(%esi),%edx
535: shrl $20,%eax // iu = integral pixel u
536: movl %eax,st_last_u(%edi) // surf->last_u = iu;
537: cmpl %edx,%eax
538: jle LInsertAndExit // iu <= surf->last_u, so nothing to emit
539:
540: subl %edx,%eax
541: movl %edx,espan_t_u(%ebp) // span->u = surf->last_u;
542:
543: movl %eax,espan_t_count(%ebp) // span->count = iu - span->u;
544: movl C(current_iv),%eax
545: movl %eax,espan_t_v(%ebp) // span->v = current_iv;
546: movl st_spans(%esi),%eax
547: movl %eax,espan_t_pnext(%ebp) // span->pnext = surf->spans;
548: movl %ebp,st_spans(%esi) // surf->spans = span;
549: addl $(espan_t_size),%ebp
550:
551: LInsertAndExit:
552: // insert before surf2
553: movl %esi,st_next(%edi) // surf->next = surf2;
554: movl st_prev(%esi),%eax
555: movl %eax,st_prev(%edi) // surf->prev = surf2->prev;
556: movl %edi,st_prev(%esi) // surf2->prev = surf;
557: movl %edi,st_next(%eax) // surf2->prev->next = surf;
558:
559: // ---------------------------------------------------------------
560: // leading edge done
561: // ---------------------------------------------------------------
562:
563: // ---------------------------------------------------------------
564: // see if there are any more edges
565: // ---------------------------------------------------------------
566:
567: Lgs_nextedge:
568: movl et_next(%ebx),%ebx
569: cmpl $(C(edge_tail)),%ebx
570: jnz Lgs_edgeloop
571:
572: // clean up at the right edge
573: Lgs_lastspan:
574:
575: // now that we've reached the right edge of the screen, we're done with any
576: // unfinished surfaces, so emit a span for whatever's on top
577: movl 0x12345678,%esi // surfaces[1].st_next
578: LPatch3:
579: movl C(edge_tail_u_shift20),%eax
580: xorl %ecx,%ecx
581: movl st_last_u(%esi),%edx
582: subl %edx,%eax
583: jle Lgs_resetspanstate
584:
585: movl %edx,espan_t_u(%ebp)
586: movl %eax,espan_t_count(%ebp)
587: movl C(current_iv),%eax
588: movl %eax,espan_t_v(%ebp)
589: movl st_spans(%esi),%eax
590: movl %eax,espan_t_pnext(%ebp)
591: movl %ebp,st_spans(%esi)
592: addl $(espan_t_size),%ebp
593:
594: // reset spanstate for all surfaces in the surface stack
595: Lgs_resetspanstate:
596: movl %ecx,st_spanstate(%esi)
597: movl st_next(%esi),%esi
598: cmpl $0x12345678,%esi // &surfaces[1]
599: LPatch4:
600: jnz Lgs_resetspanstate
601:
602: // store the final span_p
603: movl %ebp,C(span_p)
604:
605: popl %ebx // restore register variables
606: popl %esi
607: popl %edi
608: popl %ebp // restore the caller's stack frame
609: ret
610:
611:
612: // ---------------------------------------------------------------
613: // 1/z sorting for bmodels in the same leaf
614: // ---------------------------------------------------------------
615: .align 4
616: Lxl_done:
617: incl %edx
618: movl %edx,st_spanstate(%edi)
619:
620: jmp Lgs_nextedge
621:
622:
623: .align 4
624: Lzcheck_for_newtop:
625: movl et_u(%ebx),%eax
626: subl $0xFFFFF,%eax
627: movl %eax,Ltemp
628: fildl Ltemp
629:
630: fmuls float_1_div_0100000h // fu = (float)(edge->u - 0xFFFFF) *
631: // (1.0 / 0x100000);
632:
633: fld %st(0) // fu | fu
634: fmuls st_d_zistepu(%edi) // fu*surf->d_zistepu | fu
635: flds C(fv) // fv | fu*surf->d_zistepu | fu
636: fmuls st_d_zistepv(%edi) // fv*surf->d_zistepv | fu*surf->d_zistepu | fu
637: fxch %st(1) // fu*surf->d_zistepu | fv*surf->d_zistepv | fu
638: fadds st_d_ziorigin(%edi) // fu*surf->d_zistepu + surf->d_ziorigin |
639: // fv*surf->d_zistepv | fu
640:
641: flds st_d_zistepu(%esi) // surf2->d_zistepu |
642: // fu*surf->d_zistepu + surf->d_ziorigin |
643: // fv*surf->d_zistepv | fu
644: fmul %st(3),%st(0) // fu*surf2->d_zistepu |
645: // fu*surf->d_zistepu + surf->d_ziorigin |
646: // fv*surf->d_zistepv | fu
647: fxch %st(1) // fu*surf->d_zistepu + surf->d_ziorigin |
648: // fu*surf2->d_zistepu |
649: // fv*surf->d_zistepv | fu
650: faddp %st(0),%st(2) // fu*surf2->d_zistepu | newzi | fu
651:
652: flds C(fv) // fv | fu*surf2->d_zistepu | newzi | fu
653: fmuls st_d_zistepv(%esi) // fv*surf2->d_zistepv |
654: // fu*surf2->d_zistepu | newzi | fu
655: fld %st(2) // newzi | fv*surf2->d_zistepv |
656: // fu*surf2->d_zistepu | newzi | fu
657: fmuls float_point_999 // newzibottom | fv*surf2->d_zistepv |
658: // fu*surf2->d_zistepu | newzi | fu
659:
660: fxch %st(2) // fu*surf2->d_zistepu | fv*surf2->d_zistepv |
661: // newzibottom | newzi | fu
662: fadds st_d_ziorigin(%esi) // fu*surf2->d_zistepu + surf2->d_ziorigin |
663: // fv*surf2->d_zistepv | newzibottom | newzi |
664: // fu
665: faddp %st(0),%st(1) // testzi | newzibottom | newzi | fu
666: fxch %st(1) // newzibottom | testzi | newzi | fu
667:
668: // if (newzibottom >= testzi)
669: // goto newtop;
670:
671: fcomp %st(1) // testzi | newzi | fu
672:
673: fxch %st(1) // newzi | testzi | fu
674: fmuls float_1_point_001 // newzitop | testzi | fu
675: fxch %st(1) // testzi | newzitop | fu
676:
677: fnstsw %ax
678: testb $0x01,%ah
679: jz Lnewtop_fpop3
680:
681: // if (newzitop >= testzi)
682: // {
683:
684: fcomp %st(1) // newzitop | fu
685: fnstsw %ax
686: testb $0x45,%ah
687: jz Lsortloop_fpop2
688:
689: // if (surf->d_zistepu >= surf2->d_zistepu)
690: // goto newtop;
691:
692: flds st_d_zistepu(%edi) // surf->d_zistepu | newzitop | fu
693: fcomps st_d_zistepu(%esi) // newzitop | fu
694: fnstsw %ax
695: testb $0x01,%ah
696: jz Lnewtop_fpop2
697:
698: Lsortloop_fpop2:
699: fstp %st(0) // clear the FP stack
700: fstp %st(0)
701: movl st_key(%edi),%eax
702: jmp Lsortloop
703:
704:
705: .globl C(R_EdgeCodeEnd)
706: C(R_EdgeCodeEnd):
707:
708:
709: //----------------------------------------------------------------------
710: // Surface array address code patching routine
711: //----------------------------------------------------------------------
712:
713: .align 4
714: .globl C(R_SurfacePatch)
715: C(R_SurfacePatch):
716:
717: movl C(surfaces),%eax
718: addl $(st_size),%eax
719: movl %eax,LPatch4-4
720:
721: addl $(st_next),%eax
722: movl %eax,LPatch0-4
723: movl %eax,LPatch2-4
724: movl %eax,LPatch3-4
725:
726: ret
727:
728: #endif // id386
729:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.