[pypy-commit] pypy ppc-jit-backend: Implemented NEW_ARRAY

hager noreply at buildbot.pypy.org
Tue Nov 15 19:02:35 CET 2011


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

Log:	Implemented NEW_ARRAY

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
@@ -12,7 +12,7 @@
 from pypy.jit.backend.ppc.ppcgen.jump import remap_frame_layout
 from pypy.jit.backend.ppc.ppcgen.regalloc import TempPtr
 from pypy.jit.backend.llsupport import symbolic
-from pypy.rpython.lltypesystem import rstr
+from pypy.rpython.lltypesystem import rstr, rffi, lltype
 
 NO_FORCE_INDEX = -1
 
@@ -610,6 +610,15 @@
         # XXX do exception handling here!
         pass
 
+    def emit_new_array(self, op, arglocs, regalloc):
+        # XXX handle memory errors
+        if len(arglocs) > 0:
+            value_loc, base_loc, ofs_length = arglocs
+            if IS_PPC_32:
+                self.mc.stw(value_loc.value, base_loc.value, ofs_length.value)
+            else:
+                self.mc.std(value_loc.value, base_loc.value, ofs_length.value)
+
     def emit_same_as(self, op, arglocs, regalloc):
         argloc, resloc = arglocs
         self.regalloc_mov(argloc, resloc)
@@ -771,3 +780,20 @@
 
     def nop(self):
         self.mc.ori(0, 0, 0)
+
+    # from: ../x86/regalloc.py:750
+    # called from regalloc
+    # XXX kill this function at some point
+    def _regalloc_malloc_varsize(self, size, size_box, vloc, vbox, ofs_items_loc, regalloc, result):
+        if IS_PPC_32:
+            self.mc.mullw(size.value, size.value, vloc.value)
+        else:
+            self.mc.mulld(size.value, size.value, vloc.value)
+        if ofs_items_loc.is_imm():
+            self.mc.addi(size.value, size.value, ofs_items_loc.value)
+        else:
+            self.mc.add(size.value, size.value, ofs_items_loc.value)
+        force_index = self.write_new_force_index()
+        regalloc.force_spill_var(vbox)
+        self._emit_call(force_index, self.malloc_func_addr, [size_box], regalloc,
+                                    result=result)
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
@@ -116,6 +116,7 @@
         self.fail_boxes_ptr = values_array(llmemory.GCREF, failargs_limit)
         self.mc = None
         self.malloc_func_addr = 0
+        self.malloc_array_func_addr = 0
         self.datablockwrapper = None
         self.memcpy_addr = 0
         self.fail_boxes_count = 0
@@ -462,6 +463,10 @@
         gc_ll_descr.initialize()
         ll_new = gc_ll_descr.get_funcptr_for_new()
         self.malloc_func_addr = rffi.cast(lltype.Signed, ll_new)
+        if gc_ll_descr.get_funcptr_for_newarray is not None:
+            ll_new_array = gc_ll_descr.get_funcptr_for_newarray()
+            self.malloc_array_func_addr = rffi.cast(lltype.Signed,
+                                                    ll_new_array)
         self.memcpy_addr = self.cpu.cast_ptr_to_int(memcpy_fn)
         self.setup_failure_recovery()
         self.exit_code_adr = self._gen_exit_path()
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
@@ -20,6 +20,7 @@
 from pypy.jit.backend.llsupport import symbolic
 from pypy.jit.codewriter.effectinfo import EffectInfo
 import pypy.jit.backend.ppc.ppcgen.register as r
+from pypy.jit.codewriter import heaptracker
 
 class TempInt(TempBox):
     type = INT
@@ -638,6 +639,27 @@
         self.possibly_free_var(op.result)
         return []
 
+    def prepare_new_array(self, op):
+        gc_ll_descr = self.cpu.gc_ll_descr
+        if gc_ll_descr.get_funcptr_for_newarray is not None:
+            # framework GC
+            box_num_elem = op.getarg(0)
+            if isinstance(box_num_elem, ConstInt):
+                num_elem = box_num_elem.value
+                # XXX implement fastpath for malloc
+            args = self.assembler.cpu.gc_ll_descr.args_for_new_array(
+                op.getdescr())
+            argboxes = [ConstInt(x) for x in args]
+            argboxes.append(box_num_elem)
+            force_index = self.assembler.write_new_force_index()
+            self.assembler._emit_call(force_index, self.assembler.malloc_array_func_addr,
+                                        argboxes, self, result=op.result)
+            return []
+        # boehm GC
+        itemsize, scale, basesize, ofs_length, _ = (
+            self._unpack_arraydescr(op.getdescr()))
+        return self._malloc_varsize(basesize, ofs_length, itemsize, op)
+
     def prepare_call(self, op):
         effectinfo = op.getdescr().get_extra_info()
         if effectinfo is not None:
@@ -664,6 +686,32 @@
             arglocs.append(t)
         return arglocs
 
+    def _malloc_varsize(self, ofs_items, ofs_length, itemsize, op):
+        v = op.getarg(0)
+        res_v = op.result
+        boxes = [v, res_v]
+        itemsize_box = ConstInt(itemsize)
+        ofs_items_box = ConstInt(ofs_items)
+        if _check_imm_arg(ofs_items_box):
+            ofs_items_loc = self.convert_to_imm(ofs_items_box)
+        else:
+            ofs_items_loc, ofs_items_box = self._ensure_value_is_boxed(ofs_items_box, boxes)
+            boxes.append(ofs_items_box)
+        vloc, vbox = self._ensure_value_is_boxed(v, [res_v])
+        boxes.append(vbox)
+        size, size_box = self._ensure_value_is_boxed(itemsize_box, boxes)
+        boxes.append(size_box)
+        self.assembler._regalloc_malloc_varsize(size, size_box,
+                                vloc, vbox, ofs_items_loc, self, res_v)
+        base_loc = self.make_sure_var_in_reg(res_v)
+
+        value_loc, vbox = self._ensure_value_is_boxed(v, [res_v])
+        boxes.append(vbox)
+        self.possibly_free_vars(boxes)
+        assert value_loc.is_reg()
+        assert base_loc.is_reg()
+        return [value_loc, base_loc, imm(ofs_length)]
+
     # from ../x86/regalloc.py:791
     def _unpack_fielddescr(self, fielddescr):
         assert isinstance(fielddescr, BaseFieldDescr)


More information about the pypy-commit mailing list