From 9d9ca0f08dc55b7ab3449b3de61f69fca1561cc4 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Thu, 7 Jan 2021 22:49:54 +0100 Subject: [PATCH] fix bit shifting words by 8. fix type error for signed return types. --- compiler/res/prog8lib/prog8_lib.p8 | 6 ++++-- compiler/src/prog8/optimizer/ExpressionSimplifier.kt | 9 ++++++--- compiler/src/prog8/optimizer/StatementOptimizer.kt | 11 +++++++---- examples/arithmetic/bitshift.p8 | 5 ----- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/compiler/res/prog8lib/prog8_lib.p8 b/compiler/res/prog8lib/prog8_lib.p8 index d38c05927..dc2791485 100644 --- a/compiler/res/prog8lib/prog8_lib.p8 +++ b/compiler/res/prog8lib/prog8_lib.p8 @@ -6,8 +6,10 @@ prog8_lib { %asminclude "library:prog8_lib.asm", "" %asminclude "library:prog8_funcs.asm", "" - uword @zp retval_interm_w ; to store intermediary expression results for return values (hopefully allocated on ZP to reduce code size) - ubyte @zp retval_interm_b ; to store intermediary expression results for return values (hopefully allocated on ZP to reduce code size) + uword @zp retval_interm_uw ; to store intermediary expression results for return values (hopefully allocated on ZP to reduce code size) + word @zp retval_interm_w ; to store intermediary expression results for return values (hopefully allocated on ZP to reduce code size) + ubyte @zp retval_interm_ub ; to store intermediary expression results for return values (hopefully allocated on ZP to reduce code size) + byte @zp retval_interm_b ; to store intermediary expression results for return values (hopefully allocated on ZP to reduce code size) asmsub pattern_match(str string @AY, str pattern @R0) clobbers(Y) -> ubyte @A { %asm {{ diff --git a/compiler/src/prog8/optimizer/ExpressionSimplifier.kt b/compiler/src/prog8/optimizer/ExpressionSimplifier.kt index 095bf8ef9..b60259a08 100644 --- a/compiler/src/prog8/optimizer/ExpressionSimplifier.kt +++ b/compiler/src/prog8/optimizer/ExpressionSimplifier.kt @@ -669,12 +669,15 @@ internal class ExpressionSimplifier(private val program: Program) : AstWalker() DataType.UWORD -> { if (amount >= 16) { return NumericLiteralValue.optimalInteger(0, expr.position) - } else if (amount >= 8) { + } + else if (amount >= 8) { val msb = FunctionCall(IdentifierReference(listOf("msb"), expr.position), mutableListOf(expr.left), expr.position) if (amount == 8) { - return TypecastExpression(msb, DataType.UWORD, true, expr.position) + // mkword(0, msb(v)) + val zero = NumericLiteralValue(DataType.UBYTE, 0, expr.position) + return FunctionCall(IdentifierReference(listOf("mkword"), expr.position), mutableListOf(zero, msb), expr.position) } - return BinaryExpression(msb, ">>", NumericLiteralValue.optimalInteger(amount - 8, expr.position), expr.position) + return TypecastExpression(BinaryExpression(msb, ">>", NumericLiteralValue.optimalInteger(amount - 8, expr.position), expr.position), DataType.UWORD, true, expr.position) } } DataType.WORD -> { diff --git a/compiler/src/prog8/optimizer/StatementOptimizer.kt b/compiler/src/prog8/optimizer/StatementOptimizer.kt index 51fc9d429..b0996500a 100644 --- a/compiler/src/prog8/optimizer/StatementOptimizer.kt +++ b/compiler/src/prog8/optimizer/StatementOptimizer.kt @@ -447,10 +447,13 @@ internal class StatementOptimizer(private val program: Program, if (returnDt in IntegerDatatypes) { // first assign to intermediary, then return that register val returnValueIntermediary = - if (returnDt in ByteDatatypes) - IdentifierReference(listOf("prog8_lib", "retval_interm_b"), returnStmt.position) - else - IdentifierReference(listOf("prog8_lib", "retval_interm_w"), returnStmt.position) + when(returnDt) { + DataType.UBYTE -> IdentifierReference(listOf("prog8_lib", "retval_interm_ub"), returnStmt.position) + DataType.BYTE -> IdentifierReference(listOf("prog8_lib", "retval_interm_b"), returnStmt.position) + DataType.UWORD -> IdentifierReference(listOf("prog8_lib", "retval_interm_uw"), returnStmt.position) + DataType.WORD -> IdentifierReference(listOf("prog8_lib", "retval_interm_w"), returnStmt.position) + else -> throw FatalAstException("weird return dt") + } val tgt = AssignTarget(returnValueIntermediary, null, null, returnStmt.position) val assign = Assignment(tgt, value, returnStmt.position) val returnReplacement = Return(returnValueIntermediary, returnStmt.position) diff --git a/examples/arithmetic/bitshift.p8 b/examples/arithmetic/bitshift.p8 index 1ab91b5bd..11e779845 100644 --- a/examples/arithmetic/bitshift.p8 +++ b/examples/arithmetic/bitshift.p8 @@ -474,11 +474,6 @@ main { return (q >> 17) } - - - - ; @TODO fix type errors - sub shiftrsw0() -> word { word q = -12345 return q >> 0