[PATCH] improved algorithm for gcc/expmed.c::choose_multiplier()

Jim Wilson wilson@specifix.com
Mon Jul 31 22:55:00 GMT 2006


Denis Vlasenko wrote:
> I still cannot figure out what precision is, so I restricted new code to
> (n == HOST_BITS_PER_WIDE_INT && precision == HOST_BITS_PER_WIDE_INT) case.
> Need help here.

At the moment, there is probably no one who understands this code as 
well as you do, so you may not get much help from others.

I looked at this a little, and I think precision is the number of 
significant bits in the divisor.  Note that unsigned divides use N for 
precision, but signed divides use N-1.  Also, in the pre_shift case, 
where we shift the divisors right if they have zeros in the low bits, we 
subtract the shift count from the precision.

This probably has some effect on how many bits we can safely use for the 
resulting inverse multiplier.

This code is based on a paper writte by Torbjorn Granlund and Peter 
Montgomery.  This was published in the 1994 SIGPLAN PLDI conference 
proceedings.  You should read this paper if you haven't already done so. 
  There may be clues in there about how the gcc algorithm works.  The 
gcc code was written by one of the co-authors, Torbjorn Granlund.
-- 
Jim Wilson, GNU Tools Support, http://www.specifix.com



More information about the Gcc mailing list