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 = ""
|
|
|
|
switch (ssa.type) {
|
|
case 'copy':
|
|
output = `${ppLoc(ssa.dest)} = ${ppOp(ssa.source)}`
|
|
break
|
|
case 'unary':
|
|
output = `${ppLoc(ssa.dest)} = ${ssa.op}(${ppOp(ssa.source)})`
|
|
break
|
|
case 'binary':
|
|
output = `${ppLoc(ssa.dest)} = ${ssa.op}(${ppOp(ssa.source)}, ${ppOp(ssa.source1)})`
|
|
break
|
|
}
|
|
|
|
return output
|
|
}
|
|
|
|
const ppOp = (op: Operand): string =>
|
|
typeof op === "number"
|
|
? op.toString()
|
|
: ppLoc(op)
|
|
|
|
const ppLoc = (loc: Loc): string => ({
|
|
'register': `%${loc.name}`,
|
|
'temporary': `#${loc.name}`,
|
|
'variable': loc.name,
|
|
}[loc.type])
|