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