From 8b630798d898eedbaf705f3e84be76438b44d6ab Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sat, 19 Dec 2020 03:18:40 +0100 Subject: [PATCH] documented the subroutine calling convention --- .../src/prog8/ast/statements/AstStatements.kt | 2 +- .../compiler/target/c64/codegen/AsmGen.kt | 8 +- docs/source/index.rst | 1 + docs/source/technical.rst | 76 +++++++++++++++++++ docs/source/todo.rst | 1 - 5 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 docs/source/technical.rst diff --git a/compiler/src/prog8/ast/statements/AstStatements.kt b/compiler/src/prog8/ast/statements/AstStatements.kt index 05f45406e..14bac6d87 100644 --- a/compiler/src/prog8/ast/statements/AstStatements.kt +++ b/compiler/src/prog8/ast/statements/AstStatements.kt @@ -724,7 +724,7 @@ class Subroutine(override val name: String, return when(returntypes.singleOrNull()) { in ByteDatatypes -> listOf(RegisterOrStatusflag(RegisterOrPair.A, null)) in WordDatatypes -> listOf(RegisterOrStatusflag(RegisterOrPair.AY, null)) - DataType.FLOAT -> listOf(RegisterOrStatusflag(RegisterOrPair.AY, null)) + DataType.FLOAT -> listOf(RegisterOrStatusflag(RegisterOrPair.FAC1, null)) null -> emptyList() else -> listOf(RegisterOrStatusflag(RegisterOrPair.AY, null)) } diff --git a/compiler/src/prog8/compiler/target/c64/codegen/AsmGen.kt b/compiler/src/prog8/compiler/target/c64/codegen/AsmGen.kt index 8ed60e808..960633b88 100644 --- a/compiler/src/prog8/compiler/target/c64/codegen/AsmGen.kt +++ b/compiler/src/prog8/compiler/target/c64/codegen/AsmGen.kt @@ -1195,12 +1195,8 @@ $label nop""") throw AssemblyError("normal subroutines can't return value in status register directly") when (returnType) { - in IntegerDatatypes -> { - assignmentAsmGen.assignExpressionToRegister(returnvalue, returnReg.registerOrPair) - } - DataType.FLOAT -> { - // return the float value via FAC1 - assignExpressionToRegister(returnvalue, RegisterOrPair.FAC1) + in NumericDatatypes -> { + assignExpressionToRegister(returnvalue, returnReg.registerOrPair) } else -> { // all else take its address and assign that also to AY register pair diff --git a/docs/source/index.rst b/docs/source/index.rst index b73b2829b..1136ef3e9 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -165,6 +165,7 @@ If you're targeting the CommanderX16 instead, there's the `x16emu var argument passing to subroutines and avoid the second variable and copying of the value - more optimizations on the language AST level - more optimizations on the final assembly source level - note: subroutine inlining is abandoned because of problems referencing non-local stuff. Can't move everything around.