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