Author: Armin Rigo <ar...@tunes.org> Branch: stm-jit Changeset: r56587:f738a0f4c9ef Date: 2012-08-05 17:00 +0200 http://bitbucket.org/pypy/pypy/changeset/f738a0f4c9ef/
Log: finish llmodel support. XXX refactor... diff --git a/pypy/jit/backend/llsupport/llmodel.py b/pypy/jit/backend/llsupport/llmodel.py --- a/pypy/jit/backend/llsupport/llmodel.py +++ b/pypy/jit/backend/llsupport/llmodel.py @@ -314,7 +314,9 @@ return rffi.cast(rffi.CArrayPtr(lltype.Signed), array)[ofs/WORD] @specialize.argtype(2) - def bh_getarrayitem_gc_i(self, arraydescr, gcref, itemindex): + def _base_getarrayitem_i(self, arraydescr, gcref, itemindex): + # XXXXXXXXXXXXXXXXXX refactor this mess with + # introducing instead raw_load/gc_load operations ofs, size, sign = self.unpack_arraydescr_size(arraydescr) # --- start of GC unsafe code (no GC operation!) --- items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs) @@ -333,7 +335,7 @@ else: raise NotImplementedError("size = %d" % size) - def bh_getarrayitem_gc_r(self, arraydescr, gcref, itemindex): + def _base_getarrayitem_r(self, arraydescr, gcref, itemindex): ofs = self.unpack_arraydescr(arraydescr) # --- start of GC unsafe code (no GC operation!) --- items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs) @@ -343,7 +345,7 @@ return pval @specialize.argtype(2) - def bh_getarrayitem_gc_f(self, arraydescr, gcref, itemindex): + def _base_getarrayitem_f(self, arraydescr, gcref, itemindex): ofs = self.unpack_arraydescr(arraydescr) # --- start of GC unsafe code (no GC operation!) --- items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs) @@ -353,7 +355,7 @@ return fval @specialize.argtype(2) - def bh_setarrayitem_gc_i(self, arraydescr, gcref, itemindex, newvalue): + def _base_setarrayitem_i(self, arraydescr, gcref, itemindex, newvalue): ofs, size, sign = self.unpack_arraydescr_size(arraydescr) # --- start of GC unsafe code (no GC operation!) --- items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs) @@ -366,7 +368,7 @@ else: raise NotImplementedError("size = %d" % size) - def bh_setarrayitem_gc_r(self, arraydescr, gcref, itemindex, newvalue): + def _base_setarrayitem_r(self, arraydescr, gcref, itemindex, newvalue): ofs = self.unpack_arraydescr(arraydescr) self.gc_ll_descr.do_write_barrier(gcref, newvalue) # --- start of GC unsafe code (no GC operation!) --- @@ -376,7 +378,7 @@ # --- end of GC unsafe code --- @specialize.argtype(2) - def bh_setarrayitem_gc_f(self, arraydescr, gcref, itemindex, newvalue): + def _base_setarrayitem_f(self, arraydescr, gcref, itemindex, newvalue): ofs = self.unpack_arraydescr(arraydescr) # --- start of GC unsafe code (no GC operation!) --- items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs) @@ -384,11 +386,75 @@ items[itemindex] = newvalue # --- end of GC unsafe code --- - bh_setarrayitem_raw_i = bh_setarrayitem_gc_i - bh_setarrayitem_raw_f = bh_setarrayitem_gc_f + def bh_setarrayitem_gc_i(self, arraydescr, gcref, itemindex, newvalue): + if not self.gc_ll_descr.stm: + self._base_setarrayitem_i(arraydescr, gcref, itemindex, newvalue) + else: + ofs, size, sign = self.unpack_arraydescr_size(arraydescr) + for TYPE, _, itemsize in unroll_basic_sizes: + if size == itemsize: + ofs += itemsize * itemindex + llop.stm_gc_store(lltype.Void, gcref, ofs, + rffi.cast(TYPE, newvalue)) + return + else: + raise NotImplementedError("size = %d" % size) - bh_getarrayitem_raw_i = bh_getarrayitem_gc_i - bh_getarrayitem_raw_f = bh_getarrayitem_gc_f + def bh_setarrayitem_gc_r(self, arraydescr, gcref, itemindex, newvalue): + if not self.gc_ll_descr.stm: + self._base_setarrayitem_r(arraydescr, gcref, itemindex, newvalue) + else: + ofs = self.unpack_arraydescr(arraydescr) + ofs += llmemory.sizeof(llmemory.GCREF) * itemindex + llop.stm_gc_store(lltype.Void, gcref, ofs, newvalue) + + def bh_setarrayitem_gc_f(self, arraydescr, gcref, itemindex, newvalue): + if not self.gc_ll_descr.stm: + self._base_setarrayitem_f(arraydescr, gcref, itemindex, newvalue) + else: + ofs = self.unpack_arraydescr(arraydescr) + ofs += llmemory.sizeof(longlong.FLOATSTORAGE) * itemindex + llop.stm_gc_store(lltype.Void, gcref, ofs, newvalue) + + bh_setarrayitem_raw_i = _base_setarrayitem_i + bh_setarrayitem_raw_f = _base_setarrayitem_f + + def bh_getarrayitem_gc_i(self, arraydescr, gcref, itemindex): + if not self.gc_ll_descr.stm: + return self._base_getarrayitem_i(arraydescr, gcref, itemindex) + else: + ofs, size, sign = self.unpack_arraydescr_size(arraydescr) + for STYPE, UTYPE, itemsize in unroll_basic_sizes: + if size == itemsize: + ofs += itemsize * itemindex + if sign: + val = llop.stm_gc_load(STYPE, gcref, ofs) + val = rffi.cast(lltype.Signed, val) + else: + val = llop.stm_gc_load(UTYPE, gcref, ofs) + val = rffi.cast(lltype.Signed, val) + return val + else: + raise NotImplementedError("size = %d" % size) + + def bh_getarrayitem_gc_r(self, arraydescr, gcref, itemindex): + if not self.gc_ll_descr.stm: + return self._base_getarrayitem_r(arraydescr, gcref, itemindex) + else: + ofs = self.unpack_arraydescr(arraydescr) + ofs += llmemory.sizeof(llmemory.GCREF) * itemindex + return llop.stm_gc_load(llmemory.GCREF, gcref, ofs) + + def bh_getarrayitem_gc_f(self, arraydescr, gcref, itemindex): + if not self.gc_ll_descr.stm: + return self._base_getarrayitem_f(arraydescr, gcref, itemindex) + else: + ofs = self.unpack_arraydescr(arraydescr) + ofs += llmemory.sizeof(longlong.FLOATSTORAGE) * itemindex + return llop.stm_gc_load(longlong.FLOATSTORAGE, gcref, ofs) + + bh_getarrayitem_raw_i = _base_getarrayitem_i + bh_getarrayitem_raw_f = _base_getarrayitem_f def bh_getinteriorfield_gc_i(self, gcref, itemindex, descr): assert isinstance(descr, InteriorFieldDescr) @@ -398,6 +464,19 @@ fieldsize = descr.fielddescr.field_size sign = descr.fielddescr.is_field_signed() fullofs = itemindex * size + ofs + # + if self.gc_ll_descr.stm: + for STYPE, UTYPE, itemsize in unroll_basic_sizes: + if fieldsize == itemsize: + if sign: + val = llop.stm_gc_load(STYPE, gcref, fullofs) + val = rffi.cast(lltype.Signed, val) + else: + val = llop.stm_gc_load(UTYPE, gcref, fullofs) + val = rffi.cast(lltype.Signed, val) + return val + else: + raise NotImplementedError("size = %d" % size) # --- start of GC unsafe code (no GC operation!) --- items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), fullofs) for STYPE, UTYPE, itemsize in unroll_basic_sizes: @@ -419,10 +498,12 @@ assert isinstance(descr, InteriorFieldDescr) arraydescr = descr.arraydescr ofs, size, _ = self.unpack_arraydescr_size(arraydescr) - ofs += descr.fielddescr.offset + ofs += descr.fielddescr.offset + size * itemindex + # + if self.gc_ll_descr.stm: + return llop.stm_gc_load(llmemory.GCREF, gcref, ofs) # --- start of GC unsafe code (no GC operation!) --- - items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs + - size * itemindex) + items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs) items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items) pval = self._cast_int_to_gcref(items[0]) # --- end of GC unsafe code --- @@ -432,10 +513,12 @@ assert isinstance(descr, InteriorFieldDescr) arraydescr = descr.arraydescr ofs, size, _ = self.unpack_arraydescr_size(arraydescr) - ofs += descr.fielddescr.offset + ofs += descr.fielddescr.offset + size * itemindex + # + if self.gc_ll_descr.stm: + return llop.stm_gc_load(longlong.FLOATSTORAGE, gcref, ofs) # --- start of GC unsafe code (no GC operation!) --- - items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs + - size * itemindex) + items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs) items = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), items) fval = items[0] # --- end of GC unsafe code --- @@ -448,6 +531,15 @@ ofs += descr.fielddescr.offset fieldsize = descr.fielddescr.field_size ofs = itemindex * size + ofs + # + if self.gc_ll_descr.stm: + for TYPE, _, itemsize in unroll_basic_sizes: + if fieldsize == itemsize: + llop.stm_gc_store(lltype.Void, gcref, ofs, + rffi.cast(TYPE, value)) + return + else: + raise NotImplementedError("size = %d" % fieldsize) # --- start of GC unsafe code (no GC operation!) --- items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs) for TYPE, _, itemsize in unroll_basic_sizes: @@ -463,11 +555,15 @@ assert isinstance(descr, InteriorFieldDescr) arraydescr = descr.arraydescr ofs, size, _ = self.unpack_arraydescr_size(arraydescr) - ofs += descr.fielddescr.offset + ofs += descr.fielddescr.offset + size * itemindex + # + if self.gc_ll_descr.stm: + llop.stm_gc_store(llmemory.GCREF, gcref, ofs, newvalue) + return + # self.gc_ll_descr.do_write_barrier(gcref, newvalue) # --- start of GC unsafe code (no GC operation!) --- - items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), - ofs + size * itemindex) + items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs) items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items) items[0] = self.cast_gcref_to_int(newvalue) # --- end of GC unsafe code --- @@ -476,10 +572,13 @@ assert isinstance(descr, InteriorFieldDescr) arraydescr = descr.arraydescr ofs, size, _ = self.unpack_arraydescr_size(arraydescr) - ofs += descr.fielddescr.offset + ofs += descr.fielddescr.offset + size * itemindex + # + if self.gc_ll_descr.stm: + llop.stm_gc_store(longlong.FLOATSTORAGE, gcref, ofs, newvalue) + return # --- start of GC unsafe code (no GC operation!) --- - items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), - ofs + size * itemindex) + items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs) items = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), items) items[0] = newvalue # --- end of GC unsafe code --- @@ -548,9 +647,12 @@ for STYPE, UTYPE, itemsize in unroll_basic_sizes: if size == itemsize: if sign: - return llop.stm_gc_load(STYPE, struct, ofs) + val = llop.stm_gc_load(STYPE, struct, ofs) + val = rffi.cast(lltype.Signed, val) else: - return llop.stm_gc_load(UTYPE, struct, ofs) + val = llop.stm_gc_load(UTYPE, struct, ofs) + val = rffi.cast(lltype.Signed, val) + return val else: raise NotImplementedError("size = %d" % size) @@ -569,7 +671,6 @@ return llop.stm_gc_load(longlong.FLOATSTORAGE, struct, ofs) bh_getfield_raw_i = _base_do_getfield_i - bh_getfield_raw_r = _base_do_getfield_r bh_getfield_raw_f = _base_do_getfield_f @specialize.argtype(1) @@ -586,11 +687,8 @@ else: raise NotImplementedError("size = %d" % size) - @specialize.argtype(1) def _base_do_setfield_r(self, struct, fielddescr, newvalue): ofs = self.unpack_fielddescr(fielddescr) - assert lltype.typeOf(struct) is not lltype.Signed, ( - "can't handle write barriers for setfield_raw") self.gc_ll_descr.do_write_barrier(struct, newvalue) # --- start of GC unsafe code (no GC operation!) --- fieldptr = rffi.ptradd(rffi.cast(rffi.CCHARP, struct), ofs) @@ -635,7 +733,6 @@ llop.stm_gc_store(lltype.Void, struct, ofs, newvalue) bh_setfield_raw_i = _base_do_setfield_i - bh_setfield_raw_r = _base_do_setfield_r bh_setfield_raw_f = _base_do_setfield_f def bh_new(self, sizedescr): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit