Author: Alex Gaynor <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit