[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