mirror of
https://github.com/irmen/prog8.git
synced 2024-08-20 21:29:18 +00:00
optimized float ==0 or 1 comparisons
This commit is contained in:
parent
84c0685a60
commit
961380acb6
@ -56,12 +56,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
|
|||||||
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)
|
||||||
DataType.FLOAT -> {
|
DataType.FLOAT -> translateFloatEquals(left, right, leftConstVal, rightConstVal, jumpIfFalseLabel)
|
||||||
// TODO optimize the easiest compares such as == 0, == 1
|
|
||||||
translateExpression(left)
|
|
||||||
translateExpression(right)
|
|
||||||
asmgen.out(" jsr floats.equal_f | inx | lda P8ESTACK_LO,x | beq $jumpIfFalseLabel")
|
|
||||||
}
|
|
||||||
else -> throw AssemblyError("weird operand datatype")
|
else -> throw AssemblyError("weird operand datatype")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -69,12 +64,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
|
|||||||
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)
|
||||||
DataType.FLOAT -> {
|
DataType.FLOAT -> translateFloatNotEquals(left, right, leftConstVal, rightConstVal, jumpIfFalseLabel)
|
||||||
// TODO optimize the easiest compares such as != 0, != 1
|
|
||||||
translateExpression(left)
|
|
||||||
translateExpression(right)
|
|
||||||
asmgen.out(" jsr floats.notequal_f | inx | lda P8ESTACK_LO,x | beq $jumpIfFalseLabel")
|
|
||||||
}
|
|
||||||
else -> throw AssemblyError("weird operand datatype")
|
else -> throw AssemblyError("weird operand datatype")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -795,6 +785,97 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
|
|||||||
asmgen.out(" jsr prog8_lib.notequal_w | inx | lda P8ESTACK_LO,x | beq $jumpIfFalseLabel")
|
asmgen.out(" jsr prog8_lib.notequal_w | inx | lda P8ESTACK_LO,x | beq $jumpIfFalseLabel")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun translateFloatEquals(left: Expression, right: Expression, leftConstVal: NumericLiteralValue?, rightConstVal: NumericLiteralValue?, jumpIfFalseLabel: String) {
|
||||||
|
if(rightConstVal!=null) {
|
||||||
|
if(leftConstVal!=null) {
|
||||||
|
if(rightConstVal!=leftConstVal)
|
||||||
|
asmgen.out(" jmp $jumpIfFalseLabel")
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
if (left is IdentifierReference) {
|
||||||
|
val name = asmgen.asmVariableName(left)
|
||||||
|
when(rightConstVal.number.toDouble())
|
||||||
|
{
|
||||||
|
0.0 -> {
|
||||||
|
asmgen.out("""
|
||||||
|
lda $name
|
||||||
|
clc
|
||||||
|
adc $name+1
|
||||||
|
adc $name+2
|
||||||
|
adc $name+3
|
||||||
|
adc $name+4
|
||||||
|
bne $jumpIfFalseLabel""")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
1.0 -> {
|
||||||
|
asmgen.out("""
|
||||||
|
lda $name
|
||||||
|
cmp #129
|
||||||
|
bne $jumpIfFalseLabel
|
||||||
|
lda $name+1
|
||||||
|
clc
|
||||||
|
adc $name+2
|
||||||
|
adc $name+3
|
||||||
|
adc $name+4
|
||||||
|
bne $jumpIfFalseLabel""")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
translateExpression(left)
|
||||||
|
translateExpression(right)
|
||||||
|
asmgen.out(" jsr floats.equal_f | inx | lda P8ESTACK_LO,x | beq $jumpIfFalseLabel")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun translateFloatNotEquals(left: Expression, right: Expression, leftConstVal: NumericLiteralValue?, rightConstVal: NumericLiteralValue?, jumpIfFalseLabel: String) {
|
||||||
|
if(rightConstVal!=null) {
|
||||||
|
if(leftConstVal!=null) {
|
||||||
|
if(rightConstVal==leftConstVal)
|
||||||
|
asmgen.out(" jmp $jumpIfFalseLabel")
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
if (left is IdentifierReference) {
|
||||||
|
val name = asmgen.asmVariableName(left)
|
||||||
|
when(rightConstVal.number.toDouble())
|
||||||
|
{
|
||||||
|
0.0 -> {
|
||||||
|
asmgen.out("""
|
||||||
|
lda $name
|
||||||
|
clc
|
||||||
|
adc $name+1
|
||||||
|
adc $name+2
|
||||||
|
adc $name+3
|
||||||
|
adc $name+4
|
||||||
|
beq $jumpIfFalseLabel""")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
1.0 -> {
|
||||||
|
asmgen.out("""
|
||||||
|
lda $name
|
||||||
|
cmp #129
|
||||||
|
bne +
|
||||||
|
lda $name+1
|
||||||
|
clc
|
||||||
|
adc $name+2
|
||||||
|
adc $name+3
|
||||||
|
adc $name+4
|
||||||
|
beq $jumpIfFalseLabel
|
||||||
|
+""")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
translateExpression(left)
|
||||||
|
translateExpression(right)
|
||||||
|
asmgen.out(" jsr floats.notequal_f | inx | lda P8ESTACK_LO,x | beq $jumpIfFalseLabel")
|
||||||
|
}
|
||||||
|
|
||||||
private fun translateExpression(expression: FunctionCall) {
|
private fun translateExpression(expression: FunctionCall) {
|
||||||
val functionName = expression.target.nameInSource.last()
|
val functionName = expression.target.nameInSource.last()
|
||||||
val builtinFunc = BuiltinFunctions[functionName]
|
val builtinFunc = BuiltinFunctions[functionName]
|
||||||
|
Loading…
Reference in New Issue
Block a user