------- Comment #9 from eweddington at cso dot atmel dot com  2007-07-23 22:57 
-------
Here's what I see:

The array __clz_tab is used in a macro, count_leading_zeros, which is called in
the function __clzSI2 in libgcc2.c, which (AFAICT) gets compiled to the
function __clzsi2 and aggregated in libgcc. The __clzsi2 function is called
from the function clzusi() (in fp-bit.c) which is also included in libgcc. The
clzusi() function is called from si_to_float() and usi_to_float() (also in
fp-bit.c and included in libgcc). AFAICT, these two functions are used to
convert an int or unsigned int to float. 

The test case does exactly this type of conversion in main() in comment #5.
Testing shows that with gcc 4.2.1, and all int-to-float conversions removed,
that __clz_tab is correctly not linked into the application.

The clzusi() function was created in revision 107345, on Nov 22, 2005:
http://gcc.gnu.org/viewcvs?view=rev&revision=107345

This seems like it was an intended change. However, it is unfortunate that a
256-byte array is used in the count_leading_zeros macro. While using a table is
fast and the size is neglible on larger platforms, using up 256 bytes is very
significant on the AVR where 4K, 2K or even 1K of RAM is common. What is really
needed is an alternative implementation (non-array) that is perhaps specific to
the AVR.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29524

Reply via email to