Annotation of mstools/samples/largeint/i386/divlarge.c, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Module Name:
        !             4: 
        !             5:     divlarge.c
        !             6: 
        !             7: Abstract:
        !             8: 
        !             9:     This module implements the runtime library large integer divide
        !            10:     routines.
        !            11: 
        !            12:     N.B. These routines use a one bit at a time algorithm and is slow.
        !            13:          They should be used only when absolutely necessary.
        !            14: 
        !            15: Revision History:
        !            16: 
        !            17: --*/
        !            18: 
        !            19: #include "windows.h"
        !            20: #include "divlarge.h"
        !            21: 
        !            22: LARGE_INTEGER
        !            23: WINAPI
        !            24: LargeIntegerDivide (
        !            25:     IN LARGE_INTEGER Dividend,
        !            26:     IN LARGE_INTEGER Divisor,
        !            27:     OUT PLARGE_INTEGER Remainder OPTIONAL
        !            28:     )
        !            29: 
        !            30: /*++
        !            31: 
        !            32: Routine Description:
        !            33: 
        !            34:     This routine divides an unsigned 64-bit dividend by an unsigned 64-bit
        !            35:     divisor and returns a 64-bit quotient, and optionally a 64-bit remainder.
        !            36: 
        !            37: Arguments:
        !            38: 
        !            39:     Dividend - Supplies the 64-bit dividend for the divide operation.
        !            40: 
        !            41:     Divisor - Supplies the 64-bit divisor for the divide operation.
        !            42: 
        !            43:     Remainder - Supplies an optional pointer to a variable which receives
        !            44:         the remainder
        !            45: 
        !            46: Return Value:
        !            47: 
        !            48:     The 64-bit quotient is returned as the function value.
        !            49: 
        !            50: --*/
        !            51: 
        !            52: {
        !            53: 
        !            54:     ULONG Index = 64;
        !            55:     LARGE_INTEGER Partial = {0, 0};
        !            56:     LARGE_INTEGER Quotient;
        !            57: 
        !            58:     //
        !            59:     // Loop through the dividend bits and compute the quotient and remainder.
        !            60:     //
        !            61: 
        !            62:     Quotient = Dividend;
        !            63:     do {
        !            64: 
        !            65:         //
        !            66:         // Shift the next dividend bit into the parital remainder and shift
        !            67:         // the partial quotient (dividend) left one bit.
        !            68:         //
        !            69: 
        !            70:         Partial.HighPart = (Partial.HighPart << 1) | (Partial.LowPart >> 31);
        !            71:         Partial.LowPart = (Partial.LowPart << 1) | ((ULONG)Quotient.HighPart >> 31);
        !            72:         Quotient.HighPart = (Quotient.HighPart << 1) | (Quotient.LowPart >> 31);
        !            73:         Quotient.LowPart <<= 1;
        !            74: 
        !            75:         //
        !            76:         // If the partial remainder is greater than or equal to the divisor,
        !            77:         // then subtract the divisor from the partial remainder and insert a
        !            78:         // one bit into the quotient.
        !            79:         //
        !            80: 
        !            81:         if (((ULONG)Partial.HighPart > (ULONG)Divisor.HighPart) ||
        !            82:             ((Partial.HighPart == Divisor.HighPart) &&
        !            83:             (Partial.LowPart >= Divisor.LowPart))) {
        !            84: 
        !            85:             Quotient.LowPart |= 1;
        !            86:             Partial.HighPart -= Divisor.HighPart;
        !            87:             if (Partial.LowPart < Divisor.LowPart) {
        !            88:                 Partial.HighPart -= 1;
        !            89:             }
        !            90: 
        !            91:             Partial.LowPart -= Divisor.LowPart;
        !            92:         }
        !            93: 
        !            94:         Index -= 1;
        !            95:     } while (Index > 0);
        !            96: 
        !            97:     //
        !            98:     // If the remainder is requested, then return the 64-bit remainder.
        !            99:     //
        !           100: 
        !           101:     if (ARGUMENT_PRESENT(Remainder)) {
        !           102:         *Remainder = Partial;
        !           103:     }
        !           104: 
        !           105:     //
        !           106:     // Return the 64-bit quotient.
        !           107:     //
        !           108: 
        !           109:     return Quotient;
        !           110: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.