From 4fe8b72d421c12d17a35820b5ba3818bdfc9e985 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Tue, 23 Sep 2025 23:17:25 +0200 Subject: [PATCH] fix broken uword comparison and asm peephole optimization --- .../src/prog8/codegen/cpu6502/AsmOptimizer.kt | 10 +++++++--- .../src/prog8/optimizer/ExpressionSimplifier.kt | 3 +-- docs/source/todo.rst | 9 --------- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/codeGenCpu6502/src/prog8/codegen/cpu6502/AsmOptimizer.kt b/codeGenCpu6502/src/prog8/codegen/cpu6502/AsmOptimizer.kt index 986814672..76782ed36 100644 --- a/codeGenCpu6502/src/prog8/codegen/cpu6502/AsmOptimizer.kt +++ b/codeGenCpu6502/src/prog8/codegen/cpu6502/AsmOptimizer.kt @@ -463,15 +463,19 @@ private fun optimizeStoreLoadSame( mods.add(Modification(lines[2].index, true, null)) } - // all 3 registers: lda VALUE + sta SOMEWHERE + lda VALUE -> last load can be eliminated + // all 3 registers: lda VALUE + sta SOMEWHERE + lda VALUE -> last load can be eliminated IF NOT IO ADDRESS if (first.startsWith("lda ") && second.startsWith("sta ") && third.startsWith("lda ") || first.startsWith("ldx ") && second.startsWith("stx ") && third.startsWith("ldx ") || first.startsWith("ldy ") && second.startsWith("sty ") && third.startsWith("ldy ") ) { val firstVal = first.substring(4).trimStart() val thirdVal = third.substring(4).trimStart() - if (firstVal == thirdVal) - mods.add(Modification(lines[3].index, true, null)) + if (firstVal == thirdVal) { + val address = getAddressArg(third, symbolTable) + if (address != null && !machine.isIOAddress(address)) { + mods.add(Modification(lines[3].index, true, null)) + } + } } } return mods diff --git a/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt b/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt index 157b505b5..28326d36c 100644 --- a/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt +++ b/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt @@ -434,7 +434,7 @@ class ExpressionSimplifier(private val program: Program, private val errors: IEr fun isFactorOf256(number: Double): Boolean { val intValue = number.toInt() - return intValue > 0 && (intValue and (intValue shl 8)) == 0 + return intValue >= 256 && (intValue and 0xFF) == 0 } if (leftDt.isUnsignedWord && rightVal!=null) { @@ -465,7 +465,6 @@ class ExpressionSimplifier(private val program: Program, private val errors: IEr else if(expr.operator == "<" && rightVal.number == 256.0 || expr.operator == "<=" && rightVal.number == 255.0) { // uword < 256 --> msb(value)==0 // uword <= 255 --> msb(value)==0 - // OK! expr.operator = "==" expr.left = FunctionCallExpression(IdentifierReference(listOf("msb"), expr.left.position), mutableListOf(expr.left), expr.left.position) expr.right = NumericLiteral(BaseDataType.UBYTE, 0.0, expr.right.position) diff --git a/docs/source/todo.rst b/docs/source/todo.rst index da83cf94b..8c8809c7f 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -1,15 +1,6 @@ TODO ==== -REGRESSIONS: -halloween , musicdemo is broken (wrong fade colors, hangs) -benchmark program: circles with gfx_lores is broken (black screen, returns immediately) -megascroll is 20 bytes larger -chess is a dozen bytes larger -petaxian is much larger -imageviewer/shell view: team17.iff blackscreen - - STRUCTS and TYPED POINTERS --------------------------