[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