feat: incomplete initial implementation of assemblyIR

This commit is contained in:
Barf-Vader 2025-02-13 17:42:50 +00:00
parent 41ed06f91c
commit 32622cdd7e
8 changed files with 68 additions and 0 deletions

View File

@ -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()
}