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
68
69
70
71
72
73
74
75
76
77
78
79
80
|
import "cffc.hff";
struct IRCtx {
alloc *Allocator,
}
struct IRInst;
struct IRFn {
body *IRInst
}
struct IRValue {
ty *const Type,
u enum union {
IImm i64,
FImm f64,
SImm [#]const u8,
BImm bool,
Null,
Tmp int,
Local *Decl,
Global *Decl,
}
}
enum union IRArg {
Val IRValue,
Ty *const Type,
Fn *Decl,
}
enum IRInstT {
nop,
neg,
not,
compl,
fneg,
add,
sub,
mul,
div,
mod,
band,
bor,
xor,
lsl,
lsr,
asr,
fadd,
fsub,
fmul,
fdiv,
eq,
neq,
lt,
lteq,
ftrunc,
itof,
getelem,
pgetelem,
copy,
setvar,
load,
store,
call,
b,
beqz,
ret0,
ret,
}
struct IRInst {
t IRInstT,
next *IRInst,
branch *IRInst,
call_nargs int,
args [0]IRArg,
}
extern fn irdump(*IRInst) void;
|