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 *****************************************************************/
26 RtlConvertLongToLargeInteger (
32 RC.QuadPart = SignedInteger;
39 RtlConvertUlongToLargeInteger (
45 RC.QuadPart = UnsignedInteger;
52 RtlEnlargedIntegerMultiply (
59 RC.QuadPart = (LONGLONG) Multiplicand * Multiplier;
66 RtlEnlargedUnsignedDivide (
67 ULARGE_INTEGER Dividend,
73 *Remainder = Dividend.QuadPart % Divisor;
75 return (ULONG)(Dividend.QuadPart / Divisor);
80 RtlEnlargedUnsignedMultiply (
87 RC.QuadPart = (ULONGLONG) Multiplicand * Multiplier;
94 RtlExtendedIntegerMultiply (
95 LARGE_INTEGER Multiplicand,
101 RC.QuadPart = Multiplicand.QuadPart * Multiplier;
108 RtlExtendedLargeIntegerDivide (
109 LARGE_INTEGER Dividend,
117 *Remainder = Dividend.QuadPart % Divisor;
119 RC.QuadPart = Dividend.QuadPart / Divisor;
126 RtlExtendedMagicDivide (LARGE_INTEGER Dividend,
127 LARGE_INTEGER MagicDivisor,
130 LARGE_INTEGER Result;
132 Result.QuadPart = (Dividend.QuadPart * MagicDivisor.QuadPart) >> ShiftCount;
136 #endif /* LIBCAPTIVE */
141 LARGE_INTEGER Addend1,
142 LARGE_INTEGER Addend2
147 RC.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
156 RtlLargeIntegerArithmeticShift (
157 LARGE_INTEGER LargeInteger,
164 Shift = ShiftCount % 64;
168 RC.QuadPart = LargeInteger.QuadPart >> Shift;
172 /* copy the sign bit */
173 RC.u.HighPart |= (LargeInteger.u.HighPart & 0x80000000);
174 RC.u.LowPart = LargeInteger.u.HighPart >> Shift;
182 RtlLargeIntegerDivide (
183 LARGE_INTEGER Dividend,
184 LARGE_INTEGER Divisor,
185 PLARGE_INTEGER Remainder
191 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
193 RC.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
200 RtlLargeIntegerNegate (
201 LARGE_INTEGER Subtrahend
206 RC.QuadPart = - Subtrahend.QuadPart;
213 RtlLargeIntegerShiftLeft (
214 LARGE_INTEGER LargeInteger,
221 Shift = ShiftCount % 64;
222 RC.QuadPart = LargeInteger.QuadPart << Shift;
229 RtlLargeIntegerShiftRight (
230 LARGE_INTEGER LargeInteger,
237 Shift = ShiftCount % 64;
238 RC.QuadPart = LargeInteger.QuadPart >> ShiftCount;
245 RtlLargeIntegerSubtract (
246 LARGE_INTEGER Minuend,
247 LARGE_INTEGER Subtrahend
252 RC.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart;
257 #endif /* LIBCAPTIVE */