Annotation of ntddk/src/video/displays/s3/equad.hxx, revision 1.1.1.1

1.1       root        1: /******************************Module*Header*******************************\
                      2: * Module Name: equad.hxx
                      3: *
                      4: * A class version of LARGE_INTEGER's
                      5: *
                      6: * Created: 26-Apr-1991 12:48:13
                      7: * Author: Kirk Olynyk [kirko]
                      8: *
                      9: * Copyright (c) 1991 Microsoft Corporation
                     10: *
                     11: \**************************************************************************/
                     12: 
                     13: // #define DEBUG_QUAD 1
                     14: 
                     15: /**************************************************************************\
                     16: *    !!!Hack Alert                                                         *
                     17: *                                                                          *
                     18: *    The following declarations are stolen directly from  <ntrtl.h>        *
                     19: *    I find that I cannot include engine.hxx and <ntrtl.h> in the          *
                     20: *    same file without causing problems. So I have come up with the        *
                     21: *    following hack solution. The correct thing to do would be to          *
                     22: *    fix the include file clash. A better, but incorrect solution,         *
                     23: *    would be to do a sed script on <ntrtl.h> and bring in the stuff       *
                     24: *    that we need.                                                         *
                     25: *                                                                          *
                     26: *            Thu 30-May-1991 08:59:22 by Kirk Olynyk [kirko]               *
                     27: \**************************************************************************/
                     28: 
                     29: 
                     30: 
                     31: #ifndef DOS_PLATFORM
                     32: extern "C" {
                     33: #endif  //DOS_PLATFORM
                     34: 
                     35: LARGE_INTEGER
                     36: RtlEnlargedIntegerMultiply (
                     37:     LONG Multiplicand,
                     38:     LONG Multiplier
                     39:     );
                     40: 
                     41: ULONG
                     42: RtlEnlargedUnsignedDivide (
                     43:     ULARGE_INTEGER Dividend,
                     44:     ULONG Divisor,
                     45:     PULONG Remainder
                     46:     );
                     47: 
                     48: LARGE_INTEGER
                     49: RtlExtendedLargeIntegerDivide (
                     50:     LARGE_INTEGER Dividend,
                     51:     ULONG Divisor,
                     52:     PULONG Remainder
                     53:     );
                     54: 
                     55: LARGE_INTEGER
                     56: RtlExtendedIntegerMultiply (
                     57:     LARGE_INTEGER Multiplicand,
                     58:     LONG Multiplier
                     59:     );
                     60: #ifndef DOS_PLATFORM
                     61: };
                     62: #endif  //DOS_PLATFORM
                     63: 
                     64: /*********************************Class************************************\
                     65: * class EUQUAD
                     66: *
                     67: * Public Interface:
                     68: *
                     69: * History:
                     70: *  Wed 05-Jun-1991 10:26:09 by Kirk Olynyk [kirko]
                     71: * Wrote it.
                     72: \**************************************************************************/
                     73: 
                     74: class EUQUAD
                     75: {
                     76: public:
                     77: 
                     78:     ULONG LowPart;
                     79:     LONG HighPart;
                     80: 
                     81:     EUQUAD()   {}
                     82: 
                     83:     EUQUAD(ULONG ul)
                     84:     {
                     85:         LowPart = ul;
                     86:         HighPart = 0;
                     87:     }
                     88: 
                     89:     BOOL bNegative(VOID)
                     90:     {
                     91:         return((LONG) HighPart < 0);
                     92:     }
                     93: 
                     94:     BOOL bZero(VOID)
                     95:     {
                     96:         return(!(HighPart | LowPart));
                     97:     }
                     98: 
                     99:     BOOL bPositive(VOID)
                    100:     {
                    101:         return(!bNegative() && !bZero());
                    102:     }
                    103: 
                    104:     VOID vMulInit(ULONG ul1,ULONG ul2);
                    105: 
                    106: // EUQUAD(ULONG,ULONG) -- initial value is the product of two ULONG's
                    107: 
                    108:     EUQUAD(ULONG ul1,ULONG ul2)
                    109:     {
                    110:         vMulInit(ul1,ul2);
                    111:     }
                    112: 
                    113:     VOID operator=(ULONG ul)
                    114:     {
                    115:         LowPart = ul;
                    116:         HighPart = 0;
                    117:     }
                    118: 
                    119:     VOID operator=(EUQUAD& euq)
                    120:     {
                    121:         LowPart  = euq.LowPart;
                    122:         HighPart = euq.HighPart;
                    123:     }
                    124: 
                    125:     operator ULONG()
                    126:     {
                    127:         return(LowPart);
                    128:     }
                    129: 
                    130:     VOID operator+=(EUQUAD& euq)
                    131:     {
                    132:         LowPart  += euq.LowPart;
                    133:         HighPart += euq.HighPart + (LowPart < euq.LowPart);
                    134:     }
                    135: 
                    136:     VOID operator-=(EUQUAD& euq)
                    137:     {
                    138:         register ULONG ulTemp = LowPart;
                    139: 
                    140:         LowPart  -= euq.LowPart;
                    141:         HighPart -= euq.HighPart + (LowPart > ulTemp);
                    142:     }
                    143: 
                    144:     VOID operator+=(ULONG ul)
                    145:     {
                    146:         LowPart  += ul;
                    147:         HighPart += (LowPart < ul);
                    148:     }
                    149: 
                    150:     VOID operator-=(ULONG ul)
                    151:     {
                    152:         register ULONG ulT = LowPart;
                    153: 
                    154:         LowPart  -= ul;
                    155:         HighPart -= (LowPart > ulT);
                    156:     }
                    157: 
                    158:     VOID operator--(VOID)
                    159:     {
                    160:         register ULONG ulTemp = LowPart;
                    161: 
                    162:         LowPart--;
                    163:         HighPart -= (LowPart > ulTemp);
                    164:     }
                    165: 
                    166:     VOID vShiftLeft(INT i)
                    167:     {
                    168:         if (i > 63)
                    169:         {
                    170:             *this = 0;
                    171:         }
                    172:         else
                    173:         {
                    174:             if (i >= 32)
                    175:             {
                    176:                 HighPart = (LONG) (LowPart << (i - 32));
                    177:                 LowPart  = 0;
                    178:             }
                    179:             else
                    180:             {
                    181:                 HighPart <<= i;
                    182:                 HighPart |= (LONG) (LowPart >> (32 - i));
                    183:                 LowPart <<= i;
                    184:             }
                    185:         }
                    186:     }
                    187: 
                    188:     VOID operator<<=(INT i)
                    189:     {
                    190:         vShiftLeft(i);
                    191:     }
                    192: 
                    193: // vShiftRight -- unsigned shift right
                    194: 
                    195:     VOID vShiftRight(INT i)
                    196:     {
                    197:         if (i >= 64)
                    198:         {
                    199:             *this = 0;
                    200:         }
                    201:         else
                    202:         {
                    203:             i &= 63;
                    204:             if (i >= 32)
                    205:             {
                    206:                 LowPart  = ((ULONG) HighPart) >> (i - 32);
                    207:                 HighPart = 0;
                    208:             }
                    209:             else
                    210:             {
                    211:                 LowPart >>= i;
                    212:                 LowPart += ((ULONG) HighPart) << (32 - i);
                    213:                 *(ULONG*) &HighPart >>= i;
                    214:             }
                    215:         }
                    216:     }
                    217: 
                    218:     VOID operator>>=(INT i)
                    219:     {
                    220:         vShiftRight(i);
                    221:     }
                    222: 
                    223:     VOID vNeg(VOID)
                    224:     {
                    225:         LowPart  = -(LONG) LowPart;
                    226:         HighPart = -HighPart - (LowPart > 0);
                    227:     }
                    228: 
                    229:     EUQUAD operator+(ULONG ul)
                    230:     {
                    231:         EUQUAD euqT = *this;
                    232:         euqT += ul;
                    233:         return(euqT);
                    234:     }
                    235: 
                    236:     EUQUAD operator-(ULONG ul)
                    237:     {
                    238:         EUQUAD euqT    = *this;
                    239:         euqT.LowPart  -= ul;
                    240:         euqT.HighPart -= (euqT.LowPart > ul);
                    241:         return(euqT);
                    242:     }
                    243: 
                    244:     INT operator==(EUQUAD& euq)
                    245:     {
                    246:         return(HighPart == euq.HighPart && LowPart == euq.LowPart);
                    247:     }
                    248: 
                    249:     INT operator!=(EUQUAD& euq)
                    250:     {
                    251:         return(!(*this == euq));
                    252:     }
                    253: 
                    254:     BOOL operator<(EUQUAD& euq)
                    255:     {
                    256:         return(
                    257:             HighPart == euq.HighPart      ?
                    258:                 (LowPart  < euq.LowPart ) :
                    259:                 ((ULONG) HighPart < (ULONG) euq.HighPart)
                    260:             );
                    261:     }
                    262: 
                    263:     BOOL operator>(EUQUAD& euq)
                    264:     {
                    265:         return(
                    266:             HighPart == euq.HighPart      ?
                    267:                 (LowPart  > euq.LowPart ) :
                    268:                 ((ULONG) HighPart > (ULONG) euq.HighPart)
                    269:             );
                    270:     }
                    271: 
                    272:     VOID operator*=(ULONG ul)
                    273:     {
                    274:         *(LARGE_INTEGER*) this = RtlExtendedIntegerMultiply(*(LARGE_INTEGER *)this,
                    275:                                                             (LONG) ul);
                    276: 
                    277:         EUQUAD euqTemp((ULONG) HighPart,ul);
                    278:         euqTemp.HighPart = (LONG) euqTemp.LowPart;
                    279:         euqTemp.HighPart = 0;
                    280:         vMulInit(LowPart,ul);
                    281:         *this += euqTemp;
                    282:     }
                    283: 
                    284:     ULONG ulLow()
                    285:     {
                    286:         return(LowPart);
                    287:     }
                    288: 
                    289:     ULONG ulHigh()
                    290:     {
                    291:         return((ULONG) HighPart);
                    292:     }
                    293: 
                    294:     LONG lHigh(VOID)
                    295:     {
                    296:         return(HighPart);
                    297:     }
                    298: 
                    299: // ulLow, lHigh -- sets the new value while returning the old value
                    300: 
                    301:     ULONG ulLow(ULONG ul)
                    302:     {
                    303:         ULONG ulTemp = LowPart;
                    304:         LowPart = ul;
                    305:         return(ulTemp);
                    306:     }
                    307: 
                    308:     LONG lHigh(LONG l)
                    309:     {
                    310:         LONG lTemp = HighPart;
                    311:         HighPart = l;
                    312:         return(lTemp);
                    313:     }
                    314: 
                    315: // ULONG ulDiv(ulDivisor, pulRemainder)
                    316: //
                    317: // This function takes an unsigned 64 bit value, divides it by a 32 bit
                    318: // value, to return a 32 bit quotient and remainder (you're on your own
                    319: // if the result doesn't fit in 32 bits).
                    320: 
                    321:     ULONG ulDiv(ULONG ulDivisor, ULONG* pulRemainder)
                    322:     {
                    323: 
                    324:         return RtlEnlargedUnsignedDivide(*(ULARGE_INTEGER *)this,
                    325:                                          ulDivisor,
                    326:                                          pulRemainder);
                    327:     }
                    328: 
                    329: 
                    330: // ULONG ulDiv(ulDivisor)
                    331: //
                    332: // This function takes an unsigned 64 bit value, divides it by a 32 bit
                    333: // value, to return a 32 bit quotient (you're on your own if the result
                    334: // doesn't fit in 32 bits).
                    335: 
                    336:     ULONG ulDiv(ULONG ulDivisor)
                    337:     {
                    338: 
                    339:     // If the high dword of the numerator is zero, we can do the
                    340:     // divide inline:
                    341: 
                    342:         if (HighPart == 0)
                    343:         {
                    344:             return (LowPart / ulDivisor);
                    345:         }
                    346:         else
                    347:         {
                    348:             return RtlEnlargedUnsignedDivide(*(ULARGE_INTEGER *)this,
                    349:                                              ulDivisor,
                    350:                                              (ULONG*) NULL);
                    351:         }
                    352:     }
                    353: 
                    354:     VOID vDiv(ULONG ulDivisor, ULONG* pulRemainder)
                    355:     {
                    356:         *(LARGE_INTEGER*) this = RtlExtendedLargeIntegerDivide(*(LARGE_INTEGER *)this,
                    357:                                                                ulDivisor,
                    358:                                                                pulRemainder);
                    359:     }
                    360: 
                    361: #ifdef DEBUG_QUAD
                    362:     VOID vPrint(CHAR *psz)
                    363:     {
                    364:         DbgPrint("%s = %8lx:%8lx\n",psz,HighPart,LowPart);
                    365:     }
                    366: #endif
                    367: 
                    368: };
                    369: 
                    370: /*********************************Class************************************\
                    371: * class EQUAD : public EUQUAD                                              *
                    372: *                                                                          *
                    373: * Signed 64-bit integer                                                    *
                    374: *                                                                          *
                    375: * History:                                                                 *
                    376: *  Sat 27-Apr-1991 07:33:11 by Kirk Olynyk [kirko]                         *
                    377: * Wrote it.                                                                *
                    378: \**************************************************************************/
                    379: 
                    380: class EQUAD : public EUQUAD
                    381: {
                    382: public:
                    383: 
                    384:     EQUAD() : EUQUAD()  {}
                    385: 
                    386:     EQUAD(LONG l) : EUQUAD()
                    387:     {
                    388:         this->LowPart = (ULONG) l;
                    389:         this->HighPart = -(l < 0);
                    390:     }
                    391: 
                    392:     EQUAD(LONG l1,LONG l2) : EUQUAD()
                    393:     {
                    394:         *(LARGE_INTEGER*) this = RtlEnlargedIntegerMultiply(l1,l2);
                    395:     }
                    396: 
                    397:     VOID vImulInit(LONG l1,LONG l2)
                    398:     {
                    399:         *(LARGE_INTEGER*) this = RtlEnlargedIntegerMultiply(l1,l2);
                    400:     }
                    401: 
                    402:     VOID operator+=(EQUAD& euq)
                    403:     {
                    404:         LowPart  += euq.LowPart;
                    405:         HighPart += euq.HighPart + (LowPart < euq.LowPart);
                    406:     }
                    407: 
                    408:     VOID operator-=(EQUAD& euq)
                    409:     {
                    410:         register ULONG ulTemp = LowPart;
                    411: 
                    412:         LowPart  -= euq.LowPart;
                    413:         HighPart -= euq.HighPart + (LowPart > ulTemp);
                    414:     }
                    415: 
                    416:     VOID vShiftRightOneNibble(VOID)
                    417:     {
                    418:         LowPart >>= 4;
                    419:         LowPart |= (ULONG) (HighPart << 28);
                    420:         HighPart >>= 4;
                    421:     }
                    422: 
                    423:     operator LONG()
                    424:     {
                    425:         return((LONG) LowPart);
                    426:     }
                    427: 
                    428:     VOID operator=(LONG l)
                    429:     {
                    430:         LowPart  = (ULONG) l;
                    431:         HighPart = -(l < 0);
                    432:     }
                    433: 
                    434: // !!! Fix for compiler bug: [andrewgo]
                    435: 
                    436:     VOID operator=(EQUAD& eq)
                    437:     {
                    438:         LowPart  = eq.LowPart;
                    439:         HighPart = eq.HighPart;
                    440:     }
                    441: 
                    442: // vArithShiftRight -- arithmetic shift right
                    443: 
                    444:     VOID vArithShiftRight(INT iShift)
                    445:     {
                    446:         if (iShift > 63)
                    447:         {
                    448:             HighPart = - (LONG) (HighPart < 0);
                    449:             LowPart  =  (ULONG) HighPart;
                    450:         }
                    451:         else
                    452:         {
                    453:             iShift &= 63;
                    454:             if (iShift > 31)
                    455:             {
                    456:                 LowPart = (ULONG) (HighPart >> (iShift - 32));
                    457:                 HighPart = - (HighPart < 0);
                    458:             }
                    459:             else
                    460:             {
                    461:                 LowPart >>= iShift;
                    462:                 LowPart += (ULONG) (HighPart << (32 - iShift));
                    463:                 HighPart >>= iShift;
                    464:             }
                    465:         }
                    466:     }
                    467: 
                    468: // operator>>= -- signed shift right
                    469: 
                    470:     VOID operator>>=(INT iShift)
                    471:     {
                    472:         vArithShiftRight(iShift);
                    473:     }
                    474: 
                    475:     BOOL operator<(EQUAD& eq)
                    476:     {
                    477:         return(
                    478:             HighPart == eq.HighPart ?
                    479:                 (LowPart  < eq.LowPart ) :
                    480:                 ((LONG) HighPart < (LONG) eq.HighPart)
                    481:             );
                    482:     }
                    483: 
                    484:     BOOL operator>(EQUAD& eq)
                    485:     {
                    486:         return(
                    487:             HighPart == eq.HighPart ?
                    488:                 (LowPart  > eq.LowPart ) :
                    489:                 ((LONG) HighPart > (LONG) eq.HighPart)
                    490:             );
                    491:     }
                    492: 
                    493:     BOOL operator<=(EQUAD& eq)
                    494:     {
                    495:         return(!(*this > eq));
                    496:     }
                    497: 
                    498:     BOOL operator>=(EQUAD& eq)
                    499:     {
                    500:         return(!(*this < eq));
                    501:     }
                    502: 
                    503:     VOID operator-=(LONG l)
                    504:     {
                    505:         EQUAD eqT(l);
                    506:         *this -= eqT;
                    507:     }
                    508: 
                    509:     VOID operator+=(LONG l)
                    510:     {
                    511:         EQUAD eqT(l);
                    512:         *this += eqT;
                    513:     }
                    514: 
                    515: // !!! Hack for signed divide. [wendywu]
                    516: // The quotient is adjusted so that the remainder is always > 0.
                    517: 
                    518:     VOID operator/=(LONG l)
                    519:     {
                    520:         ULONG ulRem;
                    521:         BOOL bNegNum = bNegative();
                    522:         BOOL bNegDen = (l < 0);
                    523: 
                    524:         if (bNegNum)
                    525:             vNeg();
                    526: 
                    527:         if (bNegDen)
                    528:             l = -l;
                    529: 
                    530:         *(LARGE_INTEGER *)this =
                    531:         RtlExtendedLargeIntegerDivide(*(LARGE_INTEGER *)this, l, &ulRem);
                    532: 
                    533:         if ((bNegNum ^ bNegDen) != 0)
                    534:         {
                    535:             vNeg();
                    536:             if (bNegNum)
                    537:                 *this -= 1;
                    538:         }
                    539:     }
                    540: };
                    541: 

unix.superglobalmegacorp.com

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