1 typedef unsigned long ulong;
2 typedef unsigned int uint;
3 typedef unsigned short ushort;
4 typedef unsigned char uchar;
5 typedef signed char schar;
7 #define SIGN(n) (1UL<<(n-1))
9 typedef struct Vlong Vlong;
32 _addv(Vlong *r, Vlong a, Vlong b)
45 _subv(Vlong *r, Vlong a, Vlong b)
58 _d2v(Vlong *y, double d)
60 union { double d; struct Vlong; } x;
61 ulong xhi, xlo, ylo, yhi;
66 xhi = (x.hi & 0xfffff) | 0x100000;
68 sh = 1075 - ((x.hi >> 20) & 0x7ff);
73 /* v = (hi||lo) >> sh */
79 ylo = (xlo >> sh) | (xhi << (32-sh));
91 /* v = (hi||lo) << -sh */
95 yhi = (xhi << sh) | (xlo >> (32-sh));
98 yhi = d; /* causes something awful */
101 if(x.hi & SIGN(32)) {
114 _f2v(Vlong *y, float f)
123 if(x.hi & SIGN(32)) {
129 return -((long)x.hi*4294967296. + x.lo);
131 return (long)x.hi*4294967296. + x.lo;
141 dodiv(Vlong num, Vlong den, Vlong *q, Vlong *r)
143 ulong numlo, numhi, denhi, denlo, quohi, quolo, t;
152 * get a divide by zero
154 if(denlo==0 && denhi==0) {
155 numlo = numlo / denlo;
159 * set up the divisor and find the number of iterations needed
161 if(numhi >= SIGN(32)) {
169 while(denhi < quohi || (denhi == quohi && denlo < quolo)) {
170 denhi = (denhi<<1) | (denlo>>31);
178 quohi = (quohi<<1) | (quolo>>31);
180 if(numhi > denhi || (numhi == denhi && numlo >= denlo)) {
188 denlo = (denlo>>1) | (denhi<<31);
203 _divvu(Vlong *q, Vlong n, Vlong d)
206 if(n.hi == 0 && d.hi == 0) {
215 _modvu(Vlong *r, Vlong n, Vlong d)
218 if(n.hi == 0 && d.hi == 0) {
239 _divv(Vlong *q, Vlong n, Vlong d)
243 if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
244 q->lo = (long)n.lo / (long)d.lo;
245 q->hi = ((long)q->lo) >> 31;
260 _modv(Vlong *r, Vlong n, Vlong d)
264 if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
265 r->lo = (long)n.lo % (long)d.lo;
266 r->hi = ((long)r->lo) >> 31;
281 _rshav(Vlong *r, Vlong a, int b)
289 /* this is illegal re C standard */
302 r->lo = (t << (32-b)) | (a.lo >> b);
306 _rshlv(Vlong *r, Vlong a, int b)
314 /* this is illegal re C standard */
327 r->lo = (t << (32-b)) | (a.lo >> b);
331 _lshv(Vlong *r, Vlong a, int b)
339 /* this is illegal re C standard */
352 r->hi = (t >> (32-b)) | (a.hi << b);
356 _andv(Vlong *r, Vlong a, Vlong b)
363 _orv(Vlong *r, Vlong a, Vlong b)
370 _xorv(Vlong *r, Vlong a, Vlong b)
377 _negv(Vlong *r, Vlong a)
389 _vpp(Vlong *l, Vlong *r)
400 _vmm(Vlong *l, Vlong *r)
411 _ppv(Vlong *l, Vlong *r)
422 _mmv(Vlong *l, Vlong *r)
433 _vasop(Vlong *ret, void *lv, void fn(Vlong*, Vlong, Vlong), int type, Vlong rv)
501 fn(&u, *(Vlong*)lv, rv);
509 _p2v(Vlong *ret, void *p)
519 _sl2v(Vlong *ret, long sl)
529 _ul2v(Vlong *ret, ulong ul)
539 _si2v(Vlong *ret, int si)
549 _ui2v(Vlong *ret, uint ui)
559 _sh2v(Vlong *ret, long sh)
563 t = (sh << 16) >> 16;
569 _uh2v(Vlong *ret, ulong ul)
579 _sc2v(Vlong *ret, long uc)
583 t = (uc << 24) >> 24;
589 _uc2v(Vlong *ret, ulong ul)
604 return (t << 24) >> 24;
620 return (t << 16) >> 16;
627 return rv.lo & 0xffff;
661 return rv.lo || rv.hi;
665 _eqv(Vlong lv, Vlong rv)
667 return lv.lo == rv.lo && lv.hi == rv.hi;
671 _nev(Vlong lv, Vlong rv)
673 return lv.lo != rv.lo || lv.hi != rv.hi;
677 _ltv(Vlong lv, Vlong rv)
679 return (long)lv.hi < (long)rv.hi ||
680 (lv.hi == rv.hi && lv.lo < rv.lo);
684 _lev(Vlong lv, Vlong rv)
686 return (long)lv.hi < (long)rv.hi ||
687 (lv.hi == rv.hi && lv.lo <= rv.lo);
691 _gtv(Vlong lv, Vlong rv)
693 return (long)lv.hi > (long)rv.hi ||
694 (lv.hi == rv.hi && lv.lo > rv.lo);
698 _gev(Vlong lv, Vlong rv)
700 return (long)lv.hi > (long)rv.hi ||
701 (lv.hi == rv.hi && lv.lo >= rv.lo);
705 _lov(Vlong lv, Vlong rv)
707 return lv.hi < rv.hi ||
708 (lv.hi == rv.hi && lv.lo < rv.lo);
712 _lsv(Vlong lv, Vlong rv)
714 return lv.hi < rv.hi ||
715 (lv.hi == rv.hi && lv.lo <= rv.lo);
719 _hiv(Vlong lv, Vlong rv)
721 return lv.hi > rv.hi ||
722 (lv.hi == rv.hi && lv.lo > rv.lo);
726 _hsv(Vlong lv, Vlong rv)
728 return lv.hi > rv.hi ||
729 (lv.hi == rv.hi && lv.lo >= rv.lo);