Skip to content

Commit d202d58

Browse files
committed
64 bit arithmetic in the interpreters
1 parent cfb3ae3 commit d202d58

File tree

4 files changed

+38
-1499
lines changed

4 files changed

+38
-1499
lines changed

interp_Lint.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
from ast import *
2-
from utils import input_int
2+
from utils import input_int, add64, sub64, neg64
33

44
def interp_exp(e):
55
match e:
66
case BinOp(left, Add(), right):
77
l = interp_exp(left); r = interp_exp(right)
8-
return l + r
8+
return add64(l, r)
99
case BinOp(left, Sub(), right):
1010
l = interp_exp(left); r = interp_exp(right)
11-
return l - r
11+
return sub64(l, r)
1212
case UnaryOp(USub(), v):
13-
return - interp_exp(v)
13+
return neg64(interp_exp(v))
1414
case Constant(value):
1515
return value
1616
case Call(Name('input_int'), []):
17-
return int(input())
17+
return input_int()
1818
case _:
1919
raise Exception('error in interp_exp, unexpected ' + repr(e))
2020

@@ -37,16 +37,16 @@ def interp_exp(self, e, env):
3737
match e:
3838
case BinOp(left, Add(), right):
3939
l = self.interp_exp(left, env); r = self.interp_exp(right, env)
40-
return l + r
40+
return add64(l, r)
4141
case BinOp(left, Sub(), right):
4242
l = self.interp_exp(left, env); r = self.interp_exp(right, env)
43-
return l - r
43+
return sub64(l, r)
4444
case UnaryOp(USub(), v):
45-
return - self.interp_exp(v, env)
45+
return neg64(self.interp_exp(v, env))
4646
case Constant(value):
4747
return value
4848
case Call(Name('input_int'), []):
49-
return int(input())
49+
return input_int()
5050
case _:
5151
raise Exception('error in interp_exp, unexpected ' + repr(e))
5252

interp_x86/convert_x86.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99

1010

1111
def convert_int(value):
12-
if value >= 0:
13-
return Tree("int_a", [value])
14-
else:
15-
return Tree("neg_a", [Tree("int_a", [-value])])
12+
return Tree("int_a", [value])
13+
# if value >= 0:
14+
# return Tree("int_a", [value])
15+
# else:
16+
# return Tree("neg_a", [Tree("int_a", [-value])])
1617

1718
def convert_arg(arg):
1819
match arg:

interp_x86/eval_x86.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,16 @@ def print_mem(self, mem):
150150

151151
def eval_imm(self, e) -> int:
152152
if e.data == 'int_a':
153-
return int(e.children[0])
154-
elif e.data == 'neg_a':
155-
return -self.eval_imm(e.children[0])
153+
v = int(e.children[0])
154+
if is_int64(v):
155+
return v
156+
else:
157+
raise Exception('eval_imm: invalid immediate:', v)
158+
159+
# if e.data == 'int_a':
160+
# return int(e.children[0])
161+
# elif e.data == 'neg_a':
162+
# return -self.eval_imm(e.children[0])
156163
else:
157164
raise Exception('eval_imm: unknown immediate:', e)
158165

@@ -162,12 +169,17 @@ def eval_arg(self, a):
162169
return self.registers[str(a.children[0])]
163170
elif a.data == 'var_a':
164171
return self.variables[str(a.children[0])]
165-
elif a.data == 'int_a' or a.data == 'neg_a':
172+
# elif a.data == 'int_a' or a.data == 'neg_a':
173+
# return self.eval_imm(a)
174+
elif a.data == 'int_a':
166175
return self.eval_imm(a)
176+
elif a.data == 'neg_a':
177+
return neg64(self.eval_imm(a.children[0]))
167178
elif a.data == 'mem_a':
168179
offset, reg = a.children
169180
addr = self.registers[reg]
170-
offset_addr = addr + self.eval_imm(offset)
181+
offset_addr = add64(addr,self.eval_imm(offset))
182+
# offset_addr = addr + self.eval_imm(offset)
171183
return self.memory[offset_addr]
172184
elif a.data == 'global_val_a':
173185
loc, reg = a.children
@@ -184,7 +196,8 @@ def store_arg(self, a, v):
184196
elif a.data == 'mem_a':
185197
offset, reg = a.children
186198
addr = self.registers[reg]
187-
offset_addr = addr + self.eval_imm(offset)
199+
#offset_addr = addr + self.eval_imm(offset)
200+
offset_addr = add64(addr,self.eval_imm(offset))
188201
self.memory[offset_addr] = v
189202
elif a.data == 'direct_mem_a':
190203
reg = a.children[0]
@@ -227,24 +240,24 @@ def eval_instrs(self, instrs, blocks, output):
227240
a1, a2 = instr.children
228241
v1 = self.eval_arg(a1)
229242
v2 = self.eval_arg(a2)
230-
self.store_arg(a2, v1 + v2)
243+
self.store_arg(a2, add64(v1, v2))
231244

232245
elif instr.data == 'subq':
233246
a1, a2 = instr.children
234247
v1 = self.eval_arg(a1)
235248
v2 = self.eval_arg(a2)
236-
self.store_arg(a2, v2 - v1)
249+
self.store_arg(a2, sub64(v2, v1))
237250

238251
elif instr.data == 'xorq':
239252
a1, a2 = instr.children
240253
v1 = self.eval_arg(a1)
241254
v2 = self.eval_arg(a2)
242-
self.store_arg(a2, v1 ^ v2)
255+
self.store_arg(a2, xor64(v1, v2))
243256

244257
elif instr.data == 'negq':
245258
a1 = instr.children[0]
246259
v1 = self.eval_arg(a1)
247-
self.store_arg(a1, (- v1))
260+
self.store_arg(a1, neg64(v1))
248261

249262
elif instr.data in ['jmp', 'je', 'jne', 'jl', 'jle', 'jg', 'jge']:
250263
target = str(instr.children[0])
@@ -307,7 +320,7 @@ def eval_instrs(self, instrs, blocks, output):
307320
print(self.print_state())
308321

309322
elif target == label_name('read_int'):
310-
self.registers['rax'] = int(input())
323+
self.registers['rax'] = input_int()
311324
self.log(f'CALL TO read_int: {self.registers["rax"]}')
312325
if self.logging:
313326
print(self.print_state())

0 commit comments

Comments
 (0)