r4826@macbookpro: aamine | 2009-05-11 01:40:01 +0900

* 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.
 


git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4204 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
Minero Aoki 2009-05-10 16:49:47 +00:00
parent c970823e99
commit 3a7d40e63d
6 changed files with 41 additions and 37 deletions

View File

@ -1,3 +1,17 @@
Mon May 11 01:40:28 2009 Minero Aoki <aamine@loveruby.net>
* 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 <aamine@loveruby.net> Mon May 11 01:31:29 2009 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/compiler/Compiler.java: move dumper code to * net/loveruby/cflat/compiler/Compiler.java: move dumper code to

1
ToDo
View File

@ -9,6 +9,7 @@
- refactoring: remove CodeGenerator.stackGrowsLower - refactoring: remove CodeGenerator.stackGrowsLower
- refactoring: remove AssemblyFile stack. - refactoring: remove AssemblyFile stack.
- refactoring: remove CodeGenerator#compileLHS (resolve in IR generation) - refactoring: remove CodeGenerator#compileLHS (resolve in IR generation)
- refactoring: CodeGeneratorOptions should not provide PeepholeOptimizer
* refactoring: classify Linker * refactoring: classify Linker
* refactoring: classify Assembler * refactoring: classify Assembler

View File

@ -1,6 +0,0 @@
package net.loveruby.cflat.asm;
import java.util.List;
public interface AsmOptimizer {
public List<Assembly> optimize(List<Assembly> assemblies);
}

View File

@ -1,6 +1,4 @@
package net.loveruby.cflat.codegenerator; package net.loveruby.cflat.codegenerator;
import net.loveruby.cflat.asm.*;
import java.util.*;
public class CodeGeneratorOptions { public class CodeGeneratorOptions {
protected int optimizeLevel; protected int optimizeLevel;
@ -19,19 +17,8 @@ public class CodeGeneratorOptions {
this.optimizeLevel = level; this.optimizeLevel = level;
} }
public AsmOptimizer optimizer() { public int optimizeLevel() {
if (optimizeLevel > 0) { return optimizeLevel;
return PeepholeOptimizer.defaultSet();
}
else {
return new NullOptimizer();
}
}
class NullOptimizer implements AsmOptimizer {
public List<Assembly> optimize(List<Assembly> asms) {
return asms;
}
} }
public void generateVerboseAsm() { public void generateVerboseAsm() {

View File

@ -381,8 +381,7 @@ class CodeGenerator
private void compileFunctionBody( private void compileFunctionBody(
AssemblyFile file, DefinedFunction func) { AssemblyFile file, DefinedFunction func) {
AssemblyFile body = compileStmts(func); AssemblyFile body = compileStmts(func);
List<Assembly> bodyAsms = List<Assembly> bodyAsms = optimize(body.assemblies());
options.optimizer().optimize(body.assemblies());
AsmStatistics stats = AsmStatistics.collect(bodyAsms); AsmStatistics stats = AsmStatistics.collect(bodyAsms);
bodyAsms = reduceLabels(bodyAsms, stats); bodyAsms = reduceLabels(bodyAsms, stats);
List<Register> saveRegs = usedCalleeSavedRegistersWithoutBP(stats); List<Register> saveRegs = usedCalleeSavedRegistersWithoutBP(stats);
@ -409,6 +408,14 @@ class CodeGenerator
} }
// #@@} // #@@}
// #@@range/compileFunctionBody{
private List<Assembly> optimize(List<Assembly> asms) {
if (options.optimizeLevel() < 1) {
return asms;
}
return new PeepholeOptimizer().optimize(asms);
}
private void printStackFrameLayout( private void printStackFrameLayout(
AssemblyFile file, AssemblyFile file,
long saveRegsBytes, long lvarBytes, long maxTmpBytes, long saveRegsBytes, long lvarBytes, long maxTmpBytes,

View File

@ -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 net.loveruby.cflat.utils.Cursor;
import java.util.*; import java.util.*;
public class PeepholeOptimizer implements AsmOptimizer { public class PeepholeOptimizer {
protected Map<String, List<Filter>> filterSet; private Map<String, List<Filter>> filterSet;
public PeepholeOptimizer() { public PeepholeOptimizer() {
this.filterSet = new HashMap<String, List<Filter>>(); this.filterSet = new HashMap<String, List<Filter>>();
@ -42,7 +43,7 @@ public class PeepholeOptimizer implements AsmOptimizer {
return result; return result;
} }
protected Filter matchFilter(Cursor<Assembly> asms) { private Filter matchFilter(Cursor<Assembly> asms) {
Instruction insn = (Instruction)asms.current(); Instruction insn = (Instruction)asms.current();
List<Filter> filters = filterSet.get(insn.mnemonic()); List<Filter> filters = filterSet.get(insn.mnemonic());
if (filters == null) return null; if (filters == null) return null;
@ -61,7 +62,7 @@ public class PeepholeOptimizer implements AsmOptimizer {
return set; return set;
} }
protected void loadDefaultFilters() { private void loadDefaultFilters() {
PeepholeOptimizer set = this; PeepholeOptimizer set = this;
// mov // mov
@ -168,11 +169,11 @@ public class PeepholeOptimizer implements AsmOptimizer {
set.add(new JumpEliminationFilter()); set.add(new JumpEliminationFilter());
} }
protected ImmediateValue imm(long n) { private ImmediateValue imm(long n) {
return new ImmediateValue(n); return new ImmediateValue(n);
} }
protected OperandPattern reg() { private OperandPattern reg() {
return new AnyRegisterPattern(); return new AnyRegisterPattern();
} }
@ -187,8 +188,8 @@ public class PeepholeOptimizer implements AsmOptimizer {
// //
class SingleInsnFilter extends Filter { class SingleInsnFilter extends Filter {
protected InsnPattern pattern; private InsnPattern pattern;
protected InsnTransform transform; private InsnTransform transform;
public SingleInsnFilter(InsnPattern pattern, InsnTransform transform) { public SingleInsnFilter(InsnPattern pattern, InsnTransform transform) {
this.pattern = pattern; this.pattern = pattern;
@ -215,9 +216,9 @@ public class PeepholeOptimizer implements AsmOptimizer {
} }
class InsnPattern { class InsnPattern {
protected String name; private String name;
protected OperandPattern pattern1; private OperandPattern pattern1;
protected OperandPattern pattern2; private OperandPattern pattern2;
InsnPattern(String name, OperandPattern pat1, OperandPattern pat2) { InsnPattern(String name, OperandPattern pat1, OperandPattern pat2) {
this.name = name; this.name = name;
@ -250,7 +251,7 @@ public class PeepholeOptimizer implements AsmOptimizer {
public JumpEliminationFilter() { public JumpEliminationFilter() {
} }
protected String[] jmpInsns() { private String[] jmpInsns() {
return new String[] { "jmp", "jz", "jne", "je", "jne" }; return new String[] { "jmp", "jz", "jne", "je", "jne" };
} }
@ -279,7 +280,7 @@ public class PeepholeOptimizer implements AsmOptimizer {
* mov * mov
* add * add
*/ */
protected boolean doesLabelFollows(Cursor<Assembly> asms, Symbol jmpDest) { private boolean doesLabelFollows(Cursor<Assembly> asms, Symbol jmpDest) {
while (asms.hasNext()) { while (asms.hasNext()) {
Assembly asm = asms.next(); Assembly asm = asms.next();
if (asm.isLabel()) { if (asm.isLabel()) {