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