@@ -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