|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.