From 7dd14955c1883d245033ecdb76989743e85e778e Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Tue, 13 Sep 2022 22:42:33 +0200 Subject: [PATCH] added remaining signature stuff to IRAsmSubroutine --- .../src/prog8/codegen/experimental/CodeGen.kt | 2 +- .../src/prog8/intermediate/IRFileReader.kt | 39 ++++++++++++++++--- .../src/prog8/intermediate/IRFileWriter.kt | 14 ++++++- .../src/prog8/intermediate/IRProgram.kt | 6 +-- 4 files changed, 50 insertions(+), 11 deletions(-) diff --git a/codeGenExperimental/src/prog8/codegen/experimental/CodeGen.kt b/codeGenExperimental/src/prog8/codegen/experimental/CodeGen.kt index 9ebde884a..a214abdfc 100644 --- a/codeGenExperimental/src/prog8/codegen/experimental/CodeGen.kt +++ b/codeGenExperimental/src/prog8/codegen/experimental/CodeGen.kt @@ -882,7 +882,7 @@ class CodeGen(internal val program: PtProgram, val assembly = if(child.children.isEmpty()) "" else (child.children.single() as PtInlineAssembly).assembly vmblock += IRAsmSubroutine(child.name, child.position, child.address, child.clobbers, - child.parameters.map { IRAsmSubroutine.IRAsmSubParam(it.first.name, it.first.type, it.second) }, + child.parameters.map { Pair(it.first.type, it.second) }, // note: the name of the asmsub param is not used anymore. child.returnTypes.zip(child.retvalRegisters), assembly) } diff --git a/intermediate/src/prog8/intermediate/IRFileReader.kt b/intermediate/src/prog8/intermediate/IRFileReader.kt index 24c85a0ac..e13d9e272 100644 --- a/intermediate/src/prog8/intermediate/IRFileReader.kt +++ b/intermediate/src/prog8/intermediate/IRFileReader.kt @@ -240,7 +240,7 @@ class IRFileReader(outputDir: Path, programName: String) { private val blockPattern = Regex("") private val inlineAsmPattern = Regex("") - private val asmsubPattern = Regex("") + private val asmsubPattern = Regex("") private val subPattern = Regex("") private val posPattern = Regex("\\[(.+): line (.+) col (.+)-(.+)\\]") private val instructionPattern = Regex("""([a-z]+)(\.b|\.w|\.f)?(.*)""", RegexOption.IGNORE_CASE) @@ -290,19 +290,37 @@ class IRFileReader(outputDir: Path, programName: String) { private fun parseAsmSubroutine(startline: String, lines: Iterator): IRAsmSubroutine { // val match = asmsubPattern.matchEntire(startline) ?: throw IRParseException("invalid ASMSUB") - val (scopedname, address, clobbers, pos) = match.destructured + val (scopedname, address, clobbers, returnSpec, pos) = match.destructured + // parse PARAMS var line = lines.next() + if(line!="") + throw IRParseException("missing PARAMS") + val params = mutableListOf>() + while(true) { + line = lines.next() + if(line=="") + break + val (datatype, regOrSf) = line.split(' ') + val dt = parseDatatype(datatype, datatype.contains('[')) + val regsf = parseRegisterOrStatusflag(regOrSf) + params += Pair(dt, regsf) + } + line = lines.next() val asm = parseInlineAssembly(line, lines) while(line!="") line = lines.next() val clobberRegs = clobbers.split(',').map { CpuRegister.valueOf(it) } - // TODO parse this additional signature stuff once it's there. - val parameters = mutableListOf() val returns = mutableListOf>() + returnSpec.split(',').forEach{ rs -> + val (regstr, dtstr) = rs.split(':') + val dt = parseDatatype(dtstr, false) + val regsf = parseRegisterOrStatusflag(regstr) + returns.add(Pair(dt, regsf)) + } return IRAsmSubroutine(scopedname, parsePosition(pos), if(address=="null") null else address.toUInt(), clobberRegs.toSet(), - parameters, + params, returns, asm.asm) } @@ -560,6 +578,17 @@ class IRFileReader(outputDir: Path, programName: String) { return value.toFloat() } + private fun parseRegisterOrStatusflag(regs: String): RegisterOrStatusflag { + var reg: RegisterOrPair? = null + var sf: Statusflag? = null + try { + reg = RegisterOrPair.valueOf(regs) + } catch (x: IllegalArgumentException) { + sf = Statusflag.valueOf(regs) + } + return RegisterOrStatusflag(reg, sf) + } + private fun parsePosition(strpos: String): Position { // example: "[library:/prog8lib/virtual/textio.p8: line 5 col 2-4]" val match = posPattern.matchEntire(strpos) ?: throw IRParseException("invalid Position") diff --git a/intermediate/src/prog8/intermediate/IRFileWriter.kt b/intermediate/src/prog8/intermediate/IRFileWriter.kt index 167ff348b..50beb6dff 100644 --- a/intermediate/src/prog8/intermediate/IRFileWriter.kt +++ b/intermediate/src/prog8/intermediate/IRFileWriter.kt @@ -57,8 +57,18 @@ class IRFileWriter(private val irProgram: IRProgram) { } block.asmSubroutines.forEach { val clobbers = it.clobbers.joinToString(",") - out.write("\n") - // TODO rest of the signature: RETURNS = it.returns + val returns = it.returns.map { (dt, reg) -> + if(reg.registerOrPair!=null) "${reg.registerOrPair}:${dt.toString().lowercase()}" + else "${reg.statusflag}:${dt.toString().lowercase()}" + }.joinToString(",") + out.write("\n") + out.write("\n") + it.parameters.forEach { (dt, regOrSf) -> + val reg = if(regOrSf.registerOrPair!=null) regOrSf.registerOrPair.toString() + else regOrSf.statusflag.toString() + out.write("${dt.toString().lowercase()} $reg\n") + } + out.write("\n") out.write("\n") out.write(it.assembly.trimStart('\n').trimEnd(' ', '\n')) out.write("\n\n\n") diff --git a/intermediate/src/prog8/intermediate/IRProgram.kt b/intermediate/src/prog8/intermediate/IRProgram.kt index 5c39c575b..ff7b87529 100644 --- a/intermediate/src/prog8/intermediate/IRProgram.kt +++ b/intermediate/src/prog8/intermediate/IRProgram.kt @@ -35,8 +35,10 @@ PROGRAM: SUB SUB ASMSUB + PARAMS INLINEASM ASMSUB + PARAMS INLINEASM ... BLOCK @@ -104,7 +106,7 @@ class IRAsmSubroutine(val name: String, val position: Position, val address: UInt?, val clobbers: Set, - val parameters: List, + val parameters: List>, val returns: List>, val assembly: String) { val lines = mutableListOf() @@ -115,8 +117,6 @@ class IRAsmSubroutine(val name: String, if(name.startsWith("main.main.")) throw IllegalArgumentException("subroutine name invalid main prefix: $name") } - - class IRAsmSubParam(val name: String, val dt: DataType, val reg: RegisterOrStatusflag) } sealed class IRCodeLine