[pypy-svn] r74166 - in pypy/branch/blackhole-improvement/pypy/jit: backend backend/llgraph codewriter metainterp metainterp/test

arigo at codespeak.net arigo at codespeak.net
Wed Apr 28 14:27:24 CEST 2010


Author: arigo
Date: Wed Apr 28 14:27:23 2010
New Revision: 74166

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
   pypy/branch/blackhole-improvement/pypy/jit/backend/model.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_basic.py
Log:
cast_ptr_to_int and a few other missing operations in blackhole.py.


Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py	Wed Apr 28 14:27:23 2010
@@ -585,6 +585,9 @@
         return history.BoxInt(llimpl.cast_to_int(ptrbox.getref_base(),
                                                         self.memo_cast))
 
+    def bh_cast_ptr_to_int(self, ptr):
+        return llimpl.cast_to_int(ptr)
+
     def force(self, force_token):
         token = self.cast_int_to_adr(force_token)
         frame = llimpl.get_forced_token_frame(token)

Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/model.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/model.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/model.py	Wed Apr 28 14:27:23 2010
@@ -305,6 +305,9 @@
     def do_cast_ptr_to_int(self, ptrbox):
         raise NotImplementedError
 
+    def bh_cast_ptr_to_int(self, ptr):
+        raise NotImplementedError
+
     def do_call_may_force(self, args, calldescr):
         return self.do_call(args, calldescr)
 

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py	Wed Apr 28 14:27:23 2010
@@ -349,8 +349,11 @@
         else:
             return op
 
+    def _is_gc(self, v):
+        return v.concretetype.TO._gckind == 'gc'
+
     def _rewrite_nongc_ptrs(self, op):
-        if op.args[0].concretetype.TO._gckind == 'gc':
+        if self._is_gc(op.args[0]):
             return op
         else:
             opname = {'ptr_eq': 'int_eq',
@@ -376,6 +379,12 @@
     rewrite_op_ptr_iszero = _rewrite_nongc_ptrs
     rewrite_op_ptr_nonzero = _rewrite_nongc_ptrs
 
+    def rewrite_op_cast_ptr_to_int(self, op):
+        if self._is_gc(op.args[0]):
+            return op
+        else:
+            raise NoOp
+
 # ____________________________________________________________
 
 def _with_prefix(prefix):

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py	Wed Apr 28 14:27:23 2010
@@ -220,6 +220,12 @@
     def setarg_i(self, index, value):
         self.registers_i[index] = value
 
+    def setarg_r(self, index, value):
+        self.registers_r[index] = value
+
+    def setarg_f(self, index, value):
+        self.registers_f[index] = value
+
     def run(self, jitcode, position):
         self.copy_constants(self.registers_i, jitcode.constants_i)
         self.copy_constants(self.registers_r, jitcode.constants_r)
@@ -323,6 +329,12 @@
     @arguments("i", "i", returns="i")
     def opimpl_int_ge(self, a, b):
         return int(a >= b)
+    @arguments("i", returns="i")
+    def opimpl_int_is_zero(self, a):
+        return int(not a)
+    @arguments("i", returns="i")
+    def opimpl_int_is_true(self, a):
+        return int(bool(a))
 
     @arguments("r", "r", returns="i")
     def opimpl_ptr_eq(self, a, b):
@@ -401,6 +413,13 @@
             return target
 
     @arguments("L", "i", "pc", returns="L")
+    def opimpl_goto_if_not_int_is_zero(self, target, a, pc):
+        if not a:
+            return pc
+        else:
+            return target
+
+    @arguments("L", "i", "pc", returns="L")
     def opimpl_goto_if_not_int_is_true(self, target, a, pc):
         if a:
             return pc
@@ -620,3 +639,7 @@
     @arguments("r", returns="i")
     def opimpl_classof(self, struct):
         return self.cpu.bh_classof(struct)
+
+    @arguments("r", returns="i")
+    def opimpl_cast_ptr_to_int(self, p):
+        return self.cpu.bh_cast_ptr_to_int(p)

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_basic.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_basic.py	Wed Apr 28 14:27:23 2010
@@ -9,7 +9,7 @@
 from pypy import conftest
 from pypy.rlib.rarithmetic import ovfcheck
 from pypy.jit.metainterp.typesystem import LLTypeHelper, OOTypeHelper
-from pypy.rpython.lltypesystem import lltype
+from pypy.rpython.lltypesystem import lltype, llmemory
 from pypy.rpython.ootypesystem import ootype
 
 def _get_jitcodes(CPUClass, func, values, type_system):
@@ -27,8 +27,20 @@
     from pypy.jit.metainterp.blackhole import BlackholeInterpBuilder
     blackholeinterpbuilder = BlackholeInterpBuilder(cw)
     blackholeinterp = blackholeinterpbuilder.acquire_interp()
-    for i, value in enumerate(args):
-        blackholeinterp.setarg_i(i, value)
+    count_i = count_r = count_f = 0
+    for value in args:
+        T = lltype.typeOf(value)
+        if T == lltype.Signed:
+            blackholeinterp.setarg_i(count_i, value)
+            count_i += 1
+        elif T == llmemory.GCREF:
+            blackholeinterp.setarg_r(count_r, value)
+            count_r += 1
+        elif T == lltype.Float:
+            blackholeinterp.setarg_f(count_f, value)
+            count_f += 1
+        else:
+            raise TypeError(value)
     blackholeinterp.run(mainjitcode, 0)
     return blackholeinterp.result_i
 
@@ -1477,17 +1489,29 @@
             py.test.skip("test written in a style that "
                          "means it's frontend only")
         from pypy.rpython.lltypesystem import lltype, llmemory
-        
-        TP = lltype.GcStruct('x')
+
+        TP = lltype.GcStruct('S1')
         def f(p):
             n = lltype.cast_ptr_to_int(p)
             return n
-
         x = lltype.malloc(TP)
-        res = self.interp_operations(f, [x])
-        expected = self.metainterp.cpu.do_cast_ptr_to_int(
-            history.BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, x))).value
-        assert res == expected
+        xref = lltype.cast_opaque_ptr(llmemory.GCREF, x)
+        res = self.interp_operations(f, [xref])
+        y = llmemory.cast_int_to_adr(res)
+        y = llmemory.cast_adr_to_ptr(y, lltype.Ptr(TP))
+        assert x == y
+        #
+        TP = lltype.Struct('S2')
+        prebuilt = [lltype.malloc(TP, immortal=True),
+                    lltype.malloc(TP, immortal=True)]
+        def f(x):
+            p = prebuilt[x]
+            n = lltype.cast_ptr_to_int(p)
+            return n
+        res = self.interp_operations(f, [1])
+        y = llmemory.cast_int_to_adr(res)
+        y = llmemory.cast_adr_to_ptr(y, lltype.Ptr(TP))
+        assert prebuilt[1] == y
 
     def test_collapsing_ptr_eq(self):
         S = lltype.GcStruct('S')



More information about the Pypy-commit mailing list