|
|
1.1 root 1: #include <sys/param.h>
2:
3: /*
4: * long-long support
5: */
6:
7: #define M 0x80000000
8:
9: unsigned
10: Lshift(ll, l)
11: llong_t ll;
12: long l;
13: {
14: return (ll.hi<<(32-l)) | (ll.lo>>l);
15: }
16:
17: llong_t
18: ltoL(l)
19: long l;
20: {
21: llong_t t;
22:
23: t.hi = 0;
24: t.lo = l;
25: return t;
26: }
27:
28: llong_t
29: Lladd(ll, l)
30: llong_t ll;
31: long l;
32: {
33: llong_t t;
34: long cin;
35:
36: t = ll;
37: t.lo += l;
38: cin = ll.lo^t.lo;
39: if (l>=0) {
40: if ((ll.lo&cin)&M)
41: t.hi++;
42: } else {
43: if ((~ll.lo&cin)&M)
44: t.hi--;
45: }
46: return t;
47: }
48:
49: llong_t
50: Luadd(ll, u)
51: llong_t ll;
52: unsigned long u;
53: {
54: llong_t t;
55: long cin;
56:
57: t = ll;
58: t.lo += u;
59: cin = ll.lo^t.lo;
60: if ((ll.lo&cin)&M)
61: t.hi++;
62: return t;
63: }
64:
65: llong_t
66: LLadd(lla, llb)
67: llong_t lla, llb;
68: {
69: llong_t t;
70:
71: t.hi = lla.hi+llb.hi;
72: t.lo = lla.lo+llb.lo;
73: if ((lla.lo&llb.lo | lla.lo&~t.lo | llb.lo&~t.lo)&M)
74: t.hi++;
75: return t;
76: }
77:
78: llong_t
79: Llmul(a, b)
80: llong_t a;
81: unsigned long b;
82: {
83: llong_t r;
84:
85: r = ltoL(0);
86: while(b){
87: if(b&1)
88: r = LLadd(r, a);
89: b >>= 1;
90: a = LLadd(a, a);
91: }
92: return(r);
93: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.