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;
122 LARGE_INTEGER STDCALL
123 RtlExtendedMagicDivide (LARGE_INTEGER Dividend,
124 LARGE_INTEGER MagicDivisor,
127 LARGE_INTEGER Result;
129 Result.QuadPart = (Dividend.QuadPart * MagicDivisor.QuadPart) >> ShiftCount;
136 LARGE_INTEGER Addend1,
137 LARGE_INTEGER Addend2
142 RC.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
149 RtlLargeIntegerArithmeticShift (
150 LARGE_INTEGER LargeInteger,
157 Shift = ShiftCount % 64;
161 RC.QuadPart = LargeInteger.QuadPart >> Shift;
165 /* copy the sign bit */
166 RC.u.HighPart |= (LargeInteger.u.HighPart & 0x80000000);
167 RC.u.LowPart = LargeInteger.u.HighPart >> Shift;
175 RtlLargeIntegerDivide (
176 LARGE_INTEGER Dividend,
177 LARGE_INTEGER Divisor,
178 PLARGE_INTEGER Remainder
184 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
186 RC.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
193 RtlLargeIntegerNegate (
194 LARGE_INTEGER Subtrahend
199 RC.QuadPart = - Subtrahend.QuadPart;
206 RtlLargeIntegerShiftLeft (
207 LARGE_INTEGER LargeInteger,
214 Shift = ShiftCount % 64;
215 RC.QuadPart = LargeInteger.QuadPart << Shift;
222 RtlLargeIntegerShiftRight (
223 LARGE_INTEGER LargeInteger,
230 Shift = ShiftCount % 64;
231 RC.QuadPart = LargeInteger.QuadPart >> ShiftCount;
238 RtlLargeIntegerSubtract (
239 LARGE_INTEGER Minuend,
240 LARGE_INTEGER Subtrahend
245 RC.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart;