mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-04-08 14:37:40 +00:00
Improving ssa_mem variable support.
This commit is contained in:
parent
9faabae052
commit
353d45ab65
1
src/main/fragment/mos6502-common/vbuaa=_hi_vwsm1.asm
Normal file
1
src/main/fragment/mos6502-common/vbuaa=_hi_vwsm1.asm
Normal file
@ -0,0 +1 @@
|
||||
lda {m1}+1
|
@ -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));
|
||||
|
@ -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());
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user