Alkis Evlogimenos wrote:> On Wed, 2004-06-09 at 04:56, Vladimir Prus wrote: > > 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. > > I assume you are talking about caller saved registers.Actually, about callee saved registers. The naive compiler pushes/pop all registers which are used in a function and must be preserved. - Volodya
On Wed, 2004-06-09 at 05:26, Vladimir Prus wrote:> Alkis Evlogimenos wrote: > > On Wed, 2004-06-09 at 04:56, Vladimir Prus wrote: > > > 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. > > > > I assume you are talking about caller saved registers. > > 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. -- Alkis
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