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