From d8f1822c12610099feda907c31fb74d6f5f284f8 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Fri, 18 Oct 2024 20:18:20 +0200 Subject: [PATCH] fixes --- codeCore/src/prog8/code/ast/AstExpressions.kt | 2 +- codeCore/src/prog8/code/ast/AstStatements.kt | 3 ++- .../prog8/codegen/intermediate/ExpressionGen.kt | 15 ++++++++++++++- .../src/prog8/codegen/intermediate/IRCodeGen.kt | 2 -- compiler/res/prog8lib/virtual/floats.p8 | 1 - 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/codeCore/src/prog8/code/ast/AstExpressions.kt b/codeCore/src/prog8/code/ast/AstExpressions.kt index b07c59d66..f69a24ccf 100644 --- a/codeCore/src/prog8/code/ast/AstExpressions.kt +++ b/codeCore/src/prog8/code/ast/AstExpressions.kt @@ -85,7 +85,7 @@ sealed class PtExpression(val type: DataType, position: Position) : PtNode(posit fun isSimple(): Boolean { return when(this) { - is PtAddressOf -> true + is PtAddressOf -> this.arrayIndexExpr!=null || this.arrayIndexExpr?.isSimple()==true is PtArray -> true is PtArrayIndexer -> index is PtNumber || index is PtIdentifier is PtBinaryExpression -> false diff --git a/codeCore/src/prog8/code/ast/AstStatements.kt b/codeCore/src/prog8/code/ast/AstStatements.kt index eb24f3e57..ee3bf21a6 100644 --- a/codeCore/src/prog8/code/ast/AstStatements.kt +++ b/codeCore/src/prog8/code/ast/AstStatements.kt @@ -131,7 +131,8 @@ class PtRepeatLoop(position: Position) : PtNode(position) { class PtReturn(position: Position) : PtNode(position) { - val hasValue = children.any() + val hasValue: Boolean + get() = children.any() val value: PtExpression? get() { return if(children.any()) diff --git a/codeGenIntermediate/src/prog8/codegen/intermediate/ExpressionGen.kt b/codeGenIntermediate/src/prog8/codegen/intermediate/ExpressionGen.kt index b4460d740..ced6d781f 100644 --- a/codeGenIntermediate/src/prog8/codegen/intermediate/ExpressionGen.kt +++ b/codeGenIntermediate/src/prog8/codegen/intermediate/ExpressionGen.kt @@ -492,7 +492,7 @@ internal class ExpressionGen(private val codeGen: IRCodeGen) { fun translate(fcall: PtFunctionCall): ExpressionCodeResult { val callTarget = codeGen.symbolTable.flat.getValue(fcall.name) - if(callTarget.scopedName in listOf("sys.push", "sys.pushw", "sys.pop", "sys.popw")) { + if(callTarget.scopedName in listOf("sys.push", "sys.pushw", "sys.pop", "sys.popw", "floats.push", "floats.pop")) { // special case, these should be inlined, or even use specialized instructions. Instead of doing a normal subroutine call. return translateStackFunctions(fcall, callTarget) } @@ -687,6 +687,19 @@ internal class ExpressionGen(private val codeGen: IRCodeGen) { addInstr(chunk, IRInstruction(Opcode.POP, IRDataType.WORD, reg1=popReg), null) return ExpressionCodeResult(chunk, IRDataType.WORD, popReg, -1) } + "floats.push" -> { + // push float + val tr = translateExpression(fcall.args.single()) + chunk += tr.chunks + addInstr(chunk, IRInstruction(Opcode.PUSH, IRDataType.FLOAT, fpReg1 = tr.resultFpReg), null) + return ExpressionCodeResult(chunk, IRDataType.FLOAT, -1, -1) + } + "floats.pop" -> { + // pop float + val popReg = codeGen.registers.nextFreeFloat() + addInstr(chunk, IRInstruction(Opcode.POP, IRDataType.FLOAT, fpReg1 = popReg), null) + return ExpressionCodeResult(chunk, IRDataType.FLOAT, -1, resultFpReg = popReg) + } else -> throw AssemblyError("unknown stack subroutine called") } } diff --git a/codeGenIntermediate/src/prog8/codegen/intermediate/IRCodeGen.kt b/codeGenIntermediate/src/prog8/codegen/intermediate/IRCodeGen.kt index 8acacfe62..72ee4f908 100644 --- a/codeGenIntermediate/src/prog8/codegen/intermediate/IRCodeGen.kt +++ b/codeGenIntermediate/src/prog8/codegen/intermediate/IRCodeGen.kt @@ -71,12 +71,10 @@ class IRCodeGen( is PtBool -> { variable.setOnetimeInitNumeric(initValue.asInt().toDouble()) initsToRemove += block to initialization - println("${variable.name} = bool ${initValue.value}") } is PtNumber -> { variable.setOnetimeInitNumeric(initValue.number) initsToRemove += block to initialization - println("${variable.name} = number ${initValue.number}") } is PtArray, is PtString -> throw AssemblyError("array or string initialization values should already be part of the vardecl, not a separate assignment") else -> {} diff --git a/compiler/res/prog8lib/virtual/floats.p8 b/compiler/res/prog8lib/virtual/floats.p8 index 29676b9a4..0c8346241 100644 --- a/compiler/res/prog8lib/virtual/floats.p8 +++ b/compiler/res/prog8lib/virtual/floats.p8 @@ -192,7 +192,6 @@ sub push(float value) { %ir {{ loadm.f fr65535,floats.push.value push.f fr65535 - return }} }