feat: extends IR for load/move instructions and generalised conditional jumps
This commit is contained in:
parent
2c281066a8
commit
d49c267d50
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user