From 71ce3d043879d4443e7f9d8597f953d59caac939 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Sun, 20 Oct 2019 13:21:04 +0200 Subject: [PATCH] Aligned hardcoded address register implementation between memory registers and zp registers. --- .../kickc/fragment/AsmFragmentTemplate.java | 12 +++--- .../kickc/model/DirectiveParserContext.java | 8 ++-- .../dk/camelot64/kickc/model/Registers.java | 40 ++++++++++++------- .../kickc/model/symbols/SymbolVariable.java | 11 ----- .../kickc/model/symbols/Variable.java | 1 - .../Pass0GenerateStatementSequence.java | 5 +-- .../kickc/passes/Pass1ProcedureInline.java | 1 - .../passes/Pass2ConstantIdentification.java | 1 - .../kickc/passes/Pass4CodeGeneration.java | 29 +++++++------- ...ass4RegisterUpliftPotentialInitialize.java | 5 ++- .../kickc/passes/Pass4RegistersFinalize.java | 7 +++- .../kickc/passes/utils/Unroller.java | 1 - src/test/ref/declared-memory-var-0.log | 16 ++++---- src/test/ref/declared-memory-var-0.sym | 4 +- src/test/ref/declared-memory-var-1.log | 16 ++++---- src/test/ref/declared-memory-var-1.sym | 4 +- src/test/ref/declared-memory-var-2.log | 12 +++--- src/test/ref/declared-memory-var-2.sym | 4 +- src/test/ref/declared-memory-var-3.log | 28 ++++++------- src/test/ref/declared-memory-var-3.sym | 8 ++-- src/test/ref/declared-memory-var-4.log | 28 ++++++------- src/test/ref/declared-memory-var-4.sym | 8 ++-- src/test/ref/declared-memory-var-5.log | 28 ++++++------- src/test/ref/declared-memory-var-5.sym | 8 ++-- src/test/ref/declared-memory-var-6.log | 39 +++++++++--------- src/test/ref/declared-memory-var-6.sym | 12 +++--- src/test/ref/declared-memory-var-8.log | 19 +++++---- src/test/ref/declared-memory-var-8.sym | 4 +- 28 files changed, 178 insertions(+), 181 deletions(-) diff --git a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplate.java b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplate.java index 90b7c19ea..37e0cef65 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplate.java +++ b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplate.java @@ -106,12 +106,12 @@ public class AsmFragmentTemplate { Variable v4 = new Variable("m4", scope, SymbolType.BYTE, null, SymbolVariable.StorageStrategy.LOAD_STORE, SymbolVariable.MemoryArea.MAIN_MEMORY); Variable v5 = new Variable("m5", scope, SymbolType.BYTE, null, SymbolVariable.StorageStrategy.LOAD_STORE, SymbolVariable.MemoryArea.MAIN_MEMORY); Variable v6 = new Variable("m6", scope, SymbolType.BYTE, null, SymbolVariable.StorageStrategy.LOAD_STORE, SymbolVariable.MemoryArea.MAIN_MEMORY); - v1.setAllocation(new Registers.RegisterMainMem(v1.getRef(), 1)); - v2.setAllocation(new Registers.RegisterMainMem(v2.getRef(), 1)); - v3.setAllocation(new Registers.RegisterMainMem(v3.getRef(), 1)); - v4.setAllocation(new Registers.RegisterMainMem(v4.getRef(), 1)); - v5.setAllocation(new Registers.RegisterMainMem(v5.getRef(), 1)); - v6.setAllocation(new Registers.RegisterMainMem(v6.getRef(), 1)); + v1.setAllocation(new Registers.RegisterMainMem(v1.getRef(), 1, null)); + v2.setAllocation(new Registers.RegisterMainMem(v2.getRef(), 1, null)); + v3.setAllocation(new Registers.RegisterMainMem(v3.getRef(), 1, null)); + v4.setAllocation(new Registers.RegisterMainMem(v4.getRef(), 1, null)); + v5.setAllocation(new Registers.RegisterMainMem(v5.getRef(), 1, null)); + v6.setAllocation(new Registers.RegisterMainMem(v6.getRef(), 1, null)); if(signature.contains("m1")) bindings.put("m1", v1); if(signature.contains("m2")) bindings.put("m2", v2); if(signature.contains("m3")) bindings.put("m3", v3); diff --git a/src/main/java/dk/camelot64/kickc/model/DirectiveParserContext.java b/src/main/java/dk/camelot64/kickc/model/DirectiveParserContext.java index 6459b3a78..2f69e7e66 100644 --- a/src/main/java/dk/camelot64/kickc/model/DirectiveParserContext.java +++ b/src/main/java/dk/camelot64/kickc/model/DirectiveParserContext.java @@ -7,6 +7,7 @@ import dk.camelot64.kickc.model.types.SymbolTypeArray; import dk.camelot64.kickc.model.types.SymbolTypePointer; import dk.camelot64.kickc.model.types.SymbolTypeStruct; import dk.camelot64.kickc.model.values.ScopeRef; +import dk.camelot64.kickc.model.values.VariableRef; import java.util.*; @@ -185,14 +186,11 @@ public class DirectiveParserContext { lValue.setMemoryArea(memoryAreaDirective.memoryArea); if(memoryAreaDirective.address != null) { if(SymbolVariable.MemoryArea.ZEROPAGE_MEMORY.equals(memoryAreaDirective.memoryArea)) { - // Allocate to specific address - if(memoryAreaDirective.address > 255) { - throw new CompileError("Error! Address not on zeropage " + memoryAreaDirective.address, source); - } Registers.Register register = new Registers.RegisterZpMem(memoryAreaDirective.address.intValue(), -1, true); lValue.setDeclaredRegister(register); } else { - lValue.setDeclaredMemoryAddress(memoryAreaDirective.address); + Registers.Register register = new Registers.RegisterMainMem((VariableRef)lValue.getRef(), -1, memoryAreaDirective.address); + lValue.setDeclaredRegister(register); } } } diff --git a/src/main/java/dk/camelot64/kickc/model/Registers.java b/src/main/java/dk/camelot64/kickc/model/Registers.java index ec177fbab..ee5459e85 100644 --- a/src/main/java/dk/camelot64/kickc/model/Registers.java +++ b/src/main/java/dk/camelot64/kickc/model/Registers.java @@ -70,9 +70,13 @@ public class Registers { private int bytes; - public RegisterMainMem(VariableRef variableRef, int bytes) { + /** If the address is hardcoded this contains it. */ + private Long address; + + public RegisterMainMem(VariableRef variableRef, int bytes, Long address) { this.variableRef = variableRef; this.bytes = bytes; + this.address = address; } public VariableRef getVariableRef() { @@ -84,6 +88,10 @@ public class Registers { return RegisterType.MAIN_MEM; } + public Long getAddress() { + return address; + } + @Override public boolean isMem() { return true; @@ -96,12 +104,12 @@ public class Registers { @Override public boolean isNonRelocatable() { - return false; + return true; } @Override public String toString() { - return "mem[" + getBytes() + "]:" + variableRef.toString(); + return "mem[" + getBytes() + "]" + ((address==null)?"":(":"+address)); } @Override @@ -114,31 +122,33 @@ public class Registers { if(this == o) return true; if(o == null || getClass() != o.getClass()) return false; RegisterMainMem that = (RegisterMainMem) o; - return Objects.equals(variableRef, that.variableRef); + return bytes == that.bytes && + Objects.equals(variableRef, that.variableRef) && + Objects.equals(address, that.address); } @Override public int hashCode() { - return Objects.hash(variableRef); + return Objects.hash(variableRef, bytes, address); } } /** Two zero page addresses used as a register for a single unsigned word variable. */ public static class RegisterZpMem implements Register { - /** The ZP address used for the byte. */ - private int zp; - /** The number of bytes that the register takes up */ private int bytes; - /** True if the address of the register is delcared in the code (non-relocatable) */ - private boolean isNonRelocatable; + /** The ZP address used for the byte. */ + private int zp; - public RegisterZpMem(int zp, int bytes, boolean isNonRelocatable) { + /** True if the address of the register is declared in the code (non-relocatable) */ + private boolean nonRelocatable; + + public RegisterZpMem(int zp, int bytes, boolean nonRelocatable) { this.zp = zp; this.bytes = bytes; - this.isNonRelocatable = isNonRelocatable; + this.nonRelocatable = nonRelocatable; } public RegisterZpMem(int zp, int bytes) { @@ -164,7 +174,7 @@ public class Registers { } public boolean isNonRelocatable() { - return isNonRelocatable; + return nonRelocatable; } @Override @@ -184,12 +194,12 @@ public class Registers { RegisterZpMem that = (RegisterZpMem) o; return zp == that.zp && bytes == that.bytes && - isNonRelocatable == that.isNonRelocatable; + nonRelocatable == that.nonRelocatable; } @Override public int hashCode() { - return Objects.hash(zp, bytes, isNonRelocatable); + return Objects.hash(zp, bytes, nonRelocatable); } } diff --git a/src/main/java/dk/camelot64/kickc/model/symbols/SymbolVariable.java b/src/main/java/dk/camelot64/kickc/model/symbols/SymbolVariable.java index 87c80b1e7..b82347fbd 100644 --- a/src/main/java/dk/camelot64/kickc/model/symbols/SymbolVariable.java +++ b/src/main/java/dk/camelot64/kickc/model/symbols/SymbolVariable.java @@ -50,9 +50,6 @@ public abstract class SymbolVariable implements Symbol { /** Specifies that the variable must live in memory. */ private boolean declaredAsNotRegister; - /** Specifies a specific address where the variable must reside in memory. */ - private Long declaredMemoryAddress; - /** Strategy being used for storing and accessing the variable. The value depends on the directives memory/register/volatile/const - and on the compilers optimization decisions. *