mirror of
https://github.com/irmen/prog8.git
synced 2024-12-24 16:29:21 +00:00
avoid excessive comparisons for certain comparison expressions against zero
This commit is contained in:
parent
bec9cc7047
commit
446fc35d5c
@ -53,6 +53,39 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
|
|||||||
val dt = left.inferType(program).typeOrElse(DataType.STRUCT)
|
val dt = left.inferType(program).typeOrElse(DataType.STRUCT)
|
||||||
when (operator) {
|
when (operator) {
|
||||||
"==" -> {
|
"==" -> {
|
||||||
|
// if the left operand is an expression, and the right is 0, we can just evaluate that expression.
|
||||||
|
// (the extra comparison is not required as the result of the expression is already the required boolean value)
|
||||||
|
if(rightConstVal?.number?.toDouble() == 0.0) {
|
||||||
|
when(left) {
|
||||||
|
is PrefixExpression,
|
||||||
|
is BinaryExpression,
|
||||||
|
is ArrayIndexedExpression,
|
||||||
|
is TypecastExpression,
|
||||||
|
is AddressOf,
|
||||||
|
is RangeExpr,
|
||||||
|
is FunctionCall -> {
|
||||||
|
translateExpression(left)
|
||||||
|
if(dt in ByteDatatypes) {
|
||||||
|
asmgen.out("""
|
||||||
|
inx
|
||||||
|
lda P8ESTACK_LO,x
|
||||||
|
bne $jumpIfFalseLabel""")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
else if(dt in WordDatatypes) {
|
||||||
|
asmgen.out("""
|
||||||
|
inx
|
||||||
|
lda P8ESTACK_LO,x
|
||||||
|
clc
|
||||||
|
adc P8ESTACK_HI,x
|
||||||
|
bne $jumpIfFalseLabel""")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
when (dt) {
|
when (dt) {
|
||||||
in ByteDatatypes -> translateByteEquals(left, right, leftConstVal, rightConstVal, jumpIfFalseLabel)
|
in ByteDatatypes -> translateByteEquals(left, right, leftConstVal, rightConstVal, jumpIfFalseLabel)
|
||||||
in WordDatatypes -> translateWordEquals(left, right, leftConstVal, rightConstVal, jumpIfFalseLabel)
|
in WordDatatypes -> translateWordEquals(left, right, leftConstVal, rightConstVal, jumpIfFalseLabel)
|
||||||
@ -61,6 +94,39 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
"!=" -> {
|
"!=" -> {
|
||||||
|
// if the left operand is an expression, and the right is 0, we can just evaluate that expression.
|
||||||
|
// (the extra comparison is not required as the result of the expression is already the required boolean value)
|
||||||
|
if(rightConstVal?.number?.toDouble() == 0.0) {
|
||||||
|
when(left) {
|
||||||
|
is PrefixExpression,
|
||||||
|
is BinaryExpression,
|
||||||
|
is ArrayIndexedExpression,
|
||||||
|
is TypecastExpression,
|
||||||
|
is AddressOf,
|
||||||
|
is RangeExpr,
|
||||||
|
is FunctionCall -> {
|
||||||
|
translateExpression(left)
|
||||||
|
if(dt in ByteDatatypes) {
|
||||||
|
asmgen.out("""
|
||||||
|
inx
|
||||||
|
lda P8ESTACK_LO,x
|
||||||
|
beq $jumpIfFalseLabel""")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
else if(dt in WordDatatypes) {
|
||||||
|
asmgen.out("""
|
||||||
|
inx
|
||||||
|
lda P8ESTACK_LO,x
|
||||||
|
clc
|
||||||
|
adc P8ESTACK_HI,x
|
||||||
|
beq $jumpIfFalseLabel""")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
when (dt) {
|
when (dt) {
|
||||||
in ByteDatatypes -> translateByteNotEquals(left, right, leftConstVal, rightConstVal, jumpIfFalseLabel)
|
in ByteDatatypes -> translateByteNotEquals(left, right, leftConstVal, rightConstVal, jumpIfFalseLabel)
|
||||||
in WordDatatypes -> translateWordNotEquals(left, right, leftConstVal, rightConstVal, jumpIfFalseLabel)
|
in WordDatatypes -> translateWordNotEquals(left, right, leftConstVal, rightConstVal, jumpIfFalseLabel)
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
%import textio
|
%import textio
|
||||||
%zeropage basicsafe
|
%zeropage basicsafe
|
||||||
|
|
||||||
|
; TODO balloon only goes down now
|
||||||
|
|
||||||
|
|
||||||
main {
|
main {
|
||||||
|
|
||||||
ubyte perform_scroll = false
|
ubyte perform_scroll = false
|
||||||
|
Loading…
Reference in New Issue
Block a user