[pypy-svn] r35464 - in pypy/branch/jit-real-world/pypy/jit: codegen codegen/i386 codegen/i386/test goal
arigo at codespeak.net
arigo at codespeak.net
Fri Dec 8 02:33:23 CET 2006
Author: arigo
Date: Fri Dec 8 02:33:20 2006
New Revision: 35464
Modified:
pypy/branch/jit-real-world/pypy/jit/codegen/graph2rgenop.py
pypy/branch/jit-real-world/pypy/jit/codegen/i386/rgenop.py
pypy/branch/jit-real-world/pypy/jit/codegen/i386/test/test_operation.py
pypy/branch/jit-real-world/pypy/jit/goal/jitstep.py
Log:
- support for 1- and 2-bytes fields in structures
- increase the maximal code buffer size to a usable value for PyPy
Modified: pypy/branch/jit-real-world/pypy/jit/codegen/graph2rgenop.py
==============================================================================
--- pypy/branch/jit-real-world/pypy/jit/codegen/graph2rgenop.py (original)
+++ pypy/branch/jit-real-world/pypy/jit/codegen/graph2rgenop.py Fri Dec 8 02:33:20 2006
@@ -43,6 +43,17 @@
if op.opname == 'malloc':
token = rgenop.allocToken(op.args[0].value)
gv_result = builder.genop_malloc_fixedsize(token)
+ elif op.opname == 'getfield':
+ token = rgenop.fieldToken(op.args[0].concretetype.TO,
+ op.args[1].value)
+ gv_result = builder.genop_getfield(token,
+ var2gv(op.args[0]))
+ elif op.opname == 'setfield':
+ token = rgenop.fieldToken(op.args[0].concretetype.TO,
+ op.args[1].value)
+ gv_result = builder.genop_setfield(token,
+ var2gv(op.args[0]),
+ var2gv(op.args[2]))
elif op.opname == 'malloc_varsize':
token = rgenop.varsizeAllocToken(op.args[0].value)
gv_result = builder.genop_malloc_varsize(token,
Modified: pypy/branch/jit-real-world/pypy/jit/codegen/i386/rgenop.py
==============================================================================
--- pypy/branch/jit-real-world/pypy/jit/codegen/i386/rgenop.py (original)
+++ pypy/branch/jit-real-world/pypy/jit/codegen/i386/rgenop.py Fri Dec 8 02:33:20 2006
@@ -256,18 +256,33 @@
genmethod = getattr(self, 'op_' + opname)
return genmethod(gv_arg1, gv_arg2)
- def genop_getfield(self, offset, gv_ptr):
- # XXX only for int fields
+ def genop_getfield(self, (offset, fieldsize), gv_ptr):
self.mc.MOV(edx, gv_ptr.operand(self))
- return self.returnvar(mem(edx, offset))
+ if fieldsize == WORD:
+ op = mem(edx, offset)
+ else:
+ if fieldsize == 1:
+ op = mem8(edx, offset)
+ else:
+ assert fieldsize == 2
+ op = mem(edx, offset)
+ self.mc.MOVZX(eax, op)
+ op = eax
+ return self.returnvar(op)
- def genop_setfield(self, offset, gv_ptr, gv_value):
- # XXX only for ints for now.
+ def genop_setfield(self, (offset, fieldsize), gv_ptr, gv_value):
self.mc.MOV(eax, gv_value.operand(self))
self.mc.MOV(edx, gv_ptr.operand(self))
- self.mc.MOV(mem(edx, offset), eax)
+ if fieldsize == 1:
+ self.mc.MOV(mem8(edx, offset), al)
+ else:
+ if fieldsize == 2:
+ self.mc.o16() # followed by the MOV below
+ else:
+ assert fieldsize == WORD
+ self.mc.MOV(mem(edx, offset), eax)
- def genop_getsubstruct(self, offset, gv_ptr):
+ def genop_getsubstruct(self, (offset, fieldsize), gv_ptr):
self.mc.MOV(edx, gv_ptr.operand(self))
self.mc.LEA(eax, mem(edx, offset))
return self.returnvar(eax)
@@ -813,13 +828,13 @@
def genop2(self, opname, gv_arg1, gv_arg2):
return dummy_var
- def genop_getfield(self, offset, gv_ptr):
+ def genop_getfield(self, fieldtoken, gv_ptr):
return dummy_var
- def genop_setfield(self, offset, gv_ptr, gv_value):
+ def genop_setfield(self, fieldtoken, gv_ptr, gv_value):
return dummy_var
- def genop_getsubstruct(self, offset, gv_ptr):
+ def genop_getsubstruct(self, fieldtoken, gv_ptr):
return dummy_var
def genop_getarrayitem(self, arraytoken, gv_ptr, gv_index):
@@ -874,6 +889,8 @@
class RI386GenOp(AbstractRGenOp):
from pypy.jit.codegen.i386.codebuf import MachineCodeBlock
+ MC_SIZE = 65536
+
def __init__(self):
self.mcs = [] # machine code blocks where no-one is currently writing
self.keepalive_gc_refs = []
@@ -883,7 +900,8 @@
# XXX think about inserting NOPS for alignment
return self.mcs.pop()
else:
- return self.MachineCodeBlock(65536) # XXX supposed infinite for now
+ # XXX supposed infinite for now
+ return self.MachineCodeBlock(self.MC_SIZE)
def close_mc(self, mc):
# an open 'mc' is ready for receiving code... but it's also ready
@@ -925,7 +943,12 @@
@staticmethod
@specialize.memo()
def fieldToken(T, name):
- return llmemory.offsetof(T, name)
+ FIELD = getattr(T, name)
+ if isinstance(FIELD, lltype.ContainerType):
+ fieldsize = 0 # not useful for getsubstruct
+ else:
+ fieldsize = llmemory.sizeof(FIELD)
+ return (llmemory.offsetof(T, name), fieldsize)
@staticmethod
@specialize.memo()
Modified: pypy/branch/jit-real-world/pypy/jit/codegen/i386/test/test_operation.py
==============================================================================
--- pypy/branch/jit-real-world/pypy/jit/codegen/i386/test/test_operation.py (original)
+++ pypy/branch/jit-real-world/pypy/jit/codegen/i386/test/test_operation.py Fri Dec 8 02:33:20 2006
@@ -9,6 +9,11 @@
from pypy.rlib.rarithmetic import r_uint
from ctypes import cast, c_void_p, CFUNCTYPE, c_int
+def conv(n):
+ if not isinstance(n, int):
+ n = convert_offset_to_int(n)
+ return n
+
class RGenOpPacked(RI386GenOp):
"""Like RI386GenOp, but produces concrete offsets in the tokens
@@ -19,23 +24,22 @@
@staticmethod
@specialize.memo()
def fieldToken(T, name):
- return convert_offset_to_int(RI386GenOp.fieldToken(T, name))
+ return tuple(map(conv, RI386GenOp.fieldToken(T, name)))
@staticmethod
@specialize.memo()
def arrayToken(A):
- return tuple(map(convert_offset_to_int, RI386GenOp.arrayToken(A)))
+ return tuple(map(conv, RI386GenOp.arrayToken(A)))
@staticmethod
@specialize.memo()
def allocToken(T):
- return convert_offset_to_int(RI386GenOp.allocToken(T))
+ return conv(RI386GenOp.allocToken(T))
@staticmethod
@specialize.memo()
def varsizeAllocToken(A):
- return tuple(map(convert_offset_to_int,
- RI386GenOp.varsizeAllocToken(A)))
+ return tuple(map(conv, RI386GenOp.varsizeAllocToken(A)))
class TestBasic:
@@ -175,6 +179,28 @@
for i in range(5):
assert fp(i) == fn(i)
+ def test_char_unichar_fields(self):
+ S = lltype.GcStruct('S', ('a', lltype.Char),
+ ('b', lltype.Char),
+ ('c', lltype.UniChar),
+ ('d', lltype.UniChar),
+ ('e', lltype.Signed))
+ def fn():
+ s = lltype.malloc(S)
+ s.a = 'A'
+ s.b = 'b'
+ s.c = unichr(0x5a6b)
+ s.d = unichr(0x7c8d)
+ s.e = -1612
+ return ((s.a == 'A') +
+ (s.b == 'b') +
+ (s.c == unichr(0x5a6b)) +
+ (s.d == unichr(0x7c8d)) +
+ (s.e == -1612))
+ fp = self.rgen(fn, [])
+ res = fp()
+ assert res == 5
+
def test_unsigned(self):
for fn in [lambda x, y: x + y,
lambda x, y: x - y,
Modified: pypy/branch/jit-real-world/pypy/jit/goal/jitstep.py
==============================================================================
--- pypy/branch/jit-real-world/pypy/jit/goal/jitstep.py (original)
+++ pypy/branch/jit-real-world/pypy/jit/goal/jitstep.py Fri Dec 8 02:33:20 2006
@@ -50,6 +50,7 @@
from pypy.jit.timeshifter.hrtyper import HintRTyper
#from pypy.jit.codegen.llgraph.rgenop import RGenOp
from pypy.jit.codegen.i386.rgenop import RI386GenOp as RGenOp
+ RGenOp.MC_SIZE = 32 * 1024 * 1024 # 32MB - but supposed infinite!
ha = drv.hannotator
t = drv.translator
More information about the Pypy-commit
mailing list