[pypy-svn] r68422 - in pypy/branch/inline-fastpath-malloc/pypy/jit/backend: llsupport x86

fijal at codespeak.net fijal at codespeak.net
Wed Oct 14 10:59:59 CEST 2009


Author: fijal
Date: Wed Oct 14 10:59:57 2009
New Revision: 68422

Modified:
   pypy/branch/inline-fastpath-malloc/pypy/jit/backend/llsupport/gc.py
   pypy/branch/inline-fastpath-malloc/pypy/jit/backend/x86/regalloc.py
Log:
* Fix translation
* Add support in llsupport/gc.py
explodes hybrid tests so far though...


Modified: pypy/branch/inline-fastpath-malloc/pypy/jit/backend/llsupport/gc.py
==============================================================================
--- pypy/branch/inline-fastpath-malloc/pypy/jit/backend/llsupport/gc.py	(original)
+++ pypy/branch/inline-fastpath-malloc/pypy/jit/backend/llsupport/gc.py	Wed Oct 14 10:59:57 2009
@@ -12,6 +12,7 @@
 from pypy.jit.backend.llsupport.descr import GcCache, get_field_descr
 from pypy.jit.backend.llsupport.descr import GcPtrFieldDescr
 from pypy.jit.backend.llsupport.descr import get_call_descr
+from pypy.rlib.rarithmetic import r_ulonglong
 
 # ____________________________________________________________
 
@@ -343,6 +344,8 @@
                                                lltype.Void)
         (self.array_basesize, _, self.array_length_ofs) = \
              symbolic.get_array_token(lltype.GcArray(lltype.Signed), True)
+        min_ns = self.GCClass.TRANSLATION_PARAMS['min_nursery_size']
+        self.max_size_of_young_obj = self.GCClass.get_young_fixedsize(min_ns)
 
         # make a malloc function, with three arguments
         def malloc_basic(size, tid):
@@ -393,6 +396,26 @@
         self.malloc_unicode = malloc_unicode
         self.GC_MALLOC_STR_UNICODE = lltype.Ptr(lltype.FuncType(
             [lltype.Signed], llmemory.GCREF))
+        def malloc_fixedsize_slowpath(size):
+            gcref = llop1.do_malloc_fixedsize_clear(llmemory.GCREF,
+                                        0, size, True, False, False)
+            res = rffi.cast(lltype.Signed, gcref)
+            nurs_free = llop1.gc_adr_of_nursery_free(lltype.Signed)
+            return r_ulonglong(nurs_free) << 32 | r_ulonglong(res)
+        self.malloc_fixedsize_slowpath = malloc_fixedsize_slowpath
+        self.MALLOC_FIXEDSIZE_SLOWPATH = lltype.FuncType([lltype.Signed],
+                                                 lltype.UnsignedLongLong)
+
+    def get_nursery_free_addr(self):
+        return llop.gc_adr_of_nursery_free(lltype.Signed)
+
+    def get_nursery_top_addr(self):
+        return llop.gc_adr_of_nursery_top(lltype.Signed)
+
+    def get_malloc_fixedsize_slowpath_addr(self):
+        fptr = llhelper(lltype.Ptr(self.MALLOC_FIXEDSIZE_SLOWPATH),
+                        self.malloc_fixedsize_slowpath)
+        return rffi.cast(lltype.Signed, fptr)
 
     def initialize(self):
         self.gcrefs.initialize()
@@ -521,6 +544,15 @@
         newops.append(ResOperation(rop.COND_CALL_GC_WB, args, None,
                                    descr=self.calldescr_jit_wb))
 
+    def can_inline_malloc(self, descr):
+        assert isinstance(descr, BaseSizeDescr)
+        if descr.size < self.max_size_of_young_obj:
+            has_finalizer = bool(descr.tid & (1<<16))
+            if has_finalizer:
+                return False
+            return True
+        return False
+
 # ____________________________________________________________
 
 def get_ll_description(gcdescr, translator=None):

Modified: pypy/branch/inline-fastpath-malloc/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/inline-fastpath-malloc/pypy/jit/backend/x86/regalloc.py	(original)
+++ pypy/branch/inline-fastpath-malloc/pypy/jit/backend/x86/regalloc.py	Wed Oct 14 10:59:57 2009
@@ -14,7 +14,7 @@
 from pypy.jit.backend.x86.jump import remap_stack_layout
 from pypy.jit.metainterp.resoperation import rop
 from pypy.jit.backend.llsupport.descr import BaseFieldDescr, BaseArrayDescr
-from pypy.jit.backend.llsupport.descr import BaseCallDescr
+from pypy.jit.backend.llsupport.descr import BaseCallDescr, BaseSizeDescr
 from pypy.jit.backend.llsupport.regalloc import StackManager, RegisterManager,\
      TempBox
 
@@ -624,6 +624,7 @@
         self.rm.possibly_free_vars(op.args)
 
     def _fastpath_malloc(self, op, descr):
+        assert isinstance(descr, BaseSizeDescr)
         gc_ll_descr = self.assembler.cpu.gc_ll_descr
         tmp0 = TempBox()
         self.rm.force_allocate_reg(op.result, selected_reg=eax)



More information about the Pypy-commit mailing list