codegen uses 'bra' on 65c02 instead of 'jmp'

This commit is contained in:
Irmen de Jong 2021-02-28 16:46:08 +01:00
parent 0e0278c84a
commit 9fe32c1c34
3 changed files with 39 additions and 43 deletions

View File

@ -157,7 +157,7 @@ internal class AsmGen(private val program: Program,
pha""")
}
out(" jmp main.start ; start program / force start proc to be included")
jmp("main.start")
}
private fun slaballocations() {
@ -695,7 +695,7 @@ internal class AsmGen(private val program: Program,
is Break -> {
if(loopEndLabels.isEmpty())
throw AssemblyError("break statement out of context ${stmt.position}")
out(" jmp ${loopEndLabels.peek()}")
jmp(loopEndLabels.peek())
}
is WhileLoop -> translate(stmt)
is RepeatLoop -> translate(stmt)
@ -930,7 +930,7 @@ internal class AsmGen(private val program: Program,
val endLabel = makeLabel("if_end")
expressionsAsmGen.translateComparisonExpressionWithJumpIfFalse(booleanCondition, elseLabel)
translate(stmt.truepart)
out(" jmp $endLabel")
jmp(endLabel)
out(elseLabel)
translate(stmt.elsepart)
out(endLabel)
@ -952,7 +952,7 @@ internal class AsmGen(private val program: Program,
// endless loop
out(repeatLabel)
translate(stmt.body)
out(" jmp $repeatLabel")
jmp(repeatLabel)
out(endLabel)
}
is NumericLiteralValue -> {
@ -1104,7 +1104,7 @@ $counterVar .word 0""")
out(whileLabel)
expressionsAsmGen.translateComparisonExpressionWithJumpIfFalse(booleanCondition, endLabel)
translate(stmt.body)
out(" jmp $whileLabel")
jmp(whileLabel)
out(endLabel)
loopEndLabels.pop()
}
@ -1138,7 +1138,7 @@ $counterVar .word 0""")
if(choice.values==null) {
// the else choice
translate(choice.statements)
out(" jmp $endLabel")
jmp(endLabel)
} else {
choiceBlocks.add(choiceLabel to choice.statements)
for (cv in choice.values!!) {
@ -1157,11 +1157,11 @@ $counterVar .word 0""")
}
}
}
out(" jmp $endLabel")
jmp(endLabel)
for(choiceBlock in choiceBlocks) {
out(choiceBlock.first)
translate(choiceBlock.second)
out(" jmp $endLabel")
jmp(endLabel)
}
out(endLabel)
}
@ -1220,7 +1220,7 @@ $counterVar .word 0""")
val endLabel = makeLabel("branch_end")
out(" $instruction $elseLabel")
translate(stmt.truepart)
out(" jmp $endLabel")
jmp(endLabel)
out(elseLabel)
translate(stmt.elsepart)
out(endLabel)
@ -1277,14 +1277,12 @@ $label nop""")
}
}
private fun translate(jmp: Jump) {
out(" jmp ${getJumpTarget(jmp)}")
}
private fun translate(jump: Jump) = jmp(getJumpTarget(jump))
private fun getJumpTarget(jmp: Jump): String {
val ident = jmp.identifier
val label = jmp.generatedLabel
val addr = jmp.address
private fun getJumpTarget(jump: Jump): String {
val ident = jump.identifier
val label = jump.generatedLabel
val addr = jump.address
return when {
ident!=null -> {
val target = ident.targetStatement(program)

View File

@ -370,7 +370,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal>=leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -381,7 +381,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
cmp #${rightConstVal.number}
bcs $jumpIfFalseLabel""")
else
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
}
else if (left is DirectMemoryRead) {
@ -390,7 +390,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
asmgen.out(" cmp #${rightConstVal.number} | bcs $jumpIfFalseLabel")
}
else
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
}
}
@ -405,7 +405,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal>=leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -439,7 +439,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal>=leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -455,7 +455,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
bcs $jumpIfFalseLabel
+""")
else
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
}
}
@ -470,7 +470,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal>=leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -500,7 +500,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal<=leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -538,7 +538,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal<=leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -576,7 +576,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal<=leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -611,7 +611,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal<=leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -647,7 +647,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal>leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -693,7 +693,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal>leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -731,7 +731,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal>leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -765,7 +765,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal>leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -801,7 +801,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal<leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -831,7 +831,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal<leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -868,7 +868,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal<leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -897,7 +897,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal<leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -928,7 +928,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal!=leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -959,7 +959,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal==leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -990,7 +990,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal!=leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -1027,7 +1027,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal==leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -1067,7 +1067,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal!=leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {
@ -1151,7 +1151,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if(rightConstVal!=null) {
if(leftConstVal!=null) {
if(rightConstVal==leftConstVal)
asmgen.out(" jmp $jumpIfFalseLabel")
asmgen.jmp(jumpIfFalseLabel)
return
} else {
if (left is IdentifierReference) {

View File

@ -2,8 +2,6 @@
TODO
====
- on 65C02 target; replace all jmp by bra (64tass will sort it out if the jump exceeds relative distance)
- optimize assigning array and struct variables (multi-element assings -> memcopy)
- hoist all variable declarations up to the subroutine scope *before* even the constant folding takes place (to avoid undefined symbol errors when referring to a variable from another nested scope in the subroutine)
- optimize swap of two memread values with index, using the same pointer expression/variable, like swap(@(ptr+1), @(ptr+2))