[pypy-commit] pypy stm-jit: In-progress

arigo noreply at buildbot.pypy.org
Mon Jul 30 20:39:36 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: stm-jit
Changeset: r56513:4b0633949b2a
Date: 2012-07-30 16:47 +0200
http://bitbucket.org/pypy/pypy/changeset/4b0633949b2a/

Log:	In-progress

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
@@ -637,6 +637,7 @@
         GcLLDescription.__init__(self, gcdescr, translator, rtyper)
         self.translator = translator
         self.llop1 = llop1
+        self.stm = translator.config.translation.stm
         if really_not_translated:
             assert not self.translate_support_code  # but half does not work
             self._initialize_for_tests()
diff --git a/pypy/jit/backend/llsupport/llmodel.py b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -540,9 +540,34 @@
         # --- end of GC unsafe code ---
         return fval
 
-    bh_getfield_gc_i = _base_do_getfield_i
-    bh_getfield_gc_r = _base_do_getfield_r
-    bh_getfield_gc_f = _base_do_getfield_f
+    def bh_getfield_gc_i(self, struct, fielddescr):
+        if not self.gc_ll_descr.stm:
+            return self._base_do_getfield_i(struct, fielddescr)
+        else:
+            ofs, size, sign = self.unpack_fielddescr_size(fielddescr)
+            for STYPE, UTYPE, itemsize in unroll_basic_sizes:
+                if size == itemsize:
+                    if sign:
+                        return llop.stm_gc_load(STYPE, struct, ofs)
+                    else:
+                        return llop.stm_gc_load(UTYPE, struct, ofs)
+            else:
+                raise NotImplementedError("size = %d" % size)
+
+    def bh_getfield_gc_r(self, struct, fielddescr):
+        if not self.gc_ll_descr.stm:
+            return self._base_do_getfield_r(struct, fielddescr)
+        else:
+            ofs = self.unpack_fielddescr(fielddescr)
+            return llop.stm_gc_load(llmemory.GCREF, struct, ofs)
+
+    def bh_getfield_gc_f(self, struct, fielddescr):
+        if not self.gc_ll_descr.stm:
+            return self._base_do_getfield_f(struct, fielddescr)
+        else:
+            ofs = self.unpack_fielddescr(fielddescr)
+            return llop.stm_gc_load(longlong.FLOATSTORAGE, struct, ofs)
+
     bh_getfield_raw_i = _base_do_getfield_i
     bh_getfield_raw_r = _base_do_getfield_r
     bh_getfield_raw_f = _base_do_getfield_f
@@ -582,9 +607,33 @@
         fieldptr[0] = newvalue
         # --- end of GC unsafe code ---
 
-    bh_setfield_gc_i = _base_do_setfield_i
-    bh_setfield_gc_r = _base_do_setfield_r
-    bh_setfield_gc_f = _base_do_setfield_f
+    def bh_setfield_gc_i(self, struct, fielddescr, newvalue):
+        if not self.gc_ll_descr.stm:
+            self._base_do_setfield_i(struct, fielddescr, newvalue)
+        else:
+            ofs, size, sign = self.unpack_fielddescr_size(fielddescr)
+            for TYPE, _, itemsize in unroll_basic_sizes:
+                if size == itemsize:
+                    llop.stm_gc_store(lltype.Void, struct, ofs,
+                                      rffi.cast(TYPE, newvalue))
+                    return
+            else:
+                raise NotImplementedError("size = %d" % size)
+
+    def bh_setfield_gc_r(self, struct, fielddescr, newvalue):
+        if not self.gc_ll_descr.stm:
+            self._base_do_setfield_r(struct, fielddescr, newvalue)
+        else:
+            ofs = self.unpack_fielddescr(fielddescr)
+            llop.stm_gc_store(lltype.Void, struct, ofs, newvalue)
+
+    def bh_setfield_gc_f(self, struct, fielddescr, newvalue):
+        if not self.gc_ll_descr.stm:
+            self._base_do_setfield_f(struct, fielddescr, newvalue)
+        else:
+            ofs = self.unpack_fielddescr(fielddescr)
+            llop.stm_gc_store(lltype.Void, struct, ofs, newvalue)
+
     bh_setfield_raw_i = _base_do_setfield_i
     bh_setfield_raw_r = _base_do_setfield_r
     bh_setfield_raw_f = _base_do_setfield_f


More information about the pypy-commit mailing list