From b2bf10c92d1cedc5e87c175a68a589033b5b6b67 Mon Sep 17 00:00:00 2001 From: Minero Aoki Date: Sun, 10 May 2009 14:51:58 +0000 Subject: [PATCH] r4814@macbookpro: aamine | 2009-05-10 23:05:44 +0900 * net/loveruby/cflat/sysdep/x86/CodeGenerator.java: move virtual stack to AssemblyFile. * net/loveruby/cflat/sysdep/x86/AssemblyFile.java: ditto. git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4200 1b9489fe-b721-0410-924e-b54b9192deb8 --- ChangeLog | 7 ++ .../cflat/sysdep/x86/AssemblyFile.java | 77 +++++++++++++-- .../cflat/sysdep/x86/CodeGenerator.java | 97 ++++--------------- 3 files changed, 95 insertions(+), 86 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1516b84..ad0231f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Sun May 10 23:04:44 2009 Minero Aoki + + * net/loveruby/cflat/sysdep/x86/CodeGenerator.java: move virtual + stack to AssemblyFile. + + * net/loveruby/cflat/sysdep/x86/AssemblyFile.java: ditto. + Sun May 10 22:46:47 2009 Minero Aoki * net/loveruby/cflat/sysdep/x86/CodeGenerator.java: protected -> diff --git a/net/loveruby/cflat/sysdep/x86/AssemblyFile.java b/net/loveruby/cflat/sysdep/x86/AssemblyFile.java index 19de08e..3593063 100644 --- a/net/loveruby/cflat/sysdep/x86/AssemblyFile.java +++ b/net/loveruby/cflat/sysdep/x86/AssemblyFile.java @@ -1,17 +1,23 @@ package net.loveruby.cflat.sysdep.x86; import net.loveruby.cflat.asm.*; -import net.loveruby.cflat.utils.*; +import net.loveruby.cflat.utils.TextUtils; import java.util.*; public class AssemblyFile { - protected List assemblies; - protected Type naturalType; - protected int commentIndentLevel; + private List assemblies; + private Type naturalType; + private long stackWordSize; + private boolean verbose; + private int commentIndentLevel; - public AssemblyFile(Type naturalType) { - this.assemblies = new ArrayList(); + public AssemblyFile( + Type naturalType, long stackWordSize, boolean verbose) { this.naturalType = naturalType; + this.stackWordSize = stackWordSize; + this.verbose = verbose; + this.assemblies = new ArrayList(); this.commentIndentLevel = 0; + initVirtualStack(); } public List assemblies() { @@ -185,6 +191,65 @@ public class AssemblyFile { directive("\t.string\t" + TextUtils.dumpString(str)); } + // + // Virtual Stack + // + + // #@@range/virtual_stack{ + private long stackPointer; + private long stackPointerMax; + + void initVirtualStack() { + stackPointer = 0; + stackPointerMax = stackPointer; + } + // #@@} + + // #@@range/maxTmpBytes{ + long maxTmpBytes() { + return stackPointerMax; + } + // #@@} + + // #@@range/stackTop{ + IndirectMemoryReference stackTop() { + return new IndirectMemoryReference(-stackPointer, new Register("bp")); + } + // #@@} + + // #@@range/virtualPush{ + void virtualPush(Register reg) { + if (verbose) { + comment("push " + reg.name() + " -> " + stackTop()); + } + extendVirtualStack(stackWordSize); + relocatableMov(reg, stackTop()); + } + // #@@} + + // #@@range/virtualPop{ + void virtualPop(Register reg) { + if (verbose) { + comment("pop " + reg.name() + " <- " + stackTop()); + } + relocatableMov(stackTop(), reg); + rewindVirtualStack(stackWordSize); + } + // #@@} + + // #@@range/extendVirtualStack{ + void extendVirtualStack(long len) { + stackPointer += len; + stackPointerMax = Math.max(stackPointerMax, stackPointer); + } + // #@@} + + // #@@range/rewindVirtualStack{ + void rewindVirtualStack(long len) { + stackPointer -= len; + } + // #@@} + // // Instructions // diff --git a/net/loveruby/cflat/sysdep/x86/CodeGenerator.java b/net/loveruby/cflat/sysdep/x86/CodeGenerator.java index 32c5ed5..e209de4 100644 --- a/net/loveruby/cflat/sysdep/x86/CodeGenerator.java +++ b/net/loveruby/cflat/sysdep/x86/CodeGenerator.java @@ -48,7 +48,8 @@ class CodeGenerator static final private Type NATURAL_TYPE = Type.INT32; private AssemblyFile newAssemblyFile() { - return new AssemblyFile(NATURAL_TYPE); + return new AssemblyFile( + NATURAL_TYPE, STACK_WORD_SIZE, options.isVerboseAsm()); } // #@@} @@ -379,9 +380,9 @@ class CodeGenerator // #@@range/compileFunctionBody{ private void compileFunctionBody( AssemblyFile file, DefinedFunction func) { - initVirtualStack(); - List bodyAsms = compileStmts(func); - long maxTmpBytes = maxTmpBytes(); + AssemblyFile body = compileStmts(func); + List bodyAsms = + options.optimizer().optimize(body.assemblies()); AsmStatistics stats = AsmStatistics.collect(bodyAsms); bodyAsms = reduceLabels(bodyAsms, stats); List saveRegs = usedCalleeSavedRegistersWithoutBP(stats); @@ -392,12 +393,13 @@ class CodeGenerator if (options.isVerboseAsm()) { printStackFrameLayout(file, - saveRegsBytes, lvarBytes, maxTmpBytes, + saveRegsBytes, lvarBytes, body.maxTmpBytes(), func.localVariables()); } - initVirtualStack(); - prologue(file, func, saveRegs, saveRegsBytes + lvarBytes + maxTmpBytes); + file.initVirtualStack(); + prologue(file, func, saveRegs, + saveRegsBytes + lvarBytes + body.maxTmpBytes()); if (options.isPositionIndependent() && stats.doesRegisterUsed(GOTBaseReg())) { loadGOTBaseAddress(file, GOTBaseReg()); @@ -452,16 +454,14 @@ class CodeGenerator private AssemblyFile as; private Label epilogue; - private List compileStmts(DefinedFunction func) { + private AssemblyFile compileStmts(DefinedFunction func) { as = newAssemblyFile(); epilogue = new Label(); for (Stmt s : func.ir()) { compileStmt(s); } as.label(epilogue); - List asms = options.optimizer().optimize(as.assemblies()); - as = null; - return asms; + return as; } // #@@} @@ -527,7 +527,7 @@ class CodeGenerator // #@@range/saveRegisters{ private void saveRegisters(AssemblyFile file, List saveRegs) { for (Register reg : saveRegs) { - virtualPush(file, reg); + file.virtualPush(reg); } } // #@@} @@ -537,7 +537,7 @@ class CodeGenerator AssemblyFile file, List savedRegs) { ListIterator regs = savedRegs.listIterator(savedRegs.size()); while (regs.hasPrevious()) { - virtualPop(file, regs.previous()); + file.virtualPop(regs.previous()); } } // #@@} @@ -619,69 +619,6 @@ class CodeGenerator } // #@@} - // #@@range/virtual_stack{ - private long stackPointer; - private long stackPointerMax; - - private void initVirtualStack() { - stackPointer = 0; - stackPointerMax = stackPointer; - } - // #@@} - - // #@@range/maxTmpBytes{ - private long maxTmpBytes() { - return stackPointerMax; - } - // #@@} - - // #@@range/stackTop{ - private IndirectMemoryReference stackTop() { - return mem(-stackPointer, bp()); - } - // #@@} - - // #@@range/virtualPush{ - private void virtualPush(Register reg) { - virtualPush(as, reg); - } - - private void virtualPush(AssemblyFile file, Register reg) { - if (options.isVerboseAsm()) { - file.comment("push " + reg.name() + " -> " + stackTop()); - } - extendVirtualStack(STACK_WORD_SIZE); - file.relocatableMov(reg, stackTop()); - } - // #@@} - - // #@@range/virtualPop{ - private void virtualPop(Register reg) { - virtualPop(as, reg); - } - - private void virtualPop(AssemblyFile file, Register reg) { - if (options.isVerboseAsm()) { - file.comment("pop " + reg.name() + " <- " + stackTop()); - } - file.relocatableMov(stackTop(), reg); - rewindVirtualStack(STACK_WORD_SIZE); - } - // #@@} - - // #@@range/extendVirtualStack{ - private void extendVirtualStack(long len) { - stackPointer += len; - stackPointerMax = Math.max(stackPointerMax, stackPointer); - } - // #@@} - - // #@@range/rewindVirtualStack{ - private void rewindVirtualStack(long len) { - stackPointer -= len; - } - // #@@} - // #@@range/fixTmpOffsets{ private void fixTmpOffsets(List asms, long offset) { for (Assembly asm : asms) { @@ -826,9 +763,9 @@ class CodeGenerator } else { compile(node.right()); - virtualPush(reg("ax")); + as.virtualPush(reg("ax")); compile(node.left()); - virtualPop(reg("cx")); + as.virtualPop(reg("cx")); right = reg("cx", node.type()); } compileBinaryOp(node.type(), node.op(), reg("ax", node.type()), right); @@ -1022,10 +959,10 @@ class CodeGenerator } else { compile(node.rhs()); - virtualPush(reg("ax")); + as.virtualPush(reg("ax")); compileLHS(node.lhs()); as.mov(reg("ax"), reg("cx")); - virtualPop(reg("ax")); + as.virtualPop(reg("ax")); save(node.lhs().type(), reg("ax"), mem(reg("cx"))); } return null;