comp.sys.acorn (132/147)
Path: cix!slxsys!uknet!ukc!mcsun!fuug!news.funet.fi!sunic!dkuug!diku!torbenm
From: torbenm@diku.dk (Torben AEgidius Mogensen)
Newsgroups: comp.sys.acorn
Subject: Re: fast divide
Message-ID: <1991Oct31.153421.22641@odin.diku.dk>
Date: 31 Oct 91 15:34:21 GMT
References: <3351@m1.cs.man.ac.uk>
Sender: torbenm@freke.diku.dk
Organization: Department of Computer Science, U of Copenhagen
Lines: 41

rogersh%t3b@uk.ac.man.cs (Huw J. Rogers) writes:


>	Can people post/email the fastest 32 bit divide/modulus
>routines they have for the ARM? ObjAsm stuff is preferred, but
>BASIC assembler (ugh!) will do... ;-)

Here is one I cooked up. It is from memory, so there might be slight
errors. The comparisons before the first SUB ensure that no overflow
happens on the ASL. Worst case time is 5 cycles per bit.

Arguments in p,q.
on exit, r = p div q, p = p mod q

.div
 MOV r,#0
 CMP p,q
 BLT nodiv
 CMP p,q ASL #1
 BLT div0
 CMP p,q ASL #2
 BLT div1
 ...			\ repeat for 3..30
 CMP p,q ASL #31
 SUBGE p,q ASL #31
 ADDGE r,#2^31
 CMP p,q ASL #30
.div30
 SUBGE p,q ASL #30
 ADDGE r,#2^30
 CMP p,q ASL #29
.div29
 ...			\ repeat for 29..1
.div0
 SUBGE p,q ASL #0	\ equiv. to SUBGE p,q
 ADDGE r,#2^0
.nodiv
 MOV PC,Link

 
 


