AMD Typewriter x86 사용자 설명서
80
Replace Divides with Multiplies
AMD Athlon™ Processor x86 Code Optimization
22007E/0—November 1999
;algorithm 1
MOV EAX, m
MOV EDX, dividend
MOV ECX, EDX
IMUL EDX
ADD EDX, ECX
SHR ECX, 31
SAR EDX, s
ADD EDX, ECX ;quotient in EDX
MOV EAX, m
MOV EDX, dividend
MOV ECX, EDX
IMUL EDX
ADD EDX, ECX
SHR ECX, 31
SAR EDX, s
ADD EDX, ECX ;quotient in EDX
Derivation for a, m, s
The derivation for the algorithm (a), multiplier (m), and shift
count (s), is found in the section “Signed Derivation for
Algorithm, Multiplier, and Shift Factor” on page 95.
count (s), is found in the section “Signed Derivation for
Algorithm, Multiplier, and Shift Factor” on page 95.
Signed Division By 2
;IN: EAX = dividend
;OUT:EAX = quotient
CMP
;OUT:EAX = quotient
CMP
EAX, 800000000h
;CY = 1, if dividend >=0
SBB
EAX, –1
;Increment dividend if it is < 0
SAR
EAX, 1
;Perform a right shift
Signed Division By 2
n
;IN:EAX = dividend
;OUT:EAX = quotient
CDQ
;OUT:EAX = quotient
CDQ
;Sign extend into EDX
AND
EDX, (2^n–1)
;Mask correction (use divisor –1)
ADD
EAX, EDX
;Apply correction if necessary
SAR
EAX, (n)
;Perform right shift by
; log2 (divisor)
; log2 (divisor)
Signed Division By –2
;IN:EAX = dividend
;OUT:EAX = quotient
CMP
;OUT:EAX = quotient
CMP
EAX, 800000000h
;CY = 1, if dividend >= 0
SBB
EAX, –1
;Increment dividend if it is < 0
SAR
EAX, 1
;Perform right shift
NEG
EAX
;Use (x/–2) == –(x/2)
Signed Division By
–(2
–(2
n
)
;IN:EAX = dividend
;OUT:EAX = quotient
CDQ
;OUT:EAX = quotient
CDQ
;Sign extend into EDX
AND
EDX, (2^n–1)
;Mask correction (–divisor –1)
ADD
EAX, EDX
;Apply correction if necessary
SAR
EAX, (n)
;Right shift by log2(–divisor)
NEG
EAX
;Use (x/–(2^n)) == (–(x/2^n))
Remainder of Signed
Integer 2 or –2
Integer 2 or –2
;IN:EAX = dividend
;OUT:EAX = remainder
CDQ
;OUT:EAX = remainder
CDQ
;Sign extend into EDX
AND
EDX, 1
;Compute remainder
XOR
EAX, EDX
;Negate remainder if
SUB
EAX, EDX
;Dividend was < 0
MOV
[remainder], EAX