fix: initial exprs on stack
This commit is contained in:
parent
58d280462e
commit
8ed94e4df3
@ -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(
|
||||
|
Loading…
x
Reference in New Issue
Block a user