Author: David Schneider <david.schnei...@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit