[pypy-svn] r68094 - in pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport: . test

arigo at codespeak.net arigo at codespeak.net
Thu Oct 1 12:46:42 CEST 2009


Author: arigo
Date: Thu Oct  1 12:46:42 2009
New Revision: 68094

Modified:
   pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py
   pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/symbolic.py
   pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_runner.py
Log:
Reimplement get/set of fields and array items
to also support floats.


Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py	(original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py	Thu Oct  1 12:46:42 2009
@@ -206,7 +206,8 @@
         ofs = fielddescr.offset
         size = fielddescr.get_field_size(self.translate_support_code)
         ptr = fielddescr.is_pointer_field()
-        return ofs, size, ptr
+        float = fielddescr.is_float_field()
+        return ofs, size, ptr, float
     unpack_fielddescr._always_inline_ = True
 
     def arraydescrof(self, A):
@@ -217,7 +218,8 @@
         ofs = arraydescr.get_base_size(self.translate_support_code)
         size = arraydescr.get_item_size(self.translate_support_code)
         ptr = arraydescr.is_array_of_pointers()
-        return ofs, size, ptr
+        float = arraydescr.is_array_of_floats()
+        return ofs, size, ptr, float
     unpack_arraydescr._always_inline_ = True
 
     def calldescrof(self, FUNC, ARGS, RESULT):
@@ -247,40 +249,66 @@
     def do_getarrayitem_gc(self, arraybox, indexbox, arraydescr):
         itemindex = indexbox.getint()
         gcref = arraybox.getref_base()
-        ofs, size, ptr = self.unpack_arraydescr(arraydescr)
+        ofs, size, ptr, float = self.unpack_arraydescr(arraydescr)
+        # --- start of GC unsafe code (no GC operation!) ---
+        items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+        #
+        if ptr:
+            items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
+            pval = self._cast_int_to_gcref(items[itemindex])
+            # --- end of GC unsafe code ---
+            return BoxPtr(pval)
+        #
+        if float:
+            items = rffi.cast(rffi.CArrayPtr(lltype.Float), items)
+            fval = items[itemindex]
+            # --- end of GC unsafe code ---
+            return BoxFloat(fval)
         #
         for TYPE, itemsize in unroll_basic_sizes:
             if size == itemsize:
-                val = (rffi.cast(rffi.CArrayPtr(TYPE), gcref)
-                       [ofs/itemsize + itemindex])
-                val = rffi.cast(lltype.Signed, val)
-                break
+                items = rffi.cast(rffi.CArrayPtr(TYPE), items) 
+                val = items[itemindex]
+                # --- end of GC unsafe code ---
+                return BoxInt(rffi.cast(lltype.Signed, val))
         else:
             raise NotImplementedError("size = %d" % size)
-        if ptr:
-            return BoxPtr(self._cast_int_to_gcref(val))
-        else:
-            return BoxInt(val)
 
     def do_setarrayitem_gc(self, arraybox, indexbox, vbox, arraydescr):
         itemindex = indexbox.getint()
         gcref = arraybox.getref_base()
-        ofs, size, ptr = self.unpack_arraydescr(arraydescr)
+        ofs, size, ptr, float = self.unpack_arraydescr(arraydescr)
         #
         if ptr:
             vboxptr = vbox.getref_base()
             self.gc_ll_descr.do_write_barrier(gcref, vboxptr)
-            a = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)
-            a[ofs/WORD + itemindex] = self.cast_gcref_to_int(vboxptr)
+            # --- start of GC unsafe code (no GC operation!) ---
+            items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+            items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
+            items[itemindex] = self.cast_gcref_to_int(vboxptr)
+            # --- end of GC unsafe code ---
+            return
+        #
+        if float:
+            fval = vbox.getfloat()
+            # --- start of GC unsafe code (no GC operation!) ---
+            items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+            items = rffi.cast(rffi.CArrayPtr(lltype.Float), items)
+            items[itemindex] = fval
+            # --- end of GC unsafe code ---
+            return
+        #
+        val = vbox.getint()
+        for TYPE, itemsize in unroll_basic_sizes:
+            if size == itemsize:
+                # --- start of GC unsafe code (no GC operation!) ---
+                items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+                items = rffi.cast(rffi.CArrayPtr(TYPE), items)
+                items[itemindex] = rffi.cast(TYPE, val)
+                # --- end of GC unsafe code ---
+                return
         else:
-            v = vbox.getint()
-            for TYPE, itemsize in unroll_basic_sizes:
-                if size == itemsize:
-                    a = rffi.cast(rffi.CArrayPtr(TYPE), gcref)
-                    a[ofs/itemsize + itemindex] = rffi.cast(TYPE, v)
-                    break
-            else:
-                raise NotImplementedError("size = %d" % size)
+            raise NotImplementedError("size = %d" % size)
 
     def _new_do_len(TP):
         def do_strlen(self, stringbox):
@@ -313,18 +341,29 @@
 
     @specialize.argtype(1)
     def _base_do_getfield(self, gcref, fielddescr):
-        ofs, size, ptr = self.unpack_fielddescr(fielddescr)
+        ofs, size, ptr, float = self.unpack_fielddescr(fielddescr)
+        # --- start of GC unsafe code (no GC operation!) ---
+        field = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+        #
+        if ptr:
+            pval = rffi.cast(rffi.CArrayPtr(lltype.Signed), field)[0]
+            pval = self._cast_int_to_gcref(pval)
+            # --- end of GC unsafe code ---
+            return BoxPtr(pval)
+        #
+        if float:
+            fval = rffi.cast(rffi.CArrayPtr(lltype.Float), field)[0]
+            # --- end of GC unsafe code ---
+            return BoxFloat(fval)
+        #
         for TYPE, itemsize in unroll_basic_sizes:
             if size == itemsize:
-                val = rffi.cast(rffi.CArrayPtr(TYPE), gcref)[ofs/itemsize]
+                val = rffi.cast(rffi.CArrayPtr(TYPE), field)[0]
+                # --- end of GC unsafe code ---
                 val = rffi.cast(lltype.Signed, val)
-                break
+                return BoxInt(val)
         else:
             raise NotImplementedError("size = %d" % size)
-        if ptr:
-            return BoxPtr(self._cast_int_to_gcref(val))
-        else:
-            return BoxInt(val)
 
     def do_getfield_gc(self, structbox, fielddescr):
         gcref = structbox.getref_base()
@@ -335,23 +374,40 @@
 
     @specialize.argtype(1)
     def _base_do_setfield(self, gcref, vbox, fielddescr):
-        ofs, size, ptr = self.unpack_fielddescr(fielddescr)
+        ofs, size, ptr, float = self.unpack_fielddescr(fielddescr)
+        #
         if ptr:
             assert lltype.typeOf(gcref) is not lltype.Signed, (
                 "can't handle write barriers for setfield_raw")
             ptr = vbox.getref_base()
             self.gc_ll_descr.do_write_barrier(gcref, ptr)
-            a = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)
-            a[ofs/WORD] = self.cast_gcref_to_int(ptr)
+            # --- start of GC unsafe code (no GC operation!) ---
+            field = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+            field = rffi.cast(rffi.CArrayPtr(lltype.Signed), field)
+            field[0] = self.cast_gcref_to_int(ptr)
+            # --- end of GC unsafe code ---
+            return
+        #
+        if float:
+            fval = vbox.getfloat()
+            # --- start of GC unsafe code (no GC operation!) ---
+            field = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+            field = rffi.cast(rffi.CArrayPtr(lltype.Float), field)
+            field[0] = fval
+            # --- end of GC unsafe code ---
+            return
+        #
+        val = vbox.getint()
+        for TYPE, itemsize in unroll_basic_sizes:
+            if size == itemsize:
+                # --- start of GC unsafe code (no GC operation!) ---
+                field = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+                field = rffi.cast(rffi.CArrayPtr(TYPE), field)
+                field[0] = rffi.cast(TYPE, val)
+                # --- end of GC unsafe code ---
+                return
         else:
-            v = vbox.getint()
-            for TYPE, itemsize in unroll_basic_sizes:
-                if size == itemsize:
-                    v = rffi.cast(TYPE, v)
-                    rffi.cast(rffi.CArrayPtr(TYPE), gcref)[ofs/itemsize] = v
-                    break
-            else:
-                raise NotImplementedError("size = %d" % size)
+            raise NotImplementedError("size = %d" % size)
 
     def do_setfield_gc(self, structbox, vbox, fielddescr):
         gcref = structbox.getref_base()
@@ -415,12 +471,11 @@
         self.execute_token(executable_token)
         # Note: if an exception is set, the rest of the code does a bit of
         # nonsense but nothing wrong (the return value should be ignored)
-        res = calldescr.get_result_size(self.translate_support_code)
         if calldescr.returns_a_pointer():
             return BoxPtr(self.get_latest_value_ref(0))
-        elif res == self.FLOATSIZE:
+        elif calldescr.returns_a_float():
             return BoxFloat(self.get_latest_value_float(0))
-        elif res > 0:
+        elif calldescr.get_result_size(self.translate_support_code) > 0:
             return BoxInt(self.get_latest_value_int(0))
         else:
             return None

Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/symbolic.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/symbolic.py	(original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/symbolic.py	Thu Oct  1 12:46:42 2009
@@ -61,8 +61,10 @@
 SIZEOF_CHAR  = get_size(lltype.Char, False)
 SIZEOF_SHORT = get_size(rffi.SHORT, False)
 SIZEOF_INT   = get_size(rffi.INT, False)
+SIZEOF_FLOAT = get_size(lltype.Float, False)
 
 unroll_basic_sizes = unrolling_iterable([(lltype.Signed, WORD),
                                          (lltype.Char,   SIZEOF_CHAR),
                                          (rffi.SHORT,    SIZEOF_SHORT),
                                          (rffi.INT,      SIZEOF_INT)])
+# does not contain Float ^^^ which must be special-cased

Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_runner.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_runner.py	(original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_runner.py	Thu Oct  1 12:46:42 2009
@@ -7,6 +7,7 @@
     pass
 
 class MyLLCPU(AbstractLLCPU):
+    supports_floats = True
     def compile_loop(self, inputargs, operations):
         py.test.skip("llsupport test: cannot compile operations")
 



More information about the Pypy-commit mailing list