mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-01-18 07:30:22 +00:00
Optimized registers for fibmem.
This commit is contained in:
parent
a7e0e2b1d0
commit
32a2c9eb2b
@ -12,7 +12,7 @@ public class CompileLog {
|
|||||||
public void append(String msg) {
|
public void append(String msg) {
|
||||||
log.append(msg);
|
log.append(msg);
|
||||||
log.append("\n");
|
log.append("\n");
|
||||||
//System.out.printf(msg+"\n");
|
System.out.printf(msg+"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
public StringBuilder getLog() {
|
public StringBuilder getLog() {
|
||||||
|
@ -10,6 +10,7 @@ Features
|
|||||||
- Implement inline compilation of functions (and a mechanism for choosing which methods / calls to inline)
|
- Implement inline compilation of functions (and a mechanism for choosing which methods / calls to inline)
|
||||||
- Add ability to call ASM code from KC.
|
- Add ability to call ASM code from KC.
|
||||||
- Add ability to call KC code from ASM. (Maybe declare some functions external to ensure their interface is well defined. Maybe generate ASM call stubs.)
|
- Add ability to call KC code from ASM. (Maybe declare some functions external to ensure their interface is well defined. Maybe generate ASM call stubs.)
|
||||||
|
- Add an export keyword ensuring that a function is generated even if it is never called. Maybe export can be handled by generating a call that can be used as stub.
|
||||||
- Add inline ASM (maybe?)
|
- Add inline ASM (maybe?)
|
||||||
- Handle long branches
|
- Handle long branches
|
||||||
+ Create a proper main function for the compiler
|
+ Create a proper main function for the compiler
|
||||||
|
@ -114,4 +114,13 @@ public class ControlFlowGraph {
|
|||||||
return sequence;
|
return sequence;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ControlFlowBlock getMainBlock() {
|
||||||
|
for (ControlFlowBlock block : getAllBlocks()) {
|
||||||
|
Label label = block.getLabel();
|
||||||
|
if(label.getFullName().equals("main")) {
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,10 @@ public class Pass3BlockSequencePlanner {
|
|||||||
|
|
||||||
public void plan() {
|
public void plan() {
|
||||||
Stack<ControlFlowBlock> todo = new Stack<>();
|
Stack<ControlFlowBlock> todo = new Stack<>();
|
||||||
|
ControlFlowBlock mainBlock = controlFlowGraph.getMainBlock();
|
||||||
|
if (mainBlock != null) {
|
||||||
|
todo.push(mainBlock);
|
||||||
|
}
|
||||||
todo.push(controlFlowGraph.getFirstBlock());
|
todo.push(controlFlowGraph.getFirstBlock());
|
||||||
List<ControlFlowBlock> sequence = new ArrayList<>();
|
List<ControlFlowBlock> sequence = new ArrayList<>();
|
||||||
while(!todo.empty()){
|
while(!todo.empty()){
|
||||||
|
@ -19,8 +19,6 @@ public class Pass3RegisterAllocation {
|
|||||||
performAllocation(symbols, allocation);
|
performAllocation(symbols, allocation);
|
||||||
|
|
||||||
//allocation.allocate(symbols.getVariable("i#0"), RegisterAllocation.getRegisterX());
|
//allocation.allocate(symbols.getVariable("i#0"), RegisterAllocation.getRegisterX());
|
||||||
//allocation.allocate(symbols.getVariable("i#1"), RegisterAllocation.getRegisterX());
|
|
||||||
//allocation.allocate(symbols.getVariable("i#2"), RegisterAllocation.getRegisterX());
|
|
||||||
//allocation.allocate(symbols.getVariable("i#3"), RegisterAllocation.getRegisterX());
|
//allocation.allocate(symbols.getVariable("i#3"), RegisterAllocation.getRegisterX());
|
||||||
//allocation.allocate(symbols.getVariable("i#4"), RegisterAllocation.getRegisterX());
|
//allocation.allocate(symbols.getVariable("i#4"), RegisterAllocation.getRegisterX());
|
||||||
//allocation.allocate(symbols.getVariable("i#5"), RegisterAllocation.getRegisterX());
|
//allocation.allocate(symbols.getVariable("i#5"), RegisterAllocation.getRegisterX());
|
||||||
@ -59,9 +57,6 @@ public class Pass3RegisterAllocation {
|
|||||||
//allocation.allocate(symbols.getVariable("$0"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("$0"), new RegisterAllocation.RegisterAByte());
|
||||||
//allocation.allocate(symbols.getVariable("$2"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("$2"), new RegisterAllocation.RegisterAByte());
|
||||||
//allocation.allocate(symbols.getVariable("$3"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("$3"), new RegisterAllocation.RegisterAByte());
|
||||||
//allocation.allocate(symbols.getVariable("$1"), new RegisterAllocation.RegisterAByte());
|
|
||||||
//allocation.allocate(symbols.getVariable("$3"), new RegisterAllocation.RegisterALUByte());
|
|
||||||
//allocation.allocate(symbols.getVariable("$4"), new RegisterAllocation.RegisterAByte());
|
|
||||||
//allocation.allocate(symbols.getVariable("$5"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("$5"), new RegisterAllocation.RegisterAByte());
|
||||||
//allocation.allocate(symbols.getVariable("$6"), new RegisterAllocation.RegisterALUByte());
|
//allocation.allocate(symbols.getVariable("$6"), new RegisterAllocation.RegisterALUByte());
|
||||||
//allocation.allocate(symbols.getVariable("$7"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("$7"), new RegisterAllocation.RegisterAByte());
|
||||||
@ -72,6 +67,14 @@ public class Pass3RegisterAllocation {
|
|||||||
//allocation.allocate(symbols.getVariable("a#1"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("a#1"), new RegisterAllocation.RegisterAByte());
|
||||||
//allocation.allocate(symbols.getVariable("a#0"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("a#0"), new RegisterAllocation.RegisterAByte());
|
||||||
|
|
||||||
|
// Register allocation for fibmem.kc
|
||||||
|
allocation.allocate(symbols.getVariable("i#1"), RegisterAllocation.getRegisterX());
|
||||||
|
allocation.allocate(symbols.getVariable("i#2"), RegisterAllocation.getRegisterX());
|
||||||
|
allocation.allocate(symbols.getVariable("$1"), new RegisterAllocation.RegisterAByte());
|
||||||
|
allocation.allocate(symbols.getVariable("$3"), new RegisterAllocation.RegisterALUByte());
|
||||||
|
//allocation.allocate(symbols.getVariable("$4"), new RegisterAllocation.RegisterAByte());
|
||||||
|
|
||||||
|
|
||||||
// Registers for postinc.kc
|
// Registers for postinc.kc
|
||||||
/*
|
/*
|
||||||
allocation.allocate(symbols.getVariable("c#0"), RegisterAllocation.getRegisterA());
|
allocation.allocate(symbols.getVariable("c#0"), RegisterAllocation.getRegisterA());
|
||||||
@ -91,6 +94,7 @@ public class Pass3RegisterAllocation {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Optimal Registers for flipper-rex2.kc
|
// Optimal Registers for flipper-rex2.kc
|
||||||
|
/*
|
||||||
allocation.allocate(symbols.getVariable("plot::i#0"), RegisterAllocation.getRegisterX());
|
allocation.allocate(symbols.getVariable("plot::i#0"), RegisterAllocation.getRegisterX());
|
||||||
allocation.allocate(symbols.getVariable("plot::i#1"), RegisterAllocation.getRegisterX());
|
allocation.allocate(symbols.getVariable("plot::i#1"), RegisterAllocation.getRegisterX());
|
||||||
allocation.allocate(symbols.getVariable("plot::i#2"), RegisterAllocation.getRegisterX());
|
allocation.allocate(symbols.getVariable("plot::i#2"), RegisterAllocation.getRegisterX());
|
||||||
@ -146,6 +150,9 @@ public class Pass3RegisterAllocation {
|
|||||||
allocation.allocate(symbols.getVariable("main::c#2"), RegisterAllocation.getRegisterX());
|
allocation.allocate(symbols.getVariable("main::c#2"), RegisterAllocation.getRegisterX());
|
||||||
allocation.allocate(symbols.getVariable("main::c#3"), RegisterAllocation.getRegisterX());
|
allocation.allocate(symbols.getVariable("main::c#3"), RegisterAllocation.getRegisterX());
|
||||||
allocation.allocate(symbols.getVariable("main::c#4"), RegisterAllocation.getRegisterX());
|
allocation.allocate(symbols.getVariable("main::c#4"), RegisterAllocation.getRegisterX());
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
symbols.setAllocation(allocation);
|
symbols.setAllocation(allocation);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -30,8 +30,10 @@ public class TestCompilationOutput {
|
|||||||
|
|
||||||
public static void main(String[] args) throws IOException, URISyntaxException {
|
public static void main(String[] args) throws IOException, URISyntaxException {
|
||||||
TestCompilationOutput tester = new TestCompilationOutput();
|
TestCompilationOutput tester = new TestCompilationOutput();
|
||||||
tester.testFile("flipper-rex2");
|
tester.testFile("fibmem");
|
||||||
tester.testFile("bresenham");
|
//tester.testFile("flipper-rex2");
|
||||||
|
//tester.testFile("bresenham");
|
||||||
|
//tester.testFile("unused");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void testFile(String fileName) throws IOException, URISyntaxException {
|
private void testFile(String fileName) throws IOException, URISyntaxException {
|
||||||
|
18
src/dk/camelot64/kickc/test/unused.kc
Normal file
18
src/dk/camelot64/kickc/test/unused.kc
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
byte *SCREEN = $0400;
|
||||||
|
|
||||||
|
byte c = (*SCREEN);
|
||||||
|
fillscreen(c);
|
||||||
|
|
||||||
|
void fillscreen(byte c) {
|
||||||
|
byte j=0;
|
||||||
|
do {
|
||||||
|
byte* SCREEN2 = SCREEN+$100;
|
||||||
|
byte* SCREEN3 = SCREEN+$200;
|
||||||
|
byte* SCREEN4 = SCREEN+$3e8;
|
||||||
|
SCREEN[j] = c;
|
||||||
|
SCREEN2[j] = c;
|
||||||
|
SCREEN3[j] = c;
|
||||||
|
SCREEN4[j] = c;
|
||||||
|
} while(++j!=0)
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user