Annotation of quake2/linux/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 "qasm.h"
        !             7: #include "d_ifacea.h"
        !             8: 
        !             9: #if    id386
        !            10: 
        !            11: // !!! if this is changed, it must be changed in d_polyse.c too !!!
        !            12: #define DPS_MAXSPANS                   MAXHEIGHT+1     
        !            13:                                                                        // 1 extra for spanpackage that marks end
        !            14: 
        !            15: //#define      SPAN_SIZE       (((DPS_MAXSPANS + 1 + ((CACHE_SIZE - 1) / spanpackage_t_size)) + 1) * spanpackage_t_size)
        !            16: #define SPAN_SIZE (1024+1+1+1)*32
        !            17: 
        !            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: #if 0
        !            47: #define skinwidth      4+0
        !            48: 
        !            49: .globl C(R_PolysetCalcGradients)
        !            50: C(R_PolysetCalcGradients):
        !            51: 
        !            52: //     p00_minus_p20 = r_p0[0] - r_p2[0];
        !            53: //     p01_minus_p21 = r_p0[1] - r_p2[1];
        !            54: //     p10_minus_p20 = r_p1[0] - r_p2[0];
        !            55: //     p11_minus_p21 = r_p1[1] - r_p2[1];
        !            56: //
        !            57: //     xstepdenominv = 1.0 / (p10_minus_p20 * p01_minus_p21 -
        !            58: //                          p00_minus_p20 * p11_minus_p21);
        !            59: //
        !            60: //     ystepdenominv = -xstepdenominv;
        !            61: 
        !            62:        fildl   C(r_p0)+0               // r_p0[0]
        !            63:        fildl   C(r_p2)+0               // r_p2[0] | r_p0[0]
        !            64:        fildl   C(r_p0)+4               // r_p0[1] | r_p2[0] | r_p0[0]
        !            65:        fildl   C(r_p2)+4               // r_p2[1] | r_p0[1] | r_p2[0] | r_p0[0]
        !            66:        fildl   C(r_p1)+0               // r_p1[0] | r_p2[1] | r_p0[1] | r_p2[0] | r_p0[0]
        !            67:        fildl   C(r_p1)+4               // r_p1[1] | r_p1[0] | r_p2[1] | r_p0[1] |
        !            68:                                                        //  r_p2[0] | r_p0[0]
        !            69:        fxch    %st(3)                  // r_p0[1] | r_p1[0] | r_p2[1] | r_p1[1] |
        !            70:                                                        //  r_p2[0] | r_p0[0]
        !            71:        fsub    %st(2),%st(0)   // p01_minus_p21 | r_p1[0] | r_p2[1] | r_p1[1] |
        !            72:                                                        //  r_p2[0] | r_p0[0]
        !            73:        fxch    %st(1)                  // r_p1[0] | p01_minus_p21 | r_p2[1] | r_p1[1] |
        !            74:                                                        //  r_p2[0] | r_p0[0]
        !            75:        fsub    %st(4),%st(0)   // p10_minus_p20 | p01_minus_p21 | r_p2[1] |
        !            76:                                                        //  r_p1[1] | r_p2[0] | r_p0[0]
        !            77:        fxch    %st(5)                  // r_p0[0] | p01_minus_p21 | r_p2[1] |
        !            78:                                                        //  r_p1[1] | r_p2[0] | p10_minus_p20
        !            79:        fsubp   %st(0),%st(4)   // p01_minus_p21 | r_p2[1] | r_p1[1] |
        !            80:                                                        //  p00_minus_p20 | p10_minus_p20
        !            81:        fxch    %st(2)                  // r_p1[1] | r_p2[1] | p01_minus_p21 |
        !            82:                                                        //  p00_minus_p20 | p10_minus_p20
        !            83:        fsubp   %st(0),%st(1)   // p11_minus_p21 | p01_minus_p21 |
        !            84:                                                        //  p00_minus_p20 | p10_minus_p20
        !            85:        fxch    %st(1)                  // p01_minus_p21 | p11_minus_p21 |
        !            86:                                                        //  p00_minus_p20 | p10_minus_p20
        !            87:        flds    C(d_xdenom)             // d_xdenom | p01_minus_p21 | p11_minus_p21 |
        !            88:                                                        //  p00_minus_p20 | p10_minus_p20
        !            89:        fxch    %st(4)                  // p10_minus_p20 | p01_minus_p21 | p11_minus_p21 |
        !            90:                                                        //  p00_minus_p20 | d_xdenom
        !            91:        fstps   p10_minus_p20   // p01_minus_p21 | p11_minus_p21 |
        !            92:                                                        //  p00_minus_p20 | d_xdenom
        !            93:        fstps   p01_minus_p21   // p11_minus_p21 | p00_minus_p20 | xstepdenominv
        !            94:        fxch    %st(2)                  // xstepdenominv | p00_minus_p20 | p11_minus_p21
        !            95: 
        !            96: //// ceil () for light so positive steps are exaggerated, negative steps
        !            97: //// diminished,  pushing us away from underflow toward overflow. Underflow is
        !            98: //// very visible, overflow is very unlikely, because of ambient lighting
        !            99: //     t0 = r_p0[4] - r_p2[4];
        !           100: //     t1 = r_p1[4] - r_p2[4];
        !           101: 
        !           102:        fildl   C(r_p2)+16              // r_p2[4] | xstepdenominv | p00_minus_p20 |
        !           103:                                                        //  p11_minus_p21
        !           104:        fildl   C(r_p0)+16              // r_p0[4] | r_p2[4] | xstepdenominv |
        !           105:                                                        //  p00_minus_p20 | p11_minus_p21
        !           106:        fildl   C(r_p1)+16              // r_p1[4] | r_p0[4] | r_p2[4] | xstepdenominv |
        !           107:                                                        //  p00_minus_p20 | p11_minus_p21
        !           108:        fxch    %st(2)                  // r_p2[4] | r_p0[4] | r_p1[4] | xstepdenominv |
        !           109:                                                        //  p00_minus_p20 | p11_minus_p21
        !           110:        fld             %st(0)                  // r_p2[4] | r_p2[4] | r_p0[4] | r_p1[4] |
        !           111:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           112:        fsubrp  %st(0),%st(2)   // r_p2[4] | t0 | r_p1[4] | xstepdenominv |
        !           113:                                                        //  p00_minus_p20 | p11_minus_p21
        !           114:        fsubrp  %st(0),%st(2)   // t0 | t1 | xstepdenominv | p00_minus_p20 |
        !           115:                                                        //  p11_minus_p21
        !           116: 
        !           117: //     r_lstepx = (int)
        !           118: //                     ceil((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv);
        !           119: //     r_lstepy = (int)
        !           120: //                     ceil((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv);
        !           121: 
        !           122:        fld             %st(0)                  // t0 | t0 | t1 | xstepdenominv | p00_minus_p20 |
        !           123:                                                        //  p11_minus_p21
        !           124:        fmul    %st(5),%st(0)   // t0*p11_minus_p21 | t0 | t1 | xstepdenominv |
        !           125:                                                        //  p00_minus_p20 | p11_minus_p21
        !           126:        fxch    %st(2)                  // t1 | t0 | t0*p11_minus_p21 | xstepdenominv |
        !           127:                                                        //  p00_minus_p20 | p11_minus_p21
        !           128:        fld             %st(0)                  // t1 | t1 | t0 | t0*p11_minus_p21 |
        !           129:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           130:        fmuls   p01_minus_p21   // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 |
        !           131:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           132:        fxch    %st(2)                  // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 |
        !           133:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           134:        fmuls   p10_minus_p20   // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
        !           135:                                                        //  t0*p11_minus_p21 | xstepdenominv |
        !           136:                                                        //  p00_minus_p20 | p11_minus_p21
        !           137:        fxch    %st(1)                  // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
        !           138:                                                        //  t0*p11_minus_p21 | xstepdenominv |
        !           139:                                                        //  p00_minus_p20 | p11_minus_p21
        !           140:        fmul    %st(5),%st(0)   // t1*p00_minus_p20 | t0*p10_minus_p20 |
        !           141:                                                        //  t1*p01_minus_p21 | t0*p11_minus_p21 |
        !           142:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           143:        fxch    %st(2)                  // t1*p01_minus_p21 | t0*p10_minus_p20 |
        !           144:                                                        //  t1*p00_minus_p20 | t0*p11_minus_p21 |
        !           145:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           146:        fsubp   %st(0),%st(3)   // t0*p10_minus_p20 | t1*p00_minus_p20 |
        !           147:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           148:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           149:        fsubrp  %st(0),%st(1)   // t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           150:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           151:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           152:        fld             %st(2)                  // xstepdenominv |
        !           153:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           154:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           155:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           156:        fmuls   float_minus_1   // ystepdenominv |
        !           157:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           158:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           159:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           160:        fxch    %st(2)                  // t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           161:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           162:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           163:                                                        //  p11_minus_p21
        !           164:        fmul    %st(3),%st(0)   // (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           165:                                                        //   xstepdenominv |
        !           166:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           167:                                                        //   | ystepdenominv | xstepdenominv |
        !           168:                                                        //   p00_minus_p20 | p11_minus_p21
        !           169:        fxch    %st(1)                  // t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           170:                                                        //  (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           171:                                                        //   xstepdenominv | ystepdenominv |
        !           172:                                                        //   xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           173:        fmul    %st(2),%st(0)   // (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           174:                                                        //  ystepdenominv |
        !           175:                                                        //  (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           176:                                                        //  xstepdenominv | ystepdenominv |
        !           177:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           178:        fldcw   ceil_cw
        !           179:        fistpl  C(r_lstepy)             // r_lstepx | ystepdenominv | xstepdenominv |
        !           180:                                                        //  p00_minus_p20 | p11_minus_p21
        !           181:        fistpl  C(r_lstepx)             // ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           182:                                                        //  p11_minus_p21
        !           183:        fldcw   single_cw
        !           184: 
        !           185: //     t0 = r_p0[2] - r_p2[2];
        !           186: //     t1 = r_p1[2] - r_p2[2];
        !           187: 
        !           188:        fildl   C(r_p2)+8               // r_p2[2] | ystepdenominv | xstepdenominv |
        !           189:                                                        //  p00_minus_p20 | p11_minus_p21
        !           190:        fildl   C(r_p0)+8               // r_p0[2] | r_p2[2] | ystepdenominv |
        !           191:                                                        //   xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           192:        fildl   C(r_p1)+8               // r_p1[2] | r_p0[2] | r_p2[2] | ystepdenominv |
        !           193:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           194:        fxch    %st(2)                  // r_p2[2] | r_p0[2] | r_p1[2] | ystepdenominv |
        !           195:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           196:        fld             %st(0)                  // r_p2[2] | r_p2[2] | r_p0[2] | r_p1[2] |
        !           197:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           198:                                                        //  p11_minus_p21
        !           199:        fsubrp  %st(0),%st(2)   // r_p2[2] | t0 | r_p1[2] | ystepdenominv |
        !           200:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           201:        fsubrp  %st(0),%st(2)   // t0 | t1 | ystepdenominv | xstepdenominv |
        !           202:                                                        //  p00_minus_p20 | p11_minus_p21
        !           203: 
        !           204: //     r_sstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
        !           205: //                     xstepdenominv);
        !           206: //     r_sstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
        !           207: //                     ystepdenominv);
        !           208: 
        !           209:        fld             %st(0)                  // t0 | t0 | t1 | ystepdenominv | xstepdenominv
        !           210:        fmul    %st(6),%st(0)   // t0*p11_minus_p21 | t0 | t1 | ystepdenominv |
        !           211:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           212:        fxch    %st(2)                  // t1 | t0 | t0*p11_minus_p21 | ystepdenominv |
        !           213:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           214:        fld             %st(0)                  // t1 | t1 | t0 | t0*p11_minus_p21 |
        !           215:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           216:                                                        //  p11_minus_p21
        !           217:        fmuls   p01_minus_p21   // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 |
        !           218:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           219:                                                        //  p11_minus_p21
        !           220:        fxch    %st(2)                  // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 |
        !           221:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           222:                                                        //  p11_minus_p21
        !           223:        fmuls   p10_minus_p20   // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
        !           224:                                                        //  t0*p11_minus_p21 | ystepdenominv |
        !           225:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           226:        fxch    %st(1)                  // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
        !           227:                                                        //  t0*p11_minus_p21 | ystepdenominv |
        !           228:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           229:        fmul    %st(6),%st(0)   // t1*p00_minus_p20 | t0*p10_minus_p20 |
        !           230:                                                        //  t1*p01_minus_p21 | t0*p11_minus_p21 |
        !           231:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           232:                                                        //  p11_minus_p21
        !           233:        fxch    %st(2)                  // t1*p01_minus_p21 | t0*p10_minus_p20 |
        !           234:                                                        //  t1*p00_minus_p20 | t0*p11_minus_p21 |
        !           235:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           236:                                                        //  p11_minus_p21
        !           237:        fsubp   %st(0),%st(3)   // t0*p10_minus_p20 | t1*p00_minus_p20 |
        !           238:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           239:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           240:                                                        //  p11_minus_p21
        !           241:        fsubrp  %st(0),%st(1)   // t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           242:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           243:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           244:                                                        //  p11_minus_p21
        !           245:        fmul    %st(2),%st(0)   // (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           246:                                                        //   ystepdenominv |
        !           247:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           248:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           249:                                                        //  p11_minus_p21
        !           250:        fxch    %st(1)                  // t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           251:                                                        //  (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           252:                                                        //   ystepdenominv | ystepdenominv |
        !           253:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           254:        fmul    %st(3),%st(0)   // (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           255:                                                        //  xstepdenominv |
        !           256:                                                        //  (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           257:                                                        //  ystepdenominv | ystepdenominv |
        !           258:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           259:        fxch    %st(1)                  // (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           260:                                                        //  ystepdenominv |
        !           261:                                                        //  (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           262:                                                        //  xstepdenominv | ystepdenominv |
        !           263:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           264:        fistpl  C(r_sstepy)             // r_sstepx | ystepdenominv | xstepdenominv |
        !           265:                                                        //  p00_minus_p20 | p11_minus_p21
        !           266:        fistpl  C(r_sstepx)             // ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           267:                                                        //  p11_minus_p21
        !           268: 
        !           269: //     t0 = r_p0[3] - r_p2[3];
        !           270: //     t1 = r_p1[3] - r_p2[3];
        !           271: 
        !           272:        fildl   C(r_p2)+12              // r_p2[3] | ystepdenominv | xstepdenominv |
        !           273:                                                        //  p00_minus_p20 | p11_minus_p21
        !           274:        fildl   C(r_p0)+12              // r_p0[3] | r_p2[3] | ystepdenominv |
        !           275:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           276:        fildl   C(r_p1)+12              // r_p1[3] | r_p0[3] | r_p2[3] | ystepdenominv |
        !           277:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           278:        fxch    %st(2)                  // r_p2[3] | r_p0[3] | r_p1[3] | ystepdenominv |
        !           279:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           280:        fld             %st(0)                  // r_p2[3] | r_p2[3] | r_p0[3] | r_p1[3] |
        !           281:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           282:                                                        //  p11_minus_p21
        !           283:        fsubrp  %st(0),%st(2)   // r_p2[3] | t0 | r_p1[3] | ystepdenominv |
        !           284:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           285:        fsubrp  %st(0),%st(2)   // t0 | t1 | ystepdenominv | xstepdenominv |
        !           286:                                                        //  p00_minus_p20 | p11_minus_p21
        !           287: 
        !           288: //     r_tstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
        !           289: //                     xstepdenominv);
        !           290: //     r_tstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
        !           291: //                     ystepdenominv);
        !           292: 
        !           293:        fld             %st(0)                  // t0 | t0 | t1 | ystepdenominv | xstepdenominv |
        !           294:                                                        //  p00_minus_p20 | p11_minus_p21
        !           295:        fmul    %st(6),%st(0)   // t0*p11_minus_p21 | t0 | t1 | ystepdenominv |
        !           296:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           297:        fxch    %st(2)                  // t1 | t0 | t0*p11_minus_p21 | ystepdenominv |
        !           298:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           299:        fld             %st(0)                  // t1 | t1 | t0 | t0*p11_minus_p21 |
        !           300:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           301:                                                        //  p11_minus_p21
        !           302:        fmuls   p01_minus_p21   // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 |
        !           303:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           304:                                                        //  p11_minus_p21
        !           305:        fxch    %st(2)                  // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 |
        !           306:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           307:                                                        //  p11_minus_p21
        !           308:        fmuls   p10_minus_p20   // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
        !           309:                                                        //  t0*p11_minus_p21 | ystepdenominv |
        !           310:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           311:        fxch    %st(1)                  // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
        !           312:                                                        //  t0*p11_minus_p21 | ystepdenominv |
        !           313:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           314:        fmul    %st(6),%st(0)   // t1*p00_minus_p20 | t0*p10_minus_p20 |
        !           315:                                                        //  t1*p01_minus_p21 | t0*p11_minus_p21 |
        !           316:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           317:                                                        //  p11_minus_p21
        !           318:        fxch    %st(2)                  // t1*p01_minus_p21 | t0*p10_minus_p20 |
        !           319:                                                        //  t1*p00_minus_p20 | t0*p11_minus_p21 |
        !           320:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           321:                                                        //  p11_minus_p21
        !           322:        fsubp   %st(0),%st(3)   // t0*p10_minus_p20 | t1*p00_minus_p20 |
        !           323:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           324:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           325:                                                        //  p11_minus_p21
        !           326:        fsubrp  %st(0),%st(1)   // t1*p00_minus_p20 - t0*p10_minus_p20 |
        !           327:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           328:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           329:                                                        //  p11_minus_p21
        !           330:        fmul    %st(2),%st(0)   // (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           331:                                                        //   ystepdenominv |
        !           332:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           333:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           334:                                                        //  p11_minus_p21
        !           335:        fxch    %st(1)                  // t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           336:                                                        //  (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           337:                                                        //  ystepdenominv | ystepdenominv |
        !           338:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           339:        fmul    %st(3),%st(0)   // (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           340:                                                        //  xstepdenominv |
        !           341:                                                        //  (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           342:                                                        //  ystepdenominv | ystepdenominv |
        !           343:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           344:        fxch    %st(1)                  // (t1*p00_minus_p20 - t0*p10_minus_p20)*
        !           345:                                                        //  ystepdenominv |
        !           346:                                                        //  (t1*p01_minus_p21 - t0*p11_minus_p21)*
        !           347:                                                        //  xstepdenominv | ystepdenominv |
        !           348:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           349:        fistpl  C(r_tstepy)             // r_tstepx | ystepdenominv | xstepdenominv |
        !           350:                                                        //  p00_minus_p20 | p11_minus_p21
        !           351:        fistpl  C(r_tstepx)             // ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           352:                                                        //  p11_minus_p21
        !           353: 
        !           354: //     t0 = r_p0[5] - r_p2[5];
        !           355: //     t1 = r_p1[5] - r_p2[5];
        !           356: 
        !           357:        fildl   C(r_p2)+20              // r_p2[5] | ystepdenominv | xstepdenominv |
        !           358:                                                        //  p00_minus_p20 | p11_minus_p21
        !           359:        fildl   C(r_p0)+20              // r_p0[5] | r_p2[5] | ystepdenominv |
        !           360:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           361:        fildl   C(r_p1)+20              // r_p1[5] | r_p0[5] | r_p2[5] | ystepdenominv |
        !           362:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           363:        fxch    %st(2)                  // r_p2[5] | r_p0[5] | r_p1[5] | ystepdenominv |
        !           364:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           365:        fld             %st(0)                  // r_p2[5] | r_p2[5] | r_p0[5] | r_p1[5] |
        !           366:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           367:                                                        //  p11_minus_p21
        !           368:        fsubrp  %st(0),%st(2)   // r_p2[5] | t0 | r_p1[5] | ystepdenominv |
        !           369:                                                        //  xstepdenominv | p00_minus_p20 | p11_minus_p21
        !           370:        fsubrp  %st(0),%st(2)   // t0 | t1 | ystepdenominv | xstepdenominv |
        !           371:                                                        //  p00_minus_p20 | p11_minus_p21
        !           372: 
        !           373: //     r_zistepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
        !           374: //                     xstepdenominv);
        !           375: //     r_zistepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
        !           376: //                     ystepdenominv);
        !           377: 
        !           378:        fld             %st(0)                  // t0 | t0 | t1 | ystepdenominv | xstepdenominv |
        !           379:                                                        //  p00_minus_p20 | p11_minus_p21
        !           380:        fmulp   %st(0),%st(6)   // t0 | t1 | ystepdenominv | xstepdenominv |
        !           381:                                                        //  p00_minus_p20 | t0*p11_minus_p21
        !           382:        fxch    %st(1)                  // t1 | t0 | ystepdenominv | xstepdenominv |
        !           383:                                                        //  p00_minus_p20 | t0*p11_minus_p21
        !           384:        fld             %st(0)                  // t1 | t1 | t0 | ystepdenominv | xstepdenominv |
        !           385:                                                        //  p00_minus_p20 | t0*p11_minus_p21
        !           386:        fmuls   p01_minus_p21   // t1*p01_minus_p21 | t1 | t0 | ystepdenominv |
        !           387:                                                        //  xstepdenominv | p00_minus_p20 |
        !           388:                                                        //  t0*p11_minus_p21
        !           389:        fxch    %st(2)                  // t0 | t1 | t1*p01_minus_p21 | ystepdenominv |
        !           390:                                                        //  xstepdenominv | p00_minus_p20 |
        !           391:                                                        //  t0*p11_minus_p21
        !           392:        fmuls   p10_minus_p20   // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
        !           393:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           394:                                                        //  t0*p11_minus_p21
        !           395:        fxch    %st(1)                  // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
        !           396:                                                        //  ystepdenominv | xstepdenominv | p00_minus_p20 |
        !           397:                                                        //  t0*p11_minus_p21
        !           398:        fmulp   %st(0),%st(5)   // t0*p10_minus_p20 | t1*p01_minus_p21 |
        !           399:                                                        //  ystepdenominv | xstepdenominv |
        !           400:                                                        //  t1*p00_minus_p20 | t0*p11_minus_p21
        !           401:        fxch    %st(5)                  // t0*p11_minus_p21 | t1*p01_minus_p21 |
        !           402:                                                        //  ystepdenominv | xstepdenominv |
        !           403:                                                        //  t1*p00_minus_p20 | t0*p10_minus_p20
        !           404:        fsubrp  %st(0),%st(1)   // t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           405:                                                        //  ystepdenominv | xstepdenominv |
        !           406:                                                        //  t1*p00_minus_p20 | t0*p10_minus_p20
        !           407:        fxch    %st(3)                  // t1*p00_minus_p20 | ystepdenominv |
        !           408:                                                        //  xstepdenominv |
        !           409:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           410:                                                        //  t0*p10_minus_p20
        !           411:        fsubp   %st(0),%st(4)   // ystepdenominv | xstepdenominv |
        !           412:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           413:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20
        !           414:        fxch    %st(1)                  // xstepdenominv | ystepdenominv |
        !           415:                                                        //  t1*p01_minus_p21 - t0*p11_minus_p21 |
        !           416:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20
        !           417:        fmulp   %st(0),%st(2)   // ystepdenominv |
        !           418:                                                        //  (t1*p01_minus_p21 - t0*p11_minus_p21) *
        !           419:                                                        //  xstepdenominv |
        !           420:                                                        //  t1*p00_minus_p20 - t0*p10_minus_p20
        !           421:        fmulp   %st(0),%st(2)   // (t1*p01_minus_p21 - t0*p11_minus_p21) *
        !           422:                                                        //  xstepdenominv |
        !           423:                                                        //  (t1*p00_minus_p20 - t0*p10_minus_p20) *
        !           424:                                                        //  ystepdenominv
        !           425:        fistpl  C(r_zistepx)    // (t1*p00_minus_p20 - t0*p10_minus_p20) *
        !           426:                                                        //  ystepdenominv
        !           427:        fistpl  C(r_zistepy)
        !           428: 
        !           429: //     a_sstepxfrac = r_sstepx << 16;
        !           430: //     a_tstepxfrac = r_tstepx << 16;
        !           431: //
        !           432: //     a_ststepxwhole = r_affinetridesc.skinwidth * (r_tstepx >> 16) +
        !           433: //                     (r_sstepx >> 16);
        !           434: 
        !           435:        movl    C(r_sstepx),%eax
        !           436:        movl    C(r_tstepx),%edx
        !           437:        shll    $16,%eax
        !           438:        shll    $16,%edx
        !           439:        movl    %eax,C(a_sstepxfrac)
        !           440:        movl    %edx,C(a_tstepxfrac)
        !           441: 
        !           442:        movl    C(r_sstepx),%ecx
        !           443:        movl    C(r_tstepx),%eax
        !           444:        sarl    $16,%ecx
        !           445:        sarl    $16,%eax
        !           446:        imull   skinwidth(%esp)
        !           447:        addl    %ecx,%eax
        !           448:        movl    %eax,C(a_ststepxwhole)
        !           449: 
        !           450:        ret
        !           451: 
        !           452: #endif
        !           453: 
        !           454: //----------------------------------------------------------------------
        !           455: // recursive subdivision affine triangle drawing code
        !           456: //
        !           457: // not C-callable because of stdcall return
        !           458: //----------------------------------------------------------------------
        !           459: 
        !           460: #define lp1    4+16
        !           461: #define lp2    8+16
        !           462: #define lp3    12+16
        !           463: 
        !           464: .globl C(D_PolysetRecursiveTriangle)
        !           465: C(D_PolysetRecursiveTriangle):
        !           466:        pushl   %ebp                            // preserve caller stack frame pointer
        !           467:        pushl   %esi                            // preserve register variables
        !           468:        pushl   %edi
        !           469:        pushl   %ebx
        !           470: 
        !           471: //     int             *temp;
        !           472: //     int             d;
        !           473: //     int             new[6];
        !           474: //     int             i;
        !           475: //     int             z;
        !           476: //     short   *zbuf;
        !           477:        movl    lp2(%esp),%esi
        !           478:        movl    lp1(%esp),%ebx
        !           479:        movl    lp3(%esp),%edi
        !           480: 
        !           481: //     d = lp2[0] - lp1[0];
        !           482: //     if (d < -1 || d > 1)
        !           483: //             goto split;
        !           484:        movl    0(%esi),%eax
        !           485: 
        !           486:        movl    0(%ebx),%edx
        !           487:        movl    4(%esi),%ebp
        !           488: 
        !           489:        subl    %edx,%eax
        !           490:        movl    4(%ebx),%ecx
        !           491: 
        !           492:        subl    %ecx,%ebp
        !           493:        incl    %eax
        !           494: 
        !           495:        cmpl    $2,%eax
        !           496:        ja              LSplit
        !           497: 
        !           498: //     d = lp2[1] - lp1[1];
        !           499: //     if (d < -1 || d > 1)
        !           500: //             goto split;
        !           501:        movl    0(%edi),%eax
        !           502:        incl    %ebp
        !           503: 
        !           504:        cmpl    $2,%ebp
        !           505:        ja              LSplit
        !           506: 
        !           507: //     d = lp3[0] - lp2[0];
        !           508: //     if (d < -1 || d > 1)
        !           509: //             goto split2;
        !           510:        movl    0(%esi),%edx
        !           511:        movl    4(%edi),%ebp
        !           512: 
        !           513:        subl    %edx,%eax
        !           514:        movl    4(%esi),%ecx
        !           515: 
        !           516:        subl    %ecx,%ebp
        !           517:        incl    %eax
        !           518: 
        !           519:        cmpl    $2,%eax
        !           520:        ja              LSplit2
        !           521: 
        !           522: //     d = lp3[1] - lp2[1];
        !           523: //     if (d < -1 || d > 1)
        !           524: //             goto split2;
        !           525:        movl    0(%ebx),%eax
        !           526:        incl    %ebp
        !           527: 
        !           528:        cmpl    $2,%ebp
        !           529:        ja              LSplit2
        !           530: 
        !           531: //     d = lp1[0] - lp3[0];
        !           532: //     if (d < -1 || d > 1)
        !           533: //             goto split3;
        !           534:        movl    0(%edi),%edx
        !           535:        movl    4(%ebx),%ebp
        !           536: 
        !           537:        subl    %edx,%eax
        !           538:        movl    4(%edi),%ecx
        !           539: 
        !           540:        subl    %ecx,%ebp
        !           541:        incl    %eax
        !           542: 
        !           543:        incl    %ebp
        !           544:        movl    %ebx,%edx
        !           545: 
        !           546:        cmpl    $2,%eax
        !           547:        ja              LSplit3
        !           548: 
        !           549: //     d = lp1[1] - lp3[1];
        !           550: //     if (d < -1 || d > 1)
        !           551: //     {
        !           552: //split3:
        !           553: //             temp = lp1;
        !           554: //             lp3 = lp2;
        !           555: //             lp1 = lp3;
        !           556: //             lp2 = temp;
        !           557: //             goto split;
        !           558: //     }
        !           559: //
        !           560: //     return;                 // entire tri is filled
        !           561: //
        !           562:        cmpl    $2,%ebp
        !           563:        jna             LDone
        !           564: 
        !           565: LSplit3:
        !           566:        movl    %edi,%ebx
        !           567:        movl    %esi,%edi
        !           568:        movl    %edx,%esi
        !           569:        jmp             LSplit
        !           570: 
        !           571: //split2:
        !           572: LSplit2:
        !           573: 
        !           574: //     temp = lp1;
        !           575: //     lp1 = lp2;
        !           576: //     lp2 = lp3;
        !           577: //     lp3 = temp;
        !           578:        movl    %ebx,%eax
        !           579:        movl    %esi,%ebx
        !           580:        movl    %edi,%esi
        !           581:        movl    %eax,%edi
        !           582: 
        !           583: //split:
        !           584: LSplit:
        !           585: 
        !           586:        subl    $24,%esp                // allocate space for a new vertex
        !           587: 
        !           588: //// split this edge
        !           589: //     new[0] = (lp1[0] + lp2[0]) >> 1;
        !           590: //     new[1] = (lp1[1] + lp2[1]) >> 1;
        !           591: //     new[2] = (lp1[2] + lp2[2]) >> 1;
        !           592: //     new[3] = (lp1[3] + lp2[3]) >> 1;
        !           593: //     new[5] = (lp1[5] + lp2[5]) >> 1;
        !           594:        movl    8(%ebx),%eax
        !           595: 
        !           596:        movl    8(%esi),%edx
        !           597:        movl    12(%ebx),%ecx
        !           598: 
        !           599:        addl    %edx,%eax
        !           600:        movl    12(%esi),%edx
        !           601: 
        !           602:        sarl    $1,%eax
        !           603:        addl    %edx,%ecx
        !           604: 
        !           605:        movl    %eax,8(%esp)
        !           606:        movl    20(%ebx),%eax
        !           607: 
        !           608:        sarl    $1,%ecx
        !           609:        movl    20(%esi),%edx
        !           610: 
        !           611:        movl    %ecx,12(%esp)
        !           612:        addl    %edx,%eax
        !           613: 
        !           614:        movl    0(%ebx),%ecx
        !           615:        movl    0(%esi),%edx
        !           616: 
        !           617:        sarl    $1,%eax
        !           618:        addl    %ecx,%edx
        !           619: 
        !           620:        movl    %eax,20(%esp)
        !           621:        movl    4(%ebx),%eax
        !           622: 
        !           623:        sarl    $1,%edx
        !           624:        movl    4(%esi),%ebp
        !           625: 
        !           626:        movl    %edx,0(%esp)
        !           627:        addl    %eax,%ebp
        !           628: 
        !           629:        sarl    $1,%ebp
        !           630:        movl    %ebp,4(%esp)
        !           631: 
        !           632: //// draw the point if splitting a leading edge
        !           633: //     if (lp2[1] > lp1[1])
        !           634: //             goto nodraw;
        !           635:        cmpl    %eax,4(%esi)
        !           636:        jg              LNoDraw
        !           637: 
        !           638: //     if ((lp2[1] == lp1[1]) && (lp2[0] < lp1[0]))
        !           639: //             goto nodraw;
        !           640:        movl    0(%esi),%edx
        !           641:        jnz             LDraw
        !           642: 
        !           643:        cmpl    %ecx,%edx
        !           644:        jl              LNoDraw
        !           645: 
        !           646: LDraw:
        !           647: 
        !           648: // z = new[5] >> 16;
        !           649:        movl    20(%esp),%edx
        !           650:        movl    4(%esp),%ecx
        !           651: 
        !           652:        sarl    $16,%edx
        !           653:        movl    0(%esp),%ebp
        !           654: 
        !           655: //     zbuf = zspantable[new[1]] + new[0];
        !           656:        movl    C(zspantable)(,%ecx,4),%eax
        !           657: 
        !           658: //     if (z >= *zbuf)
        !           659: //     {
        !           660:        cmpw    (%eax,%ebp,2),%dx
        !           661:        jnge    LNoDraw
        !           662: 
        !           663: //             int             pix;
        !           664: //             
        !           665: //             *zbuf = z;
        !           666:        movw    %dx,(%eax,%ebp,2)
        !           667: 
        !           668: //             pix = d_pcolormap[skintable[new[3]>>16][new[2]>>16]];
        !           669:        movl    12(%esp),%eax
        !           670: 
        !           671:        sarl    $16,%eax
        !           672:        movl    8(%esp),%edx
        !           673: 
        !           674:        sarl    $16,%edx
        !           675:        subl    %ecx,%ecx
        !           676: 
        !           677:        movl    C(skintable)(,%eax,4),%eax
        !           678:        movl    4(%esp),%ebp
        !           679: 
        !           680:        movb    (%eax,%edx,),%cl
        !           681:        movl    C(d_pcolormap),%edx
        !           682: 
        !           683:        movb    (%edx,%ecx,),%dl
        !           684:        movl    0(%esp),%ecx
        !           685: 
        !           686: //             d_viewbuffer[d_scantable[new[1]] + new[0]] = pix;
        !           687:        movl    C(d_scantable)(,%ebp,4),%eax
        !           688:        addl    %eax,%ecx
        !           689:        movl    C(d_viewbuffer),%eax
        !           690:        movb    %dl,(%eax,%ecx,1)
        !           691: 
        !           692: //     }
        !           693: //
        !           694: //nodraw:
        !           695: LNoDraw:
        !           696: 
        !           697: //// recursively continue
        !           698: //     D_PolysetRecursiveTriangle (lp3, lp1, new);
        !           699:        pushl   %esp
        !           700:        pushl   %ebx
        !           701:        pushl   %edi
        !           702:        call    C(D_PolysetRecursiveTriangle)
        !           703: 
        !           704: //     D_PolysetRecursiveTriangle (lp3, new, lp2);
        !           705:        movl    %esp,%ebx
        !           706:        pushl   %esi
        !           707:        pushl   %ebx
        !           708:        pushl   %edi
        !           709:        call    C(D_PolysetRecursiveTriangle)
        !           710:        addl    $24,%esp
        !           711: 
        !           712: LDone:
        !           713:        popl    %ebx                            // restore register variables
        !           714:        popl    %edi
        !           715:        popl    %esi
        !           716:        popl    %ebp                            // restore caller stack frame pointer
        !           717:        ret             $12
        !           718: 
        !           719: 
        !           720: //----------------------------------------------------------------------
        !           721: // 8-bpp horizontal span drawing code for affine polygons, with smooth
        !           722: // shading and no transparency
        !           723: //----------------------------------------------------------------------
        !           724: 
        !           725: #define pspans 4+8
        !           726: 
        !           727: .globl C(D_PolysetAff8Start)
        !           728: C(D_PolysetAff8Start):
        !           729: 
        !           730: .globl C(R_PolysetDrawSpans8_Opaque)
        !           731: C(R_PolysetDrawSpans8_Opaque):
        !           732:        pushl   %esi                            // preserve register variables
        !           733:        pushl   %ebx
        !           734: 
        !           735:        movl    pspans(%esp),%esi       // point to the first span descriptor
        !           736:        movl    C(r_zistepx),%ecx
        !           737: 
        !           738:        pushl   %ebp                            // preserve caller's stack frame
        !           739:        pushl   %edi
        !           740: 
        !           741:        rorl    $16,%ecx                        // put high 16 bits of 1/z step in low word
        !           742:        movl    spanpackage_t_count(%esi),%edx
        !           743: 
        !           744:        movl    %ecx,lzistepx
        !           745: 
        !           746: LSpanLoop:
        !           747: 
        !           748: //             lcount = d_aspancount - pspanpackage->count;
        !           749: //
        !           750: //             errorterm += erroradjustup;
        !           751: //             if (errorterm >= 0)
        !           752: //             {
        !           753: //                     d_aspancount += d_countextrastep;
        !           754: //                     errorterm -= erroradjustdown;
        !           755: //             }
        !           756: //             else
        !           757: //             {
        !           758: //                     d_aspancount += ubasestep;
        !           759: //             }
        !           760:        movl    C(d_aspancount),%eax
        !           761:        subl    %edx,%eax
        !           762: 
        !           763:        movl    C(erroradjustup),%edx
        !           764:        movl    C(errorterm),%ebx
        !           765:        addl    %edx,%ebx
        !           766:        js              LNoTurnover
        !           767: 
        !           768:        movl    C(erroradjustdown),%edx
        !           769:        movl    C(d_countextrastep),%edi
        !           770:        subl    %edx,%ebx
        !           771:        movl    C(d_aspancount),%ebp
        !           772:        movl    %ebx,C(errorterm)
        !           773:        addl    %edi,%ebp
        !           774:        movl    %ebp,C(d_aspancount)
        !           775:        jmp             LRightEdgeStepped
        !           776: 
        !           777: LNoTurnover:
        !           778:        movl    C(d_aspancount),%edi
        !           779:        movl    C(ubasestep),%edx
        !           780:        movl    %ebx,C(errorterm)
        !           781:        addl    %edx,%edi
        !           782:        movl    %edi,C(d_aspancount)
        !           783: 
        !           784: LRightEdgeStepped:
        !           785:        cmpl    $1,%eax
        !           786: 
        !           787:        jl              LNextSpan
        !           788:        jz              LExactlyOneLong
        !           789: 
        !           790: //
        !           791: // set up advancetable
        !           792: //
        !           793:        movl    C(a_ststepxwhole),%ecx
        !           794:        movl    C(r_affinetridesc)+atd_skinwidth,%edx
        !           795: 
        !           796:        movl    %ecx,advancetable+4     // advance base in t
        !           797:        addl    %edx,%ecx
        !           798: 
        !           799:        movl    %ecx,advancetable       // advance extra in t
        !           800:        movl    C(a_tstepxfrac),%ecx
        !           801: 
        !           802:        movw    C(r_lstepx),%cx
        !           803:        movl    %eax,%edx                       // count
        !           804: 
        !           805:        movl    %ecx,tstep
        !           806:        addl    $7,%edx
        !           807: 
        !           808:        shrl    $3,%edx                         // count of full and partial loops
        !           809:        movl    spanpackage_t_sfrac(%esi),%ebx
        !           810: 
        !           811:        movw    %dx,%bx
        !           812:        movl    spanpackage_t_pz(%esi),%ecx
        !           813: 
        !           814:        negl    %eax
        !           815: 
        !           816:        movl    spanpackage_t_pdest(%esi),%edi
        !           817:        andl    $7,%eax         // 0->0, 1->7, 2->6, ... , 7->1
        !           818: 
        !           819:        subl    %eax,%edi       // compensate for hardwired offsets
        !           820:        subl    %eax,%ecx
        !           821: 
        !           822:        subl    %eax,%ecx
        !           823:        movl    spanpackage_t_tfrac(%esi),%edx
        !           824: 
        !           825:        movw    spanpackage_t_light(%esi),%dx
        !           826:        movl    spanpackage_t_zi(%esi),%ebp
        !           827: 
        !           828:        rorl    $16,%ebp        // put high 16 bits of 1/z in low word
        !           829:        pushl   %esi
        !           830: 
        !           831:        movl    spanpackage_t_ptex(%esi),%esi
        !           832:        jmp             aff8entryvec_table(,%eax,4)
        !           833: 
        !           834: // %bx = count of full and partial loops
        !           835: // %ebx high word = sfrac
        !           836: // %ecx = pz
        !           837: // %dx = light
        !           838: // %edx high word = tfrac
        !           839: // %esi = ptex
        !           840: // %edi = pdest
        !           841: // %ebp = 1/z
        !           842: // tstep low word = C(r_lstepx)
        !           843: // tstep high word = C(a_tstepxfrac)
        !           844: // C(a_sstepxfrac) low word = 0
        !           845: // C(a_sstepxfrac) high word = C(a_sstepxfrac)
        !           846: 
        !           847: LDrawLoop:
        !           848: 
        !           849: // FIXME: do we need to clamp light? We may need at least a buffer bit to
        !           850: // keep it from poking into tfrac and causing problems
        !           851: 
        !           852: LDraw8:
        !           853:        cmpw    (%ecx),%bp
        !           854:        jl              Lp1
        !           855:        xorl    %eax,%eax
        !           856:        movb    %dh,%ah
        !           857:        movb    (%esi),%al
        !           858:        movw    %bp,(%ecx)
        !           859:        movb    0x12345678(%eax),%al
        !           860: LPatch8:
        !           861:        movb    %al,(%edi)
        !           862: Lp1:
        !           863:        addl    tstep,%edx
        !           864:        sbbl    %eax,%eax
        !           865:        addl    lzistepx,%ebp
        !           866:        adcl    $0,%ebp
        !           867:        addl    C(a_sstepxfrac),%ebx
        !           868:        adcl    advancetable+4(,%eax,4),%esi
        !           869: 
        !           870: LDraw7:
        !           871:        cmpw    2(%ecx),%bp
        !           872:        jl              Lp2
        !           873:        xorl    %eax,%eax
        !           874:        movb    %dh,%ah
        !           875:        movb    (%esi),%al
        !           876:        movw    %bp,2(%ecx)
        !           877:        movb    0x12345678(%eax),%al
        !           878: LPatch7:
        !           879:        movb    %al,1(%edi)
        !           880: Lp2:
        !           881:        addl    tstep,%edx
        !           882:        sbbl    %eax,%eax
        !           883:        addl    lzistepx,%ebp
        !           884:        adcl    $0,%ebp
        !           885:        addl    C(a_sstepxfrac),%ebx
        !           886:        adcl    advancetable+4(,%eax,4),%esi
        !           887: 
        !           888: LDraw6:
        !           889:        cmpw    4(%ecx),%bp
        !           890:        jl              Lp3
        !           891:        xorl    %eax,%eax
        !           892:        movb    %dh,%ah
        !           893:        movb    (%esi),%al
        !           894:        movw    %bp,4(%ecx)
        !           895:        movb    0x12345678(%eax),%al
        !           896: LPatch6:
        !           897:        movb    %al,2(%edi)
        !           898: Lp3:
        !           899:        addl    tstep,%edx
        !           900:        sbbl    %eax,%eax
        !           901:        addl    lzistepx,%ebp
        !           902:        adcl    $0,%ebp
        !           903:        addl    C(a_sstepxfrac),%ebx
        !           904:        adcl    advancetable+4(,%eax,4),%esi
        !           905: 
        !           906: LDraw5:
        !           907:        cmpw    6(%ecx),%bp
        !           908:        jl              Lp4
        !           909:        xorl    %eax,%eax
        !           910:        movb    %dh,%ah
        !           911:        movb    (%esi),%al
        !           912:        movw    %bp,6(%ecx)
        !           913:        movb    0x12345678(%eax),%al
        !           914: LPatch5:
        !           915:        movb    %al,3(%edi)
        !           916: Lp4:
        !           917:        addl    tstep,%edx
        !           918:        sbbl    %eax,%eax
        !           919:        addl    lzistepx,%ebp
        !           920:        adcl    $0,%ebp
        !           921:        addl    C(a_sstepxfrac),%ebx
        !           922:        adcl    advancetable+4(,%eax,4),%esi
        !           923: 
        !           924: LDraw4:
        !           925:        cmpw    8(%ecx),%bp
        !           926:        jl              Lp5
        !           927:        xorl    %eax,%eax
        !           928:        movb    %dh,%ah
        !           929:        movb    (%esi),%al
        !           930:        movw    %bp,8(%ecx)
        !           931:        movb    0x12345678(%eax),%al
        !           932: LPatch4:
        !           933:        movb    %al,4(%edi)
        !           934: Lp5:
        !           935:        addl    tstep,%edx
        !           936:        sbbl    %eax,%eax
        !           937:        addl    lzistepx,%ebp
        !           938:        adcl    $0,%ebp
        !           939:        addl    C(a_sstepxfrac),%ebx
        !           940:        adcl    advancetable+4(,%eax,4),%esi
        !           941: 
        !           942: LDraw3:
        !           943:        cmpw    10(%ecx),%bp
        !           944:        jl              Lp6
        !           945:        xorl    %eax,%eax
        !           946:        movb    %dh,%ah
        !           947:        movb    (%esi),%al
        !           948:        movw    %bp,10(%ecx)
        !           949:        movb    0x12345678(%eax),%al
        !           950: LPatch3:
        !           951:        movb    %al,5(%edi)
        !           952: Lp6:
        !           953:        addl    tstep,%edx
        !           954:        sbbl    %eax,%eax
        !           955:        addl    lzistepx,%ebp
        !           956:        adcl    $0,%ebp
        !           957:        addl    C(a_sstepxfrac),%ebx
        !           958:        adcl    advancetable+4(,%eax,4),%esi
        !           959: 
        !           960: LDraw2:
        !           961:        cmpw    12(%ecx),%bp
        !           962:        jl              Lp7
        !           963:        xorl    %eax,%eax
        !           964:        movb    %dh,%ah
        !           965:        movb    (%esi),%al
        !           966:        movw    %bp,12(%ecx)
        !           967:        movb    0x12345678(%eax),%al
        !           968: LPatch2:
        !           969:        movb    %al,6(%edi)
        !           970: Lp7:
        !           971:        addl    tstep,%edx
        !           972:        sbbl    %eax,%eax
        !           973:        addl    lzistepx,%ebp
        !           974:        adcl    $0,%ebp
        !           975:        addl    C(a_sstepxfrac),%ebx
        !           976:        adcl    advancetable+4(,%eax,4),%esi
        !           977: 
        !           978: LDraw1:
        !           979:        cmpw    14(%ecx),%bp
        !           980:        jl              Lp8
        !           981:        xorl    %eax,%eax
        !           982:        movb    %dh,%ah
        !           983:        movb    (%esi),%al
        !           984:        movw    %bp,14(%ecx)
        !           985:        movb    0x12345678(%eax),%al
        !           986: LPatch1:
        !           987:        movb    %al,7(%edi)
        !           988: Lp8:
        !           989:        addl    tstep,%edx
        !           990:        sbbl    %eax,%eax
        !           991:        addl    lzistepx,%ebp
        !           992:        adcl    $0,%ebp
        !           993:        addl    C(a_sstepxfrac),%ebx
        !           994:        adcl    advancetable+4(,%eax,4),%esi
        !           995: 
        !           996:        addl    $8,%edi
        !           997:        addl    $16,%ecx
        !           998: 
        !           999:        decw    %bx
        !          1000:        jnz             LDrawLoop
        !          1001: 
        !          1002:        popl    %esi                            // restore spans pointer
        !          1003: LNextSpan:
        !          1004:        addl    $(spanpackage_t_size),%esi      // point to next span
        !          1005: LNextSpanESISet:
        !          1006:        movl    spanpackage_t_count(%esi),%edx
        !          1007:        cmpl    $-999999,%edx           // any more spans?
        !          1008:        jnz             LSpanLoop                       // yes
        !          1009: 
        !          1010:        popl    %edi
        !          1011:        popl    %ebp                            // restore the caller's stack frame
        !          1012:        popl    %ebx                            // restore register variables
        !          1013:        popl    %esi
        !          1014:        ret
        !          1015: 
        !          1016: 
        !          1017: // draw a one-long span
        !          1018: 
        !          1019: LExactlyOneLong:
        !          1020: 
        !          1021:        movl    spanpackage_t_pz(%esi),%ecx
        !          1022:        movl    spanpackage_t_zi(%esi),%ebp
        !          1023: 
        !          1024:        rorl    $16,%ebp        // put high 16 bits of 1/z in low word
        !          1025:        movl    spanpackage_t_ptex(%esi),%ebx
        !          1026: 
        !          1027:        cmpw    (%ecx),%bp
        !          1028:        jl              LNextSpan
        !          1029:        xorl    %eax,%eax
        !          1030:        movl    spanpackage_t_pdest(%esi),%edi
        !          1031:        movb    spanpackage_t_light+1(%esi),%ah
        !          1032:        addl    $(spanpackage_t_size),%esi      // point to next span
        !          1033:        movb    (%ebx),%al
        !          1034:        movw    %bp,(%ecx)
        !          1035:        movb    0x12345678(%eax),%al
        !          1036: LPatch9:
        !          1037:        movb    %al,(%edi)
        !          1038: 
        !          1039:        jmp             LNextSpanESISet
        !          1040: 
        !          1041: .globl C(D_PolysetAff8End)
        !          1042: C(D_PolysetAff8End):
        !          1043: 
        !          1044: 
        !          1045: .extern C(alias_colormap)
        !          1046: // #define pcolormap           4
        !          1047: 
        !          1048: .globl C(D_Aff8Patch)
        !          1049: C(D_Aff8Patch):
        !          1050:        movl    C(alias_colormap),%eax
        !          1051:        movl    %eax,LPatch1-4
        !          1052:        movl    %eax,LPatch2-4
        !          1053:        movl    %eax,LPatch3-4
        !          1054:        movl    %eax,LPatch4-4
        !          1055:        movl    %eax,LPatch5-4
        !          1056:        movl    %eax,LPatch6-4
        !          1057:        movl    %eax,LPatch7-4
        !          1058:        movl    %eax,LPatch8-4
        !          1059:        movl    %eax,LPatch9-4
        !          1060: 
        !          1061:        ret
        !          1062: 
        !          1063: //----------------------------------------------------------------------
        !          1064: // Alias model triangle left-edge scanning code
        !          1065: //----------------------------------------------------------------------
        !          1066: 
        !          1067: #define height 4+16
        !          1068: 
        !          1069: .globl C(R_PolysetScanLeftEdge)
        !          1070: C(R_PolysetScanLeftEdge):
        !          1071:        pushl   %ebp                            // preserve caller stack frame pointer
        !          1072:        pushl   %esi                            // preserve register variables
        !          1073:        pushl   %edi
        !          1074:        pushl   %ebx
        !          1075: 
        !          1076:        movl    height(%esp),%eax
        !          1077:        movl    C(d_sfrac),%ecx
        !          1078:        andl    $0xFFFF,%eax
        !          1079:        movl    C(d_ptex),%ebx
        !          1080:        orl             %eax,%ecx
        !          1081:        movl    C(d_pedgespanpackage),%esi
        !          1082:        movl    C(d_tfrac),%edx
        !          1083:        movl    C(d_light),%edi
        !          1084:        movl    C(d_zi),%ebp
        !          1085: 
        !          1086: // %eax: scratch
        !          1087: // %ebx: d_ptex
        !          1088: // %ecx: d_sfrac in high word, count in low word
        !          1089: // %edx: d_tfrac
        !          1090: // %esi: d_pedgespanpackage, errorterm, scratch alternately
        !          1091: // %edi: d_light
        !          1092: // %ebp: d_zi
        !          1093: 
        !          1094: //     do
        !          1095: //     {
        !          1096: 
        !          1097: LScanLoop:
        !          1098: 
        !          1099: //             d_pedgespanpackage->ptex = ptex;
        !          1100: //             d_pedgespanpackage->pdest = d_pdest;
        !          1101: //             d_pedgespanpackage->pz = d_pz;
        !          1102: //             d_pedgespanpackage->count = d_aspancount;
        !          1103: //             d_pedgespanpackage->light = d_light;
        !          1104: //             d_pedgespanpackage->zi = d_zi;
        !          1105: //             d_pedgespanpackage->sfrac = d_sfrac << 16;
        !          1106: //             d_pedgespanpackage->tfrac = d_tfrac << 16;
        !          1107:        movl    %ebx,spanpackage_t_ptex(%esi)
        !          1108:        movl    C(d_pdest),%eax
        !          1109:        movl    %eax,spanpackage_t_pdest(%esi)
        !          1110:        movl    C(d_pz),%eax
        !          1111:        movl    %eax,spanpackage_t_pz(%esi)
        !          1112:        movl    C(d_aspancount),%eax
        !          1113:        movl    %eax,spanpackage_t_count(%esi)
        !          1114:        movl    %edi,spanpackage_t_light(%esi)
        !          1115:        movl    %ebp,spanpackage_t_zi(%esi)
        !          1116:        movl    %ecx,spanpackage_t_sfrac(%esi)
        !          1117:        movl    %edx,spanpackage_t_tfrac(%esi)
        !          1118: 
        !          1119: // pretouch the next cache line
        !          1120:        movb    spanpackage_t_size(%esi),%al
        !          1121: 
        !          1122: //             d_pedgespanpackage++;
        !          1123:        addl    $(spanpackage_t_size),%esi
        !          1124:        movl    C(erroradjustup),%eax
        !          1125:        movl    %esi,C(d_pedgespanpackage)
        !          1126: 
        !          1127: //             errorterm += erroradjustup;
        !          1128:        movl    C(errorterm),%esi
        !          1129:        addl    %eax,%esi
        !          1130:        movl    C(d_pdest),%eax
        !          1131: 
        !          1132: //             if (errorterm >= 0)
        !          1133: //             {
        !          1134:        js              LNoLeftEdgeTurnover
        !          1135: 
        !          1136: //                     errorterm -= erroradjustdown;
        !          1137: //                     d_pdest += d_pdestextrastep;
        !          1138:        subl    C(erroradjustdown),%esi
        !          1139:        addl    C(d_pdestextrastep),%eax
        !          1140:        movl    %esi,C(errorterm)
        !          1141:        movl    %eax,C(d_pdest)
        !          1142: 
        !          1143: //                     d_pz += d_pzextrastep;
        !          1144: //                     d_aspancount += d_countextrastep;
        !          1145: //                     d_ptex += d_ptexextrastep;
        !          1146: //                     d_sfrac += d_sfracextrastep;
        !          1147: //                     d_ptex += d_sfrac >> 16;
        !          1148: //                     d_sfrac &= 0xFFFF;
        !          1149: //                     d_tfrac += d_tfracextrastep;
        !          1150:        movl    C(d_pz),%eax
        !          1151:        movl    C(d_aspancount),%esi
        !          1152:        addl    C(d_pzextrastep),%eax
        !          1153:        addl    C(d_sfracextrastep),%ecx
        !          1154:        adcl    C(d_ptexextrastep),%ebx
        !          1155:        addl    C(d_countextrastep),%esi
        !          1156:        movl    %eax,C(d_pz)
        !          1157:        movl    C(d_tfracextrastep),%eax
        !          1158:        movl    %esi,C(d_aspancount)
        !          1159:        addl    %eax,%edx
        !          1160: 
        !          1161: //                     if (d_tfrac & 0x10000)
        !          1162: //                     {
        !          1163:        jnc             LSkip1
        !          1164: 
        !          1165: //                             d_ptex += r_affinetridesc.skinwidth;
        !          1166: //                             d_tfrac &= 0xFFFF;
        !          1167:        addl    C(r_affinetridesc)+atd_skinwidth,%ebx
        !          1168: 
        !          1169: //                     }
        !          1170: 
        !          1171: LSkip1:
        !          1172: 
        !          1173: //                     d_light += d_lightextrastep;
        !          1174: //                     d_zi += d_ziextrastep;
        !          1175:        addl    C(d_lightextrastep),%edi
        !          1176:        addl    C(d_ziextrastep),%ebp
        !          1177: 
        !          1178: //             }
        !          1179:        movl    C(d_pedgespanpackage),%esi
        !          1180:        decl    %ecx
        !          1181:        testl   $0xFFFF,%ecx
        !          1182:        jnz             LScanLoop
        !          1183: 
        !          1184:        popl    %ebx
        !          1185:        popl    %edi
        !          1186:        popl    %esi
        !          1187:        popl    %ebp
        !          1188:        ret
        !          1189: 
        !          1190: //             else
        !          1191: //             {
        !          1192: 
        !          1193: LNoLeftEdgeTurnover:
        !          1194:        movl    %esi,C(errorterm)
        !          1195: 
        !          1196: //                     d_pdest += d_pdestbasestep;
        !          1197:        addl    C(d_pdestbasestep),%eax
        !          1198:        movl    %eax,C(d_pdest)
        !          1199: 
        !          1200: //                     d_pz += d_pzbasestep;
        !          1201: //                     d_aspancount += ubasestep;
        !          1202: //                     d_ptex += d_ptexbasestep;
        !          1203: //                     d_sfrac += d_sfracbasestep;
        !          1204: //                     d_ptex += d_sfrac >> 16;
        !          1205: //                     d_sfrac &= 0xFFFF;
        !          1206:        movl    C(d_pz),%eax
        !          1207:        movl    C(d_aspancount),%esi
        !          1208:        addl    C(d_pzbasestep),%eax
        !          1209:        addl    C(d_sfracbasestep),%ecx
        !          1210:        adcl    C(d_ptexbasestep),%ebx
        !          1211:        addl    C(ubasestep),%esi
        !          1212:        movl    %eax,C(d_pz)
        !          1213:        movl    %esi,C(d_aspancount)
        !          1214: 
        !          1215: //                     d_tfrac += d_tfracbasestep;
        !          1216:        movl    C(d_tfracbasestep),%esi
        !          1217:        addl    %esi,%edx
        !          1218: 
        !          1219: //                     if (d_tfrac & 0x10000)
        !          1220: //                     {
        !          1221:        jnc             LSkip2
        !          1222: 
        !          1223: //                             d_ptex += r_affinetridesc.skinwidth;
        !          1224: //                             d_tfrac &= 0xFFFF;
        !          1225:        addl    C(r_affinetridesc)+atd_skinwidth,%ebx
        !          1226: 
        !          1227: //                     }
        !          1228: 
        !          1229: LSkip2:
        !          1230: 
        !          1231: //                     d_light += d_lightbasestep;
        !          1232: //                     d_zi += d_zibasestep;
        !          1233:        addl    C(d_lightbasestep),%edi
        !          1234:        addl    C(d_zibasestep),%ebp
        !          1235: 
        !          1236: //             }
        !          1237: //     } while (--height);
        !          1238:        movl    C(d_pedgespanpackage),%esi
        !          1239:        decl    %ecx
        !          1240:        testl   $0xFFFF,%ecx
        !          1241:        jnz             LScanLoop
        !          1242: 
        !          1243:        popl    %ebx
        !          1244:        popl    %edi
        !          1245:        popl    %esi
        !          1246:        popl    %ebp
        !          1247:        ret
        !          1248: 
        !          1249: #endif // id386
        !          1250: 

unix.superglobalmegacorp.com

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