[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