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