-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.py
More file actions
103 lines (89 loc) · 3.19 KB
/
utils.py
File metadata and controls
103 lines (89 loc) · 3.19 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from antlr4 import *
import llvmlite.ir as ir
def is_int(llvm_num):
return llvm_num['type'] in [ir.IntType(64), ir.IntType(32), ir.IntType(16), ir.IntType(8), ir.IntType(1)]
def int_convert(src, target, builder):
if target['type'].width >= src['type'].width:
if src['type'].width == 1:
return_value = builder.zext(src['value'], target['type'])
return {
'type': target['type'],
'signed': src['signed'],
'value': return_value
}
else:
if src['signed']:
return_value = builder.sext(src['value'], target['type'])
else:
return_value = builder.zext(src['value'], target['type'])
return {
'type': target['type'],
'signed': src['signed'],
'value': return_value
}
else:
return_value = builder.trunc(src['value'], target['type'])
expression = {
'type': target['type'],
'signed': src['signed'],
'value': return_value
}
return expression
def int_to_double(llvm_num, builder):
if llvm_num['signed']:
return_value = builder.sitofp(llvm_num['value'], ir.DoubleType())
else:
return_value = builder.uitofp(llvm_num['value'], ir.DoubleType())
return {
'type': ir.DoubleType(),
'value': return_value
}
def double_to_int(llvm_num, target, builder):
if llvm_num['signed']:
return_value = builder.fptosi(llvm_num['value'], target['type'])
else:
return_value = builder.fptoui(llvm_num['value'], target['type'])
return {
'type': target['type'],
'value': return_value
}
def to_bool(llvm_num, builder):
if llvm_num['type'] == ir.DoubleType():
return_value = builder.fcmp_ordered('!=', llvm_num['value'], ir.Constant(ir.IntType(1), 0))
else:
return_value = builder.icmp_signed('!=', llvm_num['value'], ir.Constant(ir.IntType(1), 0))
expression = {
'type': ir.IntType(1),
'signed': True,
'value': return_value
}
return expression
def assign_type_convert(left, right, builder):
if left['type'] == right['type']:
pass
else:
if is_int(left) and is_int(right):
right = int_convert(right, left, builder)
elif is_int(left) and is_int(right) is False:
right = double_to_int(right, left, builder)
elif is_int(left) is False and is_int(right):
right = int_to_double(right, builder)
else:
pass
return right
def expr_type_convert(left, right, builder):
if left['type'] == right['type']:
pass
else:
if is_int(left) and is_int(right):
if left['type'].width < right['type'].width:
left = int_convert(left, right, builder)
else:
right = int_convert(right, left, builder)
elif is_int(left) and right['type'] == ir.DoubleType():
left = int_to_double(left, builder)
elif left['type'] == ir.DoubleType() and is_int(right):
right = int_to_double(right, builder)
else:
pass
return left, right