xref: /plan9-contrib/sys/src/ape/lib/ap/mips64/vlrt.c (revision 6c6e36e1134c52b146e9d71d8c7dc193994c0c4e)
1*6c6e36e1SDavid du Colombier typedef	unsigned long	ulong;
2*6c6e36e1SDavid du Colombier typedef	unsigned int	uint;
3*6c6e36e1SDavid du Colombier typedef	unsigned short	ushort;
4*6c6e36e1SDavid du Colombier typedef	unsigned char	uchar;
5*6c6e36e1SDavid du Colombier typedef	signed char	schar;
6*6c6e36e1SDavid du Colombier 
7*6c6e36e1SDavid du Colombier #define	SIGN(n)	(1UL<<(n-1))
8*6c6e36e1SDavid du Colombier 
9*6c6e36e1SDavid du Colombier typedef	struct	Vlong	Vlong;
10*6c6e36e1SDavid du Colombier struct	Vlong
11*6c6e36e1SDavid du Colombier {
12*6c6e36e1SDavid du Colombier 	union
13*6c6e36e1SDavid du Colombier 	{
14*6c6e36e1SDavid du Colombier 		struct
15*6c6e36e1SDavid du Colombier 		{
16*6c6e36e1SDavid du Colombier 			ulong	hi;
17*6c6e36e1SDavid du Colombier 			ulong	lo;
18*6c6e36e1SDavid du Colombier 		};
19*6c6e36e1SDavid du Colombier 		struct
20*6c6e36e1SDavid du Colombier 		{
21*6c6e36e1SDavid du Colombier 			ushort	hims;
22*6c6e36e1SDavid du Colombier 			ushort	hils;
23*6c6e36e1SDavid du Colombier 			ushort	loms;
24*6c6e36e1SDavid du Colombier 			ushort	lols;
25*6c6e36e1SDavid du Colombier 		};
26*6c6e36e1SDavid du Colombier 	};
27*6c6e36e1SDavid du Colombier };
28*6c6e36e1SDavid du Colombier 
29*6c6e36e1SDavid du Colombier void	abort(void);
30*6c6e36e1SDavid du Colombier 
31*6c6e36e1SDavid du Colombier void
_addv(Vlong * r,Vlong a,Vlong b)32*6c6e36e1SDavid du Colombier _addv(Vlong *r, Vlong a, Vlong b)
33*6c6e36e1SDavid du Colombier {
34*6c6e36e1SDavid du Colombier 	ulong lo, hi;
35*6c6e36e1SDavid du Colombier 
36*6c6e36e1SDavid du Colombier 	lo = a.lo + b.lo;
37*6c6e36e1SDavid du Colombier 	hi = a.hi + b.hi;
38*6c6e36e1SDavid du Colombier 	if(lo < a.lo)
39*6c6e36e1SDavid du Colombier 		hi++;
40*6c6e36e1SDavid du Colombier 	r->lo = lo;
41*6c6e36e1SDavid du Colombier 	r->hi = hi;
42*6c6e36e1SDavid du Colombier }
43*6c6e36e1SDavid du Colombier 
44*6c6e36e1SDavid du Colombier void
_subv(Vlong * r,Vlong a,Vlong b)45*6c6e36e1SDavid du Colombier _subv(Vlong *r, Vlong a, Vlong b)
46*6c6e36e1SDavid du Colombier {
47*6c6e36e1SDavid du Colombier 	ulong lo, hi;
48*6c6e36e1SDavid du Colombier 
49*6c6e36e1SDavid du Colombier 	lo = a.lo - b.lo;
50*6c6e36e1SDavid du Colombier 	hi = a.hi - b.hi;
51*6c6e36e1SDavid du Colombier 	if(lo > a.lo)
52*6c6e36e1SDavid du Colombier 		hi--;
53*6c6e36e1SDavid du Colombier 	r->lo = lo;
54*6c6e36e1SDavid du Colombier 	r->hi = hi;
55*6c6e36e1SDavid du Colombier }
56*6c6e36e1SDavid du Colombier 
57*6c6e36e1SDavid du Colombier void
_d2v(Vlong * y,double d)58*6c6e36e1SDavid du Colombier _d2v(Vlong *y, double d)
59*6c6e36e1SDavid du Colombier {
60*6c6e36e1SDavid du Colombier 	union { double d; struct Vlong; } x;
61*6c6e36e1SDavid du Colombier 	ulong xhi, xlo, ylo, yhi;
62*6c6e36e1SDavid du Colombier 	int sh;
63*6c6e36e1SDavid du Colombier 
64*6c6e36e1SDavid du Colombier 	x.d = d;
65*6c6e36e1SDavid du Colombier 
66*6c6e36e1SDavid du Colombier 	xhi = (x.hi & 0xfffff) | 0x100000;
67*6c6e36e1SDavid du Colombier 	xlo = x.lo;
68*6c6e36e1SDavid du Colombier 	sh = 1075 - ((x.hi >> 20) & 0x7ff);
69*6c6e36e1SDavid du Colombier 
70*6c6e36e1SDavid du Colombier 	ylo = 0;
71*6c6e36e1SDavid du Colombier 	yhi = 0;
72*6c6e36e1SDavid du Colombier 	if(sh >= 0) {
73*6c6e36e1SDavid du Colombier 		/* v = (hi||lo) >> sh */
74*6c6e36e1SDavid du Colombier 		if(sh < 32) {
75*6c6e36e1SDavid du Colombier 			if(sh == 0) {
76*6c6e36e1SDavid du Colombier 				ylo = xlo;
77*6c6e36e1SDavid du Colombier 				yhi = xhi;
78*6c6e36e1SDavid du Colombier 			} else {
79*6c6e36e1SDavid du Colombier 				ylo = (xlo >> sh) | (xhi << (32-sh));
80*6c6e36e1SDavid du Colombier 				yhi = xhi >> sh;
81*6c6e36e1SDavid du Colombier 			}
82*6c6e36e1SDavid du Colombier 		} else {
83*6c6e36e1SDavid du Colombier 			if(sh == 32) {
84*6c6e36e1SDavid du Colombier 				ylo = xhi;
85*6c6e36e1SDavid du Colombier 			} else
86*6c6e36e1SDavid du Colombier 			if(sh < 64) {
87*6c6e36e1SDavid du Colombier 				ylo = xhi >> (sh-32);
88*6c6e36e1SDavid du Colombier 			}
89*6c6e36e1SDavid du Colombier 		}
90*6c6e36e1SDavid du Colombier 	} else {
91*6c6e36e1SDavid du Colombier 		/* v = (hi||lo) << -sh */
92*6c6e36e1SDavid du Colombier 		sh = -sh;
93*6c6e36e1SDavid du Colombier 		if(sh <= 10) {
94*6c6e36e1SDavid du Colombier 			ylo = xlo << sh;
95*6c6e36e1SDavid du Colombier 			yhi = (xhi << sh) | (xlo >> (32-sh));
96*6c6e36e1SDavid du Colombier 		} else {
97*6c6e36e1SDavid du Colombier 			/* overflow */
98*6c6e36e1SDavid du Colombier 			yhi = d;	/* causes something awful */
99*6c6e36e1SDavid du Colombier 		}
100*6c6e36e1SDavid du Colombier 	}
101*6c6e36e1SDavid du Colombier 	if(x.hi & SIGN(32)) {
102*6c6e36e1SDavid du Colombier 		if(ylo != 0) {
103*6c6e36e1SDavid du Colombier 			ylo = -ylo;
104*6c6e36e1SDavid du Colombier 			yhi = ~yhi;
105*6c6e36e1SDavid du Colombier 		} else
106*6c6e36e1SDavid du Colombier 			yhi = -yhi;
107*6c6e36e1SDavid du Colombier 	}
108*6c6e36e1SDavid du Colombier 
109*6c6e36e1SDavid du Colombier 	y->hi = yhi;
110*6c6e36e1SDavid du Colombier 	y->lo = ylo;
111*6c6e36e1SDavid du Colombier }
112*6c6e36e1SDavid du Colombier 
113*6c6e36e1SDavid du Colombier void
_f2v(Vlong * y,float f)114*6c6e36e1SDavid du Colombier _f2v(Vlong *y, float f)
115*6c6e36e1SDavid du Colombier {
116*6c6e36e1SDavid du Colombier 
117*6c6e36e1SDavid du Colombier 	_d2v(y, f);
118*6c6e36e1SDavid du Colombier }
119*6c6e36e1SDavid du Colombier 
120*6c6e36e1SDavid du Colombier double
_v2d(Vlong x)121*6c6e36e1SDavid du Colombier _v2d(Vlong x)
122*6c6e36e1SDavid du Colombier {
123*6c6e36e1SDavid du Colombier 	if(x.hi & SIGN(32)) {
124*6c6e36e1SDavid du Colombier 		if(x.lo) {
125*6c6e36e1SDavid du Colombier 			x.lo = -x.lo;
126*6c6e36e1SDavid du Colombier 			x.hi = ~x.hi;
127*6c6e36e1SDavid du Colombier 		} else
128*6c6e36e1SDavid du Colombier 			x.hi = -x.hi;
129*6c6e36e1SDavid du Colombier 		return -((long)x.hi*4294967296. + x.lo);
130*6c6e36e1SDavid du Colombier 	}
131*6c6e36e1SDavid du Colombier 	return (long)x.hi*4294967296. + x.lo;
132*6c6e36e1SDavid du Colombier }
133*6c6e36e1SDavid du Colombier 
134*6c6e36e1SDavid du Colombier float
_v2f(Vlong x)135*6c6e36e1SDavid du Colombier _v2f(Vlong x)
136*6c6e36e1SDavid du Colombier {
137*6c6e36e1SDavid du Colombier 	return _v2d(x);
138*6c6e36e1SDavid du Colombier }
139*6c6e36e1SDavid du Colombier 
140*6c6e36e1SDavid du Colombier static void
dodiv(Vlong num,Vlong den,Vlong * qp,Vlong * rp)141*6c6e36e1SDavid du Colombier dodiv(Vlong num, Vlong den, Vlong *qp, Vlong *rp)
142*6c6e36e1SDavid du Colombier {
143*6c6e36e1SDavid du Colombier 	ulong numlo, numhi, denhi, denlo, quohi, quolo, t;
144*6c6e36e1SDavid du Colombier 	int i;
145*6c6e36e1SDavid du Colombier 
146*6c6e36e1SDavid du Colombier 	numhi = num.hi;
147*6c6e36e1SDavid du Colombier 	numlo = num.lo;
148*6c6e36e1SDavid du Colombier 	denhi = den.hi;
149*6c6e36e1SDavid du Colombier 	denlo = den.lo;
150*6c6e36e1SDavid du Colombier 
151*6c6e36e1SDavid du Colombier 	/*
152*6c6e36e1SDavid du Colombier 	 * get a divide by zero
153*6c6e36e1SDavid du Colombier 	 */
154*6c6e36e1SDavid du Colombier 	if(denlo==0 && denhi==0) {
155*6c6e36e1SDavid du Colombier 		numlo = numlo / denlo;
156*6c6e36e1SDavid du Colombier 	}
157*6c6e36e1SDavid du Colombier 
158*6c6e36e1SDavid du Colombier 	/*
159*6c6e36e1SDavid du Colombier 	 * set up the divisor and find the number of iterations needed
160*6c6e36e1SDavid du Colombier 	 */
161*6c6e36e1SDavid du Colombier 	if(numhi >= SIGN(32)) {
162*6c6e36e1SDavid du Colombier 		quohi = SIGN(32);
163*6c6e36e1SDavid du Colombier 		quolo = 0;
164*6c6e36e1SDavid du Colombier 	} else {
165*6c6e36e1SDavid du Colombier 		quohi = numhi;
166*6c6e36e1SDavid du Colombier 		quolo = numlo;
167*6c6e36e1SDavid du Colombier 	}
168*6c6e36e1SDavid du Colombier 	i = 0;
169*6c6e36e1SDavid du Colombier 	while(denhi < quohi || (denhi == quohi && denlo < quolo)) {
170*6c6e36e1SDavid du Colombier 		denhi = (denhi<<1) | (denlo>>31);
171*6c6e36e1SDavid du Colombier 		denlo <<= 1;
172*6c6e36e1SDavid du Colombier 		i++;
173*6c6e36e1SDavid du Colombier 	}
174*6c6e36e1SDavid du Colombier 
175*6c6e36e1SDavid du Colombier 	quohi = 0;
176*6c6e36e1SDavid du Colombier 	quolo = 0;
177*6c6e36e1SDavid du Colombier 	for(; i >= 0; i--) {
178*6c6e36e1SDavid du Colombier 		quohi = (quohi<<1) | (quolo>>31);
179*6c6e36e1SDavid du Colombier 		quolo <<= 1;
180*6c6e36e1SDavid du Colombier 		if(numhi > denhi || (numhi == denhi && numlo >= denlo)) {
181*6c6e36e1SDavid du Colombier 			t = numlo;
182*6c6e36e1SDavid du Colombier 			numlo -= denlo;
183*6c6e36e1SDavid du Colombier 			if(numlo > t)
184*6c6e36e1SDavid du Colombier 				numhi--;
185*6c6e36e1SDavid du Colombier 			numhi -= denhi;
186*6c6e36e1SDavid du Colombier 			quolo |= 1;
187*6c6e36e1SDavid du Colombier 		}
188*6c6e36e1SDavid du Colombier 		denlo = (denlo>>1) | (denhi<<31);
189*6c6e36e1SDavid du Colombier 		denhi >>= 1;
190*6c6e36e1SDavid du Colombier 	}
191*6c6e36e1SDavid du Colombier 
192*6c6e36e1SDavid du Colombier 	if(qp) {
193*6c6e36e1SDavid du Colombier 		qp->lo = quolo;
194*6c6e36e1SDavid du Colombier 		qp->hi = quohi;
195*6c6e36e1SDavid du Colombier 	}
196*6c6e36e1SDavid du Colombier 	if(rp) {
197*6c6e36e1SDavid du Colombier 		rp->lo = numlo;
198*6c6e36e1SDavid du Colombier 		rp->hi = numhi;
199*6c6e36e1SDavid du Colombier 	}
200*6c6e36e1SDavid du Colombier }
201*6c6e36e1SDavid du Colombier 
202*6c6e36e1SDavid du Colombier void
_divvu(Vlong * q,Vlong n,Vlong d)203*6c6e36e1SDavid du Colombier _divvu(Vlong *q, Vlong n, Vlong d)
204*6c6e36e1SDavid du Colombier {
205*6c6e36e1SDavid du Colombier 
206*6c6e36e1SDavid du Colombier 	if(n.hi == 0 && d.hi == 0) {
207*6c6e36e1SDavid du Colombier 		q->hi = 0;
208*6c6e36e1SDavid du Colombier 		q->lo = n.lo / d.lo;
209*6c6e36e1SDavid du Colombier 		return;
210*6c6e36e1SDavid du Colombier 	}
211*6c6e36e1SDavid du Colombier 	dodiv(n, d, q, 0);
212*6c6e36e1SDavid du Colombier }
213*6c6e36e1SDavid du Colombier 
214*6c6e36e1SDavid du Colombier void
_modvu(Vlong * r,Vlong n,Vlong d)215*6c6e36e1SDavid du Colombier _modvu(Vlong *r, Vlong n, Vlong d)
216*6c6e36e1SDavid du Colombier {
217*6c6e36e1SDavid du Colombier 
218*6c6e36e1SDavid du Colombier 	if(n.hi == 0 && d.hi == 0) {
219*6c6e36e1SDavid du Colombier 		r->hi = 0;
220*6c6e36e1SDavid du Colombier 		r->lo = n.lo % d.lo;
221*6c6e36e1SDavid du Colombier 		return;
222*6c6e36e1SDavid du Colombier 	}
223*6c6e36e1SDavid du Colombier 	dodiv(n, d, 0, r);
224*6c6e36e1SDavid du Colombier }
225*6c6e36e1SDavid du Colombier 
226*6c6e36e1SDavid du Colombier static void
vneg(Vlong * v)227*6c6e36e1SDavid du Colombier vneg(Vlong *v)
228*6c6e36e1SDavid du Colombier {
229*6c6e36e1SDavid du Colombier 
230*6c6e36e1SDavid du Colombier 	if(v->lo == 0) {
231*6c6e36e1SDavid du Colombier 		v->hi = -v->hi;
232*6c6e36e1SDavid du Colombier 		return;
233*6c6e36e1SDavid du Colombier 	}
234*6c6e36e1SDavid du Colombier 	v->lo = -v->lo;
235*6c6e36e1SDavid du Colombier 	v->hi = ~v->hi;
236*6c6e36e1SDavid du Colombier }
237*6c6e36e1SDavid du Colombier 
238*6c6e36e1SDavid du Colombier void
_divv(Vlong * q,Vlong n,Vlong d)239*6c6e36e1SDavid du Colombier _divv(Vlong *q, Vlong n, Vlong d)
240*6c6e36e1SDavid du Colombier {
241*6c6e36e1SDavid du Colombier 	long nneg, dneg;
242*6c6e36e1SDavid du Colombier 
243*6c6e36e1SDavid du Colombier 	if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
244*6c6e36e1SDavid du Colombier 		q->lo = (long)n.lo / (long)d.lo;
245*6c6e36e1SDavid du Colombier 		q->hi = ((long)q->lo) >> 31;
246*6c6e36e1SDavid du Colombier 		return;
247*6c6e36e1SDavid du Colombier 	}
248*6c6e36e1SDavid du Colombier 	nneg = n.hi >> 31;
249*6c6e36e1SDavid du Colombier 	if(nneg)
250*6c6e36e1SDavid du Colombier 		vneg(&n);
251*6c6e36e1SDavid du Colombier 	dneg = d.hi >> 31;
252*6c6e36e1SDavid du Colombier 	if(dneg)
253*6c6e36e1SDavid du Colombier 		vneg(&d);
254*6c6e36e1SDavid du Colombier 	dodiv(n, d, q, 0);
255*6c6e36e1SDavid du Colombier 	if(nneg != dneg)
256*6c6e36e1SDavid du Colombier 		vneg(q);
257*6c6e36e1SDavid du Colombier }
258*6c6e36e1SDavid du Colombier 
259*6c6e36e1SDavid du Colombier void
_modv(Vlong * r,Vlong n,Vlong d)260*6c6e36e1SDavid du Colombier _modv(Vlong *r, Vlong n, Vlong d)
261*6c6e36e1SDavid du Colombier {
262*6c6e36e1SDavid du Colombier 	long nneg, dneg;
263*6c6e36e1SDavid du Colombier 
264*6c6e36e1SDavid du Colombier 	if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
265*6c6e36e1SDavid du Colombier 		r->lo = (long)n.lo % (long)d.lo;
266*6c6e36e1SDavid du Colombier 		r->hi = ((long)r->lo) >> 31;
267*6c6e36e1SDavid du Colombier 		return;
268*6c6e36e1SDavid du Colombier 	}
269*6c6e36e1SDavid du Colombier 	nneg = n.hi >> 31;
270*6c6e36e1SDavid du Colombier 	if(nneg)
271*6c6e36e1SDavid du Colombier 		vneg(&n);
272*6c6e36e1SDavid du Colombier 	dneg = d.hi >> 31;
273*6c6e36e1SDavid du Colombier 	if(dneg)
274*6c6e36e1SDavid du Colombier 		vneg(&d);
275*6c6e36e1SDavid du Colombier 	dodiv(n, d, 0, r);
276*6c6e36e1SDavid du Colombier 	if(nneg)
277*6c6e36e1SDavid du Colombier 		vneg(r);
278*6c6e36e1SDavid du Colombier }
279*6c6e36e1SDavid du Colombier 
280*6c6e36e1SDavid du Colombier void
_rshav(Vlong * r,Vlong a,int b)281*6c6e36e1SDavid du Colombier _rshav(Vlong *r, Vlong a, int b)
282*6c6e36e1SDavid du Colombier {
283*6c6e36e1SDavid du Colombier 	long t;
284*6c6e36e1SDavid du Colombier 
285*6c6e36e1SDavid du Colombier 	t = a.hi;
286*6c6e36e1SDavid du Colombier 	if(b >= 32) {
287*6c6e36e1SDavid du Colombier 		r->hi = t>>31;
288*6c6e36e1SDavid du Colombier 		if(b >= 64) {
289*6c6e36e1SDavid du Colombier 			/* this is illegal re C standard */
290*6c6e36e1SDavid du Colombier 			r->lo = t>>31;
291*6c6e36e1SDavid du Colombier 			return;
292*6c6e36e1SDavid du Colombier 		}
293*6c6e36e1SDavid du Colombier 		r->lo = t >> (b-32);
294*6c6e36e1SDavid du Colombier 		return;
295*6c6e36e1SDavid du Colombier 	}
296*6c6e36e1SDavid du Colombier 	if(b <= 0) {
297*6c6e36e1SDavid du Colombier 		r->hi = t;
298*6c6e36e1SDavid du Colombier 		r->lo = a.lo;
299*6c6e36e1SDavid du Colombier 		return;
300*6c6e36e1SDavid du Colombier 	}
301*6c6e36e1SDavid du Colombier 	r->hi = t >> b;
302*6c6e36e1SDavid du Colombier 	r->lo = (t << (32-b)) | (a.lo >> b);
303*6c6e36e1SDavid du Colombier }
304*6c6e36e1SDavid du Colombier 
305*6c6e36e1SDavid du Colombier void
_rshlv(Vlong * r,Vlong a,int b)306*6c6e36e1SDavid du Colombier _rshlv(Vlong *r, Vlong a, int b)
307*6c6e36e1SDavid du Colombier {
308*6c6e36e1SDavid du Colombier 	ulong t;
309*6c6e36e1SDavid du Colombier 
310*6c6e36e1SDavid du Colombier 	t = a.hi;
311*6c6e36e1SDavid du Colombier 	if(b >= 32) {
312*6c6e36e1SDavid du Colombier 		r->hi = 0;
313*6c6e36e1SDavid du Colombier 		if(b >= 64) {
314*6c6e36e1SDavid du Colombier 			/* this is illegal re C standard */
315*6c6e36e1SDavid du Colombier 			r->lo = 0;
316*6c6e36e1SDavid du Colombier 			return;
317*6c6e36e1SDavid du Colombier 		}
318*6c6e36e1SDavid du Colombier 		r->lo = t >> (b-32);
319*6c6e36e1SDavid du Colombier 		return;
320*6c6e36e1SDavid du Colombier 	}
321*6c6e36e1SDavid du Colombier 	if(b <= 0) {
322*6c6e36e1SDavid du Colombier 		r->hi = t;
323*6c6e36e1SDavid du Colombier 		r->lo = a.lo;
324*6c6e36e1SDavid du Colombier 		return;
325*6c6e36e1SDavid du Colombier 	}
326*6c6e36e1SDavid du Colombier 	r->hi = t >> b;
327*6c6e36e1SDavid du Colombier 	r->lo = (t << (32-b)) | (a.lo >> b);
328*6c6e36e1SDavid du Colombier }
329*6c6e36e1SDavid du Colombier 
330*6c6e36e1SDavid du Colombier void
_lshv(Vlong * r,Vlong a,int b)331*6c6e36e1SDavid du Colombier _lshv(Vlong *r, Vlong a, int b)
332*6c6e36e1SDavid du Colombier {
333*6c6e36e1SDavid du Colombier 	ulong t;
334*6c6e36e1SDavid du Colombier 
335*6c6e36e1SDavid du Colombier 	t = a.lo;
336*6c6e36e1SDavid du Colombier 	if(b >= 32) {
337*6c6e36e1SDavid du Colombier 		r->lo = 0;
338*6c6e36e1SDavid du Colombier 		if(b >= 64) {
339*6c6e36e1SDavid du Colombier 			/* this is illegal re C standard */
340*6c6e36e1SDavid du Colombier 			r->hi = 0;
341*6c6e36e1SDavid du Colombier 			return;
342*6c6e36e1SDavid du Colombier 		}
343*6c6e36e1SDavid du Colombier 		r->hi = t << (b-32);
344*6c6e36e1SDavid du Colombier 		return;
345*6c6e36e1SDavid du Colombier 	}
346*6c6e36e1SDavid du Colombier 	if(b <= 0) {
347*6c6e36e1SDavid du Colombier 		r->lo = t;
348*6c6e36e1SDavid du Colombier 		r->hi = a.hi;
349*6c6e36e1SDavid du Colombier 		return;
350*6c6e36e1SDavid du Colombier 	}
351*6c6e36e1SDavid du Colombier 	r->lo = t << b;
352*6c6e36e1SDavid du Colombier 	r->hi = (t >> (32-b)) | (a.hi << b);
353*6c6e36e1SDavid du Colombier }
354*6c6e36e1SDavid du Colombier 
355*6c6e36e1SDavid du Colombier void
_andv(Vlong * r,Vlong a,Vlong b)356*6c6e36e1SDavid du Colombier _andv(Vlong *r, Vlong a, Vlong b)
357*6c6e36e1SDavid du Colombier {
358*6c6e36e1SDavid du Colombier 	r->hi = a.hi & b.hi;
359*6c6e36e1SDavid du Colombier 	r->lo = a.lo & b.lo;
360*6c6e36e1SDavid du Colombier }
361*6c6e36e1SDavid du Colombier 
362*6c6e36e1SDavid du Colombier void
_orv(Vlong * r,Vlong a,Vlong b)363*6c6e36e1SDavid du Colombier _orv(Vlong *r, Vlong a, Vlong b)
364*6c6e36e1SDavid du Colombier {
365*6c6e36e1SDavid du Colombier 	r->hi = a.hi | b.hi;
366*6c6e36e1SDavid du Colombier 	r->lo = a.lo | b.lo;
367*6c6e36e1SDavid du Colombier }
368*6c6e36e1SDavid du Colombier 
369*6c6e36e1SDavid du Colombier void
_xorv(Vlong * r,Vlong a,Vlong b)370*6c6e36e1SDavid du Colombier _xorv(Vlong *r, Vlong a, Vlong b)
371*6c6e36e1SDavid du Colombier {
372*6c6e36e1SDavid du Colombier 	r->hi = a.hi ^ b.hi;
373*6c6e36e1SDavid du Colombier 	r->lo = a.lo ^ b.lo;
374*6c6e36e1SDavid du Colombier }
375*6c6e36e1SDavid du Colombier 
376*6c6e36e1SDavid du Colombier void
_vpp(Vlong * l,Vlong * r)377*6c6e36e1SDavid du Colombier _vpp(Vlong *l, Vlong *r)
378*6c6e36e1SDavid du Colombier {
379*6c6e36e1SDavid du Colombier 
380*6c6e36e1SDavid du Colombier 	l->hi = r->hi;
381*6c6e36e1SDavid du Colombier 	l->lo = r->lo;
382*6c6e36e1SDavid du Colombier 	r->lo++;
383*6c6e36e1SDavid du Colombier 	if(r->lo == 0)
384*6c6e36e1SDavid du Colombier 		r->hi++;
385*6c6e36e1SDavid du Colombier }
386*6c6e36e1SDavid du Colombier 
387*6c6e36e1SDavid du Colombier void
_vmm(Vlong * l,Vlong * r)388*6c6e36e1SDavid du Colombier _vmm(Vlong *l, Vlong *r)
389*6c6e36e1SDavid du Colombier {
390*6c6e36e1SDavid du Colombier 
391*6c6e36e1SDavid du Colombier 	l->hi = r->hi;
392*6c6e36e1SDavid du Colombier 	l->lo = r->lo;
393*6c6e36e1SDavid du Colombier 	if(r->lo == 0)
394*6c6e36e1SDavid du Colombier 		r->hi--;
395*6c6e36e1SDavid du Colombier 	r->lo--;
396*6c6e36e1SDavid du Colombier }
397*6c6e36e1SDavid du Colombier 
398*6c6e36e1SDavid du Colombier void
_ppv(Vlong * l,Vlong * r)399*6c6e36e1SDavid du Colombier _ppv(Vlong *l, Vlong *r)
400*6c6e36e1SDavid du Colombier {
401*6c6e36e1SDavid du Colombier 
402*6c6e36e1SDavid du Colombier 	r->lo++;
403*6c6e36e1SDavid du Colombier 	if(r->lo == 0)
404*6c6e36e1SDavid du Colombier 		r->hi++;
405*6c6e36e1SDavid du Colombier 	l->hi = r->hi;
406*6c6e36e1SDavid du Colombier 	l->lo = r->lo;
407*6c6e36e1SDavid du Colombier }
408*6c6e36e1SDavid du Colombier 
409*6c6e36e1SDavid du Colombier void
_mmv(Vlong * l,Vlong * r)410*6c6e36e1SDavid du Colombier _mmv(Vlong *l, Vlong *r)
411*6c6e36e1SDavid du Colombier {
412*6c6e36e1SDavid du Colombier 
413*6c6e36e1SDavid du Colombier 	if(r->lo == 0)
414*6c6e36e1SDavid du Colombier 		r->hi--;
415*6c6e36e1SDavid du Colombier 	r->lo--;
416*6c6e36e1SDavid du Colombier 	l->hi = r->hi;
417*6c6e36e1SDavid du Colombier 	l->lo = r->lo;
418*6c6e36e1SDavid du Colombier }
419*6c6e36e1SDavid du Colombier 
420*6c6e36e1SDavid du Colombier void
_vasop(Vlong * ret,void * lv,void fn (Vlong *,Vlong,Vlong),int type,Vlong rv)421*6c6e36e1SDavid du Colombier _vasop(Vlong *ret, void *lv, void fn(Vlong*, Vlong, Vlong), int type, Vlong rv)
422*6c6e36e1SDavid du Colombier {
423*6c6e36e1SDavid du Colombier 	Vlong t, u;
424*6c6e36e1SDavid du Colombier 
425*6c6e36e1SDavid du Colombier 	u.lo = 0;
426*6c6e36e1SDavid du Colombier 	u.hi = 0;
427*6c6e36e1SDavid du Colombier 	switch(type) {
428*6c6e36e1SDavid du Colombier 	default:
429*6c6e36e1SDavid du Colombier 		abort();
430*6c6e36e1SDavid du Colombier 		break;
431*6c6e36e1SDavid du Colombier 
432*6c6e36e1SDavid du Colombier 	case 1:	/* schar */
433*6c6e36e1SDavid du Colombier 		t.lo = *(schar*)lv;
434*6c6e36e1SDavid du Colombier 		t.hi = t.lo >> 31;
435*6c6e36e1SDavid du Colombier 		fn(&u, t, rv);
436*6c6e36e1SDavid du Colombier 		*(schar*)lv = u.lo;
437*6c6e36e1SDavid du Colombier 		break;
438*6c6e36e1SDavid du Colombier 
439*6c6e36e1SDavid du Colombier 	case 2:	/* uchar */
440*6c6e36e1SDavid du Colombier 		t.lo = *(uchar*)lv;
441*6c6e36e1SDavid du Colombier 		t.hi = 0;
442*6c6e36e1SDavid du Colombier 		fn(&u, t, rv);
443*6c6e36e1SDavid du Colombier 		*(uchar*)lv = u.lo;
444*6c6e36e1SDavid du Colombier 		break;
445*6c6e36e1SDavid du Colombier 
446*6c6e36e1SDavid du Colombier 	case 3:	/* short */
447*6c6e36e1SDavid du Colombier 		t.lo = *(short*)lv;
448*6c6e36e1SDavid du Colombier 		t.hi = t.lo >> 31;
449*6c6e36e1SDavid du Colombier 		fn(&u, t, rv);
450*6c6e36e1SDavid du Colombier 		*(short*)lv = u.lo;
451*6c6e36e1SDavid du Colombier 		break;
452*6c6e36e1SDavid du Colombier 
453*6c6e36e1SDavid du Colombier 	case 4:	/* ushort */
454*6c6e36e1SDavid du Colombier 		t.lo = *(ushort*)lv;
455*6c6e36e1SDavid du Colombier 		t.hi = 0;
456*6c6e36e1SDavid du Colombier 		fn(&u, t, rv);
457*6c6e36e1SDavid du Colombier 		*(ushort*)lv = u.lo;
458*6c6e36e1SDavid du Colombier 		break;
459*6c6e36e1SDavid du Colombier 
460*6c6e36e1SDavid du Colombier 	case 9:	/* int */
461*6c6e36e1SDavid du Colombier 		t.lo = *(int*)lv;
462*6c6e36e1SDavid du Colombier 		t.hi = t.lo >> 31;
463*6c6e36e1SDavid du Colombier 		fn(&u, t, rv);
464*6c6e36e1SDavid du Colombier 		*(int*)lv = u.lo;
465*6c6e36e1SDavid du Colombier 		break;
466*6c6e36e1SDavid du Colombier 
467*6c6e36e1SDavid du Colombier 	case 10:	/* uint */
468*6c6e36e1SDavid du Colombier 		t.lo = *(uint*)lv;
469*6c6e36e1SDavid du Colombier 		t.hi = 0;
470*6c6e36e1SDavid du Colombier 		fn(&u, t, rv);
471*6c6e36e1SDavid du Colombier 		*(uint*)lv = u.lo;
472*6c6e36e1SDavid du Colombier 		break;
473*6c6e36e1SDavid du Colombier 
474*6c6e36e1SDavid du Colombier 	case 5:	/* long */
475*6c6e36e1SDavid du Colombier 		t.lo = *(long*)lv;
476*6c6e36e1SDavid du Colombier 		t.hi = t.lo >> 31;
477*6c6e36e1SDavid du Colombier 		fn(&u, t, rv);
478*6c6e36e1SDavid du Colombier 		*(long*)lv = u.lo;
479*6c6e36e1SDavid du Colombier 		break;
480*6c6e36e1SDavid du Colombier 
481*6c6e36e1SDavid du Colombier 	case 6:	/* ulong */
482*6c6e36e1SDavid du Colombier 		t.lo = *(ulong*)lv;
483*6c6e36e1SDavid du Colombier 		t.hi = 0;
484*6c6e36e1SDavid du Colombier 		fn(&u, t, rv);
485*6c6e36e1SDavid du Colombier 		*(ulong*)lv = u.lo;
486*6c6e36e1SDavid du Colombier 		break;
487*6c6e36e1SDavid du Colombier 
488*6c6e36e1SDavid du Colombier 	case 7:	/* vlong */
489*6c6e36e1SDavid du Colombier 	case 8:	/* uvlong */
490*6c6e36e1SDavid du Colombier 		fn(&u, *(Vlong*)lv, rv);
491*6c6e36e1SDavid du Colombier 		*(Vlong*)lv = u;
492*6c6e36e1SDavid du Colombier 		break;
493*6c6e36e1SDavid du Colombier 	}
494*6c6e36e1SDavid du Colombier 	*ret = u;
495*6c6e36e1SDavid du Colombier }
496*6c6e36e1SDavid du Colombier 
497*6c6e36e1SDavid du Colombier void
_p2v(Vlong * ret,void * p)498*6c6e36e1SDavid du Colombier _p2v(Vlong *ret, void *p)
499*6c6e36e1SDavid du Colombier {
500*6c6e36e1SDavid du Colombier 	long t;
501*6c6e36e1SDavid du Colombier 
502*6c6e36e1SDavid du Colombier 	t = (ulong)p;
503*6c6e36e1SDavid du Colombier 	ret->lo = t;
504*6c6e36e1SDavid du Colombier 	ret->hi = 0;
505*6c6e36e1SDavid du Colombier }
506*6c6e36e1SDavid du Colombier 
507*6c6e36e1SDavid du Colombier void
_sl2v(Vlong * ret,long sl)508*6c6e36e1SDavid du Colombier _sl2v(Vlong *ret, long sl)
509*6c6e36e1SDavid du Colombier {
510*6c6e36e1SDavid du Colombier 	long t;
511*6c6e36e1SDavid du Colombier 
512*6c6e36e1SDavid du Colombier 	t = sl;
513*6c6e36e1SDavid du Colombier 	ret->lo = t;
514*6c6e36e1SDavid du Colombier 	ret->hi = t >> 31;
515*6c6e36e1SDavid du Colombier }
516*6c6e36e1SDavid du Colombier 
517*6c6e36e1SDavid du Colombier void
_ul2v(Vlong * ret,ulong ul)518*6c6e36e1SDavid du Colombier _ul2v(Vlong *ret, ulong ul)
519*6c6e36e1SDavid du Colombier {
520*6c6e36e1SDavid du Colombier 	long t;
521*6c6e36e1SDavid du Colombier 
522*6c6e36e1SDavid du Colombier 	t = ul;
523*6c6e36e1SDavid du Colombier 	ret->lo = t;
524*6c6e36e1SDavid du Colombier 	ret->hi = 0;
525*6c6e36e1SDavid du Colombier }
526*6c6e36e1SDavid du Colombier 
527*6c6e36e1SDavid du Colombier void
_si2v(Vlong * ret,int si)528*6c6e36e1SDavid du Colombier _si2v(Vlong *ret, int si)
529*6c6e36e1SDavid du Colombier {
530*6c6e36e1SDavid du Colombier 	long t;
531*6c6e36e1SDavid du Colombier 
532*6c6e36e1SDavid du Colombier 	t = si;
533*6c6e36e1SDavid du Colombier 	ret->lo = t;
534*6c6e36e1SDavid du Colombier 	ret->hi = t >> 31;
535*6c6e36e1SDavid du Colombier }
536*6c6e36e1SDavid du Colombier 
537*6c6e36e1SDavid du Colombier void
_ui2v(Vlong * ret,uint ui)538*6c6e36e1SDavid du Colombier _ui2v(Vlong *ret, uint ui)
539*6c6e36e1SDavid du Colombier {
540*6c6e36e1SDavid du Colombier 	long t;
541*6c6e36e1SDavid du Colombier 
542*6c6e36e1SDavid du Colombier 	t = ui;
543*6c6e36e1SDavid du Colombier 	ret->lo = t;
544*6c6e36e1SDavid du Colombier 	ret->hi = 0;
545*6c6e36e1SDavid du Colombier }
546*6c6e36e1SDavid du Colombier 
547*6c6e36e1SDavid du Colombier void
_sh2v(Vlong * ret,long sh)548*6c6e36e1SDavid du Colombier _sh2v(Vlong *ret, long sh)
549*6c6e36e1SDavid du Colombier {
550*6c6e36e1SDavid du Colombier 	long t;
551*6c6e36e1SDavid du Colombier 
552*6c6e36e1SDavid du Colombier 	t = (sh << 16) >> 16;
553*6c6e36e1SDavid du Colombier 	ret->lo = t;
554*6c6e36e1SDavid du Colombier 	ret->hi = t >> 31;
555*6c6e36e1SDavid du Colombier }
556*6c6e36e1SDavid du Colombier 
557*6c6e36e1SDavid du Colombier void
_uh2v(Vlong * ret,ulong ul)558*6c6e36e1SDavid du Colombier _uh2v(Vlong *ret, ulong ul)
559*6c6e36e1SDavid du Colombier {
560*6c6e36e1SDavid du Colombier 	long t;
561*6c6e36e1SDavid du Colombier 
562*6c6e36e1SDavid du Colombier 	t = ul & 0xffff;
563*6c6e36e1SDavid du Colombier 	ret->lo = t;
564*6c6e36e1SDavid du Colombier 	ret->hi = 0;
565*6c6e36e1SDavid du Colombier }
566*6c6e36e1SDavid du Colombier 
567*6c6e36e1SDavid du Colombier void
_sc2v(Vlong * ret,long uc)568*6c6e36e1SDavid du Colombier _sc2v(Vlong *ret, long uc)
569*6c6e36e1SDavid du Colombier {
570*6c6e36e1SDavid du Colombier 	long t;
571*6c6e36e1SDavid du Colombier 
572*6c6e36e1SDavid du Colombier 	t = (uc << 24) >> 24;
573*6c6e36e1SDavid du Colombier 	ret->lo = t;
574*6c6e36e1SDavid du Colombier 	ret->hi = t >> 31;
575*6c6e36e1SDavid du Colombier }
576*6c6e36e1SDavid du Colombier 
577*6c6e36e1SDavid du Colombier void
_uc2v(Vlong * ret,ulong ul)578*6c6e36e1SDavid du Colombier _uc2v(Vlong *ret, ulong ul)
579*6c6e36e1SDavid du Colombier {
580*6c6e36e1SDavid du Colombier 	long t;
581*6c6e36e1SDavid du Colombier 
582*6c6e36e1SDavid du Colombier 	t = ul & 0xff;
583*6c6e36e1SDavid du Colombier 	ret->lo = t;
584*6c6e36e1SDavid du Colombier 	ret->hi = 0;
585*6c6e36e1SDavid du Colombier }
586*6c6e36e1SDavid du Colombier 
587*6c6e36e1SDavid du Colombier long
_v2sc(Vlong rv)588*6c6e36e1SDavid du Colombier _v2sc(Vlong rv)
589*6c6e36e1SDavid du Colombier {
590*6c6e36e1SDavid du Colombier 	long t;
591*6c6e36e1SDavid du Colombier 
592*6c6e36e1SDavid du Colombier 	t = rv.lo & 0xff;
593*6c6e36e1SDavid du Colombier 	return (t << 24) >> 24;
594*6c6e36e1SDavid du Colombier }
595*6c6e36e1SDavid du Colombier 
596*6c6e36e1SDavid du Colombier long
_v2uc(Vlong rv)597*6c6e36e1SDavid du Colombier _v2uc(Vlong rv)
598*6c6e36e1SDavid du Colombier {
599*6c6e36e1SDavid du Colombier 
600*6c6e36e1SDavid du Colombier 	return rv.lo & 0xff;
601*6c6e36e1SDavid du Colombier }
602*6c6e36e1SDavid du Colombier 
603*6c6e36e1SDavid du Colombier long
_v2sh(Vlong rv)604*6c6e36e1SDavid du Colombier _v2sh(Vlong rv)
605*6c6e36e1SDavid du Colombier {
606*6c6e36e1SDavid du Colombier 	long t;
607*6c6e36e1SDavid du Colombier 
608*6c6e36e1SDavid du Colombier 	t = rv.lo & 0xffff;
609*6c6e36e1SDavid du Colombier 	return (t << 16) >> 16;
610*6c6e36e1SDavid du Colombier }
611*6c6e36e1SDavid du Colombier 
612*6c6e36e1SDavid du Colombier long
_v2uh(Vlong rv)613*6c6e36e1SDavid du Colombier _v2uh(Vlong rv)
614*6c6e36e1SDavid du Colombier {
615*6c6e36e1SDavid du Colombier 
616*6c6e36e1SDavid du Colombier 	return rv.lo & 0xffff;
617*6c6e36e1SDavid du Colombier }
618*6c6e36e1SDavid du Colombier 
619*6c6e36e1SDavid du Colombier long
_v2sl(Vlong rv)620*6c6e36e1SDavid du Colombier _v2sl(Vlong rv)
621*6c6e36e1SDavid du Colombier {
622*6c6e36e1SDavid du Colombier 
623*6c6e36e1SDavid du Colombier 	return rv.lo;
624*6c6e36e1SDavid du Colombier }
625*6c6e36e1SDavid du Colombier 
626*6c6e36e1SDavid du Colombier long
_v2ul(Vlong rv)627*6c6e36e1SDavid du Colombier _v2ul(Vlong rv)
628*6c6e36e1SDavid du Colombier {
629*6c6e36e1SDavid du Colombier 
630*6c6e36e1SDavid du Colombier 	return rv.lo;
631*6c6e36e1SDavid du Colombier }
632*6c6e36e1SDavid du Colombier 
633*6c6e36e1SDavid du Colombier long
_v2si(Vlong rv)634*6c6e36e1SDavid du Colombier _v2si(Vlong rv)
635*6c6e36e1SDavid du Colombier {
636*6c6e36e1SDavid du Colombier 
637*6c6e36e1SDavid du Colombier 	return rv.lo;
638*6c6e36e1SDavid du Colombier }
639*6c6e36e1SDavid du Colombier 
640*6c6e36e1SDavid du Colombier long
_v2ui(Vlong rv)641*6c6e36e1SDavid du Colombier _v2ui(Vlong rv)
642*6c6e36e1SDavid du Colombier {
643*6c6e36e1SDavid du Colombier 
644*6c6e36e1SDavid du Colombier 	return rv.lo;
645*6c6e36e1SDavid du Colombier }
646*6c6e36e1SDavid du Colombier 
647*6c6e36e1SDavid du Colombier int
_testv(Vlong rv)648*6c6e36e1SDavid du Colombier _testv(Vlong rv)
649*6c6e36e1SDavid du Colombier {
650*6c6e36e1SDavid du Colombier 	return rv.lo || rv.hi;
651*6c6e36e1SDavid du Colombier }
652*6c6e36e1SDavid du Colombier 
653*6c6e36e1SDavid du Colombier int
_eqv(Vlong lv,Vlong rv)654*6c6e36e1SDavid du Colombier _eqv(Vlong lv, Vlong rv)
655*6c6e36e1SDavid du Colombier {
656*6c6e36e1SDavid du Colombier 	return lv.lo == rv.lo && lv.hi == rv.hi;
657*6c6e36e1SDavid du Colombier }
658*6c6e36e1SDavid du Colombier 
659*6c6e36e1SDavid du Colombier int
_nev(Vlong lv,Vlong rv)660*6c6e36e1SDavid du Colombier _nev(Vlong lv, Vlong rv)
661*6c6e36e1SDavid du Colombier {
662*6c6e36e1SDavid du Colombier 	return lv.lo != rv.lo || lv.hi != rv.hi;
663*6c6e36e1SDavid du Colombier }
664*6c6e36e1SDavid du Colombier 
665*6c6e36e1SDavid du Colombier int
_ltv(Vlong lv,Vlong rv)666*6c6e36e1SDavid du Colombier _ltv(Vlong lv, Vlong rv)
667*6c6e36e1SDavid du Colombier {
668*6c6e36e1SDavid du Colombier 	return (long)lv.hi < (long)rv.hi ||
669*6c6e36e1SDavid du Colombier 		(lv.hi == rv.hi && lv.lo < rv.lo);
670*6c6e36e1SDavid du Colombier }
671*6c6e36e1SDavid du Colombier 
672*6c6e36e1SDavid du Colombier int
_lev(Vlong lv,Vlong rv)673*6c6e36e1SDavid du Colombier _lev(Vlong lv, Vlong rv)
674*6c6e36e1SDavid du Colombier {
675*6c6e36e1SDavid du Colombier 	return (long)lv.hi < (long)rv.hi ||
676*6c6e36e1SDavid du Colombier 		(lv.hi == rv.hi && lv.lo <= rv.lo);
677*6c6e36e1SDavid du Colombier }
678*6c6e36e1SDavid du Colombier 
679*6c6e36e1SDavid du Colombier int
_gtv(Vlong lv,Vlong rv)680*6c6e36e1SDavid du Colombier _gtv(Vlong lv, Vlong rv)
681*6c6e36e1SDavid du Colombier {
682*6c6e36e1SDavid du Colombier 	return (long)lv.hi > (long)rv.hi ||
683*6c6e36e1SDavid du Colombier 		(lv.hi == rv.hi && lv.lo > rv.lo);
684*6c6e36e1SDavid du Colombier }
685*6c6e36e1SDavid du Colombier 
686*6c6e36e1SDavid du Colombier int
_gev(Vlong lv,Vlong rv)687*6c6e36e1SDavid du Colombier _gev(Vlong lv, Vlong rv)
688*6c6e36e1SDavid du Colombier {
689*6c6e36e1SDavid du Colombier 	return (long)lv.hi > (long)rv.hi ||
690*6c6e36e1SDavid du Colombier 		(lv.hi == rv.hi && lv.lo >= rv.lo);
691*6c6e36e1SDavid du Colombier }
692*6c6e36e1SDavid du Colombier 
693*6c6e36e1SDavid du Colombier int
_lov(Vlong lv,Vlong rv)694*6c6e36e1SDavid du Colombier _lov(Vlong lv, Vlong rv)
695*6c6e36e1SDavid du Colombier {
696*6c6e36e1SDavid du Colombier 	return lv.hi < rv.hi ||
697*6c6e36e1SDavid du Colombier 		(lv.hi == rv.hi && lv.lo < rv.lo);
698*6c6e36e1SDavid du Colombier }
699*6c6e36e1SDavid du Colombier 
700*6c6e36e1SDavid du Colombier int
_lsv(Vlong lv,Vlong rv)701*6c6e36e1SDavid du Colombier _lsv(Vlong lv, Vlong rv)
702*6c6e36e1SDavid du Colombier {
703*6c6e36e1SDavid du Colombier 	return lv.hi < rv.hi ||
704*6c6e36e1SDavid du Colombier 		(lv.hi == rv.hi && lv.lo <= rv.lo);
705*6c6e36e1SDavid du Colombier }
706*6c6e36e1SDavid du Colombier 
707*6c6e36e1SDavid du Colombier int
_hiv(Vlong lv,Vlong rv)708*6c6e36e1SDavid du Colombier _hiv(Vlong lv, Vlong rv)
709*6c6e36e1SDavid du Colombier {
710*6c6e36e1SDavid du Colombier 	return lv.hi > rv.hi ||
711*6c6e36e1SDavid du Colombier 		(lv.hi == rv.hi && lv.lo > rv.lo);
712*6c6e36e1SDavid du Colombier }
713*6c6e36e1SDavid du Colombier 
714*6c6e36e1SDavid du Colombier int
_hsv(Vlong lv,Vlong rv)715*6c6e36e1SDavid du Colombier _hsv(Vlong lv, Vlong rv)
716*6c6e36e1SDavid du Colombier {
717*6c6e36e1SDavid du Colombier 	return lv.hi > rv.hi ||
718*6c6e36e1SDavid du Colombier 		(lv.hi == rv.hi && lv.lo >= rv.lo);
719*6c6e36e1SDavid du Colombier }
720