Author: Brian Kearns <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit