mirror of https://github.com/aamine/cbc
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:
parent
c970823e99
commit
3a7d40e63d
14
ChangeLog
14
ChangeLog
|
@ -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
1
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
|
||||
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
package net.loveruby.cflat.asm;
|
||||
import java.util.List;
|
||||
|
||||
public interface AsmOptimizer {
|
||||
public List<Assembly> optimize(List<Assembly> assemblies);
|
||||
}
|
|
@ -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() {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()) {
|
Loading…
Reference in New Issue