From 7b722a000180cdcb527d18e37e2cf2d67c57589e Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Tue, 4 Oct 2022 00:05:17 +0200 Subject: [PATCH] ir: fix count register uses --- .../codegen/intermediate/AssignmentGen.kt | 2 +- compiler/test/TestCompilerOnExamples.kt | 1 - .../src/prog8/intermediate/IRFileWriter.kt | 18 +++---------- .../src/prog8/intermediate/IRProgram.kt | 26 +++++++++++++++++++ intermediate/test/TestInstructions.kt | 1 - virtualmachine/src/prog8/vm/SysCalls.kt | 1 - 6 files changed, 30 insertions(+), 19 deletions(-) diff --git a/codeGenIntermediate/src/prog8/codegen/intermediate/AssignmentGen.kt b/codeGenIntermediate/src/prog8/codegen/intermediate/AssignmentGen.kt index 95ed20830..6cdea8258 100644 --- a/codeGenIntermediate/src/prog8/codegen/intermediate/AssignmentGen.kt +++ b/codeGenIntermediate/src/prog8/codegen/intermediate/AssignmentGen.kt @@ -6,9 +6,9 @@ import prog8.code.core.DataType import prog8.code.core.Position import prog8.code.core.SignedDatatypes import prog8.intermediate.IRCodeChunk +import prog8.intermediate.IRDataType import prog8.intermediate.IRInstruction import prog8.intermediate.Opcode -import prog8.intermediate.IRDataType internal class AssignmentGen(private val codeGen: IRCodeGen, private val expressionEval: ExpressionGen) { diff --git a/compiler/test/TestCompilerOnExamples.kt b/compiler/test/TestCompilerOnExamples.kt index 5c6deae73..17b0768f2 100644 --- a/compiler/test/TestCompilerOnExamples.kt +++ b/compiler/test/TestCompilerOnExamples.kt @@ -8,7 +8,6 @@ import prog8.compiler.CompilationResult import prog8.compiler.CompilerArguments import prog8.compiler.compileProgram import prog8tests.helpers.* -import prog8tests.helpers.compileText import java.nio.file.Path import kotlin.io.path.absolute import kotlin.io.path.exists diff --git a/intermediate/src/prog8/intermediate/IRFileWriter.kt b/intermediate/src/prog8/intermediate/IRFileWriter.kt index 6c8ed3e81..e9914437f 100644 --- a/intermediate/src/prog8/intermediate/IRFileWriter.kt +++ b/intermediate/src/prog8/intermediate/IRFileWriter.kt @@ -33,21 +33,9 @@ class IRFileWriter(private val irProgram: IRProgram, outfileOverride: Path?) { out.write("\n") out.close() - var usedRegisters = 0 - - fun addUsed(used: RegistersUsed) { - used.inputRegs.forEach{ (reg, count) -> usedRegisters+=count } - used.outputRegs.forEach{ (reg, count) -> usedRegisters+=count } - used.inputFpRegs.forEach{ (reg, count) -> usedRegisters+=count } - used.outputFpRegs.forEach{ (reg, count) -> usedRegisters+=count } - } - - irProgram.blocks.forEach { - it.inlineAssembly.forEach { chunk -> addUsed(chunk.usedRegisters()) } - it.subroutines.flatMap { sub->sub.chunks }.forEach { chunk -> addUsed(chunk.usedRegisters()) } - it.asmSubroutines.forEach { asmsub -> addUsed(asmsub.usedRegisters()) } - } - println("($numLines lines in $numChunks code chunks, $usedRegisters registers)") + val used = irProgram.registersUsed() + val numberUsed = (used.inputRegs.keys + used.outputRegs.keys).size + (used.inputFpRegs.keys + used.outputFpRegs.keys).size + println("($numLines lines in $numChunks code chunks, $numberUsed registers)") return outfile } diff --git a/intermediate/src/prog8/intermediate/IRProgram.kt b/intermediate/src/prog8/intermediate/IRProgram.kt index 36cbfaea9..a4ffccfe7 100644 --- a/intermediate/src/prog8/intermediate/IRProgram.kt +++ b/intermediate/src/prog8/intermediate/IRProgram.kt @@ -76,6 +76,32 @@ class IRProgram(val name: String, } } } + + fun registersUsed(): RegistersUsed { + val inputRegs = mutableMapOf().withDefault { 0 } + val inputFpRegs = mutableMapOf().withDefault { 0 } + val outputRegs = mutableMapOf().withDefault { 0 } + val outputFpRegs = mutableMapOf().withDefault { 0 } + + fun addUsed(usedRegisters: RegistersUsed) { + usedRegisters.inputRegs.forEach{ (reg, count) -> inputRegs[reg] = inputRegs.getValue(reg) + count } + usedRegisters.outputRegs.forEach{ (reg, count) -> outputRegs[reg] = outputRegs.getValue(reg) + count } + usedRegisters.inputFpRegs.forEach{ (reg, count) -> inputFpRegs[reg] = inputFpRegs.getValue(reg) + count } + usedRegisters.outputFpRegs.forEach{ (reg, count) -> outputFpRegs[reg] = outputFpRegs.getValue(reg) + count } + } + + globalInits.forEach { + if(it is IRInstruction) + it.addUsedRegistersCounts(inputRegs, outputRegs, inputFpRegs, outputFpRegs) + } + blocks.forEach { + it.inlineAssembly.forEach { chunk -> addUsed(chunk.usedRegisters()) } + it.subroutines.flatMap { sub->sub.chunks }.forEach { chunk -> addUsed(chunk.usedRegisters()) } + it.asmSubroutines.forEach { asmsub -> addUsed(asmsub.usedRegisters()) } + } + + return RegistersUsed(inputRegs, outputRegs, inputFpRegs, outputFpRegs) + } } class IRBlock( diff --git a/intermediate/test/TestInstructions.kt b/intermediate/test/TestInstructions.kt index 70ed1877e..6f3ade2e7 100644 --- a/intermediate/test/TestInstructions.kt +++ b/intermediate/test/TestInstructions.kt @@ -2,7 +2,6 @@ import io.kotest.assertions.throwables.shouldThrow import io.kotest.assertions.throwables.shouldThrowWithMessage import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe -import io.kotest.matchers.shouldNotBe import prog8.intermediate.* diff --git a/virtualmachine/src/prog8/vm/SysCalls.kt b/virtualmachine/src/prog8/vm/SysCalls.kt index f2199824e..325470ef0 100644 --- a/virtualmachine/src/prog8/vm/SysCalls.kt +++ b/virtualmachine/src/prog8/vm/SysCalls.kt @@ -1,7 +1,6 @@ package prog8.vm import prog8.code.core.AssemblyError -import java.lang.NumberFormatException import kotlin.math.min /*