From 353d45ab65290f99ba39e4c020d44e0d66bf160f Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Sun, 9 Feb 2020 18:50:17 +0100 Subject: [PATCH] Improving ssa_mem variable support. --- .../mos6502-common/vbuaa=_hi_vwsm1.asm | 1 + .../AsmFragmentTemplateSynthesisRule.java | 14 +++++-- .../kickc/passes/Pass4CodeGeneration.java | 42 ++++++++++--------- 3 files changed, 33 insertions(+), 24 deletions(-) create mode 100644 src/main/fragment/mos6502-common/vbuaa=_hi_vwsm1.asm diff --git a/src/main/fragment/mos6502-common/vbuaa=_hi_vwsm1.asm b/src/main/fragment/mos6502-common/vbuaa=_hi_vwsm1.asm new file mode 100644 index 000000000..0d95da3e7 --- /dev/null +++ b/src/main/fragment/mos6502-common/vbuaa=_hi_vwsm1.asm @@ -0,0 +1 @@ +lda {m1}+1 \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java index 846b0eba8..849af6f92 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java +++ b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java @@ -348,7 +348,8 @@ class AsmFragmentTemplateSynthesisRule { String rvalZ2 = ".*=.*z2.*|.*_.*z2.*|...z2_(lt|gt|le|ge|eq|neq)_.*"; String lvalC1 = ".*c1.*=.*"; String lvalC2 = ".*c2.*=.*"; - String lvalDerefZ1 = ".*_deref_...z1=.*"; + String lvalDerefZM1 = ".*_deref_...[zm]1=.*"; + String lvalDerefZM2 = ".*_deref_...[zm]2=.*"; String lvalDerefC1 = ".*_deref_...c1=.*"; String lvalDerefC2 = ".*_deref_...c2=.*"; String lvalDerefC3 = ".*_deref_...c3=.*"; @@ -602,11 +603,16 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("_deref_pb(.)z1=(.*z1.*)", null, null, "vb$1aa=$2", "ldy #0\n" + "sta ({z1}),y", null)); // Rewrite _deref_pb.z1_ to _vb.aa_ (if no other Z1s) - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_deref_pb(.)z1(.*)", twoZM1+"|"+rvalAa+"|"+rvalYy+"|"+ lvalDerefZ1, "ldy #0\n"+"lda ({z1}),y", "$1vb$2aa$3", null, mapZM1)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_deref_pb(.)z1(.*)", twoZM1+"|"+rvalAa+"|"+rvalYy+"|"+ lvalDerefZM1, "ldy #0\n"+"lda ({z1}),y", "$1vb$2aa$3", null, mapZM1)); // Rewrite _deref_pb.z1_ to _vb.aa_ (if other Z1) - synths.add(new AsmFragmentTemplateSynthesisRule("(.*z1.*)_deref_pb(.)z1(.*)", rvalAa+"|"+rvalYy+"|"+lvalDerefZ1, "ldy #0\n"+"lda ({z1}),y", "$1vb$2aa$3", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*z1.*)_deref_pb(.)z1(.*)", rvalAa+"|"+rvalYy+"|"+lvalDerefZM1, "ldy #0\n"+"lda ({z1}),y", "$1vb$2aa$3", null, null)); // Rewrite _deref_pb.z1_ to _vb.aa_ (if other Z1) - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_deref_pb(.)z1(.*[zm]1.*)", rvalAa+"|"+rvalYy+"|"+ lvalDerefZ1, "ldy #0\n"+"lda ({z1}),y", "$1vb$2aa$3", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_deref_pb(.)z1(.*[zm]1.*)", rvalAa+"|"+rvalYy+"|"+ lvalDerefZM1, "ldy #0\n"+"lda ({z1}),y", "$1vb$2aa$3", null, null)); + + // Rewrite _deref_pb.m1_ to _vb.aa_ (if no other M1s) + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_deref_pb(.)m1(.*)", twoZM1+"|"+rvalAa+"|"+rvalYy+"|"+lvalDerefZM1, "ldy {m1}\nsty $fe\nldy {m1}+1\nsty $ff\nldy #0\n"+"lda ($fe),y", "$1vb$2aa$3", null, mapZM1)); + // Rewrite _deref_pb.m2_ to _vb.aa_ (if no other M1s) + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_deref_pb(.)m2(.*)", twoZM2+"|"+rvalAa+"|"+rvalYy+"|"+lvalDerefZM2, "ldy {m2}\nsty $fe\nldy {m2}+1\nsty $ff\nldy #0\n"+"lda ($fe),y", "$1vb$2aa$3", null, mapZM2)); // Replace VB*C1 with AA (only one) synths.add(new AsmFragmentTemplateSynthesisRule("(.*)vb(.)c1(.*)", lvalC1+"|"+rvalAa, "lda #{c1}", "$1vb$2aa$3", null, null)); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java index 957452349..69cbfefa6 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java @@ -524,33 +524,35 @@ public class Pass4CodeGeneration { throw new InternalError("Expected main memory allocation " + variable.toString(program)); } Registers.RegisterMainMem registerMainMem = (Registers.RegisterMainMem) allocation; - if(!registerMainMem.getVariableRef().equals(variable.getRef())) { - continue; - } + final Variable mainVar = program.getScope().getVariable(registerMainMem.getVariableRef()); if(registerMainMem.getAddress() == null) { // Generate into the data segment // Set segment setCurrentSegment(variable.getDataSegment(), asm); // Add any comments generateComments(asm, variable.getComments()); - // Add any alignment - Integer declaredAlignment = variable.getMemoryAlignment(); - if(declaredAlignment != null) { - String alignment = AsmFormat.getAsmNumber(declaredAlignment); - asm.addDataAlignment(alignment); - } - if(variable.getInitValue() != null) { - // Variable has a constant init Value - ConstantValue constantValue = variable.getInitValue(); - AsmDataChunk asmDataChunk = new AsmDataChunk(); - addChunkData(asmDataChunk, constantValue, variable.getType(), variable.getArraySpec(), scopeRef); - asmDataChunk.addToAsm(AsmFormat.asmFix(variable.getAsmName()), asm); + if(!mainVar.getAsmName().equals(variable.getAsmName())) { + asm.addLabelDecl(variable.getAsmName(), AsmFormat.getAsmConstant(program, new ConstantSymbolPointer(mainVar.getRef()), 99, scopeRef)); } else { - // Zero-fill variable - AsmDataChunk asmDataChunk = new AsmDataChunk(); - ConstantValue zeroValue = Initializers.createZeroValue(new Initializers.ValueTypeSpec(variable.getType(), variable.getArraySpec()), null); - addChunkData(asmDataChunk, zeroValue, variable.getType(), variable.getArraySpec(), scopeRef); - asmDataChunk.addToAsm(AsmFormat.asmFix(variable.getAsmName()), asm); + // Add any alignment + Integer declaredAlignment = variable.getMemoryAlignment(); + if(declaredAlignment != null) { + String alignment = AsmFormat.getAsmNumber(declaredAlignment); + asm.addDataAlignment(alignment); + } + if(variable.getInitValue() != null) { + // Variable has a constant init Value + ConstantValue constantValue = variable.getInitValue(); + AsmDataChunk asmDataChunk = new AsmDataChunk(); + addChunkData(asmDataChunk, constantValue, variable.getType(), variable.getArraySpec(), scopeRef); + asmDataChunk.addToAsm(AsmFormat.asmFix(variable.getAsmName()), asm); + } else { + // Zero-fill variable + AsmDataChunk asmDataChunk = new AsmDataChunk(); + ConstantValue zeroValue = Initializers.createZeroValue(new Initializers.ValueTypeSpec(variable.getType(), variable.getArraySpec()), null); + addChunkData(asmDataChunk, zeroValue, variable.getType(), variable.getArraySpec(), scopeRef); + asmDataChunk.addToAsm(AsmFormat.asmFix(variable.getAsmName()), asm); + } } added.add(variable.getAsmName()); }