[pypy-svn] r52595 - in pypy/branch/jit-hotpath/pypy/jit: rainbow rainbow/test timeshifter

arigo at codespeak.net arigo at codespeak.net
Sun Mar 16 13:45:34 CET 2008


Author: arigo
Date: Sun Mar 16 13:45:34 2008
New Revision: 52595

Modified:
   pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py
   pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py
   pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py
   pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_hp_interpreter.py
   pypy/branch/jit-hotpath/pypy/jit/timeshifter/rcontainer.py
Log:
More interior & co.


Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py	Sun Mar 16 13:45:34 2008
@@ -1338,10 +1338,10 @@
         interiordescindex, indices_v = self.interiordesc(
                 op, PTRTYPE, len(op.args) - 1)
         assert interiordescindex != -1
-        structindex = self.serialize_oparg("red", structvar)
+        structindex = self.serialize_oparg(color, structvar)
         indexes = []
         for arg in indices_v:
-            indexes.append(self.serialize_oparg("red", arg))
+            indexes.append(self.serialize_oparg(color, arg))
         self.emit("%s_getinteriorarraysize" % color, structindex,
                   interiordescindex)
         self.emit(len(indexes))

Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py	Sun Mar 16 13:45:34 2008
@@ -374,7 +374,8 @@
 
     @arguments("structtypedesc", "red", returns="red")
     def opimpl_red_malloc_varsize_struct(self, structtypedesc, gv_size):
-        Xxx("red_malloc_varsize_struct")
+        size = gv_size.revealconst(lltype.Signed)
+        return structtypedesc.allocate_varsize(self.rgenop, size)
 
     @arguments("arraydesc", "red", returns="red")
     def opimpl_red_malloc_varsize_array(self, arraytypedesc, gv_size):
@@ -433,13 +434,18 @@
                                               gv_value)
 
     @arguments("red", "interiordesc", "red_varargs", returns="red")
-    def opimpl_red_getinteriorarraysize(self, gv_array, interiordesc, indexes_gv):
-        Xxx("red_getinteriorarraysize")
+    def opimpl_red_getinteriorarraysize(self, gv_array, interiordesc,
+                                        indexes_gv):
+        return interiordesc.perform_getinteriorarraysize(self.rgenop,
+                                                         gv_array,
+                                                         indexes_gv)
 
-    @arguments("red", "interiordesc", "red_varargs", returns="green_from_red")
+    @arguments("green", "interiordesc", "green_varargs", returns="green")
     def opimpl_green_getinteriorarraysize(self, gv_array, interiordesc,
                                           indexes_gv):
-        Xxx("green_getinteriorarraysize")
+        return interiordesc.perform_getinteriorarraysize(self.rgenop,
+                                                         gv_array,
+                                                         indexes_gv)
 
     @arguments("red", "green", "green", returns="green")
     def opimpl_is_constant(self, arg, true, false):

Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py	Sun Mar 16 13:45:34 2008
@@ -843,13 +843,12 @@
         return interiordesc.gengetinteriorarraysize(
             self.jitstate, arraybox, indexboxes)
 
-    @arguments("red", "interiordesc", "red_varargs", returns="green_from_red")
-    def opimpl_green_getinteriorarraysize(self, arraybox, interiordesc,
-                                          indexboxes):
-        # XXX make a green version that does not use the constant folding of
-        # the red one
-        return interiordesc.gengetinteriorarraysize(
-            self.jitstate, arraybox, indexboxes)
+    @arguments("green", "interiordesc", "green_varargs", returns="green")
+    def opimpl_green_getinteriorarraysize(self, gv_array, interiordesc,
+                                          indexes_gv):
+        return interiordesc.perform_getinteriorarraysize(self.rgenop,
+                                                         gv_array,
+                                                         indexes_gv)
 
     @arguments("red", "green", "green", returns="green")
     def opimpl_is_constant(self, arg, true, false):

Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_hp_interpreter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_hp_interpreter.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_hp_interpreter.py	Sun Mar 16 13:45:34 2008
@@ -777,25 +777,32 @@
                                    'int_gt': 1, 'int_rshift': 1})
 
     def test_red_varsized_struct(self):
+        class MyJitDriver(JitDriver):
+            greens = []
+            reds = ['x', 'y', 'n', 'i', 'res']
         A = lltype.Array(lltype.Signed)
         S = lltype.GcStruct('S', ('foo', lltype.Signed), ('a', A))
         def ll_function(x, y, n):
-            s = lltype.malloc(S, 3)
-            s.foo = len(s.a)-1
-            s.a[0] = x
-            s.a[1] = y
-            return s.a[n]*s.foo
+            i = 1024
+            while i > 0:
+                i >>= 1
+                #
+                s = lltype.malloc(S, 3)
+                s.foo = len(s.a)-1
+                s.a[0] = x
+                s.a[1] = y
+                res = s.a[n]*s.foo
+                n = 1 - n
+                #
+                MyJitDriver.jit_merge_point(x=x, y=y, n=n, i=i, res=res)
+                MyJitDriver.can_enter_jit(x=x, y=y, n=n, i=i, res=res)
+            return res
 
-        res = self.interpret(ll_function, [21, -21, 0], [])
+        res = self.run(ll_function, [21, -21, 0], threshold=2)
         assert res == 42
         self.check_insns(malloc_varsize=1,
                          getinteriorarraysize=1)
 
-        res = self.interpret(ll_function, [21, -21, 1], [])
-        assert res == -42
-        self.check_insns(malloc_varsize=1,
-                         getinteriorarraysize=1)
-
     def test_array_of_voids(self):
         A = lltype.GcArray(lltype.Void)
         def ll_function(n):

Modified: pypy/branch/jit-hotpath/pypy/jit/timeshifter/rcontainer.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/timeshifter/rcontainer.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/timeshifter/rcontainer.py	Sun Mar 16 13:45:34 2008
@@ -105,7 +105,7 @@
 
         if fixsize:
             self._define_devirtualize()
-            self._define_allocate()
+        self._define_allocate(fixsize)
 
         
     def _compute_fielddescs(self, RGenOp):
@@ -139,13 +139,20 @@
         self.fielddesc_by_name = fielddesc_by_name
         self.innermostdesc = innermostdesc
 
-    def _define_allocate(self):
+    def _define_allocate(self, fixsize):
         TYPE = self.TYPE
         descs = unrolling_iterable(self.fielddescs)
 
-        def allocate(rgenop):
-            s = lltype.malloc(TYPE)
-            return rgenop.genconst(s)
+        if fixsize:
+            def allocate(rgenop):
+                s = lltype.malloc(TYPE)
+                return rgenop.genconst(s)
+            self.allocate = allocate
+        else:
+            def allocate_varsize(rgenop, size):
+                s = lltype.malloc(TYPE, size)
+                return rgenop.genconst(s)
+            self.allocate_varsize = allocate_varsize
 
         def populate(content_boxes, gv_s, box_gv_reader):
             s = gv_s.revealconst(lltype.Ptr(TYPE))
@@ -159,8 +166,6 @@
                     tgt = lltype.cast_pointer(desc.PTRTYPE, s)
                     setattr(tgt, desc.fieldname, v)
                 i += 1
-
-        self.allocate = allocate
         self.populate = populate
 
     def _define_devirtualize(self):
@@ -473,12 +478,13 @@
                             # constant-folding: success
                             return rvalue.ll_fromvalue(jitstate, len(array))
 
-                argbox = getinterior_all(jitstate, argbox, indexboxes)
+                argbox = gengetinterior_all(jitstate, argbox, indexboxes)
                 genvar = jitstate.curbuilder.genop_getarraysize(
                     arrayfielddesc.arraytoken,
                     argbox.getgenvar(jitstate))
                 return rvalue.IntRedBox(arrayfielddesc.indexkind, genvar)
 
+            self.perform_getinteriorarraysize = perform_getinteriorarraysize
             self.gengetinteriorarraysize = gengetinteriorarraysize
 
     def _freeze_(self):



More information about the Pypy-commit mailing list