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