Author: Armin Rigo <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit