import type { Loc } from "./loc"
|
|
import type { AbsInsn2, AbsInsn3, Operand } from "./insn"
|
|
|
|
export const prettyPrintBlock = <A extends AbsInsn2 | AbsInsn3>(block: Array<A>): string => {
|
|
return block.map(prettyPrintInsn).join("\n")
|
|
}
|
|
|
|
export const prettyPrintInsn = (ssa: AbsInsn2 | AbsInsn3): 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
|
|
}
|