From a7247f5b8b63c0917e559e52f0d5f0031840b89b Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Fri, 12 Apr 2024 21:56:25 +0200 Subject: [PATCH] fix boolean expression optimization bug --- .../cpu6502/assignment/AssignmentAsmGen.kt | 1 - .../prog8/optimizer/ExpressionSimplifier.kt | 11 +++++--- docs/source/libraries.rst | 4 +++ examples/test.p8 | 27 +++++++++---------- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt b/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt index e5d3e3136..6ed470fe0 100644 --- a/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt +++ b/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt @@ -738,7 +738,6 @@ internal class AssignmentAsmGen(private val program: PtProgram, assignTrue.add(target) assignTrue.add(PtNumber.fromBoolean(true, assign.position)) } else { - require(assign.target.datatype in ByteDatatypes) when(assign.target.kind) { TargetStorageKind.VARIABLE -> { if(assign.target.datatype in WordDatatypes) { diff --git a/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt b/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt index 8e649a516..4a8dced5a 100644 --- a/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt +++ b/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt @@ -240,10 +240,13 @@ class ExpressionSimplifier(private val program: Program, private val options: Co // optimize boolean constant comparisons if(expr.operator=="==") { if(rightDt==DataType.BOOL && leftDt==DataType.BOOL) { - if(rightVal?.asBooleanValue==true) - return listOf(IAstModification.ReplaceNode(expr, expr.left, parent)) - else - return listOf(IAstModification.ReplaceNode(expr, PrefixExpression("not", expr.left, expr.position), parent)) + val rightConstBool = rightVal?.asBooleanValue + if(rightConstBool!=null) { + return if(rightConstBool) + listOf(IAstModification.ReplaceNode(expr, expr.left, parent)) + else + listOf(IAstModification.ReplaceNode(expr, PrefixExpression("not", expr.left, expr.position), parent)) + } } if (rightVal?.number == 1.0) { if (options.strictBool) { diff --git a/docs/source/libraries.rst b/docs/source/libraries.rst index 2323021da..669288a70 100644 --- a/docs/source/libraries.rst +++ b/docs/source/libraries.rst @@ -24,6 +24,10 @@ of these library modules automatically as required. The resulting compiled binary program *only works on the target machine it was compiled for*. You must recompile the program for every target you want to run it on. +.. note:: + Several algorithms and math routines in Prog8's assembly library files are adapted from + code publicly available on https://www.codebase64.org/ + Low-fi variable and subroutine definitions in all available library modules --------------------------------------------------------------------------- diff --git a/examples/test.p8 b/examples/test.p8 index bfc191859..0f807978b 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -1,20 +1,17 @@ -%zeropage basicsafe %import textio +%zeropage basicsafe main { - sub start() { - uword @shared a,b - b = a ; works - cx16.r1L = lsb(a) ; works - funcw(a) ; works - funcb(lsb(a)) ; fails :-( - } + sub show_bug(byte a, byte b) { + if (a >= 0) == (b > 0) { + txt.print("bug!") + } else { + txt.print("no bug.") + } + txt.nl() + } - sub funcw(uword arg) { - arg++ - } - - sub funcb(ubyte arg) { - arg++ - } + sub start() { + show_bug(-1, 4) + } }