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
|
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] = {
|
def generateAsm(microProg: Program): List[AsmLine] = {
|
||||||
given stack: Stack = Stack()
|
given stack: Stack = Stack()
|
||||||
given strings: ListBuffer[String] = ListBuffer[String]()
|
given strings: ListBuffer[String] = ListBuffer[String]()
|
||||||
|
given labelGenerator: LabelGenerator = LabelGenerator()
|
||||||
val Program(funcs, main) = microProg
|
val Program(funcs, main) = microProg
|
||||||
|
|
||||||
val progAsm =
|
val progAsm =
|
||||||
@ -76,7 +65,8 @@ object asmGenerator {
|
|||||||
|
|
||||||
def generateBuiltInFuncs()(using
|
def generateBuiltInFuncs()(using
|
||||||
stack: Stack,
|
stack: Stack,
|
||||||
strings: ListBuffer[String]
|
strings: ListBuffer[String],
|
||||||
|
labelGenerator: LabelGenerator
|
||||||
): List[AsmLine] = {
|
): List[AsmLine] = {
|
||||||
wrapFunc(
|
wrapFunc(
|
||||||
labelGenerator.getLabel(Builtin.Exit),
|
labelGenerator.getLabel(Builtin.Exit),
|
||||||
@ -112,7 +102,11 @@ object asmGenerator {
|
|||||||
|
|
||||||
def generateStmt(
|
def generateStmt(
|
||||||
stmt: Stmt
|
stmt: Stmt
|
||||||
)(using stack: Stack, strings: ListBuffer[String]): List[AsmLine] =
|
)(using
|
||||||
|
stack: Stack,
|
||||||
|
strings: ListBuffer[String],
|
||||||
|
labelGenerator: LabelGenerator
|
||||||
|
): List[AsmLine] =
|
||||||
stmt match {
|
stmt match {
|
||||||
case Assign(lhs, rhs) =>
|
case Assign(lhs, rhs) =>
|
||||||
var dest: () => IndexAddress =
|
var dest: () => IndexAddress =
|
||||||
@ -168,7 +162,8 @@ object asmGenerator {
|
|||||||
|
|
||||||
def evalExprOntoStack(expr: Expr)(using
|
def evalExprOntoStack(expr: Expr)(using
|
||||||
stack: Stack,
|
stack: Stack,
|
||||||
strings: ListBuffer[String]
|
strings: ListBuffer[String],
|
||||||
|
labelGenerator: LabelGenerator
|
||||||
): List[AsmLine] = {
|
): List[AsmLine] = {
|
||||||
val out = expr match {
|
val out = expr match {
|
||||||
case IntLiter(v) =>
|
case IntLiter(v) =>
|
||||||
@ -303,7 +298,8 @@ object asmGenerator {
|
|||||||
|
|
||||||
def generateCall(call: microWacc.Call)(using
|
def generateCall(call: microWacc.Call)(using
|
||||||
stack: Stack,
|
stack: Stack,
|
||||||
strings: ListBuffer[String]
|
strings: ListBuffer[String],
|
||||||
|
labelGenerator: LabelGenerator
|
||||||
): List[AsmLine] = {
|
): List[AsmLine] = {
|
||||||
val argRegs = List(RDI, RSI, RDX, RCX, R8, R9)
|
val argRegs = List(RDI, RSI, RDX, RCX, R8, R9)
|
||||||
val microWacc.Call(target, args) = call
|
val microWacc.Call(target, args) = call
|
||||||
@ -320,7 +316,8 @@ object asmGenerator {
|
|||||||
|
|
||||||
def generateComparison(x: Expr, y: Expr, cond: Cond)(using
|
def generateComparison(x: Expr, y: Expr, cond: Cond)(using
|
||||||
stack: Stack,
|
stack: Stack,
|
||||||
strings: ListBuffer[String]
|
strings: ListBuffer[String],
|
||||||
|
labelGenerator: LabelGenerator
|
||||||
): List[AsmLine] = {
|
): List[AsmLine] = {
|
||||||
evalExprOntoStack(x) ++
|
evalExprOntoStack(x) ++
|
||||||
evalExprOntoStack(y) ++
|
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 {
|
class Stack {
|
||||||
private val stack = LinkedHashMap[Expr | Int, Int]()
|
private val stack = LinkedHashMap[Expr | Int, Int]()
|
||||||
private val RSP = Register(RegSize.R64, RegName.SP)
|
private val RSP = Register(RegSize.R64, RegName.SP)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user