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

Reply via email to