feat: extends IR for load/move instructions and generalised conditional jumps

This commit is contained in:
Guy C 2025-02-18 18:26:50 +00:00
parent 2c281066a8
commit d49c267d50

View File

@ -39,7 +39,7 @@ object assemblyIR {
case Scratch(num: Int, size: RegSize) case Scratch(num: Int, size: RegSize)
override def toString = this match { override def toString = this match {
case Named(name, size) => s"${size}${name.toLowerCase()}" case Named(name, size) => s"${size}${name.toLowerCase()}"
case Scratch(num, size) => s"${size}${num}" case Scratch(num, size) => s"r${num}${if (size == RegSize.E32) "d" else ""}"
} }
} }
case class MemLocation(pointer: Long | Register) extends Dest with Src { case class MemLocation(pointer: Long | Register) extends Dest with Src {
@ -50,7 +50,7 @@ object assemblyIR {
} }
case class ImmediateVal(value: Int) extends Src { case class ImmediateVal(value: Int) extends Src {
override def toString = s"#${value.toString}" override def toString = value.toString
} }
case class LabelArg(name: String) extends Operand { case class LabelArg(name: String) extends Operand {
@ -59,11 +59,11 @@ object assemblyIR {
// TODO Check if dest and src are not both memory locations // TODO Check if dest and src are not both memory locations
abstract class Operation(ins: String, ops: Operand*) { abstract class Operation(ins: String, ops: Operand*) {
override def toString: String = s"$ins ${ops.mkString(", ")}" override def toString: String = s"\t$ins ${ops.mkString(", ")}"
} }
case class Add(op1: Dest, op2: Src) extends Operation("add", op1, op2) case class Add(op1: Dest, op2: Src) extends Operation("add", op1, op2)
case class Subtract(op1: Dest, op2: Src) extends Operation("sub", op1, op2) case class Subtract(op1: Dest, op2: Src) extends Operation("sub", op1, op2)
case class Multiply(op1: Src) extends Operation("mul", op1) case class Multiply(ops: Operand*) extends Operation("mul", ops*)
case class Divide(op1: Src) extends Operation("div", op1) case class Divide(op1: Src) extends Operation("div", op1)
case class And(op1: Dest, op2: Src) extends Operation("and", op1, op2) case class And(op1: Dest, op2: Src) extends Operation("and", op1, op2)
@ -75,13 +75,35 @@ object assemblyIR {
case class Pop(op1: Src) extends Operation("pop", op1) case class Pop(op1: Src) extends Operation("pop", op1)
case class Call(op1: CLibFunc) extends Operation("call", op1) case class Call(op1: CLibFunc) extends Operation("call", op1)
case class Move(op1: Dest, op2: Src) extends Operation("mov", op1, op2)
case class Load(op1: Register, op2: MemLocation) extends Operation("lea ", op1, op2)
case class Return() extends Operation("ret") case class Return() extends Operation("ret")
case class Jump(op1: LabelArg) extends Operation("jmp", op1) case class Jump(op1: LabelArg, condition: Cond = Cond.Always) extends Operation(s"j${condition.toString}", op1)
case class JumpIfEqual(op1: LabelArg) extends Operation("je", op1)
case class LabelDef(name: String) { case class LabelDef(name: String) {
override def toString = s"$name:" override def toString = s"$name:"
} }
enum Cond {
case Equal,
NotEqual,
Greater,
GreaterEqual,
Less,
LessEqual,
Overflow,
Always
override def toString(): String = this match {
case Equal => "e"
case NotEqual => "ne"
case Greater => "g"
case GreaterEqual => "ge"
case Less => "l"
case LessEqual => "le"
case Overflow => "o"
case Always => "mp"
}
}
} }