1219b2ee8SDavid du Colombier typedef unsigned long ulong;
27dd7cddfSDavid du Colombier typedef unsigned int uint;
3219b2ee8SDavid du Colombier typedef unsigned short ushort;
47dd7cddfSDavid du Colombier typedef unsigned char uchar;
5219b2ee8SDavid du Colombier typedef signed char schar;
6219b2ee8SDavid du Colombier
7219b2ee8SDavid du Colombier #define SIGN(n) (1UL<<(n-1))
8219b2ee8SDavid du Colombier
9219b2ee8SDavid du Colombier typedef struct Vlong Vlong;
10219b2ee8SDavid du Colombier struct Vlong
11219b2ee8SDavid du Colombier {
12219b2ee8SDavid du Colombier union
13219b2ee8SDavid du Colombier {
14219b2ee8SDavid du Colombier struct
15219b2ee8SDavid du Colombier {
16219b2ee8SDavid du Colombier ulong hi;
17219b2ee8SDavid du Colombier ulong lo;
18219b2ee8SDavid du Colombier };
19219b2ee8SDavid du Colombier struct
20219b2ee8SDavid du Colombier {
21219b2ee8SDavid du Colombier ushort hims;
22219b2ee8SDavid du Colombier ushort hils;
23219b2ee8SDavid du Colombier ushort loms;
24219b2ee8SDavid du Colombier ushort lols;
25219b2ee8SDavid du Colombier };
26219b2ee8SDavid du Colombier };
27219b2ee8SDavid du Colombier };
28219b2ee8SDavid du Colombier
29219b2ee8SDavid du Colombier void abort(void);
30219b2ee8SDavid du Colombier
31e288d156SDavid du Colombier /* needed by profiler; can't be profiled */
32e288d156SDavid du Colombier #pragma profile off
33219b2ee8SDavid du Colombier void
_addv(Vlong * r,Vlong a,Vlong b)34219b2ee8SDavid du Colombier _addv(Vlong *r, Vlong a, Vlong b)
35219b2ee8SDavid du Colombier {
36219b2ee8SDavid du Colombier ulong lo, hi;
37219b2ee8SDavid du Colombier
38219b2ee8SDavid du Colombier lo = a.lo + b.lo;
39219b2ee8SDavid du Colombier hi = a.hi + b.hi;
40219b2ee8SDavid du Colombier if(lo < a.lo)
41219b2ee8SDavid du Colombier hi++;
42219b2ee8SDavid du Colombier r->lo = lo;
43219b2ee8SDavid du Colombier r->hi = hi;
44219b2ee8SDavid du Colombier }
45219b2ee8SDavid du Colombier
46219b2ee8SDavid du Colombier void
_subv(Vlong * r,Vlong a,Vlong b)47219b2ee8SDavid du Colombier _subv(Vlong *r, Vlong a, Vlong b)
48219b2ee8SDavid du Colombier {
49219b2ee8SDavid du Colombier ulong lo, hi;
50219b2ee8SDavid du Colombier
51219b2ee8SDavid du Colombier lo = a.lo - b.lo;
52219b2ee8SDavid du Colombier hi = a.hi - b.hi;
53219b2ee8SDavid du Colombier if(lo > a.lo)
54219b2ee8SDavid du Colombier hi--;
55219b2ee8SDavid du Colombier r->lo = lo;
56219b2ee8SDavid du Colombier r->hi = hi;
57219b2ee8SDavid du Colombier }
58219b2ee8SDavid du Colombier
59e288d156SDavid du Colombier #pragma profile on
60e288d156SDavid du Colombier
61219b2ee8SDavid du Colombier void
_d2v(Vlong * y,double d)62219b2ee8SDavid du Colombier _d2v(Vlong *y, double d)
63219b2ee8SDavid du Colombier {
64219b2ee8SDavid du Colombier union { double d; struct Vlong; } x;
65219b2ee8SDavid du Colombier ulong xhi, xlo, ylo, yhi;
66219b2ee8SDavid du Colombier int sh;
67219b2ee8SDavid du Colombier
68219b2ee8SDavid du Colombier x.d = d;
69219b2ee8SDavid du Colombier
70219b2ee8SDavid du Colombier xhi = (x.hi & 0xfffff) | 0x100000;
71219b2ee8SDavid du Colombier xlo = x.lo;
72219b2ee8SDavid du Colombier sh = 1075 - ((x.hi >> 20) & 0x7ff);
73219b2ee8SDavid du Colombier
74219b2ee8SDavid du Colombier ylo = 0;
75219b2ee8SDavid du Colombier yhi = 0;
76219b2ee8SDavid du Colombier if(sh >= 0) {
77219b2ee8SDavid du Colombier /* v = (hi||lo) >> sh */
78219b2ee8SDavid du Colombier if(sh < 32) {
79219b2ee8SDavid du Colombier if(sh == 0) {
80219b2ee8SDavid du Colombier ylo = xlo;
81219b2ee8SDavid du Colombier yhi = xhi;
82219b2ee8SDavid du Colombier } else {
83219b2ee8SDavid du Colombier ylo = (xlo >> sh) | (xhi << (32-sh));
84219b2ee8SDavid du Colombier yhi = xhi >> sh;
85219b2ee8SDavid du Colombier }
86219b2ee8SDavid du Colombier } else {
87219b2ee8SDavid du Colombier if(sh == 32) {
88219b2ee8SDavid du Colombier ylo = xhi;
89219b2ee8SDavid du Colombier } else
90219b2ee8SDavid du Colombier if(sh < 64) {
91219b2ee8SDavid du Colombier ylo = xhi >> (sh-32);
92219b2ee8SDavid du Colombier }
93219b2ee8SDavid du Colombier }
94219b2ee8SDavid du Colombier } else {
95219b2ee8SDavid du Colombier /* v = (hi||lo) << -sh */
96219b2ee8SDavid du Colombier sh = -sh;
97219b2ee8SDavid du Colombier if(sh <= 10) {
98219b2ee8SDavid du Colombier ylo = xlo << sh;
99219b2ee8SDavid du Colombier yhi = (xhi << sh) | (xlo >> (32-sh));
100219b2ee8SDavid du Colombier } else {
101219b2ee8SDavid du Colombier /* overflow */
102219b2ee8SDavid du Colombier yhi = d; /* causes something awful */
103219b2ee8SDavid du Colombier }
104219b2ee8SDavid du Colombier }
105219b2ee8SDavid du Colombier if(x.hi & SIGN(32)) {
106219b2ee8SDavid du Colombier if(ylo != 0) {
107219b2ee8SDavid du Colombier ylo = -ylo;
108219b2ee8SDavid du Colombier yhi = ~yhi;
109219b2ee8SDavid du Colombier } else
110219b2ee8SDavid du Colombier yhi = -yhi;
111219b2ee8SDavid du Colombier }
112219b2ee8SDavid du Colombier
113219b2ee8SDavid du Colombier y->hi = yhi;
114219b2ee8SDavid du Colombier y->lo = ylo;
115219b2ee8SDavid du Colombier }
116219b2ee8SDavid du Colombier
117219b2ee8SDavid du Colombier void
_f2v(Vlong * y,float f)118219b2ee8SDavid du Colombier _f2v(Vlong *y, float f)
119219b2ee8SDavid du Colombier {
120219b2ee8SDavid du Colombier
121219b2ee8SDavid du Colombier _d2v(y, f);
122219b2ee8SDavid du Colombier }
123219b2ee8SDavid du Colombier
124219b2ee8SDavid du Colombier double
_v2d(Vlong x)125219b2ee8SDavid du Colombier _v2d(Vlong x)
126219b2ee8SDavid du Colombier {
127219b2ee8SDavid du Colombier if(x.hi & SIGN(32)) {
128219b2ee8SDavid du Colombier if(x.lo) {
129219b2ee8SDavid du Colombier x.lo = -x.lo;
130219b2ee8SDavid du Colombier x.hi = ~x.hi;
131219b2ee8SDavid du Colombier } else
132219b2ee8SDavid du Colombier x.hi = -x.hi;
133219b2ee8SDavid du Colombier return -((long)x.hi*4294967296. + x.lo);
134219b2ee8SDavid du Colombier }
135219b2ee8SDavid du Colombier return (long)x.hi*4294967296. + x.lo;
136219b2ee8SDavid du Colombier }
137219b2ee8SDavid du Colombier
138219b2ee8SDavid du Colombier float
_v2f(Vlong x)139219b2ee8SDavid du Colombier _v2f(Vlong x)
140219b2ee8SDavid du Colombier {
141219b2ee8SDavid du Colombier return _v2d(x);
142219b2ee8SDavid du Colombier }
143219b2ee8SDavid du Colombier
144219b2ee8SDavid du Colombier static void
dodiv(Vlong num,Vlong den,Vlong * q,Vlong * r)145219b2ee8SDavid du Colombier dodiv(Vlong num, Vlong den, Vlong *q, Vlong *r)
146219b2ee8SDavid du Colombier {
147219b2ee8SDavid du Colombier ulong numlo, numhi, denhi, denlo, quohi, quolo, t;
148219b2ee8SDavid du Colombier int i;
149219b2ee8SDavid du Colombier
150219b2ee8SDavid du Colombier numhi = num.hi;
151219b2ee8SDavid du Colombier numlo = num.lo;
152219b2ee8SDavid du Colombier denhi = den.hi;
153219b2ee8SDavid du Colombier denlo = den.lo;
154219b2ee8SDavid du Colombier
155219b2ee8SDavid du Colombier /*
156219b2ee8SDavid du Colombier * get a divide by zero
157219b2ee8SDavid du Colombier */
158219b2ee8SDavid du Colombier if(denlo==0 && denhi==0) {
159219b2ee8SDavid du Colombier numlo = numlo / denlo;
160219b2ee8SDavid du Colombier }
161219b2ee8SDavid du Colombier
162219b2ee8SDavid du Colombier /*
163219b2ee8SDavid du Colombier * set up the divisor and find the number of iterations needed
164219b2ee8SDavid du Colombier */
165219b2ee8SDavid du Colombier if(numhi >= SIGN(32)) {
166219b2ee8SDavid du Colombier quohi = SIGN(32);
167219b2ee8SDavid du Colombier quolo = 0;
168219b2ee8SDavid du Colombier } else {
169219b2ee8SDavid du Colombier quohi = numhi;
170219b2ee8SDavid du Colombier quolo = numlo;
171219b2ee8SDavid du Colombier }
172219b2ee8SDavid du Colombier i = 0;
173219b2ee8SDavid du Colombier while(denhi < quohi || (denhi == quohi && denlo < quolo)) {
174219b2ee8SDavid du Colombier denhi = (denhi<<1) | (denlo>>31);
175219b2ee8SDavid du Colombier denlo <<= 1;
176219b2ee8SDavid du Colombier i++;
177219b2ee8SDavid du Colombier }
178219b2ee8SDavid du Colombier
179219b2ee8SDavid du Colombier quohi = 0;
180219b2ee8SDavid du Colombier quolo = 0;
181219b2ee8SDavid du Colombier for(; i >= 0; i--) {
182219b2ee8SDavid du Colombier quohi = (quohi<<1) | (quolo>>31);
183219b2ee8SDavid du Colombier quolo <<= 1;
184219b2ee8SDavid du Colombier if(numhi > denhi || (numhi == denhi && numlo >= denlo)) {
185219b2ee8SDavid du Colombier t = numlo;
186219b2ee8SDavid du Colombier numlo -= denlo;
187219b2ee8SDavid du Colombier if(numlo > t)
188219b2ee8SDavid du Colombier numhi--;
189219b2ee8SDavid du Colombier numhi -= denhi;
190219b2ee8SDavid du Colombier quolo |= 1;
191219b2ee8SDavid du Colombier }
192219b2ee8SDavid du Colombier denlo = (denlo>>1) | (denhi<<31);
193219b2ee8SDavid du Colombier denhi >>= 1;
194219b2ee8SDavid du Colombier }
195219b2ee8SDavid du Colombier
196219b2ee8SDavid du Colombier if(q) {
197219b2ee8SDavid du Colombier q->lo = quolo;
198219b2ee8SDavid du Colombier q->hi = quohi;
199219b2ee8SDavid du Colombier }
200219b2ee8SDavid du Colombier if(r) {
201219b2ee8SDavid du Colombier r->lo = numlo;
202219b2ee8SDavid du Colombier r->hi = numhi;
203219b2ee8SDavid du Colombier }
204219b2ee8SDavid du Colombier }
205219b2ee8SDavid du Colombier
206219b2ee8SDavid du Colombier void
_divvu(Vlong * q,Vlong n,Vlong d)207219b2ee8SDavid du Colombier _divvu(Vlong *q, Vlong n, Vlong d)
208219b2ee8SDavid du Colombier {
209219b2ee8SDavid du Colombier
210219b2ee8SDavid du Colombier if(n.hi == 0 && d.hi == 0) {
211219b2ee8SDavid du Colombier q->hi = 0;
212219b2ee8SDavid du Colombier q->lo = n.lo / d.lo;
213219b2ee8SDavid du Colombier return;
214219b2ee8SDavid du Colombier }
215219b2ee8SDavid du Colombier dodiv(n, d, q, 0);
216219b2ee8SDavid du Colombier }
217219b2ee8SDavid du Colombier
218219b2ee8SDavid du Colombier void
_modvu(Vlong * r,Vlong n,Vlong d)219219b2ee8SDavid du Colombier _modvu(Vlong *r, Vlong n, Vlong d)
220219b2ee8SDavid du Colombier {
221219b2ee8SDavid du Colombier
222219b2ee8SDavid du Colombier if(n.hi == 0 && d.hi == 0) {
223219b2ee8SDavid du Colombier r->hi = 0;
224219b2ee8SDavid du Colombier r->lo = n.lo % d.lo;
225219b2ee8SDavid du Colombier return;
226219b2ee8SDavid du Colombier }
227219b2ee8SDavid du Colombier dodiv(n, d, 0, r);
228219b2ee8SDavid du Colombier }
229219b2ee8SDavid du Colombier
230219b2ee8SDavid du Colombier static void
vneg(Vlong * v)231219b2ee8SDavid du Colombier vneg(Vlong *v)
232219b2ee8SDavid du Colombier {
233219b2ee8SDavid du Colombier
234219b2ee8SDavid du Colombier if(v->lo == 0) {
235219b2ee8SDavid du Colombier v->hi = -v->hi;
236219b2ee8SDavid du Colombier return;
237219b2ee8SDavid du Colombier }
238219b2ee8SDavid du Colombier v->lo = -v->lo;
239219b2ee8SDavid du Colombier v->hi = ~v->hi;
240219b2ee8SDavid du Colombier }
241219b2ee8SDavid du Colombier
242219b2ee8SDavid du Colombier void
_divv(Vlong * q,Vlong n,Vlong d)243219b2ee8SDavid du Colombier _divv(Vlong *q, Vlong n, Vlong d)
244219b2ee8SDavid du Colombier {
245219b2ee8SDavid du Colombier long nneg, dneg;
246219b2ee8SDavid du Colombier
247219b2ee8SDavid du Colombier if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
248219b2ee8SDavid du Colombier q->lo = (long)n.lo / (long)d.lo;
249219b2ee8SDavid du Colombier q->hi = ((long)q->lo) >> 31;
250219b2ee8SDavid du Colombier return;
251219b2ee8SDavid du Colombier }
252219b2ee8SDavid du Colombier nneg = n.hi >> 31;
253219b2ee8SDavid du Colombier if(nneg)
254219b2ee8SDavid du Colombier vneg(&n);
255219b2ee8SDavid du Colombier dneg = d.hi >> 31;
256219b2ee8SDavid du Colombier if(dneg)
257219b2ee8SDavid du Colombier vneg(&d);
258219b2ee8SDavid du Colombier dodiv(n, d, q, 0);
259219b2ee8SDavid du Colombier if(nneg != dneg)
260219b2ee8SDavid du Colombier vneg(q);
261219b2ee8SDavid du Colombier }
262219b2ee8SDavid du Colombier
263219b2ee8SDavid du Colombier void
_modv(Vlong * r,Vlong n,Vlong d)264219b2ee8SDavid du Colombier _modv(Vlong *r, Vlong n, Vlong d)
265219b2ee8SDavid du Colombier {
266219b2ee8SDavid du Colombier long nneg, dneg;
267219b2ee8SDavid du Colombier
268219b2ee8SDavid du Colombier if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {
269219b2ee8SDavid du Colombier r->lo = (long)n.lo % (long)d.lo;
270219b2ee8SDavid du Colombier r->hi = ((long)r->lo) >> 31;
271219b2ee8SDavid du Colombier return;
272219b2ee8SDavid du Colombier }
273219b2ee8SDavid du Colombier nneg = n.hi >> 31;
274219b2ee8SDavid du Colombier if(nneg)
275219b2ee8SDavid du Colombier vneg(&n);
276219b2ee8SDavid du Colombier dneg = d.hi >> 31;
277219b2ee8SDavid du Colombier if(dneg)
278219b2ee8SDavid du Colombier vneg(&d);
279219b2ee8SDavid du Colombier dodiv(n, d, 0, r);
280219b2ee8SDavid du Colombier if(nneg)
281219b2ee8SDavid du Colombier vneg(r);
282219b2ee8SDavid du Colombier }
283219b2ee8SDavid du Colombier
284219b2ee8SDavid du Colombier void
_rshav(Vlong * r,Vlong a,int b)285219b2ee8SDavid du Colombier _rshav(Vlong *r, Vlong a, int b)
286219b2ee8SDavid du Colombier {
287219b2ee8SDavid du Colombier long t;
288219b2ee8SDavid du Colombier
289219b2ee8SDavid du Colombier t = a.hi;
290219b2ee8SDavid du Colombier if(b >= 32) {
291219b2ee8SDavid du Colombier r->hi = t>>31;
292219b2ee8SDavid du Colombier if(b >= 64) {
293219b2ee8SDavid du Colombier /* this is illegal re C standard */
294219b2ee8SDavid du Colombier r->lo = t>>31;
295219b2ee8SDavid du Colombier return;
296219b2ee8SDavid du Colombier }
297219b2ee8SDavid du Colombier r->lo = t >> (b-32);
298219b2ee8SDavid du Colombier return;
299219b2ee8SDavid du Colombier }
300219b2ee8SDavid du Colombier if(b <= 0) {
301219b2ee8SDavid du Colombier r->hi = t;
302219b2ee8SDavid du Colombier r->lo = a.lo;
303219b2ee8SDavid du Colombier return;
304219b2ee8SDavid du Colombier }
305219b2ee8SDavid du Colombier r->hi = t >> b;
306219b2ee8SDavid du Colombier r->lo = (t << (32-b)) | (a.lo >> b);
307219b2ee8SDavid du Colombier }
308219b2ee8SDavid du Colombier
309219b2ee8SDavid du Colombier void
_rshlv(Vlong * r,Vlong a,int b)310219b2ee8SDavid du Colombier _rshlv(Vlong *r, Vlong a, int b)
311219b2ee8SDavid du Colombier {
312219b2ee8SDavid du Colombier ulong t;
313219b2ee8SDavid du Colombier
314219b2ee8SDavid du Colombier t = a.hi;
315219b2ee8SDavid du Colombier if(b >= 32) {
316219b2ee8SDavid du Colombier r->hi = 0;
317219b2ee8SDavid du Colombier if(b >= 64) {
318219b2ee8SDavid du Colombier /* this is illegal re C standard */
319219b2ee8SDavid du Colombier r->lo = 0;
320219b2ee8SDavid du Colombier return;
321219b2ee8SDavid du Colombier }
322219b2ee8SDavid du Colombier r->lo = t >> (b-32);
323219b2ee8SDavid du Colombier return;
324219b2ee8SDavid du Colombier }
325219b2ee8SDavid du Colombier if(b <= 0) {
326219b2ee8SDavid du Colombier r->hi = t;
327219b2ee8SDavid du Colombier r->lo = a.lo;
328219b2ee8SDavid du Colombier return;
329219b2ee8SDavid du Colombier }
330219b2ee8SDavid du Colombier r->hi = t >> b;
331219b2ee8SDavid du Colombier r->lo = (t << (32-b)) | (a.lo >> b);
332219b2ee8SDavid du Colombier }
333219b2ee8SDavid du Colombier
334219b2ee8SDavid du Colombier void
_lshv(Vlong * r,Vlong a,int b)335219b2ee8SDavid du Colombier _lshv(Vlong *r, Vlong a, int b)
336219b2ee8SDavid du Colombier {
337219b2ee8SDavid du Colombier ulong t;
338219b2ee8SDavid du Colombier
339219b2ee8SDavid du Colombier t = a.lo;
340219b2ee8SDavid du Colombier if(b >= 32) {
341219b2ee8SDavid du Colombier r->lo = 0;
342219b2ee8SDavid du Colombier if(b >= 64) {
343219b2ee8SDavid du Colombier /* this is illegal re C standard */
344219b2ee8SDavid du Colombier r->hi = 0;
345219b2ee8SDavid du Colombier return;
346219b2ee8SDavid du Colombier }
347219b2ee8SDavid du Colombier r->hi = t << (b-32);
348219b2ee8SDavid du Colombier return;
349219b2ee8SDavid du Colombier }
350219b2ee8SDavid du Colombier if(b <= 0) {
351219b2ee8SDavid du Colombier r->lo = t;
352219b2ee8SDavid du Colombier r->hi = a.hi;
353219b2ee8SDavid du Colombier return;
354219b2ee8SDavid du Colombier }
355219b2ee8SDavid du Colombier r->lo = t << b;
356219b2ee8SDavid du Colombier r->hi = (t >> (32-b)) | (a.hi << b);
357219b2ee8SDavid du Colombier }
358219b2ee8SDavid du Colombier
359219b2ee8SDavid du Colombier void
_andv(Vlong * r,Vlong a,Vlong b)360219b2ee8SDavid du Colombier _andv(Vlong *r, Vlong a, Vlong b)
361219b2ee8SDavid du Colombier {
362219b2ee8SDavid du Colombier r->hi = a.hi & b.hi;
363219b2ee8SDavid du Colombier r->lo = a.lo & b.lo;
364219b2ee8SDavid du Colombier }
365219b2ee8SDavid du Colombier
366219b2ee8SDavid du Colombier void
_orv(Vlong * r,Vlong a,Vlong b)367219b2ee8SDavid du Colombier _orv(Vlong *r, Vlong a, Vlong b)
368219b2ee8SDavid du Colombier {
369219b2ee8SDavid du Colombier r->hi = a.hi | b.hi;
370219b2ee8SDavid du Colombier r->lo = a.lo | b.lo;
371219b2ee8SDavid du Colombier }
372219b2ee8SDavid du Colombier
373219b2ee8SDavid du Colombier void
_xorv(Vlong * r,Vlong a,Vlong b)374219b2ee8SDavid du Colombier _xorv(Vlong *r, Vlong a, Vlong b)
375219b2ee8SDavid du Colombier {
376219b2ee8SDavid du Colombier r->hi = a.hi ^ b.hi;
377219b2ee8SDavid du Colombier r->lo = a.lo ^ b.lo;
378219b2ee8SDavid du Colombier }
379219b2ee8SDavid du Colombier
380219b2ee8SDavid du Colombier void
_vpp(Vlong * l,Vlong * r)381219b2ee8SDavid du Colombier _vpp(Vlong *l, Vlong *r)
382219b2ee8SDavid du Colombier {
383219b2ee8SDavid du Colombier
384219b2ee8SDavid du Colombier l->hi = r->hi;
385219b2ee8SDavid du Colombier l->lo = r->lo;
386219b2ee8SDavid du Colombier r->lo++;
387219b2ee8SDavid du Colombier if(r->lo == 0)
388219b2ee8SDavid du Colombier r->hi++;
389219b2ee8SDavid du Colombier }
390219b2ee8SDavid du Colombier
391219b2ee8SDavid du Colombier void
_vmm(Vlong * l,Vlong * r)392219b2ee8SDavid du Colombier _vmm(Vlong *l, Vlong *r)
393219b2ee8SDavid du Colombier {
394219b2ee8SDavid du Colombier
395219b2ee8SDavid du Colombier l->hi = r->hi;
396219b2ee8SDavid du Colombier l->lo = r->lo;
397219b2ee8SDavid du Colombier if(r->lo == 0)
398219b2ee8SDavid du Colombier r->hi--;
399219b2ee8SDavid du Colombier r->lo--;
400219b2ee8SDavid du Colombier }
401219b2ee8SDavid du Colombier
402219b2ee8SDavid du Colombier void
_ppv(Vlong * l,Vlong * r)403219b2ee8SDavid du Colombier _ppv(Vlong *l, Vlong *r)
404219b2ee8SDavid du Colombier {
405219b2ee8SDavid du Colombier
406219b2ee8SDavid du Colombier r->lo++;
407219b2ee8SDavid du Colombier if(r->lo == 0)
408219b2ee8SDavid du Colombier r->hi++;
409219b2ee8SDavid du Colombier l->hi = r->hi;
410219b2ee8SDavid du Colombier l->lo = r->lo;
411219b2ee8SDavid du Colombier }
412219b2ee8SDavid du Colombier
413219b2ee8SDavid du Colombier void
_mmv(Vlong * l,Vlong * r)414219b2ee8SDavid du Colombier _mmv(Vlong *l, Vlong *r)
415219b2ee8SDavid du Colombier {
416219b2ee8SDavid du Colombier
417219b2ee8SDavid du Colombier if(r->lo == 0)
418219b2ee8SDavid du Colombier r->hi--;
419219b2ee8SDavid du Colombier r->lo--;
420219b2ee8SDavid du Colombier l->hi = r->hi;
421219b2ee8SDavid du Colombier l->lo = r->lo;
422219b2ee8SDavid du Colombier }
423219b2ee8SDavid du Colombier
424219b2ee8SDavid du Colombier void
_vasaddd(Vlong * ret,Vlong * lv,double rv)425*7e8dea9bSDavid du Colombier _vasaddd(Vlong *ret, Vlong *lv, double rv)
426*7e8dea9bSDavid du Colombier {
427*7e8dea9bSDavid du Colombier _d2v(lv, _v2d(*lv)+rv);
428*7e8dea9bSDavid du Colombier *ret = *lv;
429*7e8dea9bSDavid du Colombier }
430*7e8dea9bSDavid du Colombier
431*7e8dea9bSDavid du Colombier void
_vassubd(Vlong * ret,Vlong * lv,double rv)432*7e8dea9bSDavid du Colombier _vassubd(Vlong *ret, Vlong *lv, double rv)
433*7e8dea9bSDavid du Colombier {
434*7e8dea9bSDavid du Colombier _d2v(lv, _v2d(*lv)-rv);
435*7e8dea9bSDavid du Colombier *ret = *lv;
436*7e8dea9bSDavid du Colombier }
437*7e8dea9bSDavid du Colombier
438*7e8dea9bSDavid du Colombier void
_vasmuld(Vlong * ret,Vlong * lv,double rv)439*7e8dea9bSDavid du Colombier _vasmuld(Vlong *ret, Vlong *lv, double rv)
440*7e8dea9bSDavid du Colombier {
441*7e8dea9bSDavid du Colombier _d2v(lv, _v2d(*lv)*rv);
442*7e8dea9bSDavid du Colombier *ret = *lv;
443*7e8dea9bSDavid du Colombier }
444*7e8dea9bSDavid du Colombier
445*7e8dea9bSDavid du Colombier void
_vasdivd(Vlong * ret,Vlong * lv,double rv)446*7e8dea9bSDavid du Colombier _vasdivd(Vlong *ret, Vlong *lv, double rv)
447*7e8dea9bSDavid du Colombier {
448*7e8dea9bSDavid du Colombier _d2v(lv, _v2d(*lv)/rv);
449*7e8dea9bSDavid du Colombier *ret = *lv;
450*7e8dea9bSDavid du Colombier }
451*7e8dea9bSDavid du Colombier
452*7e8dea9bSDavid du Colombier void
_vasop(Vlong * ret,void * lv,void fn (Vlong *,Vlong,Vlong),int type,Vlong rv)453219b2ee8SDavid du Colombier _vasop(Vlong *ret, void *lv, void fn(Vlong*, Vlong, Vlong), int type, Vlong rv)
454219b2ee8SDavid du Colombier {
4557dd7cddfSDavid du Colombier Vlong t, u;
456219b2ee8SDavid du Colombier
4577dd7cddfSDavid du Colombier u = *ret;
458219b2ee8SDavid du Colombier switch(type) {
459219b2ee8SDavid du Colombier default:
460219b2ee8SDavid du Colombier abort();
461219b2ee8SDavid du Colombier break;
462219b2ee8SDavid du Colombier
463219b2ee8SDavid du Colombier case 1: /* schar */
464219b2ee8SDavid du Colombier t.lo = *(schar*)lv;
465219b2ee8SDavid du Colombier t.hi = t.lo >> 31;
4667dd7cddfSDavid du Colombier fn(&u, t, rv);
4677dd7cddfSDavid du Colombier *(schar*)lv = u.lo;
468219b2ee8SDavid du Colombier break;
469219b2ee8SDavid du Colombier
470219b2ee8SDavid du Colombier case 2: /* uchar */
471219b2ee8SDavid du Colombier t.lo = *(uchar*)lv;
472219b2ee8SDavid du Colombier t.hi = 0;
4737dd7cddfSDavid du Colombier fn(&u, t, rv);
4747dd7cddfSDavid du Colombier *(uchar*)lv = u.lo;
475219b2ee8SDavid du Colombier break;
476219b2ee8SDavid du Colombier
477219b2ee8SDavid du Colombier case 3: /* short */
478219b2ee8SDavid du Colombier t.lo = *(short*)lv;
479219b2ee8SDavid du Colombier t.hi = t.lo >> 31;
4807dd7cddfSDavid du Colombier fn(&u, t, rv);
4817dd7cddfSDavid du Colombier *(short*)lv = u.lo;
482219b2ee8SDavid du Colombier break;
483219b2ee8SDavid du Colombier
484219b2ee8SDavid du Colombier case 4: /* ushort */
485219b2ee8SDavid du Colombier t.lo = *(ushort*)lv;
486219b2ee8SDavid du Colombier t.hi = 0;
4877dd7cddfSDavid du Colombier fn(&u, t, rv);
4887dd7cddfSDavid du Colombier *(ushort*)lv = u.lo;
4897dd7cddfSDavid du Colombier break;
4907dd7cddfSDavid du Colombier
4917dd7cddfSDavid du Colombier case 9: /* int */
4927dd7cddfSDavid du Colombier t.lo = *(int*)lv;
4937dd7cddfSDavid du Colombier t.hi = t.lo >> 31;
4947dd7cddfSDavid du Colombier fn(&u, t, rv);
4957dd7cddfSDavid du Colombier *(int*)lv = u.lo;
4967dd7cddfSDavid du Colombier break;
4977dd7cddfSDavid du Colombier
4987dd7cddfSDavid du Colombier case 10: /* uint */
4997dd7cddfSDavid du Colombier t.lo = *(uint*)lv;
5007dd7cddfSDavid du Colombier t.hi = 0;
5017dd7cddfSDavid du Colombier fn(&u, t, rv);
5027dd7cddfSDavid du Colombier *(uint*)lv = u.lo;
503219b2ee8SDavid du Colombier break;
504219b2ee8SDavid du Colombier
505219b2ee8SDavid du Colombier case 5: /* long */
506219b2ee8SDavid du Colombier t.lo = *(long*)lv;
507219b2ee8SDavid du Colombier t.hi = t.lo >> 31;
5087dd7cddfSDavid du Colombier fn(&u, t, rv);
5097dd7cddfSDavid du Colombier *(long*)lv = u.lo;
510219b2ee8SDavid du Colombier break;
511219b2ee8SDavid du Colombier
512219b2ee8SDavid du Colombier case 6: /* ulong */
513219b2ee8SDavid du Colombier t.lo = *(ulong*)lv;
514219b2ee8SDavid du Colombier t.hi = 0;
5157dd7cddfSDavid du Colombier fn(&u, t, rv);
5167dd7cddfSDavid du Colombier *(ulong*)lv = u.lo;
517219b2ee8SDavid du Colombier break;
518219b2ee8SDavid du Colombier
519219b2ee8SDavid du Colombier case 7: /* vlong */
520219b2ee8SDavid du Colombier case 8: /* uvlong */
5217dd7cddfSDavid du Colombier fn(&u, *(Vlong*)lv, rv);
5227dd7cddfSDavid du Colombier *(Vlong*)lv = u;
523219b2ee8SDavid du Colombier break;
524219b2ee8SDavid du Colombier }
5257dd7cddfSDavid du Colombier *ret = u;
5267dd7cddfSDavid du Colombier }
5277dd7cddfSDavid du Colombier
5287dd7cddfSDavid du Colombier void
_p2v(Vlong * ret,void * p)5297dd7cddfSDavid du Colombier _p2v(Vlong *ret, void *p)
5307dd7cddfSDavid du Colombier {
5317dd7cddfSDavid du Colombier long t;
5327dd7cddfSDavid du Colombier
5337dd7cddfSDavid du Colombier t = (ulong)p;
5347dd7cddfSDavid du Colombier ret->lo = t;
5357dd7cddfSDavid du Colombier ret->hi = 0;
536219b2ee8SDavid du Colombier }
537219b2ee8SDavid du Colombier
538219b2ee8SDavid du Colombier void
_sl2v(Vlong * ret,long sl)539219b2ee8SDavid du Colombier _sl2v(Vlong *ret, long sl)
540219b2ee8SDavid du Colombier {
541219b2ee8SDavid du Colombier long t;
542219b2ee8SDavid du Colombier
543219b2ee8SDavid du Colombier t = sl;
544219b2ee8SDavid du Colombier ret->lo = t;
545219b2ee8SDavid du Colombier ret->hi = t >> 31;
546219b2ee8SDavid du Colombier }
547219b2ee8SDavid du Colombier
548219b2ee8SDavid du Colombier void
_ul2v(Vlong * ret,ulong ul)549219b2ee8SDavid du Colombier _ul2v(Vlong *ret, ulong ul)
550219b2ee8SDavid du Colombier {
551219b2ee8SDavid du Colombier long t;
552219b2ee8SDavid du Colombier
553219b2ee8SDavid du Colombier t = ul;
554219b2ee8SDavid du Colombier ret->lo = t;
555219b2ee8SDavid du Colombier ret->hi = 0;
556219b2ee8SDavid du Colombier }
557219b2ee8SDavid du Colombier
558219b2ee8SDavid du Colombier void
_si2v(Vlong * ret,int si)5597dd7cddfSDavid du Colombier _si2v(Vlong *ret, int si)
5607dd7cddfSDavid du Colombier {
5617dd7cddfSDavid du Colombier long t;
5627dd7cddfSDavid du Colombier
5637dd7cddfSDavid du Colombier t = si;
5647dd7cddfSDavid du Colombier ret->lo = t;
5657dd7cddfSDavid du Colombier ret->hi = t >> 31;
5667dd7cddfSDavid du Colombier }
5677dd7cddfSDavid du Colombier
5687dd7cddfSDavid du Colombier void
_ui2v(Vlong * ret,uint ui)5697dd7cddfSDavid du Colombier _ui2v(Vlong *ret, uint ui)
5707dd7cddfSDavid du Colombier {
5717dd7cddfSDavid du Colombier long t;
5727dd7cddfSDavid du Colombier
5737dd7cddfSDavid du Colombier t = ui;
5747dd7cddfSDavid du Colombier ret->lo = t;
5757dd7cddfSDavid du Colombier ret->hi = 0;
5767dd7cddfSDavid du Colombier }
5777dd7cddfSDavid du Colombier
5787dd7cddfSDavid du Colombier void
_sh2v(Vlong * ret,long sh)579219b2ee8SDavid du Colombier _sh2v(Vlong *ret, long sh)
580219b2ee8SDavid du Colombier {
581219b2ee8SDavid du Colombier long t;
582219b2ee8SDavid du Colombier
583219b2ee8SDavid du Colombier t = (sh << 16) >> 16;
584219b2ee8SDavid du Colombier ret->lo = t;
585219b2ee8SDavid du Colombier ret->hi = t >> 31;
586219b2ee8SDavid du Colombier }
587219b2ee8SDavid du Colombier
588219b2ee8SDavid du Colombier void
_uh2v(Vlong * ret,ulong ul)589219b2ee8SDavid du Colombier _uh2v(Vlong *ret, ulong ul)
590219b2ee8SDavid du Colombier {
591219b2ee8SDavid du Colombier long t;
592219b2ee8SDavid du Colombier
593219b2ee8SDavid du Colombier t = ul & 0xffff;
594219b2ee8SDavid du Colombier ret->lo = t;
595219b2ee8SDavid du Colombier ret->hi = 0;
596219b2ee8SDavid du Colombier }
597219b2ee8SDavid du Colombier
598219b2ee8SDavid du Colombier void
_sc2v(Vlong * ret,long uc)599219b2ee8SDavid du Colombier _sc2v(Vlong *ret, long uc)
600219b2ee8SDavid du Colombier {
601219b2ee8SDavid du Colombier long t;
602219b2ee8SDavid du Colombier
603219b2ee8SDavid du Colombier t = (uc << 24) >> 24;
604219b2ee8SDavid du Colombier ret->lo = t;
605219b2ee8SDavid du Colombier ret->hi = t >> 31;
606219b2ee8SDavid du Colombier }
607219b2ee8SDavid du Colombier
608219b2ee8SDavid du Colombier void
_uc2v(Vlong * ret,ulong ul)609219b2ee8SDavid du Colombier _uc2v(Vlong *ret, ulong ul)
610219b2ee8SDavid du Colombier {
611219b2ee8SDavid du Colombier long t;
612219b2ee8SDavid du Colombier
613219b2ee8SDavid du Colombier t = ul & 0xff;
614219b2ee8SDavid du Colombier ret->lo = t;
615219b2ee8SDavid du Colombier ret->hi = 0;
616219b2ee8SDavid du Colombier }
617219b2ee8SDavid du Colombier
618219b2ee8SDavid du Colombier long
_v2sc(Vlong rv)619219b2ee8SDavid du Colombier _v2sc(Vlong rv)
620219b2ee8SDavid du Colombier {
621219b2ee8SDavid du Colombier long t;
622219b2ee8SDavid du Colombier
623219b2ee8SDavid du Colombier t = rv.lo & 0xff;
624219b2ee8SDavid du Colombier return (t << 24) >> 24;
625219b2ee8SDavid du Colombier }
626219b2ee8SDavid du Colombier
627219b2ee8SDavid du Colombier long
_v2uc(Vlong rv)628219b2ee8SDavid du Colombier _v2uc(Vlong rv)
629219b2ee8SDavid du Colombier {
630219b2ee8SDavid du Colombier
631219b2ee8SDavid du Colombier return rv.lo & 0xff;
632219b2ee8SDavid du Colombier }
633219b2ee8SDavid du Colombier
634219b2ee8SDavid du Colombier long
_v2sh(Vlong rv)635219b2ee8SDavid du Colombier _v2sh(Vlong rv)
636219b2ee8SDavid du Colombier {
637219b2ee8SDavid du Colombier long t;
638219b2ee8SDavid du Colombier
639219b2ee8SDavid du Colombier t = rv.lo & 0xffff;
640219b2ee8SDavid du Colombier return (t << 16) >> 16;
641219b2ee8SDavid du Colombier }
642219b2ee8SDavid du Colombier
643219b2ee8SDavid du Colombier long
_v2uh(Vlong rv)644219b2ee8SDavid du Colombier _v2uh(Vlong rv)
645219b2ee8SDavid du Colombier {
646219b2ee8SDavid du Colombier
647219b2ee8SDavid du Colombier return rv.lo & 0xffff;
648219b2ee8SDavid du Colombier }
649219b2ee8SDavid du Colombier
650219b2ee8SDavid du Colombier long
_v2sl(Vlong rv)651219b2ee8SDavid du Colombier _v2sl(Vlong rv)
652219b2ee8SDavid du Colombier {
653219b2ee8SDavid du Colombier
654219b2ee8SDavid du Colombier return rv.lo;
655219b2ee8SDavid du Colombier }
656219b2ee8SDavid du Colombier
657219b2ee8SDavid du Colombier long
_v2ul(Vlong rv)658219b2ee8SDavid du Colombier _v2ul(Vlong rv)
659219b2ee8SDavid du Colombier {
660219b2ee8SDavid du Colombier
661219b2ee8SDavid du Colombier return rv.lo;
662219b2ee8SDavid du Colombier }
663219b2ee8SDavid du Colombier
6647dd7cddfSDavid du Colombier long
_v2si(Vlong rv)6657dd7cddfSDavid du Colombier _v2si(Vlong rv)
6667dd7cddfSDavid du Colombier {
6677dd7cddfSDavid du Colombier
6687dd7cddfSDavid du Colombier return rv.lo;
6697dd7cddfSDavid du Colombier }
6707dd7cddfSDavid du Colombier
6717dd7cddfSDavid du Colombier long
_v2ui(Vlong rv)6727dd7cddfSDavid du Colombier _v2ui(Vlong rv)
6737dd7cddfSDavid du Colombier {
6747dd7cddfSDavid du Colombier
6757dd7cddfSDavid du Colombier return rv.lo;
6767dd7cddfSDavid du Colombier }
6777dd7cddfSDavid du Colombier
678219b2ee8SDavid du Colombier int
_testv(Vlong rv)679219b2ee8SDavid du Colombier _testv(Vlong rv)
680219b2ee8SDavid du Colombier {
681219b2ee8SDavid du Colombier return rv.lo || rv.hi;
682219b2ee8SDavid du Colombier }
683219b2ee8SDavid du Colombier
684219b2ee8SDavid du Colombier int
_eqv(Vlong lv,Vlong rv)685219b2ee8SDavid du Colombier _eqv(Vlong lv, Vlong rv)
686219b2ee8SDavid du Colombier {
687219b2ee8SDavid du Colombier return lv.lo == rv.lo && lv.hi == rv.hi;
688219b2ee8SDavid du Colombier }
689219b2ee8SDavid du Colombier
690219b2ee8SDavid du Colombier int
_nev(Vlong lv,Vlong rv)691219b2ee8SDavid du Colombier _nev(Vlong lv, Vlong rv)
692219b2ee8SDavid du Colombier {
693219b2ee8SDavid du Colombier return lv.lo != rv.lo || lv.hi != rv.hi;
694219b2ee8SDavid du Colombier }
695219b2ee8SDavid du Colombier
696219b2ee8SDavid du Colombier int
_ltv(Vlong lv,Vlong rv)697219b2ee8SDavid du Colombier _ltv(Vlong lv, Vlong rv)
698219b2ee8SDavid du Colombier {
699219b2ee8SDavid du Colombier return (long)lv.hi < (long)rv.hi ||
700219b2ee8SDavid du Colombier (lv.hi == rv.hi && lv.lo < rv.lo);
701219b2ee8SDavid du Colombier }
702219b2ee8SDavid du Colombier
703219b2ee8SDavid du Colombier int
_lev(Vlong lv,Vlong rv)704219b2ee8SDavid du Colombier _lev(Vlong lv, Vlong rv)
705219b2ee8SDavid du Colombier {
706219b2ee8SDavid du Colombier return (long)lv.hi < (long)rv.hi ||
707219b2ee8SDavid du Colombier (lv.hi == rv.hi && lv.lo <= rv.lo);
708219b2ee8SDavid du Colombier }
709219b2ee8SDavid du Colombier
710219b2ee8SDavid du Colombier int
_gtv(Vlong lv,Vlong rv)711219b2ee8SDavid du Colombier _gtv(Vlong lv, Vlong rv)
712219b2ee8SDavid du Colombier {
713219b2ee8SDavid du Colombier return (long)lv.hi > (long)rv.hi ||
714219b2ee8SDavid du Colombier (lv.hi == rv.hi && lv.lo > rv.lo);
715219b2ee8SDavid du Colombier }
716219b2ee8SDavid du Colombier
717219b2ee8SDavid du Colombier int
_gev(Vlong lv,Vlong rv)718219b2ee8SDavid du Colombier _gev(Vlong lv, Vlong rv)
719219b2ee8SDavid du Colombier {
720219b2ee8SDavid du Colombier return (long)lv.hi > (long)rv.hi ||
721219b2ee8SDavid du Colombier (lv.hi == rv.hi && lv.lo >= rv.lo);
722219b2ee8SDavid du Colombier }
723219b2ee8SDavid du Colombier
724219b2ee8SDavid du Colombier int
_lov(Vlong lv,Vlong rv)725219b2ee8SDavid du Colombier _lov(Vlong lv, Vlong rv)
726219b2ee8SDavid du Colombier {
727219b2ee8SDavid du Colombier return lv.hi < rv.hi ||
728219b2ee8SDavid du Colombier (lv.hi == rv.hi && lv.lo < rv.lo);
729219b2ee8SDavid du Colombier }
730219b2ee8SDavid du Colombier
731219b2ee8SDavid du Colombier int
_lsv(Vlong lv,Vlong rv)732219b2ee8SDavid du Colombier _lsv(Vlong lv, Vlong rv)
733219b2ee8SDavid du Colombier {
734219b2ee8SDavid du Colombier return lv.hi < rv.hi ||
735219b2ee8SDavid du Colombier (lv.hi == rv.hi && lv.lo <= rv.lo);
736219b2ee8SDavid du Colombier }
737219b2ee8SDavid du Colombier
738219b2ee8SDavid du Colombier int
_hiv(Vlong lv,Vlong rv)739219b2ee8SDavid du Colombier _hiv(Vlong lv, Vlong rv)
740219b2ee8SDavid du Colombier {
741219b2ee8SDavid du Colombier return lv.hi > rv.hi ||
742219b2ee8SDavid du Colombier (lv.hi == rv.hi && lv.lo > rv.lo);
743219b2ee8SDavid du Colombier }
744219b2ee8SDavid du Colombier
745219b2ee8SDavid du Colombier int
_hsv(Vlong lv,Vlong rv)746219b2ee8SDavid du Colombier _hsv(Vlong lv, Vlong rv)
747219b2ee8SDavid du Colombier {
748219b2ee8SDavid du Colombier return lv.hi > rv.hi ||
749219b2ee8SDavid du Colombier (lv.hi == rv.hi && lv.lo >= rv.lo);
750219b2ee8SDavid du Colombier }
751