From f2a1eaf24cacc5927237d9385f7059d8efd8bab6 Mon Sep 17 00:00:00 2001 From: Guy C Date: Fri, 28 Feb 2025 11:37:30 +0000 Subject: [PATCH] refactor: reorganize operation classes --- src/main/wacc/backend/assemblyIR.scala | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/wacc/backend/assemblyIR.scala b/src/main/wacc/backend/assemblyIR.scala index fbf51f5..e8e7e62 100644 --- a/src/main/wacc/backend/assemblyIR.scala +++ b/src/main/wacc/backend/assemblyIR.scala @@ -102,7 +102,6 @@ object assemblyIR { opSize.toString + s"[$pointer]" } - // TODO to string is wacky case class IndexAddress( base: Register, offset: Int | LabelArg, @@ -125,36 +124,37 @@ object assemblyIR { override def toString = name } - // TODO Check if dest and src are not both memory locations abstract class Operation(ins: String, ops: Operand*) extends AsmLine { override def toString: String = s"\t$ins ${ops.mkString(", ")}" } + + // arithmetic operations 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(ops: Operand*) extends Operation("imul", ops*) case class Divide(op1: Src) extends Operation("idiv", op1) case class Negate(op: Dest) extends Operation("neg", op) - + // bitwise operations case class And(op1: Dest, op2: Src) extends Operation("and", op1, op2) case class Or(op1: Dest, op2: Src) extends Operation("or", op1, op2) case class Xor(op1: Dest, op2: Src) extends Operation("xor", op1, op2) case class Compare(op1: Dest, op2: Src) extends Operation("cmp", op1, op2) - + case class CDQ() extends Operation("cdq") // stack operations case class Push(op1: Src) extends Operation("push", op1) case class Pop(op1: Src) extends Operation("pop", op1) - case class Call(op1: CLibFunc | LabelArg) extends Operation("call", op1) - + // move operations case class Move(op1: Dest, op2: Src) extends Operation("mov", op1, op2) case class Load(op1: Register, op2: MemLocation | IndexAddress) extends Operation("lea ", op1, op2) - case class CDQ() extends Operation("cdq") + // function call operations + case class Call(op1: CLibFunc | LabelArg) extends Operation("call", op1) case class Return() extends Operation("ret") + // conditional operations case class Jump(op1: LabelArg, condition: Cond = Cond.Always) extends Operation(s"j${condition.toString}", op1) - case class Set(op1: Dest, condition: Cond = Cond.Always) extends Operation(s"set${condition.toString}", op1)