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