Annotation of quakeworld/client/d_draw16.s, revision 1.1.1.1

1.1       root        1: /*
                      2: Copyright (C) 1996-1997 Id Software, Inc.
                      3: 
                      4: This program is free software; you can redistribute it and/or
                      5: modify it under the terms of the GNU General Public License
                      6: as published by the Free Software Foundation; either version 2
                      7: of the License, or (at your option) any later version.
                      8: 
                      9: This program is distributed in the hope that it will be useful,
                     10: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
                     12: 
                     13: See the GNU General Public License for more details.
                     14: 
                     15: You should have received a copy of the GNU General Public License
                     16: along with this program; if not, write to the Free Software
                     17: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
                     18: 
                     19: */
                     20: //
                     21: // d_draw16.s
                     22: // x86 assembly-language horizontal 8-bpp span-drawing code, with 16-pixel
                     23: // subdivision.
                     24: //
                     25: 
                     26: #include "asm_i386.h"
                     27: #include "quakeasm.h"
                     28: #include "asm_draw.h"
                     29: #include "d_ifacea.h"
                     30: 
                     31: #if    id386
                     32: 
                     33: //----------------------------------------------------------------------
                     34: // 8-bpp horizontal span drawing code for polygons, with no transparency and
                     35: // 16-pixel subdivision.
                     36: //
                     37: // Assumes there is at least one span in pspans, and that every span
                     38: // contains at least one pixel
                     39: //----------------------------------------------------------------------
                     40: 
                     41:        .data
                     42: 
                     43:        .text
                     44: 
                     45: // out-of-line, rarely-needed clamping code
                     46: 
                     47: LClampHigh0:
                     48:        movl    C(bbextents),%esi
                     49:        jmp             LClampReentry0
                     50: LClampHighOrLow0:
                     51:        jg              LClampHigh0
                     52:        xorl    %esi,%esi
                     53:        jmp             LClampReentry0
                     54: 
                     55: LClampHigh1:
                     56:        movl    C(bbextentt),%edx
                     57:        jmp             LClampReentry1
                     58: LClampHighOrLow1:
                     59:        jg              LClampHigh1
                     60:        xorl    %edx,%edx
                     61:        jmp             LClampReentry1
                     62: 
                     63: LClampLow2:
                     64:        movl    $4096,%ebp
                     65:        jmp             LClampReentry2
                     66: LClampHigh2:
                     67:        movl    C(bbextents),%ebp
                     68:        jmp             LClampReentry2
                     69: 
                     70: LClampLow3:
                     71:        movl    $4096,%ecx
                     72:        jmp             LClampReentry3
                     73: LClampHigh3:
                     74:        movl    C(bbextentt),%ecx
                     75:        jmp             LClampReentry3
                     76: 
                     77: LClampLow4:
                     78:        movl    $4096,%eax
                     79:        jmp             LClampReentry4
                     80: LClampHigh4:
                     81:        movl    C(bbextents),%eax
                     82:        jmp             LClampReentry4
                     83: 
                     84: LClampLow5:
                     85:        movl    $4096,%ebx
                     86:        jmp             LClampReentry5
                     87: LClampHigh5:
                     88:        movl    C(bbextentt),%ebx
                     89:        jmp             LClampReentry5
                     90: 
                     91: 
                     92: #define pspans 4+16
                     93: 
                     94:        .align 4
                     95: .globl C(D_DrawSpans16)
                     96: C(D_DrawSpans16):
                     97:        pushl   %ebp                            // preserve caller's stack frame
                     98:        pushl   %edi
                     99:        pushl   %esi                            // preserve register variables
                    100:        pushl   %ebx
                    101: 
                    102: //
                    103: // set up scaled-by-16 steps, for 16-long segments; also set up cacheblock
                    104: // and span list pointers
                    105: //
                    106: // TODO: any overlap from rearranging?
                    107:        flds    C(d_sdivzstepu)
                    108:        fmuls   fp_16
                    109:        movl    C(cacheblock),%edx
                    110:        flds    C(d_tdivzstepu)
                    111:        fmuls   fp_16
                    112:        movl    pspans(%esp),%ebx       // point to the first span descriptor
                    113:        flds    C(d_zistepu)
                    114:        fmuls   fp_16
                    115:        movl    %edx,pbase                      // pbase = cacheblock
                    116:        fstps   zi16stepu
                    117:        fstps   tdivz16stepu
                    118:        fstps   sdivz16stepu
                    119: 
                    120: LSpanLoop:
                    121: //
                    122: // set up the initial s/z, t/z, and 1/z on the FP stack, and generate the
                    123: // initial s and t values
                    124: //
                    125: // FIXME: pipeline FILD?
                    126:        fildl   espan_t_v(%ebx)
                    127:        fildl   espan_t_u(%ebx)
                    128: 
                    129:        fld             %st(1)                  // dv | du | dv
                    130:        fmuls   C(d_sdivzstepv) // dv*d_sdivzstepv | du | dv
                    131:        fld             %st(1)                  // du | dv*d_sdivzstepv | du | dv
                    132:        fmuls   C(d_sdivzstepu) // du*d_sdivzstepu | dv*d_sdivzstepv | du | dv
                    133:        fld             %st(2)                  // du | du*d_sdivzstepu | dv*d_sdivzstepv | du | dv
                    134:        fmuls   C(d_tdivzstepu) // du*d_tdivzstepu | du*d_sdivzstepu |
                    135:                                                        //  dv*d_sdivzstepv | du | dv
                    136:        fxch    %st(1)                  // du*d_sdivzstepu | du*d_tdivzstepu |
                    137:                                                        //  dv*d_sdivzstepv | du | dv
                    138:        faddp   %st(0),%st(2)   // du*d_tdivzstepu |
                    139:                                                        //  du*d_sdivzstepu + dv*d_sdivzstepv | du | dv
                    140:        fxch    %st(1)                  // du*d_sdivzstepu + dv*d_sdivzstepv |
                    141:                                                        //  du*d_tdivzstepu | du | dv
                    142:        fld             %st(3)                  // dv | du*d_sdivzstepu + dv*d_sdivzstepv |
                    143:                                                        //  du*d_tdivzstepu | du | dv
                    144:        fmuls   C(d_tdivzstepv) // dv*d_tdivzstepv |
                    145:                                                        //  du*d_sdivzstepu + dv*d_sdivzstepv |
                    146:                                                        //  du*d_tdivzstepu | du | dv
                    147:        fxch    %st(1)                  // du*d_sdivzstepu + dv*d_sdivzstepv |
                    148:                                                        //  dv*d_tdivzstepv | du*d_tdivzstepu | du | dv
                    149:        fadds   C(d_sdivzorigin)        // sdivz = d_sdivzorigin + dv*d_sdivzstepv +
                    150:                                                        //  du*d_sdivzstepu; stays in %st(2) at end
                    151:        fxch    %st(4)                  // dv | dv*d_tdivzstepv | du*d_tdivzstepu | du |
                    152:                                                        //  s/z
                    153:        fmuls   C(d_zistepv)            // dv*d_zistepv | dv*d_tdivzstepv |
                    154:                                                        //  du*d_tdivzstepu | du | s/z
                    155:        fxch    %st(1)                  // dv*d_tdivzstepv |  dv*d_zistepv |
                    156:                                                        //  du*d_tdivzstepu | du | s/z
                    157:        faddp   %st(0),%st(2)   // dv*d_zistepv |
                    158:                                                        //  dv*d_tdivzstepv + du*d_tdivzstepu | du | s/z
                    159:        fxch    %st(2)                  // du | dv*d_tdivzstepv + du*d_tdivzstepu |
                    160:                                                        //  dv*d_zistepv | s/z
                    161:        fmuls   C(d_zistepu)            // du*d_zistepu |
                    162:                                                        //  dv*d_tdivzstepv + du*d_tdivzstepu |
                    163:                                                        //  dv*d_zistepv | s/z
                    164:        fxch    %st(1)                  // dv*d_tdivzstepv + du*d_tdivzstepu |
                    165:                                                        //  du*d_zistepu | dv*d_zistepv | s/z
                    166:        fadds   C(d_tdivzorigin)        // tdivz = d_tdivzorigin + dv*d_tdivzstepv +
                    167:                                                        //  du*d_tdivzstepu; stays in %st(1) at end
                    168:        fxch    %st(2)                  // dv*d_zistepv | du*d_zistepu | t/z | s/z
                    169:        faddp   %st(0),%st(1)   // dv*d_zistepv + du*d_zistepu | t/z | s/z
                    170: 
                    171:        flds    fp_64k                  // fp_64k | dv*d_zistepv + du*d_zistepu | t/z | s/z
                    172:        fxch    %st(1)                  // dv*d_zistepv + du*d_zistepu | fp_64k | t/z | s/z
                    173:        fadds   C(d_ziorigin)           // zi = d_ziorigin + dv*d_zistepv +
                    174:                                                        //  du*d_zistepu; stays in %st(0) at end
                    175:                                                        // 1/z | fp_64k | t/z | s/z
                    176: //
                    177: // calculate and clamp s & t
                    178: //
                    179:        fdivr   %st(0),%st(1)   // 1/z | z*64k | t/z | s/z
                    180: 
                    181: //
                    182: // point %edi to the first pixel in the span
                    183: //
                    184:        movl    C(d_viewbuffer),%ecx
                    185:        movl    espan_t_v(%ebx),%eax
                    186:        movl    %ebx,pspantemp  // preserve spans pointer
                    187: 
                    188:        movl    C(tadjust),%edx
                    189:        movl    C(sadjust),%esi
                    190:        movl    C(d_scantable)(,%eax,4),%edi    // v * screenwidth
                    191:        addl    %ecx,%edi
                    192:        movl    espan_t_u(%ebx),%ecx
                    193:        addl    %ecx,%edi                               // pdest = &pdestspan[scans->u];
                    194:        movl    espan_t_count(%ebx),%ecx
                    195: 
                    196: //
                    197: // now start the FDIV for the end of the span
                    198: //
                    199:        cmpl    $16,%ecx
                    200:        ja              LSetupNotLast1
                    201: 
                    202:        decl    %ecx
                    203:        jz              LCleanup1               // if only one pixel, no need to start an FDIV
                    204:        movl    %ecx,spancountminus1
                    205: 
                    206: // finish up the s and t calcs
                    207:        fxch    %st(1)                  // z*64k | 1/z | t/z | s/z
                    208: 
                    209:        fld             %st(0)                  // z*64k | z*64k | 1/z | t/z | s/z
                    210:        fmul    %st(4),%st(0)   // s | z*64k | 1/z | t/z | s/z
                    211:        fxch    %st(1)                  // z*64k | s | 1/z | t/z | s/z
                    212:        fmul    %st(3),%st(0)   // t | s | 1/z | t/z | s/z
                    213:        fxch    %st(1)                  // s | t | 1/z | t/z | s/z
                    214:        fistpl  s                               // 1/z | t | t/z | s/z
                    215:        fistpl  t                               // 1/z | t/z | s/z
                    216: 
                    217:        fildl   spancountminus1
                    218: 
                    219:        flds    C(d_tdivzstepu) // C(d_tdivzstepu) | spancountminus1
                    220:        flds    C(d_zistepu)            // C(d_zistepu) | C(d_tdivzstepu) | spancountminus1
                    221:        fmul    %st(2),%st(0)   // C(d_zistepu)*scm1 | C(d_tdivzstepu) | scm1
                    222:        fxch    %st(1)                  // C(d_tdivzstepu) | C(d_zistepu)*scm1 | scm1
                    223:        fmul    %st(2),%st(0)   // C(d_tdivzstepu)*scm1 | C(d_zistepu)*scm1 | scm1
                    224:        fxch    %st(2)                  // scm1 | C(d_zistepu)*scm1 | C(d_tdivzstepu)*scm1
                    225:        fmuls   C(d_sdivzstepu) // C(d_sdivzstepu)*scm1 | C(d_zistepu)*scm1 |
                    226:                                                        //  C(d_tdivzstepu)*scm1
                    227:        fxch    %st(1)                  // C(d_zistepu)*scm1 | C(d_sdivzstepu)*scm1 |
                    228:                                                        //  C(d_tdivzstepu)*scm1
                    229:        faddp   %st(0),%st(3)   // C(d_sdivzstepu)*scm1 | C(d_tdivzstepu)*scm1
                    230:        fxch    %st(1)                  // C(d_tdivzstepu)*scm1 | C(d_sdivzstepu)*scm1
                    231:        faddp   %st(0),%st(3)   // C(d_sdivzstepu)*scm1
                    232:        faddp   %st(0),%st(3)
                    233: 
                    234:        flds    fp_64k
                    235:        fdiv    %st(1),%st(0)   // this is what we've gone to all this trouble to
                    236:                                                        //  overlap
                    237:        jmp             LFDIVInFlight1
                    238: 
                    239: LCleanup1:
                    240: // finish up the s and t calcs
                    241:        fxch    %st(1)                  // z*64k | 1/z | t/z | s/z
                    242: 
                    243:        fld             %st(0)                  // z*64k | z*64k | 1/z | t/z | s/z
                    244:        fmul    %st(4),%st(0)   // s | z*64k | 1/z | t/z | s/z
                    245:        fxch    %st(1)                  // z*64k | s | 1/z | t/z | s/z
                    246:        fmul    %st(3),%st(0)   // t | s | 1/z | t/z | s/z
                    247:        fxch    %st(1)                  // s | t | 1/z | t/z | s/z
                    248:        fistpl  s                               // 1/z | t | t/z | s/z
                    249:        fistpl  t                               // 1/z | t/z | s/z
                    250:        jmp             LFDIVInFlight1
                    251: 
                    252:        .align  4
                    253: LSetupNotLast1:
                    254: // finish up the s and t calcs
                    255:        fxch    %st(1)                  // z*64k | 1/z | t/z | s/z
                    256: 
                    257:        fld             %st(0)                  // z*64k | z*64k | 1/z | t/z | s/z
                    258:        fmul    %st(4),%st(0)   // s | z*64k | 1/z | t/z | s/z
                    259:        fxch    %st(1)                  // z*64k | s | 1/z | t/z | s/z
                    260:        fmul    %st(3),%st(0)   // t | s | 1/z | t/z | s/z
                    261:        fxch    %st(1)                  // s | t | 1/z | t/z | s/z
                    262:        fistpl  s                               // 1/z | t | t/z | s/z
                    263:        fistpl  t                               // 1/z | t/z | s/z
                    264: 
                    265:        fadds   zi16stepu
                    266:        fxch    %st(2)
                    267:        fadds   sdivz16stepu
                    268:        fxch    %st(2)
                    269:        flds    tdivz16stepu
                    270:        faddp   %st(0),%st(2)
                    271:        flds    fp_64k
                    272:        fdiv    %st(1),%st(0)   // z = 1/1/z
                    273:                                                        // this is what we've gone to all this trouble to
                    274:                                                        //  overlap
                    275: LFDIVInFlight1:
                    276: 
                    277:        addl    s,%esi
                    278:        addl    t,%edx
                    279:        movl    C(bbextents),%ebx
                    280:        movl    C(bbextentt),%ebp
                    281:        cmpl    %ebx,%esi
                    282:        ja              LClampHighOrLow0
                    283: LClampReentry0:
                    284:        movl    %esi,s
                    285:        movl    pbase,%ebx
                    286:        shll    $16,%esi
                    287:        cmpl    %ebp,%edx
                    288:        movl    %esi,sfracf
                    289:        ja              LClampHighOrLow1
                    290: LClampReentry1:
                    291:        movl    %edx,t
                    292:        movl    s,%esi                                  // sfrac = scans->sfrac;
                    293:        shll    $16,%edx
                    294:        movl    t,%eax                                  // tfrac = scans->tfrac;
                    295:        sarl    $16,%esi
                    296:        movl    %edx,tfracf
                    297: 
                    298: //
                    299: // calculate the texture starting address
                    300: //
                    301:        sarl    $16,%eax
                    302:        movl    C(cachewidth),%edx
                    303:        imull   %edx,%eax                               // (tfrac >> 16) * cachewidth
                    304:        addl    %ebx,%esi
                    305:        addl    %eax,%esi                               // psource = pbase + (sfrac >> 16) +
                    306:                                                                        //           ((tfrac >> 16) * cachewidth);
                    307: //
                    308: // determine whether last span or not
                    309: //
                    310:        cmpl    $16,%ecx
                    311:        jna             LLastSegment
                    312: 
                    313: //
                    314: // not the last segment; do full 16-wide segment
                    315: //
                    316: LNotLastSegment:
                    317: 
                    318: //
                    319: // advance s/z, t/z, and 1/z, and calculate s & t at end of span and steps to
                    320: // get there
                    321: //
                    322: 
                    323: // pick up after the FDIV that was left in flight previously
                    324: 
                    325:        fld             %st(0)                  // duplicate it
                    326:        fmul    %st(4),%st(0)   // s = s/z * z
                    327:        fxch    %st(1)
                    328:        fmul    %st(3),%st(0)   // t = t/z * z
                    329:        fxch    %st(1)
                    330:        fistpl  snext
                    331:        fistpl  tnext
                    332:        movl    snext,%eax
                    333:        movl    tnext,%edx
                    334: 
                    335:        movb    (%esi),%bl      // get first source texel
                    336:        subl    $16,%ecx                // count off this segments' pixels
                    337:        movl    C(sadjust),%ebp
                    338:        movl    %ecx,counttemp  // remember count of remaining pixels
                    339: 
                    340:        movl    C(tadjust),%ecx
                    341:        movb    %bl,(%edi)      // store first dest pixel
                    342: 
                    343:        addl    %eax,%ebp
                    344:        addl    %edx,%ecx
                    345: 
                    346:        movl    C(bbextents),%eax
                    347:        movl    C(bbextentt),%edx
                    348: 
                    349:        cmpl    $4096,%ebp
                    350:        jl              LClampLow2
                    351:        cmpl    %eax,%ebp
                    352:        ja              LClampHigh2
                    353: LClampReentry2:
                    354: 
                    355:        cmpl    $4096,%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    $20,%eax                        // tstep >>= 16;
                    373:        jz              LZero
                    374:        sarl    $20,%edx                        // sstep >>= 16;
                    375:        movl    C(cachewidth),%ebx
                    376:        imull   %ebx,%eax
                    377:        jmp             LSetUp1
                    378: 
                    379: LZero:
                    380:        sarl    $20,%edx                        // sstep >>= 16;
                    381:        movl    C(cachewidth),%ebx
                    382: 
                    383: LSetUp1:
                    384: 
                    385:        addl    %edx,%eax                       // add in sstep
                    386:                                                                // (tstep >> 16) * cachewidth + (sstep >> 16);
                    387:        movl    tfracf,%edx
                    388:        movl    %eax,advancetable+4     // advance base in t
                    389:        addl    %ebx,%eax                       // ((tstep >> 16) + 1) * cachewidth +
                    390:                                                                //  (sstep >> 16);
                    391:        shll    $12,%ebp                        // left-justify sstep fractional part
                    392:        movl    sfracf,%ebx
                    393:        shll    $12,%ecx                        // left-justify tstep fractional part
                    394:        movl    %eax,advancetable       // advance extra in t
                    395: 
                    396:        movl    %ecx,tstep
                    397:        addl    %ecx,%edx                       // advance tfrac fractional part by tstep frac
                    398: 
                    399:        sbbl    %ecx,%ecx                       // turn tstep carry into -1 (0 if none)
                    400:        addl    %ebp,%ebx                       // advance sfrac fractional part by sstep frac
                    401:        adcl    advancetable+4(,%ecx,4),%esi    // point to next source texel
                    402: 
                    403:        addl    tstep,%edx
                    404:        sbbl    %ecx,%ecx
                    405:        movb    (%esi),%al
                    406:        addl    %ebp,%ebx
                    407:        movb    %al,1(%edi)
                    408:        adcl    advancetable+4(,%ecx,4),%esi
                    409: 
                    410:        addl    tstep,%edx
                    411:        sbbl    %ecx,%ecx
                    412:        addl    %ebp,%ebx
                    413:        movb    (%esi),%al
                    414:        adcl    advancetable+4(,%ecx,4),%esi
                    415: 
                    416:        addl    tstep,%edx
                    417:        sbbl    %ecx,%ecx
                    418:        movb    %al,2(%edi)
                    419:        addl    %ebp,%ebx
                    420:        movb    (%esi),%al
                    421:        adcl    advancetable+4(,%ecx,4),%esi
                    422: 
                    423:        addl    tstep,%edx
                    424:        sbbl    %ecx,%ecx
                    425:        movb    %al,3(%edi)
                    426:        addl    %ebp,%ebx
                    427:        movb    (%esi),%al
                    428:        adcl    advancetable+4(,%ecx,4),%esi
                    429: 
                    430:        addl    tstep,%edx
                    431:        sbbl    %ecx,%ecx
                    432:        movb    %al,4(%edi)
                    433:        addl    %ebp,%ebx
                    434:        movb    (%esi),%al
                    435:        adcl    advancetable+4(,%ecx,4),%esi
                    436: 
                    437:        addl    tstep,%edx
                    438:        sbbl    %ecx,%ecx
                    439:        movb    %al,5(%edi)
                    440:        addl    %ebp,%ebx
                    441:        movb    (%esi),%al
                    442:        adcl    advancetable+4(,%ecx,4),%esi
                    443: 
                    444:        addl    tstep,%edx
                    445:        sbbl    %ecx,%ecx
                    446:        movb    %al,6(%edi)
                    447:        addl    %ebp,%ebx
                    448:        movb    (%esi),%al
                    449:        adcl    advancetable+4(,%ecx,4),%esi
                    450: 
                    451:        addl    tstep,%edx
                    452:        sbbl    %ecx,%ecx
                    453:        movb    %al,7(%edi)
                    454:        addl    %ebp,%ebx
                    455:        movb    (%esi),%al
                    456:        adcl    advancetable+4(,%ecx,4),%esi
                    457: 
                    458: 
                    459: //
                    460: // start FDIV for end of next segment in flight, so it can overlap
                    461: //
                    462:        movl    counttemp,%ecx
                    463:        cmpl    $16,%ecx                        // more than one segment after this?
                    464:        ja              LSetupNotLast2  // yes
                    465: 
                    466:        decl    %ecx
                    467:        jz              LFDIVInFlight2  // if only one pixel, no need to start an FDIV
                    468:        movl    %ecx,spancountminus1
                    469:        fildl   spancountminus1
                    470: 
                    471:        flds    C(d_zistepu)            // C(d_zistepu) | spancountminus1
                    472:        fmul    %st(1),%st(0)   // C(d_zistepu)*scm1 | scm1
                    473:        flds    C(d_tdivzstepu) // C(d_tdivzstepu) | C(d_zistepu)*scm1 | scm1
                    474:        fmul    %st(2),%st(0)   // C(d_tdivzstepu)*scm1 | C(d_zistepu)*scm1 | scm1
                    475:        fxch    %st(1)                  // C(d_zistepu)*scm1 | C(d_tdivzstepu)*scm1 | scm1
                    476:        faddp   %st(0),%st(3)   // C(d_tdivzstepu)*scm1 | scm1
                    477:        fxch    %st(1)                  // scm1 | C(d_tdivzstepu)*scm1
                    478:        fmuls   C(d_sdivzstepu) // C(d_sdivzstepu)*scm1 | C(d_tdivzstepu)*scm1
                    479:        fxch    %st(1)                  // C(d_tdivzstepu)*scm1 | C(d_sdivzstepu)*scm1
                    480:        faddp   %st(0),%st(3)   // C(d_sdivzstepu)*scm1
                    481:        flds    fp_64k                  // 64k | C(d_sdivzstepu)*scm1
                    482:        fxch    %st(1)                  // C(d_sdivzstepu)*scm1 | 64k
                    483:        faddp   %st(0),%st(4)   // 64k
                    484: 
                    485:        fdiv    %st(1),%st(0)   // this is what we've gone to all this trouble to
                    486:                                                        //  overlap
                    487:        jmp             LFDIVInFlight2
                    488: 
                    489:        .align  4
                    490: LSetupNotLast2:
                    491:        fadds   zi16stepu
                    492:        fxch    %st(2)
                    493:        fadds   sdivz16stepu
                    494:        fxch    %st(2)
                    495:        flds    tdivz16stepu
                    496:        faddp   %st(0),%st(2)
                    497:        flds    fp_64k
                    498:        fdiv    %st(1),%st(0)   // z = 1/1/z
                    499:                                                        // this is what we've gone to all this trouble to
                    500:                                                        //  overlap
                    501: LFDIVInFlight2:
                    502:        movl    %ecx,counttemp
                    503: 
                    504:        addl    tstep,%edx
                    505:        sbbl    %ecx,%ecx
                    506:        movb    %al,8(%edi)
                    507:        addl    %ebp,%ebx
                    508:        movb    (%esi),%al
                    509:        adcl    advancetable+4(,%ecx,4),%esi
                    510: 
                    511:        addl    tstep,%edx
                    512:        sbbl    %ecx,%ecx
                    513:        movb    %al,9(%edi)
                    514:        addl    %ebp,%ebx
                    515:        movb    (%esi),%al
                    516:        adcl    advancetable+4(,%ecx,4),%esi
                    517: 
                    518:        addl    tstep,%edx
                    519:        sbbl    %ecx,%ecx
                    520:        movb    %al,10(%edi)
                    521:        addl    %ebp,%ebx
                    522:        movb    (%esi),%al
                    523:        adcl    advancetable+4(,%ecx,4),%esi
                    524: 
                    525:        addl    tstep,%edx
                    526:        sbbl    %ecx,%ecx
                    527:        movb    %al,11(%edi)
                    528:        addl    %ebp,%ebx
                    529:        movb    (%esi),%al
                    530:        adcl    advancetable+4(,%ecx,4),%esi
                    531: 
                    532:        addl    tstep,%edx
                    533:        sbbl    %ecx,%ecx
                    534:        movb    %al,12(%edi)
                    535:        addl    %ebp,%ebx
                    536:        movb    (%esi),%al
                    537:        adcl    advancetable+4(,%ecx,4),%esi
                    538: 
                    539:        addl    tstep,%edx
                    540:        sbbl    %ecx,%ecx
                    541:        movb    %al,13(%edi)
                    542:        addl    %ebp,%ebx
                    543:        movb    (%esi),%al
                    544:        adcl    advancetable+4(,%ecx,4),%esi
                    545: 
                    546:        addl    tstep,%edx
                    547:        sbbl    %ecx,%ecx
                    548:        movb    %al,14(%edi)
                    549:        addl    %ebp,%ebx
                    550:        movb    (%esi),%al
                    551:        adcl    advancetable+4(,%ecx,4),%esi
                    552: 
                    553:        addl    $16,%edi
                    554:        movl    %edx,tfracf
                    555:        movl    snext,%edx
                    556:        movl    %ebx,sfracf
                    557:        movl    tnext,%ebx
                    558:        movl    %edx,s
                    559:        movl    %ebx,t
                    560: 
                    561:        movl    counttemp,%ecx          // retrieve count
                    562: 
                    563: //
                    564: // determine whether last span or not
                    565: //
                    566:        cmpl    $16,%ecx                                // are there multiple segments remaining?
                    567:        movb    %al,-1(%edi)
                    568:        ja              LNotLastSegment         // yes
                    569: 
                    570: //
                    571: // last segment of scan
                    572: //
                    573: LLastSegment:
                    574: 
                    575: //
                    576: // advance s/z, t/z, and 1/z, and calculate s & t at end of span and steps to
                    577: // get there. The number of pixels left is variable, and we want to land on the
                    578: // last pixel, not step one past it, so we can't run into arithmetic problems
                    579: //
                    580:        testl   %ecx,%ecx
                    581:        jz              LNoSteps                // just draw the last pixel and we're done
                    582: 
                    583: // pick up after the FDIV that was left in flight previously
                    584: 
                    585: 
                    586:        fld             %st(0)                  // duplicate it
                    587:        fmul    %st(4),%st(0)   // s = s/z * z
                    588:        fxch    %st(1)
                    589:        fmul    %st(3),%st(0)   // t = t/z * z
                    590:        fxch    %st(1)
                    591:        fistpl  snext
                    592:        fistpl  tnext
                    593: 
                    594:        movb    (%esi),%al              // load first texel in segment
                    595:        movl    C(tadjust),%ebx
                    596:        movb    %al,(%edi)              // store first pixel in segment
                    597:        movl    C(sadjust),%eax
                    598: 
                    599:        addl    snext,%eax
                    600:        addl    tnext,%ebx
                    601: 
                    602:        movl    C(bbextents),%ebp
                    603:        movl    C(bbextentt),%edx
                    604: 
                    605:        cmpl    $4096,%eax
                    606:        jl              LClampLow4
                    607:        cmpl    %ebp,%eax
                    608:        ja              LClampHigh4
                    609: LClampReentry4:
                    610:        movl    %eax,snext
                    611: 
                    612:        cmpl    $4096,%ebx
                    613:        jl              LClampLow5
                    614:        cmpl    %edx,%ebx
                    615:        ja              LClampHigh5
                    616: LClampReentry5:
                    617: 
                    618:        cmpl    $1,%ecx                 // don't bother 
                    619:        je              LOnlyOneStep    // if two pixels in segment, there's only one step,
                    620:                                                        //  of the segment length
                    621:        subl    s,%eax
                    622:        subl    t,%ebx
                    623: 
                    624:        addl    %eax,%eax               // convert to 15.17 format so multiply by 1.31
                    625:        addl    %ebx,%ebx               //  reciprocal yields 16.48
                    626: 
                    627:        imull   reciprocal_table_16-8(,%ecx,4)  // sstep = (snext - s) /
                    628:                                                                                        //  (spancount-1)
                    629:        movl    %edx,%ebp
                    630: 
                    631:        movl    %ebx,%eax
                    632:        imull   reciprocal_table_16-8(,%ecx,4)  // tstep = (tnext - t) /
                    633:                                                                                        //  (spancount-1)
                    634: LSetEntryvec:
                    635: //
                    636: // set up advancetable
                    637: //
                    638:        movl    entryvec_table_16(,%ecx,4),%ebx
                    639:        movl    %edx,%eax
                    640:        movl    %ebx,jumptemp           // entry point into code for RET later
                    641:        movl    %ebp,%ecx
                    642:        sarl    $16,%edx                        // tstep >>= 16;
                    643:        movl    C(cachewidth),%ebx
                    644:        sarl    $16,%ecx                        // sstep >>= 16;
                    645:        imull   %ebx,%edx
                    646: 
                    647:        addl    %ecx,%edx                       // add in sstep
                    648:                                                                // (tstep >> 16) * cachewidth + (sstep >> 16);
                    649:        movl    tfracf,%ecx
                    650:        movl    %edx,advancetable+4     // advance base in t
                    651:        addl    %ebx,%edx                       // ((tstep >> 16) + 1) * cachewidth +
                    652:                                                                //  (sstep >> 16);
                    653:        shll    $16,%ebp                        // left-justify sstep fractional part
                    654:        movl    sfracf,%ebx
                    655:        shll    $16,%eax                        // left-justify tstep fractional part
                    656:        movl    %edx,advancetable       // advance extra in t
                    657: 
                    658:        movl    %eax,tstep
                    659:        movl    %ecx,%edx
                    660:        addl    %eax,%edx
                    661:        sbbl    %ecx,%ecx
                    662:        addl    %ebp,%ebx
                    663:        adcl    advancetable+4(,%ecx,4),%esi
                    664: 
                    665:        jmp             *jumptemp                       // jump to the number-of-pixels handler
                    666: 
                    667: //----------------------------------------
                    668: 
                    669: LNoSteps:
                    670:        movb    (%esi),%al              // load first texel in segment
                    671:        subl    $15,%edi                        // adjust for hardwired offset
                    672:        jmp             LEndSpan
                    673: 
                    674: 
                    675: LOnlyOneStep:
                    676:        subl    s,%eax
                    677:        subl    t,%ebx
                    678:        movl    %eax,%ebp
                    679:        movl    %ebx,%edx
                    680:        jmp             LSetEntryvec
                    681: 
                    682: //----------------------------------------
                    683: 
                    684: .globl Entry2_16, Entry3_16, Entry4_16, Entry5_16
                    685: .globl Entry6_16, Entry7_16, Entry8_16, Entry9_16
                    686: .globl Entry10_16, Entry11_16, Entry12_16, Entry13_16
                    687: .globl Entry14_16, Entry15_16, Entry16_16
                    688: 
                    689: Entry2_16:
                    690:        subl    $14,%edi                // adjust for hardwired offsets
                    691:        movb    (%esi),%al
                    692:        jmp             LEntry2_16
                    693: 
                    694: //----------------------------------------
                    695: 
                    696: Entry3_16:
                    697:        subl    $13,%edi                // adjust for hardwired offsets
                    698:        addl    %eax,%edx
                    699:        movb    (%esi),%al
                    700:        sbbl    %ecx,%ecx
                    701:        addl    %ebp,%ebx
                    702:        adcl    advancetable+4(,%ecx,4),%esi
                    703:        jmp             LEntry3_16
                    704: 
                    705: //----------------------------------------
                    706: 
                    707: Entry4_16:
                    708:        subl    $12,%edi                // adjust for hardwired offsets
                    709:        addl    %eax,%edx
                    710:        movb    (%esi),%al
                    711:        sbbl    %ecx,%ecx
                    712:        addl    %ebp,%ebx
                    713:        adcl    advancetable+4(,%ecx,4),%esi
                    714:        addl    tstep,%edx
                    715:        jmp             LEntry4_16
                    716: 
                    717: //----------------------------------------
                    718: 
                    719: Entry5_16:
                    720:        subl    $11,%edi                // adjust for hardwired offsets
                    721:        addl    %eax,%edx
                    722:        movb    (%esi),%al
                    723:        sbbl    %ecx,%ecx
                    724:        addl    %ebp,%ebx
                    725:        adcl    advancetable+4(,%ecx,4),%esi
                    726:        addl    tstep,%edx
                    727:        jmp             LEntry5_16
                    728: 
                    729: //----------------------------------------
                    730: 
                    731: Entry6_16:
                    732:        subl    $10,%edi                // adjust for hardwired offsets
                    733:        addl    %eax,%edx
                    734:        movb    (%esi),%al
                    735:        sbbl    %ecx,%ecx
                    736:        addl    %ebp,%ebx
                    737:        adcl    advancetable+4(,%ecx,4),%esi
                    738:        addl    tstep,%edx
                    739:        jmp             LEntry6_16
                    740: 
                    741: //----------------------------------------
                    742: 
                    743: Entry7_16:
                    744:        subl    $9,%edi         // adjust for hardwired offsets
                    745:        addl    %eax,%edx
                    746:        movb    (%esi),%al
                    747:        sbbl    %ecx,%ecx
                    748:        addl    %ebp,%ebx
                    749:        adcl    advancetable+4(,%ecx,4),%esi
                    750:        addl    tstep,%edx
                    751:        jmp             LEntry7_16
                    752: 
                    753: //----------------------------------------
                    754: 
                    755: Entry8_16:
                    756:        subl    $8,%edi         // adjust for hardwired offsets
                    757:        addl    %eax,%edx
                    758:        movb    (%esi),%al
                    759:        sbbl    %ecx,%ecx
                    760:        addl    %ebp,%ebx
                    761:        adcl    advancetable+4(,%ecx,4),%esi
                    762:        addl    tstep,%edx
                    763:        jmp             LEntry8_16
                    764: 
                    765: //----------------------------------------
                    766: 
                    767: Entry9_16:
                    768:        subl    $7,%edi         // adjust for hardwired offsets
                    769:        addl    %eax,%edx
                    770:        movb    (%esi),%al
                    771:        sbbl    %ecx,%ecx
                    772:        addl    %ebp,%ebx
                    773:        adcl    advancetable+4(,%ecx,4),%esi
                    774:        addl    tstep,%edx
                    775:        jmp             LEntry9_16
                    776: 
                    777: //----------------------------------------
                    778: 
                    779: Entry10_16:
                    780:        subl    $6,%edi         // adjust for hardwired offsets
                    781:        addl    %eax,%edx
                    782:        movb    (%esi),%al
                    783:        sbbl    %ecx,%ecx
                    784:        addl    %ebp,%ebx
                    785:        adcl    advancetable+4(,%ecx,4),%esi
                    786:        addl    tstep,%edx
                    787:        jmp             LEntry10_16
                    788: 
                    789: //----------------------------------------
                    790: 
                    791: Entry11_16:
                    792:        subl    $5,%edi         // adjust for hardwired offsets
                    793:        addl    %eax,%edx
                    794:        movb    (%esi),%al
                    795:        sbbl    %ecx,%ecx
                    796:        addl    %ebp,%ebx
                    797:        adcl    advancetable+4(,%ecx,4),%esi
                    798:        addl    tstep,%edx
                    799:        jmp             LEntry11_16
                    800: 
                    801: //----------------------------------------
                    802: 
                    803: Entry12_16:
                    804:        subl    $4,%edi         // adjust for hardwired offsets
                    805:        addl    %eax,%edx
                    806:        movb    (%esi),%al
                    807:        sbbl    %ecx,%ecx
                    808:        addl    %ebp,%ebx
                    809:        adcl    advancetable+4(,%ecx,4),%esi
                    810:        addl    tstep,%edx
                    811:        jmp             LEntry12_16
                    812: 
                    813: //----------------------------------------
                    814: 
                    815: Entry13_16:
                    816:        subl    $3,%edi         // adjust for hardwired offsets
                    817:        addl    %eax,%edx
                    818:        movb    (%esi),%al
                    819:        sbbl    %ecx,%ecx
                    820:        addl    %ebp,%ebx
                    821:        adcl    advancetable+4(,%ecx,4),%esi
                    822:        addl    tstep,%edx
                    823:        jmp             LEntry13_16
                    824: 
                    825: //----------------------------------------
                    826: 
                    827: Entry14_16:
                    828:        subl    $2,%edi         // adjust for hardwired offsets
                    829:        addl    %eax,%edx
                    830:        movb    (%esi),%al
                    831:        sbbl    %ecx,%ecx
                    832:        addl    %ebp,%ebx
                    833:        adcl    advancetable+4(,%ecx,4),%esi
                    834:        addl    tstep,%edx
                    835:        jmp             LEntry14_16
                    836: 
                    837: //----------------------------------------
                    838: 
                    839: Entry15_16:
                    840:        decl    %edi            // adjust for hardwired offsets
                    841:        addl    %eax,%edx
                    842:        movb    (%esi),%al
                    843:        sbbl    %ecx,%ecx
                    844:        addl    %ebp,%ebx
                    845:        adcl    advancetable+4(,%ecx,4),%esi
                    846:        addl    tstep,%edx
                    847:        jmp             LEntry15_16
                    848: 
                    849: //----------------------------------------
                    850: 
                    851: Entry16_16:
                    852:        addl    %eax,%edx
                    853:        movb    (%esi),%al
                    854:        sbbl    %ecx,%ecx
                    855:        addl    %ebp,%ebx
                    856:        adcl    advancetable+4(,%ecx,4),%esi
                    857: 
                    858:        addl    tstep,%edx
                    859:        sbbl    %ecx,%ecx
                    860:        movb    %al,1(%edi)
                    861:        addl    %ebp,%ebx
                    862:        movb    (%esi),%al
                    863:        adcl    advancetable+4(,%ecx,4),%esi
                    864:        addl    tstep,%edx
                    865: LEntry15_16:
                    866:        sbbl    %ecx,%ecx
                    867:        movb    %al,2(%edi)
                    868:        addl    %ebp,%ebx
                    869:        movb    (%esi),%al
                    870:        adcl    advancetable+4(,%ecx,4),%esi
                    871:        addl    tstep,%edx
                    872: LEntry14_16:
                    873:        sbbl    %ecx,%ecx
                    874:        movb    %al,3(%edi)
                    875:        addl    %ebp,%ebx
                    876:        movb    (%esi),%al
                    877:        adcl    advancetable+4(,%ecx,4),%esi
                    878:        addl    tstep,%edx
                    879: LEntry13_16:
                    880:        sbbl    %ecx,%ecx
                    881:        movb    %al,4(%edi)
                    882:        addl    %ebp,%ebx
                    883:        movb    (%esi),%al
                    884:        adcl    advancetable+4(,%ecx,4),%esi
                    885:        addl    tstep,%edx
                    886: LEntry12_16:
                    887:        sbbl    %ecx,%ecx
                    888:        movb    %al,5(%edi)
                    889:        addl    %ebp,%ebx
                    890:        movb    (%esi),%al
                    891:        adcl    advancetable+4(,%ecx,4),%esi
                    892:        addl    tstep,%edx
                    893: LEntry11_16:
                    894:        sbbl    %ecx,%ecx
                    895:        movb    %al,6(%edi)
                    896:        addl    %ebp,%ebx
                    897:        movb    (%esi),%al
                    898:        adcl    advancetable+4(,%ecx,4),%esi
                    899:        addl    tstep,%edx
                    900: LEntry10_16:
                    901:        sbbl    %ecx,%ecx
                    902:        movb    %al,7(%edi)
                    903:        addl    %ebp,%ebx
                    904:        movb    (%esi),%al
                    905:        adcl    advancetable+4(,%ecx,4),%esi
                    906:        addl    tstep,%edx
                    907: LEntry9_16:
                    908:        sbbl    %ecx,%ecx
                    909:        movb    %al,8(%edi)
                    910:        addl    %ebp,%ebx
                    911:        movb    (%esi),%al
                    912:        adcl    advancetable+4(,%ecx,4),%esi
                    913:        addl    tstep,%edx
                    914: LEntry8_16:
                    915:        sbbl    %ecx,%ecx
                    916:        movb    %al,9(%edi)
                    917:        addl    %ebp,%ebx
                    918:        movb    (%esi),%al
                    919:        adcl    advancetable+4(,%ecx,4),%esi
                    920:        addl    tstep,%edx
                    921: LEntry7_16:
                    922:        sbbl    %ecx,%ecx
                    923:        movb    %al,10(%edi)
                    924:        addl    %ebp,%ebx
                    925:        movb    (%esi),%al
                    926:        adcl    advancetable+4(,%ecx,4),%esi
                    927:        addl    tstep,%edx
                    928: LEntry6_16:
                    929:        sbbl    %ecx,%ecx
                    930:        movb    %al,11(%edi)
                    931:        addl    %ebp,%ebx
                    932:        movb    (%esi),%al
                    933:        adcl    advancetable+4(,%ecx,4),%esi
                    934:        addl    tstep,%edx
                    935: LEntry5_16:
                    936:        sbbl    %ecx,%ecx
                    937:        movb    %al,12(%edi)
                    938:        addl    %ebp,%ebx
                    939:        movb    (%esi),%al
                    940:        adcl    advancetable+4(,%ecx,4),%esi
                    941:        addl    tstep,%edx
                    942: LEntry4_16:
                    943:        sbbl    %ecx,%ecx
                    944:        movb    %al,13(%edi)
                    945:        addl    %ebp,%ebx
                    946:        movb    (%esi),%al
                    947:        adcl    advancetable+4(,%ecx,4),%esi
                    948: LEntry3_16:
                    949:        movb    %al,14(%edi)
                    950:        movb    (%esi),%al
                    951: LEntry2_16:
                    952: 
                    953: LEndSpan:
                    954: 
                    955: //
                    956: // clear s/z, t/z, 1/z from FP stack
                    957: //
                    958:        fstp %st(0)
                    959:        fstp %st(0)
                    960:        fstp %st(0)
                    961: 
                    962:        movl    pspantemp,%ebx                          // restore spans pointer
                    963:        movl    espan_t_pnext(%ebx),%ebx        // point to next span
                    964:        testl   %ebx,%ebx                       // any more spans?
                    965:        movb    %al,15(%edi)
                    966:        jnz             LSpanLoop                       // more spans
                    967: 
                    968:        popl    %ebx                            // restore register variables
                    969:        popl    %esi
                    970:        popl    %edi
                    971:        popl    %ebp                            // restore the caller's stack frame
                    972:        ret
                    973: 
                    974: #endif // id386

unix.superglobalmegacorp.com

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