summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wu <lekensteyn@gmail.com>2011-11-27 22:27:11 +0000
committerPeter Wu <lekensteyn@gmail.com>2011-11-27 22:27:11 +0000
commite209e62bf26640915f6a7b4095fd9bfa89a7cc43 (patch)
tree42b0d693081717436c12f04bc2471a952159fdc8
parent6dec4a159db1687d3e70dccc8c0dd2ee570cb2b5 (diff)
downloadpp2cc-e209e62bf26640915f6a7b4095fd9bfa89a7cc43.tar.gz
Use Registers for finding next free register in parseBinaryOp
-rwxr-xr-xpp2cc.py36
1 files changed, 25 insertions, 11 deletions
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))