[fpc-devel] Is there a way to make Register Allocation inside of Interrupt Service Routines more efficient when using inline-assembler?
sergei_gorelkin at mail.ru
Sun Aug 21 13:18:37 CEST 2016
21.08.2016 13:25, Karoly Balogh (Charlie/SGR) пишет:
> Well, one possible optimization would be to only save all volatiles if the
> interrupt routine actually calls another function. Otherwise only save the
> ones used by the current proc. This would allow some very small and very
> fast interrupt functions, right? I'm not sure though if there's an easy
> way to determine if there is a function call inside the function I'm
> generating code for.
> Maybe at the point of generating a function call, if the current proc is
> an interrupt, mark all volatiles as used somehow?
What you suggest is already implemented for ages. Any call node allocates all volatile registers
before doing the call and releases them afterwards, to indicate that these registers are modified by
callee. The same is done when a call to helper function is generated at low level (see
thlcg.g_call_system_proc). Furthermore, any call sets pi_do_call in current_procinfo.flags, to
simplify checking the case.
There's no difference in processing calls between 'interrupt' and regular caller procedures. The
difference only appears when generating caller's prologue/epilogue: a regular procedure won't save
volatile registers even if they are used, but 'interrupt' one will save them because it considers
all registers non-volatile.
The things are a bit trickier with inline assembler, because in general author may write anything
there, and compiler does no deep checks. For this reason, an assembler block without a list of
modified registers is historically considered equal to a call (i.e. modifies all volatile
registers). An explicit list of modified registers overrides that behavior, however.
More information about the fpc-devel