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>
|
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
1
ToDo
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
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() {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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()) {
|
||||||
Loading…
Reference in New Issue