mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-12-24 04:31:02 +00:00
added simple asm constants (syntax error still)
This commit is contained in:
parent
6f2dfdbec3
commit
ccfa6bdbf3
@ -10,7 +10,6 @@ TODO's for new Constant Solution
|
|||||||
+ In loopnest.asm x&y are used in both loops - the outer x&y are clobbered by the inner loop.
|
+ In loopnest.asm x&y are used in both loops - the outer x&y are clobbered by the inner loop.
|
||||||
+ In voronoi.asm in render() x is clobbered during call to findcol().
|
+ In voronoi.asm in render() x is clobbered during call to findcol().
|
||||||
|
|
||||||
|
|
||||||
Features
|
Features
|
||||||
- Move the main code into a main() function, and disallow code outside functions. The main function per default has no parameters and exits with RTS.
|
- Move the main code into a main() function, and disallow code outside functions. The main function per default has no parameters and exits with RTS.
|
||||||
- Improve locality of block sequence for if(cond) { stmt1; } else { stmt2; } to if(!cond) goto @else stmt1; jmp @end; @else: stmt2; @end:
|
- Improve locality of block sequence for if(cond) { stmt1; } else { stmt2; } to if(!cond) goto @else stmt1; jmp @end; @else: stmt2; @end:
|
||||||
|
39
src/main/java/dk/camelot64/kickc/asm/AsmConstant.java
Normal file
39
src/main/java/dk/camelot64/kickc/asm/AsmConstant.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package dk.camelot64.kickc.asm;
|
||||||
|
|
||||||
|
/** ASM constant declaration */
|
||||||
|
public class AsmConstant implements AsmLine {
|
||||||
|
private final String name;
|
||||||
|
private final String value;
|
||||||
|
private int index;
|
||||||
|
|
||||||
|
|
||||||
|
public AsmConstant(String name, String value) {
|
||||||
|
this.name = name;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getLineBytes() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getLineCycles() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAsm() {
|
||||||
|
return ".const "+name+" = "+value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getIndex() {
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setIndex(int index) {
|
||||||
|
this.index = index;
|
||||||
|
}
|
||||||
|
}
|
@ -74,7 +74,15 @@ public class AsmProgram {
|
|||||||
|
|
||||||
public void addLabelDecl(String name, int address) {
|
public void addLabelDecl(String name, int address) {
|
||||||
addLine(new AsmLabelDecl(name, address));
|
addLine(new AsmLabelDecl(name, address));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a constant declararion to the ASM
|
||||||
|
* @param name The name of the constant
|
||||||
|
* @param value The value of the constant
|
||||||
|
*/
|
||||||
|
public void addConstant(String name, String value) {
|
||||||
|
addLine(new AsmConstant(name, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -177,6 +177,22 @@ public abstract class Scope implements Symbol {
|
|||||||
return vars;
|
return vars;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Collection<ConstantVar> getAllConstants(boolean includeSubScopes) {
|
||||||
|
Collection<ConstantVar> vars = new ArrayList<>();
|
||||||
|
for (Symbol symbol : symbols.values()) {
|
||||||
|
if (symbol instanceof ConstantVar) {
|
||||||
|
vars.add((ConstantVar) symbol);
|
||||||
|
}
|
||||||
|
if (includeSubScopes && symbol instanceof Scope) {
|
||||||
|
Scope subScope = (Scope) symbol;
|
||||||
|
vars.addAll(subScope.getAllConstants(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return vars;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all scopes contained in the scope. This does not include this scope itself.
|
* Get all scopes contained in the scope. This does not include this scope itself.
|
||||||
* @param includeSubScopes Include sub-scopes og sub-scopes
|
* @param includeSubScopes Include sub-scopes og sub-scopes
|
||||||
|
@ -30,6 +30,7 @@ public class Pass4CodeGeneration {
|
|||||||
|
|
||||||
// Generate global ZP labels
|
// Generate global ZP labels
|
||||||
asm.startSegment(null, "Global ZP labels");
|
asm.startSegment(null, "Global ZP labels");
|
||||||
|
addConstants(asm, currentScope);
|
||||||
addZpLabels(asm, currentScope);
|
addZpLabels(asm, currentScope);
|
||||||
for (ControlFlowBlock block : getGraph().getAllBlocks()) {
|
for (ControlFlowBlock block : getGraph().getAllBlocks()) {
|
||||||
if (!block.getScope().equals(currentScope)) {
|
if (!block.getScope().equals(currentScope)) {
|
||||||
@ -40,6 +41,7 @@ public class Pass4CodeGeneration {
|
|||||||
asm.startSegment(null, block.getLabel().getFullName());
|
asm.startSegment(null, block.getLabel().getFullName());
|
||||||
asm.addScopeBegin(block.getLabel().getFullName().replace('@', 'b').replace(':', '_'));
|
asm.addScopeBegin(block.getLabel().getFullName().replace('@', 'b').replace(':', '_'));
|
||||||
// Add all ZP labels for the scope
|
// Add all ZP labels for the scope
|
||||||
|
addConstants(asm, currentScope);
|
||||||
addZpLabels(asm, currentScope);
|
addZpLabels(asm, currentScope);
|
||||||
}
|
}
|
||||||
// Generate entry points (if needed)
|
// Generate entry points (if needed)
|
||||||
@ -76,6 +78,24 @@ public class Pass4CodeGeneration {
|
|||||||
program.setAsm(asm);
|
program.setAsm(asm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add constant declarations for all scope constants
|
||||||
|
*
|
||||||
|
* @param asm The ASM program
|
||||||
|
* @param scope The scope
|
||||||
|
*/
|
||||||
|
private void addConstants(AsmProgram asm, ScopeRef currentScope) {
|
||||||
|
Collection<ConstantVar> scopeConstants = program.getScope().getScope(currentScope).getAllConstants(false);
|
||||||
|
Set<String> added = new LinkedHashSet<>();
|
||||||
|
for (ConstantVar scopeConstant : scopeConstants) {
|
||||||
|
String asmName = scopeConstant.getLocalName(); // scopeConstant.getAsmName()
|
||||||
|
if (asmName != null && !added.contains(asmName)) {
|
||||||
|
asm.addConstant(asmName.replace("#","_").replace("$","_"), scopeConstant.getValue().toString(program));
|
||||||
|
added.add(asmName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add label declarations for all scope variables assigned to ZP registers
|
* Add label declarations for all scope variables assigned to ZP registers
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user