[pypy-commit] pypy ppc-jit-backend: Adopted gen_descr_encoding from ARM backend and applied

hager noreply at buildbot.pypy.org
Fri Sep 30 18:44:38 CEST 2011


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r47721:72bc90d0a73b
Date: 2011-09-30 18:44 +0200
http://bitbucket.org/pypy/pypy/changeset/72bc90d0a73b/

Log:	Adopted gen_descr_encoding from ARM backend and applied fix to a
	problem that occured when allocating memory for guard encodings.

diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -282,6 +282,60 @@
         looptoken.ppc_code = loop_start + start_pos
         self._teardown()
 
+    # For an explanation of the encoding, see
+    # backend/arm/assembler.py
+    def gen_descr_encoding(self, descr, args, arglocs):
+        minsize = (len(arglocs) - 1) * 6 + 5
+        memsize = self.align(minsize)
+        memaddr = self.datablockwrapper.malloc_aligned(memsize, alignment=1)
+        mem = rffi.cast(rffi.CArrayPtr(lltype.Char), memaddr)
+        i = 0
+        j = 0
+        while i < len(args):
+            if arglocs[i+1]:
+                arg = args[i]
+                loc = arglocs[i+1]
+                if arg.type == INT:
+                    mem[j] = self.INT_TYPE
+                    j += 1
+                elif arg.type == REF:
+                    mem[j] = self.REF_TYPE
+                    j += 1
+                elif arg.type == FLOAT:
+                    mem[j] = self.FLOAT_TYPE
+                    j += 1
+                else:
+                    assert 0, 'unknown type'
+
+                if loc.is_reg() or loc.is_vfp_reg():
+                    mem[j] = chr(loc.value)
+                    j += 1
+                elif loc.is_imm() or loc.is_imm_float():
+                    assert (arg.type == INT or arg.type == REF
+                                or arg.type == FLOAT)
+                    mem[j] = self.IMM_LOC
+                    encode32(mem, j+1, loc.getint())
+                    j += 5
+                else:
+                    mem[j] = self.STACK_LOC
+                    encode32(mem, j+1, loc.position)
+                    j += 5
+            else:
+                mem[j] = self.EMPTY_LOC
+                j += 1
+            i += 1
+
+        mem[j] = chr(0xFF)
+
+        n = self.cpu.get_fail_descr_number(descr)
+        encode32(mem, j+1, n)
+        return memaddr
+
+    def align(self, size):
+        while size % 8 != 0:
+            size += 1
+        return size
+
     def _teardown(self):
         self.patch_list = None
         self.pending_guards = None


More information about the pypy-commit mailing list