Annotation of quake2/linux/r_spr8.s, revision 1.1.1.1

1.1       root        1: //
                      2: // d_spr8.s
                      3: // x86 assembly-language horizontal 8-bpp transparent span-drawing code.
                      4: //
                      5: 
                      6: #include "qasm.h"
                      7: 
                      8: #if id386
                      9: 
                     10: //----------------------------------------------------------------------
                     11: // 8-bpp horizontal span drawing code for polygons, with transparency.
                     12: //----------------------------------------------------------------------
                     13: 
                     14:        .text
                     15: 
                     16: // out-of-line, rarely-needed clamping code
                     17: 
                     18: LClampHigh0:
                     19:        movl    C(bbextents),%esi
                     20:        jmp             LClampReentry0
                     21: LClampHighOrLow0:
                     22:        jg              LClampHigh0
                     23:        xorl    %esi,%esi
                     24:        jmp             LClampReentry0
                     25: 
                     26: LClampHigh1:
                     27:        movl    C(bbextentt),%edx
                     28:        jmp             LClampReentry1
                     29: LClampHighOrLow1:
                     30:        jg              LClampHigh1
                     31:        xorl    %edx,%edx
                     32:        jmp             LClampReentry1
                     33: 
                     34: LClampLow2:
                     35:        movl    $2048,%ebp
                     36:        jmp             LClampReentry2
                     37: LClampHigh2:
                     38:        movl    C(bbextents),%ebp
                     39:        jmp             LClampReentry2
                     40: 
                     41: LClampLow3:
                     42:        movl    $2048,%ecx
                     43:        jmp             LClampReentry3
                     44: LClampHigh3:
                     45:        movl    C(bbextentt),%ecx
                     46:        jmp             LClampReentry3
                     47: 
                     48: LClampLow4:
                     49:        movl    $2048,%eax
                     50:        jmp             LClampReentry4
                     51: LClampHigh4:
                     52:        movl    C(bbextents),%eax
                     53:        jmp             LClampReentry4
                     54: 
                     55: LClampLow5:
                     56:        movl    $2048,%ebx
                     57:        jmp             LClampReentry5
                     58: LClampHigh5:
                     59:        movl    C(bbextentt),%ebx
                     60:        jmp             LClampReentry5
                     61: 
                     62: 
                     63: #define pspans 4+16
                     64: 
                     65:        .align 4
                     66: .globl C(D_SpriteDrawSpans)
                     67: C(D_SpriteDrawSpans):
                     68:        pushl   %ebp                            // preserve caller's stack frame
                     69:        pushl   %edi
                     70:        pushl   %esi                            // preserve register variables
                     71:        pushl   %ebx
                     72: 
                     73: //
                     74: // set up scaled-by-8 steps, for 8-long segments; also set up cacheblock
                     75: // and span list pointers, and 1/z step in 0.32 fixed-point
                     76: //
                     77: // FIXME: any overlap from rearranging?
                     78:        flds    C(d_sdivzstepu)
                     79:        fmuls   fp_8
                     80:        movl    C(cacheblock),%edx
                     81:        flds    C(d_tdivzstepu)
                     82:        fmuls   fp_8
                     83:        movl    pspans(%esp),%ebx       // point to the first span descriptor
                     84:        flds    C(d_zistepu)
                     85:        fmuls   fp_8
                     86:        movl    %edx,pbase                      // pbase = cacheblock
                     87:        flds    C(d_zistepu)
                     88:        fmuls   fp_64kx64k
                     89:        fxch    %st(3)
                     90:        fstps   sdivz8stepu
                     91:        fstps   zi8stepu
                     92:        fstps   tdivz8stepu
                     93:        fistpl  izistep
                     94:        movl    izistep,%eax
                     95:        rorl    $16,%eax                // put upper 16 bits in low word
                     96:        movl    sspan_t_count(%ebx),%ecx
                     97:        movl    %eax,izistep
                     98: 
                     99:        cmpl    $0,%ecx
                    100:        jle             LNextSpan
                    101: 
                    102: LSpanLoop:
                    103: 
                    104: //
                    105: // set up the initial s/z, t/z, and 1/z on the FP stack, and generate the
                    106: // initial s and t values
                    107: //
                    108: // FIXME: pipeline FILD?
                    109:        fildl   sspan_t_v(%ebx)
                    110:        fildl   sspan_t_u(%ebx)
                    111: 
                    112:        fld             %st(1)                  // dv | du | dv
                    113:        fmuls   C(d_sdivzstepv) // dv*d_sdivzstepv | du | dv
                    114:        fld             %st(1)                  // du | dv*d_sdivzstepv | du | dv
                    115:        fmuls   C(d_sdivzstepu) // du*d_sdivzstepu | dv*d_sdivzstepv | du | dv
                    116:        fld             %st(2)                  // du | du*d_sdivzstepu | dv*d_sdivzstepv | du | dv
                    117:        fmuls   C(d_tdivzstepu) // du*d_tdivzstepu | du*d_sdivzstepu |
                    118:                                                        //  dv*d_sdivzstepv | du | dv
                    119:        fxch    %st(1)                  // du*d_sdivzstepu | du*d_tdivzstepu |
                    120:                                                        //  dv*d_sdivzstepv | du | dv
                    121:        faddp   %st(0),%st(2)   // du*d_tdivzstepu |
                    122:                                                        //  du*d_sdivzstepu + dv*d_sdivzstepv | du | dv
                    123:        fxch    %st(1)                  // du*d_sdivzstepu + dv*d_sdivzstepv |
                    124:                                                        //  du*d_tdivzstepu | du | dv
                    125:        fld             %st(3)                  // dv | du*d_sdivzstepu + dv*d_sdivzstepv |
                    126:                                                        //  du*d_tdivzstepu | du | dv
                    127:        fmuls   C(d_tdivzstepv) // dv*d_tdivzstepv |
                    128:                                                        //  du*d_sdivzstepu + dv*d_sdivzstepv |
                    129:                                                        //  du*d_tdivzstepu | du | dv
                    130:        fxch    %st(1)                  // du*d_sdivzstepu + dv*d_sdivzstepv |
                    131:                                                        //  dv*d_tdivzstepv | du*d_tdivzstepu | du | dv
                    132:        fadds   C(d_sdivzorigin) // sdivz = d_sdivzorigin + dv*d_sdivzstepv +
                    133:                                                        //  du*d_sdivzstepu; stays in %st(2) at end
                    134:        fxch    %st(4)                  // dv | dv*d_tdivzstepv | du*d_tdivzstepu | du |
                    135:                                                        //  s/z
                    136:        fmuls   C(d_zistepv)            // dv*d_zistepv | dv*d_tdivzstepv |
                    137:                                                        //  du*d_tdivzstepu | du | s/z
                    138:        fxch    %st(1)                  // dv*d_tdivzstepv |  dv*d_zistepv |
                    139:                                                        //  du*d_tdivzstepu | du | s/z
                    140:        faddp   %st(0),%st(2)   // dv*d_zistepv |
                    141:                                                        //  dv*d_tdivzstepv + du*d_tdivzstepu | du | s/z
                    142:        fxch    %st(2)                  // du | dv*d_tdivzstepv + du*d_tdivzstepu |
                    143:                                                        //  dv*d_zistepv | s/z
                    144:        fmuls   C(d_zistepu)            // du*d_zistepu |
                    145:                                                        //  dv*d_tdivzstepv + du*d_tdivzstepu |
                    146:                                                        //  dv*d_zistepv | s/z
                    147:        fxch    %st(1)                  // dv*d_tdivzstepv + du*d_tdivzstepu |
                    148:                                                        //  du*d_zistepu | dv*d_zistepv | s/z
                    149:        fadds   C(d_tdivzorigin)        // tdivz = d_tdivzorigin + dv*d_tdivzstepv +
                    150:                                                        //  du*d_tdivzstepu; stays in %st(1) at end
                    151:        fxch    %st(2)                  // dv*d_zistepv | du*d_zistepu | t/z | s/z
                    152:        faddp   %st(0),%st(1)   // dv*d_zistepv + du*d_zistepu | t/z | s/z
                    153: 
                    154:        flds    fp_64k                  // fp_64k | dv*d_zistepv + du*d_zistepu | t/z | s/z
                    155:        fxch    %st(1)                  // dv*d_zistepv + du*d_zistepu | fp_64k | t/z | s/z
                    156:        fadds   C(d_ziorigin)           // zi = d_ziorigin + dv*d_zistepv +
                    157:                                                        //  du*d_zistepu; stays in %st(0) at end
                    158:                                                        // 1/z | fp_64k | t/z | s/z
                    159: 
                    160:        fld             %st(0)                  // FIXME: get rid of stall on FMUL?
                    161:        fmuls   fp_64kx64k
                    162:        fxch    %st(1)
                    163: 
                    164: //
                    165: // calculate and clamp s & t
                    166: //
                    167:        fdivr   %st(0),%st(2)   // 1/z | z*64k | t/z | s/z
                    168:        fxch    %st(1)
                    169: 
                    170:        fistpl  izi                             // 0.32 fixed-point 1/z
                    171:        movl    izi,%ebp
                    172: 
                    173: //
                    174: // set pz to point to the first z-buffer pixel in the span
                    175: //
                    176:        rorl    $16,%ebp                // put upper 16 bits in low word
                    177:        movl    sspan_t_v(%ebx),%eax
                    178:        movl    %ebp,izi
                    179:        movl    sspan_t_u(%ebx),%ebp
                    180:        imull   C(d_zrowbytes)
                    181:        shll    $1,%ebp                                 // a word per pixel
                    182:        addl    C(d_pzbuffer),%eax
                    183:        addl    %ebp,%eax
                    184:        movl    %eax,pz
                    185: 
                    186: //
                    187: // point %edi to the first pixel in the span
                    188: //
                    189:        movl    C(d_viewbuffer),%ebp
                    190:        movl    sspan_t_v(%ebx),%eax
                    191:        pushl   %ebx            // preserve spans pointer
                    192:        movl    C(tadjust),%edx
                    193:        movl    C(sadjust),%esi
                    194:        movl    C(d_scantable)(,%eax,4),%edi    // v * screenwidth
                    195:        addl    %ebp,%edi
                    196:        movl    sspan_t_u(%ebx),%ebp
                    197:        addl    %ebp,%edi                               // pdest = &pdestspan[scans->u];
                    198: 
                    199: //
                    200: // now start the FDIV for the end of the span
                    201: //
                    202:        cmpl    $8,%ecx
                    203:        ja              LSetupNotLast1
                    204: 
                    205:        decl    %ecx
                    206:        jz              LCleanup1               // if only one pixel, no need to start an FDIV
                    207:        movl    %ecx,spancountminus1
                    208: 
                    209: // finish up the s and t calcs
                    210:        fxch    %st(1)                  // z*64k | 1/z | t/z | s/z
                    211: 
                    212:        fld             %st(0)                  // z*64k | z*64k | 1/z | t/z | s/z
                    213:        fmul    %st(4),%st(0)   // s | z*64k | 1/z | t/z | s/z
                    214:        fxch    %st(1)                  // z*64k | s | 1/z | t/z | s/z
                    215:        fmul    %st(3),%st(0)   // t | s | 1/z | t/z | s/z
                    216:        fxch    %st(1)                  // s | t | 1/z | t/z | s/z
                    217:        fistpl  s                               // 1/z | t | t/z | s/z
                    218:        fistpl  t                               // 1/z | t/z | s/z
                    219: 
                    220:        fildl   spancountminus1
                    221: 
                    222:        flds    C(d_tdivzstepu) // _d_tdivzstepu | spancountminus1
                    223:        flds    C(d_zistepu)    // _d_zistepu | _d_tdivzstepu | spancountminus1
                    224:        fmul    %st(2),%st(0)   // _d_zistepu*scm1 | _d_tdivzstepu | scm1
                    225:        fxch    %st(1)                  // _d_tdivzstepu | _d_zistepu*scm1 | scm1
                    226:        fmul    %st(2),%st(0)   // _d_tdivzstepu*scm1 | _d_zistepu*scm1 | scm1
                    227:        fxch    %st(2)                  // scm1 | _d_zistepu*scm1 | _d_tdivzstepu*scm1
                    228:        fmuls   C(d_sdivzstepu) // _d_sdivzstepu*scm1 | _d_zistepu*scm1 |
                    229:                                                        //  _d_tdivzstepu*scm1
                    230:        fxch    %st(1)                  // _d_zistepu*scm1 | _d_sdivzstepu*scm1 |
                    231:                                                        //  _d_tdivzstepu*scm1
                    232:        faddp   %st(0),%st(3)   // _d_sdivzstepu*scm1 | _d_tdivzstepu*scm1
                    233:        fxch    %st(1)                  // _d_tdivzstepu*scm1 | _d_sdivzstepu*scm1
                    234:        faddp   %st(0),%st(3)   // _d_sdivzstepu*scm1
                    235:        faddp   %st(0),%st(3)
                    236: 
                    237:        flds    fp_64k
                    238:        fdiv    %st(1),%st(0)   // this is what we've gone to all this trouble to
                    239:                                                        //  overlap
                    240:        jmp             LFDIVInFlight1
                    241: 
                    242: LCleanup1:
                    243: // finish up the s and t calcs
                    244:        fxch    %st(1)                  // z*64k | 1/z | t/z | s/z
                    245: 
                    246:        fld             %st(0)                  // z*64k | z*64k | 1/z | t/z | s/z
                    247:        fmul    %st(4),%st(0)   // s | z*64k | 1/z | t/z | s/z
                    248:        fxch    %st(1)                  // z*64k | s | 1/z | t/z | s/z
                    249:        fmul    %st(3),%st(0)   // t | s | 1/z | t/z | s/z
                    250:        fxch    %st(1)                  // s | t | 1/z | t/z | s/z
                    251:        fistpl  s                               // 1/z | t | t/z | s/z
                    252:        fistpl  t                               // 1/z | t/z | s/z
                    253:        jmp             LFDIVInFlight1
                    254: 
                    255:        .align  4
                    256: LSetupNotLast1:
                    257: // finish up the s and t calcs
                    258:        fxch    %st(1)                  // z*64k | 1/z | t/z | s/z
                    259: 
                    260:        fld             %st(0)                  // z*64k | z*64k | 1/z | t/z | s/z
                    261:        fmul    %st(4),%st(0)   // s | z*64k | 1/z | t/z | s/z
                    262:        fxch    %st(1)                  // z*64k | s | 1/z | t/z | s/z
                    263:        fmul    %st(3),%st(0)   // t | s | 1/z | t/z | s/z
                    264:        fxch    %st(1)                  // s | t | 1/z | t/z | s/z
                    265:        fistpl  s                               // 1/z | t | t/z | s/z
                    266:        fistpl  t                               // 1/z | t/z | s/z
                    267: 
                    268:        fadds   zi8stepu
                    269:        fxch    %st(2)
                    270:        fadds   sdivz8stepu
                    271:        fxch    %st(2)
                    272:        flds    tdivz8stepu
                    273:        faddp   %st(0),%st(2)
                    274:        flds    fp_64k
                    275:        fdiv    %st(1),%st(0)   // z = 1/1/z
                    276:                                                        // this is what we've gone to all this trouble to
                    277:                                                        //  overlap
                    278: LFDIVInFlight1:
                    279: 
                    280:        addl    s,%esi
                    281:        addl    t,%edx
                    282:        movl    C(bbextents),%ebx
                    283:        movl    C(bbextentt),%ebp
                    284:        cmpl    %ebx,%esi
                    285:        ja              LClampHighOrLow0
                    286: LClampReentry0:
                    287:        movl    %esi,s
                    288:        movl    pbase,%ebx
                    289:        shll    $16,%esi
                    290:        cmpl    %ebp,%edx
                    291:        movl    %esi,sfracf
                    292:        ja              LClampHighOrLow1
                    293: LClampReentry1:
                    294:        movl    %edx,t
                    295:        movl    s,%esi                                  // sfrac = scans->sfrac;
                    296:        shll    $16,%edx
                    297:        movl    t,%eax                                  // tfrac = scans->tfrac;
                    298:        sarl    $16,%esi
                    299:        movl    %edx,tfracf
                    300: 
                    301: //
                    302: // calculate the texture starting address
                    303: //
                    304:        sarl    $16,%eax
                    305:        addl    %ebx,%esi
                    306:        imull   C(cachewidth),%eax              // (tfrac >> 16) * cachewidth
                    307:        addl    %eax,%esi                               // psource = pbase + (sfrac >> 16) +
                    308:                                                                        //           ((tfrac >> 16) * cachewidth);
                    309: 
                    310: //
                    311: // determine whether last span or not
                    312: //
                    313:        cmpl    $8,%ecx
                    314:        jna             LLastSegment
                    315: 
                    316: //
                    317: // not the last segment; do full 8-wide segment
                    318: //
                    319: LNotLastSegment:
                    320: 
                    321: //
                    322: // advance s/z, t/z, and 1/z, and calculate s & t at end of span and steps to
                    323: // get there
                    324: //
                    325: 
                    326: // pick up after the FDIV that was left in flight previously
                    327: 
                    328:        fld             %st(0)                  // duplicate it
                    329:        fmul    %st(4),%st(0)   // s = s/z * z
                    330:        fxch    %st(1)
                    331:        fmul    %st(3),%st(0)   // t = t/z * z
                    332:        fxch    %st(1)
                    333:        fistpl  snext
                    334:        fistpl  tnext
                    335:        movl    snext,%eax
                    336:        movl    tnext,%edx
                    337: 
                    338:        subl    $8,%ecx         // count off this segments' pixels
                    339:        movl    C(sadjust),%ebp
                    340:        pushl   %ecx            // remember count of remaining pixels
                    341:        movl    C(tadjust),%ecx
                    342: 
                    343:        addl    %eax,%ebp
                    344:        addl    %edx,%ecx
                    345: 
                    346:        movl    C(bbextents),%eax
                    347:        movl    C(bbextentt),%edx
                    348: 
                    349:        cmpl    $2048,%ebp
                    350:        jl              LClampLow2
                    351:        cmpl    %eax,%ebp
                    352:        ja              LClampHigh2
                    353: LClampReentry2:
                    354: 
                    355:        cmpl    $2048,%ecx
                    356:        jl              LClampLow3
                    357:        cmpl    %edx,%ecx
                    358:        ja              LClampHigh3
                    359: LClampReentry3:
                    360: 
                    361:        movl    %ebp,snext
                    362:        movl    %ecx,tnext
                    363: 
                    364:        subl    s,%ebp
                    365:        subl    t,%ecx
                    366:        
                    367: //
                    368: // set up advancetable
                    369: //
                    370:        movl    %ecx,%eax
                    371:        movl    %ebp,%edx
                    372:        sarl    $19,%edx                        // sstep >>= 16;
                    373:        movl    C(cachewidth),%ebx
                    374:        sarl    $19,%eax                        // tstep >>= 16;
                    375:        jz              LIsZero
                    376:        imull   %ebx,%eax                       // (tstep >> 16) * cachewidth;
                    377: LIsZero:
                    378:        addl    %edx,%eax                       // add in sstep
                    379:                                                                // (tstep >> 16) * cachewidth + (sstep >> 16);
                    380:        movl    tfracf,%edx
                    381:        movl    %eax,advancetable+4     // advance base in t
                    382:        addl    %ebx,%eax                       // ((tstep >> 16) + 1) * cachewidth +
                    383:                                                                //  (sstep >> 16);
                    384:        shll    $13,%ebp                        // left-justify sstep fractional part
                    385:        movl    %ebp,sstep
                    386:        movl    sfracf,%ebx
                    387:        shll    $13,%ecx                        // left-justify tstep fractional part
                    388:        movl    %eax,advancetable       // advance extra in t
                    389:        movl    %ecx,tstep
                    390: 
                    391:        movl    pz,%ecx
                    392:        movl    izi,%ebp
                    393: 
                    394:        cmpw    (%ecx),%bp
                    395:        jl              Lp1
                    396:        movb    (%esi),%al                      // get first source texel
                    397:        cmpb    $(TRANSPARENT_COLOR),%al
                    398:        jz              Lp1
                    399:        movw    %bp,(%ecx)
                    400:        movb    %al,(%edi)                      // store first dest pixel
                    401: Lp1:
                    402:        addl    izistep,%ebp
                    403:        adcl    $0,%ebp
                    404:        addl    tstep,%edx                      // advance tfrac fractional part by tstep frac
                    405: 
                    406:        sbbl    %eax,%eax                       // turn tstep carry into -1 (0 if none)
                    407:        addl    sstep,%ebx                      // advance sfrac fractional part by sstep frac
                    408:        adcl    advancetable+4(,%eax,4),%esi    // point to next source texel
                    409: 
                    410:        cmpw    2(%ecx),%bp
                    411:        jl              Lp2
                    412:        movb    (%esi),%al
                    413:        cmpb    $(TRANSPARENT_COLOR),%al
                    414:        jz              Lp2
                    415:        movw    %bp,2(%ecx)
                    416:        movb    %al,1(%edi)
                    417: Lp2:
                    418:        addl    izistep,%ebp
                    419:        adcl    $0,%ebp
                    420:        addl    tstep,%edx
                    421:        sbbl    %eax,%eax
                    422:        addl    sstep,%ebx
                    423:        adcl    advancetable+4(,%eax,4),%esi
                    424: 
                    425:        cmpw    4(%ecx),%bp
                    426:        jl              Lp3
                    427:        movb    (%esi),%al
                    428:        cmpb    $(TRANSPARENT_COLOR),%al
                    429:        jz              Lp3
                    430:        movw    %bp,4(%ecx)
                    431:        movb    %al,2(%edi)
                    432: Lp3:
                    433:        addl    izistep,%ebp
                    434:        adcl    $0,%ebp
                    435:        addl    tstep,%edx
                    436:        sbbl    %eax,%eax
                    437:        addl    sstep,%ebx
                    438:        adcl    advancetable+4(,%eax,4),%esi
                    439: 
                    440:        cmpw    6(%ecx),%bp
                    441:        jl              Lp4
                    442:        movb    (%esi),%al
                    443:        cmpb    $(TRANSPARENT_COLOR),%al
                    444:        jz              Lp4
                    445:        movw    %bp,6(%ecx)
                    446:        movb    %al,3(%edi)
                    447: Lp4:
                    448:        addl    izistep,%ebp
                    449:        adcl    $0,%ebp
                    450:        addl    tstep,%edx
                    451:        sbbl    %eax,%eax
                    452:        addl    sstep,%ebx
                    453:        adcl    advancetable+4(,%eax,4),%esi
                    454: 
                    455:        cmpw    8(%ecx),%bp
                    456:        jl              Lp5
                    457:        movb    (%esi),%al
                    458:        cmpb    $(TRANSPARENT_COLOR),%al
                    459:        jz              Lp5
                    460:        movw    %bp,8(%ecx)
                    461:        movb    %al,4(%edi)
                    462: Lp5:
                    463:        addl    izistep,%ebp
                    464:        adcl    $0,%ebp
                    465:        addl    tstep,%edx
                    466:        sbbl    %eax,%eax
                    467:        addl    sstep,%ebx
                    468:        adcl    advancetable+4(,%eax,4),%esi
                    469: 
                    470: //
                    471: // start FDIV for end of next segment in flight, so it can overlap
                    472: //
                    473:        popl    %eax
                    474:        cmpl    $8,%eax                 // more than one segment after this?
                    475:        ja              LSetupNotLast2  // yes
                    476: 
                    477:        decl    %eax
                    478:        jz              LFDIVInFlight2  // if only one pixel, no need to start an FDIV
                    479:        movl    %eax,spancountminus1
                    480:        fildl   spancountminus1
                    481: 
                    482:        flds    C(d_zistepu)            // _d_zistepu | spancountminus1
                    483:        fmul    %st(1),%st(0)   // _d_zistepu*scm1 | scm1
                    484:        flds    C(d_tdivzstepu) // _d_tdivzstepu | _d_zistepu*scm1 | scm1
                    485:        fmul    %st(2),%st(0)   // _d_tdivzstepu*scm1 | _d_zistepu*scm1 | scm1
                    486:        fxch    %st(1)                  // _d_zistepu*scm1 | _d_tdivzstepu*scm1 | scm1
                    487:        faddp   %st(0),%st(3)   // _d_tdivzstepu*scm1 | scm1
                    488:        fxch    %st(1)                  // scm1 | _d_tdivzstepu*scm1
                    489:        fmuls   C(d_sdivzstepu) // _d_sdivzstepu*scm1 | _d_tdivzstepu*scm1
                    490:        fxch    %st(1)                  // _d_tdivzstepu*scm1 | _d_sdivzstepu*scm1
                    491:        faddp   %st(0),%st(3)   // _d_sdivzstepu*scm1
                    492:        flds    fp_64k                  // 64k | _d_sdivzstepu*scm1
                    493:        fxch    %st(1)                  // _d_sdivzstepu*scm1 | 64k
                    494:        faddp   %st(0),%st(4)   // 64k
                    495: 
                    496:        fdiv    %st(1),%st(0)   // this is what we've gone to all this trouble to
                    497:                                                        //  overlap
                    498:        jmp             LFDIVInFlight2
                    499: 
                    500:        .align  4
                    501: LSetupNotLast2:
                    502:        fadds   zi8stepu
                    503:        fxch    %st(2)
                    504:        fadds   sdivz8stepu
                    505:        fxch    %st(2)
                    506:        flds    tdivz8stepu
                    507:        faddp   %st(0),%st(2)
                    508:        flds    fp_64k
                    509:        fdiv    %st(1),%st(0)   // z = 1/1/z
                    510:                                                        // this is what we've gone to all this trouble to
                    511:                                                        //  overlap
                    512: LFDIVInFlight2:
                    513:        pushl   %eax
                    514: 
                    515:        cmpw    10(%ecx),%bp
                    516:        jl              Lp6
                    517:        movb    (%esi),%al
                    518:        cmpb    $(TRANSPARENT_COLOR),%al
                    519:        jz              Lp6
                    520:        movw    %bp,10(%ecx)
                    521:        movb    %al,5(%edi)
                    522: Lp6:
                    523:        addl    izistep,%ebp
                    524:        adcl    $0,%ebp
                    525:        addl    tstep,%edx
                    526:        sbbl    %eax,%eax
                    527:        addl    sstep,%ebx
                    528:        adcl    advancetable+4(,%eax,4),%esi
                    529: 
                    530:        cmpw    12(%ecx),%bp
                    531:        jl              Lp7
                    532:        movb    (%esi),%al
                    533:        cmpb    $(TRANSPARENT_COLOR),%al
                    534:        jz              Lp7
                    535:        movw    %bp,12(%ecx)
                    536:        movb    %al,6(%edi)
                    537: Lp7:
                    538:        addl    izistep,%ebp
                    539:        adcl    $0,%ebp
                    540:        addl    tstep,%edx
                    541:        sbbl    %eax,%eax
                    542:        addl    sstep,%ebx
                    543:        adcl    advancetable+4(,%eax,4),%esi
                    544: 
                    545:        cmpw    14(%ecx),%bp
                    546:        jl              Lp8
                    547:        movb    (%esi),%al
                    548:        cmpb    $(TRANSPARENT_COLOR),%al
                    549:        jz              Lp8
                    550:        movw    %bp,14(%ecx)
                    551:        movb    %al,7(%edi)
                    552: Lp8:
                    553:        addl    izistep,%ebp
                    554:        adcl    $0,%ebp
                    555:        addl    tstep,%edx
                    556:        sbbl    %eax,%eax
                    557:        addl    sstep,%ebx
                    558:        adcl    advancetable+4(,%eax,4),%esi
                    559: 
                    560:        addl    $8,%edi
                    561:        addl    $16,%ecx
                    562:        movl    %edx,tfracf
                    563:        movl    snext,%edx
                    564:        movl    %ebx,sfracf
                    565:        movl    tnext,%ebx
                    566:        movl    %edx,s
                    567:        movl    %ebx,t
                    568: 
                    569:        movl    %ecx,pz
                    570:        movl    %ebp,izi
                    571: 
                    572:        popl    %ecx                            // retrieve count
                    573: 
                    574: //
                    575: // determine whether last span or not
                    576: //
                    577:        cmpl    $8,%ecx                         // are there multiple segments remaining?
                    578:        ja              LNotLastSegment         // yes
                    579: 
                    580: //
                    581: // last segment of scan
                    582: //
                    583: LLastSegment:
                    584: 
                    585: //
                    586: // advance s/z, t/z, and 1/z, and calculate s & t at end of span and steps to
                    587: // get there. The number of pixels left is variable, and we want to land on the
                    588: // last pixel, not step one past it, so we can't run into arithmetic problems
                    589: //
                    590:        testl   %ecx,%ecx
                    591:        jz              LNoSteps                // just draw the last pixel and we're done
                    592: 
                    593: // pick up after the FDIV that was left in flight previously
                    594: 
                    595: 
                    596:        fld             %st(0)                  // duplicate it
                    597:        fmul    %st(4),%st(0)   // s = s/z * z
                    598:        fxch    %st(1)
                    599:        fmul    %st(3),%st(0)   // t = t/z * z
                    600:        fxch    %st(1)
                    601:        fistpl  snext
                    602:        fistpl  tnext
                    603: 
                    604:        movl    C(tadjust),%ebx
                    605:        movl    C(sadjust),%eax
                    606: 
                    607:        addl    snext,%eax
                    608:        addl    tnext,%ebx
                    609: 
                    610:        movl    C(bbextents),%ebp
                    611:        movl    C(bbextentt),%edx
                    612: 
                    613:        cmpl    $2048,%eax
                    614:        jl              LClampLow4
                    615:        cmpl    %ebp,%eax
                    616:        ja              LClampHigh4
                    617: LClampReentry4:
                    618:        movl    %eax,snext
                    619: 
                    620:        cmpl    $2048,%ebx
                    621:        jl              LClampLow5
                    622:        cmpl    %edx,%ebx
                    623:        ja              LClampHigh5
                    624: LClampReentry5:
                    625: 
                    626:        cmpl    $1,%ecx                 // don't bother 
                    627:        je              LOnlyOneStep    // if two pixels in segment, there's only one step,
                    628:                                                        //  of the segment length
                    629:        subl    s,%eax
                    630:        subl    t,%ebx
                    631: 
                    632:        addl    %eax,%eax               // convert to 15.17 format so multiply by 1.31
                    633:        addl    %ebx,%ebx               //  reciprocal yields 16.48
                    634:        imull   reciprocal_table-8(,%ecx,4) // sstep = (snext - s) / (spancount-1)
                    635:        movl    %edx,%ebp
                    636: 
                    637:        movl    %ebx,%eax
                    638:        imull   reciprocal_table-8(,%ecx,4) // tstep = (tnext - t) / (spancount-1)
                    639: 
                    640: LSetEntryvec:
                    641: //
                    642: // set up advancetable
                    643: //
                    644:        movl    spr8entryvec_table(,%ecx,4),%ebx
                    645:        movl    %edx,%eax
                    646:        pushl   %ebx                            // entry point into code for RET later
                    647:        movl    %ebp,%ecx
                    648:        sarl    $16,%ecx                        // sstep >>= 16;
                    649:        movl    C(cachewidth),%ebx
                    650:        sarl    $16,%edx                        // tstep >>= 16;
                    651:        jz              LIsZeroLast
                    652:        imull   %ebx,%edx                       // (tstep >> 16) * cachewidth;
                    653: LIsZeroLast:
                    654:        addl    %ecx,%edx                       // add in sstep
                    655:                                                                // (tstep >> 16) * cachewidth + (sstep >> 16);
                    656:        movl    tfracf,%ecx
                    657:        movl    %edx,advancetable+4     // advance base in t
                    658:        addl    %ebx,%edx                       // ((tstep >> 16) + 1) * cachewidth +
                    659:                                                                //  (sstep >> 16);
                    660:        shll    $16,%ebp                        // left-justify sstep fractional part
                    661:        movl    sfracf,%ebx
                    662:        shll    $16,%eax                        // left-justify tstep fractional part
                    663:        movl    %edx,advancetable       // advance extra in t
                    664: 
                    665:        movl    %eax,tstep
                    666:        movl    %ebp,sstep
                    667:        movl    %ecx,%edx
                    668: 
                    669:        movl    pz,%ecx
                    670:        movl    izi,%ebp
                    671: 
                    672:        ret                                                     // jump to the number-of-pixels handler
                    673: 
                    674: //----------------------------------------
                    675: 
                    676: LNoSteps:
                    677:        movl    pz,%ecx
                    678:        subl    $7,%edi                 // adjust for hardwired offset
                    679:        subl    $14,%ecx
                    680:        jmp             LEndSpan
                    681: 
                    682: 
                    683: LOnlyOneStep:
                    684:        subl    s,%eax
                    685:        subl    t,%ebx
                    686:        movl    %eax,%ebp
                    687:        movl    %ebx,%edx
                    688:        jmp             LSetEntryvec
                    689: 
                    690: //----------------------------------------
                    691: 
                    692: .globl Spr8Entry2_8
                    693: Spr8Entry2_8:
                    694:        subl    $6,%edi         // adjust for hardwired offsets
                    695:        subl    $12,%ecx
                    696:        movb    (%esi),%al
                    697:        jmp             LLEntry2_8
                    698: 
                    699: //----------------------------------------
                    700: 
                    701: .globl Spr8Entry3_8
                    702: Spr8Entry3_8:
                    703:        subl    $5,%edi         // adjust for hardwired offsets
                    704:        subl    $10,%ecx
                    705:        jmp             LLEntry3_8
                    706: 
                    707: //----------------------------------------
                    708: 
                    709: .globl Spr8Entry4_8
                    710: Spr8Entry4_8:
                    711:        subl    $4,%edi         // adjust for hardwired offsets
                    712:        subl    $8,%ecx
                    713:        jmp             LLEntry4_8
                    714: 
                    715: //----------------------------------------
                    716: 
                    717: .globl Spr8Entry5_8
                    718: Spr8Entry5_8:
                    719:        subl    $3,%edi         // adjust for hardwired offsets
                    720:        subl    $6,%ecx
                    721:        jmp             LLEntry5_8
                    722: 
                    723: //----------------------------------------
                    724: 
                    725: .globl Spr8Entry6_8
                    726: Spr8Entry6_8:
                    727:        subl    $2,%edi         // adjust for hardwired offsets
                    728:        subl    $4,%ecx
                    729:        jmp             LLEntry6_8
                    730: 
                    731: //----------------------------------------
                    732: 
                    733: .globl Spr8Entry7_8
                    734: Spr8Entry7_8:
                    735:        decl    %edi            // adjust for hardwired offsets
                    736:        subl    $2,%ecx
                    737:        jmp             LLEntry7_8
                    738: 
                    739: //----------------------------------------
                    740: 
                    741: .globl Spr8Entry8_8
                    742: Spr8Entry8_8:
                    743:        cmpw    (%ecx),%bp
                    744:        jl              Lp9
                    745:        movb    (%esi),%al
                    746:        cmpb    $(TRANSPARENT_COLOR),%al
                    747:        jz              Lp9
                    748:        movw    %bp,(%ecx)
                    749:        movb    %al,(%edi)
                    750: Lp9:
                    751:        addl    izistep,%ebp
                    752:        adcl    $0,%ebp
                    753:        addl    tstep,%edx
                    754:        sbbl    %eax,%eax
                    755:        addl    sstep,%ebx
                    756:        adcl    advancetable+4(,%eax,4),%esi
                    757: LLEntry7_8:
                    758:        cmpw    2(%ecx),%bp
                    759:        jl              Lp10
                    760:        movb    (%esi),%al
                    761:        cmpb    $(TRANSPARENT_COLOR),%al
                    762:        jz              Lp10
                    763:        movw    %bp,2(%ecx)
                    764:        movb    %al,1(%edi)
                    765: Lp10:
                    766:        addl    izistep,%ebp
                    767:        adcl    $0,%ebp
                    768:        addl    tstep,%edx
                    769:        sbbl    %eax,%eax
                    770:        addl    sstep,%ebx
                    771:        adcl    advancetable+4(,%eax,4),%esi
                    772: LLEntry6_8:
                    773:        cmpw    4(%ecx),%bp
                    774:        jl              Lp11
                    775:        movb    (%esi),%al
                    776:        cmpb    $(TRANSPARENT_COLOR),%al
                    777:        jz              Lp11
                    778:        movw    %bp,4(%ecx)
                    779:        movb    %al,2(%edi)
                    780: Lp11:
                    781:        addl    izistep,%ebp
                    782:        adcl    $0,%ebp
                    783:        addl    tstep,%edx
                    784:        sbbl    %eax,%eax
                    785:        addl    sstep,%ebx
                    786:        adcl    advancetable+4(,%eax,4),%esi
                    787: LLEntry5_8:
                    788:        cmpw    6(%ecx),%bp
                    789:        jl              Lp12
                    790:        movb    (%esi),%al
                    791:        cmpb    $(TRANSPARENT_COLOR),%al
                    792:        jz              Lp12
                    793:        movw    %bp,6(%ecx)
                    794:        movb    %al,3(%edi)
                    795: Lp12:
                    796:        addl    izistep,%ebp
                    797:        adcl    $0,%ebp
                    798:        addl    tstep,%edx
                    799:        sbbl    %eax,%eax
                    800:        addl    sstep,%ebx
                    801:        adcl    advancetable+4(,%eax,4),%esi
                    802: LLEntry4_8:
                    803:        cmpw    8(%ecx),%bp
                    804:        jl              Lp13
                    805:        movb    (%esi),%al
                    806:        cmpb    $(TRANSPARENT_COLOR),%al
                    807:        jz              Lp13
                    808:        movw    %bp,8(%ecx)
                    809:        movb    %al,4(%edi)
                    810: Lp13:
                    811:        addl    izistep,%ebp
                    812:        adcl    $0,%ebp
                    813:        addl    tstep,%edx
                    814:        sbbl    %eax,%eax
                    815:        addl    sstep,%ebx
                    816:        adcl    advancetable+4(,%eax,4),%esi
                    817: LLEntry3_8:
                    818:        cmpw    10(%ecx),%bp
                    819:        jl              Lp14
                    820:        movb    (%esi),%al
                    821:        cmpb    $(TRANSPARENT_COLOR),%al
                    822:        jz              Lp14
                    823:        movw    %bp,10(%ecx)
                    824:        movb    %al,5(%edi)
                    825: Lp14:
                    826:        addl    izistep,%ebp
                    827:        adcl    $0,%ebp
                    828:        addl    tstep,%edx
                    829:        sbbl    %eax,%eax
                    830:        addl    sstep,%ebx
                    831:        adcl    advancetable+4(,%eax,4),%esi
                    832: LLEntry2_8:
                    833:        cmpw    12(%ecx),%bp
                    834:        jl              Lp15
                    835:        movb    (%esi),%al
                    836:        cmpb    $(TRANSPARENT_COLOR),%al
                    837:        jz              Lp15
                    838:        movw    %bp,12(%ecx)
                    839:        movb    %al,6(%edi)
                    840: Lp15:
                    841:        addl    izistep,%ebp
                    842:        adcl    $0,%ebp
                    843:        addl    tstep,%edx
                    844:        sbbl    %eax,%eax
                    845:        addl    sstep,%ebx
                    846:        adcl    advancetable+4(,%eax,4),%esi
                    847: 
                    848: LEndSpan:
                    849:        cmpw    14(%ecx),%bp
                    850:        jl              Lp16
                    851:        movb    (%esi),%al              // load first texel in segment
                    852:        cmpb    $(TRANSPARENT_COLOR),%al
                    853:        jz              Lp16
                    854:        movw    %bp,14(%ecx)
                    855:        movb    %al,7(%edi)
                    856: Lp16:
                    857: 
                    858: //
                    859: // clear s/z, t/z, 1/z from FP stack
                    860: //
                    861:        fstp %st(0)
                    862:        fstp %st(0)
                    863:        fstp %st(0)
                    864: 
                    865:        popl    %ebx                            // restore spans pointer
                    866: LNextSpan:
                    867:        addl    $(sspan_t_size),%ebx // point to next span
                    868:        movl    sspan_t_count(%ebx),%ecx
                    869:        cmpl    $0,%ecx                         // any more spans?
                    870:        jg              LSpanLoop                       // yes
                    871:        jz              LNextSpan                       // yes, but this one's empty
                    872: 
                    873:        popl    %ebx                            // restore register variables
                    874:        popl    %esi
                    875:        popl    %edi
                    876:        popl    %ebp                            // restore the caller's stack frame
                    877:        ret
                    878: 
                    879: #endif // id386

unix.superglobalmegacorp.com

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