[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