3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: lib/ntdll/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 <ntdll/ntdll.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,
134 LARGE_INTEGER Addend1,
135 LARGE_INTEGER Addend2
140 RC.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
147 RtlLargeIntegerArithmeticShift (
148 LARGE_INTEGER LargeInteger,
155 Shift = ShiftCount % 64;
159 RC.QuadPart = LargeInteger.QuadPart >> Shift;
163 /* copy the sign bit */
164 RC.u.HighPart |= (LargeInteger.u.HighPart & 0x80000000);
165 RC.u.LowPart = LargeInteger.u.HighPart >> Shift;
173 RtlLargeIntegerDivide (
174 LARGE_INTEGER Dividend,
175 LARGE_INTEGER Divisor,
176 PLARGE_INTEGER Remainder
182 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
184 RC.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
191 RtlLargeIntegerNegate (
192 LARGE_INTEGER Subtrahend
197 RC.QuadPart = - Subtrahend.QuadPart;
204 RtlLargeIntegerShiftLeft (
205 LARGE_INTEGER LargeInteger,
212 Shift = ShiftCount % 64;
213 RC.QuadPart = LargeInteger.QuadPart << Shift;
220 RtlLargeIntegerShiftRight (
221 LARGE_INTEGER LargeInteger,
228 Shift = ShiftCount % 64;
229 RC.QuadPart = LargeInteger.QuadPart >> Shift;
236 RtlLargeIntegerSubtract (
237 LARGE_INTEGER Minuend,
238 LARGE_INTEGER Subtrahend
243 RC.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart;