This repository has been archived by the owner on Oct 8, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
irdump.cc
67 lines (57 loc) · 1.67 KB
/
irdump.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "ir.h"
using namespace std;
using namespace IR;
void dump_type(Type type, ostream &o) {
switch(type) {
case TYPE_VOID: break;
case TYPE_U1: o << "(u1)"; break;
case TYPE_S1: o << "(s1)"; break;
case TYPE_U2: o << "(u2)"; break;
case TYPE_S2: o << "(s2)"; break;
}
}
void dump_opcode(Opcode opcode, ostream &o) {
switch(opcode) {
case OP_NOP: o << "nop "; break;
case OP_MOVE: o << "mov "; break;
case OP_LOADIMM: o << "ldi "; break;
case OP_LOAD: o << "ld "; break;
case OP_STORE: o << "str "; break;
case OP_ADD: o << "add "; break;
case OP_SUB: o << "sub "; break;
case OP_MULT: o << "mlt "; break;
case OP_DIV: o << "div "; break;
case OP_RET: o << "ret "; break;
case OP_CALL: o << "br "; break;
}
}
void Inst::dump(std::ostream &o) {
if(rdst != 0)
o << "#" << rdst << " = ";
else if(ldst != "")
o << ldst << " = ";
dump_opcode(opcode, o);
dump_type(type, o);
if(rsrc1 != 0)
o << " #" << rsrc1;
else if(lsrc != "")
o << " " << lsrc;
else if(rdst != 0)
o << " " << vsrc;
if(rsrc2 != 0)
o << " #" << rsrc2;
}
void Prog::dump(ostream &o) {
for(BlockList::iterator it = bl.begin(); it != bl.end(); it++) {
(*it)->dump(o);
o << endl;
}
}
void Block::dump(ostream &o) {
o << label << ":" << endl;
for(InstList::iterator it = il.begin(); it != il.end(); it++) {
o << "\t";
(*it)->dump(o);
o << endl;
}
}