36 lines
1.1 KiB
Scala
36 lines
1.1 KiB
Scala
package wacc
|
|
|
|
object sizeExtensions {
|
|
import microWacc._
|
|
import types._
|
|
import assemblyIR.Size
|
|
|
|
extension (expr: Expr) {
|
|
|
|
/** Calculate the size (bytes) of the heap required for the expression. */
|
|
def heapSize: Int = (expr, expr.ty) match {
|
|
case (ArrayLiter(elems), KnownType.Array(KnownType.Char)) =>
|
|
KnownType.Int.size.toInt + elems.size.toInt * KnownType.Char.size.toInt
|
|
case (ArrayLiter(elems), ty) =>
|
|
KnownType.Int.size.toInt + elems.size * ty.elemSize.toInt
|
|
case _ => expr.ty.size.toInt
|
|
}
|
|
}
|
|
|
|
extension (ty: SemType) {
|
|
|
|
/** Calculate the size (bytes) of a type in a register. */
|
|
def size: Size = ty match {
|
|
case KnownType.Int => Size.D32
|
|
case KnownType.Bool | KnownType.Char => Size.B8
|
|
case KnownType.String | KnownType.Array(_) | KnownType.Pair(_, _) | ? => Size.Q64
|
|
}
|
|
|
|
def elemSize: Size = ty match {
|
|
case KnownType.Array(elem) => elem.size
|
|
case KnownType.Pair(_, _) => Size.Q64
|
|
case _ => ty.size
|
|
}
|
|
}
|
|
}
|