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