[pypy-commit] pypy arm-backed-float: (arigo, bivab) support new_array

bivab noreply at buildbot.pypy.org
Wed May 18 17:41:24 CEST 2011


Author: David Schneider <david.schneider at picle.org>
Branch: arm-backed-float
Changeset: r44289:e65892e6a1e3
Date: 2011-05-18 17:48 +0200
http://bitbucket.org/pypy/pypy/changeset/e65892e6a1e3/

Log:	(arigo, bivab) support new_array

diff --git a/pypy/jit/backend/arm/opassembler.py b/pypy/jit/backend/arm/opassembler.py
--- a/pypy/jit/backend/arm/opassembler.py
+++ b/pypy/jit/backend/arm/opassembler.py
@@ -895,9 +895,15 @@
             self.mc.gen_load_int(r.ip.value, adr)
             self.mc.STR_ri(r.ip.value, r.r0.value, self.cpu.vtable_offset)
 
+    def set_new_array_length(self, loc, ofs_length, loc_num_elem):
+        assert loc.is_reg()
+        self.mc.gen_load_int(r.ip.value, loc_num_elem)
+        self.mc.STR_ri(r.ip.value, loc.value, imm=ofs_length)
+
     def emit_op_new_array(self, op, arglocs, regalloc, fcond):
-        value_loc, base_loc, ofs_length = arglocs
-        self.mc.STR_ri(value_loc.value, base_loc.value, ofs_length.value)
+        if len(arglocs) > 0:
+            value_loc, base_loc, ofs_length = arglocs
+            self.mc.STR_ri(value_loc.value, base_loc.value, ofs_length.value)
         return fcond
 
     emit_op_newstr = emit_op_new_array
diff --git a/pypy/jit/backend/arm/regalloc.py b/pypy/jit/backend/arm/regalloc.py
--- a/pypy/jit/backend/arm/regalloc.py
+++ b/pypy/jit/backend/arm/regalloc.py
@@ -849,12 +849,13 @@
                 if gc_ll_descr.can_inline_malloc_varsize(op.getdescr(),
                                                          num_elem):
                     self.fastpath_malloc_varsize(op, op.getdescr(), num_elem)
-                    return
+                    return []
             args = self.assembler.cpu.gc_ll_descr.args_for_new_array(
                 op.getdescr())
             arglocs = [imm(x) for x in args]
             arglocs.append(self.loc(box_num_elem))
-            self._call(op, arglocs)
+            self.assembler._emit_call(self.assembler.malloc_array_func_addr, arglocs, self, op.result)
+            return []
         # boehm GC
         itemsize, scale, basesize, ofs_length, _ = (
             self._unpack_arraydescr(op.getdescr()))
@@ -867,7 +868,8 @@
         itemsize = arraydescr.get_item_size(self.cpu.translate_support_code)
         size = basesize + itemsize * num_elem
         self._do_fastpath_malloc(op, size, arraydescr.tid)
-        self.assembler.set_new_array_length(eax, ofs_length, imm(num_elem))
+        # we know the resullt of the malloc call is in r0
+        self.assembler.set_new_array_length(r.r0, ofs_length, num_elem)
 
     def fastpath_malloc_fixedsize(self, op, descr):
         assert isinstance(descr, BaseSizeDescr)


More information about the pypy-commit mailing list