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] =
|
)(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(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user