Annotation of quakeworld/client/math.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: // math.s
                     22: // x86 assembly-language math routines.
                     23: 
                     24: #include "asm_i386.h"
                     25: #include "quakeasm.h"
                     26: 
                     27: 
                     28: #if    id386
                     29: 
                     30:        .data
                     31: 
                     32:        .align  4
                     33: Ljmptab:       .long   Lcase0, Lcase1, Lcase2, Lcase3
                     34:                        .long   Lcase4, Lcase5, Lcase6, Lcase7
                     35: 
                     36:        .text
                     37: 
                     38: // TODO: rounding needed?
                     39: // stack parameter offset
                     40: #define        val     4
                     41: 
                     42: .globl C(Invert24To16)
                     43: C(Invert24To16):
                     44: 
                     45:        movl    val(%esp),%ecx
                     46:        movl    $0x100,%edx             // 0x10000000000 as dividend
                     47:        cmpl    %edx,%ecx
                     48:        jle             LOutOfRange
                     49: 
                     50:        subl    %eax,%eax
                     51:        divl    %ecx
                     52: 
                     53:        ret
                     54: 
                     55: LOutOfRange:
                     56:        movl    $0xFFFFFFFF,%eax
                     57:        ret
                     58: 
                     59: #define        in      4
                     60: #define out    8
                     61: 
                     62:        .align 2
                     63: .globl C(TransformVector)
                     64: C(TransformVector):
                     65:        movl    in(%esp),%eax
                     66:        movl    out(%esp),%edx
                     67: 
                     68:        flds    (%eax)          // in[0]
                     69:        fmuls   C(vright)               // in[0]*vright[0]
                     70:        flds    (%eax)          // in[0] | in[0]*vright[0]
                     71:        fmuls   C(vup)          // in[0]*vup[0] | in[0]*vright[0]
                     72:        flds    (%eax)          // in[0] | in[0]*vup[0] | in[0]*vright[0]
                     73:        fmuls   C(vpn)          // in[0]*vpn[0] | in[0]*vup[0] | in[0]*vright[0]
                     74: 
                     75:        flds    4(%eax)         // in[1] | ...
                     76:        fmuls   C(vright)+4     // in[1]*vright[1] | ...
                     77:        flds    4(%eax)         // in[1] | in[1]*vright[1] | ...
                     78:        fmuls   C(vup)+4                // in[1]*vup[1] | in[1]*vright[1] | ...
                     79:        flds    4(%eax)         // in[1] | in[1]*vup[1] | in[1]*vright[1] | ...
                     80:        fmuls   C(vpn)+4                // in[1]*vpn[1] | in[1]*vup[1] | in[1]*vright[1] | ...
                     81:        fxch    %st(2)          // in[1]*vright[1] | in[1]*vup[1] | in[1]*vpn[1] | ...
                     82: 
                     83:        faddp   %st(0),%st(5)   // in[1]*vup[1] | in[1]*vpn[1] | ...
                     84:        faddp   %st(0),%st(3)   // in[1]*vpn[1] | ...
                     85:        faddp   %st(0),%st(1)   // vpn_accum | vup_accum | vright_accum
                     86: 
                     87:        flds    8(%eax)         // in[2] | ...
                     88:        fmuls   C(vright)+8     // in[2]*vright[2] | ...
                     89:        flds    8(%eax)         // in[2] | in[2]*vright[2] | ...
                     90:        fmuls   C(vup)+8                // in[2]*vup[2] | in[2]*vright[2] | ...
                     91:        flds    8(%eax)         // in[2] | in[2]*vup[2] | in[2]*vright[2] | ...
                     92:        fmuls   C(vpn)+8                // in[2]*vpn[2] | in[2]*vup[2] | in[2]*vright[2] | ...
                     93:        fxch    %st(2)          // in[2]*vright[2] | in[2]*vup[2] | in[2]*vpn[2] | ...
                     94: 
                     95:        faddp   %st(0),%st(5)   // in[2]*vup[2] | in[2]*vpn[2] | ...
                     96:        faddp   %st(0),%st(3)   // in[2]*vpn[2] | ...
                     97:        faddp   %st(0),%st(1)   // vpn_accum | vup_accum | vright_accum
                     98: 
                     99:        fstps   8(%edx)         // out[2]
                    100:        fstps   4(%edx)         // out[1]
                    101:        fstps   (%edx)          // out[0]
                    102: 
                    103:        ret
                    104: 
                    105: 
                    106: #define EMINS  4+4
                    107: #define EMAXS  4+8
                    108: #define P              4+12
                    109: 
                    110:        .align 2
                    111: .globl C(BoxOnPlaneSide)
                    112: C(BoxOnPlaneSide):
                    113:        pushl   %ebx
                    114: 
                    115:        movl    P(%esp),%edx
                    116:        movl    EMINS(%esp),%ecx
                    117:        xorl    %eax,%eax
                    118:        movl    EMAXS(%esp),%ebx
                    119:        movb    pl_signbits(%edx),%al
                    120:        cmpb    $8,%al
                    121:        jge             Lerror
                    122:        flds    pl_normal(%edx)         // p->normal[0]
                    123:        fld             %st(0)                          // p->normal[0] | p->normal[0]
                    124:        jmp             Ljmptab(,%eax,4)
                    125: 
                    126: 
                    127: //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
                    128: //dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
                    129: Lcase0:
                    130:        fmuls   (%ebx)                          // p->normal[0]*emaxs[0] | p->normal[0]
                    131:        flds    pl_normal+4(%edx)       // p->normal[1] | p->normal[0]*emaxs[0] |
                    132:                                                                //  p->normal[0]
                    133:        fxch    %st(2)                          // p->normal[0] | p->normal[0]*emaxs[0] |
                    134:                                                                //  p->normal[1]
                    135:        fmuls   (%ecx)                          // p->normal[0]*emins[0] |
                    136:                                                                //  p->normal[0]*emaxs[0] | p->normal[1]
                    137:        fxch    %st(2)                          // p->normal[1] | p->normal[0]*emaxs[0] |
                    138:                                                                //  p->normal[0]*emins[0]
                    139:        fld             %st(0)                          // p->normal[1] | p->normal[1] |
                    140:                                                                //  p->normal[0]*emaxs[0] |
                    141:                                                                //  p->normal[0]*emins[0]
                    142:        fmuls   4(%ebx)                         // p->normal[1]*emaxs[1] | p->normal[1] |
                    143:                                                                //  p->normal[0]*emaxs[0] |
                    144:                                                                //  p->normal[0]*emins[0]
                    145:        flds    pl_normal+8(%edx)       // p->normal[2] | p->normal[1]*emaxs[1] |
                    146:                                                                //  p->normal[1] | p->normal[0]*emaxs[0] |
                    147:                                                                //  p->normal[0]*emins[0]
                    148:        fxch    %st(2)                          // p->normal[1] | p->normal[1]*emaxs[1] |
                    149:                                                                //  p->normal[2] | p->normal[0]*emaxs[0] |
                    150:                                                                //  p->normal[0]*emins[0]
                    151:        fmuls   4(%ecx)                         // p->normal[1]*emins[1] |
                    152:                                                                //  p->normal[1]*emaxs[1] |
                    153:                                                                //  p->normal[2] | p->normal[0]*emaxs[0] |
                    154:                                                                //  p->normal[0]*emins[0]
                    155:        fxch    %st(2)                          // p->normal[2] | p->normal[1]*emaxs[1] |
                    156:                                                                //  p->normal[1]*emins[1] |
                    157:                                                                //  p->normal[0]*emaxs[0] |
                    158:                                                                //  p->normal[0]*emins[0]
                    159:        fld             %st(0)                          // p->normal[2] | p->normal[2] |
                    160:                                                                //  p->normal[1]*emaxs[1] |
                    161:                                                                //  p->normal[1]*emins[1] |
                    162:                                                                //  p->normal[0]*emaxs[0] |
                    163:                                                                //  p->normal[0]*emins[0]
                    164:        fmuls   8(%ebx)                         // p->normal[2]*emaxs[2] |
                    165:                                                                //  p->normal[2] |
                    166:                                                                //  p->normal[1]*emaxs[1] |
                    167:                                                                //  p->normal[1]*emins[1] |
                    168:                                                                //  p->normal[0]*emaxs[0] |
                    169:                                                                //  p->normal[0]*emins[0]
                    170:        fxch    %st(5)                          // p->normal[0]*emins[0] |
                    171:                                                                //  p->normal[2] |
                    172:                                                                //  p->normal[1]*emaxs[1] |
                    173:                                                                //  p->normal[1]*emins[1] |
                    174:                                                                //  p->normal[0]*emaxs[0] |
                    175:                                                                //  p->normal[2]*emaxs[2]
                    176:        faddp   %st(0),%st(3)           //p->normal[2] |
                    177:                                                                // p->normal[1]*emaxs[1] |
                    178:                                                                // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
                    179:                                                                // p->normal[0]*emaxs[0] |
                    180:                                                                // p->normal[2]*emaxs[2]
                    181:        fmuls   8(%ecx)                         //p->normal[2]*emins[2] |
                    182:                                                                // p->normal[1]*emaxs[1] |
                    183:                                                                // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
                    184:                                                                // p->normal[0]*emaxs[0] |
                    185:                                                                // p->normal[2]*emaxs[2]
                    186:        fxch    %st(1)                          //p->normal[1]*emaxs[1] |
                    187:                                                                // p->normal[2]*emins[2] |
                    188:                                                                // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
                    189:                                                                // p->normal[0]*emaxs[0] |
                    190:                                                                // p->normal[2]*emaxs[2]
                    191:        faddp   %st(0),%st(3)           //p->normal[2]*emins[2] |
                    192:                                                                // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
                    193:                                                                // p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
                    194:                                                                // p->normal[2]*emaxs[2]
                    195:        fxch    %st(3)                          //p->normal[2]*emaxs[2] +
                    196:                                                                // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
                    197:                                                                // p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
                    198:                                                                // p->normal[2]*emins[2]
                    199:        faddp   %st(0),%st(2)           //p->normal[1]*emins[1]+p->normal[0]*emins[0]|
                    200:                                                                // dist1 | p->normal[2]*emins[2]
                    201: 
                    202:        jmp             LSetSides
                    203: 
                    204: //dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
                    205: //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
                    206: Lcase1:
                    207:        fmuls   (%ecx)                          // emins[0]
                    208:        flds    pl_normal+4(%edx)
                    209:        fxch    %st(2)
                    210:        fmuls   (%ebx)                          // emaxs[0]
                    211:        fxch    %st(2)
                    212:        fld             %st(0)
                    213:        fmuls   4(%ebx)                         // emaxs[1]
                    214:        flds    pl_normal+8(%edx)
                    215:        fxch    %st(2)
                    216:        fmuls   4(%ecx)                         // emins[1]
                    217:        fxch    %st(2)
                    218:        fld             %st(0)
                    219:        fmuls   8(%ebx)                         // emaxs[2]
                    220:        fxch    %st(5)
                    221:        faddp   %st(0),%st(3)
                    222:        fmuls   8(%ecx)                         // emins[2]
                    223:        fxch    %st(1)
                    224:        faddp   %st(0),%st(3)
                    225:        fxch    %st(3)
                    226:        faddp   %st(0),%st(2)
                    227: 
                    228:        jmp             LSetSides
                    229: 
                    230: //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
                    231: //dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
                    232: Lcase2:
                    233:        fmuls   (%ebx)                          // emaxs[0]
                    234:        flds    pl_normal+4(%edx)
                    235:        fxch    %st(2)
                    236:        fmuls   (%ecx)                          // emins[0]
                    237:        fxch    %st(2)
                    238:        fld             %st(0)
                    239:        fmuls   4(%ecx)                         // emins[1]
                    240:        flds    pl_normal+8(%edx)
                    241:        fxch    %st(2)
                    242:        fmuls   4(%ebx)                         // emaxs[1]
                    243:        fxch    %st(2)
                    244:        fld             %st(0)
                    245:        fmuls   8(%ebx)                         // emaxs[2]
                    246:        fxch    %st(5)
                    247:        faddp   %st(0),%st(3)
                    248:        fmuls   8(%ecx)                         // emins[2]
                    249:        fxch    %st(1)
                    250:        faddp   %st(0),%st(3)
                    251:        fxch    %st(3)
                    252:        faddp   %st(0),%st(2)
                    253: 
                    254:        jmp             LSetSides
                    255: 
                    256: //dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
                    257: //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
                    258: Lcase3:
                    259:        fmuls   (%ecx)                          // emins[0]
                    260:        flds    pl_normal+4(%edx)
                    261:        fxch    %st(2)
                    262:        fmuls   (%ebx)                          // emaxs[0]
                    263:        fxch    %st(2)
                    264:        fld             %st(0)
                    265:        fmuls   4(%ecx)                         // emins[1]
                    266:        flds    pl_normal+8(%edx)
                    267:        fxch    %st(2)
                    268:        fmuls   4(%ebx)                         // emaxs[1]
                    269:        fxch    %st(2)
                    270:        fld             %st(0)
                    271:        fmuls   8(%ebx)                         // emaxs[2]
                    272:        fxch    %st(5)
                    273:        faddp   %st(0),%st(3)
                    274:        fmuls   8(%ecx)                         // emins[2]
                    275:        fxch    %st(1)
                    276:        faddp   %st(0),%st(3)
                    277:        fxch    %st(3)
                    278:        faddp   %st(0),%st(2)
                    279: 
                    280:        jmp             LSetSides
                    281: 
                    282: //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
                    283: //dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
                    284: Lcase4:
                    285:        fmuls   (%ebx)                          // emaxs[0]
                    286:        flds    pl_normal+4(%edx)
                    287:        fxch    %st(2)
                    288:        fmuls   (%ecx)                          // emins[0]
                    289:        fxch    %st(2)
                    290:        fld             %st(0)
                    291:        fmuls   4(%ebx)                         // emaxs[1]
                    292:        flds    pl_normal+8(%edx)
                    293:        fxch    %st(2)
                    294:        fmuls   4(%ecx)                         // emins[1]
                    295:        fxch    %st(2)
                    296:        fld             %st(0)
                    297:        fmuls   8(%ecx)                         // emins[2]
                    298:        fxch    %st(5)
                    299:        faddp   %st(0),%st(3)
                    300:        fmuls   8(%ebx)                         // emaxs[2]
                    301:        fxch    %st(1)
                    302:        faddp   %st(0),%st(3)
                    303:        fxch    %st(3)
                    304:        faddp   %st(0),%st(2)
                    305: 
                    306:        jmp             LSetSides
                    307: 
                    308: //dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
                    309: //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
                    310: Lcase5:
                    311:        fmuls   (%ecx)                          // emins[0]
                    312:        flds    pl_normal+4(%edx)
                    313:        fxch    %st(2)
                    314:        fmuls   (%ebx)                          // emaxs[0]
                    315:        fxch    %st(2)
                    316:        fld             %st(0)
                    317:        fmuls   4(%ebx)                         // emaxs[1]
                    318:        flds    pl_normal+8(%edx)
                    319:        fxch    %st(2)
                    320:        fmuls   4(%ecx)                         // emins[1]
                    321:        fxch    %st(2)
                    322:        fld             %st(0)
                    323:        fmuls   8(%ecx)                         // emins[2]
                    324:        fxch    %st(5)
                    325:        faddp   %st(0),%st(3)
                    326:        fmuls   8(%ebx)                         // emaxs[2]
                    327:        fxch    %st(1)
                    328:        faddp   %st(0),%st(3)
                    329:        fxch    %st(3)
                    330:        faddp   %st(0),%st(2)
                    331: 
                    332:        jmp             LSetSides
                    333: 
                    334: //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
                    335: //dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
                    336: Lcase6:
                    337:        fmuls   (%ebx)                          // emaxs[0]
                    338:        flds    pl_normal+4(%edx)
                    339:        fxch    %st(2)
                    340:        fmuls   (%ecx)                          // emins[0]
                    341:        fxch    %st(2)
                    342:        fld             %st(0)
                    343:        fmuls   4(%ecx)                         // emins[1]
                    344:        flds    pl_normal+8(%edx)
                    345:        fxch    %st(2)
                    346:        fmuls   4(%ebx)                         // emaxs[1]
                    347:        fxch    %st(2)
                    348:        fld             %st(0)
                    349:        fmuls   8(%ecx)                         // emins[2]
                    350:        fxch    %st(5)
                    351:        faddp   %st(0),%st(3)
                    352:        fmuls   8(%ebx)                         // emaxs[2]
                    353:        fxch    %st(1)
                    354:        faddp   %st(0),%st(3)
                    355:        fxch    %st(3)
                    356:        faddp   %st(0),%st(2)
                    357: 
                    358:        jmp             LSetSides
                    359: 
                    360: //dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
                    361: //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
                    362: Lcase7:
                    363:        fmuls   (%ecx)                          // emins[0]
                    364:        flds    pl_normal+4(%edx)
                    365:        fxch    %st(2)
                    366:        fmuls   (%ebx)                          // emaxs[0]
                    367:        fxch    %st(2)
                    368:        fld             %st(0)
                    369:        fmuls   4(%ecx)                         // emins[1]
                    370:        flds    pl_normal+8(%edx)
                    371:        fxch    %st(2)
                    372:        fmuls   4(%ebx)                         // emaxs[1]
                    373:        fxch    %st(2)
                    374:        fld             %st(0)
                    375:        fmuls   8(%ecx)                         // emins[2]
                    376:        fxch    %st(5)
                    377:        faddp   %st(0),%st(3)
                    378:        fmuls   8(%ebx)                         // emaxs[2]
                    379:        fxch    %st(1)
                    380:        faddp   %st(0),%st(3)
                    381:        fxch    %st(3)
                    382:        faddp   %st(0),%st(2)
                    383: 
                    384: LSetSides:
                    385: 
                    386: //     sides = 0;
                    387: //     if (dist1 >= p->dist)
                    388: //             sides = 1;
                    389: //     if (dist2 < p->dist)
                    390: //             sides |= 2;
                    391: 
                    392:        faddp   %st(0),%st(2)           // dist1 | dist2
                    393:        fcomps  pl_dist(%edx)
                    394:        xorl    %ecx,%ecx
                    395:        fnstsw  %ax
                    396:        fcomps  pl_dist(%edx)
                    397:        andb    $1,%ah
                    398:        xorb    $1,%ah
                    399:        addb    %ah,%cl
                    400: 
                    401:        fnstsw  %ax
                    402:        andb    $1,%ah
                    403:        addb    %ah,%ah
                    404:        addb    %ah,%cl
                    405: 
                    406: //     return sides;
                    407: 
                    408:        popl    %ebx
                    409:        movl    %ecx,%eax       // return status
                    410: 
                    411:        ret
                    412: 
                    413: 
                    414: Lerror:
                    415:        call    C(BOPS_Error)
                    416: 
                    417: #endif // id386

unix.superglobalmegacorp.com

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