MULDIV32.H
Upload User: bangxh
Upload Date: 2007-01-31
Package Size: 42235k
Code Size: 4k
Category:

Windows Develop

Development Platform:

Visual C++

  1. //==========================================================================;
  2. //
  3. //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4. //  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5. //  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6. //  PURPOSE.
  7. //
  8. //  Copyright (C) 1992 - 1997 Microsoft Corporation.  All Rights Reserved.
  9. //
  10. //--------------------------------------------------------------------------;
  11. //
  12. //  muldiv32.h
  13. //
  14. //  Description:
  15. //      math routines for 32 bit signed and unsiged numbers.
  16. //
  17. //      MulDiv32(a,b,c) = (a * b) / c         (round down, signed)
  18. //
  19. //      MulDivRD(a,b,c) = (a * b) / c         (round down, unsigned)
  20. //      MulDivRN(a,b,c) = (a * b + c/2) / c   (round nearest, unsigned)
  21. //      MulDivRU(a,b,c) = (a * b + c-1) / c   (round up, unsigned)
  22. //
  23. //==========================================================================;
  24. #ifndef _INC_MULDIV32
  25. #define _INC_MULDIV32
  26. #ifndef INLINE
  27. #define INLINE __inline
  28. #endif
  29. #ifdef _X86_
  30.     //
  31.     //  Use 32-bit x86 assembly.
  32.     //
  33.     #pragma warning(disable:4035 4704)
  34.     INLINE LONG MulDiv32(LONG a,LONG b,LONG c)
  35.     {
  36.         _asm     mov     eax,dword ptr a  //  mov  eax, a
  37.         _asm     mov     ebx,dword ptr b  //  mov  ebx, b
  38.         _asm     mov     ecx,dword ptr c  //  mov  ecx, c
  39.         _asm     imul    ebx              //  imul ebx
  40.         _asm     idiv    ecx              //  idiv ecx
  41.         _asm  shld  edx, eax, 16     //  shld edx, eax, 16
  42.     } // MulDiv32()
  43.     INLINE DWORD MulDivRN(DWORD a,DWORD b,DWORD c)
  44.     {
  45.         _asm     mov     eax,dword ptr a  //  mov  eax, a
  46.         _asm     mov     ebx,dword ptr b  //  mov  ebx, b
  47.         _asm     mov     ecx,dword ptr c  //  mov  ecx, c
  48.         _asm     mul     ebx              //  mul  ebx
  49.         _asm     mov     ebx,ecx          //  mov  ebx,ecx
  50.         _asm     shr     ebx,1            //  sar  ebx,1
  51.         _asm     add     eax,ebx          //  add  eax,ebx
  52.         _asm     adc     edx,0            //  adc  edx,0
  53.         _asm     div     ecx              //  div  ecx
  54.         _asm     shld    edx, eax, 16     //  shld edx, eax, 16
  55.     } // MulDiv32()
  56.     INLINE DWORD MulDivRU(DWORD a,DWORD b,DWORD c)
  57.     {
  58.         _asm     mov     eax,dword ptr a  //  mov  eax, a
  59.         _asm     mov     ebx,dword ptr b  //  mov  ebx, b
  60.         _asm     mov     ecx,dword ptr c  //  mov  ecx, c
  61.         _asm     mul     ebx              //  mul  ebx
  62.         _asm     mov     ebx,ecx          //  mov  ebx,ecx
  63.         _asm     dec     ebx              //  dec  ebx
  64.         _asm     add     eax,ebx          //  add  eax,ebx
  65.         _asm     adc     edx,0            //  adc  edx,0
  66.         _asm     div     ecx              //  div  ecx
  67.         _asm     shld    edx, eax, 16     //  shld edx, eax, 16
  68.     } // MulDivRU32()
  69.     INLINE DWORD MulDivRD(DWORD a,DWORD b,DWORD c)
  70.     {
  71.         _asm     mov     eax,dword ptr a  //  mov  eax, a
  72.         _asm     mov     ebx,dword ptr b  //  mov  ebx, b
  73.         _asm     mov     ecx,dword ptr c  //  mov  ecx, c
  74.         _asm     mul     ebx              //  mul  ebx
  75.         _asm     div     ecx              //  div  ecx
  76.         _asm     shld    edx, eax, 16     //  shld edx, eax, 16
  77.     } // MulDivRD32()
  78.     #pragma warning(default:4035 4704)
  79. #else
  80.     //
  81.     //  Use C9 __int64 support for Daytona RISC platforms.
  82.     //
  83.     INLINE LONG MulDiv32( LONG a, LONG b, LONG c )
  84.     {
  85.         return (LONG)( Int32x32To64(a,b) / c );
  86.     }
  87.     INLINE DWORD MulDivRD( DWORD a, DWORD b, DWORD c )
  88.     {
  89.         return (DWORD)( UInt32x32To64(a,b) / c );
  90.     }
  91.     INLINE DWORD MulDivRN( DWORD a, DWORD b, DWORD c )
  92.     {
  93.         return (DWORD)( (UInt32x32To64(a,b)+c/2) / c );
  94.     }
  95.     INLINE DWORD MulDivRU( DWORD a, DWORD b, DWORD c )
  96.     {
  97.         return (DWORD)( (UInt32x32To64(a,b)+c-1) / c );
  98.     }
  99. #endif
  100. //
  101. //  some code references these by other names.
  102. //
  103. #define muldiv32    MulDivRN
  104. #define muldivrd32  MulDivRD
  105. #define muldivru32  MulDivRU
  106. #endif  // _INC_MULDIV32