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