[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