Saving registers used by function

Hello!
Is there an (semi)automatic way to save registers used by a function? For
example, on my target I have to store ar0-ar4 and gr0-gr4, gr5, gr6. For now
I just emit huge prologue code to push them all to stack -- even if they are
not modified at all.

Is there a way to tell LLVM which registers must be stored, and have it
automatically issue pushes/pops? I can live with current design, just
wondering.

- Volodya

I assume you are talking about caller saved registers. If so, you can
make the call instruction implicitly define these registers and the
register allocator will handle the pushes/pops automatically.

Alkis Evlogimenos wrote:

You should define these as they are defined in the X86 and PowerPC
backends:

def X86 : Target {
  // Specify the callee saved registers.
  let CalleeSavedRegisters = [ESI, EDI, EBX, EBP];

PrologueEpilogue inserter will then add store/loads to each register in
this list that is modified.

Alkis Evlogimenos wrote:

> Actually, about callee saved registers. The naive compiler pushes/pop all
> registers which are used in a function and must be preserved.

You should define these as they are defined in the X86 and PowerPC
backends:

def X86 : Target {
  // Specify the callee saved registers.
  let CalleeSavedRegisters = [ESI, EDI, EBX, EBP];

PrologueEpilogue inserter will then add store/loads to each register in
this list that is modified.

Thanks, this does work!

- Volodya