[pypy-svn] r18442 - pypy/dist/pypy/translator/asm
mwh at codespeak.net
mwh at codespeak.net
Wed Oct 12 10:32:31 CEST 2005
Author: mwh
Date: Wed Oct 12 10:32:29 2005
New Revision: 18442
Modified:
pypy/dist/pypy/translator/asm/genasm.py
pypy/dist/pypy/translator/asm/infregmachine.py
Log:
change Instruction a bit; integer arguments are still integers
but immediate arguments are stored as Constant(immed) which
allows a more consistent way of determining which registers are
used by a register, etc.
Modified: pypy/dist/pypy/translator/asm/genasm.py
==============================================================================
--- pypy/dist/pypy/translator/asm/genasm.py (original)
+++ pypy/dist/pypy/translator/asm/genasm.py Wed Oct 12 10:32:29 2005
@@ -49,7 +49,7 @@
g = FuncGenerator(graph)
g.gencode()
# g.assembler.dump()
- finreg = g.assembler.allocate_registers(30)
+# finreg = g.assembler.allocate_registers(5)
return make_func(finreg.assemble(), 'i', 'i'*len(graph.startblock.inputargs))
@@ -71,7 +71,7 @@
self.assembler = infregmachine.Assembler()
for i, var in enumerate(graph.startblock.inputargs):
- self.emit('LIA', self.reg(var), i)
+ self.emit('LIA', self.reg(var), Constant(i))
def assign_register(self, var):
assert var not in self._var2reg
@@ -85,7 +85,7 @@
if isinstance(var, Constant):
r = self.next_register
assert isinstance(var.value, int)
- self.assembler.emit("LOAD", r, var.value)
+ self.assembler.emit("LOAD", r, var)
self.next_register += 1
return r
elif isinstance(var, Variable):
Modified: pypy/dist/pypy/translator/asm/infregmachine.py
==============================================================================
--- pypy/dist/pypy/translator/asm/infregmachine.py (original)
+++ pypy/dist/pypy/translator/asm/infregmachine.py Wed Oct 12 10:32:29 2005
@@ -1,3 +1,4 @@
+from pypy.translator.asm import regalloc
class Instruction(object):
@@ -6,12 +7,15 @@
self.arguments = arguments
def registers_used(self):
- if self.name == 'LIA' or self.name == 'LOAD':
- return [self.arguments[0]]
- elif self.name in ('JT', 'JF', 'J'):
- return []
- else:
- return list(self.arguments)
+ return [a for a in self.arguments if isinstance(a, int)]
+
+ def renumber(self, regmap):
+ def _(a):
+ if isinstance(a, int) and a in regmap:
+ return regmap[a]
+ else:
+ return a
+ return Instruction(self.name, map(_, self.arguments))
def __repr__(self):
if self.name == 'LIA':
@@ -20,10 +24,15 @@
elif self.name in ('JT', 'JF', 'J'):
args = self.arguments[0]
elif self.name == 'LOAD':
- args = 'r%s, %s'%tuple(self.arguments)
+ args = 'r%s, #%s'%tuple(self.arguments)
else:
- args = ', '.join(['r%s'%a for a in self.arguments])
- return ' %-10s %s'%(self.name, args)
+ def c(x):
+ if isinstance(x, int):
+ return 'r%s'%x
+ else:
+ return str(x)
+ args = ', '.join(map(c, self.arguments))
+ return '%-30s'%(' %-10s %s'%(self.name, args),)
class Assembler(object):
def __init__(self):
@@ -43,10 +52,11 @@
def allocate_registers(self, nregisters):
r = FiniteRegisterAssembler(nregisters)
- for i in self.instructions:
- if not isinstance(i, str): # labels
- assert max(i.registers_used() + [0]) < nregisters
- r.instructions.append(i)
+ r.instructions = regalloc.regalloc(self.instructions, nregisters)
+# for i in r.instructions:
+# if not isinstance(i, str): # labels
+# assert max(i.registers_used() + [0]) < nregisters
+ r.dump()
return r
class FiniteRegisterAssembler(Assembler):
@@ -68,9 +78,10 @@
return A
def LIA(self, A, dest, argindex):
- assert dest + 2 == argindex + 3
+ assert dest + 2 == argindex.value + 3
def LOAD(self, A, dest, value):
+ value = value.value
assert isinstance(value, int)
assert -30000 < value < 30000
A.li(dest + 2, value)
@@ -104,3 +115,8 @@
def MOV(self, A, dest, src):
A.mr(dest + 2, src + 2)
+
+ def EXCH(self, A, a, b):
+ A.xor(a, a, b)
+ A.xor(b, b, a)
+ A.xor(a, a, b)
More information about the Pypy-commit
mailing list