Annotation of quake2/linux/d_polysa.s, revision 1.1.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.