-
Notifications
You must be signed in to change notification settings - Fork 0
/
constants.py
79 lines (58 loc) · 2.04 KB
/
constants.py
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
import x86ir as x86
import extendedast as ext
from extendedast import BuiltinFunction
DEBUG_WITHOUT_EXPLICATE = False
BUILTIN_FUNCS = {
'print': BuiltinFunction('print_any', returns=False),
'input': BuiltinFunction('input_int', returns=True),
'len': BuiltinFunction('list_size', returns=True),
'__add': BuiltinFunction('add', returns=True),
'__is_true': BuiltinFunction('is_true', returns=True),
'__equal': BuiltinFunction('equal', returns=True),
'__not_equal': BuiltinFunction('not_equal', returns=True),
'__create_list': BuiltinFunction('create_list', returns=True),
'__create_dict': BuiltinFunction('create_dict', returns=True),
'__get_subscript': BuiltinFunction('get_subscript', returns=True),
'__set_subscript': BuiltinFunction('set_subscript', returns=True),
'__create_closure': BuiltinFunction('create_closure', returns=True),
'__get_fun_ptr': BuiltinFunction('get_fun_ptr', returns=True),
'__get_free_vars': BuiltinFunction('get_free_vars', returns=True),
'__get_nparams': BuiltinFunction('get_nparams', returns=True),
'__is_variadic': BuiltinFunction('is_variadic', returns=True),
'__abort': BuiltinFunction('abort', returns=False)
}
TAG_MASK = 0b11
TAG_SHIFT = 2 # bits
T_INT = 0b00
T_BOOL = 0b01
T_BIG = 0b11
AST_TAG_MASK = ext.Const(TAG_MASK)
AST_TAG_SHIFT = ext.Const(TAG_SHIFT)
AST_T_INT = ext.Const(T_INT)
AST_T_BOOL = ext.Const(T_BOOL)
AST_T_BIG = ext.Const(T_BIG)
AST_CONST_0 = ext.Tag(ext.Const(0), T_INT)
def ConstInt(n):
return ext.Const((n << 2) | T_INT)
def ConstBool(n):
return ext.Const((n << 2) | T_BOOL)
CSAVE_REGS = set(ext.Reg(r) for r in ("eax", "ecx", "edx")) # caller save
REGS = [ext.Reg(r) for r in ("eax", "ebx", "ecx", "edx", "esi", "edi")]
CALLEE_SAVE_REGS = list(set(REGS) - CSAVE_REGS)
N_REGS = N_REGS_32 = len(REGS)
N_REGS_8 = 4
INSTANTIATING_INSTRUCTIONS = (
x86.Mov,
*x86.CmpResult.comparators,
x86.Pop
)
MODIFYING_INSTRUCTIONS = (
x86.Add,
x86.Sub,
x86.Neg,
x86.Sar,
x86.Sal,
x86.And,
x86.Or,
x86.Xor
)