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;
31 /* needed by profiler; can't be profiled. */
34 _addv(Vlong *r, Vlong a, Vlong b)
47 _subv(Vlong *r, Vlong a, Vlong b)
62 _d2v(Vlong *y, double d)
64 union { double d; struct Vlong; } x;
65 ulong xhi, xlo, ylo, yhi;
70 xhi = (x.hi & 0xfffff) | 0x100000;
72 sh = 1075 - ((x.hi >> 20) & 0x7ff);
77 /* v = (hi||lo) >> sh */
83 ylo = (xlo >> sh) | (xhi << (32-sh));
95 /* v = (hi||lo) << -sh */
99 yhi = (xhi << sh) | (xlo >> (32-sh));
102 yhi = d; /* causes something awful */
105 if(x.hi & SIGN(32)) {
118 _f2v(Vlong *y, float f)
126 if(x.hi & SIGN(32)) {
132 return -((long)x.hi*4294967296. + x.lo);
134 return (long)x.hi*4294967296. + x.lo;
146 return x.hi*4294967296. + x.lo;
156 _vasaddd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
158 _d2v(lv, v2d(*lv)+rv);
162 _vassubd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
164 _d2v(lv, v2d(*lv)-rv);
168 _vasmuld(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
170 _d2v(lv, v2d(*lv)*rv);
174 _vasdivd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
176 _d2v(lv, v2d(*lv)/rv);
181 dodiv(Vlong num, Vlong den, Vlong *qp, Vlong *rp)
183 ulong numlo, numhi, denhi, denlo, quohi, quolo, t;
192 * get a divide by zero
194 if(denlo==0 && denhi==0) {
195 numlo = numlo / denlo;
199 * set up the divisor and find the number of iterations needed
201 if(numhi >= SIGN(32)) {
209 while(denhi < quohi || (denhi == quohi && denlo < quolo)) {
210 denhi = (denhi<<1) | (denlo>>31);
218 quohi = (quohi<<1) | (quolo>>31);
220 if(numhi > denhi || (numhi == denhi && numlo >= denlo)) {
228 denlo = (denlo>>1) | (denhi<<31);
243 _divvu(Vlong *q, Vlong n, Vlong d)
246 if(n.hi == 0 && d.hi == 0) {
255 _modvu(Vlong *r, Vlong n, Vlong d)
258 if(n.hi == 0 && d.hi == 0) {
279 _divv(Vlong *q, Vlong n, Vlong d)
283 if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
284 q->lo = (long)n.lo / (long)d.lo;
285 q->hi = ((long)q->lo) >> 31;
300 _modv(Vlong *r, Vlong n, Vlong d)
304 if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
305 r->lo = (long)n.lo % (long)d.lo;
306 r->hi = ((long)r->lo) >> 31;
321 _rshav(Vlong *r, Vlong a, int b)
329 /* this is illegal re C standard */
342 r->lo = (t << (32-b)) | (a.lo >> b);
346 _rshlv(Vlong *r, Vlong a, int b)
354 /* this is illegal re C standard */
367 r->lo = (t << (32-b)) | (a.lo >> b);
371 _lshv(Vlong *r, Vlong a, int b)
379 /* this is illegal re C standard */
392 r->hi = (t >> (32-b)) | (a.hi << b);
396 _andv(Vlong *r, Vlong a, Vlong b)
403 _orv(Vlong *r, Vlong a, Vlong b)
410 _xorv(Vlong *r, Vlong a, Vlong b)
417 _vpp(Vlong *l, Vlong *r)
428 _vmm(Vlong *l, Vlong *r)
439 _ppv(Vlong *l, Vlong *r)
450 _mmv(Vlong *l, Vlong *r)
461 _vasop(Vlong *ret, void *lv, void fn(Vlong*, Vlong, Vlong), int type, Vlong rv)
530 fn(&u, *(Vlong*)lv, rv);
538 _p2v(Vlong *ret, void *p)
548 _sl2v(Vlong *ret, long sl)
558 _ul2v(Vlong *ret, ulong ul)
568 _si2v(Vlong *ret, int si)
578 _ui2v(Vlong *ret, uint ui)
588 _sh2v(Vlong *ret, long sh)
592 t = (sh << 16) >> 16;
598 _uh2v(Vlong *ret, ulong ul)
608 _sc2v(Vlong *ret, long uc)
612 t = (uc << 24) >> 24;
618 _uc2v(Vlong *ret, ulong ul)
633 return (t << 24) >> 24;
649 return (t << 16) >> 16;
656 return rv.lo & 0xffff;
690 return rv.lo || rv.hi;
694 _eqv(Vlong lv, Vlong rv)
696 return lv.lo == rv.lo && lv.hi == rv.hi;
700 _nev(Vlong lv, Vlong rv)
702 return lv.lo != rv.lo || lv.hi != rv.hi;
706 _ltv(Vlong lv, Vlong rv)
708 return (long)lv.hi < (long)rv.hi ||
709 (lv.hi == rv.hi && lv.lo < rv.lo);
713 _lev(Vlong lv, Vlong rv)
715 return (long)lv.hi < (long)rv.hi ||
716 (lv.hi == rv.hi && lv.lo <= rv.lo);
720 _gtv(Vlong lv, Vlong rv)
722 return (long)lv.hi > (long)rv.hi ||
723 (lv.hi == rv.hi && lv.lo > rv.lo);
727 _gev(Vlong lv, Vlong rv)
729 return (long)lv.hi > (long)rv.hi ||
730 (lv.hi == rv.hi && lv.lo >= rv.lo);
734 _lov(Vlong lv, Vlong rv)
736 return lv.hi < rv.hi ||
737 (lv.hi == rv.hi && lv.lo < rv.lo);
741 _lsv(Vlong lv, Vlong rv)
743 return lv.hi < rv.hi ||
744 (lv.hi == rv.hi && lv.lo <= rv.lo);
748 _hiv(Vlong lv, Vlong rv)
750 return lv.hi > rv.hi ||
751 (lv.hi == rv.hi && lv.lo > rv.lo);
755 _hsv(Vlong lv, Vlong rv)
757 return lv.hi > rv.hi ||
758 (lv.hi == rv.hi && lv.lo >= rv.lo);