Author: Antonio Cuni <anto.c...@gmail.com> Branch: faster-rstruct-2 Changeset: r91260:884703561c51 Date: 2017-05-11 18:50 +0200 http://bitbucket.org/pypy/pypy/changeset/884703561c51/
Log: test and implement gc_store_indexed in the C backend diff --git a/rpython/translator/c/funcgen.py b/rpython/translator/c/funcgen.py --- a/rpython/translator/c/funcgen.py +++ b/rpython/translator/c/funcgen.py @@ -311,7 +311,8 @@ def gen_op(self, op): macro = 'OP_%s' % op.opname.upper() line = None - if op.opname.startswith('gc_') and op.opname != 'gc_load_indexed': + if (op.opname.startswith('gc_') and + op.opname not in ('gc_load_indexed', 'gc_store_indexed')): meth = getattr(self.gcpolicy, macro, None) if meth: line = meth(self, op) @@ -727,6 +728,19 @@ "%(base_ofs)s + %(scale)s * %(index)s))[0];" % locals()) + def OP_GC_STORE_INDEXED(self, op): + addr = self.expr(op.args[0]) + index = self.expr(op.args[1]) + scale = self.expr(op.args[2]) + base_ofs = self.expr(op.args[3]) + value = self.expr(op.args[4]) + TYPE = op.args[4].concretetype + typename = cdecl(self.db.gettype(TYPE).replace('@', '*@'), '') + return ( + "((%(typename)s) (((char *)%(addr)s) + " + "%(base_ofs)s + %(scale)s * %(index)s))[0] = %(value)s;" + % locals()) + def OP_CAST_PRIMITIVE(self, op): TYPE = self.lltypemap(op.result) val = self.expr(op.args[0]) diff --git a/rpython/translator/c/test/test_llop.py b/rpython/translator/c/test/test_llop.py --- a/rpython/translator/c/test/test_llop.py +++ b/rpython/translator/c/test/test_llop.py @@ -1,5 +1,6 @@ from rpython.rtyper.lltypesystem import lltype, llmemory, rffi -from rpython.rtyper.test.test_llop import BaseLLOpTest, str_gc_load +from rpython.rtyper.test.test_llop import (BaseLLOpTest, str_gc_load, + newlist_and_gc_store) from rpython.translator.c.test.test_genc import compile @@ -24,3 +25,22 @@ fn = self.cache[TYPE] x = fn(buf, offset) return lltype.cast_primitive(TYPE, x) + + def newlist_and_gc_store(self, TYPE, value): + if TYPE not in self.cache: + assert isinstance(TYPE, lltype.Primitive) + if TYPE in (lltype.Float, lltype.SingleFloat): + argtype = float + else: + argtype = int + + def llf(value): + value = lltype.cast_primitive(TYPE, value) + lst = newlist_and_gc_store(TYPE, value) + return ''.join(lst) + + fn = compile(llf, [argtype]) + self.cache[TYPE] = fn + # + fn = self.cache[TYPE] + return fn(value) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit