From 7b3cd710858d4d7d2af7d8f706870352458140d0 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Fri, 28 Jan 2022 13:54:06 +0100 Subject: [PATCH] fixed improper optimization of word<<8 and word>>8 --- .../prog8/optimizer/ExpressionSimplifier.kt | 12 ++-------- docs/source/todo.rst | 2 -- examples/test.p8 | 22 ++++++++++--------- 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt b/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt index e9fa04632..d3f17dab0 100644 --- a/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt +++ b/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt @@ -680,11 +680,8 @@ class ExpressionSimplifier(private val program: Program, private val errors: IEr DataType.UWORD, DataType.WORD -> { if (amount >= 16) { return NumericLiteralValue(targetDt, 0.0, expr.position) - } else if (amount >= 8) { + } else if (amount > 8) { val lsb = FunctionCallExpression(IdentifierReference(listOf("lsb"), expr.position), mutableListOf(expr.left), expr.position) - if (amount == 8) { - return FunctionCallExpression(IdentifierReference(listOf("mkword"), expr.position), mutableListOf(lsb, NumericLiteralValue.optimalInteger(0, expr.position)), expr.position) - } val shifted = BinaryExpression(lsb, "<<", NumericLiteralValue.optimalInteger(amount - 8, expr.position), expr.position) return FunctionCallExpression(IdentifierReference(listOf("mkword"), expr.position), mutableListOf(shifted, NumericLiteralValue.optimalInteger(0, expr.position)), expr.position) } @@ -722,13 +719,8 @@ class ExpressionSimplifier(private val program: Program, private val errors: IEr if (amount >= 16) { return NumericLiteralValue.optimalInteger(0, expr.position) } - else if (amount >= 8) { + else if (amount > 8) { val msb = FunctionCallExpression(IdentifierReference(listOf("msb"), expr.position), mutableListOf(expr.left), expr.position) - if (amount == 8) { - // mkword(0, msb(v)) - val zero = NumericLiteralValue(DataType.UBYTE, 0.0, expr.position) - return FunctionCallExpression(IdentifierReference(listOf("mkword"), expr.position), mutableListOf(zero, msb), expr.position) - } return TypecastExpression(BinaryExpression(msb, ">>", NumericLiteralValue.optimalInteger(amount - 8, expr.position), expr.position), DataType.UWORD, true, expr.position) } } diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 7af4a0d97..b02846815 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -3,8 +3,6 @@ TODO For next release ^^^^^^^^^^^^^^^^ -- fix optimization of w >>= 8 , it generates bad code when opt=on, ok when opt=off -- fix w <<= 8 generates weird code with pha/pla in it when opt=on, ok when opt=off - optimize w=msb(w) => w >>=8, w=lsb(w) ==> w &= $00ff fix the value of ww being wrong (with optimizations enabled) in : diff --git a/examples/test.p8 b/examples/test.p8 index c2871da29..050046cf2 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -4,22 +4,24 @@ main { sub start() { uword @shared xx=$ea31 - xx &= $00ff + ;xx &= $00ff ;xx = lsb(xx) - txt.print_uwhex(xx, true) - xx = $ea31 - xx &= $ff00 + ;txt.print_uwhex(xx, true) + ;xx = $ea31 + ;xx &= $ff00 ; xx = msb(xx) ; %asm {{ ; nop ; nop ; }} -; xx >>= 8 -; %asm {{ -; nop -; nop -; }} -; xx <<= 8 + xx >>= 8 + %asm {{ + nop + }} + xx <<= 8 + %asm {{ + nop + }} txt.print_uwhex(xx, true) } }