refactor: reorganize operation classes

This commit is contained in:
Guy C
2025-02-28 11:37:30 +00:00
parent 8b3e9b8380
commit f2a1eaf24c

View File

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