diff --git a/ChangeLog b/ChangeLog index 874b081..f4736c9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +Mon May 11 01:40:28 2009 Minero Aoki + + * net/loveruby/cflat/sysdep/x86/CodeGenerator.java: use + PeepholeOptimizer directly. + + * net/loveruby/cflat/asm/PeepholeOptimizer.java -> + net/loveruby/cflat/sysdep/x86 + + * net/loveruby/cflat/asm/AsmOptimizer.java: removed. + + * net/loveruby/cflat/codegenerator/CodeGeneratorOptions.java: + should not provide PeepholeOptimizer, just provide + optimizationLevel. + Mon May 11 01:31:29 2009 Minero Aoki * net/loveruby/cflat/compiler/Compiler.java: move dumper code to diff --git a/ToDo b/ToDo index ecf087d..20cf266 100644 --- a/ToDo +++ b/ToDo @@ -9,6 +9,7 @@ - refactoring: remove CodeGenerator.stackGrowsLower - refactoring: remove AssemblyFile stack. - refactoring: remove CodeGenerator#compileLHS (resolve in IR generation) +- refactoring: CodeGeneratorOptions should not provide PeepholeOptimizer * refactoring: classify Linker * refactoring: classify Assembler diff --git a/net/loveruby/cflat/asm/AsmOptimizer.java b/net/loveruby/cflat/asm/AsmOptimizer.java deleted file mode 100644 index cfb30e1..0000000 --- a/net/loveruby/cflat/asm/AsmOptimizer.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.loveruby.cflat.asm; -import java.util.List; - -public interface AsmOptimizer { - public List optimize(List assemblies); -} diff --git a/net/loveruby/cflat/codegenerator/CodeGeneratorOptions.java b/net/loveruby/cflat/codegenerator/CodeGeneratorOptions.java index 0b22f5b..36225e3 100644 --- a/net/loveruby/cflat/codegenerator/CodeGeneratorOptions.java +++ b/net/loveruby/cflat/codegenerator/CodeGeneratorOptions.java @@ -1,6 +1,4 @@ package net.loveruby.cflat.codegenerator; -import net.loveruby.cflat.asm.*; -import java.util.*; public class CodeGeneratorOptions { protected int optimizeLevel; @@ -19,19 +17,8 @@ public class CodeGeneratorOptions { this.optimizeLevel = level; } - public AsmOptimizer optimizer() { - if (optimizeLevel > 0) { - return PeepholeOptimizer.defaultSet(); - } - else { - return new NullOptimizer(); - } - } - - class NullOptimizer implements AsmOptimizer { - public List optimize(List asms) { - return asms; - } + public int optimizeLevel() { + return optimizeLevel; } public void generateVerboseAsm() { diff --git a/net/loveruby/cflat/sysdep/x86/CodeGenerator.java b/net/loveruby/cflat/sysdep/x86/CodeGenerator.java index 1840cff..b8b07f2 100644 --- a/net/loveruby/cflat/sysdep/x86/CodeGenerator.java +++ b/net/loveruby/cflat/sysdep/x86/CodeGenerator.java @@ -381,8 +381,7 @@ class CodeGenerator private void compileFunctionBody( AssemblyFile file, DefinedFunction func) { AssemblyFile body = compileStmts(func); - List bodyAsms = - options.optimizer().optimize(body.assemblies()); + List bodyAsms = optimize(body.assemblies()); AsmStatistics stats = AsmStatistics.collect(bodyAsms); bodyAsms = reduceLabels(bodyAsms, stats); List saveRegs = usedCalleeSavedRegistersWithoutBP(stats); @@ -409,6 +408,14 @@ class CodeGenerator } // #@@} + // #@@range/compileFunctionBody{ + private List optimize(List asms) { + if (options.optimizeLevel() < 1) { + return asms; + } + return new PeepholeOptimizer().optimize(asms); + } + private void printStackFrameLayout( AssemblyFile file, long saveRegsBytes, long lvarBytes, long maxTmpBytes, diff --git a/net/loveruby/cflat/asm/PeepholeOptimizer.java b/net/loveruby/cflat/sysdep/x86/PeepholeOptimizer.java similarity index 93% rename from net/loveruby/cflat/asm/PeepholeOptimizer.java rename to net/loveruby/cflat/sysdep/x86/PeepholeOptimizer.java index 1a1b3c9..47b733f 100644 --- a/net/loveruby/cflat/asm/PeepholeOptimizer.java +++ b/net/loveruby/cflat/sysdep/x86/PeepholeOptimizer.java @@ -1,9 +1,10 @@ -package net.loveruby.cflat.asm; +package net.loveruby.cflat.sysdep.x86; +import net.loveruby.cflat.asm.*; import net.loveruby.cflat.utils.Cursor; import java.util.*; -public class PeepholeOptimizer implements AsmOptimizer { - protected Map> filterSet; +public class PeepholeOptimizer { + private Map> filterSet; public PeepholeOptimizer() { this.filterSet = new HashMap>(); @@ -42,7 +43,7 @@ public class PeepholeOptimizer implements AsmOptimizer { return result; } - protected Filter matchFilter(Cursor asms) { + private Filter matchFilter(Cursor asms) { Instruction insn = (Instruction)asms.current(); List filters = filterSet.get(insn.mnemonic()); if (filters == null) return null; @@ -61,7 +62,7 @@ public class PeepholeOptimizer implements AsmOptimizer { return set; } - protected void loadDefaultFilters() { + private void loadDefaultFilters() { PeepholeOptimizer set = this; // mov @@ -168,11 +169,11 @@ public class PeepholeOptimizer implements AsmOptimizer { set.add(new JumpEliminationFilter()); } - protected ImmediateValue imm(long n) { + private ImmediateValue imm(long n) { return new ImmediateValue(n); } - protected OperandPattern reg() { + private OperandPattern reg() { return new AnyRegisterPattern(); } @@ -187,8 +188,8 @@ public class PeepholeOptimizer implements AsmOptimizer { // class SingleInsnFilter extends Filter { - protected InsnPattern pattern; - protected InsnTransform transform; + private InsnPattern pattern; + private InsnTransform transform; public SingleInsnFilter(InsnPattern pattern, InsnTransform transform) { this.pattern = pattern; @@ -215,9 +216,9 @@ public class PeepholeOptimizer implements AsmOptimizer { } class InsnPattern { - protected String name; - protected OperandPattern pattern1; - protected OperandPattern pattern2; + private String name; + private OperandPattern pattern1; + private OperandPattern pattern2; InsnPattern(String name, OperandPattern pat1, OperandPattern pat2) { this.name = name; @@ -250,7 +251,7 @@ public class PeepholeOptimizer implements AsmOptimizer { public JumpEliminationFilter() { } - protected String[] jmpInsns() { + private String[] jmpInsns() { return new String[] { "jmp", "jz", "jne", "je", "jne" }; } @@ -279,7 +280,7 @@ public class PeepholeOptimizer implements AsmOptimizer { * mov * add */ - protected boolean doesLabelFollows(Cursor asms, Symbol jmpDest) { + private boolean doesLabelFollows(Cursor asms, Symbol jmpDest) { while (asms.hasNext()) { Assembly asm = asms.next(); if (asm.isLabel()) {