Author: Brian Kearns <bdkea...@gmail.com> Branch: Changeset: r69296:b9b994201abe Date: 2014-02-23 15:45 -0500 http://bitbucket.org/pypy/pypy/changeset/b9b994201abe/
Log: specify unaligned accesses in micronumpy diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py --- a/pypy/module/micronumpy/types.py +++ b/pypy/module/micronumpy/types.py @@ -9,8 +9,8 @@ from pypy.objspace.std.floatobject import float2string from pypy.objspace.std.complexobject import str_format from rpython.rlib import rfloat, clibffi, rcomplex -from rpython.rlib.rawstorage import (alloc_raw_storage, raw_storage_setitem, - raw_storage_getitem) +from rpython.rlib.rawstorage import (alloc_raw_storage, + raw_storage_getitem_unaligned, raw_storage_setitem_unaligned) from rpython.rlib.objectmodel import specialize from rpython.rlib.rarithmetic import widen, byteswap, r_ulonglong, most_neg_value_of, LONG_BIT from rpython.rtyper.lltypesystem import lltype, rffi @@ -174,7 +174,7 @@ raise NotImplementedError def _read(self, storage, i, offset): - res = raw_storage_getitem(self.T, storage, i + offset) + res = raw_storage_getitem_unaligned(self.T, storage, i + offset) if not self.native: res = byteswap(res) return res @@ -182,7 +182,7 @@ def _write(self, storage, i, offset, value): if not self.native: value = byteswap(value) - raw_storage_setitem(storage, i + offset, value) + raw_storage_setitem_unaligned(storage, i + offset, value) def read(self, arr, i, offset, dtype=None): return self.box(self._read(arr.storage, i, offset)) @@ -990,7 +990,7 @@ return self.box(float_unpack(r_ulonglong(swapped), 2)) def _read(self, storage, i, offset): - hbits = raw_storage_getitem(self._STORAGE_T, storage, i + offset) + hbits = raw_storage_getitem_unaligned(self._STORAGE_T, storage, i + offset) if not self.native: hbits = byteswap(hbits) return float_unpack(r_ulonglong(hbits), 2) @@ -1003,7 +1003,7 @@ hbits = rffi.cast(self._STORAGE_T, hbits) if not self.native: hbits = byteswap(hbits) - raw_storage_setitem(storage, i + offset, hbits) + raw_storage_setitem_unaligned(storage, i + offset, hbits) class Float32(BaseType, Float): T = rffi.FLOAT @@ -1120,8 +1120,8 @@ return real, imag def _read(self, storage, i, offset): - real = raw_storage_getitem(self.T, storage, i + offset) - imag = raw_storage_getitem(self.T, storage, i + offset + rffi.sizeof(self.T)) + real = raw_storage_getitem_unaligned(self.T, storage, i + offset) + imag = raw_storage_getitem_unaligned(self.T, storage, i + offset + rffi.sizeof(self.T)) if not self.native: real = byteswap(real) imag = byteswap(imag) @@ -1136,8 +1136,8 @@ if not self.native: real = byteswap(real) imag = byteswap(imag) - raw_storage_setitem(storage, i + offset, real) - raw_storage_setitem(storage, i + offset + rffi.sizeof(self.T), imag) + raw_storage_setitem_unaligned(storage, i + offset, real) + raw_storage_setitem_unaligned(storage, i + offset + rffi.sizeof(self.T), imag) def store(self, arr, i, offset, box): self._write(arr.storage, i, offset, self.unbox(box)) diff --git a/rpython/rlib/rawstorage.py b/rpython/rlib/rawstorage.py --- a/rpython/rlib/rawstorage.py +++ b/rpython/rlib/rawstorage.py @@ -1,4 +1,4 @@ - +from rpython.rlib.objectmodel import we_are_translated from rpython.rtyper.extregistry import ExtRegistryEntry from rpython.rtyper.lltypesystem import lltype, rffi, llmemory from rpython.annotator import model as annmodel @@ -19,12 +19,21 @@ def raw_storage_getitem(TP, storage, index): "NOT_RPYTHON" _check_alignment(TP, index) + return raw_storage_getitem_unchecked(TP, storage, index) + +def raw_storage_getitem_unchecked(TP, storage, index): + "NOT_RPYTHON" return rffi.cast(rffi.CArrayPtr(TP), rffi.ptradd(storage, index))[0] def raw_storage_setitem(storage, index, item): "NOT_RPYTHON" TP = lltype.typeOf(item) _check_alignment(TP, index) + raw_storage_setitem_unchecked(storage, index, item) + +def raw_storage_setitem_unchecked(storage, index, item): + "NOT_RPYTHON" + TP = lltype.typeOf(item) rffi.cast(rffi.CArrayPtr(TP), rffi.ptradd(storage, index))[0] = item @specialize.arg(1) @@ -68,10 +77,16 @@ @specialize.ll() def raw_storage_getitem_unaligned(TP, storage, index): if misaligned_is_fine: - return raw_storage_getitem(TP, storage, index) + if we_are_translated(): + return raw_storage_getitem(TP, storage, index) + else: + return raw_storage_getitem_unchecked(TP, storage, index) mask = _get_alignment_mask(TP) if (index & mask) == 0: - return raw_storage_getitem(TP, storage, index) + if we_are_translated(): + return raw_storage_getitem(TP, storage, index) + else: + return raw_storage_getitem_unchecked(TP, storage, index) ptr = rffi.ptradd(storage, index) with lltype.scoped_alloc(rffi.CArray(TP), 1) as s_array: rffi.c_memcpy(rffi.cast(rffi.VOIDP, s_array), @@ -82,12 +97,18 @@ @specialize.ll() def raw_storage_setitem_unaligned(storage, index, item): if misaligned_is_fine: - raw_storage_setitem(storage, index, item) + if we_are_translated(): + raw_storage_setitem(storage, index, item) + else: + raw_storage_setitem_unchecked(storage, index, item) return TP = lltype.typeOf(item) mask = _get_alignment_mask(TP) if (index & mask) == 0: - raw_storage_setitem(storage, index, item) + if we_are_translated(): + raw_storage_setitem(storage, index, item) + else: + raw_storage_setitem_unchecked(storage, index, item) return ptr = rffi.ptradd(storage, index) with lltype.scoped_alloc(rffi.CArray(TP), 1) as s_array: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit