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>
* net/loveruby/cflat/compiler/Compiler.java: move dumper code to

1
ToDo
View File

@ -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

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;
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<Assembly> optimize(List<Assembly> asms) {
return asms;
}
public int optimizeLevel() {
return optimizeLevel;
}
public void generateVerboseAsm() {

View File

@ -381,8 +381,7 @@ class CodeGenerator
private void compileFunctionBody(
AssemblyFile file, DefinedFunction func) {
AssemblyFile body = compileStmts(func);
List<Assembly> bodyAsms =
options.optimizer().optimize(body.assemblies());
List<Assembly> bodyAsms = optimize(body.assemblies());
AsmStatistics stats = AsmStatistics.collect(bodyAsms);
bodyAsms = reduceLabels(bodyAsms, 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(
AssemblyFile file,
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 java.util.*;
public class PeepholeOptimizer implements AsmOptimizer {
protected Map<String, List<Filter>> filterSet;
public class PeepholeOptimizer {
private Map<String, List<Filter>> filterSet;
public PeepholeOptimizer() {
this.filterSet = new HashMap<String, List<Filter>>();
@ -42,7 +43,7 @@ public class PeepholeOptimizer implements AsmOptimizer {
return result;
}
protected Filter matchFilter(Cursor<Assembly> asms) {
private Filter matchFilter(Cursor<Assembly> asms) {
Instruction insn = (Instruction)asms.current();
List<Filter> 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<Assembly> asms, Symbol jmpDest) {
private boolean doesLabelFollows(Cursor<Assembly> asms, Symbol jmpDest) {
while (asms.hasNext()) {
Assembly asm = asms.next();
if (asm.isLabel()) {