fix: initial exprs on stack

This commit is contained in:
Alex Ling 2025-02-25 03:17:05 +00:00
parent 58d280462e
commit 8ed94e4df3

View File

@ -111,8 +111,8 @@ object asmGenerator {
)(using stack: LinkedHashMap[Ident, Int], strings: ListBuffer[String]): List[AsmLine] = )(using stack: LinkedHashMap[Ident, Int], strings: ListBuffer[String]): List[AsmLine] =
stmt match { stmt match {
case Assign(lhs, rhs) => case Assign(lhs, rhs) =>
var dest: IndexAddress = var dest: () => IndexAddress =
IndexAddress(RSP, 0) // gets overrwitten () => IndexAddress(RSP, 0) // gets overrwitten
(lhs match { (lhs match {
case ident: Ident => case ident: Ident =>
if (!stack.contains(ident)) { if (!stack.contains(ident)) {
@ -129,7 +129,9 @@ object asmGenerator {
List() List()
}) ++ }) ++
evalExprOntoStack(rhs) ++ evalExprOntoStack(rhs) ++
List(Pop(dest)) List(Pop(RAX),
Move(dest(), RAX),
)
case If(cond, thenBranch, elseBranch) => { case If(cond, thenBranch, elseBranch) => {
val elseLabel = labelGenerator.getLabel() val elseLabel = labelGenerator.getLabel()
val endLabel = labelGenerator.getLabel() val endLabel = labelGenerator.getLabel()
@ -173,7 +175,7 @@ object asmGenerator {
case CharLiter(v) => case CharLiter(v) =>
List(Push(ImmediateVal(v.toInt))) List(Push(ImmediateVal(v.toInt)))
case ident: Ident => case ident: Ident =>
List(Push(accessVar(ident))) List(Push(accessVar(ident)()))
case ArrayLiter(elems) => case ArrayLiter(elems) =>
expr.ty match { expr.ty match {
case KnownType.String => case KnownType.String =>
@ -347,11 +349,12 @@ object asmGenerator {
Compare(MemLocation(RSP, SizeDir.Word), EAX), Compare(MemLocation(RSP, SizeDir.Word), EAX),
Set(Register(RegSize.Byte, RegName.AL), cond), Set(Register(RegSize.Byte, RegName.AL), cond),
And(EAX, ImmediateVal(_8_BIT_MASK)), And(EAX, ImmediateVal(_8_BIT_MASK)),
Load(RSP, IndexAddress(RSP, 8)),
Push(RAX) Push(RAX)
) )
} }
def accessVar(ident: Ident)(using stack: LinkedHashMap[Ident, Int]): IndexAddress = def accessVar(ident: Ident)(using stack: LinkedHashMap[Ident, Int]): () => IndexAddress =
IndexAddress(RSP, (stack.size - stack(ident)) * 8) () => IndexAddress(RSP, (stack.size - stack(ident)) * 8)
def alignStack()(using stack: LinkedHashMap[Ident, Int]): List[AsmLine] = { def alignStack()(using stack: LinkedHashMap[Ident, Int]): List[AsmLine] = {
List( List(