diff --git a/src/main/wacc/backend/asmGenerator.scala b/src/main/wacc/backend/asmGenerator.scala index 3a73ce9..e2ef7c9 100644 --- a/src/main/wacc/backend/asmGenerator.scala +++ b/src/main/wacc/backend/asmGenerator.scala @@ -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)