|
|
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: ! 20: #define EMINS 4+4 ! 21: #define EMAXS 4+8 ! 22: #define P 4+12 ! 23: ! 24: .align 2 ! 25: .globl C(BoxOnPlaneSide) ! 26: C(BoxOnPlaneSide): ! 27: pushl %ebx ! 28: ! 29: movl P(%esp),%edx ! 30: movl EMINS(%esp),%ecx ! 31: xorl %eax,%eax ! 32: movl EMAXS(%esp),%ebx ! 33: movb pl_signbits(%edx),%al ! 34: cmpl $8,%al ! 35: jge Lerror ! 36: flds pl_normal(%edx) // p->normal[0] ! 37: fld %st(0) // p->normal[0] | p->normal[0] ! 38: jmp *Ljmptab(,%eax,4) ! 39: ! 40: ! 41: //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; ! 42: //dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; ! 43: Lcase0: ! 44: fmuls (%ebx) // p->normal[0]*emaxs[0] | p->normal[0] ! 45: flds pl_normal+4(%edx) // p->normal[1] | p->normal[0]*emaxs[0] | ! 46: // p->normal[0] ! 47: fxch %st(2) // p->normal[0] | p->normal[0]*emaxs[0] | ! 48: // p->normal[1] ! 49: fmuls (%ecx) // p->normal[0]*emins[0] | ! 50: // p->normal[0]*emaxs[0] | p->normal[1] ! 51: fxch %st(2) // p->normal[1] | p->normal[0]*emaxs[0] | ! 52: // p->normal[0]*emins[0] ! 53: fld %st(0) // p->normal[1] | p->normal[1] | ! 54: // p->normal[0]*emaxs[0] | ! 55: // p->normal[0]*emins[0] ! 56: fmuls 4(%ebx) // p->normal[1]*emaxs[1] | p->normal[1] | ! 57: // p->normal[0]*emaxs[0] | ! 58: // p->normal[0]*emins[0] ! 59: flds pl_normal+8(%edx) // p->normal[2] | p->normal[1]*emaxs[1] | ! 60: // p->normal[1] | p->normal[0]*emaxs[0] | ! 61: // p->normal[0]*emins[0] ! 62: fxch %st(2) // p->normal[1] | p->normal[1]*emaxs[1] | ! 63: // p->normal[2] | p->normal[0]*emaxs[0] | ! 64: // p->normal[0]*emins[0] ! 65: fmuls 4(%ecx) // p->normal[1]*emins[1] | ! 66: // p->normal[1]*emaxs[1] | ! 67: // p->normal[2] | p->normal[0]*emaxs[0] | ! 68: // p->normal[0]*emins[0] ! 69: fxch %st(2) // p->normal[2] | p->normal[1]*emaxs[1] | ! 70: // p->normal[1]*emins[1] | ! 71: // p->normal[0]*emaxs[0] | ! 72: // p->normal[0]*emins[0] ! 73: fld %st(0) // p->normal[2] | p->normal[2] | ! 74: // p->normal[1]*emaxs[1] | ! 75: // p->normal[1]*emins[1] | ! 76: // p->normal[0]*emaxs[0] | ! 77: // p->normal[0]*emins[0] ! 78: fmuls 8(%ebx) // p->normal[2]*emaxs[2] | ! 79: // p->normal[2] | ! 80: // p->normal[1]*emaxs[1] | ! 81: // p->normal[1]*emins[1] | ! 82: // p->normal[0]*emaxs[0] | ! 83: // p->normal[0]*emins[0] ! 84: fxch %st(5) // p->normal[0]*emins[0] | ! 85: // p->normal[2] | ! 86: // p->normal[1]*emaxs[1] | ! 87: // p->normal[1]*emins[1] | ! 88: // p->normal[0]*emaxs[0] | ! 89: // p->normal[2]*emaxs[2] ! 90: faddp %st(0),%st(3) //p->normal[2] | ! 91: // p->normal[1]*emaxs[1] | ! 92: // p->normal[1]*emins[1]+p->normal[0]*emins[0]| ! 93: // p->normal[0]*emaxs[0] | ! 94: // p->normal[2]*emaxs[2] ! 95: fmuls 8(%ecx) //p->normal[2]*emins[2] | ! 96: // p->normal[1]*emaxs[1] | ! 97: // p->normal[1]*emins[1]+p->normal[0]*emins[0]| ! 98: // p->normal[0]*emaxs[0] | ! 99: // p->normal[2]*emaxs[2] ! 100: fxch %st(1) //p->normal[1]*emaxs[1] | ! 101: // p->normal[2]*emins[2] | ! 102: // p->normal[1]*emins[1]+p->normal[0]*emins[0]| ! 103: // p->normal[0]*emaxs[0] | ! 104: // p->normal[2]*emaxs[2] ! 105: faddp %st(0),%st(3) //p->normal[2]*emins[2] | ! 106: // p->normal[1]*emins[1]+p->normal[0]*emins[0]| ! 107: // p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]| ! 108: // p->normal[2]*emaxs[2] ! 109: fxch %st(3) //p->normal[2]*emaxs[2] + ! 110: // p->normal[1]*emins[1]+p->normal[0]*emins[0]| ! 111: // p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]| ! 112: // p->normal[2]*emins[2] ! 113: faddp %st(0),%st(2) //p->normal[1]*emins[1]+p->normal[0]*emins[0]| ! 114: // dist1 | p->normal[2]*emins[2] ! 115: ! 116: jmp LSetSides ! 117: ! 118: //dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; ! 119: //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; ! 120: Lcase1: ! 121: fmuls (%ecx) // emins[0] ! 122: flds pl_normal+4(%edx) ! 123: fxch %st(2) ! 124: fmuls (%ebx) // emaxs[0] ! 125: fxch %st(2) ! 126: fld %st(0) ! 127: fmuls 4(%ebx) // emaxs[1] ! 128: flds pl_normal+8(%edx) ! 129: fxch %st(2) ! 130: fmuls 4(%ecx) // emins[1] ! 131: fxch %st(2) ! 132: fld %st(0) ! 133: fmuls 8(%ebx) // emaxs[2] ! 134: fxch %st(5) ! 135: faddp %st(0),%st(3) ! 136: fmuls 8(%ecx) // emins[2] ! 137: fxch %st(1) ! 138: faddp %st(0),%st(3) ! 139: fxch %st(3) ! 140: faddp %st(0),%st(2) ! 141: ! 142: jmp LSetSides ! 143: ! 144: //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; ! 145: //dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; ! 146: Lcase2: ! 147: fmuls (%ebx) // emaxs[0] ! 148: flds pl_normal+4(%edx) ! 149: fxch %st(2) ! 150: fmuls (%ecx) // emins[0] ! 151: fxch %st(2) ! 152: fld %st(0) ! 153: fmuls 4(%ecx) // emins[1] ! 154: flds pl_normal+8(%edx) ! 155: fxch %st(2) ! 156: fmuls 4(%ebx) // emaxs[1] ! 157: fxch %st(2) ! 158: fld %st(0) ! 159: fmuls 8(%ebx) // emaxs[2] ! 160: fxch %st(5) ! 161: faddp %st(0),%st(3) ! 162: fmuls 8(%ecx) // emins[2] ! 163: fxch %st(1) ! 164: faddp %st(0),%st(3) ! 165: fxch %st(3) ! 166: faddp %st(0),%st(2) ! 167: ! 168: jmp LSetSides ! 169: ! 170: //dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; ! 171: //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; ! 172: Lcase3: ! 173: fmuls (%ecx) // emins[0] ! 174: flds pl_normal+4(%edx) ! 175: fxch %st(2) ! 176: fmuls (%ebx) // emaxs[0] ! 177: fxch %st(2) ! 178: fld %st(0) ! 179: fmuls 4(%ecx) // emins[1] ! 180: flds pl_normal+8(%edx) ! 181: fxch %st(2) ! 182: fmuls 4(%ebx) // emaxs[1] ! 183: fxch %st(2) ! 184: fld %st(0) ! 185: fmuls 8(%ebx) // emaxs[2] ! 186: fxch %st(5) ! 187: faddp %st(0),%st(3) ! 188: fmuls 8(%ecx) // emins[2] ! 189: fxch %st(1) ! 190: faddp %st(0),%st(3) ! 191: fxch %st(3) ! 192: faddp %st(0),%st(2) ! 193: ! 194: jmp LSetSides ! 195: ! 196: //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; ! 197: //dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; ! 198: Lcase4: ! 199: fmuls (%ebx) // emaxs[0] ! 200: flds pl_normal+4(%edx) ! 201: fxch %st(2) ! 202: fmuls (%ecx) // emins[0] ! 203: fxch %st(2) ! 204: fld %st(0) ! 205: fmuls 4(%ebx) // emaxs[1] ! 206: flds pl_normal+8(%edx) ! 207: fxch %st(2) ! 208: fmuls 4(%ecx) // emins[1] ! 209: fxch %st(2) ! 210: fld %st(0) ! 211: fmuls 8(%ecx) // emins[2] ! 212: fxch %st(5) ! 213: faddp %st(0),%st(3) ! 214: fmuls 8(%ebx) // emaxs[2] ! 215: fxch %st(1) ! 216: faddp %st(0),%st(3) ! 217: fxch %st(3) ! 218: faddp %st(0),%st(2) ! 219: ! 220: jmp LSetSides ! 221: ! 222: //dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; ! 223: //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; ! 224: Lcase5: ! 225: fmuls (%ecx) // emins[0] ! 226: flds pl_normal+4(%edx) ! 227: fxch %st(2) ! 228: fmuls (%ebx) // emaxs[0] ! 229: fxch %st(2) ! 230: fld %st(0) ! 231: fmuls 4(%ebx) // emaxs[1] ! 232: flds pl_normal+8(%edx) ! 233: fxch %st(2) ! 234: fmuls 4(%ecx) // emins[1] ! 235: fxch %st(2) ! 236: fld %st(0) ! 237: fmuls 8(%ecx) // emins[2] ! 238: fxch %st(5) ! 239: faddp %st(0),%st(3) ! 240: fmuls 8(%ebx) // emaxs[2] ! 241: fxch %st(1) ! 242: faddp %st(0),%st(3) ! 243: fxch %st(3) ! 244: faddp %st(0),%st(2) ! 245: ! 246: jmp LSetSides ! 247: ! 248: //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; ! 249: //dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; ! 250: Lcase6: ! 251: fmuls (%ebx) // emaxs[0] ! 252: flds pl_normal+4(%edx) ! 253: fxch %st(2) ! 254: fmuls (%ecx) // emins[0] ! 255: fxch %st(2) ! 256: fld %st(0) ! 257: fmuls 4(%ecx) // emins[1] ! 258: flds pl_normal+8(%edx) ! 259: fxch %st(2) ! 260: fmuls 4(%ebx) // emaxs[1] ! 261: fxch %st(2) ! 262: fld %st(0) ! 263: fmuls 8(%ecx) // emins[2] ! 264: fxch %st(5) ! 265: faddp %st(0),%st(3) ! 266: fmuls 8(%ebx) // emaxs[2] ! 267: fxch %st(1) ! 268: faddp %st(0),%st(3) ! 269: fxch %st(3) ! 270: faddp %st(0),%st(2) ! 271: ! 272: jmp LSetSides ! 273: ! 274: //dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; ! 275: //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; ! 276: Lcase7: ! 277: fmuls (%ecx) // emins[0] ! 278: flds pl_normal+4(%edx) ! 279: fxch %st(2) ! 280: fmuls (%ebx) // emaxs[0] ! 281: fxch %st(2) ! 282: fld %st(0) ! 283: fmuls 4(%ecx) // emins[1] ! 284: flds pl_normal+8(%edx) ! 285: fxch %st(2) ! 286: fmuls 4(%ebx) // emaxs[1] ! 287: fxch %st(2) ! 288: fld %st(0) ! 289: fmuls 8(%ecx) // emins[2] ! 290: fxch %st(5) ! 291: faddp %st(0),%st(3) ! 292: fmuls 8(%ebx) // emaxs[2] ! 293: fxch %st(1) ! 294: faddp %st(0),%st(3) ! 295: fxch %st(3) ! 296: faddp %st(0),%st(2) ! 297: ! 298: LSetSides: ! 299: ! 300: // sides = 0; ! 301: // if (dist1 >= p->dist) ! 302: // sides = 1; ! 303: // if (dist2 < p->dist) ! 304: // sides |= 2; ! 305: ! 306: faddp %st(0),%st(2) // dist1 | dist2 ! 307: fcomps pl_dist(%edx) ! 308: xorl %ecx,%ecx ! 309: fnstsw %ax ! 310: fcomps pl_dist(%edx) ! 311: andb $1,%ah ! 312: xorb $1,%ah ! 313: addb %ah,%cl ! 314: ! 315: fnstsw %ax ! 316: andb $1,%ah ! 317: addb %ah,%ah ! 318: addb %ah,%cl ! 319: ! 320: // return sides; ! 321: ! 322: popl %ebx ! 323: movl %ecx,%eax // return status ! 324: ! 325: ret ! 326: ! 327: ! 328: Lerror: ! 329: call C(BOPS_Error) ! 330: ! 331: #endif // id386
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.