summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/setup_common.py1
-rw-r--r--numpy/core/src/multiarray/common.h17
2 files changed, 8 insertions, 10 deletions
diff --git a/numpy/core/setup_common.py b/numpy/core/setup_common.py
index 4633aef84..bad3607fa 100644
--- a/numpy/core/setup_common.py
+++ b/numpy/core/setup_common.py
@@ -116,7 +116,6 @@ OPTIONAL_INTRINSICS = [("__builtin_isnan", '5.'),
("__builtin_bswap32", '5u'),
("__builtin_bswap64", '5u'),
("__builtin_expect", '5, 0'),
- ("__builtin_ctz", '5'),
("_mm_load_ps", '(float*)0', "xmmintrin.h"), # SSE
("_mm_load_pd", '(double*)0', "emmintrin.h"), # SSE2
]
diff --git a/numpy/core/src/multiarray/common.h b/numpy/core/src/multiarray/common.h
index cc8c81936..5d77170ea 100644
--- a/numpy/core/src/multiarray/common.h
+++ b/numpy/core/src/multiarray/common.h
@@ -137,19 +137,18 @@ npy_memchr(char * haystack, char needle,
}
else {
/* usually find elements to skip path */
-#if (defined HAVE___BUILTIN_CTZ && defined NPY_CPU_HAVE_UNALIGNED_ACCESS)
+#if defined NPY_CPU_HAVE_UNALIGNED_ACCESS
if (needle == 0 && stride == 1) {
- char * const end = haystack + size;
- while (p < end - (size % sizeof(unsigned int))) {
+ /* iterate until last multiple of 4 */
+ char * block_end = haystack + size - (size % sizeof(unsigned int));
+ while (p < block_end) {
unsigned int v = *(unsigned int*)p;
- if (v == 0) {
- p += sizeof(unsigned int);
- continue;
+ if (v != 0) {
+ break;
}
- p += __builtin_ctz(v) / 8;
- *psubloopsize = (p - haystack);
- return p;
+ p += sizeof(unsigned int);
}
+ /* handle rest */
subloopsize = (p - haystack);
}
#endif