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;
18 /* needed by profiler; can't be profiled */
22 _addv(Vlong *r, Vlong a, Vlong b)
35 _subv(Vlong *r, Vlong a, Vlong b)
50 _d2v(Vlong *y, double d)
52 union { double d; struct Vlong; } x;
53 ulong xhi, xlo, ylo, yhi;
58 xhi = (x.hi & 0xfffff) | 0x100000;
60 sh = 1075 - ((x.hi >> 20) & 0x7ff);
65 /* v = (hi||lo) >> sh */
71 ylo = (xlo >> sh) | (xhi << (32-sh));
83 /* v = (hi||lo) << -sh */
87 yhi = (xhi << sh) | (xlo >> (32-sh));
90 yhi = d; /* causes something awful */
106 _f2v(Vlong *y, float f)
114 if(x.hi & SIGN(32)) {
120 return -((long)x.hi*4294967296. + x.lo);
122 return (long)x.hi*4294967296. + x.lo;
131 /* too many of these are also needed by profiler; leave them out */
135 dodiv(Vlong num, Vlong den, Vlong *q, Vlong *r)
137 ulong numlo, numhi, denhi, denlo, quohi, quolo, t;
145 * get a divide by zero
147 if(denlo==0 && denhi==0) {
148 numlo = numlo / denlo;
152 * set up the divisor and find the number of iterations needed
154 if(numhi >= SIGN(32)) {
162 while(denhi < quohi || (denhi == quohi && denlo < quolo)) {
163 denhi = (denhi<<1) | (denlo>>31);
171 quohi = (quohi<<1) | (quolo>>31);
173 if(numhi > denhi || (numhi == denhi && numlo >= denlo)) {
181 denlo = (denlo>>1) | (denhi<<31);
196 _divvu(Vlong *q, Vlong n, Vlong d)
198 if(n.hi == 0 && d.hi == 0) {
207 _modvu(Vlong *r, Vlong n, Vlong d)
210 if(n.hi == 0 && d.hi == 0) {
231 _divv(Vlong *q, Vlong n, Vlong d)
235 if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
236 q->lo = (long)n.lo / (long)d.lo;
237 q->hi = ((long)q->lo) >> 31;
252 _modv(Vlong *r, Vlong n, Vlong d)
256 if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
257 r->lo = (long)n.lo % (long)d.lo;
258 r->hi = ((long)r->lo) >> 31;
273 _rshav(Vlong *r, Vlong a, int b)
281 /* this is illegal re C standard */
294 r->lo = (t << (32-b)) | (a.lo >> b);
298 _rshlv(Vlong *r, Vlong a, int b)
306 /* this is illegal re C standard */
319 r->lo = (t << (32-b)) | (a.lo >> b);
323 _lshv(Vlong *r, Vlong a, int b)
331 /* this is illegal re C standard */
344 r->hi = (t >> (32-b)) | (a.hi << b);
348 _andv(Vlong *r, Vlong a, Vlong b)
355 _orv(Vlong *r, Vlong a, Vlong b)
362 _xorv(Vlong *r, Vlong a, Vlong b)
369 _vpp(Vlong *l, Vlong *r)
380 _vmm(Vlong *l, Vlong *r)
391 _ppv(Vlong *l, Vlong *r)
402 _mmv(Vlong *l, Vlong *r)
413 _vasop(Vlong *ret, void *lv, void fn(Vlong*, Vlong, Vlong), int type, Vlong rv)
481 fn(&u, *(Vlong*)lv, rv);
489 _p2v(Vlong *ret, void *p)
499 _sl2v(Vlong *ret, long sl)
510 _ul2v(Vlong *ret, ulong ul)
520 _si2v(Vlong *ret, int si)
530 _ui2v(Vlong *ret, uint ui)
540 _sh2v(Vlong *ret, long sh)
544 t = (sh << 16) >> 16;
550 _uh2v(Vlong *ret, ulong ul)
560 _sc2v(Vlong *ret, long uc)
564 t = (uc << 24) >> 24;
570 _uc2v(Vlong *ret, ulong ul)
585 return (t << 24) >> 24;
601 return (t << 16) >> 16;
608 return rv.lo & 0xffff;
642 return rv.lo || rv.hi;
646 _eqv(Vlong lv, Vlong rv)
648 return lv.lo == rv.lo && lv.hi == rv.hi;
652 _nev(Vlong lv, Vlong rv)
654 return lv.lo != rv.lo || lv.hi != rv.hi;
658 _ltv(Vlong lv, Vlong rv)
660 return (long)lv.hi < (long)rv.hi ||
661 (lv.hi == rv.hi && lv.lo < rv.lo);
665 _lev(Vlong lv, Vlong rv)
667 return (long)lv.hi < (long)rv.hi ||
668 (lv.hi == rv.hi && lv.lo <= rv.lo);
672 _gtv(Vlong lv, Vlong rv)
674 return (long)lv.hi > (long)rv.hi ||
675 (lv.hi == rv.hi && lv.lo > rv.lo);
679 _gev(Vlong lv, Vlong rv)
681 return (long)lv.hi > (long)rv.hi ||
682 (lv.hi == rv.hi && lv.lo >= rv.lo);
686 _lov(Vlong lv, Vlong rv)
688 return lv.hi < rv.hi ||
689 (lv.hi == rv.hi && lv.lo < rv.lo);
693 _lsv(Vlong lv, Vlong rv)
695 return lv.hi < rv.hi ||
696 (lv.hi == rv.hi && lv.lo <= rv.lo);
700 _hiv(Vlong lv, Vlong rv)
702 return lv.hi > rv.hi ||
703 (lv.hi == rv.hi && lv.lo > rv.lo);
707 _hsv(Vlong lv, Vlong rv)
709 return lv.hi > rv.hi ||
710 (lv.hi == rv.hi && lv.lo >= rv.lo);