feat: implement label generation and basic conditional branching in asmGenerator
This commit is contained in:
parent
c59c28ecbd
commit
dc61b1e390
@ -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))
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user