|
|
1.1 root 1: /*--
2:
3: Module Name:
4:
5: largeint.h
6:
7: Abstract:
8:
9: Include file for sample Large Integer Arithmetic routines.
10: This file includes all of the prototypes for the routines found in
11: largeint.lib. For complete descriptions of these functions, see the
12: largeint.s source file for MIPS, or the divlarge.c and largeint.asm
13: source files for x86.
14:
15: Revision History:
16:
17: --*/
18:
19: #ifdef __cplusplus
20: extern "C" {
21: #endif
22:
23: //
24: //Large integer arithmetic routines.
25: //
26:
27: //
28: // Large integer add - 64-bits + 64-bits -> 64-bits
29: //
30:
31: LARGE_INTEGER
32: WINAPI
33: LargeIntegerAdd (
34: LARGE_INTEGER Addend1,
35: LARGE_INTEGER Addend2
36: );
37:
38: //
39: // Enlarged integer multiply - 32-bits * 32-bits -> 64-bits
40: //
41:
42: LARGE_INTEGER
43: WINAPI
44: EnlargedIntegerMultiply (
45: LONG Multiplicand,
46: LONG Multiplier
47: );
48:
49: //
50: // Unsigned enlarged integer multiply - 32-bits * 32-bits -> 64-bits
51: //
52:
53: LARGE_INTEGER
54: WINAPI
55: EnlargedUnsignedMultiply (
56: ULONG Multiplicand,
57: ULONG Multiplier
58: );
59:
60: //
61: // Enlarged integer divide - 64-bits / 32-bits > 32-bits
62: //
63:
64: ULONG
65: WINAPI
66: EnlargedUnsignedDivide (
67: IN ULARGE_INTEGER Dividend,
68: IN ULONG Divisor,
69: IN PULONG Remainder
70: );
71:
72: //
73: // Extended large integer magic divide - 64-bits / 32-bits -> 64-bits
74: //
75:
76: LARGE_INTEGER
77: WINAPI
78: ExtendedMagicDivide (
79: LARGE_INTEGER Dividend,
80: LARGE_INTEGER MagicDivisor,
81: CCHAR ShiftCount
82: );
83:
84: //
85: // Large Integer divide - 64-bits / 32-bits -> 64-bits
86: //
87:
88: LARGE_INTEGER
89: WINAPI
90: ExtendedLargeIntegerDivide (
91: LARGE_INTEGER Dividend,
92: ULONG Divisor,
93: PULONG Remainder
94: );
95:
96: //
97: // Large Integer divide - 64-bits / 32-bits -> 64-bits
98: //
99:
100: LARGE_INTEGER
101: WINAPI
102: LargeIntegerDivide (
103: LARGE_INTEGER Dividend,
104: LARGE_INTEGER Divisor,
105: PLARGE_INTEGER Remainder
106: );
107:
108: //
109: // Extended integer multiply - 32-bits * 64-bits -> 64-bits
110: //
111:
112: LARGE_INTEGER
113: WINAPI
114: ExtendedIntegerMultiply (
115: LARGE_INTEGER Multiplicand,
116: LONG Multiplier
117: );
118:
119: //
120: // Large integer negation - -(64-bits)
121: //
122:
123: LARGE_INTEGER
124: WINAPI
125: LargeIntegerNegate (
126: LARGE_INTEGER Subtrahend
127: );
128:
129: //
130: // Large integer subtract - 64-bits - 64-bits -> 64-bits.
131: //
132:
133: LARGE_INTEGER
134: WINAPI
135: LargeIntegerSubtract (
136: LARGE_INTEGER Minuend,
137: LARGE_INTEGER Subtrahend
138: );
139:
140: //
141: // Large integer and - 64-bite & 64-bits -> 64-bits.
142: //
143:
144: #define LargeIntegerAnd(Result, Source, Mask) \
145: { \
146: Result.HighPart = Source.HighPart & Mask.HighPart; \
147: Result.LowPart = Source.LowPart & Mask.LowPart; \
148: }
149:
150:
151: //
152: // Large integer conversion routines.
153: //
154:
155: //
156: // Convert signed integer to large integer.
157: //
158:
159: LARGE_INTEGER
160: WINAPI
161: ConvertLongToLargeInteger (
162: LONG SignedInteger
163: );
164:
165: //
166: // Convert unsigned integer to large integer.
167: //
168:
169: LARGE_INTEGER
170: WINAPI
171: ConvertUlongToLargeInteger (
172: ULONG UnsignedInteger
173: );
174:
175:
176: //
177: // Large integer shift routines.
178: //
179:
180: LARGE_INTEGER
181: WINAPI
182: LargeIntegerShiftLeft (
183: LARGE_INTEGER LargeInteger,
184: CCHAR ShiftCount
185: );
186:
187: LARGE_INTEGER
188: WINAPI
189: LargeIntegerShiftRight (
190: LARGE_INTEGER LargeInteger,
191: CCHAR ShiftCount
192: );
193:
194: LARGE_INTEGER
195: WINAPI
196: LargeIntegerArithmeticShift (
197: LARGE_INTEGER LargeInteger,
198: CCHAR ShiftCount
199: );
200:
201: #define LargeIntegerGreaterThan(X,Y) ( \
202: (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
203: ((X).HighPart > (Y).HighPart) \
204: )
205:
206: #define LargeIntegerGreaterThanOrEqualTo(X,Y) ( \
207: (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
208: ((X).HighPart > (Y).HighPart) \
209: )
210:
211: #define LargeIntegerEqualTo(X,Y) ( \
212: !(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
213: )
214:
215: #define LargeIntegerNotEqualTo(X,Y) ( \
216: (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
217: )
218:
219: #define LargeIntegerLessThan(X,Y) ( \
220: (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
221: ((X).HighPart < (Y).HighPart) \
222: )
223:
224: #define LargeIntegerLessThanOrEqualTo(X,Y) ( \
225: (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
226: ((X).HighPart < (Y).HighPart) \
227: )
228:
229: #define LargeIntegerGreaterThanZero(X) ( \
230: (((X).HighPart == 0) && ((X).LowPart > 0)) || \
231: ((X).HighPart > 0 ) \
232: )
233:
234: #define LargeIntegerGreaterOrEqualToZero(X) ( \
235: (X).HighPart >= 0 \
236: )
237:
238: #define LargeIntegerEqualToZero(X) ( \
239: !((X).LowPart | (X).HighPart) \
240: )
241:
242: #define LargeIntegerNotEqualToZero(X) ( \
243: ((X).LowPart | (X).HighPart) \
244: )
245:
246: #define LargeIntegerLessThanZero(X) ( \
247: ((X).HighPart < 0) \
248: )
249:
250: #define LargeIntegerLessOrEqualToZero(X) ( \
251: ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) \
252: )
253:
254: #ifdef __cplusplus
255: }
256: #endif
257:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.