[pypy-svn] r74156 - in pypy/branch/blackhole-improvement/pypy/jit: backend backend/llgraph codewriter codewriter/test metainterp

arigo at codespeak.net arigo at codespeak.net
Wed Apr 28 13:13:41 CEST 2010


Author: arigo
Date: Wed Apr 28 13:13:39 2010
New Revision: 74156

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
   pypy/branch/blackhole-improvement/pypy/jit/backend/model.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
Log:
setfield.


Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py	Wed Apr 28 13:13:39 2010
@@ -470,39 +470,63 @@
         assert isinstance(arraydescr, Descr)
         llimpl.do_setarrayitem_gc_ptr(array, index, newvalue)
 
-    def do_setfield_gc(self, structbox, newvaluebox, fielddescr):
+##    def do_setfield_gc(self, structbox, newvaluebox, fielddescr):
+##        assert isinstance(fielddescr, Descr)
+##        struct = structbox.getref_base()
+##        if fielddescr.typeinfo == REF:
+##            newvalue = newvaluebox.getref_base()
+##            llimpl.do_setfield_gc_ptr(struct, fielddescr.ofs, newvalue)
+##        elif fielddescr.typeinfo == INT:
+##            newvalue = newvaluebox.getint()
+##            llimpl.do_setfield_gc_int(struct, fielddescr.ofs, newvalue,
+##                                      self.memo_cast)
+##        elif fielddescr.typeinfo == FLOAT:
+##            newvalue = newvaluebox.getfloat()
+##            llimpl.do_setfield_gc_float(struct, fielddescr.ofs, newvalue)
+##        else:
+##            raise NotImplementedError
+
+    def bh_setfield_gc_i(self, struct, fielddescr, newvalue):
         assert isinstance(fielddescr, Descr)
-        struct = structbox.getref_base()
-        if fielddescr.typeinfo == REF:
-            newvalue = newvaluebox.getref_base()
-            llimpl.do_setfield_gc_ptr(struct, fielddescr.ofs, newvalue)
-        elif fielddescr.typeinfo == INT:
-            newvalue = newvaluebox.getint()
-            llimpl.do_setfield_gc_int(struct, fielddescr.ofs, newvalue,
-                                      self.memo_cast)
-        elif fielddescr.typeinfo == FLOAT:
-            newvalue = newvaluebox.getfloat()
-            llimpl.do_setfield_gc_float(struct, fielddescr.ofs, newvalue)
-        else:
-            raise NotImplementedError
+        llimpl.do_setfield_gc_int(struct, fielddescr.ofs, newvalue)
+    bh_setfield_gc_c = bh_setfield_gc_i
+    bh_setfield_gc_u = bh_setfield_gc_i
+    def bh_setfield_gc_r(self, struct, fielddescr, newvalue):
+        assert isinstance(fielddescr, Descr)
+        llimpl.do_setfield_gc_ptr(struct, fielddescr.ofs, newvalue)
+    def bh_setfield_gc_f(self, struct, fielddescr, newvalue):
+        assert isinstance(fielddescr, Descr)
+        llimpl.do_setfield_gc_float(struct, fielddescr.ofs, newvalue)
 
-    def do_setfield_raw(self, structbox, newvaluebox, fielddescr):
+##    def do_setfield_raw(self, structbox, newvaluebox, fielddescr):
+##        assert isinstance(fielddescr, Descr)
+##        struct = self.cast_int_to_adr(structbox.getint())
+##        if fielddescr.typeinfo == REF:
+##            newvalue = newvaluebox.getref_base()
+##            llimpl.do_setfield_raw_ptr(struct, fielddescr.ofs, newvalue,
+##                                       self.memo_cast)
+##        elif fielddescr.typeinfo == INT:
+##            newvalue = newvaluebox.getint()
+##            llimpl.do_setfield_raw_int(struct, fielddescr.ofs, newvalue,
+##                                       self.memo_cast)
+##        elif fielddescr.typeinfo == FLOAT:
+##            newvalue = newvaluebox.getfloat()
+##            llimpl.do_setfield_raw_float(struct, fielddescr.ofs, newvalue,
+##                                         self.memo_cast)
+##        else:
+##            raise NotImplementedError
+
+    def bh_setfield_raw_i(self, struct, fielddescr, newvalue):
         assert isinstance(fielddescr, Descr)
-        struct = self.cast_int_to_adr(structbox.getint())
-        if fielddescr.typeinfo == REF:
-            newvalue = newvaluebox.getref_base()
-            llimpl.do_setfield_raw_ptr(struct, fielddescr.ofs, newvalue,
-                                       self.memo_cast)
-        elif fielddescr.typeinfo == INT:
-            newvalue = newvaluebox.getint()
-            llimpl.do_setfield_raw_int(struct, fielddescr.ofs, newvalue,
-                                       self.memo_cast)
-        elif fielddescr.typeinfo == FLOAT:
-            newvalue = newvaluebox.getfloat()
-            llimpl.do_setfield_raw_float(struct, fielddescr.ofs, newvalue,
-                                         self.memo_cast)
-        else:
-            raise NotImplementedError
+        llimpl.do_setfield_raw_int(struct, fielddescr.ofs, newvalue)
+    bh_setfield_raw_c = bh_setfield_raw_i
+    bh_setfield_raw_u = bh_setfield_raw_i
+    def bh_setfield_raw_r(self, struct, fielddescr, newvalue):
+        assert isinstance(fielddescr, Descr)
+        llimpl.do_setfield_raw_ptr(struct, fielddescr.ofs, newvalue)
+    def bh_setfield_raw_f(self, struct, fielddescr, newvalue):
+        assert isinstance(fielddescr, Descr)
+        llimpl.do_setfield_raw_float(struct, fielddescr.ofs, newvalue)
 
     def do_same_as(self, box1):
         return box1.clonebox()

Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/model.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/model.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/model.py	Wed Apr 28 13:13:39 2010
@@ -240,9 +240,31 @@
     def do_setfield_gc(self, structbox, newvaluebox, fielddescr):
         raise NotImplementedError
 
+    def bh_setfield_gc_i(self, struct, fielddescr, newvalue):
+        raise NotImplementedError
+    def bh_setfield_gc_c(self, struct, fielddescr, newvalue):
+        raise NotImplementedError
+    def bh_setfield_gc_u(self, struct, fielddescr, newvalue):
+        raise NotImplementedError
+    def bh_setfield_gc_r(self, struct, fielddescr, newvalue):
+        raise NotImplementedError
+    def bh_setfield_gc_f(self, struct, fielddescr, newvalue):
+        raise NotImplementedError
+
     def do_setfield_raw(self, structbox, newvaluebox, fielddescr):
         raise NotImplementedError
-        
+
+    def bh_setfield_raw_i(self, struct, fielddescr, newvalue):
+        raise NotImplementedError
+    def bh_setfield_raw_c(self, struct, fielddescr, newvalue):
+        raise NotImplementedError
+    def bh_setfield_raw_u(self, struct, fielddescr, newvalue):
+        raise NotImplementedError
+    def bh_setfield_raw_r(self, struct, fielddescr, newvalue):
+        raise NotImplementedError
+    def bh_setfield_raw_f(self, struct, fielddescr, newvalue):
+        raise NotImplementedError
+
     def do_newstr(self, lengthbox):
         raise NotImplementedError
 

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py	Wed Apr 28 13:13:39 2010
@@ -287,7 +287,30 @@
         if self.is_typeptr_getset(op):
             # ignore the operation completely -- instead, it's done by 'new'
             raise NoOp
-        XXX
+        # turn the flow graph 'setfield' operation into our own version
+        [v_inst, c_fieldname, v_value] = op.args
+        RESULT = v_value.concretetype
+        if RESULT is lltype.Void:
+            raise NoOp
+        # check for virtualizable
+        #if self.is_virtualizable_getset(op):
+        #    vinfo = self.codewriter.metainterp_sd.virtualizable_info
+        #    index = vinfo.static_field_to_extra_box[op.args[1].value]
+        #    self.emit('setfield_vable',
+        #              self.var_position(v_inst),
+        #              index,
+        #              self.var_position(v_value))
+        #    return
+        argname = getattr(v_inst.concretetype.TO, '_gckind', 'gc')
+        descr = self.cpu.fielddescrof(v_inst.concretetype.TO,
+                                      c_fieldname.value)
+        if isinstance(RESULT, lltype.Primitive):
+            kind = primitive_type_size[RESULT]
+        else:
+            kind = getkind(RESULT)[0]
+        return SpaceOperation('setfield_%s_%s' % (argname, kind),
+                              [v_inst, descr, v_value],
+                              None)
 
     def is_typeptr_getset(self, op):
         return (op.args[1].value == 'typeptr' and

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py	Wed Apr 28 13:13:39 2010
@@ -181,6 +181,35 @@
     assert op1.args == [v_parent]
     assert op1.result == v_result
 
+def test_setfield():
+    # XXX a more compact encoding would be possible; see test_getfield()
+    S1 = lltype.Struct('S1')
+    S2 = lltype.GcStruct('S2')
+    S  = lltype.GcStruct('S', ('int', lltype.Signed),
+                              ('ps1', lltype.Ptr(S1)),
+                              ('ps2', lltype.Ptr(S2)),
+                              ('flt', lltype.Float),
+                              ('boo', lltype.Bool),
+                              ('chr', lltype.Char),
+                              ('unc', lltype.UniChar))
+    for name, suffix in [('int', 'i'),
+                         ('ps1', 'i'),
+                         ('ps2', 'r'),
+                         ('flt', 'f'),
+                         ('boo', 'c'),
+                         ('chr', 'c'),
+                         ('unc', 'u')]:
+        v_parent = varoftype(lltype.Ptr(S))
+        c_name = Constant(name, lltype.Void)
+        v_newvalue = varoftype(getattr(S, name))
+        op = SpaceOperation('setfield', [v_parent, c_name, v_newvalue],
+                            varoftype(lltype.Void))
+        op1 = Transformer(FakeCPU()).rewrite_operation(op)
+        assert op1.opname == 'setfield_gc_' + suffix
+        fielddescr = ('fielddescr', S, name)
+        assert op1.args == [v_parent, fielddescr, v_newvalue]
+        assert op1.result is None
+
 def test_malloc_new():
     S = lltype.GcStruct('S')
     v = varoftype(lltype.Ptr(S))

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py	Wed Apr 28 13:13:39 2010
@@ -505,6 +505,38 @@
     opimpl_getfield_raw_r_pure = opimpl_getfield_raw_r
     opimpl_getfield_raw_f_pure = opimpl_getfield_raw_f
 
+    @arguments("r", "d", "i")
+    def opimpl_setfield_gc_i(self, struct, fielddescr, newvalue):
+        self.cpu.bh_setfield_gc_i(struct, fielddescr, newvalue)
+    @arguments("r", "d", "i")
+    def opimpl_setfield_gc_c(self, struct, fielddescr, newvalue):
+        self.cpu.bh_setfield_gc_c(struct, fielddescr, newvalue)
+    @arguments("r", "d", "i")
+    def opimpl_setfield_gc_u(self, struct, fielddescr, newvalue):
+        self.cpu.bh_setfield_gc_u(struct, fielddescr, newvalue)
+    @arguments("r", "d", "r")
+    def opimpl_setfield_gc_r(self, struct, fielddescr, newvalue):
+        self.cpu.bh_setfield_gc_r(struct, fielddescr, newvalue)
+    @arguments("r", "d", "f")
+    def opimpl_setfield_gc_f(self, struct, fielddescr, newvalue):
+        self.cpu.bh_setfield_gc_f(struct, fielddescr, newvalue)
+
+    @arguments("r", "d", "i")
+    def opimpl_setfield_raw_i(self, struct, fielddescr, newvalue):
+        self.cpu.bh_setfield_raw_i(struct, fielddescr, newvalue)
+    @arguments("r", "d", "i")
+    def opimpl_setfield_raw_c(self, struct, fielddescr, newvalue):
+        self.cpu.bh_setfield_raw_c(struct, fielddescr, newvalue)
+    @arguments("r", "d", "i")
+    def opimpl_setfield_raw_u(self, struct, fielddescr, newvalue):
+        self.cpu.bh_setfield_raw_u(struct, fielddescr, newvalue)
+    @arguments("r", "d", "r")
+    def opimpl_setfield_raw_r(self, struct, fielddescr, newvalue):
+        self.cpu.bh_setfield_raw_r(struct, fielddescr, newvalue)
+    @arguments("r", "d", "f")
+    def opimpl_setfield_raw_f(self, struct, fielddescr, newvalue):
+        self.cpu.bh_setfield_raw_f(struct, fielddescr, newvalue)
+
     @arguments("d", returns="r")
     def opimpl_new_with_vtable(self, descr):
         return self.cpu.bh_new_with_vtable(descr)



More information about the Pypy-commit mailing list