refactor: reorganize operation classes
This commit is contained in:
@@ -102,7 +102,6 @@ object assemblyIR {
|
|||||||
opSize.toString + s"[$pointer]"
|
opSize.toString + s"[$pointer]"
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO to string is wacky
|
|
||||||
case class IndexAddress(
|
case class IndexAddress(
|
||||||
base: Register,
|
base: Register,
|
||||||
offset: Int | LabelArg,
|
offset: Int | LabelArg,
|
||||||
@@ -125,36 +124,37 @@ object assemblyIR {
|
|||||||
override def toString = name
|
override def toString = name
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO Check if dest and src are not both memory locations
|
|
||||||
abstract class Operation(ins: String, ops: Operand*) extends AsmLine {
|
abstract class Operation(ins: String, ops: Operand*) extends AsmLine {
|
||||||
override def toString: String = s"\t$ins ${ops.mkString(", ")}"
|
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 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(ops: Operand*) extends Operation("imul", ops*)
|
case class Multiply(ops: Operand*) extends Operation("imul", ops*)
|
||||||
case class Divide(op1: Src) extends Operation("idiv", op1)
|
case class Divide(op1: Src) extends Operation("idiv", op1)
|
||||||
case class Negate(op: Dest) extends Operation("neg", op)
|
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 And(op1: Dest, op2: Src) extends Operation("and", op1, op2)
|
||||||
case class Or(op1: Dest, op2: Src) extends Operation("or", 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 Xor(op1: Dest, op2: Src) extends Operation("xor", op1, op2)
|
||||||
case class Compare(op1: Dest, op2: Src) extends Operation("cmp", op1, op2)
|
case class Compare(op1: Dest, op2: Src) extends Operation("cmp", op1, op2)
|
||||||
|
case class CDQ() extends Operation("cdq")
|
||||||
// stack operations
|
// stack operations
|
||||||
case class Push(op1: Src) extends Operation("push", op1)
|
case class Push(op1: Src) extends Operation("push", op1)
|
||||||
case class Pop(op1: Src) extends Operation("pop", 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 Move(op1: Dest, op2: Src) extends Operation("mov", op1, op2)
|
||||||
case class Load(op1: Register, op2: MemLocation | IndexAddress)
|
case class Load(op1: Register, op2: MemLocation | IndexAddress)
|
||||||
extends Operation("lea ", op1, op2)
|
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")
|
case class Return() extends Operation("ret")
|
||||||
|
|
||||||
|
// conditional operations
|
||||||
case class Jump(op1: LabelArg, condition: Cond = Cond.Always)
|
case class Jump(op1: LabelArg, condition: Cond = Cond.Always)
|
||||||
extends Operation(s"j${condition.toString}", op1)
|
extends Operation(s"j${condition.toString}", op1)
|
||||||
|
|
||||||
case class Set(op1: Dest, condition: Cond = Cond.Always)
|
case class Set(op1: Dest, condition: Cond = Cond.Always)
|
||||||
extends Operation(s"set${condition.toString}", op1)
|
extends Operation(s"set${condition.toString}", op1)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user