From 144c1ba3a6e6c960f0cc5b93feab891865902e21 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Thu, 3 Nov 2022 19:08:13 +0100 Subject: [PATCH] ir: fix float instruction value in formatspec --- .../src/prog8/optimizer/StatementOptimizer.kt | 2 +- docs/source/todo.rst | 1 + examples/test.p8 | 6 ++++++ intermediate/src/prog8/intermediate/IRInstructions.kt | 10 +++++++--- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt b/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt index 43ae91aeb..57dc67daf 100644 --- a/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt +++ b/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt @@ -294,7 +294,7 @@ class StatementOptimizer(private val program: Program, if(bexpr!=null) { val rightCv = bexpr.right.constValue(program)?.number if(bexpr.operator=="-" && rightCv==null) { - if(bexpr.right isSameAs assignment.target) { + if(bexpr.right.isSimple && bexpr.right isSameAs assignment.target) { // X = value - X --> X = -X ; X += value (to avoid need of stack-evaluation) val negation = PrefixExpression("-", bexpr.right.copy(), bexpr.position) val addValue = Assignment(assignment.target.copy(), BinaryExpression(bexpr.right, "+", bexpr.left, bexpr.position), AssignmentOrigin.OPTIMIZER, assignment.position) diff --git a/docs/source/todo.rst b/docs/source/todo.rst index d6da5deed..6626813e1 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -3,6 +3,7 @@ TODO For next release ^^^^^^^^^^^^^^^^ +- check StatementOptimizer "optimize binary expressions a bit": flt[1] = 3.0-flt[1] beneficial or not? what about integer array? - ir: get rid of '_' label prefix? - fix expericodegen (ir code gen for regular cx16 target) diff --git a/examples/test.p8 b/examples/test.p8 index 01598c25f..99a0ac434 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -1,7 +1,13 @@ +%import floats %import textio %zeropage basicsafe main { + float[10] flt + sub start() { + flt[1] = 42.42 + flt[1] = 3-flt[1] + floats.print_f(flt[1]) } } diff --git a/intermediate/src/prog8/intermediate/IRInstructions.kt b/intermediate/src/prog8/intermediate/IRInstructions.kt index cb03e9b66..25276f0da 100644 --- a/intermediate/src/prog8/intermediate/IRInstructions.kt +++ b/intermediate/src/prog8/intermediate/IRInstructions.kt @@ -493,8 +493,12 @@ data class InstructionFormat(val datatype: IRDataType?, ">fr1" -> { fpreg1=OperandDirection.OUTPUT } "<>fr1" -> { fpreg1=OperandDirection.INOUT } " fpreg2 = OperandDirection.INPUT - " valueIn = true - " fpvalueIn = true + " { + if('F' in typespec) + fpvalueIn = true + else + valueIn = true + } else -> throw IllegalArgumentException(spec) } } @@ -521,7 +525,7 @@ data class InstructionFormat(val datatype: IRDataType?, @Suppress("BooleanLiteralArgument") val instructionFormats = mutableMapOf( Opcode.NOP to InstructionFormat.from("N"), - Opcode.LOAD to InstructionFormat.from("BW,>r1,fr1,r1,fr1,r1,fr1,r1,fr1,r1,fr1,