From 88ce9300bcbc5f65ace3a152db2ff0cb5a1dd08f Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sun, 14 May 2023 21:02:40 +0200 Subject: [PATCH] fix parse cpureg in IR regspec --- .../src/prog8/intermediate/IRFileReader.kt | 11 -------- intermediate/src/prog8/intermediate/Utils.kt | 26 ++++++++++++++----- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/intermediate/src/prog8/intermediate/IRFileReader.kt b/intermediate/src/prog8/intermediate/IRFileReader.kt index f0c6bf858..814722dcd 100644 --- a/intermediate/src/prog8/intermediate/IRFileReader.kt +++ b/intermediate/src/prog8/intermediate/IRFileReader.kt @@ -504,17 +504,6 @@ class IRFileReader { } } - 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 val posPattern = Regex("\\[(.+): line (.+) col (.+)-(.+)\\]") private fun parsePosition(strpos: String): Position { diff --git a/intermediate/src/prog8/intermediate/Utils.kt b/intermediate/src/prog8/intermediate/Utils.kt index 4355b9a6c..9107b95d2 100644 --- a/intermediate/src/prog8/intermediate/Utils.kt +++ b/intermediate/src/prog8/intermediate/Utils.kt @@ -1,10 +1,7 @@ package prog8.intermediate import prog8.code.* -import prog8.code.core.AssemblyError -import prog8.code.core.DataType -import prog8.code.core.InternalCompilerException -import prog8.code.core.PassByReferenceDatatypes +import prog8.code.core.* fun getTypeString(dt : DataType): String = when(dt) { @@ -225,7 +222,7 @@ private class ParsedCall( private fun parseCall(rest: String): ParsedCall { fun parseRegspec(reg: String): FunctionCallArgs.RegSpec { - val pattern = Regex("f?r([0-9]+)\\.(.)") + val pattern = Regex("f?r([0-9]+)\\.(.)(@.{1,2})?$") val match = pattern.matchEntire(reg) ?: throw IRParseException("invalid regspec $reg") val num = match.groups[1]!!.value.toInt() val type = when(match.groups[2]!!.value) { @@ -234,7 +231,12 @@ private fun parseCall(rest: String): ParsedCall { "f" -> IRDataType.FLOAT else -> throw IRParseException("invalid type spec in $reg") } - return FunctionCallArgs.RegSpec(type, num, null) // TODO parse cpu register + val cpuRegister: RegisterOrStatusflag? = + if(match.groups[3]!=null) { + val cpuRegStr = match.groups[3]!!.value.drop(1) + parseRegisterOrStatusflag(cpuRegStr) + } else null + return FunctionCallArgs.RegSpec(type, num, cpuRegister) } fun parseArgs(args: String): List { @@ -264,6 +266,18 @@ private fun parseCall(rest: String): ParsedCall { } +internal 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) +} + + fun irType(type: DataType): IRDataType { return when(type) { DataType.BOOL,