[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