Author: Alex Gaynor <alex.gay...@gmail.com> Branch: inline-dict-ops Changeset: r48285:9fbb0836e52d Date: 2011-10-20 18:21 -0400 http://bitbucket.org/pypy/pypy/changeset/9fbb0836e52d/
Log: kill boehm special cases in the JIT 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 @@ -45,6 +45,14 @@ def freeing_block(self, start, stop): pass + def get_funcptr_for_newarray(self): + return llhelper(self.GC_MALLOC_ARRAY, self.malloc_array) + def get_funcptr_for_newstr(self): + return llhelper(self.GC_MALLOC_STR_UNICODE, self.malloc_str) + def get_funcptr_for_newunicode(self): + return llhelper(self.GC_MALLOC_STR_UNICODE, self.malloc_unicode) + + def record_constptrs(self, op, gcrefs_output_list): for i in range(op.numargs()): v = op.getarg(i) @@ -105,6 +113,25 @@ self.GC_MALLOC_ARRAY = lltype.Ptr(lltype.FuncType( [lltype.Signed] * 4, llmemory.GCREF)) + + (str_basesize, str_itemsize, str_ofs_length + ) = symbolic.get_array_token(rstr.STR, self.translate_support_code) + (unicode_basesize, unicode_itemsize, unicode_ofs_length + ) = symbolic.get_array_token(rstr.UNICODE, self.translate_support_code) + def malloc_str(length): + return self.malloc_array( + str_basesize, str_itemsize, str_ofs_length, length + ) + def malloc_unicode(length): + return self.malloc_array( + unicode_basesize, unicode_itemsize, unicode_ofs_length, length + ) + self.malloc_str = malloc_str + self.malloc_unicode = malloc_unicode + self.GC_MALLOC_STR_UNICODE = lltype.Ptr(lltype.FuncType( + [lltype.Signed], 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 @@ -128,21 +155,10 @@ 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, - self.translate_support_code) - assert itemsize == 1 - size = basesize + 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_str(num_elem) def gc_malloc_unicode(self, num_elem): - basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE, - self.translate_support_code) - size = basesize + num_elem * itemsize - res = self.funcptr_for_new(size) - rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[ofs_length/WORD] = num_elem - return res + return self.malloc_unicode(num_elem) def args_for_new(self, sizedescr): assert isinstance(sizedescr, BaseSizeDescr) @@ -157,12 +173,6 @@ def get_funcptr_for_new(self): return self.funcptr_for_new - 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 - def rewrite_assembler(self, cpu, operations, gcrefs_output_list): # record all GCREFs too, because Boehm cannot see them and keep them # alive if they end up as constants in the assembler @@ -766,15 +776,6 @@ def get_funcptr_for_new(self): return llhelper(self.GC_MALLOC_BASIC, self.malloc_basic) - def get_funcptr_for_newarray(self): - return llhelper(self.GC_MALLOC_ARRAY, self.malloc_array) - - def get_funcptr_for_newstr(self): - return llhelper(self.GC_MALLOC_STR_UNICODE, self.malloc_str) - - def get_funcptr_for_newunicode(self): - return llhelper(self.GC_MALLOC_STR_UNICODE, self.malloc_unicode) - def do_write_barrier(self, gcref_struct, gcref_newptr): hdr_addr = llmemory.cast_ptr_to_adr(gcref_struct) hdr_addr -= self.gcheaderbuilder.size_gc_header 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 @@ -1506,6 +1506,7 @@ def genop_newstr(self, op, arglocs, result_loc): assert result_loc is eax + assert self.malloc_str_func_addr self.call(self.malloc_str_func_addr, arglocs, eax) self.propagate_memoryerror_if_eax_is_null() 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 @@ -973,50 +973,12 @@ return self._call(op, arglocs) def consider_newstr(self, op): - gc_ll_descr = self.assembler.cpu.gc_ll_descr - if gc_ll_descr.get_funcptr_for_newstr is not None: - # framework GC - loc = self.loc(op.getarg(0)) - return self._call(op, [loc]) - # boehm GC (XXX kill the following code at some point) - ofs_items, itemsize, ofs = symbolic.get_array_token(rstr.STR, self.translate_support_code) - assert itemsize == 1 - return self._malloc_varsize(ofs_items, ofs, 0, op.getarg(0), - op.result) + loc = self.loc(op.getarg(0)) + return self._call(op, [loc]) def consider_newunicode(self, op): - gc_ll_descr = self.assembler.cpu.gc_ll_descr - if gc_ll_descr.get_funcptr_for_newunicode is not None: - # framework GC - loc = self.loc(op.getarg(0)) - return self._call(op, [loc]) - # boehm GC (XXX kill the following code at some point) - ofs_items, _, ofs = symbolic.get_array_token(rstr.UNICODE, - self.translate_support_code) - scale = self._get_unicode_item_scale() - return self._malloc_varsize(ofs_items, ofs, scale, op.getarg(0), - op.result) - - def _malloc_varsize(self, ofs_items, ofs_length, scale, v, res_v): - # XXX kill this function at some point - if isinstance(v, Box): - loc = self.rm.make_sure_var_in_reg(v, [v]) - tempbox = TempBox() - other_loc = self.rm.force_allocate_reg(tempbox, [v]) - self.assembler.load_effective_addr(loc, ofs_items,scale, other_loc) - else: - tempbox = None - other_loc = imm(ofs_items + (v.getint() << scale)) - self._call(ResOperation(rop.NEW, [], res_v), - [other_loc], [v]) - loc = self.rm.make_sure_var_in_reg(v, [res_v]) - assert self.loc(res_v) == eax - # now we have to reload length to some reasonable place - self.rm.possibly_free_var(v) - if tempbox is not None: - self.rm.possibly_free_var(tempbox) - self.PerformDiscard(ResOperation(rop.SETFIELD_GC, [None, None], None), - [eax, imm(ofs_length), imm(WORD), loc]) + loc = self.loc(op.getarg(0)) + return self._call(op, [loc]) def consider_new_array(self, op): gc_ll_descr = self.assembler.cpu.gc_ll_descr _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit