On 2006-03-17, David Brown <[email protected]> wrote:
>> > * The avr-gcc people decided to use a __zero_reg__ (I don't
>> > think it is an overall win), and put it in r0. Since r0 is
>> > unavoidably used by other features (multipliers, and LPM
>> > instructions), it must be preserved in the interrupt
>> > prologue, since the compiler code generator assumes it is
>> > always valid.
>>
>> That doesn't make any sense. The compiler is bright enough to
>> keep track of which "other" register get used and only preserve
>> the ones that are required, they must have added _extra_ code
>> to disable that for the zero reg.
>
> That's a little different. When the compiler starts to
> produce a block of code, it assumes certain pre-conditions,
> and makes sure these are still valid at the end of the block.
> These include things like it being safe to use scratch
> registers, and unsafe to use preserved registers without
> actively preserving them. The condition that __zero_reg__ is
> 0 and __tmp_reg__ is available happen at an even lower level -
> they are only broken over very short code sequences. For
> example, __tmp_reg__ will never (as far as I know) be used for
> anything other than loading immediate values into the low
> numbered registers. When compiling an interrupt function, the
> compiler must first establish these basic low-level
> conditions, and it seems to have no way to optomise them away.
There's no reason not to optimize that portion of the
prolog/epilog as well. It doesn't matter except for trivially
small ISRs. But, in may experience, some of them usually are --
and they're the ones that have to run the fastest.
--
Grant Edwards grante Yow! .. over in west
at Philadelphia a puppy is
visi.com vomiting...