Article View: comp.sys.amiga.tech
Article #10404Re: Dividing by a power of two (Re: Aztec compiler ineffeciencies)
From: John Toebes
Date: Mon, 28 Nov 1988 14:58
Date: Mon, 28 Nov 1988 14:58
32 lines
2153 bytes
2153 bytes
In article <YXXhTUy00UkaQ85bl7@andrew.cmu.edu> bader+@andrew.cmu.edu (Miles Bader) writes:
> rodd@dasys1.UUCP (Rod Dorman) writes:
> > As many compiler writers have found in the past and I'm sure many will
> > rediscover in the future, this only works for positive values. Try
> > shifting -1 and you'll get -1 as a result, *not* zero as one would expect.
>
> I think the problem is that shifting always rounds down, as opposed
> to towards zero, like we expect. So even in cases where you have a
> signed, unkown value to divide, it would probably still be more
> effecient to inline code.
> So, when dividing a signed value, x, by a power of two, y:
> if(x<0 && (x&(y-1))!=0)
> x|=y; /* pre-round negative numbers */
> x>>=log2(y);
> Which isn't quite as bad as it looks, since y is a known constant power of two.
> -Miles
Actually it is much simpler than that. The Lattice 5.0 compiler generates the
3 instructions (sometimes 4) inline to perform the division by 2,4, and 8.
These are the most frequent numbers to occur from analysis of many programs.
Specifically:
x/= 2
move x,d0 ;unless it was already there
bpl lab ;skip if positive
addq #1,d0 ;adjust for rounding
lab: asr.l #1,d0 ; and do the divide
There are lots of other sequences of multiply/divide by constants (take 5 for
example) that can be optimized.
/*---------------------All standard Disclaimers apply---------------------*/
/*----Working for but not officially representing SAS or Lattice Inc.-----*/
/*----John A. Toebes, VIII usenet:...!mcnc!rti!sas!toebes-----*/
/*------------------------------------------------------------------------*/
Technical Details
Message-ID:
<724@sas.UUCP>Path:
arc1-ca.pugleaf.net!utzoo!attcan!uunet!husc6!ukma!gatech!mcnc!rti!sas!toebesReferences:
<3013@sugar.uu.net> <7949@dasys1.UUCP> <YXXhTUy00UkaQ85bl7@andrew.cmu.edu>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!attcan!uunet!husc6!ukma!gatech!mcnc!rti!sas!toebes From: toebes@sas.UUCP (John Toebes) Newsgroups: comp.sys.amiga.tech Subject: Re: Dividing by a power of two (Re: Aztec compiler ineffeciencies) Message-ID: <724@sas.UUCP> Date: 28 Nov 88 14:58:56 GMT References: <3013@sugar.uu.net> <7949@dasys1.UUCP> <YXXhTUy00UkaQ85bl7@andrew.cmu.edu> Reply-To: toebes@sas.UUCP (John Toebes) Organization: SAS Institute Inc, Cary NC Lines: 32