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;
19 _d2v(Vlong *y, double d)
21 union { double d; struct Vlong; } x;
22 ulong xhi, xlo, ylo, yhi;
27 xhi = (x.hi & 0xfffff) | 0x100000;
29 sh = 1075 - ((x.hi >> 20) & 0x7ff);
34 /* v = (hi||lo) >> sh */
40 ylo = (xlo >> sh) | (xhi << (32-sh));
52 /* v = (hi||lo) << -sh */
56 yhi = (xhi << sh) | (xlo >> (32-sh));
59 yhi = d; /* causes something awful */
75 _f2v(Vlong *y, float f)
89 return -((long)x.hi*4294967296. + x.lo);
91 return (long)x.hi*4294967296. + x.lo;
103 return x.hi*4294967296. + x.lo;
113 _vasaddd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
115 _d2v(lv, v2d(*lv)+rv);
119 _vassubd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
121 _d2v(lv, v2d(*lv)-rv);
125 _vasmuld(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
127 _d2v(lv, v2d(*lv)*rv);
131 _vasdivd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
133 _d2v(lv, v2d(*lv)/rv);
137 /* too many of these are also needed by profiler; leave them out */
141 dodiv(Vlong num, Vlong den, Vlong *q, Vlong *r)
143 ulong numlo, numhi, denhi, denlo, quohi, quolo, t;
151 * get a divide by zero
153 if(denlo==0 && denhi==0) {
154 numlo = numlo / denlo;
158 * set up the divisor and find the number of iterations needed
160 if(numhi >= SIGN(32)) {
168 while(denhi < quohi || (denhi == quohi && denlo < quolo)) {
169 denhi = (denhi<<1) | (denlo>>31);
177 quohi = (quohi<<1) | (quolo>>31);
179 if(numhi > denhi || (numhi == denhi && numlo >= denlo)) {
187 denlo = (denlo>>1) | (denhi<<31);
202 _divvu(Vlong *q, Vlong n, Vlong d)
204 if(n.hi == 0 && d.hi == 0) {
213 _modvu(Vlong *r, Vlong n, Vlong d)
216 if(n.hi == 0 && d.hi == 0) {
237 _divv(Vlong *q, Vlong n, Vlong d)
241 if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
242 q->lo = (long)n.lo / (long)d.lo;
243 q->hi = ((long)q->lo) >> 31;
258 _modv(Vlong *r, Vlong n, Vlong d)
262 if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
263 r->lo = (long)n.lo % (long)d.lo;
264 r->hi = ((long)r->lo) >> 31;
279 _rshav(Vlong *r, Vlong a, int b)
287 /* this is illegal re C standard */
300 r->lo = (t << (32-b)) | (a.lo >> b);
304 _rshlv(Vlong *r, Vlong a, int b)
312 /* this is illegal re C standard */
325 r->lo = (t << (32-b)) | (a.lo >> b);
329 _lshv(Vlong *r, Vlong a, int b)
337 /* this is illegal re C standard */
350 r->hi = (t >> (32-b)) | (a.hi << b);
354 _andv(Vlong *r, Vlong a, Vlong b)
361 _orv(Vlong *r, Vlong a, Vlong b)
368 _xorv(Vlong *r, Vlong a, Vlong b)
375 _vpp(Vlong *l, Vlong *r)
386 _vmm(Vlong *l, Vlong *r)
397 _ppv(Vlong *l, Vlong *r)
408 _mmv(Vlong *l, Vlong *r)
419 _vasop(Vlong *ret, void *lv, void fn(Vlong*, Vlong, Vlong), int type, Vlong rv)
487 fn(&u, *(Vlong*)lv, rv);
495 _p2v(Vlong *ret, void *p)
505 _sl2v(Vlong *ret, long sl)
516 _ul2v(Vlong *ret, ulong ul)
526 _si2v(Vlong *ret, int si)
536 _ui2v(Vlong *ret, uint ui)
546 _sh2v(Vlong *ret, long sh)
550 t = (sh << 16) >> 16;
556 _uh2v(Vlong *ret, ulong ul)
566 _sc2v(Vlong *ret, long uc)
570 t = (uc << 24) >> 24;
576 _uc2v(Vlong *ret, ulong ul)
591 return (t << 24) >> 24;
607 return (t << 16) >> 16;
614 return rv.lo & 0xffff;
648 return rv.lo || rv.hi;
652 _eqv(Vlong lv, Vlong rv)
654 return lv.lo == rv.lo && lv.hi == rv.hi;
658 _nev(Vlong lv, Vlong rv)
660 return lv.lo != rv.lo || lv.hi != rv.hi;
664 _ltv(Vlong lv, Vlong rv)
666 return (long)lv.hi < (long)rv.hi ||
667 (lv.hi == rv.hi && lv.lo < rv.lo);
671 _lev(Vlong lv, Vlong rv)
673 return (long)lv.hi < (long)rv.hi ||
674 (lv.hi == rv.hi && lv.lo <= rv.lo);
678 _gtv(Vlong lv, Vlong rv)
680 return (long)lv.hi > (long)rv.hi ||
681 (lv.hi == rv.hi && lv.lo > rv.lo);
685 _gev(Vlong lv, Vlong rv)
687 return (long)lv.hi > (long)rv.hi ||
688 (lv.hi == rv.hi && lv.lo >= rv.lo);
692 _lov(Vlong lv, Vlong rv)
694 return lv.hi < rv.hi ||
695 (lv.hi == rv.hi && lv.lo < rv.lo);
699 _lsv(Vlong lv, Vlong rv)
701 return lv.hi < rv.hi ||
702 (lv.hi == rv.hi && lv.lo <= rv.lo);
706 _hiv(Vlong lv, Vlong rv)
708 return lv.hi > rv.hi ||
709 (lv.hi == rv.hi && lv.lo > rv.lo);
713 _hsv(Vlong lv, Vlong rv)
715 return lv.hi > rv.hi ||
716 (lv.hi == rv.hi && lv.lo >= rv.lo);