mirror of
https://github.com/irmen/prog8.git
synced 2024-10-21 04:24:05 +00:00
codegen uses 'bra' on 65c02 instead of 'jmp'
This commit is contained in:
parent
0e0278c84a
commit
9fe32c1c34
@ -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)
|
||||
|
@ -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) {
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user