------- Comment #10 from anrp at mit dot edu 2007-09-08 21:44 ------- (In reply to comment #9) > 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.
Here's an untested (I'm going to try to figure out how to get it to build into the AVR build) function that replaces the definition of clz_tab with a 6 instruction bit of code: ; r2 in, r3 out ; r2 clobbered ; Z, C, N. V clobbered clz_compute: ldi r3, 0x09 ; preload output clc ; clear C (guarentees termination with 8 loops) clz_compute_loop1: rol r2 ; push MSB into C dec r3 ; dec output brcs clz_end ; if C is set (msb was set), we're done rjmp clz_compute_loop1 ; otherwise, repeat clz_end: -- anrp at mit dot edu changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |anrp at mit dot edu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29524