[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