import type { Loc } from "./loc" import type { Operand, SSA, SSAWithBinary } from "./ssa" export const prettyPrintBlock = (block: Array): string => { return block.map(prettyPrintSSA).join("\n") } export const prettyPrintSSA = (ssa: SSAWithBinary): string => { let output = "" if ("source1" in ssa) { output = `${ppLoc(ssa.dest)} = ${ssa.op}(${ppOp(ssa.source)}, ${ppOp(ssa.source1)})` } else if ("op" in ssa) { output = `${ppLoc(ssa.dest)} = ${ssa.op}(${ppOp(ssa.source)})` } else { output = `${ppLoc(ssa.dest)} = ${ppOp(ssa.source)}` } return output } const ppOp = (op: Operand): string => typeof op === "number" ? op.toString() : ppLoc(op) const ppLoc = (loc: Loc): string => { let output = '' switch (loc.type) { case "register": output = `%${loc.name}` break case "temporary": output = `#${loc.name}` break case "variable": output = loc.name break } return output }