Annotation of quake1/math.s, revision 1.1

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

unix.superglobalmegacorp.com

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