Date : May 06 '96, 22:35
From : Jon Merkel 1:124/1301
To : Mel Mcbain
Subj : 64-bit math
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MM> If anyone could shed some light on a speedy 64/64 bit algo, well
MM> I'd be so grateful I'd name my first born after their pet pooch.
Ok, here's some code I've written. It uses 32 bit registers, though, and
divides a 128 bit number by a 64 bit one: (untested!!!, but should work)
; In:
; edx:ecx:ebx:eax = 128-bit dividend
; edi:esi = 64-bit divisor
; Out:
; ebx:eax = quotient
; edx:ecx = remainder
; Modifies:
; edi,esi,ebp
mov ebp,64 ; 64 bits to process
@1: add eax,eax ; shift left edx:ecx:ebx:eax 1 bit
adc ebx,ebx
adc ecx,ecx
adc edx,edx
inc eax
sub ecx,esi ; edx:ecx -= edi:esi
sbb edx,edi
jnb @2
dec eax
add ecx,esi ; edx:ecx += edi:esi (to restore)
adc edx,edi
@2: dec ebp
jnz @1
I'm not sure how you'd do this with only 16-bit registers; you'll probably need
to use some variables in memory.
MM> p.s. What div algo do the chip makers use? Is it the sub loop algo too?
No way... This above code is a restoring division algorithm based on one
from my hardware design course. The fastest division algorithms (non-
restoring) require 1 shift and 1 add/subtract per bit in the divisor.
--- Maximus 3.00
* Origin: The MOCHINE BBS * Irving, TX * 214/399-8414 * HST DS * (1:124/1301)