From e0105bda019e43e16bdd32b89c3ebd4554e42c97 Mon Sep 17 00:00:00 2001 From: Minero Aoki Date: Sun, 14 Dec 2008 11:43:51 +0000 Subject: [PATCH] * net/loveruby/cflat/compiler/CodeGenerator.java (compileFunctionBody): remove bp from saveRegs first. git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4107 1b9489fe-b721-0410-924e-b54b9192deb8 --- ChangeLog | 5 ++++ .../cflat/compiler/CodeGenerator.java | 30 ++++++++++--------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1634a8c..5fd453a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sun Dec 14 20:43:47 2008 Minero Aoki + + * net/loveruby/cflat/compiler/CodeGenerator.java + (compileFunctionBody): remove bp from saveRegs first. + Mon Dec 8 00:55:33 2008 Minero Aoki * lib/alloca.s: alloca() implemeted. diff --git a/net/loveruby/cflat/compiler/CodeGenerator.java b/net/loveruby/cflat/compiler/CodeGenerator.java index 4208604..9ebeae3 100644 --- a/net/loveruby/cflat/compiler/CodeGenerator.java +++ b/net/loveruby/cflat/compiler/CodeGenerator.java @@ -307,11 +307,12 @@ public class CodeGenerator List bodyAsms = compileStmts(func); AsmStatistics stats = AsmStatistics.collect(bodyAsms); bodyAsms = reduceLabels(bodyAsms, stats); - List saveRegs = usedCalleeSavedRegisters(stats); + List saveRegs = usedCalleeSavedRegistersWithoutBP(stats); long lvarBytes = allocateLocalVariables(func.body().scope(), saveRegs.size()); prologue(func, saveRegs, lvarBytes); - if (options.isPositionIndependent() && stats.doesRegisterUsed(GOTBaseReg())) { + if (options.isPositionIndependent() + && stats.doesRegisterUsed(GOTBaseReg())) { loadGOTBaseAddress(GOTBaseReg()); } as.addAll(bodyAsms); @@ -354,10 +355,10 @@ public class CodeGenerator } // #@@} - protected List usedCalleeSavedRegisters(AsmStatistics stats) { + protected List usedCalleeSavedRegistersWithoutBP(AsmStatistics stats) { List result = new ArrayList(); for (Register reg : calleeSavedRegisters()) { - if (stats.doesRegisterUsed(reg)) { + if (stats.doesRegisterUsed(reg) && !reg.equals(bp())) { result.add(reg); } } @@ -435,8 +436,14 @@ public class CodeGenerator protected void epilogue(DefinedFunction func, List savedRegs, long lvarBytes) { - shrinkStack(lvarBytes); - restoreRegisters(savedRegs); + //shrinkStack(lvarBytes); + if (! savedRegs.isEmpty()) { + long offset = stackGrowsLower + ? -1 * savedRegs.size() * stackWordSize + : (savedRegs.size() - 1) * stackWordSize; + lea(mem(offset, bp()), sp()); + restoreRegisters(savedRegs); + } mov(bp(), sp()); pop(bp()); ret(); @@ -445,19 +452,14 @@ public class CodeGenerator protected void saveRegisters(List saveRegs) { for (Register reg : saveRegs) { - if (! reg.equals(bp())) { // bp is already saved. - push(reg); - } + push(reg); } } protected void restoreRegisters(List savedRegs) { ListIterator regs = savedRegs.listIterator(savedRegs.size()); while (regs.hasPrevious()) { - Register reg = regs.previous(); - if (! reg.equals(bp())) { // bp is going to be restored. - pop(reg); - } + pop(regs.previous()); } } @@ -490,7 +492,7 @@ public class CodeGenerator * Note that numSavedRegs includes bp. */ protected long allocateLocalVariables(LocalScope scope, long numSavedRegs) { - long initLen = (numSavedRegs - 1) * stackWordSize; + long initLen = numSavedRegs * stackWordSize; long maxLen = allocateScope(scope, initLen); return maxLen - initLen; }