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