AMD x86 manual Mov Edx, Edx Shr

Models: x86

1 256
Download 256 pages 58.62 Kb
Page 109
Image 109

22007E/0 — November 1999

AMD Athlon™ Processor x86 Code Optimization

ADD

EAX, EDX

;x = (w & 0x33333333) + ((w >> 2) &

 

 

; 0x33333333)

MOV

EDX, EDX

;x

SHR

EAX, 4

;x >> 4

ADD

EAX, EDX

;x + (x >> 4)

AND

EAX, 00F0F0F0Fh

;y = (x + (x >> 4) & 0x0F0F0F0F)

IMUL

EAX, 001010101h

;y * 0x01010101

SHR

EAX, 24

;population count = (y *

 

 

; 0x01010101) >> 24

MOV

retVal, EAX

;store result

}

 

 

return (retVal);

 

}

Derivation of Multiplier Used for Integer Division by Constants

Unsigned Derivation for Algorithm, Multiplier, and Shift Factor

The utility udiv.exe was compiled using the code shown in this section.

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 231–1, inclusive. For divisors of the form d = d*2n, the multiplier is the same as for dand the shift factor is s + n.

/* Code snippet to determine algorithm (a), multiplier (m), and shift factor (s) to perform division on unsigned 32-bit integers by constant divisor. Code is written for the Microsoft Visual C compiler. */

/*

 

 

 

In:

d =

divisor, 1 <= d < 2^31, d odd

Out:

a =

algorithm

 

m =

multiplier

 

s =

shift factor

;algorithm

0

 

MOV

EDX,

dividend

MOV

EAX,

m

 

MUL

EDX

 

 

SHR

EDX,

s

;EDX=quotient

Derivation of Multiplier Used for Integer Division by Constants

93

Page 109
Image 109
AMD x86 manual Mov Edx, Edx Shr