feat: x86 code generation implementation without runtime checking #29

Merged
gk1623 merged 58 commits from asm-gen into master 2025-02-27 18:54:57 +00:00
9 changed files with 573 additions and 222 deletions
Showing only changes of commit c9723f9359 - Show all commits

View File

@@ -237,8 +237,8 @@ object asmGenerator {
}
case BinaryOp(x, y, op) =>
chain ++= evalExprOntoStack(x)
chain ++= evalExprOntoStack(y)
chain ++= evalExprOntoStack(x)
chain += stack.pop(RAX)
@@ -251,11 +251,21 @@ object asmGenerator {
chain += stack.push(RAX)
case BinaryOperator.Div =>
// chain += stack.pop(RDX)
// chain += stack.pop(RAX)
// chain += stack.push(RDX)
// chain += stack.push(RAX)
chain += CDQ()
chain += Divide(stack.head(SizeDir.Word))
chain += stack.drop()
chain += stack.push(RAX)
case BinaryOperator.Mod =>
// chain += stack.pop(RDX)
// chain += stack.pop(RAX)
// chain += stack.push(RDX)
// chain += stack.push(RAX)
chain += CDQ()
chain += Divide(stack.head(SizeDir.Word))
chain += stack.drop()
chain += stack.push(RDX)

View File

@@ -112,6 +112,7 @@ object assemblyIR {
case class Move(op1: Dest, op2: Src) extends Operation("mov", op1, op2)
case class Load(op1: Register, op2: MemLocation | IndexAddress)
extends Operation("lea ", op1, op2)
case class CDQ() extends Operation("cdq")
case class Return() extends Operation("ret")

View File

@@ -88,7 +88,7 @@ class ParallelExamplesSpec extends AnyFlatSpec with BeforeAndAfterAll with Paral
"^.*wacc-examples/valid/advanced.*$",
"^.*wacc-examples/valid/array.*$",
// "^.*wacc-examples/valid/basic/exit.*$",
"^.*wacc-examples/valid/basic/skip.*$",
// "^.*wacc-examples/valid/basic/skip.*$",
"^.*wacc-examples/valid/expressions.*$",
"^.*wacc-examples/valid/function/nested_functions.*$",
"^.*wacc-examples/valid/function/simple_functions.*$",
@@ -100,7 +100,7 @@ class ParallelExamplesSpec extends AnyFlatSpec with BeforeAndAfterAll with Paral
"^.*wacc-examples/valid/pairs.*$",
"^.*wacc-examples/valid/runtimeErr.*$",
"^.*wacc-examples/valid/scope.*$",
"^.*wacc-examples/valid/sequence.*$",
// "^.*wacc-examples/valid/sequence.*$",
"^.*wacc-examples/valid/variables.*$",
"^.*wacc-examples/valid/while.*$",
// format: on