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