Annotation of quake1/r_aliasa.s, revision 1.1.1.1

1.1       root        1: //
                      2: // r_aliasa.s
                      3: // x86 assembly-language Alias model transform and project code.
                      4: //
                      5: 
                      6: #include "asm_i386.h"
                      7: #include "quakeasm.h"
                      8: #include "asm_draw.h"
                      9: #include "d_ifacea.h"
                     10: 
                     11: #if id386
                     12: 
                     13:        .data
                     14: 
                     15: Lfloat_1:      .single 1.0
                     16: Ltemp:         .long   0
                     17: Lcoords:       .long   0, 0, 0
                     18: 
                     19:        .text
                     20: 
                     21: #define fv                     12+4
                     22: #define pstverts       12+8
                     23: 
                     24: .globl C(R_AliasTransformAndProjectFinalVerts)
                     25: C(R_AliasTransformAndProjectFinalVerts):
                     26:        pushl   %ebp                            // preserve caller's stack frame
                     27:        pushl   %edi
                     28:        pushl   %esi                            // preserve register variables
                     29: 
                     30: //     int                     i, temp;
                     31: //     float           lightcos, *plightnormal, zi;
                     32: //     trivertx_t      *pverts;
                     33: 
                     34: //     pverts = r_apverts;
                     35:        movl    C(r_apverts),%esi
                     36: 
                     37: //     for (i=0 ; i<r_anumverts ; i++, fv++, pverts++, pstverts++)
                     38: //     {
                     39:        movl    pstverts(%esp),%ebp
                     40:        movl    fv(%esp),%edi
                     41:        movl    C(r_anumverts),%ecx
                     42:        subl    %edx,%edx
                     43: 
                     44: Lloop:
                     45: 
                     46: //     // transform and project
                     47: //             zi = 1.0 / (DotProduct(pverts->v, aliastransform[2]) +
                     48: //                             aliastransform[2][3]);
                     49:        movb    (%esi),%dl
                     50:        movb    %dl,Lcoords
                     51:        fildl   Lcoords                         // v[0]
                     52:        movb    1(%esi),%dl
                     53:        movb    %dl,Lcoords+4
                     54:        fildl   Lcoords+4                       // v[1] | v[0]
                     55:        movb    2(%esi),%dl     
                     56:        movb    %dl,Lcoords+8
                     57:        fildl   Lcoords+8                       // v[2] | v[1] | v[0]
                     58: 
                     59:        fld             %st(2)                          // v[0] | v[2] | v[1] | v[0]
                     60:        fmuls   C(aliastransform)+32 // accum | v[2] | v[1] | v[0]
                     61:        fld             %st(2)                          // v[1] | accum | v[2] | v[1] | v[0]
                     62:        fmuls   C(aliastransform)+36 // accum2 | accum | v[2] | v[1] | v[0]
                     63:        fxch    %st(1)                          // accum | accum2 | v[2] | v[1] | v[0]
                     64:        fadds   C(aliastransform)+44 // accum | accum2 | v[2] | v[1] | v[0]
                     65:        fld             %st(2)                          // v[2] | accum | accum2 | v[2] | v[1] | v[0]
                     66:        fmuls   C(aliastransform)+40 // accum3 | accum | accum2 | v[2] | v[1] |
                     67:                                                                 //  v[0]
                     68:        fxch    %st(1)                          // accum | accum3 | accum2 | v[2] | v[1] | v[0]
                     69:        faddp   %st(0),%st(2)           // accum3 | accum | v[2] | v[1] | v[0]
                     70:        movb    tv_lightnormalindex(%esi),%dl
                     71:        movl    stv_s(%ebp),%eax
                     72:        movl    %eax,fv_v+8(%edi)
                     73:        faddp   %st(0),%st(1)           // z | v[2] | v[1] | v[0]
                     74: 
                     75:        movl    stv_t(%ebp),%eax
                     76:        movl    %eax,fv_v+12(%edi)
                     77: 
                     78: //     // lighting
                     79: //             plightnormal = r_avertexnormals[pverts->lightnormalindex];
                     80: 
                     81:        fdivrs  Lfloat_1                        // zi | v[2] | v[1] | v[0]
                     82: 
                     83: //             fv->v[2] = pstverts->s;
                     84: //             fv->v[3] = pstverts->t;
                     85: //             fv->flags = pstverts->onseam;
                     86:        movl    stv_onseam(%ebp),%eax
                     87:        movl    %eax,fv_flags(%edi)
                     88: 
                     89:        movl    fv_size(%edi),%eax
                     90:        movl    stv_size(%ebp),%eax
                     91:        movl    4(%esi),%eax
                     92: 
                     93:        leal    (%edx,%edx,2),%eax      // index*3
                     94: 
                     95:        fxch    %st(3)                          // v[0] | v[2] | v[1] | zi
                     96: 
                     97: //             lightcos = DotProduct (plightnormal, r_plightvec);
                     98:        flds    C(r_avertexnormals)(,%eax,4)
                     99:        fmuls   C(r_plightvec)
                    100:        flds    C(r_avertexnormals)+4(,%eax,4)
                    101:        fmuls   C(r_plightvec)+4
                    102:        flds    C(r_avertexnormals)+8(,%eax,4)
                    103:        fmuls   C(r_plightvec)+8
                    104:        fxch    %st(1)
                    105:        faddp   %st(0),%st(2)
                    106:        fld             %st(2)                           // v[0] | laccum | laccum2 | v[0] | v[2] |
                    107:                                                                 //  v[1] | zi
                    108:        fmuls   C(aliastransform)+0  // xaccum | laccum | laccum2 | v[0] | v[2] |
                    109:                                                                 //  v[1] | zi
                    110:        fxch    %st(2)                           // laccum2 | laccum | xaccum | v[0] | v[2] |
                    111:                                                                 //  v[1] | zi
                    112:        faddp   %st(0),%st(1)            // laccum | xaccum | v[0] | v[2] | v[1] | zi
                    113: 
                    114: //             temp = r_ambientlight;
                    115: //             if (lightcos < 0)
                    116: //             {
                    117:        fsts    Ltemp
                    118:        movl    C(r_ambientlight),%eax
                    119:        movb    Ltemp+3,%dl
                    120:        testb   $0x80,%dl
                    121:        jz              Lsavelight      // no need to clamp if only ambient lit, because
                    122:                                                //  r_ambientlight is preclamped
                    123: 
                    124: //                     temp += (int)(r_shadelight * lightcos);
                    125:        fmuls   C(r_shadelight)
                    126: // FIXME: fast float->int conversion?
                    127:        fistpl  Ltemp
                    128:        addl    Ltemp,%eax
                    129: 
                    130: //             // clamp; because we limited the minimum ambient and shading light, we
                    131: //             // don't have to clamp low light, just bright
                    132: //                     if (temp < 0)
                    133: //                             temp = 0;
                    134:        jns             Lp1
                    135:        subl    %eax,%eax
                    136: 
                    137: //             }
                    138: 
                    139: Lp1:
                    140: 
                    141: //             fv->v[4] = temp;
                    142: //
                    143: //     // x, y, and z are scaled down by 1/2**31 in the transform, so 1/z is
                    144: //     // scaled up by 1/2**31, and the scaling cancels out for x and y in the
                    145: //     // projection
                    146: //             fv->v[0] = ((DotProduct(pverts->v, aliastransform[0]) +
                    147: //                             aliastransform[0][3]) * zi) + aliasxcenter;
                    148: //             fv->v[1] = ((DotProduct(pverts->v, aliastransform[1]) +
                    149: //                             aliastransform[1][3]) * zi) + aliasycenter;
                    150: //             fv->v[5] = zi;
                    151:        fxch    %st(1)                           // v[0] | xaccum | v[2] | v[1] | zi
                    152:        fmuls   C(aliastransform)+16 // yaccum | xaccum | v[2] | v[1] | zi
                    153:        fxch    %st(3)                           // v[1] | xaccum | v[2] | yaccum | zi
                    154:        fld             %st(0)                           // v[1] | v[1] | xaccum | v[2] | yaccum | zi
                    155:        fmuls   C(aliastransform)+4      // xaccum2 | v[1] | xaccum | v[2] | yaccum |zi
                    156:        fxch    %st(1)                           // v[1] | xaccum2 | xaccum | v[2] | yaccum |zi
                    157:        movl    %eax,fv_v+16(%edi)
                    158:        fmuls   C(aliastransform)+20 // yaccum2 | xaccum2 | xaccum | v[2] | yaccum|
                    159:                                                                 //  zi
                    160:        fxch    %st(2)                           // xaccum | xaccum2 | yaccum2 | v[2] | yaccum|
                    161:                                                                 //  zi
                    162:        fadds   C(aliastransform)+12 // xaccum | xaccum2 | yaccum2 | v[2] | yaccum|
                    163:                                                                 //  zi
                    164:        fxch    %st(4)                           // yaccum | xaccum2 | yaccum2 | v[2] | xaccum|
                    165:                                                                 //  zi
                    166:        fadds   C(aliastransform)+28 // yaccum | xaccum2 | yaccum2 | v[2] | xaccum|
                    167:                                                                 //  zi
                    168:        fxch    %st(3)                           // v[2] | xaccum2 | yaccum2 | yaccum | xaccum|
                    169:                                                                 //  zi
                    170:        fld             %st(0)                           // v[2] | v[2] | xaccum2 | yaccum2 | yaccum |
                    171:                                                                 //  xaccum | zi
                    172:        fmuls   C(aliastransform)+8      // xaccum3 | v[2] | xaccum2 | yaccum2 |yaccum|
                    173:                                                                 //  xaccum | zi
                    174:        fxch    %st(1)                           // v[2] | xaccum3 | xaccum2 | yaccum2 |yaccum|
                    175:                                                                 //  xaccum | zi
                    176:        fmuls   C(aliastransform)+24 // yaccum3 | xaccum3 | xaccum2 | yaccum2 |
                    177:                                                                 // yaccum | xaccum | zi
                    178:        fxch    %st(5)                           // xaccum | xaccum3 | xaccum2 | yaccum2 |
                    179:                                                                 // yaccum | yaccum3 | zi
                    180:        faddp   %st(0),%st(2)            // xaccum3 | xaccum | yaccum2 | yaccum |
                    181:                                                                 //  yaccum3 | zi
                    182:        fxch    %st(3)                           // yaccum | xaccum | yaccum2 | xaccum3 |
                    183:                                                                 //  yaccum3 | zi
                    184:        faddp   %st(0),%st(2)            // xaccum | yaccum | xaccum3 | yaccum3 | zi
                    185:        addl    $tv_size,%esi
                    186:        faddp   %st(0),%st(2)            // yaccum | x | yaccum3 | zi
                    187:        faddp   %st(0),%st(2)            // x | y | zi
                    188:        addl    $stv_size,%ebp
                    189:        fmul    %st(2)                           // x/z | y | zi
                    190:        fxch    %st(1)                           // y | x/z | zi
                    191:        fmul    %st(2)                           // y/z | x/z | zi
                    192:        fxch    %st(1)                           // x/z | y/z | zi
                    193:        fadds   C(aliasxcenter)          // u | y/z | zi
                    194:        fxch    %st(1)                           // y/z | u | zi
                    195:        fadds   C(aliasycenter)          // v | u | zi
                    196:        fxch    %st(2)                           // zi | u | v
                    197: // FIXME: fast float->int conversion?
                    198:        fistpl  fv_v+20(%edi)            // u | v
                    199:        fistpl  fv_v+0(%edi)             // v
                    200:        fistpl  fv_v+4(%edi)
                    201: 
                    202: //     }
                    203: 
                    204:        addl    $fv_size,%edi
                    205:        decl    %ecx
                    206:        jnz             Lloop
                    207: 
                    208:        popl    %esi                            // restore register variables
                    209:        popl    %edi
                    210:        popl    %ebp                            // restore the caller's stack frame
                    211:        ret
                    212: 
                    213: Lsavelight:
                    214:        fstp    %st(0)
                    215:        jmp             Lp1
                    216: 
                    217: #endif // id386
                    218: 

unix.superglobalmegacorp.com

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