Author: Alex Gaynor <alex.gay...@gmail.com> Branch: inline-dict-ops Changeset: r48283:c24558868b27 Date: 2011-10-20 16:39 -0400 http://bitbucket.org/pypy/pypy/changeset/c24558868b27/
Log: make boehm use the same code path as framework gcs for allocating arrays diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py --- a/pypy/jit/backend/llsupport/gc.py +++ b/pypy/jit/backend/llsupport/gc.py @@ -96,6 +96,15 @@ malloc_fn_ptr = self.configure_boehm_once() self.funcptr_for_new = malloc_fn_ptr + def malloc_array(basesize, itemsize, ofs_length, num_elem): + size = basesize + itemsize * num_elem + res = self.funcptr_for_new(size) + rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[ofs_length/WORD] = num_elem + return res + self.malloc_array = malloc_array + self.GC_MALLOC_ARRAY = lltype.Ptr(lltype.FuncType( + [lltype.Signed] * 4, llmemory.GCREF)) + # on some platform GC_init is required before any other # GC_* functions, call it here for the benefit of tests # XXX move this to tests @@ -116,10 +125,7 @@ ofs_length = arraydescr.get_ofs_length(self.translate_support_code) basesize = arraydescr.get_base_size(self.translate_support_code) itemsize = arraydescr.get_item_size(self.translate_support_code) - size = basesize + itemsize * num_elem - res = self.funcptr_for_new(size) - rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[ofs_length/WORD] = num_elem - return res + return self.malloc_array(basesize, itemsize, ofs_length, num_elem) def gc_malloc_str(self, num_elem): basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR, @@ -142,10 +148,18 @@ assert isinstance(sizedescr, BaseSizeDescr) return [sizedescr.size] + def args_for_new_array(self, arraydescr): + ofs_length = arraydescr.get_ofs_length(self.translate_support_code) + basesize = arraydescr.get_base_size(self.translate_support_code) + itemsize = arraydescr.get_item_size(self.translate_support_code) + return [basesize, itemsize, ofs_length] + def get_funcptr_for_new(self): return self.funcptr_for_new - get_funcptr_for_newarray = None + def get_funcptr_for_newarray(self): + return llhelper(self.GC_MALLOC_ARRAY, self.malloc_array) + get_funcptr_for_newstr = None get_funcptr_for_newunicode = None diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py --- a/pypy/jit/backend/x86/assembler.py +++ b/pypy/jit/backend/x86/assembler.py @@ -993,7 +993,7 @@ effectinfo = op.getdescr().get_extra_info() oopspecindex = effectinfo.oopspecindex genop_llong_list[oopspecindex](self, op, arglocs, resloc) - + def regalloc_perform_math(self, op, arglocs, resloc): effectinfo = op.getdescr().get_extra_info() oopspecindex = effectinfo.oopspecindex @@ -1310,7 +1310,7 @@ genop_guard_float_eq = _cmpop_guard_float("E", "E", "NE","NE") genop_guard_float_gt = _cmpop_guard_float("A", "B", "BE","AE") genop_guard_float_ge = _cmpop_guard_float("AE","BE", "B", "A") - + def genop_math_sqrt(self, op, arglocs, resloc): self.mc.SQRTSD(arglocs[0], resloc) diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py --- a/pypy/jit/backend/x86/regalloc.py +++ b/pypy/jit/backend/x86/regalloc.py @@ -434,7 +434,7 @@ if self.can_merge_with_next_guard(op, i, operations): oplist_with_guard[op.getopnum()](self, op, operations[i + 1]) i += 1 - elif not we_are_translated() and op.getopnum() == -124: + elif not we_are_translated() and op.getopnum() == -124: self._consider_force_spill(op) else: oplist[op.getopnum()](self, op) @@ -1020,27 +1020,18 @@ def consider_new_array(self, op): gc_ll_descr = self.assembler.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 - if gc_ll_descr.can_inline_malloc_varsize(op.getdescr(), - num_elem): - self.fastpath_malloc_varsize(op, op.getdescr(), num_elem) - 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) - return - # boehm GC (XXX kill the following code at some point) - itemsize, basesize, ofs_length, _, _ = ( - self._unpack_arraydescr(op.getdescr())) - scale_of_field = _get_scale(itemsize) - self._malloc_varsize(basesize, ofs_length, scale_of_field, - op.getarg(0), op.result) + box_num_elem = op.getarg(0) + if isinstance(box_num_elem, ConstInt): + num_elem = box_num_elem.value + if gc_ll_descr.can_inline_malloc_varsize(op.getdescr(), + num_elem): + self.fastpath_malloc_varsize(op, op.getdescr(), num_elem) + 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) def _unpack_arraydescr(self, arraydescr): assert isinstance(arraydescr, BaseArrayDescr) @@ -1098,7 +1089,7 @@ self.possibly_free_vars(args) self.rm.possibly_free_var(tmpvar) self.PerformDiscard(op, [base_loc, ofs, itemsize, fieldsize, - index_loc, value_loc]) + index_loc, value_loc]) def consider_strsetitem(self, op): args = op.getarglist() _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit