\section{Printing SUIFvm code}

Recall that class [[Printer]] provides the specifics for printing
machine code in the correct assembly-language form for a particular
architecture.  For the SUIFvm architecture, there is no well-defined
ASCII assembly form, but printing code in this style is often helpful
for debugging.  When creating a [[Printer]] subclass for a real target,
you should not use [[PrinterSuifVm]] as a model.  Use the [[Printer]]
object in the Alpha library, for example, as a guide.

<<class [[PrinterSuifVm]]>>=
class PrinterSuifVm : public Printer {
  protected:
    virtual void print_instr_alm(Instr*);
    virtual void print_instr_cti(Instr*);
    virtual void print_instr_dot(Instr*);
    virtual void print_instr_label(Instr*);
    virtual void print_instr_user_defd(Instr*) { }

    virtual void print_opcode(Instr*);
    virtual void print_sym_disp(Opnd addr_sym, Opnd disp);
    virtual void print_address_exp(Opnd addr_exp);

    virtual char* size_directive(TypeId);
    virtual void process_value_block(ValueBlock*);

    // local variables used in print_var_def and its helpers
    char *cur_directive;
    int cur_opnd_cnt;

  public:
    PrinterSuifVm();

    virtual void start_comment() { fprintf(out, "\t# "); }

    virtual void print_instr(Instr*);
    virtual void print_opnd(Opnd);

    virtual void print_extern_decl(VarSym*);
    virtual void print_file_decl(int fnum, IdString fnam);
    virtual void print_var_def(VarSym*);

    virtual void print_global_decl(FileBlock*);
    virtual void print_proc_begin(ProcDef*);
    virtual void print_proc_decl(ProcSym*) { }
    virtual void print_proc_entry(ProcDef*, int file_no_for_1st_line);
    virtual void print_proc_end(ProcDef*);
};
@


<<printer.h>>=
/* file "suifvm/printer.h" */

<<Machine-SUIF copyright>>

#ifndef SUIFVM_PRINTER_H
#define SUIFVM_PRINTER_H

#include <machine/copyright.h>

#ifndef SUPPRESS_PRAGMA_INTERFACE
#pragma interface "suifvm/printer.h"
#endif

#include <machine/machine.h>

<<class [[PrinterSuifVm]]>>

#endif /* SUIFVM_PRINTER_H */
@
