diff --git a/src/main/wacc/backend/assemblyIR.scala b/src/main/wacc/backend/assemblyIR.scala new file mode 100644 index 0000000..0777dd1 --- /dev/null +++ b/src/main/wacc/backend/assemblyIR.scala @@ -0,0 +1,68 @@ +package wacc + +object assemblyIR { + enum RegSize { + case R64 + case E32 + + override def toString: String = this match { + case R64 => "r" + case E32 => "e" + } + } + + enum CLibFunc { + case Scanf, + Puts, + Fflush, + Exit, + PrintF + + private val plt = "@plt" + + override def toString: String = this match { + case Scanf => "scanf" + plt + case Puts => "puts" + plt + case Fflush => "fflush" + plt + case Exit => "exit" + plt + case PrintF => "printf" + plt + } + } + + enum Register { + case Named(name: String, size: RegSize) + case Scratch(num: Int, size: RegSize) + override def toString: String = this match { + case Named(name, size) => s"${size}${name}" + case Scratch(num, size) => s"${size}${num}" + } + } + case class MemLocation(pointer: Long) + case class ImmediateVal(value: Int) + + //TODO Check if dest and src are not both memory locations + sealed trait noDupeMemLoc + +// object noDupeMemLoc { +// def apply(dest: Register | MemLocation, src: Register | MemLocation | ImmediateVal) : noDupeMemLoc { +// require(!(dest.isInstanceOf[MemLocation] && src.isInstanceOf[MemLocation])) +// } +// } + case class Add(dest: Register | MemLocation, src: Register | MemLocation | ImmediateVal) extends noDupeMemLoc + case class Subtract(dest: Register | MemLocation, src: Register | MemLocation | ImmediateVal) extends noDupeMemLoc + case class Multiply(src: Register) + case class Divide(src: Register) + + case class And(dest: Register | MemLocation, src: Register | MemLocation | ImmediateVal) extends noDupeMemLoc + case class Or(dest: Register | MemLocation, src: Register | MemLocation | ImmediateVal) extends noDupeMemLoc + case class Compare(dest: Register | MemLocation, src: Register | MemLocation | ImmediateVal) extends noDupeMemLoc + + case class Call(func: CLibFunc) + + case class Push(src: Register | MemLocation | ImmediateVal) + case class Pop(src: Register | MemLocation | ImmediateVal) + + case class Jump() + +} + diff --git a/src/main/wacc/Frontend/Error.scala b/src/main/wacc/frontend/Error.scala similarity index 100% rename from src/main/wacc/Frontend/Error.scala rename to src/main/wacc/frontend/Error.scala diff --git a/src/main/wacc/Frontend/ast.scala b/src/main/wacc/frontend/ast.scala similarity index 100% rename from src/main/wacc/Frontend/ast.scala rename to src/main/wacc/frontend/ast.scala diff --git a/src/main/wacc/Frontend/lexer.scala b/src/main/wacc/frontend/lexer.scala similarity index 100% rename from src/main/wacc/Frontend/lexer.scala rename to src/main/wacc/frontend/lexer.scala diff --git a/src/main/wacc/Frontend/parser.scala b/src/main/wacc/frontend/parser.scala similarity index 100% rename from src/main/wacc/Frontend/parser.scala rename to src/main/wacc/frontend/parser.scala diff --git a/src/main/wacc/Frontend/renamer.scala b/src/main/wacc/frontend/renamer.scala similarity index 100% rename from src/main/wacc/Frontend/renamer.scala rename to src/main/wacc/frontend/renamer.scala diff --git a/src/main/wacc/Frontend/typeChecker.scala b/src/main/wacc/frontend/typeChecker.scala similarity index 100% rename from src/main/wacc/Frontend/typeChecker.scala rename to src/main/wacc/frontend/typeChecker.scala diff --git a/src/main/wacc/Frontend/types.scala b/src/main/wacc/frontend/types.scala similarity index 100% rename from src/main/wacc/Frontend/types.scala rename to src/main/wacc/frontend/types.scala