17dd7cddfSDavid du Colombier typedef unsigned long ulong;
27dd7cddfSDavid du Colombier typedef unsigned int uint;
37dd7cddfSDavid du Colombier typedef unsigned short ushort;
47dd7cddfSDavid du Colombier typedef unsigned char uchar;
57dd7cddfSDavid du Colombier typedef signed char schar;
67dd7cddfSDavid du Colombier
77dd7cddfSDavid du Colombier #define SIGN(n) (1UL<<(n-1))
87dd7cddfSDavid du Colombier
97dd7cddfSDavid du Colombier typedef struct Vlong Vlong;
107dd7cddfSDavid du Colombier struct Vlong
117dd7cddfSDavid du Colombier {
127dd7cddfSDavid du Colombier union
137dd7cddfSDavid du Colombier {
147dd7cddfSDavid du Colombier struct
157dd7cddfSDavid du Colombier {
167dd7cddfSDavid du Colombier ulong lo;
177dd7cddfSDavid du Colombier ulong hi;
187dd7cddfSDavid du Colombier };
197dd7cddfSDavid du Colombier struct
207dd7cddfSDavid du Colombier {
217dd7cddfSDavid du Colombier ushort lols;
227dd7cddfSDavid du Colombier ushort loms;
237dd7cddfSDavid du Colombier ushort hils;
247dd7cddfSDavid du Colombier ushort hims;
257dd7cddfSDavid du Colombier };
267dd7cddfSDavid du Colombier };
277dd7cddfSDavid du Colombier };
287dd7cddfSDavid du Colombier
297dd7cddfSDavid du Colombier void abort(void);
307dd7cddfSDavid du Colombier
317dd7cddfSDavid du Colombier void
_subv(Vlong * r,Vlong a,Vlong b)327dd7cddfSDavid du Colombier _subv(Vlong *r, Vlong a, Vlong b)
337dd7cddfSDavid du Colombier {
347dd7cddfSDavid du Colombier ulong lo, hi;
357dd7cddfSDavid du Colombier
367dd7cddfSDavid du Colombier lo = a.lo - b.lo;
377dd7cddfSDavid du Colombier hi = a.hi - b.hi;
387dd7cddfSDavid du Colombier if(lo > a.lo)
397dd7cddfSDavid du Colombier hi--;
407dd7cddfSDavid du Colombier r->lo = lo;
417dd7cddfSDavid du Colombier r->hi = hi;
427dd7cddfSDavid du Colombier }
437dd7cddfSDavid du Colombier
447dd7cddfSDavid du Colombier void
_d2v(Vlong * y,double d)457dd7cddfSDavid du Colombier _d2v(Vlong *y, double d)
467dd7cddfSDavid du Colombier {
477dd7cddfSDavid du Colombier union { double d; struct Vlong; } x;
487dd7cddfSDavid du Colombier ulong xhi, xlo, ylo, yhi;
497dd7cddfSDavid du Colombier int sh;
507dd7cddfSDavid du Colombier
517dd7cddfSDavid du Colombier x.d = d;
527dd7cddfSDavid du Colombier
537dd7cddfSDavid du Colombier xhi = (x.hi & 0xfffff) | 0x100000;
547dd7cddfSDavid du Colombier xlo = x.lo;
557dd7cddfSDavid du Colombier sh = 1075 - ((x.hi >> 20) & 0x7ff);
567dd7cddfSDavid du Colombier
577dd7cddfSDavid du Colombier ylo = 0;
587dd7cddfSDavid du Colombier yhi = 0;
597dd7cddfSDavid du Colombier if(sh >= 0) {
607dd7cddfSDavid du Colombier /* v = (hi||lo) >> sh */
617dd7cddfSDavid du Colombier if(sh < 32) {
627dd7cddfSDavid du Colombier if(sh == 0) {
637dd7cddfSDavid du Colombier ylo = xlo;
647dd7cddfSDavid du Colombier yhi = xhi;
657dd7cddfSDavid du Colombier } else {
667dd7cddfSDavid du Colombier ylo = (xlo >> sh) | (xhi << (32-sh));
677dd7cddfSDavid du Colombier yhi = xhi >> sh;
687dd7cddfSDavid du Colombier }
697dd7cddfSDavid du Colombier } else {
707dd7cddfSDavid du Colombier if(sh == 32) {
717dd7cddfSDavid du Colombier ylo = xhi;
727dd7cddfSDavid du Colombier } else
737dd7cddfSDavid du Colombier if(sh < 64) {
747dd7cddfSDavid du Colombier ylo = xhi >> (sh-32);
757dd7cddfSDavid du Colombier }
767dd7cddfSDavid du Colombier }
777dd7cddfSDavid du Colombier } else {
787dd7cddfSDavid du Colombier /* v = (hi||lo) << -sh */
797dd7cddfSDavid du Colombier sh = -sh;
807dd7cddfSDavid du Colombier if(sh <= 10) {
817dd7cddfSDavid du Colombier ylo = xlo << sh;
827dd7cddfSDavid du Colombier yhi = (xhi << sh) | (xlo >> (32-sh));
837dd7cddfSDavid du Colombier } else {
847dd7cddfSDavid du Colombier /* overflow */
857dd7cddfSDavid du Colombier yhi = d; /* causes something awful */
867dd7cddfSDavid du Colombier }
877dd7cddfSDavid du Colombier }
887dd7cddfSDavid du Colombier if(x.hi & SIGN(32)) {
897dd7cddfSDavid du Colombier if(ylo != 0) {
907dd7cddfSDavid du Colombier ylo = -ylo;
917dd7cddfSDavid du Colombier yhi = ~yhi;
927dd7cddfSDavid du Colombier } else
937dd7cddfSDavid du Colombier yhi = -yhi;
947dd7cddfSDavid du Colombier }
957dd7cddfSDavid du Colombier
967dd7cddfSDavid du Colombier y->hi = yhi;
977dd7cddfSDavid du Colombier y->lo = ylo;
987dd7cddfSDavid du Colombier }
997dd7cddfSDavid du Colombier
1007dd7cddfSDavid du Colombier void
_f2v(Vlong * y,float f)1017dd7cddfSDavid du Colombier _f2v(Vlong *y, float f)
1027dd7cddfSDavid du Colombier {
1037dd7cddfSDavid du Colombier
1047dd7cddfSDavid du Colombier _d2v(y, f);
1057dd7cddfSDavid du Colombier }
1067dd7cddfSDavid du Colombier
1077dd7cddfSDavid du Colombier double
_v2d(Vlong x)1087dd7cddfSDavid du Colombier _v2d(Vlong x)
1097dd7cddfSDavid du Colombier {
1107dd7cddfSDavid du Colombier if(x.hi & SIGN(32)) {
1117dd7cddfSDavid du Colombier if(x.lo) {
1127dd7cddfSDavid du Colombier x.lo = -x.lo;
1137dd7cddfSDavid du Colombier x.hi = ~x.hi;
1147dd7cddfSDavid du Colombier } else
1157dd7cddfSDavid du Colombier x.hi = -x.hi;
1167dd7cddfSDavid du Colombier return -((long)x.hi*4294967296. + x.lo);
1177dd7cddfSDavid du Colombier }
1187dd7cddfSDavid du Colombier return (long)x.hi*4294967296. + x.lo;
1197dd7cddfSDavid du Colombier }
1207dd7cddfSDavid du Colombier
1217dd7cddfSDavid du Colombier float
_v2f(Vlong x)1227dd7cddfSDavid du Colombier _v2f(Vlong x)
1237dd7cddfSDavid du Colombier {
1247dd7cddfSDavid du Colombier return _v2d(x);
1257dd7cddfSDavid du Colombier }
1267dd7cddfSDavid du Colombier
1277dd7cddfSDavid du Colombier ulong _div64by32(Vlong, ulong, ulong*);
128*853458f3SDavid du Colombier int _mul64by32(Vlong*, Vlong, ulong);
1297dd7cddfSDavid du Colombier
1307dd7cddfSDavid du Colombier static void
dodiv(Vlong num,Vlong den,Vlong * qp,Vlong * rp)1317dd7cddfSDavid du Colombier dodiv(Vlong num, Vlong den, Vlong *qp, Vlong *rp)
1327dd7cddfSDavid du Colombier {
1337dd7cddfSDavid du Colombier ulong n;
1347dd7cddfSDavid du Colombier Vlong x, q, r;
1357dd7cddfSDavid du Colombier
1367dd7cddfSDavid du Colombier if(den.hi > num.hi || (den.hi == num.hi && den.lo > num.lo)){
1377dd7cddfSDavid du Colombier if(qp) {
1387dd7cddfSDavid du Colombier qp->hi = 0;
1397dd7cddfSDavid du Colombier qp->lo = 0;
1407dd7cddfSDavid du Colombier }
1417dd7cddfSDavid du Colombier if(rp) {
1427dd7cddfSDavid du Colombier rp->hi = num.hi;
1437dd7cddfSDavid du Colombier rp->lo = num.lo;
1447dd7cddfSDavid du Colombier }
1457dd7cddfSDavid du Colombier return;
1467dd7cddfSDavid du Colombier }
1477dd7cddfSDavid du Colombier
1487dd7cddfSDavid du Colombier if(den.hi != 0){
1497dd7cddfSDavid du Colombier q.hi = 0;
1507dd7cddfSDavid du Colombier n = num.hi/den.hi;
151*853458f3SDavid du Colombier if(_mul64by32(&x, den, n) || x.hi > num.hi ||
152*853458f3SDavid du Colombier (x.hi == num.hi && x.lo > num.lo)){
1537dd7cddfSDavid du Colombier n--;
1547dd7cddfSDavid du Colombier _mul64by32(&x, den, n);
1557dd7cddfSDavid du Colombier }
1567dd7cddfSDavid du Colombier q.lo = n;
1577dd7cddfSDavid du Colombier _subv(&r, num, x);
1587dd7cddfSDavid du Colombier } else {
1597dd7cddfSDavid du Colombier if(num.hi >= den.lo){
1607dd7cddfSDavid du Colombier q.hi = n = num.hi/den.lo;
1617dd7cddfSDavid du Colombier num.hi -= den.lo*n;
1627dd7cddfSDavid du Colombier } else {
1637dd7cddfSDavid du Colombier q.hi = 0;
1647dd7cddfSDavid du Colombier }
1657dd7cddfSDavid du Colombier q.lo = _div64by32(num, den.lo, &r.lo);
1667dd7cddfSDavid du Colombier r.hi = 0;
1677dd7cddfSDavid du Colombier }
1687dd7cddfSDavid du Colombier if(qp) {
1697dd7cddfSDavid du Colombier qp->lo = q.lo;
1707dd7cddfSDavid du Colombier qp->hi = q.hi;
1717dd7cddfSDavid du Colombier }
1727dd7cddfSDavid du Colombier if(rp) {
1737dd7cddfSDavid du Colombier rp->lo = r.lo;
1747dd7cddfSDavid du Colombier rp->hi = r.hi;
1757dd7cddfSDavid du Colombier }
1767dd7cddfSDavid du Colombier }
1777dd7cddfSDavid du Colombier
1787dd7cddfSDavid du Colombier void
_divvu(Vlong * q,Vlong n,Vlong d)1797dd7cddfSDavid du Colombier _divvu(Vlong *q, Vlong n, Vlong d)
1807dd7cddfSDavid du Colombier {
1817dd7cddfSDavid du Colombier
1827dd7cddfSDavid du Colombier if(n.hi == 0 && d.hi == 0) {
1837dd7cddfSDavid du Colombier q->hi = 0;
1847dd7cddfSDavid du Colombier q->lo = n.lo / d.lo;
1857dd7cddfSDavid du Colombier return;
1867dd7cddfSDavid du Colombier }
1877dd7cddfSDavid du Colombier dodiv(n, d, q, 0);
1887dd7cddfSDavid du Colombier }
1897dd7cddfSDavid du Colombier
1907dd7cddfSDavid du Colombier void
_modvu(Vlong * r,Vlong n,Vlong d)1917dd7cddfSDavid du Colombier _modvu(Vlong *r, Vlong n, Vlong d)
1927dd7cddfSDavid du Colombier {
1937dd7cddfSDavid du Colombier
1947dd7cddfSDavid du Colombier if(n.hi == 0 && d.hi == 0) {
1957dd7cddfSDavid du Colombier r->hi = 0;
1967dd7cddfSDavid du Colombier r->lo = n.lo % d.lo;
1977dd7cddfSDavid du Colombier return;
1987dd7cddfSDavid du Colombier }
1997dd7cddfSDavid du Colombier dodiv(n, d, 0, r);
2007dd7cddfSDavid du Colombier }
2017dd7cddfSDavid du Colombier
2027dd7cddfSDavid du Colombier static void
vneg(Vlong * v)2037dd7cddfSDavid du Colombier vneg(Vlong *v)
2047dd7cddfSDavid du Colombier {
2057dd7cddfSDavid du Colombier
2067dd7cddfSDavid du Colombier if(v->lo == 0) {
2077dd7cddfSDavid du Colombier v->hi = -v->hi;
2087dd7cddfSDavid du Colombier return;
2097dd7cddfSDavid du Colombier }
2107dd7cddfSDavid du Colombier v->lo = -v->lo;
2117dd7cddfSDavid du Colombier v->hi = ~v->hi;
2127dd7cddfSDavid du Colombier }
2137dd7cddfSDavid du Colombier
2147dd7cddfSDavid du Colombier void
_divv(Vlong * q,Vlong n,Vlong d)2157dd7cddfSDavid du Colombier _divv(Vlong *q, Vlong n, Vlong d)
2167dd7cddfSDavid du Colombier {
2177dd7cddfSDavid du Colombier long nneg, dneg;
2187dd7cddfSDavid du Colombier
2197dd7cddfSDavid du Colombier if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
2207dd7cddfSDavid du Colombier q->lo = (long)n.lo / (long)d.lo;
2217dd7cddfSDavid du Colombier q->hi = ((long)q->lo) >> 31;
2227dd7cddfSDavid du Colombier return;
2237dd7cddfSDavid du Colombier }
2247dd7cddfSDavid du Colombier nneg = n.hi >> 31;
2257dd7cddfSDavid du Colombier if(nneg)
2267dd7cddfSDavid du Colombier vneg(&n);
2277dd7cddfSDavid du Colombier dneg = d.hi >> 31;
2287dd7cddfSDavid du Colombier if(dneg)
2297dd7cddfSDavid du Colombier vneg(&d);
2307dd7cddfSDavid du Colombier dodiv(n, d, q, 0);
2317dd7cddfSDavid du Colombier if(nneg != dneg)
2327dd7cddfSDavid du Colombier vneg(q);
2337dd7cddfSDavid du Colombier }
2347dd7cddfSDavid du Colombier
2357dd7cddfSDavid du Colombier void
_modv(Vlong * r,Vlong n,Vlong d)2367dd7cddfSDavid du Colombier _modv(Vlong *r, Vlong n, Vlong d)
2377dd7cddfSDavid du Colombier {
2387dd7cddfSDavid du Colombier long nneg, dneg;
2397dd7cddfSDavid du Colombier
2407dd7cddfSDavid du Colombier if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
2417dd7cddfSDavid du Colombier r->lo = (long)n.lo % (long)d.lo;
2427dd7cddfSDavid du Colombier r->hi = ((long)r->lo) >> 31;
2437dd7cddfSDavid du Colombier return;
2447dd7cddfSDavid du Colombier }
2457dd7cddfSDavid du Colombier nneg = n.hi >> 31;
2467dd7cddfSDavid du Colombier if(nneg)
2477dd7cddfSDavid du Colombier vneg(&n);
2487dd7cddfSDavid du Colombier dneg = d.hi >> 31;
2497dd7cddfSDavid du Colombier if(dneg)
2507dd7cddfSDavid du Colombier vneg(&d);
2517dd7cddfSDavid du Colombier dodiv(n, d, 0, r);
2527dd7cddfSDavid du Colombier if(nneg)
2537dd7cddfSDavid du Colombier vneg(r);
2547dd7cddfSDavid du Colombier }
2557dd7cddfSDavid du Colombier
2567dd7cddfSDavid du Colombier void
_rshav(Vlong * r,Vlong a,int b)2577dd7cddfSDavid du Colombier _rshav(Vlong *r, Vlong a, int b)
2587dd7cddfSDavid du Colombier {
2597dd7cddfSDavid du Colombier long t;
2607dd7cddfSDavid du Colombier
2617dd7cddfSDavid du Colombier t = a.hi;
2627dd7cddfSDavid du Colombier if(b >= 32) {
2637dd7cddfSDavid du Colombier r->hi = t>>31;
2647dd7cddfSDavid du Colombier if(b >= 64) {
2657dd7cddfSDavid du Colombier /* this is illegal re C standard */
2667dd7cddfSDavid du Colombier r->lo = t>>31;
2677dd7cddfSDavid du Colombier return;
2687dd7cddfSDavid du Colombier }
2697dd7cddfSDavid du Colombier r->lo = t >> (b-32);
2707dd7cddfSDavid du Colombier return;
2717dd7cddfSDavid du Colombier }
2727dd7cddfSDavid du Colombier if(b <= 0) {
2737dd7cddfSDavid du Colombier r->hi = t;
2747dd7cddfSDavid du Colombier r->lo = a.lo;
2757dd7cddfSDavid du Colombier return;
2767dd7cddfSDavid du Colombier }
2777dd7cddfSDavid du Colombier r->hi = t >> b;
2787dd7cddfSDavid du Colombier r->lo = (t << (32-b)) | (a.lo >> b);
2797dd7cddfSDavid du Colombier }
2807dd7cddfSDavid du Colombier
2817dd7cddfSDavid du Colombier void
_rshlv(Vlong * r,Vlong a,int b)2827dd7cddfSDavid du Colombier _rshlv(Vlong *r, Vlong a, int b)
2837dd7cddfSDavid du Colombier {
2847dd7cddfSDavid du Colombier ulong t;
2857dd7cddfSDavid du Colombier
2867dd7cddfSDavid du Colombier t = a.hi;
2877dd7cddfSDavid du Colombier if(b >= 32) {
2887dd7cddfSDavid du Colombier r->hi = 0;
2897dd7cddfSDavid du Colombier if(b >= 64) {
2907dd7cddfSDavid du Colombier /* this is illegal re C standard */
2917dd7cddfSDavid du Colombier r->lo = 0;
2927dd7cddfSDavid du Colombier return;
2937dd7cddfSDavid du Colombier }
2947dd7cddfSDavid du Colombier r->lo = t >> (b-32);
2957dd7cddfSDavid du Colombier return;
2967dd7cddfSDavid du Colombier }
2977dd7cddfSDavid du Colombier if(b <= 0) {
2987dd7cddfSDavid du Colombier r->hi = t;
2997dd7cddfSDavid du Colombier r->lo = a.lo;
3007dd7cddfSDavid du Colombier return;
3017dd7cddfSDavid du Colombier }
3027dd7cddfSDavid du Colombier r->hi = t >> b;
3037dd7cddfSDavid du Colombier r->lo = (t << (32-b)) | (a.lo >> b);
3047dd7cddfSDavid du Colombier }
3057dd7cddfSDavid du Colombier
3067dd7cddfSDavid du Colombier void
_lshv(Vlong * r,Vlong a,int b)3077dd7cddfSDavid du Colombier _lshv(Vlong *r, Vlong a, int b)
3087dd7cddfSDavid du Colombier {
3097dd7cddfSDavid du Colombier ulong t;
3107dd7cddfSDavid du Colombier
3117dd7cddfSDavid du Colombier t = a.lo;
3127dd7cddfSDavid du Colombier if(b >= 32) {
3137dd7cddfSDavid du Colombier r->lo = 0;
3147dd7cddfSDavid du Colombier if(b >= 64) {
3157dd7cddfSDavid du Colombier /* this is illegal re C standard */
3167dd7cddfSDavid du Colombier r->hi = 0;
3177dd7cddfSDavid du Colombier return;
3187dd7cddfSDavid du Colombier }
3197dd7cddfSDavid du Colombier r->hi = t << (b-32);
3207dd7cddfSDavid du Colombier return;
3217dd7cddfSDavid du Colombier }
3227dd7cddfSDavid du Colombier if(b <= 0) {
3237dd7cddfSDavid du Colombier r->lo = t;
3247dd7cddfSDavid du Colombier r->hi = a.hi;
3257dd7cddfSDavid du Colombier return;
3267dd7cddfSDavid du Colombier }
3277dd7cddfSDavid du Colombier r->lo = t << b;
3287dd7cddfSDavid du Colombier r->hi = (t >> (32-b)) | (a.hi << b);
3297dd7cddfSDavid du Colombier }
3307dd7cddfSDavid du Colombier
3317dd7cddfSDavid du Colombier void
_andv(Vlong * r,Vlong a,Vlong b)3327dd7cddfSDavid du Colombier _andv(Vlong *r, Vlong a, Vlong b)
3337dd7cddfSDavid du Colombier {
3347dd7cddfSDavid du Colombier r->hi = a.hi & b.hi;
3357dd7cddfSDavid du Colombier r->lo = a.lo & b.lo;
3367dd7cddfSDavid du Colombier }
3377dd7cddfSDavid du Colombier
3387dd7cddfSDavid du Colombier void
_orv(Vlong * r,Vlong a,Vlong b)3397dd7cddfSDavid du Colombier _orv(Vlong *r, Vlong a, Vlong b)
3407dd7cddfSDavid du Colombier {
3417dd7cddfSDavid du Colombier r->hi = a.hi | b.hi;
3427dd7cddfSDavid du Colombier r->lo = a.lo | b.lo;
3437dd7cddfSDavid du Colombier }
3447dd7cddfSDavid du Colombier
3457dd7cddfSDavid du Colombier void
_xorv(Vlong * r,Vlong a,Vlong b)3467dd7cddfSDavid du Colombier _xorv(Vlong *r, Vlong a, Vlong b)
3477dd7cddfSDavid du Colombier {
3487dd7cddfSDavid du Colombier r->hi = a.hi ^ b.hi;
3497dd7cddfSDavid du Colombier r->lo = a.lo ^ b.lo;
3507dd7cddfSDavid du Colombier }
3517dd7cddfSDavid du Colombier
3527dd7cddfSDavid du Colombier void
_vpp(Vlong * l,Vlong * r)3537dd7cddfSDavid du Colombier _vpp(Vlong *l, Vlong *r)
3547dd7cddfSDavid du Colombier {
3557dd7cddfSDavid du Colombier
3567dd7cddfSDavid du Colombier l->hi = r->hi;
3577dd7cddfSDavid du Colombier l->lo = r->lo;
3587dd7cddfSDavid du Colombier r->lo++;
3597dd7cddfSDavid du Colombier if(r->lo == 0)
3607dd7cddfSDavid du Colombier r->hi++;
3617dd7cddfSDavid du Colombier }
3627dd7cddfSDavid du Colombier
3637dd7cddfSDavid du Colombier void
_vmm(Vlong * l,Vlong * r)3647dd7cddfSDavid du Colombier _vmm(Vlong *l, Vlong *r)
3657dd7cddfSDavid du Colombier {
3667dd7cddfSDavid du Colombier
3677dd7cddfSDavid du Colombier l->hi = r->hi;
3687dd7cddfSDavid du Colombier l->lo = r->lo;
3697dd7cddfSDavid du Colombier if(r->lo == 0)
3707dd7cddfSDavid du Colombier r->hi--;
3717dd7cddfSDavid du Colombier r->lo--;
3727dd7cddfSDavid du Colombier }
3737dd7cddfSDavid du Colombier
3747dd7cddfSDavid du Colombier void
_ppv(Vlong * l,Vlong * r)3757dd7cddfSDavid du Colombier _ppv(Vlong *l, Vlong *r)
3767dd7cddfSDavid du Colombier {
3777dd7cddfSDavid du Colombier
3787dd7cddfSDavid du Colombier r->lo++;
3797dd7cddfSDavid du Colombier if(r->lo == 0)
3807dd7cddfSDavid du Colombier r->hi++;
3817dd7cddfSDavid du Colombier l->hi = r->hi;
3827dd7cddfSDavid du Colombier l->lo = r->lo;
3837dd7cddfSDavid du Colombier }
3847dd7cddfSDavid du Colombier
3857dd7cddfSDavid du Colombier void
_mmv(Vlong * l,Vlong * r)3867dd7cddfSDavid du Colombier _mmv(Vlong *l, Vlong *r)
3877dd7cddfSDavid du Colombier {
3887dd7cddfSDavid du Colombier
3897dd7cddfSDavid du Colombier if(r->lo == 0)
3907dd7cddfSDavid du Colombier r->hi--;
3917dd7cddfSDavid du Colombier r->lo--;
3927dd7cddfSDavid du Colombier l->hi = r->hi;
3937dd7cddfSDavid du Colombier l->lo = r->lo;
3947dd7cddfSDavid du Colombier }
3957dd7cddfSDavid du Colombier
3967dd7cddfSDavid du Colombier void
_vasop(Vlong * ret,void * lv,void fn (Vlong *,Vlong,Vlong),int type,Vlong rv)3977dd7cddfSDavid du Colombier _vasop(Vlong *ret, void *lv, void fn(Vlong*, Vlong, Vlong), int type, Vlong rv)
3987dd7cddfSDavid du Colombier {
3997dd7cddfSDavid du Colombier Vlong t, u;
4007dd7cddfSDavid du Colombier
4017dd7cddfSDavid du Colombier u.lo = 0;
4027dd7cddfSDavid du Colombier u.hi = 0;
4037dd7cddfSDavid du Colombier switch(type) {
4047dd7cddfSDavid du Colombier default:
4057dd7cddfSDavid du Colombier abort();
4067dd7cddfSDavid du Colombier break;
4077dd7cddfSDavid du Colombier
4087dd7cddfSDavid du Colombier case 1: /* schar */
4097dd7cddfSDavid du Colombier t.lo = *(schar*)lv;
4107dd7cddfSDavid du Colombier t.hi = t.lo >> 31;
4117dd7cddfSDavid du Colombier fn(&u, t, rv);
4127dd7cddfSDavid du Colombier *(schar*)lv = u.lo;
4137dd7cddfSDavid du Colombier break;
4147dd7cddfSDavid du Colombier
4157dd7cddfSDavid du Colombier case 2: /* uchar */
4167dd7cddfSDavid du Colombier t.lo = *(uchar*)lv;
4177dd7cddfSDavid du Colombier t.hi = 0;
4187dd7cddfSDavid du Colombier fn(&u, t, rv);
4197dd7cddfSDavid du Colombier *(uchar*)lv = u.lo;
4207dd7cddfSDavid du Colombier break;
4217dd7cddfSDavid du Colombier
4227dd7cddfSDavid du Colombier case 3: /* short */
4237dd7cddfSDavid du Colombier t.lo = *(short*)lv;
4247dd7cddfSDavid du Colombier t.hi = t.lo >> 31;
4257dd7cddfSDavid du Colombier fn(&u, t, rv);
4267dd7cddfSDavid du Colombier *(short*)lv = u.lo;
4277dd7cddfSDavid du Colombier break;
4287dd7cddfSDavid du Colombier
4297dd7cddfSDavid du Colombier case 4: /* ushort */
4307dd7cddfSDavid du Colombier t.lo = *(ushort*)lv;
4317dd7cddfSDavid du Colombier t.hi = 0;
4327dd7cddfSDavid du Colombier fn(&u, t, rv);
4337dd7cddfSDavid du Colombier *(ushort*)lv = u.lo;
4347dd7cddfSDavid du Colombier break;
4357dd7cddfSDavid du Colombier
4367dd7cddfSDavid du Colombier case 9: /* int */
4377dd7cddfSDavid du Colombier t.lo = *(int*)lv;
4387dd7cddfSDavid du Colombier t.hi = t.lo >> 31;
4397dd7cddfSDavid du Colombier fn(&u, t, rv);
4407dd7cddfSDavid du Colombier *(int*)lv = u.lo;
4417dd7cddfSDavid du Colombier break;
4427dd7cddfSDavid du Colombier
4437dd7cddfSDavid du Colombier case 10: /* uint */
4447dd7cddfSDavid du Colombier t.lo = *(uint*)lv;
4457dd7cddfSDavid du Colombier t.hi = 0;
4467dd7cddfSDavid du Colombier fn(&u, t, rv);
4477dd7cddfSDavid du Colombier *(uint*)lv = u.lo;
4487dd7cddfSDavid du Colombier break;
4497dd7cddfSDavid du Colombier
4507dd7cddfSDavid du Colombier case 5: /* long */
4517dd7cddfSDavid du Colombier t.lo = *(long*)lv;
4527dd7cddfSDavid du Colombier t.hi = t.lo >> 31;
4537dd7cddfSDavid du Colombier fn(&u, t, rv);
4547dd7cddfSDavid du Colombier *(long*)lv = u.lo;
4557dd7cddfSDavid du Colombier break;
4567dd7cddfSDavid du Colombier
4577dd7cddfSDavid du Colombier case 6: /* ulong */
4587dd7cddfSDavid du Colombier t.lo = *(ulong*)lv;
4597dd7cddfSDavid du Colombier t.hi = 0;
4607dd7cddfSDavid du Colombier fn(&u, t, rv);
4617dd7cddfSDavid du Colombier *(ulong*)lv = u.lo;
4627dd7cddfSDavid du Colombier break;
4637dd7cddfSDavid du Colombier
4647dd7cddfSDavid du Colombier case 7: /* vlong */
4657dd7cddfSDavid du Colombier case 8: /* uvlong */
4667dd7cddfSDavid du Colombier fn(&u, *(Vlong*)lv, rv);
4677dd7cddfSDavid du Colombier *(Vlong*)lv = u;
4687dd7cddfSDavid du Colombier break;
4697dd7cddfSDavid du Colombier }
4707dd7cddfSDavid du Colombier *ret = u;
4717dd7cddfSDavid du Colombier }
4727dd7cddfSDavid du Colombier
4737dd7cddfSDavid du Colombier void
_p2v(Vlong * ret,void * p)4747dd7cddfSDavid du Colombier _p2v(Vlong *ret, void *p)
4757dd7cddfSDavid du Colombier {
4767dd7cddfSDavid du Colombier long t;
4777dd7cddfSDavid du Colombier
4787dd7cddfSDavid du Colombier t = (ulong)p;
4797dd7cddfSDavid du Colombier ret->lo = t;
4807dd7cddfSDavid du Colombier ret->hi = 0;
4817dd7cddfSDavid du Colombier }
4827dd7cddfSDavid du Colombier
4837dd7cddfSDavid du Colombier void
_sl2v(Vlong * ret,long sl)4847dd7cddfSDavid du Colombier _sl2v(Vlong *ret, long sl)
4857dd7cddfSDavid du Colombier {
4867dd7cddfSDavid du Colombier long t;
4877dd7cddfSDavid du Colombier
4887dd7cddfSDavid du Colombier t = sl;
4897dd7cddfSDavid du Colombier ret->lo = t;
4907dd7cddfSDavid du Colombier ret->hi = t >> 31;
4917dd7cddfSDavid du Colombier }
4927dd7cddfSDavid du Colombier
4937dd7cddfSDavid du Colombier void
_ul2v(Vlong * ret,ulong ul)4947dd7cddfSDavid du Colombier _ul2v(Vlong *ret, ulong ul)
4957dd7cddfSDavid du Colombier {
4967dd7cddfSDavid du Colombier long t;
4977dd7cddfSDavid du Colombier
4987dd7cddfSDavid du Colombier t = ul;
4997dd7cddfSDavid du Colombier ret->lo = t;
5007dd7cddfSDavid du Colombier ret->hi = 0;
5017dd7cddfSDavid du Colombier }
5027dd7cddfSDavid du Colombier
5037dd7cddfSDavid du Colombier void
_si2v(Vlong * ret,int si)5047dd7cddfSDavid du Colombier _si2v(Vlong *ret, int si)
5057dd7cddfSDavid du Colombier {
5067dd7cddfSDavid du Colombier long t;
5077dd7cddfSDavid du Colombier
5087dd7cddfSDavid du Colombier t = si;
5097dd7cddfSDavid du Colombier ret->lo = t;
5107dd7cddfSDavid du Colombier ret->hi = t >> 31;
5117dd7cddfSDavid du Colombier }
5127dd7cddfSDavid du Colombier
5137dd7cddfSDavid du Colombier void
_ui2v(Vlong * ret,uint ui)5147dd7cddfSDavid du Colombier _ui2v(Vlong *ret, uint ui)
5157dd7cddfSDavid du Colombier {
5167dd7cddfSDavid du Colombier long t;
5177dd7cddfSDavid du Colombier
5187dd7cddfSDavid du Colombier t = ui;
5197dd7cddfSDavid du Colombier ret->lo = t;
5207dd7cddfSDavid du Colombier ret->hi = 0;
5217dd7cddfSDavid du Colombier }
5227dd7cddfSDavid du Colombier
5237dd7cddfSDavid du Colombier void
_sh2v(Vlong * ret,long sh)5247dd7cddfSDavid du Colombier _sh2v(Vlong *ret, long sh)
5257dd7cddfSDavid du Colombier {
5267dd7cddfSDavid du Colombier long t;
5277dd7cddfSDavid du Colombier
5287dd7cddfSDavid du Colombier t = (sh << 16) >> 16;
5297dd7cddfSDavid du Colombier ret->lo = t;
5307dd7cddfSDavid du Colombier ret->hi = t >> 31;
5317dd7cddfSDavid du Colombier }
5327dd7cddfSDavid du Colombier
5337dd7cddfSDavid du Colombier void
_uh2v(Vlong * ret,ulong ul)5347dd7cddfSDavid du Colombier _uh2v(Vlong *ret, ulong ul)
5357dd7cddfSDavid du Colombier {
5367dd7cddfSDavid du Colombier long t;
5377dd7cddfSDavid du Colombier
5387dd7cddfSDavid du Colombier t = ul & 0xffff;
5397dd7cddfSDavid du Colombier ret->lo = t;
5407dd7cddfSDavid du Colombier ret->hi = 0;
5417dd7cddfSDavid du Colombier }
5427dd7cddfSDavid du Colombier
5437dd7cddfSDavid du Colombier void
_sc2v(Vlong * ret,long uc)5447dd7cddfSDavid du Colombier _sc2v(Vlong *ret, long uc)
5457dd7cddfSDavid du Colombier {
5467dd7cddfSDavid du Colombier long t;
5477dd7cddfSDavid du Colombier
5487dd7cddfSDavid du Colombier t = (uc << 24) >> 24;
5497dd7cddfSDavid du Colombier ret->lo = t;
5507dd7cddfSDavid du Colombier ret->hi = t >> 31;
5517dd7cddfSDavid du Colombier }
5527dd7cddfSDavid du Colombier
5537dd7cddfSDavid du Colombier void
_uc2v(Vlong * ret,ulong ul)5547dd7cddfSDavid du Colombier _uc2v(Vlong *ret, ulong ul)
5557dd7cddfSDavid du Colombier {
5567dd7cddfSDavid du Colombier long t;
5577dd7cddfSDavid du Colombier
5587dd7cddfSDavid du Colombier t = ul & 0xff;
5597dd7cddfSDavid du Colombier ret->lo = t;
5607dd7cddfSDavid du Colombier ret->hi = 0;
5617dd7cddfSDavid du Colombier }
5627dd7cddfSDavid du Colombier
5637dd7cddfSDavid du Colombier long
_v2sc(Vlong rv)5647dd7cddfSDavid du Colombier _v2sc(Vlong rv)
5657dd7cddfSDavid du Colombier {
5667dd7cddfSDavid du Colombier long t;
5677dd7cddfSDavid du Colombier
5687dd7cddfSDavid du Colombier t = rv.lo & 0xff;
5697dd7cddfSDavid du Colombier return (t << 24) >> 24;
5707dd7cddfSDavid du Colombier }
5717dd7cddfSDavid du Colombier
5727dd7cddfSDavid du Colombier long
_v2uc(Vlong rv)5737dd7cddfSDavid du Colombier _v2uc(Vlong rv)
5747dd7cddfSDavid du Colombier {
5757dd7cddfSDavid du Colombier
5767dd7cddfSDavid du Colombier return rv.lo & 0xff;
5777dd7cddfSDavid du Colombier }
5787dd7cddfSDavid du Colombier
5797dd7cddfSDavid du Colombier long
_v2sh(Vlong rv)5807dd7cddfSDavid du Colombier _v2sh(Vlong rv)
5817dd7cddfSDavid du Colombier {
5827dd7cddfSDavid du Colombier long t;
5837dd7cddfSDavid du Colombier
5847dd7cddfSDavid du Colombier t = rv.lo & 0xffff;
5857dd7cddfSDavid du Colombier return (t << 16) >> 16;
5867dd7cddfSDavid du Colombier }
5877dd7cddfSDavid du Colombier
5887dd7cddfSDavid du Colombier long
_v2uh(Vlong rv)5897dd7cddfSDavid du Colombier _v2uh(Vlong rv)
5907dd7cddfSDavid du Colombier {
5917dd7cddfSDavid du Colombier
5927dd7cddfSDavid du Colombier return rv.lo & 0xffff;
5937dd7cddfSDavid du Colombier }
5947dd7cddfSDavid du Colombier
5957dd7cddfSDavid du Colombier long
_v2sl(Vlong rv)5967dd7cddfSDavid du Colombier _v2sl(Vlong rv)
5977dd7cddfSDavid du Colombier {
5987dd7cddfSDavid du Colombier
5997dd7cddfSDavid du Colombier return rv.lo;
6007dd7cddfSDavid du Colombier }
6017dd7cddfSDavid du Colombier
6027dd7cddfSDavid du Colombier long
_v2ul(Vlong rv)6037dd7cddfSDavid du Colombier _v2ul(Vlong rv)
6047dd7cddfSDavid du Colombier {
6057dd7cddfSDavid du Colombier
6067dd7cddfSDavid du Colombier return rv.lo;
6077dd7cddfSDavid du Colombier }
6087dd7cddfSDavid du Colombier
6097dd7cddfSDavid du Colombier long
_v2si(Vlong rv)6107dd7cddfSDavid du Colombier _v2si(Vlong rv)
6117dd7cddfSDavid du Colombier {
6127dd7cddfSDavid du Colombier
6137dd7cddfSDavid du Colombier return rv.lo;
6147dd7cddfSDavid du Colombier }
6157dd7cddfSDavid du Colombier
6167dd7cddfSDavid du Colombier long
_v2ui(Vlong rv)6177dd7cddfSDavid du Colombier _v2ui(Vlong rv)
6187dd7cddfSDavid du Colombier {
6197dd7cddfSDavid du Colombier
6207dd7cddfSDavid du Colombier return rv.lo;
6217dd7cddfSDavid du Colombier }
6227dd7cddfSDavid du Colombier
6237dd7cddfSDavid du Colombier int
_testv(Vlong rv)6247dd7cddfSDavid du Colombier _testv(Vlong rv)
6257dd7cddfSDavid du Colombier {
6267dd7cddfSDavid du Colombier return rv.lo || rv.hi;
6277dd7cddfSDavid du Colombier }
6287dd7cddfSDavid du Colombier
6297dd7cddfSDavid du Colombier int
_eqv(Vlong lv,Vlong rv)6307dd7cddfSDavid du Colombier _eqv(Vlong lv, Vlong rv)
6317dd7cddfSDavid du Colombier {
6327dd7cddfSDavid du Colombier return lv.lo == rv.lo && lv.hi == rv.hi;
6337dd7cddfSDavid du Colombier }
6347dd7cddfSDavid du Colombier
6357dd7cddfSDavid du Colombier int
_nev(Vlong lv,Vlong rv)6367dd7cddfSDavid du Colombier _nev(Vlong lv, Vlong rv)
6377dd7cddfSDavid du Colombier {
6387dd7cddfSDavid du Colombier return lv.lo != rv.lo || lv.hi != rv.hi;
6397dd7cddfSDavid du Colombier }
6407dd7cddfSDavid du Colombier
6417dd7cddfSDavid du Colombier int
_ltv(Vlong lv,Vlong rv)6427dd7cddfSDavid du Colombier _ltv(Vlong lv, Vlong rv)
6437dd7cddfSDavid du Colombier {
6447dd7cddfSDavid du Colombier return (long)lv.hi < (long)rv.hi ||
6457dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo < rv.lo);
6467dd7cddfSDavid du Colombier }
6477dd7cddfSDavid du Colombier
6487dd7cddfSDavid du Colombier int
_lev(Vlong lv,Vlong rv)6497dd7cddfSDavid du Colombier _lev(Vlong lv, Vlong rv)
6507dd7cddfSDavid du Colombier {
6517dd7cddfSDavid du Colombier return (long)lv.hi < (long)rv.hi ||
6527dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo <= rv.lo);
6537dd7cddfSDavid du Colombier }
6547dd7cddfSDavid du Colombier
6557dd7cddfSDavid du Colombier int
_gtv(Vlong lv,Vlong rv)6567dd7cddfSDavid du Colombier _gtv(Vlong lv, Vlong rv)
6577dd7cddfSDavid du Colombier {
6587dd7cddfSDavid du Colombier return (long)lv.hi > (long)rv.hi ||
6597dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo > rv.lo);
6607dd7cddfSDavid du Colombier }
6617dd7cddfSDavid du Colombier
6627dd7cddfSDavid du Colombier int
_gev(Vlong lv,Vlong rv)6637dd7cddfSDavid du Colombier _gev(Vlong lv, Vlong rv)
6647dd7cddfSDavid du Colombier {
6657dd7cddfSDavid du Colombier return (long)lv.hi > (long)rv.hi ||
6667dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo >= rv.lo);
6677dd7cddfSDavid du Colombier }
6687dd7cddfSDavid du Colombier
6697dd7cddfSDavid du Colombier int
_lov(Vlong lv,Vlong rv)6707dd7cddfSDavid du Colombier _lov(Vlong lv, Vlong rv)
6717dd7cddfSDavid du Colombier {
6727dd7cddfSDavid du Colombier return lv.hi < rv.hi ||
6737dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo < rv.lo);
6747dd7cddfSDavid du Colombier }
6757dd7cddfSDavid du Colombier
6767dd7cddfSDavid du Colombier int
_lsv(Vlong lv,Vlong rv)6777dd7cddfSDavid du Colombier _lsv(Vlong lv, Vlong rv)
6787dd7cddfSDavid du Colombier {
6797dd7cddfSDavid du Colombier return lv.hi < rv.hi ||
6807dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo <= rv.lo);
6817dd7cddfSDavid du Colombier }
6827dd7cddfSDavid du Colombier
6837dd7cddfSDavid du Colombier int
_hiv(Vlong lv,Vlong rv)6847dd7cddfSDavid du Colombier _hiv(Vlong lv, Vlong rv)
6857dd7cddfSDavid du Colombier {
6867dd7cddfSDavid du Colombier return lv.hi > rv.hi ||
6877dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo > rv.lo);
6887dd7cddfSDavid du Colombier }
6897dd7cddfSDavid du Colombier
6907dd7cddfSDavid du Colombier int
_hsv(Vlong lv,Vlong rv)6917dd7cddfSDavid du Colombier _hsv(Vlong lv, Vlong rv)
6927dd7cddfSDavid du Colombier {
6937dd7cddfSDavid du Colombier return lv.hi > rv.hi ||
6947dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo >= rv.lo);
6957dd7cddfSDavid du Colombier }
696