|
|
1.1 ! root 1: // ! 2: // d_polysa.s ! 3: // x86 assembly-language polygon model drawing code ! 4: // ! 5: ! 6: #include "qasm.h" ! 7: #include "d_ifacea.h" ! 8: ! 9: #if id386 ! 10: ! 11: // !!! if this is changed, it must be changed in d_polyse.c too !!! ! 12: #define DPS_MAXSPANS MAXHEIGHT+1 ! 13: // 1 extra for spanpackage that marks end ! 14: ! 15: //#define SPAN_SIZE (((DPS_MAXSPANS + 1 + ((CACHE_SIZE - 1) / spanpackage_t_size)) + 1) * spanpackage_t_size) ! 16: #define SPAN_SIZE (1024+1+1+1)*32 ! 17: ! 18: ! 19: ! 20: .data ! 21: ! 22: .align 4 ! 23: p10_minus_p20: .single 0 ! 24: p01_minus_p21: .single 0 ! 25: temp0: .single 0 ! 26: temp1: .single 0 ! 27: Ltemp: .single 0 ! 28: ! 29: aff8entryvec_table: .long LDraw8, LDraw7, LDraw6, LDraw5 ! 30: .long LDraw4, LDraw3, LDraw2, LDraw1 ! 31: ! 32: lzistepx: .long 0 ! 33: ! 34: ! 35: .text ! 36: ! 37: #ifndef NeXT ! 38: .extern C(D_PolysetSetEdgeTable) ! 39: .extern C(D_RasterizeAliasPolySmooth) ! 40: #endif ! 41: ! 42: //---------------------------------------------------------------------- ! 43: // affine triangle gradient calculation code ! 44: //---------------------------------------------------------------------- ! 45: ! 46: #if 0 ! 47: #define skinwidth 4+0 ! 48: ! 49: .globl C(R_PolysetCalcGradients) ! 50: C(R_PolysetCalcGradients): ! 51: ! 52: // p00_minus_p20 = r_p0[0] - r_p2[0]; ! 53: // p01_minus_p21 = r_p0[1] - r_p2[1]; ! 54: // p10_minus_p20 = r_p1[0] - r_p2[0]; ! 55: // p11_minus_p21 = r_p1[1] - r_p2[1]; ! 56: // ! 57: // xstepdenominv = 1.0 / (p10_minus_p20 * p01_minus_p21 - ! 58: // p00_minus_p20 * p11_minus_p21); ! 59: // ! 60: // ystepdenominv = -xstepdenominv; ! 61: ! 62: fildl C(r_p0)+0 // r_p0[0] ! 63: fildl C(r_p2)+0 // r_p2[0] | r_p0[0] ! 64: fildl C(r_p0)+4 // r_p0[1] | r_p2[0] | r_p0[0] ! 65: fildl C(r_p2)+4 // r_p2[1] | r_p0[1] | r_p2[0] | r_p0[0] ! 66: fildl C(r_p1)+0 // r_p1[0] | r_p2[1] | r_p0[1] | r_p2[0] | r_p0[0] ! 67: fildl C(r_p1)+4 // r_p1[1] | r_p1[0] | r_p2[1] | r_p0[1] | ! 68: // r_p2[0] | r_p0[0] ! 69: fxch %st(3) // r_p0[1] | r_p1[0] | r_p2[1] | r_p1[1] | ! 70: // r_p2[0] | r_p0[0] ! 71: fsub %st(2),%st(0) // p01_minus_p21 | r_p1[0] | r_p2[1] | r_p1[1] | ! 72: // r_p2[0] | r_p0[0] ! 73: fxch %st(1) // r_p1[0] | p01_minus_p21 | r_p2[1] | r_p1[1] | ! 74: // r_p2[0] | r_p0[0] ! 75: fsub %st(4),%st(0) // p10_minus_p20 | p01_minus_p21 | r_p2[1] | ! 76: // r_p1[1] | r_p2[0] | r_p0[0] ! 77: fxch %st(5) // r_p0[0] | p01_minus_p21 | r_p2[1] | ! 78: // r_p1[1] | r_p2[0] | p10_minus_p20 ! 79: fsubp %st(0),%st(4) // p01_minus_p21 | r_p2[1] | r_p1[1] | ! 80: // p00_minus_p20 | p10_minus_p20 ! 81: fxch %st(2) // r_p1[1] | r_p2[1] | p01_minus_p21 | ! 82: // p00_minus_p20 | p10_minus_p20 ! 83: fsubp %st(0),%st(1) // p11_minus_p21 | p01_minus_p21 | ! 84: // p00_minus_p20 | p10_minus_p20 ! 85: fxch %st(1) // p01_minus_p21 | p11_minus_p21 | ! 86: // p00_minus_p20 | p10_minus_p20 ! 87: flds C(d_xdenom) // d_xdenom | p01_minus_p21 | p11_minus_p21 | ! 88: // p00_minus_p20 | p10_minus_p20 ! 89: fxch %st(4) // p10_minus_p20 | p01_minus_p21 | p11_minus_p21 | ! 90: // p00_minus_p20 | d_xdenom ! 91: fstps p10_minus_p20 // p01_minus_p21 | p11_minus_p21 | ! 92: // p00_minus_p20 | d_xdenom ! 93: fstps p01_minus_p21 // p11_minus_p21 | p00_minus_p20 | xstepdenominv ! 94: fxch %st(2) // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 95: ! 96: //// ceil () for light so positive steps are exaggerated, negative steps ! 97: //// diminished, pushing us away from underflow toward overflow. Underflow is ! 98: //// very visible, overflow is very unlikely, because of ambient lighting ! 99: // t0 = r_p0[4] - r_p2[4]; ! 100: // t1 = r_p1[4] - r_p2[4]; ! 101: ! 102: fildl C(r_p2)+16 // r_p2[4] | xstepdenominv | p00_minus_p20 | ! 103: // p11_minus_p21 ! 104: fildl C(r_p0)+16 // r_p0[4] | r_p2[4] | xstepdenominv | ! 105: // p00_minus_p20 | p11_minus_p21 ! 106: fildl C(r_p1)+16 // r_p1[4] | r_p0[4] | r_p2[4] | xstepdenominv | ! 107: // p00_minus_p20 | p11_minus_p21 ! 108: fxch %st(2) // r_p2[4] | r_p0[4] | r_p1[4] | xstepdenominv | ! 109: // p00_minus_p20 | p11_minus_p21 ! 110: fld %st(0) // r_p2[4] | r_p2[4] | r_p0[4] | r_p1[4] | ! 111: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 112: fsubrp %st(0),%st(2) // r_p2[4] | t0 | r_p1[4] | xstepdenominv | ! 113: // p00_minus_p20 | p11_minus_p21 ! 114: fsubrp %st(0),%st(2) // t0 | t1 | xstepdenominv | p00_minus_p20 | ! 115: // p11_minus_p21 ! 116: ! 117: // r_lstepx = (int) ! 118: // ceil((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv); ! 119: // r_lstepy = (int) ! 120: // ceil((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv); ! 121: ! 122: fld %st(0) // t0 | t0 | t1 | xstepdenominv | p00_minus_p20 | ! 123: // p11_minus_p21 ! 124: fmul %st(5),%st(0) // t0*p11_minus_p21 | t0 | t1 | xstepdenominv | ! 125: // p00_minus_p20 | p11_minus_p21 ! 126: fxch %st(2) // t1 | t0 | t0*p11_minus_p21 | xstepdenominv | ! 127: // p00_minus_p20 | p11_minus_p21 ! 128: fld %st(0) // t1 | t1 | t0 | t0*p11_minus_p21 | ! 129: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 130: fmuls p01_minus_p21 // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 | ! 131: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 132: fxch %st(2) // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 | ! 133: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 134: fmuls p10_minus_p20 // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 | ! 135: // t0*p11_minus_p21 | xstepdenominv | ! 136: // p00_minus_p20 | p11_minus_p21 ! 137: fxch %st(1) // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 | ! 138: // t0*p11_minus_p21 | xstepdenominv | ! 139: // p00_minus_p20 | p11_minus_p21 ! 140: fmul %st(5),%st(0) // t1*p00_minus_p20 | t0*p10_minus_p20 | ! 141: // t1*p01_minus_p21 | t0*p11_minus_p21 | ! 142: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 143: fxch %st(2) // t1*p01_minus_p21 | t0*p10_minus_p20 | ! 144: // t1*p00_minus_p20 | t0*p11_minus_p21 | ! 145: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 146: fsubp %st(0),%st(3) // t0*p10_minus_p20 | t1*p00_minus_p20 | ! 147: // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 148: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 149: fsubrp %st(0),%st(1) // t1*p00_minus_p20 - t0*p10_minus_p20 | ! 150: // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 151: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 152: fld %st(2) // xstepdenominv | ! 153: // t1*p00_minus_p20 - t0*p10_minus_p20 | ! 154: // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 155: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 156: fmuls float_minus_1 // ystepdenominv | ! 157: // t1*p00_minus_p20 - t0*p10_minus_p20 | ! 158: // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 159: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 160: fxch %st(2) // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 161: // t1*p00_minus_p20 - t0*p10_minus_p20 | ! 162: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 163: // p11_minus_p21 ! 164: fmul %st(3),%st(0) // (t1*p01_minus_p21 - t0*p11_minus_p21)* ! 165: // xstepdenominv | ! 166: // t1*p00_minus_p20 - t0*p10_minus_p20 | ! 167: // | ystepdenominv | xstepdenominv | ! 168: // p00_minus_p20 | p11_minus_p21 ! 169: fxch %st(1) // t1*p00_minus_p20 - t0*p10_minus_p20 | ! 170: // (t1*p01_minus_p21 - t0*p11_minus_p21)* ! 171: // xstepdenominv | ystepdenominv | ! 172: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 173: fmul %st(2),%st(0) // (t1*p00_minus_p20 - t0*p10_minus_p20)* ! 174: // ystepdenominv | ! 175: // (t1*p01_minus_p21 - t0*p11_minus_p21)* ! 176: // xstepdenominv | ystepdenominv | ! 177: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 178: fldcw ceil_cw ! 179: fistpl C(r_lstepy) // r_lstepx | ystepdenominv | xstepdenominv | ! 180: // p00_minus_p20 | p11_minus_p21 ! 181: fistpl C(r_lstepx) // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 182: // p11_minus_p21 ! 183: fldcw single_cw ! 184: ! 185: // t0 = r_p0[2] - r_p2[2]; ! 186: // t1 = r_p1[2] - r_p2[2]; ! 187: ! 188: fildl C(r_p2)+8 // r_p2[2] | ystepdenominv | xstepdenominv | ! 189: // p00_minus_p20 | p11_minus_p21 ! 190: fildl C(r_p0)+8 // r_p0[2] | r_p2[2] | ystepdenominv | ! 191: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 192: fildl C(r_p1)+8 // r_p1[2] | r_p0[2] | r_p2[2] | ystepdenominv | ! 193: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 194: fxch %st(2) // r_p2[2] | r_p0[2] | r_p1[2] | ystepdenominv | ! 195: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 196: fld %st(0) // r_p2[2] | r_p2[2] | r_p0[2] | r_p1[2] | ! 197: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 198: // p11_minus_p21 ! 199: fsubrp %st(0),%st(2) // r_p2[2] | t0 | r_p1[2] | ystepdenominv | ! 200: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 201: fsubrp %st(0),%st(2) // t0 | t1 | ystepdenominv | xstepdenominv | ! 202: // p00_minus_p20 | p11_minus_p21 ! 203: ! 204: // r_sstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) * ! 205: // xstepdenominv); ! 206: // r_sstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ! 207: // ystepdenominv); ! 208: ! 209: fld %st(0) // t0 | t0 | t1 | ystepdenominv | xstepdenominv ! 210: fmul %st(6),%st(0) // t0*p11_minus_p21 | t0 | t1 | ystepdenominv | ! 211: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 212: fxch %st(2) // t1 | t0 | t0*p11_minus_p21 | ystepdenominv | ! 213: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 214: fld %st(0) // t1 | t1 | t0 | t0*p11_minus_p21 | ! 215: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 216: // p11_minus_p21 ! 217: fmuls p01_minus_p21 // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 | ! 218: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 219: // p11_minus_p21 ! 220: fxch %st(2) // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 | ! 221: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 222: // p11_minus_p21 ! 223: fmuls p10_minus_p20 // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 | ! 224: // t0*p11_minus_p21 | ystepdenominv | ! 225: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 226: fxch %st(1) // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 | ! 227: // t0*p11_minus_p21 | ystepdenominv | ! 228: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 229: fmul %st(6),%st(0) // t1*p00_minus_p20 | t0*p10_minus_p20 | ! 230: // t1*p01_minus_p21 | t0*p11_minus_p21 | ! 231: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 232: // p11_minus_p21 ! 233: fxch %st(2) // t1*p01_minus_p21 | t0*p10_minus_p20 | ! 234: // t1*p00_minus_p20 | t0*p11_minus_p21 | ! 235: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 236: // p11_minus_p21 ! 237: fsubp %st(0),%st(3) // t0*p10_minus_p20 | t1*p00_minus_p20 | ! 238: // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 239: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 240: // p11_minus_p21 ! 241: fsubrp %st(0),%st(1) // t1*p00_minus_p20 - t0*p10_minus_p20 | ! 242: // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 243: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 244: // p11_minus_p21 ! 245: fmul %st(2),%st(0) // (t1*p00_minus_p20 - t0*p10_minus_p20)* ! 246: // ystepdenominv | ! 247: // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 248: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 249: // p11_minus_p21 ! 250: fxch %st(1) // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 251: // (t1*p00_minus_p20 - t0*p10_minus_p20)* ! 252: // ystepdenominv | ystepdenominv | ! 253: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 254: fmul %st(3),%st(0) // (t1*p01_minus_p21 - t0*p11_minus_p21)* ! 255: // xstepdenominv | ! 256: // (t1*p00_minus_p20 - t0*p10_minus_p20)* ! 257: // ystepdenominv | ystepdenominv | ! 258: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 259: fxch %st(1) // (t1*p00_minus_p20 - t0*p10_minus_p20)* ! 260: // ystepdenominv | ! 261: // (t1*p01_minus_p21 - t0*p11_minus_p21)* ! 262: // xstepdenominv | ystepdenominv | ! 263: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 264: fistpl C(r_sstepy) // r_sstepx | ystepdenominv | xstepdenominv | ! 265: // p00_minus_p20 | p11_minus_p21 ! 266: fistpl C(r_sstepx) // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 267: // p11_minus_p21 ! 268: ! 269: // t0 = r_p0[3] - r_p2[3]; ! 270: // t1 = r_p1[3] - r_p2[3]; ! 271: ! 272: fildl C(r_p2)+12 // r_p2[3] | ystepdenominv | xstepdenominv | ! 273: // p00_minus_p20 | p11_minus_p21 ! 274: fildl C(r_p0)+12 // r_p0[3] | r_p2[3] | ystepdenominv | ! 275: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 276: fildl C(r_p1)+12 // r_p1[3] | r_p0[3] | r_p2[3] | ystepdenominv | ! 277: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 278: fxch %st(2) // r_p2[3] | r_p0[3] | r_p1[3] | ystepdenominv | ! 279: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 280: fld %st(0) // r_p2[3] | r_p2[3] | r_p0[3] | r_p1[3] | ! 281: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 282: // p11_minus_p21 ! 283: fsubrp %st(0),%st(2) // r_p2[3] | t0 | r_p1[3] | ystepdenominv | ! 284: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 285: fsubrp %st(0),%st(2) // t0 | t1 | ystepdenominv | xstepdenominv | ! 286: // p00_minus_p20 | p11_minus_p21 ! 287: ! 288: // r_tstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) * ! 289: // xstepdenominv); ! 290: // r_tstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ! 291: // ystepdenominv); ! 292: ! 293: fld %st(0) // t0 | t0 | t1 | ystepdenominv | xstepdenominv | ! 294: // p00_minus_p20 | p11_minus_p21 ! 295: fmul %st(6),%st(0) // t0*p11_minus_p21 | t0 | t1 | ystepdenominv | ! 296: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 297: fxch %st(2) // t1 | t0 | t0*p11_minus_p21 | ystepdenominv | ! 298: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 299: fld %st(0) // t1 | t1 | t0 | t0*p11_minus_p21 | ! 300: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 301: // p11_minus_p21 ! 302: fmuls p01_minus_p21 // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 | ! 303: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 304: // p11_minus_p21 ! 305: fxch %st(2) // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 | ! 306: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 307: // p11_minus_p21 ! 308: fmuls p10_minus_p20 // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 | ! 309: // t0*p11_minus_p21 | ystepdenominv | ! 310: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 311: fxch %st(1) // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 | ! 312: // t0*p11_minus_p21 | ystepdenominv | ! 313: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 314: fmul %st(6),%st(0) // t1*p00_minus_p20 | t0*p10_minus_p20 | ! 315: // t1*p01_minus_p21 | t0*p11_minus_p21 | ! 316: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 317: // p11_minus_p21 ! 318: fxch %st(2) // t1*p01_minus_p21 | t0*p10_minus_p20 | ! 319: // t1*p00_minus_p20 | t0*p11_minus_p21 | ! 320: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 321: // p11_minus_p21 ! 322: fsubp %st(0),%st(3) // t0*p10_minus_p20 | t1*p00_minus_p20 | ! 323: // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 324: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 325: // p11_minus_p21 ! 326: fsubrp %st(0),%st(1) // t1*p00_minus_p20 - t0*p10_minus_p20 | ! 327: // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 328: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 329: // p11_minus_p21 ! 330: fmul %st(2),%st(0) // (t1*p00_minus_p20 - t0*p10_minus_p20)* ! 331: // ystepdenominv | ! 332: // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 333: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 334: // p11_minus_p21 ! 335: fxch %st(1) // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 336: // (t1*p00_minus_p20 - t0*p10_minus_p20)* ! 337: // ystepdenominv | ystepdenominv | ! 338: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 339: fmul %st(3),%st(0) // (t1*p01_minus_p21 - t0*p11_minus_p21)* ! 340: // xstepdenominv | ! 341: // (t1*p00_minus_p20 - t0*p10_minus_p20)* ! 342: // ystepdenominv | ystepdenominv | ! 343: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 344: fxch %st(1) // (t1*p00_minus_p20 - t0*p10_minus_p20)* ! 345: // ystepdenominv | ! 346: // (t1*p01_minus_p21 - t0*p11_minus_p21)* ! 347: // xstepdenominv | ystepdenominv | ! 348: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 349: fistpl C(r_tstepy) // r_tstepx | ystepdenominv | xstepdenominv | ! 350: // p00_minus_p20 | p11_minus_p21 ! 351: fistpl C(r_tstepx) // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 352: // p11_minus_p21 ! 353: ! 354: // t0 = r_p0[5] - r_p2[5]; ! 355: // t1 = r_p1[5] - r_p2[5]; ! 356: ! 357: fildl C(r_p2)+20 // r_p2[5] | ystepdenominv | xstepdenominv | ! 358: // p00_minus_p20 | p11_minus_p21 ! 359: fildl C(r_p0)+20 // r_p0[5] | r_p2[5] | ystepdenominv | ! 360: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 361: fildl C(r_p1)+20 // r_p1[5] | r_p0[5] | r_p2[5] | ystepdenominv | ! 362: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 363: fxch %st(2) // r_p2[5] | r_p0[5] | r_p1[5] | ystepdenominv | ! 364: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 365: fld %st(0) // r_p2[5] | r_p2[5] | r_p0[5] | r_p1[5] | ! 366: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 367: // p11_minus_p21 ! 368: fsubrp %st(0),%st(2) // r_p2[5] | t0 | r_p1[5] | ystepdenominv | ! 369: // xstepdenominv | p00_minus_p20 | p11_minus_p21 ! 370: fsubrp %st(0),%st(2) // t0 | t1 | ystepdenominv | xstepdenominv | ! 371: // p00_minus_p20 | p11_minus_p21 ! 372: ! 373: // r_zistepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) * ! 374: // xstepdenominv); ! 375: // r_zistepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ! 376: // ystepdenominv); ! 377: ! 378: fld %st(0) // t0 | t0 | t1 | ystepdenominv | xstepdenominv | ! 379: // p00_minus_p20 | p11_minus_p21 ! 380: fmulp %st(0),%st(6) // t0 | t1 | ystepdenominv | xstepdenominv | ! 381: // p00_minus_p20 | t0*p11_minus_p21 ! 382: fxch %st(1) // t1 | t0 | ystepdenominv | xstepdenominv | ! 383: // p00_minus_p20 | t0*p11_minus_p21 ! 384: fld %st(0) // t1 | t1 | t0 | ystepdenominv | xstepdenominv | ! 385: // p00_minus_p20 | t0*p11_minus_p21 ! 386: fmuls p01_minus_p21 // t1*p01_minus_p21 | t1 | t0 | ystepdenominv | ! 387: // xstepdenominv | p00_minus_p20 | ! 388: // t0*p11_minus_p21 ! 389: fxch %st(2) // t0 | t1 | t1*p01_minus_p21 | ystepdenominv | ! 390: // xstepdenominv | p00_minus_p20 | ! 391: // t0*p11_minus_p21 ! 392: fmuls p10_minus_p20 // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 | ! 393: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 394: // t0*p11_minus_p21 ! 395: fxch %st(1) // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 | ! 396: // ystepdenominv | xstepdenominv | p00_minus_p20 | ! 397: // t0*p11_minus_p21 ! 398: fmulp %st(0),%st(5) // t0*p10_minus_p20 | t1*p01_minus_p21 | ! 399: // ystepdenominv | xstepdenominv | ! 400: // t1*p00_minus_p20 | t0*p11_minus_p21 ! 401: fxch %st(5) // t0*p11_minus_p21 | t1*p01_minus_p21 | ! 402: // ystepdenominv | xstepdenominv | ! 403: // t1*p00_minus_p20 | t0*p10_minus_p20 ! 404: fsubrp %st(0),%st(1) // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 405: // ystepdenominv | xstepdenominv | ! 406: // t1*p00_minus_p20 | t0*p10_minus_p20 ! 407: fxch %st(3) // t1*p00_minus_p20 | ystepdenominv | ! 408: // xstepdenominv | ! 409: // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 410: // t0*p10_minus_p20 ! 411: fsubp %st(0),%st(4) // ystepdenominv | xstepdenominv | ! 412: // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 413: // t1*p00_minus_p20 - t0*p10_minus_p20 ! 414: fxch %st(1) // xstepdenominv | ystepdenominv | ! 415: // t1*p01_minus_p21 - t0*p11_minus_p21 | ! 416: // t1*p00_minus_p20 - t0*p10_minus_p20 ! 417: fmulp %st(0),%st(2) // ystepdenominv | ! 418: // (t1*p01_minus_p21 - t0*p11_minus_p21) * ! 419: // xstepdenominv | ! 420: // t1*p00_minus_p20 - t0*p10_minus_p20 ! 421: fmulp %st(0),%st(2) // (t1*p01_minus_p21 - t0*p11_minus_p21) * ! 422: // xstepdenominv | ! 423: // (t1*p00_minus_p20 - t0*p10_minus_p20) * ! 424: // ystepdenominv ! 425: fistpl C(r_zistepx) // (t1*p00_minus_p20 - t0*p10_minus_p20) * ! 426: // ystepdenominv ! 427: fistpl C(r_zistepy) ! 428: ! 429: // a_sstepxfrac = r_sstepx << 16; ! 430: // a_tstepxfrac = r_tstepx << 16; ! 431: // ! 432: // a_ststepxwhole = r_affinetridesc.skinwidth * (r_tstepx >> 16) + ! 433: // (r_sstepx >> 16); ! 434: ! 435: movl C(r_sstepx),%eax ! 436: movl C(r_tstepx),%edx ! 437: shll $16,%eax ! 438: shll $16,%edx ! 439: movl %eax,C(a_sstepxfrac) ! 440: movl %edx,C(a_tstepxfrac) ! 441: ! 442: movl C(r_sstepx),%ecx ! 443: movl C(r_tstepx),%eax ! 444: sarl $16,%ecx ! 445: sarl $16,%eax ! 446: imull skinwidth(%esp) ! 447: addl %ecx,%eax ! 448: movl %eax,C(a_ststepxwhole) ! 449: ! 450: ret ! 451: ! 452: #endif ! 453: ! 454: //---------------------------------------------------------------------- ! 455: // recursive subdivision affine triangle drawing code ! 456: // ! 457: // not C-callable because of stdcall return ! 458: //---------------------------------------------------------------------- ! 459: ! 460: #define lp1 4+16 ! 461: #define lp2 8+16 ! 462: #define lp3 12+16 ! 463: ! 464: .globl C(D_PolysetRecursiveTriangle) ! 465: C(D_PolysetRecursiveTriangle): ! 466: pushl %ebp // preserve caller stack frame pointer ! 467: pushl %esi // preserve register variables ! 468: pushl %edi ! 469: pushl %ebx ! 470: ! 471: // int *temp; ! 472: // int d; ! 473: // int new[6]; ! 474: // int i; ! 475: // int z; ! 476: // short *zbuf; ! 477: movl lp2(%esp),%esi ! 478: movl lp1(%esp),%ebx ! 479: movl lp3(%esp),%edi ! 480: ! 481: // d = lp2[0] - lp1[0]; ! 482: // if (d < -1 || d > 1) ! 483: // goto split; ! 484: movl 0(%esi),%eax ! 485: ! 486: movl 0(%ebx),%edx ! 487: movl 4(%esi),%ebp ! 488: ! 489: subl %edx,%eax ! 490: movl 4(%ebx),%ecx ! 491: ! 492: subl %ecx,%ebp ! 493: incl %eax ! 494: ! 495: cmpl $2,%eax ! 496: ja LSplit ! 497: ! 498: // d = lp2[1] - lp1[1]; ! 499: // if (d < -1 || d > 1) ! 500: // goto split; ! 501: movl 0(%edi),%eax ! 502: incl %ebp ! 503: ! 504: cmpl $2,%ebp ! 505: ja LSplit ! 506: ! 507: // d = lp3[0] - lp2[0]; ! 508: // if (d < -1 || d > 1) ! 509: // goto split2; ! 510: movl 0(%esi),%edx ! 511: movl 4(%edi),%ebp ! 512: ! 513: subl %edx,%eax ! 514: movl 4(%esi),%ecx ! 515: ! 516: subl %ecx,%ebp ! 517: incl %eax ! 518: ! 519: cmpl $2,%eax ! 520: ja LSplit2 ! 521: ! 522: // d = lp3[1] - lp2[1]; ! 523: // if (d < -1 || d > 1) ! 524: // goto split2; ! 525: movl 0(%ebx),%eax ! 526: incl %ebp ! 527: ! 528: cmpl $2,%ebp ! 529: ja LSplit2 ! 530: ! 531: // d = lp1[0] - lp3[0]; ! 532: // if (d < -1 || d > 1) ! 533: // goto split3; ! 534: movl 0(%edi),%edx ! 535: movl 4(%ebx),%ebp ! 536: ! 537: subl %edx,%eax ! 538: movl 4(%edi),%ecx ! 539: ! 540: subl %ecx,%ebp ! 541: incl %eax ! 542: ! 543: incl %ebp ! 544: movl %ebx,%edx ! 545: ! 546: cmpl $2,%eax ! 547: ja LSplit3 ! 548: ! 549: // d = lp1[1] - lp3[1]; ! 550: // if (d < -1 || d > 1) ! 551: // { ! 552: //split3: ! 553: // temp = lp1; ! 554: // lp3 = lp2; ! 555: // lp1 = lp3; ! 556: // lp2 = temp; ! 557: // goto split; ! 558: // } ! 559: // ! 560: // return; // entire tri is filled ! 561: // ! 562: cmpl $2,%ebp ! 563: jna LDone ! 564: ! 565: LSplit3: ! 566: movl %edi,%ebx ! 567: movl %esi,%edi ! 568: movl %edx,%esi ! 569: jmp LSplit ! 570: ! 571: //split2: ! 572: LSplit2: ! 573: ! 574: // temp = lp1; ! 575: // lp1 = lp2; ! 576: // lp2 = lp3; ! 577: // lp3 = temp; ! 578: movl %ebx,%eax ! 579: movl %esi,%ebx ! 580: movl %edi,%esi ! 581: movl %eax,%edi ! 582: ! 583: //split: ! 584: LSplit: ! 585: ! 586: subl $24,%esp // allocate space for a new vertex ! 587: ! 588: //// split this edge ! 589: // new[0] = (lp1[0] + lp2[0]) >> 1; ! 590: // new[1] = (lp1[1] + lp2[1]) >> 1; ! 591: // new[2] = (lp1[2] + lp2[2]) >> 1; ! 592: // new[3] = (lp1[3] + lp2[3]) >> 1; ! 593: // new[5] = (lp1[5] + lp2[5]) >> 1; ! 594: movl 8(%ebx),%eax ! 595: ! 596: movl 8(%esi),%edx ! 597: movl 12(%ebx),%ecx ! 598: ! 599: addl %edx,%eax ! 600: movl 12(%esi),%edx ! 601: ! 602: sarl $1,%eax ! 603: addl %edx,%ecx ! 604: ! 605: movl %eax,8(%esp) ! 606: movl 20(%ebx),%eax ! 607: ! 608: sarl $1,%ecx ! 609: movl 20(%esi),%edx ! 610: ! 611: movl %ecx,12(%esp) ! 612: addl %edx,%eax ! 613: ! 614: movl 0(%ebx),%ecx ! 615: movl 0(%esi),%edx ! 616: ! 617: sarl $1,%eax ! 618: addl %ecx,%edx ! 619: ! 620: movl %eax,20(%esp) ! 621: movl 4(%ebx),%eax ! 622: ! 623: sarl $1,%edx ! 624: movl 4(%esi),%ebp ! 625: ! 626: movl %edx,0(%esp) ! 627: addl %eax,%ebp ! 628: ! 629: sarl $1,%ebp ! 630: movl %ebp,4(%esp) ! 631: ! 632: //// draw the point if splitting a leading edge ! 633: // if (lp2[1] > lp1[1]) ! 634: // goto nodraw; ! 635: cmpl %eax,4(%esi) ! 636: jg LNoDraw ! 637: ! 638: // if ((lp2[1] == lp1[1]) && (lp2[0] < lp1[0])) ! 639: // goto nodraw; ! 640: movl 0(%esi),%edx ! 641: jnz LDraw ! 642: ! 643: cmpl %ecx,%edx ! 644: jl LNoDraw ! 645: ! 646: LDraw: ! 647: ! 648: // z = new[5] >> 16; ! 649: movl 20(%esp),%edx ! 650: movl 4(%esp),%ecx ! 651: ! 652: sarl $16,%edx ! 653: movl 0(%esp),%ebp ! 654: ! 655: // zbuf = zspantable[new[1]] + new[0]; ! 656: movl C(zspantable)(,%ecx,4),%eax ! 657: ! 658: // if (z >= *zbuf) ! 659: // { ! 660: cmpw (%eax,%ebp,2),%dx ! 661: jnge LNoDraw ! 662: ! 663: // int pix; ! 664: // ! 665: // *zbuf = z; ! 666: movw %dx,(%eax,%ebp,2) ! 667: ! 668: // pix = d_pcolormap[skintable[new[3]>>16][new[2]>>16]]; ! 669: movl 12(%esp),%eax ! 670: ! 671: sarl $16,%eax ! 672: movl 8(%esp),%edx ! 673: ! 674: sarl $16,%edx ! 675: subl %ecx,%ecx ! 676: ! 677: movl C(skintable)(,%eax,4),%eax ! 678: movl 4(%esp),%ebp ! 679: ! 680: movb (%eax,%edx,),%cl ! 681: movl C(d_pcolormap),%edx ! 682: ! 683: movb (%edx,%ecx,),%dl ! 684: movl 0(%esp),%ecx ! 685: ! 686: // d_viewbuffer[d_scantable[new[1]] + new[0]] = pix; ! 687: movl C(d_scantable)(,%ebp,4),%eax ! 688: addl %eax,%ecx ! 689: movl C(d_viewbuffer),%eax ! 690: movb %dl,(%eax,%ecx,1) ! 691: ! 692: // } ! 693: // ! 694: //nodraw: ! 695: LNoDraw: ! 696: ! 697: //// recursively continue ! 698: // D_PolysetRecursiveTriangle (lp3, lp1, new); ! 699: pushl %esp ! 700: pushl %ebx ! 701: pushl %edi ! 702: call C(D_PolysetRecursiveTriangle) ! 703: ! 704: // D_PolysetRecursiveTriangle (lp3, new, lp2); ! 705: movl %esp,%ebx ! 706: pushl %esi ! 707: pushl %ebx ! 708: pushl %edi ! 709: call C(D_PolysetRecursiveTriangle) ! 710: addl $24,%esp ! 711: ! 712: LDone: ! 713: popl %ebx // restore register variables ! 714: popl %edi ! 715: popl %esi ! 716: popl %ebp // restore caller stack frame pointer ! 717: ret $12 ! 718: ! 719: ! 720: //---------------------------------------------------------------------- ! 721: // 8-bpp horizontal span drawing code for affine polygons, with smooth ! 722: // shading and no transparency ! 723: //---------------------------------------------------------------------- ! 724: ! 725: #define pspans 4+8 ! 726: ! 727: .globl C(D_PolysetAff8Start) ! 728: C(D_PolysetAff8Start): ! 729: ! 730: .globl C(R_PolysetDrawSpans8_Opaque) ! 731: C(R_PolysetDrawSpans8_Opaque): ! 732: pushl %esi // preserve register variables ! 733: pushl %ebx ! 734: ! 735: movl pspans(%esp),%esi // point to the first span descriptor ! 736: movl C(r_zistepx),%ecx ! 737: ! 738: pushl %ebp // preserve caller's stack frame ! 739: pushl %edi ! 740: ! 741: rorl $16,%ecx // put high 16 bits of 1/z step in low word ! 742: movl spanpackage_t_count(%esi),%edx ! 743: ! 744: movl %ecx,lzistepx ! 745: ! 746: LSpanLoop: ! 747: ! 748: // lcount = d_aspancount - pspanpackage->count; ! 749: // ! 750: // errorterm += erroradjustup; ! 751: // if (errorterm >= 0) ! 752: // { ! 753: // d_aspancount += d_countextrastep; ! 754: // errorterm -= erroradjustdown; ! 755: // } ! 756: // else ! 757: // { ! 758: // d_aspancount += ubasestep; ! 759: // } ! 760: movl C(d_aspancount),%eax ! 761: subl %edx,%eax ! 762: ! 763: movl C(erroradjustup),%edx ! 764: movl C(errorterm),%ebx ! 765: addl %edx,%ebx ! 766: js LNoTurnover ! 767: ! 768: movl C(erroradjustdown),%edx ! 769: movl C(d_countextrastep),%edi ! 770: subl %edx,%ebx ! 771: movl C(d_aspancount),%ebp ! 772: movl %ebx,C(errorterm) ! 773: addl %edi,%ebp ! 774: movl %ebp,C(d_aspancount) ! 775: jmp LRightEdgeStepped ! 776: ! 777: LNoTurnover: ! 778: movl C(d_aspancount),%edi ! 779: movl C(ubasestep),%edx ! 780: movl %ebx,C(errorterm) ! 781: addl %edx,%edi ! 782: movl %edi,C(d_aspancount) ! 783: ! 784: LRightEdgeStepped: ! 785: cmpl $1,%eax ! 786: ! 787: jl LNextSpan ! 788: jz LExactlyOneLong ! 789: ! 790: // ! 791: // set up advancetable ! 792: // ! 793: movl C(a_ststepxwhole),%ecx ! 794: movl C(r_affinetridesc)+atd_skinwidth,%edx ! 795: ! 796: movl %ecx,advancetable+4 // advance base in t ! 797: addl %edx,%ecx ! 798: ! 799: movl %ecx,advancetable // advance extra in t ! 800: movl C(a_tstepxfrac),%ecx ! 801: ! 802: movw C(r_lstepx),%cx ! 803: movl %eax,%edx // count ! 804: ! 805: movl %ecx,tstep ! 806: addl $7,%edx ! 807: ! 808: shrl $3,%edx // count of full and partial loops ! 809: movl spanpackage_t_sfrac(%esi),%ebx ! 810: ! 811: movw %dx,%bx ! 812: movl spanpackage_t_pz(%esi),%ecx ! 813: ! 814: negl %eax ! 815: ! 816: movl spanpackage_t_pdest(%esi),%edi ! 817: andl $7,%eax // 0->0, 1->7, 2->6, ... , 7->1 ! 818: ! 819: subl %eax,%edi // compensate for hardwired offsets ! 820: subl %eax,%ecx ! 821: ! 822: subl %eax,%ecx ! 823: movl spanpackage_t_tfrac(%esi),%edx ! 824: ! 825: movw spanpackage_t_light(%esi),%dx ! 826: movl spanpackage_t_zi(%esi),%ebp ! 827: ! 828: rorl $16,%ebp // put high 16 bits of 1/z in low word ! 829: pushl %esi ! 830: ! 831: movl spanpackage_t_ptex(%esi),%esi ! 832: jmp aff8entryvec_table(,%eax,4) ! 833: ! 834: // %bx = count of full and partial loops ! 835: // %ebx high word = sfrac ! 836: // %ecx = pz ! 837: // %dx = light ! 838: // %edx high word = tfrac ! 839: // %esi = ptex ! 840: // %edi = pdest ! 841: // %ebp = 1/z ! 842: // tstep low word = C(r_lstepx) ! 843: // tstep high word = C(a_tstepxfrac) ! 844: // C(a_sstepxfrac) low word = 0 ! 845: // C(a_sstepxfrac) high word = C(a_sstepxfrac) ! 846: ! 847: LDrawLoop: ! 848: ! 849: // FIXME: do we need to clamp light? We may need at least a buffer bit to ! 850: // keep it from poking into tfrac and causing problems ! 851: ! 852: LDraw8: ! 853: cmpw (%ecx),%bp ! 854: jl Lp1 ! 855: xorl %eax,%eax ! 856: movb %dh,%ah ! 857: movb (%esi),%al ! 858: movw %bp,(%ecx) ! 859: movb 0x12345678(%eax),%al ! 860: LPatch8: ! 861: movb %al,(%edi) ! 862: Lp1: ! 863: addl tstep,%edx ! 864: sbbl %eax,%eax ! 865: addl lzistepx,%ebp ! 866: adcl $0,%ebp ! 867: addl C(a_sstepxfrac),%ebx ! 868: adcl advancetable+4(,%eax,4),%esi ! 869: ! 870: LDraw7: ! 871: cmpw 2(%ecx),%bp ! 872: jl Lp2 ! 873: xorl %eax,%eax ! 874: movb %dh,%ah ! 875: movb (%esi),%al ! 876: movw %bp,2(%ecx) ! 877: movb 0x12345678(%eax),%al ! 878: LPatch7: ! 879: movb %al,1(%edi) ! 880: Lp2: ! 881: addl tstep,%edx ! 882: sbbl %eax,%eax ! 883: addl lzistepx,%ebp ! 884: adcl $0,%ebp ! 885: addl C(a_sstepxfrac),%ebx ! 886: adcl advancetable+4(,%eax,4),%esi ! 887: ! 888: LDraw6: ! 889: cmpw 4(%ecx),%bp ! 890: jl Lp3 ! 891: xorl %eax,%eax ! 892: movb %dh,%ah ! 893: movb (%esi),%al ! 894: movw %bp,4(%ecx) ! 895: movb 0x12345678(%eax),%al ! 896: LPatch6: ! 897: movb %al,2(%edi) ! 898: Lp3: ! 899: addl tstep,%edx ! 900: sbbl %eax,%eax ! 901: addl lzistepx,%ebp ! 902: adcl $0,%ebp ! 903: addl C(a_sstepxfrac),%ebx ! 904: adcl advancetable+4(,%eax,4),%esi ! 905: ! 906: LDraw5: ! 907: cmpw 6(%ecx),%bp ! 908: jl Lp4 ! 909: xorl %eax,%eax ! 910: movb %dh,%ah ! 911: movb (%esi),%al ! 912: movw %bp,6(%ecx) ! 913: movb 0x12345678(%eax),%al ! 914: LPatch5: ! 915: movb %al,3(%edi) ! 916: Lp4: ! 917: addl tstep,%edx ! 918: sbbl %eax,%eax ! 919: addl lzistepx,%ebp ! 920: adcl $0,%ebp ! 921: addl C(a_sstepxfrac),%ebx ! 922: adcl advancetable+4(,%eax,4),%esi ! 923: ! 924: LDraw4: ! 925: cmpw 8(%ecx),%bp ! 926: jl Lp5 ! 927: xorl %eax,%eax ! 928: movb %dh,%ah ! 929: movb (%esi),%al ! 930: movw %bp,8(%ecx) ! 931: movb 0x12345678(%eax),%al ! 932: LPatch4: ! 933: movb %al,4(%edi) ! 934: Lp5: ! 935: addl tstep,%edx ! 936: sbbl %eax,%eax ! 937: addl lzistepx,%ebp ! 938: adcl $0,%ebp ! 939: addl C(a_sstepxfrac),%ebx ! 940: adcl advancetable+4(,%eax,4),%esi ! 941: ! 942: LDraw3: ! 943: cmpw 10(%ecx),%bp ! 944: jl Lp6 ! 945: xorl %eax,%eax ! 946: movb %dh,%ah ! 947: movb (%esi),%al ! 948: movw %bp,10(%ecx) ! 949: movb 0x12345678(%eax),%al ! 950: LPatch3: ! 951: movb %al,5(%edi) ! 952: Lp6: ! 953: addl tstep,%edx ! 954: sbbl %eax,%eax ! 955: addl lzistepx,%ebp ! 956: adcl $0,%ebp ! 957: addl C(a_sstepxfrac),%ebx ! 958: adcl advancetable+4(,%eax,4),%esi ! 959: ! 960: LDraw2: ! 961: cmpw 12(%ecx),%bp ! 962: jl Lp7 ! 963: xorl %eax,%eax ! 964: movb %dh,%ah ! 965: movb (%esi),%al ! 966: movw %bp,12(%ecx) ! 967: movb 0x12345678(%eax),%al ! 968: LPatch2: ! 969: movb %al,6(%edi) ! 970: Lp7: ! 971: addl tstep,%edx ! 972: sbbl %eax,%eax ! 973: addl lzistepx,%ebp ! 974: adcl $0,%ebp ! 975: addl C(a_sstepxfrac),%ebx ! 976: adcl advancetable+4(,%eax,4),%esi ! 977: ! 978: LDraw1: ! 979: cmpw 14(%ecx),%bp ! 980: jl Lp8 ! 981: xorl %eax,%eax ! 982: movb %dh,%ah ! 983: movb (%esi),%al ! 984: movw %bp,14(%ecx) ! 985: movb 0x12345678(%eax),%al ! 986: LPatch1: ! 987: movb %al,7(%edi) ! 988: Lp8: ! 989: addl tstep,%edx ! 990: sbbl %eax,%eax ! 991: addl lzistepx,%ebp ! 992: adcl $0,%ebp ! 993: addl C(a_sstepxfrac),%ebx ! 994: adcl advancetable+4(,%eax,4),%esi ! 995: ! 996: addl $8,%edi ! 997: addl $16,%ecx ! 998: ! 999: decw %bx ! 1000: jnz LDrawLoop ! 1001: ! 1002: popl %esi // restore spans pointer ! 1003: LNextSpan: ! 1004: addl $(spanpackage_t_size),%esi // point to next span ! 1005: LNextSpanESISet: ! 1006: movl spanpackage_t_count(%esi),%edx ! 1007: cmpl $-999999,%edx // any more spans? ! 1008: jnz LSpanLoop // yes ! 1009: ! 1010: popl %edi ! 1011: popl %ebp // restore the caller's stack frame ! 1012: popl %ebx // restore register variables ! 1013: popl %esi ! 1014: ret ! 1015: ! 1016: ! 1017: // draw a one-long span ! 1018: ! 1019: LExactlyOneLong: ! 1020: ! 1021: movl spanpackage_t_pz(%esi),%ecx ! 1022: movl spanpackage_t_zi(%esi),%ebp ! 1023: ! 1024: rorl $16,%ebp // put high 16 bits of 1/z in low word ! 1025: movl spanpackage_t_ptex(%esi),%ebx ! 1026: ! 1027: cmpw (%ecx),%bp ! 1028: jl LNextSpan ! 1029: xorl %eax,%eax ! 1030: movl spanpackage_t_pdest(%esi),%edi ! 1031: movb spanpackage_t_light+1(%esi),%ah ! 1032: addl $(spanpackage_t_size),%esi // point to next span ! 1033: movb (%ebx),%al ! 1034: movw %bp,(%ecx) ! 1035: movb 0x12345678(%eax),%al ! 1036: LPatch9: ! 1037: movb %al,(%edi) ! 1038: ! 1039: jmp LNextSpanESISet ! 1040: ! 1041: .globl C(D_PolysetAff8End) ! 1042: C(D_PolysetAff8End): ! 1043: ! 1044: ! 1045: .extern C(alias_colormap) ! 1046: // #define pcolormap 4 ! 1047: ! 1048: .globl C(D_Aff8Patch) ! 1049: C(D_Aff8Patch): ! 1050: movl C(alias_colormap),%eax ! 1051: movl %eax,LPatch1-4 ! 1052: movl %eax,LPatch2-4 ! 1053: movl %eax,LPatch3-4 ! 1054: movl %eax,LPatch4-4 ! 1055: movl %eax,LPatch5-4 ! 1056: movl %eax,LPatch6-4 ! 1057: movl %eax,LPatch7-4 ! 1058: movl %eax,LPatch8-4 ! 1059: movl %eax,LPatch9-4 ! 1060: ! 1061: ret ! 1062: ! 1063: //---------------------------------------------------------------------- ! 1064: // Alias model triangle left-edge scanning code ! 1065: //---------------------------------------------------------------------- ! 1066: ! 1067: #define height 4+16 ! 1068: ! 1069: .globl C(R_PolysetScanLeftEdge) ! 1070: C(R_PolysetScanLeftEdge): ! 1071: pushl %ebp // preserve caller stack frame pointer ! 1072: pushl %esi // preserve register variables ! 1073: pushl %edi ! 1074: pushl %ebx ! 1075: ! 1076: movl height(%esp),%eax ! 1077: movl C(d_sfrac),%ecx ! 1078: andl $0xFFFF,%eax ! 1079: movl C(d_ptex),%ebx ! 1080: orl %eax,%ecx ! 1081: movl C(d_pedgespanpackage),%esi ! 1082: movl C(d_tfrac),%edx ! 1083: movl C(d_light),%edi ! 1084: movl C(d_zi),%ebp ! 1085: ! 1086: // %eax: scratch ! 1087: // %ebx: d_ptex ! 1088: // %ecx: d_sfrac in high word, count in low word ! 1089: // %edx: d_tfrac ! 1090: // %esi: d_pedgespanpackage, errorterm, scratch alternately ! 1091: // %edi: d_light ! 1092: // %ebp: d_zi ! 1093: ! 1094: // do ! 1095: // { ! 1096: ! 1097: LScanLoop: ! 1098: ! 1099: // d_pedgespanpackage->ptex = ptex; ! 1100: // d_pedgespanpackage->pdest = d_pdest; ! 1101: // d_pedgespanpackage->pz = d_pz; ! 1102: // d_pedgespanpackage->count = d_aspancount; ! 1103: // d_pedgespanpackage->light = d_light; ! 1104: // d_pedgespanpackage->zi = d_zi; ! 1105: // d_pedgespanpackage->sfrac = d_sfrac << 16; ! 1106: // d_pedgespanpackage->tfrac = d_tfrac << 16; ! 1107: movl %ebx,spanpackage_t_ptex(%esi) ! 1108: movl C(d_pdest),%eax ! 1109: movl %eax,spanpackage_t_pdest(%esi) ! 1110: movl C(d_pz),%eax ! 1111: movl %eax,spanpackage_t_pz(%esi) ! 1112: movl C(d_aspancount),%eax ! 1113: movl %eax,spanpackage_t_count(%esi) ! 1114: movl %edi,spanpackage_t_light(%esi) ! 1115: movl %ebp,spanpackage_t_zi(%esi) ! 1116: movl %ecx,spanpackage_t_sfrac(%esi) ! 1117: movl %edx,spanpackage_t_tfrac(%esi) ! 1118: ! 1119: // pretouch the next cache line ! 1120: movb spanpackage_t_size(%esi),%al ! 1121: ! 1122: // d_pedgespanpackage++; ! 1123: addl $(spanpackage_t_size),%esi ! 1124: movl C(erroradjustup),%eax ! 1125: movl %esi,C(d_pedgespanpackage) ! 1126: ! 1127: // errorterm += erroradjustup; ! 1128: movl C(errorterm),%esi ! 1129: addl %eax,%esi ! 1130: movl C(d_pdest),%eax ! 1131: ! 1132: // if (errorterm >= 0) ! 1133: // { ! 1134: js LNoLeftEdgeTurnover ! 1135: ! 1136: // errorterm -= erroradjustdown; ! 1137: // d_pdest += d_pdestextrastep; ! 1138: subl C(erroradjustdown),%esi ! 1139: addl C(d_pdestextrastep),%eax ! 1140: movl %esi,C(errorterm) ! 1141: movl %eax,C(d_pdest) ! 1142: ! 1143: // d_pz += d_pzextrastep; ! 1144: // d_aspancount += d_countextrastep; ! 1145: // d_ptex += d_ptexextrastep; ! 1146: // d_sfrac += d_sfracextrastep; ! 1147: // d_ptex += d_sfrac >> 16; ! 1148: // d_sfrac &= 0xFFFF; ! 1149: // d_tfrac += d_tfracextrastep; ! 1150: movl C(d_pz),%eax ! 1151: movl C(d_aspancount),%esi ! 1152: addl C(d_pzextrastep),%eax ! 1153: addl C(d_sfracextrastep),%ecx ! 1154: adcl C(d_ptexextrastep),%ebx ! 1155: addl C(d_countextrastep),%esi ! 1156: movl %eax,C(d_pz) ! 1157: movl C(d_tfracextrastep),%eax ! 1158: movl %esi,C(d_aspancount) ! 1159: addl %eax,%edx ! 1160: ! 1161: // if (d_tfrac & 0x10000) ! 1162: // { ! 1163: jnc LSkip1 ! 1164: ! 1165: // d_ptex += r_affinetridesc.skinwidth; ! 1166: // d_tfrac &= 0xFFFF; ! 1167: addl C(r_affinetridesc)+atd_skinwidth,%ebx ! 1168: ! 1169: // } ! 1170: ! 1171: LSkip1: ! 1172: ! 1173: // d_light += d_lightextrastep; ! 1174: // d_zi += d_ziextrastep; ! 1175: addl C(d_lightextrastep),%edi ! 1176: addl C(d_ziextrastep),%ebp ! 1177: ! 1178: // } ! 1179: movl C(d_pedgespanpackage),%esi ! 1180: decl %ecx ! 1181: testl $0xFFFF,%ecx ! 1182: jnz LScanLoop ! 1183: ! 1184: popl %ebx ! 1185: popl %edi ! 1186: popl %esi ! 1187: popl %ebp ! 1188: ret ! 1189: ! 1190: // else ! 1191: // { ! 1192: ! 1193: LNoLeftEdgeTurnover: ! 1194: movl %esi,C(errorterm) ! 1195: ! 1196: // d_pdest += d_pdestbasestep; ! 1197: addl C(d_pdestbasestep),%eax ! 1198: movl %eax,C(d_pdest) ! 1199: ! 1200: // d_pz += d_pzbasestep; ! 1201: // d_aspancount += ubasestep; ! 1202: // d_ptex += d_ptexbasestep; ! 1203: // d_sfrac += d_sfracbasestep; ! 1204: // d_ptex += d_sfrac >> 16; ! 1205: // d_sfrac &= 0xFFFF; ! 1206: movl C(d_pz),%eax ! 1207: movl C(d_aspancount),%esi ! 1208: addl C(d_pzbasestep),%eax ! 1209: addl C(d_sfracbasestep),%ecx ! 1210: adcl C(d_ptexbasestep),%ebx ! 1211: addl C(ubasestep),%esi ! 1212: movl %eax,C(d_pz) ! 1213: movl %esi,C(d_aspancount) ! 1214: ! 1215: // d_tfrac += d_tfracbasestep; ! 1216: movl C(d_tfracbasestep),%esi ! 1217: addl %esi,%edx ! 1218: ! 1219: // if (d_tfrac & 0x10000) ! 1220: // { ! 1221: jnc LSkip2 ! 1222: ! 1223: // d_ptex += r_affinetridesc.skinwidth; ! 1224: // d_tfrac &= 0xFFFF; ! 1225: addl C(r_affinetridesc)+atd_skinwidth,%ebx ! 1226: ! 1227: // } ! 1228: ! 1229: LSkip2: ! 1230: ! 1231: // d_light += d_lightbasestep; ! 1232: // d_zi += d_zibasestep; ! 1233: addl C(d_lightbasestep),%edi ! 1234: addl C(d_zibasestep),%ebp ! 1235: ! 1236: // } ! 1237: // } while (--height); ! 1238: movl C(d_pedgespanpackage),%esi ! 1239: decl %ecx ! 1240: testl $0xFFFF,%ecx ! 1241: jnz LScanLoop ! 1242: ! 1243: popl %ebx ! 1244: popl %edi ! 1245: popl %esi ! 1246: popl %ebp ! 1247: ret ! 1248: ! 1249: #endif // id386 ! 1250:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.