From e209e62bf26640915f6a7b4095fd9bfa89a7cc43 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Sun, 27 Nov 2011 22:27:11 +0000 Subject: Use Registers for finding next free register in parseBinaryOp --- pp2cc.py | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) (limited to 'pp2cc.py') diff --git a/pp2cc.py b/pp2cc.py index a73189d..a3597aa 100755 --- a/pp2cc.py +++ b/pp2cc.py @@ -34,14 +34,24 @@ class Registers(object): self.registers = {} for reg in range(0, 8): self.registers[str(reg)] = False - def alloc(self): + def alloc(self, register=None): """Retrieves a register which is marked unused and marks it as in use""" + # if a register was explicitly requested + if register: + if not self.is_register(register): + raise RuntimeError("'{}' is not a register".format(register)) + register = register[1] + if self.registers[register]: + raise RuntimeError("Register 'R{}' is already in use".format(register)) for register in range(0, 6): + register = str(register) # find a free register if not self.registers[register]: - self.registers[register] = True - return "R" + register - raise RuntimeError("No free registers are available") + break + else: + raise RuntimeError("No free registers are available") + self.registers[register] = True + return "R" + register def free(self, register): """Marks a register as unused @@ -51,7 +61,7 @@ class Registers(object): """ # remove leading R register = register[1:] - if self.registers[register]: + if register in self.registers: self.registers[register] = False; else: raise RuntimeError("free() of unused register") @@ -68,10 +78,13 @@ class Registers(object): # retieve the first element before the next space, e.g. R0 text = text.lstrip(" ").split(" ", 1)[0] # is it a register? - if len(text) == 2 and text[0] == "R" and text[1] in self.registers: + if self.is_register(text): return text # out of luck return None + def is_register(self, text): + """Returns True if text is a register, false otherwise""" + return len(text) == 2 and text[0] == "R" and text[1] in self.registers def get_instruction(self, text): """Retrieve the instruction from text skipping labels and comments""" text = text.strip() @@ -478,11 +491,12 @@ class Parse(object): operand = reg_second # since we use the stack for calculations, we can use less - # registers: R0 and R1 - if reg_second == "R0": - reg_first = "R1" - else: - reg_first = "R0" + # registers (2). Use the Registers class for determining the next + # free register + self.registers.alloc(reg_second) + reg_first = self.registers.alloc() + self.registers.free(reg_second) + self.registers.free(reg_first) # put the data back in the free register lines.append(self.asm.pull(reg_first)) -- cgit v1.2.1