[pypy-commit] pypy ppc-jit-backend-rpythonization: A branch to make ppc jit rpython, readd rassembler

fijal noreply at buildbot.pypy.org
Mon Feb 6 20:39:22 CET 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: ppc-jit-backend-rpythonization
Changeset: r52145:135d4fd0b053
Date: 2012-02-06 21:36 +0200
http://bitbucket.org/pypy/pypy/changeset/135d4fd0b053/

Log:	A branch to make ppc jit rpython, readd rassembler

diff --git a/pypy/jit/backend/ppc/ppcgen/rassemblermaker.py b/pypy/jit/backend/ppc/ppcgen/rassemblermaker.py
new file mode 100644
--- /dev/null
+++ b/pypy/jit/backend/ppc/ppcgen/rassemblermaker.py
@@ -0,0 +1,63 @@
+from pypy.tool.sourcetools import compile2
+from pypy.rlib.rarithmetic import r_uint
+from pypy.jit.backend.ppc.ppcgen.form import IDesc, IDupDesc
+
+##     "opcode": ( 0,  5),
+##     "rA":     (11, 15, 'unsigned', regname._R),
+##     "rB":     (16, 20, 'unsigned', regname._R),
+##     "Rc":     (31, 31),
+##     "rD":     ( 6, 10, 'unsigned', regname._R),
+##     "OE":     (21, 21),
+##     "XO2":    (22, 30),
+
+## XO = Form("rD", "rA", "rB", "OE", "XO2", "Rc")
+
+##     add   = XO(31, XO2=266, OE=0, Rc=0)
+
+##     def add(rD, rA, rB):
+##         v = 0
+##         v |= (31&(2**(5-0+1)-1)) << (32-5-1)
+##         ...
+##         return v
+
+def make_func(name, desc):
+    sig = []
+    fieldvalues = []
+    for field in desc.fields:
+        if field in desc.specializations:
+            fieldvalues.append((field, desc.specializations[field]))
+        else:
+            sig.append(field.name)
+            fieldvalues.append((field, field.name))
+    if isinstance(desc, IDupDesc):
+        for destfield, srcfield in desc.dupfields.iteritems():
+            fieldvalues.append((destfield, srcfield.name))
+    body = ['v = r_uint(0)']
+    assert 'v' not in sig # that wouldn't be funny
+    #body.append('print %r'%name + ', ' + ', '.join(["'%s:', %s"%(s, s) for s in sig]))
+    for field, value in fieldvalues:
+        if field.name == 'spr':
+            body.append('spr = (%s&31) << 5 | (%s >> 5 & 31)'%(value, value))
+            value = 'spr'
+        body.append('v |= (%3s & r_uint(%#05x)) << %d'%(value,
+                                           field.mask,
+                                           (32 - field.right - 1)))
+    body.append('self.emit(v)')
+    src = 'def %s(self, %s):\n    %s'%(name, ', '.join(sig), '\n    '.join(body))
+    d = {'r_uint':r_uint}
+    #print src
+    exec compile2(src) in d
+    return d[name]
+
+def make_rassembler(cls):
+    bases = [make_rassembler(b) for b in cls.__bases__]
+    ns = {}
+    for k, v in cls.__dict__.iteritems():
+        if isinstance(v, IDesc):
+            v = make_func(k, v)
+        ns[k] = v
+    rcls = type('R' + cls.__name__, tuple(bases), ns)
+    def emit(self, value):
+        self.insts.append(value)
+    rcls.emit = emit
+    return rcls


More information about the pypy-commit mailing list