Annotation of quakeworld/client/math.s, revision 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.