Annotation of quake1/d_polysa.s, revision 1.1

1.1     ! root        1: //
        !             2: // d_polysa.s
        !             3: // x86 assembly-language polygon model drawing code
        !             4: //
        !             5: 
        !             6: #include "asm_i386.h"
        !             7: #include "quakeasm.h"
        !             8: #include "asm_draw.h"
        !             9: #include "d_ifacea.h"
        !            10: 
        !            11: #if    id386
        !            12: 
        !            13: // !!! if this is changed, it must be changed in d_polyse.c too !!!
        !            14: #define DPS_MAXSPANS                   MAXHEIGHT+1     
        !            15:                                                                        // 1 extra for spanpackage that marks end
        !            16: 
        !            17: #define        SPAN_SIZE       (((DPS_MAXSPANS + 1 + ((CACHE_SIZE - 1) / spanpackage_t_size)) + 1) * spanpackage_t_size)
        !            18: 
        !            19: 
        !            20:        .data
        !            21: 
        !            22:        .align  4
        !            23: p10_minus_p20: .single         0
        !            24: p01_minus_p21: .single         0
        !            25: temp0:                 .single         0
        !            26: temp1:                 .single         0
        !            27: Ltemp:                 .single         0
        !            28: 
        !            29: aff8entryvec_table:    .long   LDraw8, LDraw7, LDraw6, LDraw5
        !            30:                                .long   LDraw4, LDraw3, LDraw2, LDraw1
        !            31: 
        !            32: lzistepx:              .long   0
        !            33: 
        !            34: 
        !            35:        .text
        !            36: 
        !            37: #ifndef NeXT
        !            38:        .extern C(D_PolysetSetEdgeTable)
        !            39:        .extern C(D_RasterizeAliasPolySmooth)
        !            40: #endif
        !            41: 
        !            42: //----------------------------------------------------------------------
        !            43: // affine triangle gradient calculation code
        !            44: //----------------------------------------------------------------------
        !            45: 
        !            46: #define skinwidth      4+0
        !            47: 
        !            48: .globl C(D_PolysetCalcGradients)
        !            49: C(D_PolysetCalcGradients):
        !            50: 
        !            51: //     p00_minus_p20 = r_p0[0] - r_p2[0];
        !            52: //     p01_minus_p21 = r_p0[1] - r_p2[1];
        !            53: //     p10_minus_p20 = r_p1[0] - r_p2[0];
        !            54: //     p11_minus_p21 = r_p1[1] - r_p2[1];
        !            55: //
        !            56: //     xstepdenominv = 1.0 / (p10_minus_p20 * p01_minus_p21 -
        !            57: //                          p00_minus_p20 * p11_minus_p21);
        !            58: //
        !            59: //     ystepdenominv = -xstepdenominv;
        !            60: 
        !            61:        fildl   C(r_p0)+0               // r_p0[0]
        !            62:        fildl   C(r_p2)+0               // r_p2[0] | r_p0[0]
        !            63:        fildl   C(r_p0)+4               // r_p0[1] | r_p2[0] | r_p0[0]
        !            64:        fildl   C(r_p2)+4               // r_p2[1] | r_p0[1] | r_p2[0] | r_p0[0]
        !            65:        fildl   C(r_p1)+0               // r_p1[0] | r_p2[1] | r_p0[1] | r_p2[0] | r_p0[0]
        !            66:        fildl   C(r_p1)+4               // r_p1[1] | r_p1[0] | r_p2[1] | r_p0[1] |
        !            67:                                                        //  r_p2[0] | r_p0[0]
        !            68:        fxch    %st(3)                  // r_p0[1] | r_p1[0] | r_p2[1] | r_p1[1] |
        !            69:                                                        //  r_p2[0] | r_p0[0]
        !            70:        fsub    %st(2),%st(0)   // p01_minus_p21 | r_p1[0] | r_p2[1] | r_p1[1] |
        !            71:                                                        //  r_p2[0] | r_p0[0]
        !            72:        fxch    %st(1)                  // r_p1[0] | p01_minus_p21 | r_p2[1] | r_p1[1] |
        !            73:                                                        //  r_p2[0] | r_p0[0]
        !            74:        fsub    %st(4),%st(0)   // p10_minus_p20 | p01_minus_p21 | r_p2[1] |
        !            75:                                                        //  r_p1[1] | r_p2[0] | r_p0[0]
        !            76:        fxch    %st(5)                  // r_p0[0] | p01_minus_p21 | r_p2[1] |
        !            77:                                                        //  r_p1[1] | r_p2[0] | p10_minus_p20
        !            78:        fsubp   %st(0),%st(4)   // p01_minus_p21 | r_p2[1] | r_p1[1] |
        !            79:                                                        //  p00_minus_p20 | p10_minus_p20
        !            80:        fxch    %st(2)                  // r_p1[1] | r_p2[1] | p01_minus_p21 |
        !            81:                                                        //  p00_minus_p20 | p10_minus_p20
        !            82:        fsubp   %st(0),%st(1)   // p11_minus_p21 | p01_minus_p21 |
        !            83:                                                        //  p00_minus_p20 | p10_minus_p20
        !            84:        fxch    %st(1)                  // p01_minus_p21 | p11_minus_p21 |
        !            85:                                                        //  p00_minus_p20 | p10_minus_p20
        !            86:        flds    C(d_xdenom)             // d_xdenom | p01_minus_p21 | p11_minus_p21 |
        !            87:                                                        //  p00_minus_p20 | p10_minus_p20
        !            88:        fxch    %st(4)                  // p10_minus_p20 | p01_minus_p21 | p11_minus_p21 |
        !            89:                                                        //  p00_minus_p20 | d_xdenom
        !            90:        fstps   p10_minus_p20   // p01_minus_p21 | p11_minus_p21 |
        !            91:                                                        //  p00_minus_p20 | d_xdenom
        !            92:        fstps   p01_minus_p21   // p11_minus_p21 | p00_minus_p20 | xstepdenominv
        !            93:        fxch    %st(2)                  // xstepdenominv | p00_minus_p20 | p11_minus_p21
        !            94: 
        !            95: //// ceil () for light so positive steps are exaggerated, negative steps
        !            96: //// diminished,  pushing us away from underflow toward overflow. Underflow is
        !            97: //// very visible, overflow is very unlikely, because of ambient lighting
        !            98: //     t0 = r_p0[4] - r_p2[4];
        !            99: //     t1 = r_p1[4] - r_p2[4];
        !           100: 
        !           101:        fildl   C(r_p2)+16              // r_p2[4] | xstepdenominv | p00_minus_p20 |
        !           102:                                                        //  p11_minus_p21
        !           103:        fildl   C(r_p0)+16              // r_p0[4] | r_p2[4] | xstepdenominv |
        !           104:                                                        //  p00_minus_p20 | p11_minus_p21
        !           105:        fildl   C(r_p1)+16              // r_p1[4] | r_p0[4] | r_p2[4] | xstepdenominv |
        !           106:                                                        //  p00_minus_p20 | p11_minus_p21
        !           107:        fxch    %st(2)                  // r_p2[4] | r_p0[4] | r_p1[4] | xstepdenominv |
        !           108:                                                        //  p00_minus_p20 | p11_minus_p21
        !           109:        fld             %st(0)                  // r_p2[4] | r_p2[4] | r_p0[4] | r_p1[4] |
        !           110:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           111:        fsubrp  %st(0),%st(2)   // r_p2[4] | t0 | r_p1[4] | xstepdenominv |
        !           112:                                                        //  p00_minus_p20 | p11_minus_p21
        !           113:        fsubrp  %st(0),%st(2)   // t0 | t1 | xstepdenominv | p00_minus_p20 |
        !           114:                                                        //  p11_minus_p21
        !           115: 
        !           116: //     r_lstepx = (int)
        !           117: //                     ceil((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv);
        !           118: //     r_lstepy = (int)
        !           119: //                     ceil((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv);
        !           120: 
        !           121:        fld             %st(0)                  // t0 | t0 | t1 | xstepdenominv | p00_minus_p20 |
        !           122:                                                        //  p11_minus_p21
        !           123:        fmul    %st(5),%st(0)   // t0*p11_minus_p21 | t0 | t1 | xstepdenominv |
        !           124:                                                        //  p00_minus_p20 | p11_minus_p21
        !           125:        fxch    %st(2)                  // t1 | t0 | t0*p11_minus_p21 | xstepdenominv |
        !           126:                                                        //  p00_minus_p20 | p11_minus_p21
        !           127:        fld             %st(0)                  // t1 | t1 | t0 | t0*p11_minus_p21 |
        !           128:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           129:        fmuls   p01_minus_p21   // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 |
        !           130:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           131:        fxch    %st(2)                  // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 |
        !           132:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           133:        fmuls   p10_minus_p20   // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
        !           134:                                                        //  t0*p11_minus_p21 | xstepdenominv |
        !           135:                                                        //  p00_minus_p20 | p11_minus_p21
        !           136:        fxch    %st(1)                  // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
        !           137:                                                        //  t0*p11_minus_p21 | xstepdenominv |
        !           138:                                                        //  p00_minus_p20 | p11_minus_p21
        !           139:        fmul    %st(5),%st(0)   // t1*p00_minus_p20 | t0*p10_minus_p20 |
        !           140:                                                        //  t1*p01_minus_p21 | t0*p11_minus_p21 |
        !           141:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           142:        fxch    %st(2)                  // t1*p01_minus_p21 | t0*p10_minus_p20 |
        !           143:                                                        //  t1*p00_minus_p20 | t0*p11_minus_p21 |
        !           144:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           145:        fsubp   %st(0),%st(3)   // t0*p10_minus_p20 | t1*p00_minus_p20 |
        !           146:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           147:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           148:        fsubrp  %st(0),%st(1)   // t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           149:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           150:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           151:        fld             %st(2)                  // xstepdenominv |
        !           152:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           153:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           154:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           155:        fmuls   float_minus_1   // ystepdenominv |
        !           156:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           157:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           158:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           159:        fxch    %st(2)                  // t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           160:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           161:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           162:                                                        //  p11_minus_p21
        !           163:        fmul    %st(3),%st(0)   // (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           164:                                                        //   xstepdenominv |
        !           165:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           166:                                                        //   | ystepdenominv | xstepdenominv |
        !           167:                                                        //   p00_minus_p20 | p11_minus_p21
        !           168:        fxch    %st(1)                  // t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           169:                                                        //  (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           170:                                                        //   xstepdenominv | ystepdenominv |
        !           171:                                                        //   xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           172:        fmul    %st(2),%st(0)   // (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           173:                                                        //  ystepdenominv |
        !           174:                                                        //  (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           175:                                                        //  xstepdenominv | ystepdenominv |
        !           176:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           177:        fldcw   ceil_cw
        !           178:        fistpl  C(r_lstepy)             // r_lstepx | ystepdenominv | xstepdenominv |
        !           179:                                                        //  p00_minus_p20 | p11_minus_p21
        !           180:        fistpl  C(r_lstepx)             // ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           181:                                                        //  p11_minus_p21
        !           182:        fldcw   single_cw
        !           183: 
        !           184: //     t0 = r_p0[2] - r_p2[2];
        !           185: //     t1 = r_p1[2] - r_p2[2];
        !           186: 
        !           187:        fildl   C(r_p2)+8               // r_p2[2] | ystepdenominv | xstepdenominv |
        !           188:                                                        //  p00_minus_p20 | p11_minus_p21
        !           189:        fildl   C(r_p0)+8               // r_p0[2] | r_p2[2] | ystepdenominv |
        !           190:                                                        //   xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           191:        fildl   C(r_p1)+8               // r_p1[2] | r_p0[2] | r_p2[2] | ystepdenominv |
        !           192:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           193:        fxch    %st(2)                  // r_p2[2] | r_p0[2] | r_p1[2] | ystepdenominv |
        !           194:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           195:        fld             %st(0)                  // r_p2[2] | r_p2[2] | r_p0[2] | r_p1[2] |
        !           196:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           197:                                                        //  p11_minus_p21
        !           198:        fsubrp  %st(0),%st(2)   // r_p2[2] | t0 | r_p1[2] | ystepdenominv |
        !           199:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           200:        fsubrp  %st(0),%st(2)   // t0 | t1 | ystepdenominv | xstepdenominv |
        !           201:                                                        //  p00_minus_p20 | p11_minus_p21
        !           202: 
        !           203: //     r_sstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
        !           204: //                     xstepdenominv);
        !           205: //     r_sstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
        !           206: //                     ystepdenominv);
        !           207: 
        !           208:        fld             %st(0)                  // t0 | t0 | t1 | ystepdenominv | xstepdenominv
        !           209:        fmul    %st(6),%st(0)   // t0*p11_minus_p21 | t0 | t1 | ystepdenominv |
        !           210:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           211:        fxch    %st(2)                  // t1 | t0 | t0*p11_minus_p21 | ystepdenominv |
        !           212:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           213:        fld             %st(0)                  // t1 | t1 | t0 | t0*p11_minus_p21 |
        !           214:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           215:                                                        //  p11_minus_p21
        !           216:        fmuls   p01_minus_p21   // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 |
        !           217:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           218:                                                        //  p11_minus_p21
        !           219:        fxch    %st(2)                  // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 |
        !           220:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           221:                                                        //  p11_minus_p21
        !           222:        fmuls   p10_minus_p20   // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
        !           223:                                                        //  t0*p11_minus_p21 | ystepdenominv |
        !           224:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           225:        fxch    %st(1)                  // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
        !           226:                                                        //  t0*p11_minus_p21 | ystepdenominv |
        !           227:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           228:        fmul    %st(6),%st(0)   // t1*p00_minus_p20 | t0*p10_minus_p20 |
        !           229:                                                        //  t1*p01_minus_p21 | t0*p11_minus_p21 |
        !           230:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           231:                                                        //  p11_minus_p21
        !           232:        fxch    %st(2)                  // t1*p01_minus_p21 | t0*p10_minus_p20 |
        !           233:                                                        //  t1*p00_minus_p20 | t0*p11_minus_p21 |
        !           234:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           235:                                                        //  p11_minus_p21
        !           236:        fsubp   %st(0),%st(3)   // t0*p10_minus_p20 | t1*p00_minus_p20 |
        !           237:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           238:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           239:                                                        //  p11_minus_p21
        !           240:        fsubrp  %st(0),%st(1)   // t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           241:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           242:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           243:                                                        //  p11_minus_p21
        !           244:        fmul    %st(2),%st(0)   // (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           245:                                                        //   ystepdenominv |
        !           246:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           247:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           248:                                                        //  p11_minus_p21
        !           249:        fxch    %st(1)                  // t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           250:                                                        //  (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           251:                                                        //   ystepdenominv | ystepdenominv |
        !           252:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           253:        fmul    %st(3),%st(0)   // (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           254:                                                        //  xstepdenominv |
        !           255:                                                        //  (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           256:                                                        //  ystepdenominv | ystepdenominv |
        !           257:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           258:        fxch    %st(1)                  // (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           259:                                                        //  ystepdenominv |
        !           260:                                                        //  (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           261:                                                        //  xstepdenominv | ystepdenominv |
        !           262:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           263:        fistpl  C(r_sstepy)             // r_sstepx | ystepdenominv | xstepdenominv |
        !           264:                                                        //  p00_minus_p20 | p11_minus_p21
        !           265:        fistpl  C(r_sstepx)             // ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           266:                                                        //  p11_minus_p21
        !           267: 
        !           268: //     t0 = r_p0[3] - r_p2[3];
        !           269: //     t1 = r_p1[3] - r_p2[3];
        !           270: 
        !           271:        fildl   C(r_p2)+12              // r_p2[3] | ystepdenominv | xstepdenominv |
        !           272:                                                        //  p00_minus_p20 | p11_minus_p21
        !           273:        fildl   C(r_p0)+12              // r_p0[3] | r_p2[3] | ystepdenominv |
        !           274:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           275:        fildl   C(r_p1)+12              // r_p1[3] | r_p0[3] | r_p2[3] | ystepdenominv |
        !           276:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           277:        fxch    %st(2)                  // r_p2[3] | r_p0[3] | r_p1[3] | ystepdenominv |
        !           278:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           279:        fld             %st(0)                  // r_p2[3] | r_p2[3] | r_p0[3] | r_p1[3] |
        !           280:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           281:                                                        //  p11_minus_p21
        !           282:        fsubrp  %st(0),%st(2)   // r_p2[3] | t0 | r_p1[3] | ystepdenominv |
        !           283:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           284:        fsubrp  %st(0),%st(2)   // t0 | t1 | ystepdenominv | xstepdenominv |
        !           285:                                                        //  p00_minus_p20 | p11_minus_p21
        !           286: 
        !           287: //     r_tstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
        !           288: //                     xstepdenominv);
        !           289: //     r_tstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
        !           290: //                     ystepdenominv);
        !           291: 
        !           292:        fld             %st(0)                  // t0 | t0 | t1 | ystepdenominv | xstepdenominv |
        !           293:                                                        //  p00_minus_p20 | p11_minus_p21
        !           294:        fmul    %st(6),%st(0)   // t0*p11_minus_p21 | t0 | t1 | ystepdenominv |
        !           295:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           296:        fxch    %st(2)                  // t1 | t0 | t0*p11_minus_p21 | ystepdenominv |
        !           297:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           298:        fld             %st(0)                  // t1 | t1 | t0 | t0*p11_minus_p21 |
        !           299:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           300:                                                        //  p11_minus_p21
        !           301:        fmuls   p01_minus_p21   // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 |
        !           302:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           303:                                                        //  p11_minus_p21
        !           304:        fxch    %st(2)                  // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 |
        !           305:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           306:                                                        //  p11_minus_p21
        !           307:        fmuls   p10_minus_p20   // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
        !           308:                                                        //  t0*p11_minus_p21 | ystepdenominv |
        !           309:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           310:        fxch    %st(1)                  // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
        !           311:                                                        //  t0*p11_minus_p21 | ystepdenominv |
        !           312:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           313:        fmul    %st(6),%st(0)   // t1*p00_minus_p20 | t0*p10_minus_p20 |
        !           314:                                                        //  t1*p01_minus_p21 | t0*p11_minus_p21 |
        !           315:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           316:                                                        //  p11_minus_p21
        !           317:        fxch    %st(2)                  // t1*p01_minus_p21 | t0*p10_minus_p20 |
        !           318:                                                        //  t1*p00_minus_p20 | t0*p11_minus_p21 |
        !           319:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           320:                                                        //  p11_minus_p21
        !           321:        fsubp   %st(0),%st(3)   // t0*p10_minus_p20 | t1*p00_minus_p20 |
        !           322:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           323:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           324:                                                        //  p11_minus_p21
        !           325:        fsubrp  %st(0),%st(1)   // t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           326:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           327:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           328:                                                        //  p11_minus_p21
        !           329:        fmul    %st(2),%st(0)   // (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           330:                                                        //   ystepdenominv |
        !           331:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           332:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           333:                                                        //  p11_minus_p21
        !           334:        fxch    %st(1)                  // t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           335:                                                        //  (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           336:                                                        //  ystepdenominv | ystepdenominv |
        !           337:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           338:        fmul    %st(3),%st(0)   // (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           339:                                                        //  xstepdenominv |
        !           340:                                                        //  (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           341:                                                        //  ystepdenominv | ystepdenominv |
        !           342:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           343:        fxch    %st(1)                  // (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           344:                                                        //  ystepdenominv |
        !           345:                                                        //  (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           346:                                                        //  xstepdenominv | ystepdenominv |
        !           347:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           348:        fistpl  C(r_tstepy)             // r_tstepx | ystepdenominv | xstepdenominv |
        !           349:                                                        //  p00_minus_p20 | p11_minus_p21
        !           350:        fistpl  C(r_tstepx)             // ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           351:                                                        //  p11_minus_p21
        !           352: 
        !           353: //     t0 = r_p0[5] - r_p2[5];
        !           354: //     t1 = r_p1[5] - r_p2[5];
        !           355: 
        !           356:        fildl   C(r_p2)+20              // r_p2[5] | ystepdenominv | xstepdenominv |
        !           357:                                                        //  p00_minus_p20 | p11_minus_p21
        !           358:        fildl   C(r_p0)+20              // r_p0[5] | r_p2[5] | ystepdenominv |
        !           359:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           360:        fildl   C(r_p1)+20              // r_p1[5] | r_p0[5] | r_p2[5] | ystepdenominv |
        !           361:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           362:        fxch    %st(2)                  // r_p2[5] | r_p0[5] | r_p1[5] | ystepdenominv |
        !           363:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           364:        fld             %st(0)                  // r_p2[5] | r_p2[5] | r_p0[5] | r_p1[5] |
        !           365:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           366:                                                        //  p11_minus_p21
        !           367:        fsubrp  %st(0),%st(2)   // r_p2[5] | t0 | r_p1[5] | ystepdenominv |
        !           368:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           369:        fsubrp  %st(0),%st(2)   // t0 | t1 | ystepdenominv | xstepdenominv |
        !           370:                                                        //  p00_minus_p20 | p11_minus_p21
        !           371: 
        !           372: //     r_zistepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
        !           373: //                     xstepdenominv);
        !           374: //     r_zistepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
        !           375: //                     ystepdenominv);
        !           376: 
        !           377:        fld             %st(0)                  // t0 | t0 | t1 | ystepdenominv | xstepdenominv |
        !           378:                                                        //  p00_minus_p20 | p11_minus_p21
        !           379:        fmulp   %st(0),%st(6)   // t0 | t1 | ystepdenominv | xstepdenominv |
        !           380:                                                        //  p00_minus_p20 | t0*p11_minus_p21
        !           381:        fxch    %st(1)                  // t1 | t0 | ystepdenominv | xstepdenominv |
        !           382:                                                        //  p00_minus_p20 | t0*p11_minus_p21
        !           383:        fld             %st(0)                  // t1 | t1 | t0 | ystepdenominv | xstepdenominv |
        !           384:                                                        //  p00_minus_p20 | t0*p11_minus_p21
        !           385:        fmuls   p01_minus_p21   // t1*p01_minus_p21 | t1 | t0 | ystepdenominv |
        !           386:                                                        //  xstepdenominv | p00_minus_p20 |
        !           387:                                                        //  t0*p11_minus_p21
        !           388:        fxch    %st(2)                  // t0 | t1 | t1*p01_minus_p21 | ystepdenominv |
        !           389:                                                        //  xstepdenominv | p00_minus_p20 |
        !           390:                                                        //  t0*p11_minus_p21
        !           391:        fmuls   p10_minus_p20   // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
        !           392:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           393:                                                        //  t0*p11_minus_p21
        !           394:        fxch    %st(1)                  // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
        !           395:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           396:                                                        //  t0*p11_minus_p21
        !           397:        fmulp   %st(0),%st(5)   // t0*p10_minus_p20 | t1*p01_minus_p21 |
        !           398:                                                        //  ystepdenominv | xstepdenominv |
        !           399:                                                        //  t1*p00_minus_p20 | t0*p11_minus_p21
        !           400:        fxch    %st(5)                  // t0*p11_minus_p21 | t1*p01_minus_p21 |
        !           401:                                                        //  ystepdenominv | xstepdenominv |
        !           402:                                                        //  t1*p00_minus_p20 | t0*p10_minus_p20
        !           403:        fsubrp  %st(0),%st(1)   // t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           404:                                                        //  ystepdenominv | xstepdenominv |
        !           405:                                                        //  t1*p00_minus_p20 | t0*p10_minus_p20
        !           406:        fxch    %st(3)                  // t1*p00_minus_p20 | ystepdenominv |
        !           407:                                                        //  xstepdenominv |
        !           408:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           409:                                                        //  t0*p10_minus_p20
        !           410:        fsubp   %st(0),%st(4)   // ystepdenominv | xstepdenominv |
        !           411:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           412:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20
        !           413:        fxch    %st(1)                  // xstepdenominv | ystepdenominv |
        !           414:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           415:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20
        !           416:        fmulp   %st(0),%st(2)   // ystepdenominv |
        !           417:                                                        //  (t1*p01_minus_p21 - t0*p11_minus_p21) *
        !           418:                                                        //  xstepdenominv |
        !           419:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20
        !           420:        fmulp   %st(0),%st(2)   // (t1*p01_minus_p21 - t0*p11_minus_p21) *
        !           421:                                                        //  xstepdenominv |
        !           422:                                                        //  (t1*p00_minus_p20 - t0*p10_minus_p20) *
        !           423:                                                        //  ystepdenominv
        !           424:        fistpl  C(r_zistepx)    // (t1*p00_minus_p20 - t0*p10_minus_p20) *
        !           425:                                                        //  ystepdenominv
        !           426:        fistpl  C(r_zistepy)
        !           427: 
        !           428: //     a_sstepxfrac = r_sstepx << 16;
        !           429: //     a_tstepxfrac = r_tstepx << 16;
        !           430: //
        !           431: //     a_ststepxwhole = r_affinetridesc.skinwidth * (r_tstepx >> 16) +
        !           432: //                     (r_sstepx >> 16);
        !           433: 
        !           434:        movl    C(r_sstepx),%eax
        !           435:        movl    C(r_tstepx),%edx
        !           436:        shll    $16,%eax
        !           437:        shll    $16,%edx
        !           438:        movl    %eax,C(a_sstepxfrac)
        !           439:        movl    %edx,C(a_tstepxfrac)
        !           440: 
        !           441:        movl    C(r_sstepx),%ecx
        !           442:        movl    C(r_tstepx),%eax
        !           443:        sarl    $16,%ecx
        !           444:        sarl    $16,%eax
        !           445:        imull   skinwidth(%esp)
        !           446:        addl    %ecx,%eax
        !           447:        movl    %eax,C(a_ststepxwhole)
        !           448: 
        !           449:        ret
        !           450: 
        !           451: 
        !           452: //----------------------------------------------------------------------
        !           453: // recursive subdivision affine triangle drawing code
        !           454: //
        !           455: // not C-callable because of stdcall return
        !           456: //----------------------------------------------------------------------
        !           457: 
        !           458: #define lp1    4+16
        !           459: #define lp2    8+16
        !           460: #define lp3    12+16
        !           461: 
        !           462: .globl C(D_PolysetRecursiveTriangle)
        !           463: C(D_PolysetRecursiveTriangle):
        !           464:        pushl   %ebp                            // preserve caller stack frame pointer
        !           465:        pushl   %esi                            // preserve register variables
        !           466:        pushl   %edi
        !           467:        pushl   %ebx
        !           468: 
        !           469: //     int             *temp;
        !           470: //     int             d;
        !           471: //     int             new[6];
        !           472: //     int             i;
        !           473: //     int             z;
        !           474: //     short   *zbuf;
        !           475:        movl    lp2(%esp),%esi
        !           476:        movl    lp1(%esp),%ebx
        !           477:        movl    lp3(%esp),%edi
        !           478: 
        !           479: //     d = lp2[0] - lp1[0];
        !           480: //     if (d < -1 || d > 1)
        !           481: //             goto split;
        !           482:        movl    0(%esi),%eax
        !           483: 
        !           484:        movl    0(%ebx),%edx
        !           485:        movl    4(%esi),%ebp
        !           486: 
        !           487:        subl    %edx,%eax
        !           488:        movl    4(%ebx),%ecx
        !           489: 
        !           490:        subl    %ecx,%ebp
        !           491:        incl    %eax
        !           492: 
        !           493:        cmpl    $2,%eax
        !           494:        ja              LSplit
        !           495: 
        !           496: //     d = lp2[1] - lp1[1];
        !           497: //     if (d < -1 || d > 1)
        !           498: //             goto split;
        !           499:        movl    0(%edi),%eax
        !           500:        incl    %ebp
        !           501: 
        !           502:        cmpl    $2,%ebp
        !           503:        ja              LSplit
        !           504: 
        !           505: //     d = lp3[0] - lp2[0];
        !           506: //     if (d < -1 || d > 1)
        !           507: //             goto split2;
        !           508:        movl    0(%esi),%edx
        !           509:        movl    4(%edi),%ebp
        !           510: 
        !           511:        subl    %edx,%eax
        !           512:        movl    4(%esi),%ecx
        !           513: 
        !           514:        subl    %ecx,%ebp
        !           515:        incl    %eax
        !           516: 
        !           517:        cmpl    $2,%eax
        !           518:        ja              LSplit2
        !           519: 
        !           520: //     d = lp3[1] - lp2[1];
        !           521: //     if (d < -1 || d > 1)
        !           522: //             goto split2;
        !           523:        movl    0(%ebx),%eax
        !           524:        incl    %ebp
        !           525: 
        !           526:        cmpl    $2,%ebp
        !           527:        ja              LSplit2
        !           528: 
        !           529: //     d = lp1[0] - lp3[0];
        !           530: //     if (d < -1 || d > 1)
        !           531: //             goto split3;
        !           532:        movl    0(%edi),%edx
        !           533:        movl    4(%ebx),%ebp
        !           534: 
        !           535:        subl    %edx,%eax
        !           536:        movl    4(%edi),%ecx
        !           537: 
        !           538:        subl    %ecx,%ebp
        !           539:        incl    %eax
        !           540: 
        !           541:        incl    %ebp
        !           542:        movl    %ebx,%edx
        !           543: 
        !           544:        cmpl    $2,%eax
        !           545:        ja              LSplit3
        !           546: 
        !           547: //     d = lp1[1] - lp3[1];
        !           548: //     if (d < -1 || d > 1)
        !           549: //     {
        !           550: //split3:
        !           551: //             temp = lp1;
        !           552: //             lp3 = lp2;
        !           553: //             lp1 = lp3;
        !           554: //             lp2 = temp;
        !           555: //             goto split;
        !           556: //     }
        !           557: //
        !           558: //     return;                 // entire tri is filled
        !           559: //
        !           560:        cmpl    $2,%ebp
        !           561:        jna             LDone
        !           562: 
        !           563: LSplit3:
        !           564:        movl    %edi,%ebx
        !           565:        movl    %esi,%edi
        !           566:        movl    %edx,%esi
        !           567:        jmp             LSplit
        !           568: 
        !           569: //split2:
        !           570: LSplit2:
        !           571: 
        !           572: //     temp = lp1;
        !           573: //     lp1 = lp2;
        !           574: //     lp2 = lp3;
        !           575: //     lp3 = temp;
        !           576:        movl    %ebx,%eax
        !           577:        movl    %esi,%ebx
        !           578:        movl    %edi,%esi
        !           579:        movl    %eax,%edi
        !           580: 
        !           581: //split:
        !           582: LSplit:
        !           583: 
        !           584:        subl    $24,%esp                // allocate space for a new vertex
        !           585: 
        !           586: //// split this edge
        !           587: //     new[0] = (lp1[0] + lp2[0]) >> 1;
        !           588: //     new[1] = (lp1[1] + lp2[1]) >> 1;
        !           589: //     new[2] = (lp1[2] + lp2[2]) >> 1;
        !           590: //     new[3] = (lp1[3] + lp2[3]) >> 1;
        !           591: //     new[5] = (lp1[5] + lp2[5]) >> 1;
        !           592:        movl    8(%ebx),%eax
        !           593: 
        !           594:        movl    8(%esi),%edx
        !           595:        movl    12(%ebx),%ecx
        !           596: 
        !           597:        addl    %edx,%eax
        !           598:        movl    12(%esi),%edx
        !           599: 
        !           600:        sarl    $1,%eax
        !           601:        addl    %edx,%ecx
        !           602: 
        !           603:        movl    %eax,8(%esp)
        !           604:        movl    20(%ebx),%eax
        !           605: 
        !           606:        sarl    $1,%ecx
        !           607:        movl    20(%esi),%edx
        !           608: 
        !           609:        movl    %ecx,12(%esp)
        !           610:        addl    %edx,%eax
        !           611: 
        !           612:        movl    0(%ebx),%ecx
        !           613:        movl    0(%esi),%edx
        !           614: 
        !           615:        sarl    $1,%eax
        !           616:        addl    %ecx,%edx
        !           617: 
        !           618:        movl    %eax,20(%esp)
        !           619:        movl    4(%ebx),%eax
        !           620: 
        !           621:        sarl    $1,%edx
        !           622:        movl    4(%esi),%ebp
        !           623: 
        !           624:        movl    %edx,0(%esp)
        !           625:        addl    %eax,%ebp
        !           626: 
        !           627:        sarl    $1,%ebp
        !           628:        movl    %ebp,4(%esp)
        !           629: 
        !           630: //// draw the point if splitting a leading edge
        !           631: //     if (lp2[1] > lp1[1])
        !           632: //             goto nodraw;
        !           633:        cmpl    %eax,4(%esi)
        !           634:        jg              LNoDraw
        !           635: 
        !           636: //     if ((lp2[1] == lp1[1]) && (lp2[0] < lp1[0]))
        !           637: //             goto nodraw;
        !           638:        movl    0(%esi),%edx
        !           639:        jnz             LDraw
        !           640: 
        !           641:        cmpl    %ecx,%edx
        !           642:        jl              LNoDraw
        !           643: 
        !           644: LDraw:
        !           645: 
        !           646: // z = new[5] >> 16;
        !           647:        movl    20(%esp),%edx
        !           648:        movl    4(%esp),%ecx
        !           649: 
        !           650:        sarl    $16,%edx
        !           651:        movl    0(%esp),%ebp
        !           652: 
        !           653: //     zbuf = zspantable[new[1]] + new[0];
        !           654:        movl    C(zspantable)(,%ecx,4),%eax
        !           655: 
        !           656: //     if (z >= *zbuf)
        !           657: //     {
        !           658:        cmpw    (%eax,%ebp,2),%dx
        !           659:        jnge    LNoDraw
        !           660: 
        !           661: //             int             pix;
        !           662: //             
        !           663: //             *zbuf = z;
        !           664:        movw    %dx,(%eax,%ebp,2)
        !           665: 
        !           666: //             pix = d_pcolormap[skintable[new[3]>>16][new[2]>>16]];
        !           667:        movl    12(%esp),%eax
        !           668: 
        !           669:        sarl    $16,%eax
        !           670:        movl    8(%esp),%edx
        !           671: 
        !           672:        sarl    $16,%edx
        !           673:        subl    %ecx,%ecx
        !           674: 
        !           675:        movl    C(skintable)(,%eax,4),%eax
        !           676:        movl    4(%esp),%ebp
        !           677: 
        !           678:        movb    (%eax,%edx,),%cl
        !           679:        movl    C(d_pcolormap),%edx
        !           680: 
        !           681:        movb    (%edx,%ecx,),%dl
        !           682:        movl    0(%esp),%ecx
        !           683: 
        !           684: //             d_viewbuffer[d_scantable[new[1]] + new[0]] = pix;
        !           685:        movl    C(d_scantable)(,%ebp,4),%eax
        !           686:        addl    %eax,%ecx
        !           687:        movl    C(d_viewbuffer),%eax
        !           688:        movb    %dl,(%eax,%ecx,1)
        !           689: 
        !           690: //     }
        !           691: //
        !           692: //nodraw:
        !           693: LNoDraw:
        !           694: 
        !           695: //// recursively continue
        !           696: //     D_PolysetRecursiveTriangle (lp3, lp1, new);
        !           697:        pushl   %esp
        !           698:        pushl   %ebx
        !           699:        pushl   %edi
        !           700:        call    C(D_PolysetRecursiveTriangle)
        !           701: 
        !           702: //     D_PolysetRecursiveTriangle (lp3, new, lp2);
        !           703:        movl    %esp,%ebx
        !           704:        pushl   %esi
        !           705:        pushl   %ebx
        !           706:        pushl   %edi
        !           707:        call    C(D_PolysetRecursiveTriangle)
        !           708:        addl    $24,%esp
        !           709: 
        !           710: LDone:
        !           711:        popl    %ebx                            // restore register variables
        !           712:        popl    %edi
        !           713:        popl    %esi
        !           714:        popl    %ebp                            // restore caller stack frame pointer
        !           715:        ret             $12
        !           716: 
        !           717: 
        !           718: //----------------------------------------------------------------------
        !           719: // 8-bpp horizontal span drawing code for affine polygons, with smooth
        !           720: // shading and no transparency
        !           721: //----------------------------------------------------------------------
        !           722: 
        !           723: #define pspans 4+8
        !           724: 
        !           725: .globl C(D_PolysetAff8Start)
        !           726: C(D_PolysetAff8Start):
        !           727: 
        !           728: .globl C(D_PolysetDrawSpans8)
        !           729: C(D_PolysetDrawSpans8):
        !           730:        pushl   %esi                            // preserve register variables
        !           731:        pushl   %ebx
        !           732: 
        !           733:        movl    pspans(%esp),%esi       // point to the first span descriptor
        !           734:        movl    C(r_zistepx),%ecx
        !           735: 
        !           736:        pushl   %ebp                            // preserve caller's stack frame
        !           737:        pushl   %edi
        !           738: 
        !           739:        rorl    $16,%ecx                        // put high 16 bits of 1/z step in low word
        !           740:        movl    spanpackage_t_count(%esi),%edx
        !           741: 
        !           742:        movl    %ecx,lzistepx
        !           743: 
        !           744: LSpanLoop:
        !           745: 
        !           746: //             lcount = d_aspancount - pspanpackage->count;
        !           747: //
        !           748: //             errorterm += erroradjustup;
        !           749: //             if (errorterm >= 0)
        !           750: //             {
        !           751: //                     d_aspancount += d_countextrastep;
        !           752: //                     errorterm -= erroradjustdown;
        !           753: //             }
        !           754: //             else
        !           755: //             {
        !           756: //                     d_aspancount += ubasestep;
        !           757: //             }
        !           758:        movl    C(d_aspancount),%eax
        !           759:        subl    %edx,%eax
        !           760: 
        !           761:        movl    C(erroradjustup),%edx
        !           762:        movl    C(errorterm),%ebx
        !           763:        addl    %edx,%ebx
        !           764:        js              LNoTurnover
        !           765: 
        !           766:        movl    C(erroradjustdown),%edx
        !           767:        movl    C(d_countextrastep),%edi
        !           768:        subl    %edx,%ebx
        !           769:        movl    C(d_aspancount),%ebp
        !           770:        movl    %ebx,C(errorterm)
        !           771:        addl    %edi,%ebp
        !           772:        movl    %ebp,C(d_aspancount)
        !           773:        jmp             LRightEdgeStepped
        !           774: 
        !           775: LNoTurnover:
        !           776:        movl    C(d_aspancount),%edi
        !           777:        movl    C(ubasestep),%edx
        !           778:        movl    %ebx,C(errorterm)
        !           779:        addl    %edx,%edi
        !           780:        movl    %edi,C(d_aspancount)
        !           781: 
        !           782: LRightEdgeStepped:
        !           783:        cmpl    $1,%eax
        !           784: 
        !           785:        jl              LNextSpan
        !           786:        jz              LExactlyOneLong
        !           787: 
        !           788: //
        !           789: // set up advancetable
        !           790: //
        !           791:        movl    C(a_ststepxwhole),%ecx
        !           792:        movl    C(r_affinetridesc)+atd_skinwidth,%edx
        !           793: 
        !           794:        movl    %ecx,advancetable+4     // advance base in t
        !           795:        addl    %edx,%ecx
        !           796: 
        !           797:        movl    %ecx,advancetable       // advance extra in t
        !           798:        movl    C(a_tstepxfrac),%ecx
        !           799: 
        !           800:        movw    C(r_lstepx),%cx
        !           801:        movl    %eax,%edx                       // count
        !           802: 
        !           803:        movl    %ecx,tstep
        !           804:        addl    $7,%edx
        !           805: 
        !           806:        shrl    $3,%edx                         // count of full and partial loops
        !           807:        movl    spanpackage_t_sfrac(%esi),%ebx
        !           808: 
        !           809:        movw    %dx,%bx
        !           810:        movl    spanpackage_t_pz(%esi),%ecx
        !           811: 
        !           812:        negl    %eax
        !           813: 
        !           814:        movl    spanpackage_t_pdest(%esi),%edi
        !           815:        andl    $7,%eax         // 0->0, 1->7, 2->6, ... , 7->1
        !           816: 
        !           817:        subl    %eax,%edi       // compensate for hardwired offsets
        !           818:        subl    %eax,%ecx
        !           819: 
        !           820:        subl    %eax,%ecx
        !           821:        movl    spanpackage_t_tfrac(%esi),%edx
        !           822: 
        !           823:        movw    spanpackage_t_light(%esi),%dx
        !           824:        movl    spanpackage_t_zi(%esi),%ebp
        !           825: 
        !           826:        rorl    $16,%ebp        // put high 16 bits of 1/z in low word
        !           827:        pushl   %esi
        !           828: 
        !           829:        movl    spanpackage_t_ptex(%esi),%esi
        !           830:        jmp             aff8entryvec_table(,%eax,4)
        !           831: 
        !           832: // %bx = count of full and partial loops
        !           833: // %ebx high word = sfrac
        !           834: // %ecx = pz
        !           835: // %dx = light
        !           836: // %edx high word = tfrac
        !           837: // %esi = ptex
        !           838: // %edi = pdest
        !           839: // %ebp = 1/z
        !           840: // tstep low word = C(r_lstepx)
        !           841: // tstep high word = C(a_tstepxfrac)
        !           842: // C(a_sstepxfrac) low word = 0
        !           843: // C(a_sstepxfrac) high word = C(a_sstepxfrac)
        !           844: 
        !           845: LDrawLoop:
        !           846: 
        !           847: // FIXME: do we need to clamp light? We may need at least a buffer bit to
        !           848: // keep it from poking into tfrac and causing problems
        !           849: 
        !           850: LDraw8:
        !           851:        cmpw    (%ecx),%bp
        !           852:        jl              Lp1
        !           853:        xorl    %eax,%eax
        !           854:        movb    %dh,%ah
        !           855:        movb    (%esi),%al
        !           856:        movw    %bp,(%ecx)
        !           857:        movb    0x12345678(%eax),%al
        !           858: LPatch8:
        !           859:        movb    %al,(%edi)
        !           860: Lp1:
        !           861:        addl    tstep,%edx
        !           862:        sbbl    %eax,%eax
        !           863:        addl    lzistepx,%ebp
        !           864:        adcl    $0,%ebp
        !           865:        addl    C(a_sstepxfrac),%ebx
        !           866:        adcl    advancetable+4(,%eax,4),%esi
        !           867: 
        !           868: LDraw7:
        !           869:        cmpw    2(%ecx),%bp
        !           870:        jl              Lp2
        !           871:        xorl    %eax,%eax
        !           872:        movb    %dh,%ah
        !           873:        movb    (%esi),%al
        !           874:        movw    %bp,2(%ecx)
        !           875:        movb    0x12345678(%eax),%al
        !           876: LPatch7:
        !           877:        movb    %al,1(%edi)
        !           878: Lp2:
        !           879:        addl    tstep,%edx
        !           880:        sbbl    %eax,%eax
        !           881:        addl    lzistepx,%ebp
        !           882:        adcl    $0,%ebp
        !           883:        addl    C(a_sstepxfrac),%ebx
        !           884:        adcl    advancetable+4(,%eax,4),%esi
        !           885: 
        !           886: LDraw6:
        !           887:        cmpw    4(%ecx),%bp
        !           888:        jl              Lp3
        !           889:        xorl    %eax,%eax
        !           890:        movb    %dh,%ah
        !           891:        movb    (%esi),%al
        !           892:        movw    %bp,4(%ecx)
        !           893:        movb    0x12345678(%eax),%al
        !           894: LPatch6:
        !           895:        movb    %al,2(%edi)
        !           896: Lp3:
        !           897:        addl    tstep,%edx
        !           898:        sbbl    %eax,%eax
        !           899:        addl    lzistepx,%ebp
        !           900:        adcl    $0,%ebp
        !           901:        addl    C(a_sstepxfrac),%ebx
        !           902:        adcl    advancetable+4(,%eax,4),%esi
        !           903: 
        !           904: LDraw5:
        !           905:        cmpw    6(%ecx),%bp
        !           906:        jl              Lp4
        !           907:        xorl    %eax,%eax
        !           908:        movb    %dh,%ah
        !           909:        movb    (%esi),%al
        !           910:        movw    %bp,6(%ecx)
        !           911:        movb    0x12345678(%eax),%al
        !           912: LPatch5:
        !           913:        movb    %al,3(%edi)
        !           914: Lp4:
        !           915:        addl    tstep,%edx
        !           916:        sbbl    %eax,%eax
        !           917:        addl    lzistepx,%ebp
        !           918:        adcl    $0,%ebp
        !           919:        addl    C(a_sstepxfrac),%ebx
        !           920:        adcl    advancetable+4(,%eax,4),%esi
        !           921: 
        !           922: LDraw4:
        !           923:        cmpw    8(%ecx),%bp
        !           924:        jl              Lp5
        !           925:        xorl    %eax,%eax
        !           926:        movb    %dh,%ah
        !           927:        movb    (%esi),%al
        !           928:        movw    %bp,8(%ecx)
        !           929:        movb    0x12345678(%eax),%al
        !           930: LPatch4:
        !           931:        movb    %al,4(%edi)
        !           932: Lp5:
        !           933:        addl    tstep,%edx
        !           934:        sbbl    %eax,%eax
        !           935:        addl    lzistepx,%ebp
        !           936:        adcl    $0,%ebp
        !           937:        addl    C(a_sstepxfrac),%ebx
        !           938:        adcl    advancetable+4(,%eax,4),%esi
        !           939: 
        !           940: LDraw3:
        !           941:        cmpw    10(%ecx),%bp
        !           942:        jl              Lp6
        !           943:        xorl    %eax,%eax
        !           944:        movb    %dh,%ah
        !           945:        movb    (%esi),%al
        !           946:        movw    %bp,10(%ecx)
        !           947:        movb    0x12345678(%eax),%al
        !           948: LPatch3:
        !           949:        movb    %al,5(%edi)
        !           950: Lp6:
        !           951:        addl    tstep,%edx
        !           952:        sbbl    %eax,%eax
        !           953:        addl    lzistepx,%ebp
        !           954:        adcl    $0,%ebp
        !           955:        addl    C(a_sstepxfrac),%ebx
        !           956:        adcl    advancetable+4(,%eax,4),%esi
        !           957: 
        !           958: LDraw2:
        !           959:        cmpw    12(%ecx),%bp
        !           960:        jl              Lp7
        !           961:        xorl    %eax,%eax
        !           962:        movb    %dh,%ah
        !           963:        movb    (%esi),%al
        !           964:        movw    %bp,12(%ecx)
        !           965:        movb    0x12345678(%eax),%al
        !           966: LPatch2:
        !           967:        movb    %al,6(%edi)
        !           968: Lp7:
        !           969:        addl    tstep,%edx
        !           970:        sbbl    %eax,%eax
        !           971:        addl    lzistepx,%ebp
        !           972:        adcl    $0,%ebp
        !           973:        addl    C(a_sstepxfrac),%ebx
        !           974:        adcl    advancetable+4(,%eax,4),%esi
        !           975: 
        !           976: LDraw1:
        !           977:        cmpw    14(%ecx),%bp
        !           978:        jl              Lp8
        !           979:        xorl    %eax,%eax
        !           980:        movb    %dh,%ah
        !           981:        movb    (%esi),%al
        !           982:        movw    %bp,14(%ecx)
        !           983:        movb    0x12345678(%eax),%al
        !           984: LPatch1:
        !           985:        movb    %al,7(%edi)
        !           986: Lp8:
        !           987:        addl    tstep,%edx
        !           988:        sbbl    %eax,%eax
        !           989:        addl    lzistepx,%ebp
        !           990:        adcl    $0,%ebp
        !           991:        addl    C(a_sstepxfrac),%ebx
        !           992:        adcl    advancetable+4(,%eax,4),%esi
        !           993: 
        !           994:        addl    $8,%edi
        !           995:        addl    $16,%ecx
        !           996: 
        !           997:        decw    %bx
        !           998:        jnz             LDrawLoop
        !           999: 
        !          1000:        popl    %esi                            // restore spans pointer
        !          1001: LNextSpan:
        !          1002:        addl    $(spanpackage_t_size),%esi      // point to next span
        !          1003: LNextSpanESISet:
        !          1004:        movl    spanpackage_t_count(%esi),%edx
        !          1005:        cmpl    $-999999,%edx           // any more spans?
        !          1006:        jnz             LSpanLoop                       // yes
        !          1007: 
        !          1008:        popl    %edi
        !          1009:        popl    %ebp                            // restore the caller's stack frame
        !          1010:        popl    %ebx                            // restore register variables
        !          1011:        popl    %esi
        !          1012:        ret
        !          1013: 
        !          1014: 
        !          1015: // draw a one-long span
        !          1016: 
        !          1017: LExactlyOneLong:
        !          1018: 
        !          1019:        movl    spanpackage_t_pz(%esi),%ecx
        !          1020:        movl    spanpackage_t_zi(%esi),%ebp
        !          1021: 
        !          1022:        rorl    $16,%ebp        // put high 16 bits of 1/z in low word
        !          1023:        movl    spanpackage_t_ptex(%esi),%ebx
        !          1024: 
        !          1025:        cmpw    (%ecx),%bp
        !          1026:        jl              LNextSpan
        !          1027:        xorl    %eax,%eax
        !          1028:        movl    spanpackage_t_pdest(%esi),%edi
        !          1029:        movb    spanpackage_t_light+1(%esi),%ah
        !          1030:        addl    $(spanpackage_t_size),%esi      // point to next span
        !          1031:        movb    (%ebx),%al
        !          1032:        movw    %bp,(%ecx)
        !          1033:        movb    0x12345678(%eax),%al
        !          1034: LPatch9:
        !          1035:        movb    %al,(%edi)
        !          1036: 
        !          1037:        jmp             LNextSpanESISet
        !          1038: 
        !          1039: .globl C(D_PolysetAff8End)
        !          1040: C(D_PolysetAff8End):
        !          1041: 
        !          1042: 
        !          1043: #define pcolormap              4
        !          1044: 
        !          1045: .globl C(D_Aff8Patch)
        !          1046: C(D_Aff8Patch):
        !          1047:        movl    pcolormap(%esp),%eax
        !          1048:        movl    %eax,LPatch1-4
        !          1049:        movl    %eax,LPatch2-4
        !          1050:        movl    %eax,LPatch3-4
        !          1051:        movl    %eax,LPatch4-4
        !          1052:        movl    %eax,LPatch5-4
        !          1053:        movl    %eax,LPatch6-4
        !          1054:        movl    %eax,LPatch7-4
        !          1055:        movl    %eax,LPatch8-4
        !          1056:        movl    %eax,LPatch9-4
        !          1057: 
        !          1058:        ret
        !          1059: 
        !          1060: 
        !          1061: //----------------------------------------------------------------------
        !          1062: // Alias model polygon dispatching code, combined with subdivided affine
        !          1063: // triangle drawing code
        !          1064: //----------------------------------------------------------------------
        !          1065: 
        !          1066: .globl C(D_PolysetDraw)
        !          1067: C(D_PolysetDraw):
        !          1068: 
        !          1069: //     spanpackage_t   spans[DPS_MAXSPANS + 1 +
        !          1070: //                     ((CACHE_SIZE - 1) / sizeof(spanpackage_t)) + 1];
        !          1071: //                                             // one extra because of cache line pretouching
        !          1072: //
        !          1073: //     a_spans = (spanpackage_t *)
        !          1074: //                     (((long)&spans[0] + CACHE_SIZE - 1) & ~(CACHE_SIZE - 1));
        !          1075:        subl    $(SPAN_SIZE),%esp
        !          1076:        movl    %esp,%eax
        !          1077:        addl    $(CACHE_SIZE - 1),%eax
        !          1078:        andl    $(~(CACHE_SIZE - 1)),%eax
        !          1079:        movl    %eax,C(a_spans)
        !          1080: 
        !          1081: //     if (r_affinetridesc.drawtype)
        !          1082: //             D_DrawSubdiv ();
        !          1083: //     else
        !          1084: //             D_DrawNonSubdiv ();
        !          1085:        movl    C(r_affinetridesc)+atd_drawtype,%eax
        !          1086:        testl   %eax,%eax
        !          1087:        jz              C(D_DrawNonSubdiv)
        !          1088: 
        !          1089:        pushl   %ebp                            // preserve caller stack frame pointer
        !          1090: 
        !          1091: //     lnumtriangles = r_affinetridesc.numtriangles;
        !          1092:        movl    C(r_affinetridesc)+atd_numtriangles,%ebp
        !          1093: 
        !          1094:        pushl   %esi                            // preserve register variables
        !          1095:        shll    $4,%ebp
        !          1096: 
        !          1097:        pushl   %ebx
        !          1098: //     ptri = r_affinetridesc.ptriangles;
        !          1099:        movl    C(r_affinetridesc)+atd_ptriangles,%ebx
        !          1100: 
        !          1101:        pushl   %edi
        !          1102: 
        !          1103: //     mtriangle_t             *ptri;
        !          1104: //     finalvert_t             *pfv, *index0, *index1, *index2;
        !          1105: //     int                             i;
        !          1106: //     int                             lnumtriangles;
        !          1107: //     int                             s0, s1, s2;
        !          1108: 
        !          1109: //     pfv = r_affinetridesc.pfinalverts;
        !          1110:        movl    C(r_affinetridesc)+atd_pfinalverts,%edi
        !          1111: 
        !          1112: //     for (i=0 ; i<lnumtriangles ; i++)
        !          1113: //     {
        !          1114: 
        !          1115: Llooptop:
        !          1116: 
        !          1117: //             index0 = pfv + ptri[i].vertindex[0];
        !          1118: //             index1 = pfv + ptri[i].vertindex[1];
        !          1119: //             index2 = pfv + ptri[i].vertindex[2];
        !          1120:        movl    mtri_vertindex-16+0(%ebx,%ebp,),%ecx
        !          1121:        movl    mtri_vertindex-16+4(%ebx,%ebp,),%esi
        !          1122: 
        !          1123:        shll    $(fv_shift),%ecx
        !          1124:        movl    mtri_vertindex-16+8(%ebx,%ebp,),%edx
        !          1125: 
        !          1126:        shll    $(fv_shift),%esi
        !          1127:        addl    %edi,%ecx
        !          1128: 
        !          1129:        shll    $(fv_shift),%edx
        !          1130:        addl    %edi,%esi
        !          1131: 
        !          1132:        addl    %edi,%edx
        !          1133: 
        !          1134: //             if (((index0->v[1]-index1->v[1]) *
        !          1135: //                             (index0->v[0]-index2->v[0]) -
        !          1136: //                             (index0->v[0]-index1->v[0])*(index0->v[1]-index2->v[1])) >= 0)
        !          1137: //             {
        !          1138: //                     continue;
        !          1139: //             }
        !          1140: //
        !          1141: //             d_pcolormap = &((byte *)acolormap)[index0->v[4] & 0xFF00];
        !          1142:        fildl   fv_v+4(%ecx)    // i0v1
        !          1143:        fildl   fv_v+4(%esi)    // i1v1 | i0v1
        !          1144:        fildl   fv_v+0(%ecx)    // i0v0 | i1v1 | i0v1
        !          1145:        fildl   fv_v+0(%edx)    // i2v0 | i0v0 | i1v1 | i0v1
        !          1146:        fxch    %st(2)                  // i1v1 | i0v0 | i2v0 | i0v1
        !          1147:        fsubr   %st(3),%st(0)   // i0v1-i1v1 | i0v0 | i2v0 | i0v1
        !          1148:        fildl   fv_v+0(%esi)    // i1v0 | i0v1-i1v1 | i0v0 | i2v0 | i0v1
        !          1149:        fxch    %st(2)                  // i0v0 | i0v1-i1v1 | i1v0 | i2v0 | i0v1
        !          1150:        fsub    %st(0),%st(3)   // i0v0 | i0v1-i1v1 | i1v0 | i0v0-i2v0 | i0v1
        !          1151:        fildl   fv_v+4(%edx)    // i2v1 | i0v0 | i0v1-i1v1 | i1v0 | i0v0-i2v0| i0v1
        !          1152:        fxch    %st(1)                  // i0v0 | i2v1 | i0v1-i1v1 | i1v0 | i0v0-i2v0| i0v1
        !          1153:        fsubp   %st(0),%st(3)   // i2v1 | i0v1-i1v1 | i0v0-i1v0 | i0v0-i2v0 | i0v1
        !          1154:        fxch    %st(1)                  // i0v1-i1v1 | i2v1 | i0v0-i1v0 | i0v0-i2v0 | i0v1
        !          1155:        fmulp   %st(0),%st(3)   // i2v1 | i0v0-i1v0 | i0v1-i1v1*i0v0-i2v0 | i0v1
        !          1156:        fsubrp  %st(0),%st(3)   // i0v0-i1v0 | i0v1-i1v1*i0v0-i2v0 | i0v1-i2v1
        !          1157:        movl    fv_v+16(%ecx),%eax
        !          1158:        andl    $0xFF00,%eax
        !          1159:        fmulp   %st(0),%st(2)   // i0v1-i1v1*i0v0-i2v0 | i0v0-i1v0*i0v1-i2v1
        !          1160:        addl    C(acolormap),%eax
        !          1161:        fsubp   %st(0),%st(1)   // (i0v1-i1v1)*(i0v0-i2v0)-(i0v0-i1v0)*(i0v1-i2v1)
        !          1162:        movl    %eax,C(d_pcolormap)
        !          1163:        fstps   Ltemp
        !          1164:        movl    Ltemp,%eax
        !          1165:        subl    $0x80000001,%eax
        !          1166:        jc              Lskip
        !          1167: 
        !          1168: //             if (ptri[i].facesfront)
        !          1169: //             {
        !          1170: //                     D_PolysetRecursiveTriangle(index0->v, index1->v, index2->v);
        !          1171:        movl    mtri_facesfront-16(%ebx,%ebp,),%eax
        !          1172:        testl   %eax,%eax
        !          1173:        jz              Lfacesback
        !          1174: 
        !          1175:        pushl   %edx
        !          1176:        pushl   %esi
        !          1177:        pushl   %ecx
        !          1178:        call    C(D_PolysetRecursiveTriangle)
        !          1179: 
        !          1180:        subl    $16,%ebp
        !          1181:        jnz             Llooptop
        !          1182:        jmp             Ldone2
        !          1183: 
        !          1184: //             }
        !          1185: //             else
        !          1186: //             {
        !          1187: Lfacesback:
        !          1188: 
        !          1189: //                     s0 = index0->v[2];
        !          1190: //                     s1 = index1->v[2];
        !          1191: //                     s2 = index2->v[2];
        !          1192:        movl    fv_v+8(%ecx),%eax
        !          1193:        pushl   %eax
        !          1194:        movl    fv_v+8(%esi),%eax
        !          1195:        pushl   %eax
        !          1196:        movl    fv_v+8(%edx),%eax
        !          1197:        pushl   %eax
        !          1198:        pushl   %ecx
        !          1199:        pushl   %edx
        !          1200: 
        !          1201: //                     if (index0->flags & ALIAS_ONSEAM)
        !          1202: //                             index0->v[2] += r_affinetridesc.seamfixupX16;
        !          1203:        movl    C(r_affinetridesc)+atd_seamfixupX16,%eax
        !          1204:        testl   $(ALIAS_ONSEAM),fv_flags(%ecx)
        !          1205:        jz              Lp11
        !          1206:        addl    %eax,fv_v+8(%ecx)
        !          1207: Lp11:
        !          1208: 
        !          1209: //                     if (index1->flags & ALIAS_ONSEAM)
        !          1210: //                             index1->v[2] += r_affinetridesc.seamfixupX16;
        !          1211:        testl   $(ALIAS_ONSEAM),fv_flags(%esi)
        !          1212:        jz              Lp12
        !          1213:        addl    %eax,fv_v+8(%esi)
        !          1214: Lp12:
        !          1215: 
        !          1216: //                     if (index2->flags & ALIAS_ONSEAM)
        !          1217: //                             index2->v[2] += r_affinetridesc.seamfixupX16;
        !          1218:        testl   $(ALIAS_ONSEAM),fv_flags(%edx)
        !          1219:        jz              Lp13
        !          1220:        addl    %eax,fv_v+8(%edx)
        !          1221: Lp13:
        !          1222: 
        !          1223: //                     D_PolysetRecursiveTriangle(index0->v, index1->v, index2->v);
        !          1224:        pushl   %edx
        !          1225:        pushl   %esi
        !          1226:        pushl   %ecx
        !          1227:        call    C(D_PolysetRecursiveTriangle)
        !          1228: 
        !          1229: //                     index0->v[2] = s0;
        !          1230: //                     index1->v[2] = s1;
        !          1231: //                     index2->v[2] = s2;
        !          1232:        popl    %edx
        !          1233:        popl    %ecx
        !          1234:        popl    %eax
        !          1235:        movl    %eax,fv_v+8(%edx)
        !          1236:        popl    %eax
        !          1237:        movl    %eax,fv_v+8(%esi)
        !          1238:        popl    %eax
        !          1239:        movl    %eax,fv_v+8(%ecx)
        !          1240: 
        !          1241: //             }
        !          1242: //     }
        !          1243: Lskip:
        !          1244:        subl    $16,%ebp
        !          1245:        jnz             Llooptop
        !          1246: 
        !          1247: Ldone2:
        !          1248:        popl    %edi                            // restore the caller's stack frame
        !          1249:        popl    %ebx
        !          1250:        popl    %esi                            // restore register variables
        !          1251:        popl    %ebp
        !          1252: 
        !          1253:        addl    $(SPAN_SIZE),%esp
        !          1254: 
        !          1255:        ret
        !          1256: 
        !          1257: 
        !          1258: //----------------------------------------------------------------------
        !          1259: // Alias model triangle left-edge scanning code
        !          1260: //----------------------------------------------------------------------
        !          1261: 
        !          1262: #define height 4+16
        !          1263: 
        !          1264: .globl C(D_PolysetScanLeftEdge)
        !          1265: C(D_PolysetScanLeftEdge):
        !          1266:        pushl   %ebp                            // preserve caller stack frame pointer
        !          1267:        pushl   %esi                            // preserve register variables
        !          1268:        pushl   %edi
        !          1269:        pushl   %ebx
        !          1270: 
        !          1271:        movl    height(%esp),%eax
        !          1272:        movl    C(d_sfrac),%ecx
        !          1273:        andl    $0xFFFF,%eax
        !          1274:        movl    C(d_ptex),%ebx
        !          1275:        orl             %eax,%ecx
        !          1276:        movl    C(d_pedgespanpackage),%esi
        !          1277:        movl    C(d_tfrac),%edx
        !          1278:        movl    C(d_light),%edi
        !          1279:        movl    C(d_zi),%ebp
        !          1280: 
        !          1281: // %eax: scratch
        !          1282: // %ebx: d_ptex
        !          1283: // %ecx: d_sfrac in high word, count in low word
        !          1284: // %edx: d_tfrac
        !          1285: // %esi: d_pedgespanpackage, errorterm, scratch alternately
        !          1286: // %edi: d_light
        !          1287: // %ebp: d_zi
        !          1288: 
        !          1289: //     do
        !          1290: //     {
        !          1291: 
        !          1292: LScanLoop:
        !          1293: 
        !          1294: //             d_pedgespanpackage->ptex = ptex;
        !          1295: //             d_pedgespanpackage->pdest = d_pdest;
        !          1296: //             d_pedgespanpackage->pz = d_pz;
        !          1297: //             d_pedgespanpackage->count = d_aspancount;
        !          1298: //             d_pedgespanpackage->light = d_light;
        !          1299: //             d_pedgespanpackage->zi = d_zi;
        !          1300: //             d_pedgespanpackage->sfrac = d_sfrac << 16;
        !          1301: //             d_pedgespanpackage->tfrac = d_tfrac << 16;
        !          1302:        movl    %ebx,spanpackage_t_ptex(%esi)
        !          1303:        movl    C(d_pdest),%eax
        !          1304:        movl    %eax,spanpackage_t_pdest(%esi)
        !          1305:        movl    C(d_pz),%eax
        !          1306:        movl    %eax,spanpackage_t_pz(%esi)
        !          1307:        movl    C(d_aspancount),%eax
        !          1308:        movl    %eax,spanpackage_t_count(%esi)
        !          1309:        movl    %edi,spanpackage_t_light(%esi)
        !          1310:        movl    %ebp,spanpackage_t_zi(%esi)
        !          1311:        movl    %ecx,spanpackage_t_sfrac(%esi)
        !          1312:        movl    %edx,spanpackage_t_tfrac(%esi)
        !          1313: 
        !          1314: // pretouch the next cache line
        !          1315:        movb    spanpackage_t_size(%esi),%al
        !          1316: 
        !          1317: //             d_pedgespanpackage++;
        !          1318:        addl    $(spanpackage_t_size),%esi
        !          1319:        movl    C(erroradjustup),%eax
        !          1320:        movl    %esi,C(d_pedgespanpackage)
        !          1321: 
        !          1322: //             errorterm += erroradjustup;
        !          1323:        movl    C(errorterm),%esi
        !          1324:        addl    %eax,%esi
        !          1325:        movl    C(d_pdest),%eax
        !          1326: 
        !          1327: //             if (errorterm >= 0)
        !          1328: //             {
        !          1329:        js              LNoLeftEdgeTurnover
        !          1330: 
        !          1331: //                     errorterm -= erroradjustdown;
        !          1332: //                     d_pdest += d_pdestextrastep;
        !          1333:        subl    C(erroradjustdown),%esi
        !          1334:        addl    C(d_pdestextrastep),%eax
        !          1335:        movl    %esi,C(errorterm)
        !          1336:        movl    %eax,C(d_pdest)
        !          1337: 
        !          1338: //                     d_pz += d_pzextrastep;
        !          1339: //                     d_aspancount += d_countextrastep;
        !          1340: //                     d_ptex += d_ptexextrastep;
        !          1341: //                     d_sfrac += d_sfracextrastep;
        !          1342: //                     d_ptex += d_sfrac >> 16;
        !          1343: //                     d_sfrac &= 0xFFFF;
        !          1344: //                     d_tfrac += d_tfracextrastep;
        !          1345:        movl    C(d_pz),%eax
        !          1346:        movl    C(d_aspancount),%esi
        !          1347:        addl    C(d_pzextrastep),%eax
        !          1348:        addl    C(d_sfracextrastep),%ecx
        !          1349:        adcl    C(d_ptexextrastep),%ebx
        !          1350:        addl    C(d_countextrastep),%esi
        !          1351:        movl    %eax,C(d_pz)
        !          1352:        movl    C(d_tfracextrastep),%eax
        !          1353:        movl    %esi,C(d_aspancount)
        !          1354:        addl    %eax,%edx
        !          1355: 
        !          1356: //                     if (d_tfrac & 0x10000)
        !          1357: //                     {
        !          1358:        jnc             LSkip1
        !          1359: 
        !          1360: //                             d_ptex += r_affinetridesc.skinwidth;
        !          1361: //                             d_tfrac &= 0xFFFF;
        !          1362:        addl    C(r_affinetridesc)+atd_skinwidth,%ebx
        !          1363: 
        !          1364: //                     }
        !          1365: 
        !          1366: LSkip1:
        !          1367: 
        !          1368: //                     d_light += d_lightextrastep;
        !          1369: //                     d_zi += d_ziextrastep;
        !          1370:        addl    C(d_lightextrastep),%edi
        !          1371:        addl    C(d_ziextrastep),%ebp
        !          1372: 
        !          1373: //             }
        !          1374:        movl    C(d_pedgespanpackage),%esi
        !          1375:        decl    %ecx
        !          1376:        testl   $0xFFFF,%ecx
        !          1377:        jnz             LScanLoop
        !          1378: 
        !          1379:        popl    %ebx
        !          1380:        popl    %edi
        !          1381:        popl    %esi
        !          1382:        popl    %ebp
        !          1383:        ret
        !          1384: 
        !          1385: //             else
        !          1386: //             {
        !          1387: 
        !          1388: LNoLeftEdgeTurnover:
        !          1389:        movl    %esi,C(errorterm)
        !          1390: 
        !          1391: //                     d_pdest += d_pdestbasestep;
        !          1392:        addl    C(d_pdestbasestep),%eax
        !          1393:        movl    %eax,C(d_pdest)
        !          1394: 
        !          1395: //                     d_pz += d_pzbasestep;
        !          1396: //                     d_aspancount += ubasestep;
        !          1397: //                     d_ptex += d_ptexbasestep;
        !          1398: //                     d_sfrac += d_sfracbasestep;
        !          1399: //                     d_ptex += d_sfrac >> 16;
        !          1400: //                     d_sfrac &= 0xFFFF;
        !          1401:        movl    C(d_pz),%eax
        !          1402:        movl    C(d_aspancount),%esi
        !          1403:        addl    C(d_pzbasestep),%eax
        !          1404:        addl    C(d_sfracbasestep),%ecx
        !          1405:        adcl    C(d_ptexbasestep),%ebx
        !          1406:        addl    C(ubasestep),%esi
        !          1407:        movl    %eax,C(d_pz)
        !          1408:        movl    %esi,C(d_aspancount)
        !          1409: 
        !          1410: //                     d_tfrac += d_tfracbasestep;
        !          1411:        movl    C(d_tfracbasestep),%esi
        !          1412:        addl    %esi,%edx
        !          1413: 
        !          1414: //                     if (d_tfrac & 0x10000)
        !          1415: //                     {
        !          1416:        jnc             LSkip2
        !          1417: 
        !          1418: //                             d_ptex += r_affinetridesc.skinwidth;
        !          1419: //                             d_tfrac &= 0xFFFF;
        !          1420:        addl    C(r_affinetridesc)+atd_skinwidth,%ebx
        !          1421: 
        !          1422: //                     }
        !          1423: 
        !          1424: LSkip2:
        !          1425: 
        !          1426: //                     d_light += d_lightbasestep;
        !          1427: //                     d_zi += d_zibasestep;
        !          1428:        addl    C(d_lightbasestep),%edi
        !          1429:        addl    C(d_zibasestep),%ebp
        !          1430: 
        !          1431: //             }
        !          1432: //     } while (--height);
        !          1433:        movl    C(d_pedgespanpackage),%esi
        !          1434:        decl    %ecx
        !          1435:        testl   $0xFFFF,%ecx
        !          1436:        jnz             LScanLoop
        !          1437: 
        !          1438:        popl    %ebx
        !          1439:        popl    %edi
        !          1440:        popl    %esi
        !          1441:        popl    %ebp
        !          1442:        ret
        !          1443: 
        !          1444: 
        !          1445: //----------------------------------------------------------------------
        !          1446: // Alias model vertex drawing code
        !          1447: //----------------------------------------------------------------------
        !          1448: 
        !          1449: #define fv                     4+8
        !          1450: #define        numverts        8+8
        !          1451: 
        !          1452: .globl C(D_PolysetDrawFinalVerts)
        !          1453: C(D_PolysetDrawFinalVerts):
        !          1454:        pushl   %ebp                            // preserve caller stack frame pointer
        !          1455:        pushl   %ebx
        !          1456: 
        !          1457: //     int             i, z;
        !          1458: //     short   *zbuf;
        !          1459: 
        !          1460:        movl    numverts(%esp),%ecx
        !          1461:        movl    fv(%esp),%ebx
        !          1462: 
        !          1463:        pushl   %esi                            // preserve register variables
        !          1464:        pushl   %edi
        !          1465: 
        !          1466: LFVLoop:
        !          1467: 
        !          1468: //     for (i=0 ; i<numverts ; i++, fv++)
        !          1469: //     {
        !          1470: //     // valid triangle coordinates for filling can include the bottom and
        !          1471: //     // right clip edges, due to the fill rule; these shouldn't be drawn
        !          1472: //             if ((fv->v[0] < r_refdef.vrectright) &&
        !          1473: //                     (fv->v[1] < r_refdef.vrectbottom))
        !          1474: //             {
        !          1475:        movl    fv_v+0(%ebx),%eax
        !          1476:        movl    C(r_refdef)+rd_vrectright,%edx
        !          1477:        cmpl    %edx,%eax
        !          1478:        jge             LNextVert
        !          1479:        movl    fv_v+4(%ebx),%esi
        !          1480:        movl    C(r_refdef)+rd_vrectbottom,%edx
        !          1481:        cmpl    %edx,%esi
        !          1482:        jge             LNextVert
        !          1483: 
        !          1484: //                     zbuf = zspantable[fv->v[1]] + fv->v[0];
        !          1485:        movl    C(zspantable)(,%esi,4),%edi
        !          1486: 
        !          1487: //                     z = fv->v[5]>>16;
        !          1488:        movl    fv_v+20(%ebx),%edx
        !          1489:        shrl    $16,%edx
        !          1490: 
        !          1491: //                     if (z >= *zbuf)
        !          1492: //                     {
        !          1493: //                             int             pix;
        !          1494:        cmpw    (%edi,%eax,2),%dx
        !          1495:        jl              LNextVert
        !          1496: 
        !          1497: //                             *zbuf = z;
        !          1498:        movw    %dx,(%edi,%eax,2)
        !          1499: 
        !          1500: //                             pix = skintable[fv->v[3]>>16][fv->v[2]>>16];
        !          1501:        movl    fv_v+12(%ebx),%edi
        !          1502:        shrl    $16,%edi
        !          1503:        movl    C(skintable)(,%edi,4),%edi
        !          1504:        movl    fv_v+8(%ebx),%edx
        !          1505:        shrl    $16,%edx
        !          1506:        movb    (%edi,%edx),%dl
        !          1507: 
        !          1508: //                             pix = ((byte *)acolormap)[pix + (fv->v[4] & 0xFF00)];
        !          1509:        movl    fv_v+16(%ebx),%edi
        !          1510:        andl    $0xFF00,%edi
        !          1511:        andl    $0x00FF,%edx
        !          1512:        addl    %edx,%edi
        !          1513:        movl    C(acolormap),%edx
        !          1514:        movb    (%edx,%edi,1),%dl
        !          1515: 
        !          1516: //                             d_viewbuffer[d_scantable[fv->v[1]] + fv->v[0]] = pix;
        !          1517:        movl    C(d_scantable)(,%esi,4),%edi
        !          1518:        movl    C(d_viewbuffer),%esi
        !          1519:        addl    %eax,%edi
        !          1520:        movb    %dl,(%esi,%edi)
        !          1521: 
        !          1522: //                     }
        !          1523: //             }
        !          1524: //     }
        !          1525: LNextVert:
        !          1526:        addl    $(fv_size),%ebx
        !          1527:        decl    %ecx
        !          1528:        jnz             LFVLoop
        !          1529: 
        !          1530:        popl    %edi
        !          1531:        popl    %esi
        !          1532:        popl    %ebx
        !          1533:        popl    %ebp
        !          1534:        ret
        !          1535: 
        !          1536: 
        !          1537: //----------------------------------------------------------------------
        !          1538: // Alias model non-subdivided polygon dispatching code
        !          1539: //
        !          1540: // not C-callable because of stack buffer cleanup
        !          1541: //----------------------------------------------------------------------
        !          1542: 
        !          1543: .globl C(D_DrawNonSubdiv)
        !          1544: C(D_DrawNonSubdiv):
        !          1545:        pushl   %ebp                            // preserve caller stack frame pointer
        !          1546:        movl    C(r_affinetridesc)+atd_numtriangles,%ebp
        !          1547:        pushl   %ebx
        !          1548:        shll    $(mtri_shift),%ebp
        !          1549:        pushl   %esi                            // preserve register variables
        !          1550:        movl    C(r_affinetridesc)+atd_ptriangles,%esi
        !          1551:        pushl   %edi
        !          1552: 
        !          1553: //     mtriangle_t             *ptri;
        !          1554: //     finalvert_t             *pfv, *index0, *index1, *index2;
        !          1555: //     int                             i;
        !          1556: //     int                             lnumtriangles;
        !          1557: 
        !          1558: //     pfv = r_affinetridesc.pfinalverts;
        !          1559: //     ptri = r_affinetridesc.ptriangles;
        !          1560: //     lnumtriangles = r_affinetridesc.numtriangles;
        !          1561: 
        !          1562: LNDLoop:
        !          1563: 
        !          1564: //     for (i=0 ; i<lnumtriangles ; i++, ptri++)
        !          1565: //     {
        !          1566: //             index0 = pfv + ptri->vertindex[0];
        !          1567: //             index1 = pfv + ptri->vertindex[1];
        !          1568: //             index2 = pfv + ptri->vertindex[2];
        !          1569:        movl    C(r_affinetridesc)+atd_pfinalverts,%edi
        !          1570:        movl    mtri_vertindex+0-mtri_size(%esi,%ebp,1),%ecx
        !          1571:        shll    $(fv_shift),%ecx
        !          1572:        movl    mtri_vertindex+4-mtri_size(%esi,%ebp,1),%edx
        !          1573:        shll    $(fv_shift),%edx
        !          1574:        movl    mtri_vertindex+8-mtri_size(%esi,%ebp,1),%ebx
        !          1575:        shll    $(fv_shift),%ebx
        !          1576:        addl    %edi,%ecx
        !          1577:        addl    %edi,%edx
        !          1578:        addl    %edi,%ebx
        !          1579: 
        !          1580: //             d_xdenom = (index0->v[1]-index1->v[1]) *
        !          1581: //                             (index0->v[0]-index2->v[0]) -
        !          1582: //                             (index0->v[0]-index1->v[0])*(index0->v[1]-index2->v[1]);
        !          1583:        movl    fv_v+4(%ecx),%eax
        !          1584:        movl    fv_v+0(%ecx),%esi
        !          1585:        subl    fv_v+4(%edx),%eax
        !          1586:        subl    fv_v+0(%ebx),%esi
        !          1587:        imull   %esi,%eax
        !          1588:        movl    fv_v+0(%ecx),%esi
        !          1589:        movl    fv_v+4(%ecx),%edi
        !          1590:        subl    fv_v+0(%edx),%esi
        !          1591:        subl    fv_v+4(%ebx),%edi
        !          1592:        imull   %esi,%edi
        !          1593:        subl    %edi,%eax
        !          1594: 
        !          1595: //             if (d_xdenom >= 0)
        !          1596: //             {
        !          1597: //                     continue;
        !          1598:        jns             LNextTri
        !          1599: 
        !          1600: //             }
        !          1601: 
        !          1602:        movl    %eax,C(d_xdenom)
        !          1603:        fildl   C(d_xdenom)
        !          1604: 
        !          1605: //             r_p0[0] = index0->v[0];         // u
        !          1606: //             r_p0[1] = index0->v[1];         // v
        !          1607: //             r_p0[2] = index0->v[2];         // s
        !          1608: //             r_p0[3] = index0->v[3];         // t
        !          1609: //             r_p0[4] = index0->v[4];         // light
        !          1610: //             r_p0[5] = index0->v[5];         // iz
        !          1611:        movl    fv_v+0(%ecx),%eax
        !          1612:        movl    fv_v+4(%ecx),%esi
        !          1613:        movl    %eax,C(r_p0)+0
        !          1614:        movl    %esi,C(r_p0)+4
        !          1615:        movl    fv_v+8(%ecx),%eax
        !          1616:        movl    fv_v+12(%ecx),%esi
        !          1617:        movl    %eax,C(r_p0)+8
        !          1618:        movl    %esi,C(r_p0)+12
        !          1619:        movl    fv_v+16(%ecx),%eax
        !          1620:        movl    fv_v+20(%ecx),%esi
        !          1621:        movl    %eax,C(r_p0)+16
        !          1622:        movl    %esi,C(r_p0)+20
        !          1623: 
        !          1624:        fdivrs  float_1
        !          1625: 
        !          1626: //             r_p1[0] = index1->v[0];
        !          1627: //             r_p1[1] = index1->v[1];
        !          1628: //             r_p1[2] = index1->v[2];
        !          1629: //             r_p1[3] = index1->v[3];
        !          1630: //             r_p1[4] = index1->v[4];
        !          1631: //             r_p1[5] = index1->v[5];
        !          1632:        movl    fv_v+0(%edx),%eax
        !          1633:        movl    fv_v+4(%edx),%esi
        !          1634:        movl    %eax,C(r_p1)+0
        !          1635:        movl    %esi,C(r_p1)+4
        !          1636:        movl    fv_v+8(%edx),%eax
        !          1637:        movl    fv_v+12(%edx),%esi
        !          1638:        movl    %eax,C(r_p1)+8
        !          1639:        movl    %esi,C(r_p1)+12
        !          1640:        movl    fv_v+16(%edx),%eax
        !          1641:        movl    fv_v+20(%edx),%esi
        !          1642:        movl    %eax,C(r_p1)+16
        !          1643:        movl    %esi,C(r_p1)+20
        !          1644: 
        !          1645: //             r_p2[0] = index2->v[0];
        !          1646: //             r_p2[1] = index2->v[1];
        !          1647: //             r_p2[2] = index2->v[2];
        !          1648: //             r_p2[3] = index2->v[3];
        !          1649: //             r_p2[4] = index2->v[4];
        !          1650: //             r_p2[5] = index2->v[5];
        !          1651:        movl    fv_v+0(%ebx),%eax
        !          1652:        movl    fv_v+4(%ebx),%esi
        !          1653:        movl    %eax,C(r_p2)+0
        !          1654:        movl    %esi,C(r_p2)+4
        !          1655:        movl    fv_v+8(%ebx),%eax
        !          1656:        movl    fv_v+12(%ebx),%esi
        !          1657:        movl    %eax,C(r_p2)+8
        !          1658:        movl    %esi,C(r_p2)+12
        !          1659:        movl    fv_v+16(%ebx),%eax
        !          1660:        movl    fv_v+20(%ebx),%esi
        !          1661:        movl    %eax,C(r_p2)+16
        !          1662:        movl    C(r_affinetridesc)+atd_ptriangles,%edi
        !          1663:        movl    %esi,C(r_p2)+20
        !          1664:        movl    mtri_facesfront-mtri_size(%edi,%ebp,1),%eax
        !          1665: 
        !          1666: //             if (!ptri->facesfront)
        !          1667: //             {
        !          1668:        testl   %eax,%eax
        !          1669:        jnz             LFacesFront
        !          1670: 
        !          1671: //                     if (index0->flags & ALIAS_ONSEAM)
        !          1672: //                             r_p0[2] += r_affinetridesc.seamfixupX16;
        !          1673:        movl    fv_flags(%ecx),%eax
        !          1674:        movl    fv_flags(%edx),%esi
        !          1675:        movl    fv_flags(%ebx),%edi
        !          1676:        testl   $(ALIAS_ONSEAM),%eax
        !          1677:        movl    C(r_affinetridesc)+atd_seamfixupX16,%eax
        !          1678:        jz              LOnseamDone0
        !          1679:        addl    %eax,C(r_p0)+8
        !          1680: LOnseamDone0:
        !          1681: 
        !          1682: //                     if (index1->flags & ALIAS_ONSEAM)
        !          1683: //                             r_p1[2] += r_affinetridesc.seamfixupX16;
        !          1684:        testl   $(ALIAS_ONSEAM),%esi
        !          1685:        jz              LOnseamDone1
        !          1686:        addl    %eax,C(r_p1)+8
        !          1687: LOnseamDone1:
        !          1688: 
        !          1689: //                     if (index2->flags & ALIAS_ONSEAM)
        !          1690: //                             r_p2[2] += r_affinetridesc.seamfixupX16;
        !          1691:        testl   $(ALIAS_ONSEAM),%edi
        !          1692:        jz              LOnseamDone2
        !          1693:        addl    %eax,C(r_p2)+8
        !          1694: LOnseamDone2:
        !          1695: 
        !          1696: //             }
        !          1697: 
        !          1698: LFacesFront:
        !          1699: 
        !          1700:        fstps   C(d_xdenom)
        !          1701: 
        !          1702: //             D_PolysetSetEdgeTable ();
        !          1703: //             D_RasterizeAliasPolySmooth ();
        !          1704:                call    C(D_PolysetSetEdgeTable)
        !          1705:                call    C(D_RasterizeAliasPolySmooth)
        !          1706: 
        !          1707: LNextTri:
        !          1708:                movl    C(r_affinetridesc)+atd_ptriangles,%esi
        !          1709:                subl    $16,%ebp
        !          1710:                jnz             LNDLoop
        !          1711: //     }
        !          1712: 
        !          1713:        popl    %edi
        !          1714:        popl    %esi
        !          1715:        popl    %ebx
        !          1716:        popl    %ebp
        !          1717: 
        !          1718:        addl    $(SPAN_SIZE),%esp
        !          1719: 
        !          1720:        ret
        !          1721: 
        !          1722: 
        !          1723: #endif // id386
        !          1724: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.