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