[pypy-svn] r68094 - in pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport: . test
arigo at codespeak.net
arigo at codespeak.net
Thu Oct 1 12:46:42 CEST 2009
Author: arigo
Date: Thu Oct 1 12:46:42 2009
New Revision: 68094
Modified:
pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py
pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/symbolic.py
pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_runner.py
Log:
Reimplement get/set of fields and array items
to also support floats.
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py Thu Oct 1 12:46:42 2009
@@ -206,7 +206,8 @@
ofs = fielddescr.offset
size = fielddescr.get_field_size(self.translate_support_code)
ptr = fielddescr.is_pointer_field()
- return ofs, size, ptr
+ float = fielddescr.is_float_field()
+ return ofs, size, ptr, float
unpack_fielddescr._always_inline_ = True
def arraydescrof(self, A):
@@ -217,7 +218,8 @@
ofs = arraydescr.get_base_size(self.translate_support_code)
size = arraydescr.get_item_size(self.translate_support_code)
ptr = arraydescr.is_array_of_pointers()
- return ofs, size, ptr
+ float = arraydescr.is_array_of_floats()
+ return ofs, size, ptr, float
unpack_arraydescr._always_inline_ = True
def calldescrof(self, FUNC, ARGS, RESULT):
@@ -247,40 +249,66 @@
def do_getarrayitem_gc(self, arraybox, indexbox, arraydescr):
itemindex = indexbox.getint()
gcref = arraybox.getref_base()
- ofs, size, ptr = self.unpack_arraydescr(arraydescr)
+ ofs, size, ptr, float = self.unpack_arraydescr(arraydescr)
+ # --- start of GC unsafe code (no GC operation!) ---
+ items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+ #
+ if ptr:
+ items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
+ pval = self._cast_int_to_gcref(items[itemindex])
+ # --- end of GC unsafe code ---
+ return BoxPtr(pval)
+ #
+ if float:
+ items = rffi.cast(rffi.CArrayPtr(lltype.Float), items)
+ fval = items[itemindex]
+ # --- end of GC unsafe code ---
+ return BoxFloat(fval)
#
for TYPE, itemsize in unroll_basic_sizes:
if size == itemsize:
- val = (rffi.cast(rffi.CArrayPtr(TYPE), gcref)
- [ofs/itemsize + itemindex])
- val = rffi.cast(lltype.Signed, val)
- break
+ items = rffi.cast(rffi.CArrayPtr(TYPE), items)
+ val = items[itemindex]
+ # --- end of GC unsafe code ---
+ return BoxInt(rffi.cast(lltype.Signed, val))
else:
raise NotImplementedError("size = %d" % size)
- if ptr:
- return BoxPtr(self._cast_int_to_gcref(val))
- else:
- return BoxInt(val)
def do_setarrayitem_gc(self, arraybox, indexbox, vbox, arraydescr):
itemindex = indexbox.getint()
gcref = arraybox.getref_base()
- ofs, size, ptr = self.unpack_arraydescr(arraydescr)
+ ofs, size, ptr, float = self.unpack_arraydescr(arraydescr)
#
if ptr:
vboxptr = vbox.getref_base()
self.gc_ll_descr.do_write_barrier(gcref, vboxptr)
- a = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)
- a[ofs/WORD + itemindex] = self.cast_gcref_to_int(vboxptr)
+ # --- start of GC unsafe code (no GC operation!) ---
+ items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+ items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
+ items[itemindex] = self.cast_gcref_to_int(vboxptr)
+ # --- end of GC unsafe code ---
+ return
+ #
+ if float:
+ fval = vbox.getfloat()
+ # --- start of GC unsafe code (no GC operation!) ---
+ items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+ items = rffi.cast(rffi.CArrayPtr(lltype.Float), items)
+ items[itemindex] = fval
+ # --- end of GC unsafe code ---
+ return
+ #
+ val = vbox.getint()
+ for TYPE, itemsize in unroll_basic_sizes:
+ if size == itemsize:
+ # --- start of GC unsafe code (no GC operation!) ---
+ items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+ items = rffi.cast(rffi.CArrayPtr(TYPE), items)
+ items[itemindex] = rffi.cast(TYPE, val)
+ # --- end of GC unsafe code ---
+ return
else:
- v = vbox.getint()
- for TYPE, itemsize in unroll_basic_sizes:
- if size == itemsize:
- a = rffi.cast(rffi.CArrayPtr(TYPE), gcref)
- a[ofs/itemsize + itemindex] = rffi.cast(TYPE, v)
- break
- else:
- raise NotImplementedError("size = %d" % size)
+ raise NotImplementedError("size = %d" % size)
def _new_do_len(TP):
def do_strlen(self, stringbox):
@@ -313,18 +341,29 @@
@specialize.argtype(1)
def _base_do_getfield(self, gcref, fielddescr):
- ofs, size, ptr = self.unpack_fielddescr(fielddescr)
+ ofs, size, ptr, float = self.unpack_fielddescr(fielddescr)
+ # --- start of GC unsafe code (no GC operation!) ---
+ field = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+ #
+ if ptr:
+ pval = rffi.cast(rffi.CArrayPtr(lltype.Signed), field)[0]
+ pval = self._cast_int_to_gcref(pval)
+ # --- end of GC unsafe code ---
+ return BoxPtr(pval)
+ #
+ if float:
+ fval = rffi.cast(rffi.CArrayPtr(lltype.Float), field)[0]
+ # --- end of GC unsafe code ---
+ return BoxFloat(fval)
+ #
for TYPE, itemsize in unroll_basic_sizes:
if size == itemsize:
- val = rffi.cast(rffi.CArrayPtr(TYPE), gcref)[ofs/itemsize]
+ val = rffi.cast(rffi.CArrayPtr(TYPE), field)[0]
+ # --- end of GC unsafe code ---
val = rffi.cast(lltype.Signed, val)
- break
+ return BoxInt(val)
else:
raise NotImplementedError("size = %d" % size)
- if ptr:
- return BoxPtr(self._cast_int_to_gcref(val))
- else:
- return BoxInt(val)
def do_getfield_gc(self, structbox, fielddescr):
gcref = structbox.getref_base()
@@ -335,23 +374,40 @@
@specialize.argtype(1)
def _base_do_setfield(self, gcref, vbox, fielddescr):
- ofs, size, ptr = self.unpack_fielddescr(fielddescr)
+ ofs, size, ptr, float = self.unpack_fielddescr(fielddescr)
+ #
if ptr:
assert lltype.typeOf(gcref) is not lltype.Signed, (
"can't handle write barriers for setfield_raw")
ptr = vbox.getref_base()
self.gc_ll_descr.do_write_barrier(gcref, ptr)
- a = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)
- a[ofs/WORD] = self.cast_gcref_to_int(ptr)
+ # --- start of GC unsafe code (no GC operation!) ---
+ field = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+ field = rffi.cast(rffi.CArrayPtr(lltype.Signed), field)
+ field[0] = self.cast_gcref_to_int(ptr)
+ # --- end of GC unsafe code ---
+ return
+ #
+ if float:
+ fval = vbox.getfloat()
+ # --- start of GC unsafe code (no GC operation!) ---
+ field = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+ field = rffi.cast(rffi.CArrayPtr(lltype.Float), field)
+ field[0] = fval
+ # --- end of GC unsafe code ---
+ return
+ #
+ val = vbox.getint()
+ for TYPE, itemsize in unroll_basic_sizes:
+ if size == itemsize:
+ # --- start of GC unsafe code (no GC operation!) ---
+ field = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+ field = rffi.cast(rffi.CArrayPtr(TYPE), field)
+ field[0] = rffi.cast(TYPE, val)
+ # --- end of GC unsafe code ---
+ return
else:
- v = vbox.getint()
- for TYPE, itemsize in unroll_basic_sizes:
- if size == itemsize:
- v = rffi.cast(TYPE, v)
- rffi.cast(rffi.CArrayPtr(TYPE), gcref)[ofs/itemsize] = v
- break
- else:
- raise NotImplementedError("size = %d" % size)
+ raise NotImplementedError("size = %d" % size)
def do_setfield_gc(self, structbox, vbox, fielddescr):
gcref = structbox.getref_base()
@@ -415,12 +471,11 @@
self.execute_token(executable_token)
# Note: if an exception is set, the rest of the code does a bit of
# nonsense but nothing wrong (the return value should be ignored)
- res = calldescr.get_result_size(self.translate_support_code)
if calldescr.returns_a_pointer():
return BoxPtr(self.get_latest_value_ref(0))
- elif res == self.FLOATSIZE:
+ elif calldescr.returns_a_float():
return BoxFloat(self.get_latest_value_float(0))
- elif res > 0:
+ elif calldescr.get_result_size(self.translate_support_code) > 0:
return BoxInt(self.get_latest_value_int(0))
else:
return None
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/symbolic.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/symbolic.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/symbolic.py Thu Oct 1 12:46:42 2009
@@ -61,8 +61,10 @@
SIZEOF_CHAR = get_size(lltype.Char, False)
SIZEOF_SHORT = get_size(rffi.SHORT, False)
SIZEOF_INT = get_size(rffi.INT, False)
+SIZEOF_FLOAT = get_size(lltype.Float, False)
unroll_basic_sizes = unrolling_iterable([(lltype.Signed, WORD),
(lltype.Char, SIZEOF_CHAR),
(rffi.SHORT, SIZEOF_SHORT),
(rffi.INT, SIZEOF_INT)])
+# does not contain Float ^^^ which must be special-cased
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_runner.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_runner.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_runner.py Thu Oct 1 12:46:42 2009
@@ -7,6 +7,7 @@
pass
class MyLLCPU(AbstractLLCPU):
+ supports_floats = True
def compile_loop(self, inputargs, operations):
py.test.skip("llsupport test: cannot compile operations")
More information about the Pypy-commit
mailing list