From d49c267d50922ce8c37aa4087bc3cdc6ae78776f Mon Sep 17 00:00:00 2001 From: Guy C Date: Tue, 18 Feb 2025 18:26:50 +0000 Subject: [PATCH] feat: extends IR for load/move instructions and generalised conditional jumps --- src/main/wacc/backend/assemblyIR.scala | 34 +++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/main/wacc/backend/assemblyIR.scala b/src/main/wacc/backend/assemblyIR.scala index f1ce3a0..d9955c2 100644 --- a/src/main/wacc/backend/assemblyIR.scala +++ b/src/main/wacc/backend/assemblyIR.scala @@ -39,7 +39,7 @@ object assemblyIR { case Scratch(num: Int, size: RegSize) override def toString = this match { 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 { @@ -50,7 +50,7 @@ object assemblyIR { } 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 { @@ -59,11 +59,11 @@ object assemblyIR { // TODO Check if dest and src are not both memory locations 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 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 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 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 Jump(op1: LabelArg) extends Operation("jmp", op1) - case class JumpIfEqual(op1: LabelArg) extends Operation("je", op1) + case class Jump(op1: LabelArg, condition: Cond = Cond.Always) extends Operation(s"j${condition.toString}", op1) case class LabelDef(name: String) { 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" + } + } }