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 void _subv(Vlong*, Vlong, Vlong);
34 _d2v(Vlong *y, double d)
36 union { double d; struct Vlong; } x;
37 uint xhi, xlo, ylo, yhi;
42 xhi = (x.hi & 0xfffff) | 0x100000;
44 sh = 1075 - ((x.hi >> 20) & 0x7ff);
49 /* v = (hi||lo) >> sh */
55 ylo = (xlo >> sh) | (xhi << (32-sh));
67 /* v = (hi||lo) << -sh */
71 yhi = (xhi << sh) | (xlo >> (32-sh));
74 yhi = d; /* causes something awful */
90 _f2v(Vlong *y, float f)
105 return -((long)x.hi*4294967296. + x.lo);
107 return (long)x.hi*4294967296. + x.lo;
116 uint _div64by32(Vlong, uint, uint*);
117 void _mul64by32(Vlong*, Vlong, uint);
120 slowdodiv(Vlong num, Vlong den, Vlong *q, Vlong *r)
122 uint numlo, numhi, denhi, denlo, quohi, quolo, t;
131 * get a divide by zero
133 if(denlo==0 && denhi==0) {
134 numlo = numlo / denlo;
138 * set up the divisor and find the number of iterations needed
140 if(numhi >= SIGN(32)) {
148 while(denhi < quohi || (denhi == quohi && denlo < quolo)) {
149 denhi = (denhi<<1) | (denlo>>31);
157 quohi = (quohi<<1) | (quolo>>31);
159 if(numhi > denhi || (numhi == denhi && numlo >= denlo)) {
167 denlo = (denlo>>1) | (denhi<<31);
182 dodiv(Vlong num, Vlong den, Vlong *qp, Vlong *rp)
187 if(den.hi > num.hi || (den.hi == num.hi && den.lo > num.lo)){
202 _mul64by32(&x, den, n);
203 if(x.hi > num.hi || (x.hi == num.hi && x.lo > num.lo))
204 slowdodiv(num, den, &q, &r);
210 if(num.hi >= den.lo){
211 q.hi = n = num.hi/den.lo;
216 q.lo = _div64by32(num, den.lo, &r.lo);
230 _divvu(Vlong *q, Vlong n, Vlong d)
233 if(n.hi == 0 && d.hi == 0) {
242 _modvu(Vlong *r, Vlong n, Vlong d)
245 if(n.hi == 0 && d.hi == 0) {
266 _divv(Vlong *q, Vlong n, Vlong d)
270 if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
271 q->lo = (long)n.lo / (long)d.lo;
272 q->hi = ((long)q->lo) >> 31;
287 _modv(Vlong *r, Vlong n, Vlong d)
291 if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
292 r->lo = (long)n.lo % (long)d.lo;
293 r->hi = ((long)r->lo) >> 31;
308 _rshav(Vlong *r, Vlong a, int b)
316 /* this is illegal re C standard */
329 r->lo = (t << (32-b)) | (a.lo >> b);
333 _rshlv(Vlong *r, Vlong a, int b)
341 /* this is illegal re C standard */
354 r->lo = (t << (32-b)) | (a.lo >> b);
358 _lshv(Vlong *r, Vlong a, int b)
366 /* this is illegal re C standard */
379 r->hi = (t >> (32-b)) | (a.hi << b);
383 _andv(Vlong *r, Vlong a, Vlong b)
390 _orv(Vlong *r, Vlong a, Vlong b)
397 _xorv(Vlong *r, Vlong a, Vlong b)
404 _vpp(Vlong *l, Vlong *r)
415 _vmm(Vlong *l, Vlong *r)
426 _ppv(Vlong *l, Vlong *r)
437 _mmv(Vlong *l, Vlong *r)
448 _vasop(Vlong *ret, void *lv, void fn(Vlong*, Vlong, Vlong), int type, Vlong rv)
517 fn(&u, *(Vlong*)lv, rv);
525 _p2v(Vlong *ret, void *p)
535 _sl2v(Vlong *ret, long sl)
545 _ul2v(Vlong *ret, uint ul)
555 _si2v(Vlong *ret, int si)
565 _ui2v(Vlong *ret, uint ui)
575 _sh2v(Vlong *ret, long sh)
579 t = (sh << 16) >> 16;
585 _uh2v(Vlong *ret, uint ul)
595 _sc2v(Vlong *ret, long uc)
599 t = (uc << 24) >> 24;
605 _uc2v(Vlong *ret, uint ul)
620 return (t << 24) >> 24;
636 return (t << 16) >> 16;
643 return rv.lo & 0xffff;
677 return rv.lo || rv.hi;
681 _eqv(Vlong lv, Vlong rv)
683 return lv.lo == rv.lo && lv.hi == rv.hi;
687 _nev(Vlong lv, Vlong rv)
689 return lv.lo != rv.lo || lv.hi != rv.hi;
693 _ltv(Vlong lv, Vlong rv)
695 return (long)lv.hi < (long)rv.hi ||
696 (lv.hi == rv.hi && lv.lo < rv.lo);
700 _lev(Vlong lv, Vlong rv)
702 return (long)lv.hi < (long)rv.hi ||
703 (lv.hi == rv.hi && lv.lo <= rv.lo);
707 _gtv(Vlong lv, Vlong rv)
709 return (long)lv.hi > (long)rv.hi ||
710 (lv.hi == rv.hi && lv.lo > rv.lo);
714 _gev(Vlong lv, Vlong rv)
716 return (long)lv.hi > (long)rv.hi ||
717 (lv.hi == rv.hi && lv.lo >= rv.lo);
721 _lov(Vlong lv, Vlong rv)
723 return lv.hi < rv.hi ||
724 (lv.hi == rv.hi && lv.lo < rv.lo);
728 _lsv(Vlong lv, Vlong rv)
730 return lv.hi < rv.hi ||
731 (lv.hi == rv.hi && lv.lo <= rv.lo);
735 _hiv(Vlong lv, Vlong rv)
737 return lv.hi > rv.hi ||
738 (lv.hi == rv.hi && lv.lo > rv.lo);
742 _hsv(Vlong lv, Vlong rv)
744 return lv.hi > rv.hi ||
745 (lv.hi == rv.hi && lv.lo >= rv.lo);