Author: Armin Rigo <ar...@tunes.org>
Branch: stm-jit
Changeset: r56587:f738a0f4c9ef
Date: 2012-08-05 17:00 +0200
http://bitbucket.org/pypy/pypy/changeset/f738a0f4c9ef/

Log:    finish llmodel support. XXX refactor...

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
@@ -314,7 +314,9 @@
         return rffi.cast(rffi.CArrayPtr(lltype.Signed), array)[ofs/WORD]
 
     @specialize.argtype(2)
-    def bh_getarrayitem_gc_i(self, arraydescr, gcref, itemindex):
+    def _base_getarrayitem_i(self, arraydescr, gcref, itemindex):
+        # XXXXXXXXXXXXXXXXXX refactor this mess with
+        # introducing instead raw_load/gc_load operations
         ofs, size, sign = self.unpack_arraydescr_size(arraydescr)
         # --- start of GC unsafe code (no GC operation!) ---
         items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
@@ -333,7 +335,7 @@
         else:
             raise NotImplementedError("size = %d" % size)
 
-    def bh_getarrayitem_gc_r(self, arraydescr, gcref, itemindex):
+    def _base_getarrayitem_r(self, arraydescr, gcref, itemindex):
         ofs = self.unpack_arraydescr(arraydescr)
         # --- start of GC unsafe code (no GC operation!) ---
         items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
@@ -343,7 +345,7 @@
         return pval
 
     @specialize.argtype(2)
-    def bh_getarrayitem_gc_f(self, arraydescr, gcref, itemindex):
+    def _base_getarrayitem_f(self, arraydescr, gcref, itemindex):
         ofs = self.unpack_arraydescr(arraydescr)
         # --- start of GC unsafe code (no GC operation!) ---
         items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
@@ -353,7 +355,7 @@
         return fval
 
     @specialize.argtype(2)
-    def bh_setarrayitem_gc_i(self, arraydescr, gcref, itemindex, newvalue):
+    def _base_setarrayitem_i(self, arraydescr, gcref, itemindex, newvalue):
         ofs, size, sign = self.unpack_arraydescr_size(arraydescr)
         # --- start of GC unsafe code (no GC operation!) ---
         items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
@@ -366,7 +368,7 @@
         else:
             raise NotImplementedError("size = %d" % size)
 
-    def bh_setarrayitem_gc_r(self, arraydescr, gcref, itemindex, newvalue):
+    def _base_setarrayitem_r(self, arraydescr, gcref, itemindex, newvalue):
         ofs = self.unpack_arraydescr(arraydescr)
         self.gc_ll_descr.do_write_barrier(gcref, newvalue)
         # --- start of GC unsafe code (no GC operation!) ---
@@ -376,7 +378,7 @@
         # --- end of GC unsafe code ---
 
     @specialize.argtype(2)
-    def bh_setarrayitem_gc_f(self, arraydescr, gcref, itemindex, newvalue):
+    def _base_setarrayitem_f(self, arraydescr, gcref, itemindex, newvalue):
         ofs = self.unpack_arraydescr(arraydescr)
         # --- start of GC unsafe code (no GC operation!) ---
         items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
@@ -384,11 +386,75 @@
         items[itemindex] = newvalue
         # --- end of GC unsafe code ---
 
-    bh_setarrayitem_raw_i = bh_setarrayitem_gc_i
-    bh_setarrayitem_raw_f = bh_setarrayitem_gc_f
+    def bh_setarrayitem_gc_i(self, arraydescr, gcref, itemindex, newvalue):
+        if not self.gc_ll_descr.stm:
+            self._base_setarrayitem_i(arraydescr, gcref, itemindex, newvalue)
+        else:
+            ofs, size, sign = self.unpack_arraydescr_size(arraydescr)
+            for TYPE, _, itemsize in unroll_basic_sizes:
+                if size == itemsize:
+                    ofs += itemsize * itemindex
+                    llop.stm_gc_store(lltype.Void, gcref, ofs,
+                                      rffi.cast(TYPE, newvalue))
+                    return
+            else:
+                raise NotImplementedError("size = %d" % size)
 
-    bh_getarrayitem_raw_i = bh_getarrayitem_gc_i
-    bh_getarrayitem_raw_f = bh_getarrayitem_gc_f
+    def bh_setarrayitem_gc_r(self, arraydescr, gcref, itemindex, newvalue):
+        if not self.gc_ll_descr.stm:
+            self._base_setarrayitem_r(arraydescr, gcref, itemindex, newvalue)
+        else:
+            ofs = self.unpack_arraydescr(arraydescr)
+            ofs += llmemory.sizeof(llmemory.GCREF) * itemindex
+            llop.stm_gc_store(lltype.Void, gcref, ofs, newvalue)
+
+    def bh_setarrayitem_gc_f(self, arraydescr, gcref, itemindex, newvalue):
+        if not self.gc_ll_descr.stm:
+            self._base_setarrayitem_f(arraydescr, gcref, itemindex, newvalue)
+        else:
+            ofs = self.unpack_arraydescr(arraydescr)
+            ofs += llmemory.sizeof(longlong.FLOATSTORAGE) * itemindex
+            llop.stm_gc_store(lltype.Void, gcref, ofs, newvalue)
+
+    bh_setarrayitem_raw_i = _base_setarrayitem_i
+    bh_setarrayitem_raw_f = _base_setarrayitem_f
+
+    def bh_getarrayitem_gc_i(self, arraydescr, gcref, itemindex):
+        if not self.gc_ll_descr.stm:
+            return self._base_getarrayitem_i(arraydescr, gcref, itemindex)
+        else:
+            ofs, size, sign = self.unpack_arraydescr_size(arraydescr)
+            for STYPE, UTYPE, itemsize in unroll_basic_sizes:
+                if size == itemsize:
+                    ofs += itemsize * itemindex
+                    if sign:
+                        val = llop.stm_gc_load(STYPE, gcref, ofs)
+                        val = rffi.cast(lltype.Signed, val)
+                    else:
+                        val = llop.stm_gc_load(UTYPE, gcref, ofs)
+                        val = rffi.cast(lltype.Signed, val)
+                    return val
+            else:
+                raise NotImplementedError("size = %d" % size)
+
+    def bh_getarrayitem_gc_r(self, arraydescr, gcref, itemindex):
+        if not self.gc_ll_descr.stm:
+            return self._base_getarrayitem_r(arraydescr, gcref, itemindex)
+        else:
+            ofs = self.unpack_arraydescr(arraydescr)
+            ofs += llmemory.sizeof(llmemory.GCREF) * itemindex
+            return llop.stm_gc_load(llmemory.GCREF, gcref, ofs)
+
+    def bh_getarrayitem_gc_f(self, arraydescr, gcref, itemindex):
+        if not self.gc_ll_descr.stm:
+            return self._base_getarrayitem_f(arraydescr, gcref, itemindex)
+        else:
+            ofs = self.unpack_arraydescr(arraydescr)
+            ofs += llmemory.sizeof(longlong.FLOATSTORAGE) * itemindex
+            return llop.stm_gc_load(longlong.FLOATSTORAGE, gcref, ofs)
+
+    bh_getarrayitem_raw_i = _base_getarrayitem_i
+    bh_getarrayitem_raw_f = _base_getarrayitem_f
 
     def bh_getinteriorfield_gc_i(self, gcref, itemindex, descr):
         assert isinstance(descr, InteriorFieldDescr)
@@ -398,6 +464,19 @@
         fieldsize = descr.fielddescr.field_size
         sign = descr.fielddescr.is_field_signed()
         fullofs = itemindex * size + ofs
+        #
+        if self.gc_ll_descr.stm:
+            for STYPE, UTYPE, itemsize in unroll_basic_sizes:
+                if fieldsize == itemsize:
+                    if sign:
+                        val = llop.stm_gc_load(STYPE, gcref, fullofs)
+                        val = rffi.cast(lltype.Signed, val)
+                    else:
+                        val = llop.stm_gc_load(UTYPE, gcref, fullofs)
+                        val = rffi.cast(lltype.Signed, val)
+                    return val
+            else:
+                raise NotImplementedError("size = %d" % size)
         # --- start of GC unsafe code (no GC operation!) ---
         items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), fullofs)
         for STYPE, UTYPE, itemsize in unroll_basic_sizes:
@@ -419,10 +498,12 @@
         assert isinstance(descr, InteriorFieldDescr)
         arraydescr = descr.arraydescr
         ofs, size, _ = self.unpack_arraydescr_size(arraydescr)
-        ofs += descr.fielddescr.offset
+        ofs += descr.fielddescr.offset + size * itemindex
+        #
+        if self.gc_ll_descr.stm:
+            return llop.stm_gc_load(llmemory.GCREF, gcref, ofs)
         # --- start of GC unsafe code (no GC operation!) ---
-        items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs +
-                            size * itemindex)
+        items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
         items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
         pval = self._cast_int_to_gcref(items[0])
         # --- end of GC unsafe code ---
@@ -432,10 +513,12 @@
         assert isinstance(descr, InteriorFieldDescr)
         arraydescr = descr.arraydescr
         ofs, size, _ = self.unpack_arraydescr_size(arraydescr)
-        ofs += descr.fielddescr.offset
+        ofs += descr.fielddescr.offset + size * itemindex
+        #
+        if self.gc_ll_descr.stm:
+            return llop.stm_gc_load(longlong.FLOATSTORAGE, gcref, ofs)
         # --- start of GC unsafe code (no GC operation!) ---
-        items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs +
-                            size * itemindex)
+        items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
         items = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), items)
         fval = items[0]
         # --- end of GC unsafe code ---
@@ -448,6 +531,15 @@
         ofs += descr.fielddescr.offset
         fieldsize = descr.fielddescr.field_size
         ofs = itemindex * size + ofs
+        #
+        if self.gc_ll_descr.stm:
+            for TYPE, _, itemsize in unroll_basic_sizes:
+                if fieldsize == itemsize:
+                    llop.stm_gc_store(lltype.Void, gcref, ofs,
+                                      rffi.cast(TYPE, value))
+                    return
+            else:
+                raise NotImplementedError("size = %d" % fieldsize)
         # --- start of GC unsafe code (no GC operation!) ---
         items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
         for TYPE, _, itemsize in unroll_basic_sizes:
@@ -463,11 +555,15 @@
         assert isinstance(descr, InteriorFieldDescr)
         arraydescr = descr.arraydescr
         ofs, size, _ = self.unpack_arraydescr_size(arraydescr)
-        ofs += descr.fielddescr.offset
+        ofs += descr.fielddescr.offset + size * itemindex
+        #
+        if self.gc_ll_descr.stm:
+            llop.stm_gc_store(llmemory.GCREF, gcref, ofs, newvalue)
+            return
+        #
         self.gc_ll_descr.do_write_barrier(gcref, newvalue)
         # --- start of GC unsafe code (no GC operation!) ---
-        items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref),
-                            ofs + size * itemindex)
+        items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
         items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
         items[0] = self.cast_gcref_to_int(newvalue)
         # --- end of GC unsafe code ---
@@ -476,10 +572,13 @@
         assert isinstance(descr, InteriorFieldDescr)
         arraydescr = descr.arraydescr
         ofs, size, _ = self.unpack_arraydescr_size(arraydescr)
-        ofs += descr.fielddescr.offset
+        ofs += descr.fielddescr.offset + size * itemindex
+        #
+        if self.gc_ll_descr.stm:
+            llop.stm_gc_store(longlong.FLOATSTORAGE, gcref, ofs, newvalue)
+            return
         # --- start of GC unsafe code (no GC operation!) ---
-        items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref),
-                            ofs + size * itemindex)
+        items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
         items = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), items)
         items[0] = newvalue
         # --- end of GC unsafe code ---
@@ -548,9 +647,12 @@
             for STYPE, UTYPE, itemsize in unroll_basic_sizes:
                 if size == itemsize:
                     if sign:
-                        return llop.stm_gc_load(STYPE, struct, ofs)
+                        val = llop.stm_gc_load(STYPE, struct, ofs)
+                        val = rffi.cast(lltype.Signed, val)
                     else:
-                        return llop.stm_gc_load(UTYPE, struct, ofs)
+                        val = llop.stm_gc_load(UTYPE, struct, ofs)
+                        val = rffi.cast(lltype.Signed, val)
+                    return val
             else:
                 raise NotImplementedError("size = %d" % size)
 
@@ -569,7 +671,6 @@
             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
 
     @specialize.argtype(1)
@@ -586,11 +687,8 @@
         else:
             raise NotImplementedError("size = %d" % size)
 
-    @specialize.argtype(1)
     def _base_do_setfield_r(self, struct, fielddescr, newvalue):
         ofs = self.unpack_fielddescr(fielddescr)
-        assert lltype.typeOf(struct) is not lltype.Signed, (
-            "can't handle write barriers for setfield_raw")
         self.gc_ll_descr.do_write_barrier(struct, newvalue)
         # --- start of GC unsafe code (no GC operation!) ---
         fieldptr = rffi.ptradd(rffi.cast(rffi.CCHARP, struct), ofs)
@@ -635,7 +733,6 @@
             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
 
     def bh_new(self, sizedescr):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to