From e0de662f8e376461befdb57333a51d00cb5a6713 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Tue, 16 Jan 2024 01:08:16 +0100 Subject: [PATCH] fix signed word bitshift right (>8 shifts) --- .../prog8/optimizer/ExpressionSimplifier.kt | 7 ++- compiler/test/arithmetic/bitshift.p8 | 16 ----- examples/test.p8 | 59 ++++--------------- 3 files changed, 16 insertions(+), 66 deletions(-) diff --git a/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt b/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt index f54d86283..b864cf1e4 100644 --- a/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt +++ b/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt @@ -836,14 +836,15 @@ class ExpressionSimplifier(private val program: Program, return null } else if(amount == 8) { - // shift right by 8 bits is just a byte operation: msb(X) as byte + // shift right by 8 bits is just a byte operation: msb(X) as byte (will get converted to word later) val msb = FunctionCallExpression(IdentifierReference(listOf("msb"), expr.position), mutableListOf(expr.left), expr.position) return TypecastExpression(msb, DataType.BYTE, true, expr.position) } else if(amount > 8) { - // same as above but with residual shifts. + // same as above but with residual shifts. Take care to do signed shift. val msb = FunctionCallExpression(IdentifierReference(listOf("msb"), expr.position), mutableListOf(expr.left), expr.position) - return TypecastExpression(BinaryExpression(msb, ">>", NumericLiteral.optimalInteger(amount - 8, expr.position), expr.position), DataType.BYTE, true, expr.position) + val signed = TypecastExpression(msb, DataType.BYTE, true, expr.position) + return BinaryExpression(signed, ">>", NumericLiteral.optimalInteger(amount - 8, expr.position), expr.position) } } else -> { diff --git a/compiler/test/arithmetic/bitshift.p8 b/compiler/test/arithmetic/bitshift.p8 index 38cf78a73..11cd3aff8 100644 --- a/compiler/test/arithmetic/bitshift.p8 +++ b/compiler/test/arithmetic/bitshift.p8 @@ -376,12 +376,6 @@ main { sw = shiftrsw15() txt.print_uwbin(sw as uword, true) txt.chrout('\n') - sw = shiftrsw16() - txt.print_uwbin(sw as uword, true) - txt.chrout('\n') - sw = shiftrsw17() - txt.print_uwbin(sw as uword, true) - txt.chrout('\n') } @@ -555,16 +549,6 @@ main { return (q >> 15) } - sub shiftrsw16() -> word { - word @shared q = -12345 - return (q >> 16) - } - - sub shiftrsw17() -> word { - word @shared q = -12345 - return (q >> 17) - } - diff --git a/examples/test.p8 b/examples/test.p8 index 3d2dbf037..1b728782b 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -4,9 +4,20 @@ main { sub start() { + word @shared q = -12345 + txt.print_w(q) + txt.nl() + txt.print_uwbin(q as uword, true) + txt.nl() + q >>=9 + txt.print_w(q) + txt.nl() + txt.print_uwbin(q as uword, true) + txt.nl() + ; mem() ; bytes() - words() +; words() } sub mem() { @@ -29,11 +40,6 @@ main { sub bytes() { ubyte[] wa = [$1a, $2b, $3c] - txt.print_ub(all(wa)) - txt.spc() - txt.print_ub(any(wa)) - txt.nl() - txt.print_ubbin(wa[2], true) txt.nl() rol(wa[2]) @@ -54,47 +60,6 @@ main { sub words() { uword[] wa = [$11aa, $22bb, $33cc] uword[] @split swa = [$11aa, $22bb, $33cc] - uword[] waone = [$0000, $3300, $0000] - uword[] wazero = [$0000, $0000, $0000] - uword[] @split swaone = [$0000, $3300, $0000] - uword[] @split swazero = [$0000, $0000, $0000] - - reverse(wa) - for cx16.r9 in wa { - txt.print_uwhex(cx16.r9, true) - txt.nl() - } - txt.nl() - reverse(swa) - for cx16.r9 in swa { - txt.print_uwhex(cx16.r9, true) - txt.nl() - } - - txt.print_ub(all(wa)) ; 1 - txt.spc() - txt.print_ub(any(wa)) ; 1 - txt.nl() - txt.print_ub(all(waone)) ; 0 - txt.spc() - txt.print_ub(any(waone)) ; 1 - txt.nl() -; txt.print_ub(all(swaone)) ; 0 -; txt.spc() - txt.print_ub(any(swaone)) ; 1 - txt.nl() -; txt.print_ub(all(swa)) ; 1 -; txt.spc() - txt.print_ub(any(swa)) ; 1 - txt.nl() - txt.print_ub(all(wazero)) ; 0 - txt.spc() - txt.print_ub(any(wazero)) ; 0 - txt.nl() -; txt.print_ub(all(swazero)) ; 0 -; txt.spc() - txt.print_ub(any(swazero)) ; 0 - txt.nl() txt.print_uwbin(wa[2], true) txt.nl()