[pypy-svn] r37593 - in pypy/dist/pypy/jit/codegen: . i386 llgraph llvm/test ppc/test test
ac at codespeak.net
ac at codespeak.net
Tue Jan 30 14:13:13 CET 2007
Author: ac
Date: Tue Jan 30 14:13:12 2007
New Revision: 37593
Modified:
pypy/dist/pypy/jit/codegen/i386/rgenop.py
pypy/dist/pypy/jit/codegen/llgraph/rgenop.py
pypy/dist/pypy/jit/codegen/llvm/test/test_rgenop.py
pypy/dist/pypy/jit/codegen/model.py
pypy/dist/pypy/jit/codegen/ppc/test/test_rgenop.py
pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
Log:
(pedronis, arre) Add read_frame_place().
Modified: pypy/dist/pypy/jit/codegen/i386/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/i386/rgenop.py Tue Jan 30 14:13:12 2007
@@ -684,6 +684,13 @@
value = cast_whatever_to_int(T, value)
poke_word_into(base + place.get_offset(), value)
+ @staticmethod
+ @specialize.arg(0)
+ def read_frame_place(T, base, place):
+ value = peek_word_at(base + place.get_offset())
+ return cast_int_to_whatever(T, value)
+
+
global_rgenop = RI386GenOp()
RI386GenOp.constPrebuiltGlobal = global_rgenop.genconst
Modified: pypy/dist/pypy/jit/codegen/llgraph/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llgraph/rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/llgraph/rgenop.py Tue Jan 30 14:13:12 2007
@@ -429,6 +429,11 @@
def write_frame_place(T, base, place, value):
llimpl.write_frame_var(base, place.info, 0, value)
+ @staticmethod
+ @specialize.arg(0)
+ def read_frame_place(T, base, place):
+ return llimpl.read_frame_var(T, base, place.info, 0)
+
@staticmethod
def get_python_callable(FUNC, gv):
Modified: pypy/dist/pypy/jit/codegen/llvm/test/test_rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llvm/test/test_rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/llvm/test/test_rgenop.py Tue Jan 30 14:13:12 2007
@@ -30,3 +30,5 @@
test_read_frame_var_compile = skip
test_write_frame_place_direct = skip
test_write_frame_place_compile = skip
+ test_read_frame_place_direct = skip
+ test_read_frame_place_compile = skip
Modified: pypy/dist/pypy/jit/codegen/model.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/model.py (original)
+++ pypy/dist/pypy/jit/codegen/model.py Tue Jan 30 14:13:12 2007
@@ -336,6 +336,13 @@
# 'base' is the frame stack pointer captured by the operation
# generated by genop_get_frame_base()."""
+ #@staticmethod
+ #@specialize.arg(0)
+ #def read_frame_place(T, base, place):
+ # """Read from a place in the stack frame of a caller. The
+ # 'base' is the frame stack pointer captured by the operation
+ # generated by genop_get_frame_base()."""
+
@staticmethod
def get_python_callable(FUNC, gv):
"""NOT_RPYTHON
Modified: pypy/dist/pypy/jit/codegen/ppc/test/test_rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/test/test_rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/ppc/test/test_rgenop.py Tue Jan 30 14:13:12 2007
@@ -19,6 +19,9 @@
def test_read_frame_var_compile(self): py.test.skip("in-progress")
def test_write_frame_place_direct(self): py.test.skip("in-progress")
def test_write_frame_place_compile(self): py.test.skip("in-progress")
+ def test_read_frame_place_direct(self): py.test.skip("in-progress")
+ def test_read_frame_place_compile(self): py.test.skip("in-progress")
+
class TestRPPCGenopNoRegs(TestRPPCGenop):
RGenOp = FewRegisters
Modified: pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/test/rgenop_tests.py (original)
+++ pypy/dist/pypy/jit/codegen/test/rgenop_tests.py Tue Jan 30 14:13:12 2007
@@ -703,6 +703,48 @@
return write_frame_place_runner
+class FramePlaceReader:
+ FUNC = lltype.Ptr(lltype.FuncType([llmemory.Address], lltype.Signed))
+ def __init__(self, RGenOp):
+ def reader(base):
+ return RGenOp.read_frame_place(lltype.Signed, base,
+ self.place)
+ self.reader = reader
+ def get_reader(self, place):
+ self.place = place
+ return llhelper(self.FUNC, self.reader)
+
+def make_read_frame_place(rgenop, get_reader):
+ signed_kind = rgenop.kindToken(lltype.Signed)
+ sigtoken = rgenop.sigToken(FUNC)
+ readertoken = rgenop.sigToken(FramePlaceReader.FUNC.TO)
+
+ builder, gv_f, [gv_x] = rgenop.newgraph(sigtoken, "f")
+ builder.start_writing()
+
+ place = builder.alloc_frame_place(signed_kind,
+ rgenop.genconst(42))
+ gv_base = builder.genop_get_frame_base()
+ gv_reader = rgenop.constPrebuiltGlobal(get_reader(place))
+ gv_z = builder.genop_call(readertoken, gv_reader, [gv_base])
+ builder.finish_and_return(sigtoken, gv_z)
+ builder.end()
+
+ return gv_f
+
+def get_read_frame_place_runner(RGenOp):
+ fpr = FramePlaceReader(RGenOp)
+
+ def read_frame_place_runner(x):
+ rgenop = RGenOp()
+ gv_f = make_read_frame_place(rgenop, fpr.get_reader)
+ fn = gv_f.revealconst(lltype.Ptr(FUNC))
+ res = fn(x)
+ keepalive_until_here(rgenop) # to keep the code blocks alive
+ return res
+ return read_frame_place_runner
+
+
class AbstractRGenOpTests(test_boehm.AbstractGCTestClass):
RGenOp = None
@@ -1280,6 +1322,24 @@
res = fn(606)
assert res == 4242
+ def test_read_frame_place_direct(self):
+ def get_reader(place):
+ fpr = FramePlaceReader(self.RGenOp)
+ fpr.place = place
+ reader_ptr = self.directtesthelper(fpr.FUNC, fpr.reader)
+ return reader_ptr
+
+ rgenop = self.RGenOp()
+ gv_callable = make_read_frame_place(rgenop, get_reader)
+ fnptr = self.cast(gv_callable, 1)
+ res = fnptr(-1)
+ assert res == 42
+
+ def test_read_frame_place_compile(self):
+ fn = self.compile(get_read_frame_place_runner(self.RGenOp), [int])
+ res = fn(-1)
+ assert res == 42
+
def test_unaliasing_variables_direct(self):
# def f(x, y):
# if x:
More information about the pypy-svn
mailing list