improve (u)byte '<=' codegen

This commit is contained in:
Irmen de Jong 2021-03-15 23:17:04 +01:00
parent c943da1448
commit a00c693f93

View File

@ -674,6 +674,15 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
} }
private fun translateUbyteLessOrEqualJump(left: Expression, right: Expression, leftConstVal: NumericLiteralValue?, rightConstVal: NumericLiteralValue?, jumpIfFalseLabel: String) { private fun translateUbyteLessOrEqualJump(left: Expression, right: Expression, leftConstVal: NumericLiteralValue?, rightConstVal: NumericLiteralValue?, jumpIfFalseLabel: String) {
fun code(cmpOperand: String) {
asmgen.out("""
cmp $cmpOperand
beq +
bcs $jumpIfFalseLabel
+""")
}
if(rightConstVal!=null) { if(rightConstVal!=null) {
if(leftConstVal!=null) { if(leftConstVal!=null) {
if(rightConstVal>leftConstVal) if(rightConstVal>leftConstVal)
@ -683,39 +692,38 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
if (left is IdentifierReference) { if (left is IdentifierReference) {
asmgen.assignExpressionToRegister(left, RegisterOrPair.A) asmgen.assignExpressionToRegister(left, RegisterOrPair.A)
return if(rightConstVal.number.toInt()!=0) return if(rightConstVal.number.toInt()!=0)
asmgen.out(""" code("#${rightConstVal.number}")
cmp #${rightConstVal.number}
beq +
bcs $jumpIfFalseLabel
+""")
else else
asmgen.out(" bne $jumpIfFalseLabel") asmgen.out(" bne $jumpIfFalseLabel")
} }
else if (left is DirectMemoryRead) { else if (left is DirectMemoryRead) {
translateDirectMemReadExpression(left, false) translateDirectMemReadExpression(left, false)
return if(rightConstVal.number.toInt()!=0) return if(rightConstVal.number.toInt()!=0)
asmgen.out(""" code("#${rightConstVal.number}")
cmp #${rightConstVal.number}
beq +
bcs $jumpIfFalseLabel
+""")
else else
asmgen.out(" bne $jumpIfFalseLabel") asmgen.out(" bne $jumpIfFalseLabel")
} }
} }
} }
// TODO optimize if right is variable or mem-read to avoid use of ZP location if(byteJumpForSimpleRightOperands(left, right, ::code))
return
asmgen.assignExpressionToVariable(right, "P8ZP_SCRATCH_B1", DataType.UBYTE, null) asmgen.assignExpressionToVariable(right, "P8ZP_SCRATCH_B1", DataType.UBYTE, null)
asmgen.assignExpressionToRegister(left, RegisterOrPair.A) asmgen.assignExpressionToRegister(left, RegisterOrPair.A)
asmgen.out(""" return code("P8ZP_SCRATCH_B1")
cmp P8ZP_SCRATCH_B1
beq +
bcs $jumpIfFalseLabel
+""")
} }
private fun translateByteLessOrEqualJump(left: Expression, right: Expression, leftConstVal: NumericLiteralValue?, rightConstVal: NumericLiteralValue?, jumpIfFalseLabel: String) { private fun translateByteLessOrEqualJump(left: Expression, right: Expression, leftConstVal: NumericLiteralValue?, rightConstVal: NumericLiteralValue?, jumpIfFalseLabel: String) {
fun code(sbcOperand: String) {
asmgen.out("""
clc
sbc $sbcOperand
bvc +
eor #$80
+ bpl $jumpIfFalseLabel""")
}
if(rightConstVal!=null) { if(rightConstVal!=null) {
if(leftConstVal!=null) { if(leftConstVal!=null) {
if(rightConstVal>leftConstVal) if(rightConstVal>leftConstVal)
@ -723,35 +731,24 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
return return
} else { } else {
if (left is IdentifierReference) { if (left is IdentifierReference) {
val name = asmgen.asmVariableName(left) asmgen.assignExpressionToRegister(left, RegisterOrPair.A)
if(rightConstVal.number.toInt()!=0) return if(rightConstVal.number.toInt()!=0)
asmgen.out(""" code("#${rightConstVal.number}")
lda $name
clc
sbc #${rightConstVal.number}
bvc +
eor #$80
+ bpl $jumpIfFalseLabel""")
else else
asmgen.out(""" asmgen.out("""
lda $name
beq + beq +
bpl $jumpIfFalseLabel bpl $jumpIfFalseLabel
+""") +""")
return
} }
} }
} }
// TODO optimize if right is variable or mem-read to avoid use of ZP location if(byteJumpForSimpleRightOperands(left, right, ::code))
return
asmgen.assignExpressionToVariable(right, "P8ZP_SCRATCH_B1", DataType.UBYTE, null) asmgen.assignExpressionToVariable(right, "P8ZP_SCRATCH_B1", DataType.UBYTE, null)
asmgen.assignExpressionToRegister(left, RegisterOrPair.A) asmgen.assignExpressionToRegister(left, RegisterOrPair.A)
asmgen.out(""" return code("P8ZP_SCRATCH_B1")
clc
sbc P8ZP_SCRATCH_B1
bvc +
eor #$80
+ bpl $jumpIfFalseLabel""")
} }
private fun translateUwordLessOrEqualJump(left: Expression, right: Expression, leftConstVal: NumericLiteralValue?, rightConstVal: NumericLiteralValue?, jumpIfFalseLabel: String) { private fun translateUwordLessOrEqualJump(left: Expression, right: Expression, leftConstVal: NumericLiteralValue?, rightConstVal: NumericLiteralValue?, jumpIfFalseLabel: String) {