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 */