feat: implement label generation and basic conditional branching in asmGenerator

This commit is contained in:
Guy C 2025-02-24 02:00:35 +00:00
parent c59c28ecbd
commit dc61b1e390

View File

@ -3,6 +3,13 @@ package wacc
import scala.collection.mutable.LinkedHashMap
import scala.collection.mutable.ListBuffer
object labelGenerator {
var labelVal = -1
def getLabel(): String = {
labelVal += 1
s".L$labelVal"
}
}
object asmGenerator {
import microWacc._
import assemblyIR._
@ -85,7 +92,18 @@ object asmGenerator {
evalExprIntoReg(rhs, Register(RegSize.R64, RegName.AX)) ++
List(Move(dest, Register(RegSize.R64, RegName.AX)))
})
// TODO other statements
case If(cond, thenBranch, elseBranch) => {
val elseLabel = labelGenerator.getLabel()
val endLabel = labelGenerator.getLabel()
evalExprIntoReg(cond, Register(RegSize.R64, RegName.AX)) ++
List(Compare(Register(RegSize.R64, RegName.AX), ImmediateVal(0)),
Jump(LabelArg(elseLabel), Cond.Equal)) ++
thenBranch.flatMap(generateStmt) ++
List(Jump(LabelArg(endLabel)),
LabelDef(elseLabel)) ++
elseBranch.flatMap(generateStmt) ++
List(LabelDef(endLabel))
}
case _ => List()
}
@ -120,6 +138,7 @@ object asmGenerator {
case _ => List()
}
// TODO other expr types
case BoolLiter(v) => List(Move(dest, ImmediateVal(if (v) 1 else 0)))
case _ => List()
}
}
@ -165,12 +184,12 @@ object asmGenerator {
List(
Push(Register(RegSize.R64, RegName.BP)),
Move(Register(RegSize.R64, RegName.BP), Register(RegSize.R64, RegName.SP)),
Move(Register(RegSize.R64, RegName.AX), ImmediateVal(0))
)
}
def funcEpilogue(): List[AsmLine] = {
List(
Move(Register(RegSize.R64, RegName.AX), ImmediateVal(0)),
Move(Register(RegSize.R64, RegName.SP), Register(RegSize.R64, RegName.BP)),
Pop(Register(RegSize.R64, RegName.BP))
)