refactor: use non-singleton labelgenerator (instead use class)
This commit is contained in:
parent
5f8b87221c
commit
efe9f91303
@ -24,21 +24,10 @@ object asmGenerator {
|
||||
|
||||
val _8_BIT_MASK = 0xff
|
||||
|
||||
object labelGenerator {
|
||||
var labelVal = -1
|
||||
def getLabel(): String = {
|
||||
labelVal += 1
|
||||
s".L$labelVal"
|
||||
}
|
||||
def getLabel(target: CallTarget): String = target match {
|
||||
case Ident(v, _) => s"wacc_$v"
|
||||
case Builtin(name) => s"_$name"
|
||||
}
|
||||
}
|
||||
|
||||
def generateAsm(microProg: Program): List[AsmLine] = {
|
||||
given stack: Stack = Stack()
|
||||
given strings: ListBuffer[String] = ListBuffer[String]()
|
||||
given labelGenerator: LabelGenerator = LabelGenerator()
|
||||
val Program(funcs, main) = microProg
|
||||
|
||||
val progAsm =
|
||||
@ -76,7 +65,8 @@ object asmGenerator {
|
||||
|
||||
def generateBuiltInFuncs()(using
|
||||
stack: Stack,
|
||||
strings: ListBuffer[String]
|
||||
strings: ListBuffer[String],
|
||||
labelGenerator: LabelGenerator
|
||||
): List[AsmLine] = {
|
||||
wrapFunc(
|
||||
labelGenerator.getLabel(Builtin.Exit),
|
||||
@ -112,7 +102,11 @@ object asmGenerator {
|
||||
|
||||
def generateStmt(
|
||||
stmt: Stmt
|
||||
)(using stack: Stack, strings: ListBuffer[String]): List[AsmLine] =
|
||||
)(using
|
||||
stack: Stack,
|
||||
strings: ListBuffer[String],
|
||||
labelGenerator: LabelGenerator
|
||||
): List[AsmLine] =
|
||||
stmt match {
|
||||
case Assign(lhs, rhs) =>
|
||||
var dest: () => IndexAddress =
|
||||
@ -168,7 +162,8 @@ object asmGenerator {
|
||||
|
||||
def evalExprOntoStack(expr: Expr)(using
|
||||
stack: Stack,
|
||||
strings: ListBuffer[String]
|
||||
strings: ListBuffer[String],
|
||||
labelGenerator: LabelGenerator
|
||||
): List[AsmLine] = {
|
||||
val out = expr match {
|
||||
case IntLiter(v) =>
|
||||
@ -303,7 +298,8 @@ object asmGenerator {
|
||||
|
||||
def generateCall(call: microWacc.Call)(using
|
||||
stack: Stack,
|
||||
strings: ListBuffer[String]
|
||||
strings: ListBuffer[String],
|
||||
labelGenerator: LabelGenerator
|
||||
): List[AsmLine] = {
|
||||
val argRegs = List(RDI, RSI, RDX, RCX, R8, R9)
|
||||
val microWacc.Call(target, args) = call
|
||||
@ -320,7 +316,8 @@ object asmGenerator {
|
||||
|
||||
def generateComparison(x: Expr, y: Expr, cond: Cond)(using
|
||||
stack: Stack,
|
||||
strings: ListBuffer[String]
|
||||
strings: ListBuffer[String],
|
||||
labelGenerator: LabelGenerator
|
||||
): List[AsmLine] = {
|
||||
evalExprOntoStack(x) ++
|
||||
evalExprOntoStack(y) ++
|
||||
@ -350,6 +347,18 @@ object asmGenerator {
|
||||
)
|
||||
}
|
||||
|
||||
class LabelGenerator {
|
||||
var labelVal = -1
|
||||
def getLabel(): String = {
|
||||
labelVal += 1
|
||||
s".L$labelVal"
|
||||
}
|
||||
def getLabel(target: CallTarget): String = target match {
|
||||
case Ident(v, _) => s"wacc_$v"
|
||||
case Builtin(name) => s"_$name"
|
||||
}
|
||||
}
|
||||
|
||||
class Stack {
|
||||
private val stack = LinkedHashMap[Expr | Int, Int]()
|
||||
private val RSP = Register(RegSize.R64, RegName.SP)
|
||||
|
Loading…
x
Reference in New Issue
Block a user