|
|
1.1 ! root 1: typedef unsigned long ulong; ! 2: typedef unsigned char uchar; ! 3: typedef unsigned short ushort; ! 4: typedef signed char schar; ! 5: ! 6: #define SIGN(n) (1UL<<(n-1)) ! 7: ! 8: typedef struct Vlong Vlong; ! 9: struct Vlong ! 10: { ! 11: union ! 12: { ! 13: struct ! 14: { ! 15: ulong hi; ! 16: ulong lo; ! 17: }; ! 18: struct ! 19: { ! 20: ushort hims; ! 21: ushort hils; ! 22: ushort loms; ! 23: ushort lols; ! 24: }; ! 25: }; ! 26: }; ! 27: ! 28: void abort(void); ! 29: ! 30: void ! 31: _addv(Vlong *r, Vlong a, Vlong b) ! 32: { ! 33: ulong lo, hi; ! 34: ! 35: lo = a.lo + b.lo; ! 36: hi = a.hi + b.hi; ! 37: if(lo < a.lo) ! 38: hi++; ! 39: r->lo = lo; ! 40: r->hi = hi; ! 41: } ! 42: ! 43: void ! 44: _subv(Vlong *r, Vlong a, Vlong b) ! 45: { ! 46: ulong lo, hi; ! 47: ! 48: lo = a.lo - b.lo; ! 49: hi = a.hi - b.hi; ! 50: if(lo > a.lo) ! 51: hi--; ! 52: r->lo = lo; ! 53: r->hi = hi; ! 54: } ! 55: ! 56: void ! 57: _d2v(Vlong *y, double d) ! 58: { ! 59: union { double d; struct Vlong; } x; ! 60: ulong xhi, xlo, ylo, yhi; ! 61: int sh; ! 62: ! 63: x.d = d; ! 64: ! 65: xhi = (x.hi & 0xfffff) | 0x100000; ! 66: xlo = x.lo; ! 67: sh = 1075 - ((x.hi >> 20) & 0x7ff); ! 68: ! 69: ylo = 0; ! 70: yhi = 0; ! 71: if(sh >= 0) { ! 72: /* v = (hi||lo) >> sh */ ! 73: if(sh < 32) { ! 74: if(sh == 0) { ! 75: ylo = xlo; ! 76: yhi = xhi; ! 77: } else { ! 78: ylo = (xlo >> sh) | (xhi << (32-sh)); ! 79: yhi = xhi >> sh; ! 80: } ! 81: } else { ! 82: if(sh == 32) { ! 83: ylo = xhi; ! 84: } else ! 85: if(sh < 64) { ! 86: ylo = xhi >> (sh-32); ! 87: } ! 88: } ! 89: } else { ! 90: /* v = (hi||lo) << -sh */ ! 91: sh = -sh; ! 92: if(sh <= 10) { ! 93: ylo = xlo << sh; ! 94: yhi = (xhi << sh) | (xlo >> (32-sh)); ! 95: } else { ! 96: /* overflow */ ! 97: yhi = d; /* causes something awful */ ! 98: } ! 99: } ! 100: if(x.hi & 0x80000000) { ! 101: if(ylo != 0) { ! 102: ylo = -ylo; ! 103: yhi = ~yhi; ! 104: } else ! 105: yhi = -yhi; ! 106: } ! 107: ! 108: y->hi = yhi; ! 109: y->lo = ylo; ! 110: } ! 111: ! 112: void ! 113: _f2v(Vlong *y, float f) ! 114: { ! 115: ! 116: _d2v(y, f); ! 117: } ! 118: ! 119: double ! 120: _v2d(Vlong x) ! 121: { ! 122: if(x.hi & 0x80000000) { ! 123: if(x.lo) { ! 124: x.lo = -x.lo; ! 125: x.hi = ~x.hi; ! 126: } else ! 127: x.hi = -x.hi; ! 128: return -((long)x.hi*4294967296. + x.lo); ! 129: } ! 130: return (long)x.hi*4294967296. + x.lo; ! 131: } ! 132: ! 133: float ! 134: _v2f(Vlong x) ! 135: { ! 136: return _v2d(x); ! 137: } ! 138: ! 139: static void ! 140: dodiv(Vlong num, Vlong den, Vlong *q, Vlong *r) ! 141: { ! 142: ulong numlo, numhi, denhi, denlo, quohi, quolo, t; ! 143: int i; ! 144: ! 145: numhi = num.hi; ! 146: numlo = num.lo; ! 147: denhi = den.hi; ! 148: denlo = den.lo; ! 149: ! 150: /* ! 151: * get a divide by zero ! 152: */ ! 153: if(denlo==0 && denhi==0) { ! 154: numlo = numlo / denlo; ! 155: } ! 156: ! 157: /* ! 158: * set up the divisor and find the number of iterations needed ! 159: */ ! 160: if(numhi >= SIGN(32)) { ! 161: quohi = SIGN(32); ! 162: quolo = 0; ! 163: } else { ! 164: quohi = numhi; ! 165: quolo = numlo; ! 166: } ! 167: i = 0; ! 168: while(denhi < quohi || (denhi == quohi && denlo < quolo)) { ! 169: denhi = (denhi<<1) | (denlo>>31); ! 170: denlo <<= 1; ! 171: i++; ! 172: } ! 173: ! 174: quohi = 0; ! 175: quolo = 0; ! 176: for(; i >= 0; i--) { ! 177: quohi = (quohi<<1) | (quolo>>31); ! 178: quolo <<= 1; ! 179: if(numhi > denhi || (numhi == denhi && numlo >= denlo)) { ! 180: t = numlo; ! 181: numlo -= denlo; ! 182: if(numlo > t) ! 183: numhi--; ! 184: numhi -= denhi; ! 185: quolo |= 1; ! 186: } ! 187: denlo = (denlo>>1) | (denhi<<31); ! 188: denhi >>= 1; ! 189: } ! 190: ! 191: if(q) { ! 192: q->lo = quolo; ! 193: q->hi = quohi; ! 194: } ! 195: if(r) { ! 196: r->lo = numlo; ! 197: r->hi = numhi; ! 198: } ! 199: } ! 200: ! 201: void ! 202: _divvu(Vlong *q, Vlong n, Vlong d) ! 203: { ! 204: ! 205: if(n.hi == 0 && d.hi == 0) { ! 206: q->hi = 0; ! 207: q->lo = n.lo / d.lo; ! 208: return; ! 209: } ! 210: dodiv(n, d, q, 0); ! 211: } ! 212: ! 213: void ! 214: _modvu(Vlong *r, Vlong n, Vlong d) ! 215: { ! 216: ! 217: if(n.hi == 0 && d.hi == 0) { ! 218: r->hi = 0; ! 219: r->lo = n.lo % d.lo; ! 220: return; ! 221: } ! 222: dodiv(n, d, 0, r); ! 223: } ! 224: ! 225: static void ! 226: vneg(Vlong *v) ! 227: { ! 228: ! 229: if(v->lo == 0) { ! 230: v->hi = -v->hi; ! 231: return; ! 232: } ! 233: v->lo = -v->lo; ! 234: v->hi = ~v->hi; ! 235: } ! 236: ! 237: void ! 238: _divv(Vlong *q, Vlong n, Vlong d) ! 239: { ! 240: long nneg, dneg; ! 241: ! 242: if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) { ! 243: q->lo = (long)n.lo / (long)d.lo; ! 244: q->hi = ((long)q->lo) >> 31; ! 245: return; ! 246: } ! 247: nneg = n.hi >> 31; ! 248: if(nneg) ! 249: vneg(&n); ! 250: dneg = d.hi >> 31; ! 251: if(dneg) ! 252: vneg(&d); ! 253: dodiv(n, d, q, 0); ! 254: if(nneg != dneg) ! 255: vneg(q); ! 256: } ! 257: ! 258: void ! 259: _modv(Vlong *r, Vlong n, Vlong d) ! 260: { ! 261: long nneg, dneg; ! 262: ! 263: if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) { ! 264: r->lo = (long)n.lo % (long)d.lo; ! 265: r->hi = ((long)r->lo) >> 31; ! 266: return; ! 267: } ! 268: nneg = n.hi >> 31; ! 269: if(nneg) ! 270: vneg(&n); ! 271: dneg = d.hi >> 31; ! 272: if(dneg) ! 273: vneg(&d); ! 274: dodiv(n, d, 0, r); ! 275: if(nneg) ! 276: vneg(r); ! 277: } ! 278: ! 279: void ! 280: _rshav(Vlong *r, Vlong a, int b) ! 281: { ! 282: long t; ! 283: ! 284: t = a.hi; ! 285: if(b >= 32) { ! 286: r->hi = t>>31; ! 287: if(b >= 64) { ! 288: /* this is illegal re C standard */ ! 289: r->lo = t>>31; ! 290: return; ! 291: } ! 292: r->lo = t >> (b-32); ! 293: return; ! 294: } ! 295: if(b <= 0) { ! 296: r->hi = t; ! 297: r->lo = a.lo; ! 298: return; ! 299: } ! 300: r->hi = t >> b; ! 301: r->lo = (t << (32-b)) | (a.lo >> b); ! 302: } ! 303: ! 304: void ! 305: _rshlv(Vlong *r, Vlong a, int b) ! 306: { ! 307: ulong t; ! 308: ! 309: t = a.hi; ! 310: if(b >= 32) { ! 311: r->hi = 0; ! 312: if(b >= 64) { ! 313: /* this is illegal re C standard */ ! 314: r->lo = 0; ! 315: return; ! 316: } ! 317: r->lo = t >> (b-32); ! 318: return; ! 319: } ! 320: if(b <= 0) { ! 321: r->hi = t; ! 322: r->lo = a.lo; ! 323: return; ! 324: } ! 325: r->hi = t >> b; ! 326: r->lo = (t << (32-b)) | (a.lo >> b); ! 327: } ! 328: ! 329: void ! 330: _lshv(Vlong *r, Vlong a, int b) ! 331: { ! 332: ulong t; ! 333: ! 334: t = a.lo; ! 335: if(b >= 32) { ! 336: r->lo = 0; ! 337: if(b >= 64) { ! 338: /* this is illegal re C standard */ ! 339: r->hi = 0; ! 340: return; ! 341: } ! 342: r->hi = t << (b-32); ! 343: return; ! 344: } ! 345: if(b <= 0) { ! 346: r->lo = t; ! 347: r->hi = a.hi; ! 348: return; ! 349: } ! 350: r->lo = t << b; ! 351: r->hi = (t >> (32-b)) | (a.hi << b); ! 352: } ! 353: ! 354: void ! 355: _andv(Vlong *r, Vlong a, Vlong b) ! 356: { ! 357: r->hi = a.hi & b.hi; ! 358: r->lo = a.lo & b.lo; ! 359: } ! 360: ! 361: void ! 362: _orv(Vlong *r, Vlong a, Vlong b) ! 363: { ! 364: r->hi = a.hi | b.hi; ! 365: r->lo = a.lo | b.lo; ! 366: } ! 367: ! 368: void ! 369: _xorv(Vlong *r, Vlong a, Vlong b) ! 370: { ! 371: r->hi = a.hi ^ b.hi; ! 372: r->lo = a.lo ^ b.lo; ! 373: } ! 374: ! 375: void ! 376: _negv(Vlong *r, Vlong a) ! 377: { ! 378: if(a.lo == 0) { ! 379: r->hi = -a.hi; ! 380: r->lo = 0; ! 381: return; ! 382: } ! 383: r->hi = ~a.hi; ! 384: r->lo = -a.lo; ! 385: } ! 386: ! 387: void ! 388: _vpp(Vlong *l, Vlong *r) ! 389: { ! 390: ! 391: l->hi = r->hi; ! 392: l->lo = r->lo; ! 393: r->lo++; ! 394: if(r->lo == 0) ! 395: r->hi++; ! 396: } ! 397: ! 398: void ! 399: _vmm(Vlong *l, Vlong *r) ! 400: { ! 401: ! 402: l->hi = r->hi; ! 403: l->lo = r->lo; ! 404: if(r->lo == 0) ! 405: r->hi--; ! 406: r->lo--; ! 407: } ! 408: ! 409: void ! 410: _ppv(Vlong *l, Vlong *r) ! 411: { ! 412: ! 413: r->lo++; ! 414: if(r->lo == 0) ! 415: r->hi++; ! 416: l->hi = r->hi; ! 417: l->lo = r->lo; ! 418: } ! 419: ! 420: void ! 421: _mmv(Vlong *l, Vlong *r) ! 422: { ! 423: ! 424: if(r->lo == 0) ! 425: r->hi--; ! 426: r->lo--; ! 427: l->hi = r->hi; ! 428: l->lo = r->lo; ! 429: } ! 430: ! 431: void ! 432: _vasop(Vlong *ret, void *lv, void fn(Vlong*, Vlong, Vlong), int type, Vlong rv) ! 433: { ! 434: Vlong t; ! 435: ! 436: switch(type) { ! 437: default: ! 438: abort(); ! 439: break; ! 440: ! 441: case 1: /* schar */ ! 442: t.lo = *(schar*)lv; ! 443: t.hi = t.lo >> 31; ! 444: fn(ret, t, rv); ! 445: *(schar*)lv = ret->lo; ! 446: break; ! 447: ! 448: case 2: /* uchar */ ! 449: t.lo = *(uchar*)lv; ! 450: t.hi = 0; ! 451: fn(ret, t, rv); ! 452: *(uchar*)lv = ret->lo; ! 453: break; ! 454: ! 455: case 3: /* short */ ! 456: t.lo = *(short*)lv; ! 457: t.hi = t.lo >> 31; ! 458: fn(ret, t, rv); ! 459: *(short*)lv = ret->lo; ! 460: break; ! 461: ! 462: case 4: /* ushort */ ! 463: t.lo = *(ushort*)lv; ! 464: t.hi = 0; ! 465: fn(ret, t, rv); ! 466: *(ushort*)lv = ret->lo; ! 467: break; ! 468: ! 469: case 5: /* long */ ! 470: t.lo = *(long*)lv; ! 471: t.hi = t.lo >> 31; ! 472: fn(ret, t, rv); ! 473: *(long*)lv = ret->lo; ! 474: break; ! 475: ! 476: case 6: /* ulong */ ! 477: t.lo = *(ulong*)lv; ! 478: t.hi = 0; ! 479: fn(ret, t, rv); ! 480: *(ulong*)lv = ret->lo; ! 481: break; ! 482: ! 483: case 7: /* vlong */ ! 484: case 8: /* uvlong */ ! 485: fn(ret, *(Vlong*)lv, rv); ! 486: *(Vlong*)lv = *ret; ! 487: break; ! 488: } ! 489: } ! 490: ! 491: void ! 492: _sl2v(Vlong *ret, long sl) ! 493: { ! 494: long t; ! 495: ! 496: t = sl; ! 497: ret->lo = t; ! 498: ret->hi = t >> 31; ! 499: } ! 500: ! 501: void ! 502: _ul2v(Vlong *ret, ulong ul) ! 503: { ! 504: long t; ! 505: ! 506: t = ul; ! 507: ret->lo = t; ! 508: ret->hi = 0; ! 509: } ! 510: ! 511: void ! 512: _sh2v(Vlong *ret, long sh) ! 513: { ! 514: long t; ! 515: ! 516: t = (sh << 16) >> 16; ! 517: ret->lo = t; ! 518: ret->hi = t >> 31; ! 519: } ! 520: ! 521: void ! 522: _uh2v(Vlong *ret, ulong ul) ! 523: { ! 524: long t; ! 525: ! 526: t = ul & 0xffff; ! 527: ret->lo = t; ! 528: ret->hi = 0; ! 529: } ! 530: ! 531: void ! 532: _sc2v(Vlong *ret, long uc) ! 533: { ! 534: long t; ! 535: ! 536: t = (uc << 24) >> 24; ! 537: ret->lo = t; ! 538: ret->hi = t >> 31; ! 539: } ! 540: ! 541: void ! 542: _uc2v(Vlong *ret, ulong ul) ! 543: { ! 544: long t; ! 545: ! 546: t = ul & 0xff; ! 547: ret->lo = t; ! 548: ret->hi = 0; ! 549: } ! 550: ! 551: long ! 552: _v2sc(Vlong rv) ! 553: { ! 554: long t; ! 555: ! 556: t = rv.lo & 0xff; ! 557: return (t << 24) >> 24; ! 558: } ! 559: ! 560: long ! 561: _v2uc(Vlong rv) ! 562: { ! 563: ! 564: return rv.lo & 0xff; ! 565: } ! 566: ! 567: long ! 568: _v2sh(Vlong rv) ! 569: { ! 570: long t; ! 571: ! 572: t = rv.lo & 0xffff; ! 573: return (t << 16) >> 16; ! 574: } ! 575: ! 576: long ! 577: _v2uh(Vlong rv) ! 578: { ! 579: ! 580: return rv.lo & 0xffff; ! 581: } ! 582: ! 583: long ! 584: _v2sl(Vlong rv) ! 585: { ! 586: ! 587: return rv.lo; ! 588: } ! 589: ! 590: long ! 591: _v2ul(Vlong rv) ! 592: { ! 593: ! 594: return rv.lo; ! 595: } ! 596: ! 597: int ! 598: _testv(Vlong rv) ! 599: { ! 600: return rv.lo || rv.hi; ! 601: } ! 602: ! 603: int ! 604: _eqv(Vlong lv, Vlong rv) ! 605: { ! 606: return lv.lo == rv.lo && lv.hi == rv.hi; ! 607: } ! 608: ! 609: int ! 610: _nev(Vlong lv, Vlong rv) ! 611: { ! 612: return lv.lo != rv.lo || lv.hi != rv.hi; ! 613: } ! 614: ! 615: int ! 616: _ltv(Vlong lv, Vlong rv) ! 617: { ! 618: return (long)lv.hi < (long)rv.hi || ! 619: (lv.hi == rv.hi && lv.lo < rv.lo); ! 620: } ! 621: ! 622: int ! 623: _lev(Vlong lv, Vlong rv) ! 624: { ! 625: return (long)lv.hi < (long)rv.hi || ! 626: (lv.hi == rv.hi && lv.lo <= rv.lo); ! 627: } ! 628: ! 629: int ! 630: _gtv(Vlong lv, Vlong rv) ! 631: { ! 632: return (long)lv.hi > (long)rv.hi || ! 633: (lv.hi == rv.hi && lv.lo > rv.lo); ! 634: } ! 635: ! 636: int ! 637: _gev(Vlong lv, Vlong rv) ! 638: { ! 639: return (long)lv.hi > (long)rv.hi || ! 640: (lv.hi == rv.hi && lv.lo >= rv.lo); ! 641: } ! 642: ! 643: int ! 644: _lov(Vlong lv, Vlong rv) ! 645: { ! 646: return lv.hi < rv.hi || ! 647: (lv.hi == rv.hi && lv.lo < rv.lo); ! 648: } ! 649: ! 650: int ! 651: _lsv(Vlong lv, Vlong rv) ! 652: { ! 653: return lv.hi < rv.hi || ! 654: (lv.hi == rv.hi && lv.lo <= rv.lo); ! 655: } ! 656: ! 657: int ! 658: _hiv(Vlong lv, Vlong rv) ! 659: { ! 660: return lv.hi > rv.hi || ! 661: (lv.hi == rv.hi && lv.lo > rv.lo); ! 662: } ! 663: ! 664: int ! 665: _hsv(Vlong lv, Vlong rv) ! 666: { ! 667: return lv.hi > rv.hi || ! 668: (lv.hi == rv.hi && lv.lo >= rv.lo); ! 669: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.