Annotation of quake1/worlda.s, revision 1.1

1.1     ! root        1: //
        !             2: // worlda.s
        !             3: // x86 assembly-language server testing stuff
        !             4: //
        !             5: 
        !             6: #include "asm_i386.h"
        !             7: #include "quakeasm.h"
        !             8: #include "d_ifacea.h"
        !             9: 
        !            10: #if id386
        !            11: 
        !            12:        .data
        !            13: 
        !            14: Ltemp: .long   0
        !            15: 
        !            16:        .text
        !            17: 
        !            18: //----------------------------------------------------------------------
        !            19: // hull-point test
        !            20: //----------------------------------------------------------------------
        !            21: 
        !            22: #define hull   4+8                             // because only partially pushed
        !            23: #define        num             8+4                             // because only partially pushed
        !            24: #define p              12+12                   // because only partially pushed
        !            25: 
        !            26:        .align 4
        !            27: .globl C(SV_HullPointContents)
        !            28: C(SV_HullPointContents):
        !            29:        pushl   %edi                            // preserve register variables
        !            30:        movl    num(%esp),%eax
        !            31:        testl   %eax,%eax
        !            32:        js              Lhquickout
        !            33: 
        !            34: //     float           d;
        !            35: //     dclipnode_t     *node;
        !            36: //     mplane_t        *plane;
        !            37: 
        !            38:        pushl   %ebx
        !            39:        movl    hull(%esp),%ebx
        !            40: 
        !            41:        pushl   %ebp
        !            42:        movl    p(%esp),%edx
        !            43: 
        !            44:        movl    hu_clipnodes(%ebx),%edi
        !            45:        movl    hu_planes(%ebx),%ebp
        !            46: 
        !            47:        subl    %ebx,%ebx
        !            48:        pushl   %esi
        !            49: 
        !            50: // %ebx: 0
        !            51: // %eax: num
        !            52: // %edx: p
        !            53: // %edi: hull->clipnodes
        !            54: // %ebp: hull->planes
        !            55: 
        !            56: //     while (num >= 0)
        !            57: //     {
        !            58: 
        !            59: Lhloop:
        !            60: 
        !            61: //             node = hull->clipnodes + num;
        !            62: //             plane = hull->planes + node->planenum;
        !            63: // !!! if the size of dclipnode_t changes, the scaling of %eax needs to be
        !            64: //     changed !!!
        !            65:        movl    nd_planenum(%edi,%eax,8),%ecx
        !            66:        movl    nd_children(%edi,%eax,8),%eax
        !            67:        movl    %eax,%esi
        !            68:        rorl    $16,%eax
        !            69:        leal    (%ecx,%ecx,4),%ecx
        !            70: 
        !            71: //             if (plane->type < 3)
        !            72: //                     d = p[plane->type] - plane->dist;
        !            73:        movb    pl_type(%ebp,%ecx,4),%bl
        !            74:        cmpb    $3,%bl
        !            75:        jb              Lnodot
        !            76: 
        !            77: //             else
        !            78: //                     d = DotProduct (plane->normal, p) - plane->dist;
        !            79:        flds    pl_normal(%ebp,%ecx,4)
        !            80:        fmuls   0(%edx)
        !            81:        flds    pl_normal+4(%ebp,%ecx,4)
        !            82:        fmuls   4(%edx)
        !            83:        flds    pl_normal+8(%ebp,%ecx,4)
        !            84:        fmuls   8(%edx)
        !            85:        fxch    %st(1)
        !            86:        faddp   %st(0),%st(2)
        !            87:        faddp   %st(0),%st(1)
        !            88:        fsubs   pl_dist(%ebp,%ecx,4)
        !            89:        jmp             Lsub
        !            90: 
        !            91: Lnodot:
        !            92:        flds    pl_dist(%ebp,%ecx,4)
        !            93:        fsubrs  (%edx,%ebx,4)
        !            94: 
        !            95: Lsub:
        !            96:        sarl    $16,%eax
        !            97:        sarl    $16,%esi
        !            98: 
        !            99: //             if (d < 0)
        !           100: //                     num = node->children[1];
        !           101: //             else
        !           102: //                     num = node->children[0];
        !           103:        fstps   Ltemp
        !           104:        movl    Ltemp,%ecx
        !           105:        sarl    $31,%ecx
        !           106:        andl    %ecx,%esi
        !           107:        xorl    $0xFFFFFFFF,%ecx
        !           108:        andl    %ecx,%eax
        !           109:        orl             %esi,%eax
        !           110:        jns             Lhloop
        !           111: 
        !           112: //     return num;
        !           113: Lhdone:
        !           114:        popl    %esi
        !           115:        popl    %ebp
        !           116:        popl    %ebx                            // restore register variables
        !           117: 
        !           118: Lhquickout:
        !           119:        popl    %edi
        !           120: 
        !           121:        ret
        !           122: 
        !           123: #endif // id386
        !           124: 

unix.superglobalmegacorp.com

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