[pypy-commit] pypy ppc-jit-backend: Started implementation of NEW, first test passes

hager noreply at buildbot.pypy.org
Tue Nov 15 15:01:07 CET 2011


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r49436:dd67675a28a9
Date: 2011-11-15 15:00 +0100
http://bitbucket.org/pypy/pypy/changeset/dd67675a28a9/

Log:	Started implementation of NEW, first test passes

diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py b/pypy/jit/backend/ppc/ppcgen/opassembler.py
--- a/pypy/jit/backend/ppc/ppcgen/opassembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py
@@ -606,6 +606,10 @@
         else:
             assert 0, itemsize.value
 
+    def emit_new(self, op, arglocs, regalloc):
+        # XXX do exception handling here!
+        pass
+
     def emit_same_as(self, op, arglocs, regalloc):
         argloc, resloc = arglocs
         self.regalloc_mov(argloc, resloc)
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
@@ -115,6 +115,7 @@
         self.fail_boxes_int = values_array(lltype.Signed, failargs_limit)
         self.fail_boxes_ptr = values_array(llmemory.GCREF, failargs_limit)
         self.mc = None
+        self.malloc_func_addr = 0
         self.datablockwrapper = None
         self.memcpy_addr = 0
         self.fail_boxes_count = 0
@@ -456,6 +457,10 @@
                                                         allblocks)
 
     def setup_once(self):
+        gc_ll_descr = self.cpu.gc_ll_descr
+        gc_ll_descr.initialize()
+        ll_new = gc_ll_descr.get_funcptr_for_new()
+        self.malloc_func_addr = rffi.cast(lltype.Signed, ll_new)
         self.memcpy_addr = self.cpu.cast_ptr_to_int(memcpy_fn)
         self.setup_failure_recovery()
         self.exit_code_adr = self._gen_exit_path()
@@ -857,6 +862,34 @@
             assert gcrootmap.is_shadow_stack
             gcrootmap.write_callshape(mark, force_index)
 
+    def write_new_force_index(self):
+        # for shadowstack only: get a new, unused force_index number and
+        # write it to FORCE_INDEX_OFS.  Used to record the call shape
+        # (i.e. where the GC pointers are in the stack) around a CALL
+        # instruction that doesn't already have a force_index.
+        gcrootmap = self.cpu.gc_ll_descr.gcrootmap
+        if gcrootmap and gcrootmap.is_shadow_stack:
+            clt = self.current_clt
+            force_index = clt.reserve_and_record_some_faildescr_index()
+            self._write_fail_index(force_index)
+            return force_index
+        else:
+            return 0
+
+    def _write_fail_index(self, fail_index):
+        self.mc.load_imm(r.r0.value, fail_index)
+        if IS_PPC_32:
+            self.mc.stw(r.r0.value, r.SSP.value, 0)
+        else:
+            self.mc.std(r.r0.value, r.SSP.value, 0)
+            
+    def load(self, loc, value):
+        assert loc.is_reg() and value.is_imm()
+        if value.is_imm():
+            self.mc.load_imm(loc, value.getint())
+        elif value.is_imm_float():
+            assert 0, "not implemented yet"
+
 def notimplemented_op(self, op, arglocs, regalloc):
     raise NotImplementedError, op
 
diff --git a/pypy/jit/backend/ppc/ppcgen/regalloc.py b/pypy/jit/backend/ppc/ppcgen/regalloc.py
--- a/pypy/jit/backend/ppc/ppcgen/regalloc.py
+++ b/pypy/jit/backend/ppc/ppcgen/regalloc.py
@@ -627,6 +627,17 @@
     prepare_cast_ptr_to_int = prepare_same_as
     prepare_cast_int_to_ptr = prepare_same_as
 
+    def prepare_new(self, op):
+        gc_ll_descr = self.assembler.cpu.gc_ll_descr
+        # XXX introduce the fastpath for malloc
+        arglocs = self._prepare_args_for_new_op(op.getdescr())
+        force_index = self.assembler.write_new_force_index()
+        self.assembler._emit_call(force_index, self.assembler.malloc_func_addr,
+                                arglocs, self, result=op.result)
+        self.possibly_free_vars(arglocs)
+        self.possibly_free_var(op.result)
+        return []
+
     def prepare_call(self, op):
         effectinfo = op.getdescr().get_extra_info()
         if effectinfo is not None:
@@ -641,6 +652,18 @@
     prepare_debug_merge_point = void
     prepare_jit_debug = void
 
+    def _prepare_args_for_new_op(self, new_args):
+        gc_ll_descr = self.cpu.gc_ll_descr
+        args = gc_ll_descr.args_for_new(new_args)
+        arglocs = []
+        for i in range(len(args)):
+            arg = args[i]
+            t = TempInt()
+            l = self.force_allocate_reg(t, selected_reg=r.MANAGED_REGS[i])
+            self.assembler.load(l, imm(arg))
+            arglocs.append(t)
+        return arglocs
+
     # from ../x86/regalloc.py:791
     def _unpack_fielddescr(self, fielddescr):
         assert isinstance(fielddescr, BaseFieldDescr)


More information about the pypy-commit mailing list