[pypy-svn] r36403 - in pypy/dist/pypy/jit/codegen/ppc: . test

mwh at codespeak.net mwh at codespeak.net
Wed Jan 10 12:09:04 CET 2007


Author: mwh
Date: Wed Jan 10 12:09:00 2007
New Revision: 36403

Added:
   pypy/dist/pypy/jit/codegen/ppc/test/test_interp.py
Modified:
   pypy/dist/pypy/jit/codegen/ppc/codebuf.py
   pypy/dist/pypy/jit/codegen/ppc/rgenop.py
Log:
steps on the way to being able to "run" the jit ppc code generation on the
llinterp.


Modified: pypy/dist/pypy/jit/codegen/ppc/codebuf.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/codebuf.py	(original)
+++ pypy/dist/pypy/jit/codegen/ppc/codebuf.py	Wed Jan 10 12:09:00 2007
@@ -50,8 +50,8 @@
 class MachineCodeBlock:
 
     def __init__(self, _data, _size, _pos):
-        self._data = _data
         self._size = _size
+        self._data = _data
         self._pos = _pos
 
     def write(self, data):
@@ -79,19 +79,47 @@
 
 class ExistingCodeBlock(MachineCodeBlock):
     def __init__(self, start, end):
-        self._size = (end-start)/4
-        p = c_void_p(start)
-        self._data = cast(p, POINTER(c_int * self._size))
-        self._pos = 0
+        _size = (end-start)/4
+        _data = cast(c_void_p(start), POINTER(c_int * _size))
+        MachineCodeBlock.__init__(self, _data, _size, 0)
 
 class OwningMachineCodeBlock(MachineCodeBlock):
+    def __init__(self, size_in_bytes):
+        assert size_in_bytes % 4 == 0
+        res = alloc(size_in_bytes)
+        _size = size_in_bytes/4
+        _data = cast(res, POINTER(c_int * _size))
+        MachineCodeBlock.__init__(self, _data, _size, 0)
+
     def __del__(self):
         free(cast(self._data, PTR), self._size * 4)
 
-def new_block(size_in_bytes):
-    assert size_in_bytes % 4 == 0
-    res = alloc(size_in_bytes)
-    return OwningMachineCodeBlock(
-        cast(res, POINTER(c_int * (size_in_bytes / 4))),
-        size_in_bytes/4,
-        0)
+# ------------------------------------------------------------
+
+class LLTypeMachineCodeBlock(MachineCodeBlock):
+    class State:
+        pass
+    state = State()
+    state.base = 1
+
+    def __init__(self, map_size):
+        self._size = map_size/4
+        self._pos = 0
+        self._base = LLTypeMachineCodeBlock.state.base
+        LLTypeMachineCodeBlock.state.base += 2 * map_size
+
+    def write(self, data):
+        if self._pos + 1 > self._size:
+            raise CodeBlockOverflow
+        self._pos += 1
+
+    def tell(self):
+        return self._base + 4 * self._pos
+
+    def reserve(self, _size):
+        return LLTypeMachineCodeBlock(_size)
+
+class LLTypeExistingCodeBlock(LLTypeMachineCodeBlock):
+    def __init__(self, start, end):
+        _size = (end-start)
+        LLTypeMachineCodeBlock.__init__(self, _size)

Modified: pypy/dist/pypy/jit/codegen/ppc/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/ppc/rgenop.py	Wed Jan 10 12:09:00 2007
@@ -424,7 +424,7 @@
         if self.final_jump_addr != 0:
             mc = self.rgenop.open_mc()
             target = mc.tell()
-            self.asm.mc = codebuf.ExistingCodeBlock(self.final_jump_addr, self.final_jump_addr+8)
+            self.asm.mc = self.rgenop.ExistingCodeBlock(self.final_jump_addr, self.final_jump_addr+8)
             self.asm.load_word(rSCRATCH, target)
             self.asm.mc = mc
             self.emit_stack_adjustment()
@@ -438,7 +438,7 @@
     def maybe_patch_start_here(self):
         if self.patch_start_here:
             mc = self.asm.mc
-            self.asm.mc = codebuf.ExistingCodeBlock(self.patch_start_here, self.patch_start_here+8)
+            self.asm.mc = self.rgenop.ExistingCodeBlock(self.patch_start_here, self.patch_start_here+8)
             self.asm.load_word(rSCRATCH, mc.tell())
             self.asm.mc = mc
             self.patch_start_here = 0
@@ -573,16 +573,10 @@
             return
         #print "patch_stack_adjustment at:", self.stack_adj_addr, newsize
         # we build an addi instruction by hand here
-        opcode = 14 << 26
-        rD = rSCRATCH << 21
-        rA = rFP << 16
-        # if we decided to use r0 as the frame pointer, this would
-        # emit addi rFOO, r0, SIMM which would just load SIMM into
-        # rFOO and be "unlikely" to work
-        assert rA != 0
-        SIMM = (-newsize) & 0xFFFF
-        p_instruction = cast(c_void_p(self.stack_adj_addr), POINTER(c_int*1))
-        p_instruction.contents[0] = opcode | rD | rA | SIMM
+        mc = self.asm.mc
+        self.asm.mc = self.rgenop.ExistingCodeBlock(self.stack_adj_addr, self.stack_adj_addr+4)
+        self.asm.addi(rSCRATCH, rFP, -newsize)
+        self.asm.mc = mc
 
     def op_int_mul(self, gv_x, gv_y):
         gv_result = Var()
@@ -799,11 +793,14 @@
     # ----------------------------------------------------------------
     # ppc-specific interface:
 
+    MachineCodeBlock = codebuf.OwningMachineCodeBlock
+    ExistingCodeBlock = codebuf.ExistingCodeBlock
+
     def open_mc(self):
         if self.mcs:
             return self.mcs.pop()
         else:
-            return codebuf.new_block(65536)   # XXX supposed infinite for now
+            return self.MachineCodeBlock(65536)   # XXX supposed infinite for now
 
     def close_mc(self, mc):
 ##         from pypy.translator.asm.ppcgen.asmfunc import get_ppcgen

Added: pypy/dist/pypy/jit/codegen/ppc/test/test_interp.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/jit/codegen/ppc/test/test_interp.py	Wed Jan 10 12:09:00 2007
@@ -0,0 +1,21 @@
+from pypy.jit.codegen.ppc import codebuf, rgenop
+from pypy.rpython.lltypesystem import lltype
+from pypy.jit.codegen.test import rgenop_tests
+from pypy.rpython.test.test_llinterp import interpret
+from pypy.jit.codegen.ppc.test import test_rgenop
+
+class LLTypeRGenOp(rgenop.RPPCGenOp):
+    MachineCodeBlock = codebuf.LLTypeMachineCodeBlock
+    ExistingCodeBlock = codebuf.LLTypeExistingCodeBlock
+
+def test_simple():
+    FUNC = lltype.FuncType([lltype.Signed], lltype.Signed)
+    def f(n):
+        rgenop = LLTypeRGenOp()
+        sigtoken = rgenop.sigToken(FUNC)
+        builder, gv_add_one, [gv_x] = rgenop.newgraph(sigtoken, "adder")
+        gv_result = builder.genop2("int_add", gv_x, rgenop.genconst(n))
+        builder.finish_and_return(sigtoken, gv_result)
+        builder.end()
+    res = interpret(f, [5], policy=rgenop_tests.GENOP_POLICY)
+    # just testing that this didn't crash



More information about the Pypy-commit mailing list