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