4 Header for 64 bit integer arithmetics library
10 #pragma GCC system_header
20 #define _toi (__int64)
21 #define _toui (unsigned __int64)
23 #error "64 bit integers not supported"
27 We don't let the compiler see the prototypes if we are compiling the
28 library because if it does it will choke on conflicting types in the
32 #if defined(LARGEINT_PROTOS) || defined(__COMPILING_LARGEINT)
34 #ifndef __COMPILING_LARGEINT
35 /* addition/subtraction */
36 LARGE_INTEGER WINAPI
LargeIntegerAdd (LARGE_INTEGER
, LARGE_INTEGER
);
37 LARGE_INTEGER WINAPI
LargeIntegerSubtract (LARGE_INTEGER
, LARGE_INTEGER
);
40 LARGE_INTEGER WINAPI
LargeIntegerArithmeticShift (LARGE_INTEGER
, int);
41 LARGE_INTEGER WINAPI
LargeIntegerShiftLeft (LARGE_INTEGER
, int);
42 LARGE_INTEGER WINAPI
LargeIntegerShiftRight (LARGE_INTEGER
, int);
43 LARGE_INTEGER WINAPI
LargeIntegerNegate (LARGE_INTEGER
);
46 LARGE_INTEGER WINAPI
ConvertLongToLargeInteger (LONG
);
47 LARGE_INTEGER WINAPI
ConvertUlongToLargeInteger (ULONG
);
50 LARGE_INTEGER WINAPI
EnlargedIntegerMultiply (LONG
, LONG
);
51 LARGE_INTEGER WINAPI
EnlargedUnsignedMultiply (ULONG
, ULONG
);
52 LARGE_INTEGER WINAPI
ExtendedIntegerMultiply (LARGE_INTEGER
, LONG
);
53 /* FIXME: is this not part of largeint? */
54 LARGE_INTEGER WINAPI
LargeIntegerMultiply (LARGE_INTEGER
, LARGE_INTEGER
);
55 #endif /* __COMPILING_LARGEINT */
59 #define LargeIntegerAdd(a,b) (LARGE_INTEGER)(_toi(a) + _toi(b))
60 #define LargeIntegerSubtract(a,b) (LARGE_INTEGER)(_toi(a) - _toi(b))
61 #define LargeIntegerRightShift(i,n) (LARGE_INTEGER)(_toi(i) >> (n))
62 #define LargeIntegerArithmeticShift LargeIntegerRightShift
63 #define LargeIntegerLeftShift(i,n) (LARGE_INTEGER)(_toi(i) << (n))
64 #define LargeIntegerNegate(i) (LARGE_INTEGER)(- _toi(i))
65 #define EnlargedIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b))
66 #define EnlargedUnsignedMultiply(a,b) (LARGE_INTEGER)(_toui(a) * _toui(b))
67 #define ExtendedIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b))
68 /* FIXME: should this exist */
69 #define LargeIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b))
70 #define ConvertLongToLargeInteger(l) (LARGE_INTEGER)(_toi(l))
71 #define ConvertUlongToLargeInteger(ul) (LARGE_INTEGER)(_toui(ul))
73 #endif /* LARGEINT_PROTOS || __COMPILING_LARGEINT */
75 #ifndef __COMPILING_LARGEINT
76 /* division; no macros of these because of multiple expansion */
77 LARGE_INTEGER WINAPI
LargeIntegerDivide (LARGE_INTEGER
, LARGE_INTEGER
, PLARGE_INTEGER
);
78 ULONG WINAPI
EnlargedUnsignedDivide (ULARGE_INTEGER
, ULONG
, PULONG
);
79 LARGE_INTEGER WINAPI
ExtendedLargeIntegerDivide (LARGE_INTEGER
, ULONG
, PULONG
);
80 LARGE_INTEGER WINAPI
ExtendedMagicDivide (LARGE_INTEGER
, LARGE_INTEGER
, int);
81 #endif /* __COMPILING_LARGEINT */
83 #define LargeIntegerAnd(dest, src, m) \
85 dest._STRUCT_NAME(u.)LowPart = s._STRUCT_NAME(u.)LowPart & m._STRUCT_NAME(u.)LowPart; \
86 dest._STRUCT_NAME(u.)HighPart = s._STRUCT_NAME(u.)HighPart & m._STRUCT_NAME(u.)HighPart; \
90 #define LargeIntegerGreaterThan(a,b) (_toi(a) > _toi(b))
91 #define LargeIntegerGreaterThanOrEqual(a,b) (_toi(a) >= _toi(b))
92 #define LargeIntegerEqualTo(a,b) (_toi(a) == _toi(b))
93 #define LargeIntegerNotEqualTo(a,b) (_toi(a) != _toi(b))
94 #define LargeIntegerLessThan(a,b) (_toi(a) < _toi(b))
95 #define LargeIntegerLessThanOrEqualTo(a,b) (_toi(a) <= _toi(b))
96 #define LargeIntegerGreaterThanZero(a) (_toi(a) > 0)
97 #define LargeIntegerGreaterOrEqualToZero(a) ((a)._STRUCT_NAME(u.)HighPart > 0)
98 #define LargeIntegerEqualToZero(a) !((a)._STRUCT_NAME(u.)LowPart | (a)._STRUCT_NAME(u.)HighPart)
99 #define LargeIntegerNotEqualToZero(a) ((a)._STRUCT_NAME(u.)LowPart | (a)._STRUCT_NAME(u.)HighPart)
100 #define LargeIntegerLessThanZero(a) ((a)._STRUCT_NAME(u.)HighPart < 0)
101 #define LargeIntegerLessOrEqualToZero(a) (_toi(a) <= 0)
103 #ifndef __COMPILING_LARGEINT
112 #endif /* _LARGEINT_H */