AMD 250 用户手册

下载
页码 384
186
Integer Optimizations
Chapter 8
25112
Rev. 3.06
September 2005
Software Optimization Guide for AMD64 Processors
8.8
Derivation of Algorithm, Multiplier, and Shift 
Factor for Integer Division by Constants
The following examples illustrate the derivation of algorithm, multiplier and shift factor for signed 
and unsigned integer division.
Unsigned Integer Division
The utility 
udiv.exe
 was compiled from the code shown in this section. The utilities provided in this 
document are for reference only and are not supported by AMD.
The following code derives the multiplier value used when performing integer division by constants. 
The code works for unsigned integer division and for odd divisors between 1 and 2
31
– 1, inclusive. 
For divisors of the form d' * 2n, the multiplier is the same as for d' and the shift factor is n.
Example
/* This program determines the algorithm (a), multiplier (m), and
    shift factor (s) to be used to accomplish *unsigned* division by
    a constant divisor. Compile with MSVC.
*/
#include <stdio.h>
typedef unsigned __int64 U64;
typedef unsigned long    U32;
U32 log2(U32 i)
{
   U32 t = 0;
   i = i >> 1;
   while (i) {
      i = i >> 1;
      t++;
   }
   return(t);
}
U32 res1, res2;
U32 d, l, s, m, a, r, n, t;
U64 m_low, m_high, j, k;
int main (void)
{
   fprintf(stderr, "\n");
   fprintf(stderr, "Unsigned division by constant\n");
   fprintf(stderr, "=============================\n\n");