Line | Branch | Exec | Source |
---|---|---|---|
1 | #include "gwion_util.h" | ||
2 | #include "gwion_ast.h" | ||
3 | #include "gwion_env.h" | ||
4 | #include "vm.h" | ||
5 | #include "gwion.h" | ||
6 | #include "instr.h" | ||
7 | #include "emit.h" | ||
8 | |||
9 | enum Kind { KIND_INT, KIND_FLOAT, KIND_OTHER, KIND_ADDR, KIND_END }; | ||
10 | |||
11 | 1551 | static inline enum Kind kindof(const m_uint size, const uint emit_var) { | |
12 |
2/2✓ Branch 0 taken 382 times.
✓ Branch 1 taken 1169 times.
|
1551 | if (emit_var) return KIND_ADDR; |
13 |
4/4✓ Branch 0 taken 295 times.
✓ Branch 1 taken 874 times.
✓ Branch 2 taken 294 times.
✓ Branch 3 taken 1 times.
|
1169 | return size == SZ_INT ? KIND_INT : size == SZ_FLOAT ? KIND_FLOAT : KIND_OTHER; |
14 | } | ||
15 | |||
16 | 1551 | ANN Instr emit_kind(Emitter emit, const m_uint val, const m_uint size, const bool addr, | |
17 | const f_instr func[]) { | ||
18 | 1551 | const enum Kind kind = kindof(size, addr); | |
19 | 1551 | const Instr instr = emit_add_instr(emit, func[kind]); | |
20 | 1551 | instr->m_val = val; | |
21 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1550 times.
|
1551 | if(kind == KIND_OTHER) instr->m_val2 = size; |
22 | 1551 | return instr; | |
23 | } | ||
24 | |||
25 | static const f_instr regpushimm[KIND_END] = {RegPushImm, RegPushImm2, | ||
26 | RegPushImm3, RegPushImm4}; | ||
27 | |||
28 | static const f_instr regpushmem[KIND_END] = {RegPushMem, RegPushMem2, | ||
29 | RegPushMem3, RegPushMem4}; | ||
30 | |||
31 | static const f_instr regpushbase[KIND_END] = {RegPushBase, RegPushBase2, | ||
32 | RegPushBase3, RegPushBase4}; | ||
33 | |||
34 | static const f_instr dotstatic[KIND_END] = {DotStatic, DotStatic2, DotStatic3, | ||
35 | RegPushImm}; | ||
36 | |||
37 | static const f_instr dotmember[KIND_END] = {DotMember, DotMember2, DotMember3, | ||
38 | DotMember4}; | ||
39 | |||
40 | static const f_instr structmember[KIND_END] = { | ||
41 | StructMember, StructMemberFloat, StructMemberOther, StructMemberAddr}; | ||
42 | |||
43 | static const f_instr unionmember[KIND_END] = {UnionMember, UnionMember2, | ||
44 | UnionMember3, UnionMember4}; | ||
45 | |||
46 | // function factory | ||
47 | #define kind_func(name) \ | ||
48 | ANN Instr emit_##name(Emitter emit, const m_uint val, const m_uint size, const bool addr) { \ | ||
49 | return emit_kind(emit, val, size, addr, name); \ | ||
50 | } | ||
51 | |||
52 | 124 | kind_func(regpushimm); | |
53 | 383 | kind_func(regpushmem); | |
54 | 350 | kind_func(regpushbase); | |
55 | 59 | kind_func(dotstatic); | |
56 | 88 | kind_func(dotmember); | |
57 | 72 | kind_func(structmember); | |
58 | 8 | kind_func(unionmember); | |
59 |