3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: kernel/rtl/largeint.c
6 * PURPOSE: Large integer operations
9 * 08/30/98 RJJ Implemented several functions
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
17 #include <internal/debug.h>
20 /* FUNCTIONS *****************************************************************/
24 RtlConvertLongToLargeInteger (
30 RC.QuadPart = SignedInteger;
37 RtlConvertUlongToLargeInteger (
43 RC.QuadPart = UnsignedInteger;
50 RtlEnlargedIntegerMultiply (
57 RC.QuadPart = (LONGLONG) Multiplicand * Multiplier;
64 RtlEnlargedUnsignedDivide (
65 ULARGE_INTEGER Dividend,
71 *Remainder = Dividend.QuadPart % Divisor;
73 return (ULONG)(Dividend.QuadPart / Divisor);
78 RtlEnlargedUnsignedMultiply (
85 RC.QuadPart = (ULONGLONG) Multiplicand * Multiplier;
92 RtlExtendedIntegerMultiply (
93 LARGE_INTEGER Multiplicand,
99 RC.QuadPart = Multiplicand.QuadPart * Multiplier;
106 RtlExtendedLargeIntegerDivide (
107 LARGE_INTEGER Dividend,
115 *Remainder = Dividend.QuadPart % Divisor;
117 RC.QuadPart = Dividend.QuadPart / Divisor;
124 RtlExtendedMagicDivide (LARGE_INTEGER Dividend,
125 LARGE_INTEGER MagicDivisor,
128 LARGE_INTEGER Result;
130 Result.QuadPart = (Dividend.QuadPart * MagicDivisor.QuadPart) >> ShiftCount;
137 LARGE_INTEGER Addend1,
138 LARGE_INTEGER Addend2
143 RC.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
150 RtlLargeIntegerArithmeticShift (
151 LARGE_INTEGER LargeInteger,
158 Shift = ShiftCount % 64;
162 RC.QuadPart = LargeInteger.QuadPart >> Shift;
166 /* copy the sign bit */
167 RC.u.HighPart |= (LargeInteger.u.HighPart & 0x80000000);
168 RC.u.LowPart = LargeInteger.u.HighPart >> Shift;
176 RtlLargeIntegerDivide (
177 LARGE_INTEGER Dividend,
178 LARGE_INTEGER Divisor,
179 PLARGE_INTEGER Remainder
185 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
187 RC.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
194 RtlLargeIntegerNegate (
195 LARGE_INTEGER Subtrahend
200 RC.QuadPart = - Subtrahend.QuadPart;
207 RtlLargeIntegerShiftLeft (
208 LARGE_INTEGER LargeInteger,
215 Shift = ShiftCount % 64;
216 RC.QuadPart = LargeInteger.QuadPart << Shift;
223 RtlLargeIntegerShiftRight (
224 LARGE_INTEGER LargeInteger,
231 Shift = ShiftCount % 64;
232 RC.QuadPart = LargeInteger.QuadPart >> ShiftCount;
239 RtlLargeIntegerSubtract (
240 LARGE_INTEGER Minuend,
241 LARGE_INTEGER Subtrahend
246 RC.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart;