summaryrefslogtreecommitdiff
path: root/numpy/core
diff options
context:
space:
mode:
Diffstat (limited to 'numpy/core')
-rw-r--r--numpy/core/src/common/simd/vsx/arithmetic.h2
-rw-r--r--numpy/core/src/common/simd/vsx/operators.h18
2 files changed, 15 insertions, 5 deletions
diff --git a/numpy/core/src/common/simd/vsx/arithmetic.h b/numpy/core/src/common/simd/vsx/arithmetic.h
index 123fcaf92..eaca53620 100644
--- a/numpy/core/src/common/simd/vsx/arithmetic.h
+++ b/numpy/core/src/common/simd/vsx/arithmetic.h
@@ -222,7 +222,7 @@ NPY_FINLINE npyv_u64 npyv_divc_u64(npyv_u64 a, const npyv_u64x3 divisor)
// divide each signed 64-bit element by a precomputed divisor (round towards zero)
NPY_FINLINE npyv_s64 npyv_divc_s64(npyv_s64 a, const npyv_s64x3 divisor)
{
- npyv_b64 overflow = vec_and(vec_cmpeq(a, npyv_setall_s64(-1LL << 63)), (npyv_b64)divisor.val[1]);
+ npyv_b64 overflow = npyv_and_b64(vec_cmpeq(a, npyv_setall_s64(-1LL << 63)), (npyv_b64)divisor.val[1]);
npyv_s64 d = vec_sel(divisor.val[0], npyv_setall_s64(1), overflow);
return vec_div(a, d);
}
diff --git a/numpy/core/src/common/simd/vsx/operators.h b/numpy/core/src/common/simd/vsx/operators.h
index 230610129..23c5d0dbe 100644
--- a/numpy/core/src/common/simd/vsx/operators.h
+++ b/numpy/core/src/common/simd/vsx/operators.h
@@ -44,7 +44,16 @@
/***************************
* Logical
***************************/
+#define NPYV_IMPL_VSX_BIN_CAST(INTRIN, SFX, CAST) \
+ NPY_FINLINE npyv_##SFX npyv_##INTRIN##_##SFX(npyv_##SFX a, npyv_##SFX b) \
+ { return (npyv_##SFX)vec_##INTRIN((CAST)a, (CAST)b); }
+// Up to GCC 6 logical intrinsics don't support bool long long
+#if defined(__GNUC__) && __GNUC__ <= 6
+ #define NPYV_IMPL_VSX_BIN_B64(INTRIN) NPYV_IMPL_VSX_BIN_CAST(INTRIN, b64, npyv_u64)
+#else
+ #define NPYV_IMPL_VSX_BIN_B64(INTRIN) NPYV_IMPL_VSX_BIN_CAST(INTRIN, b64, npyv_b64)
+#endif
// AND
#define npyv_and_u8 vec_and
#define npyv_and_s8 vec_and
@@ -59,7 +68,7 @@
#define npyv_and_b8 vec_and
#define npyv_and_b16 vec_and
#define npyv_and_b32 vec_and
-#define npyv_and_b64 vec_and
+NPYV_IMPL_VSX_BIN_B64(and)
// OR
#define npyv_or_u8 vec_or
@@ -75,7 +84,7 @@
#define npyv_or_b8 vec_or
#define npyv_or_b16 vec_or
#define npyv_or_b32 vec_or
-#define npyv_or_b64 vec_or
+NPYV_IMPL_VSX_BIN_B64(or)
// XOR
#define npyv_xor_u8 vec_xor
@@ -91,7 +100,7 @@
#define npyv_xor_b8 vec_xor
#define npyv_xor_b16 vec_xor
#define npyv_xor_b32 vec_xor
-#define npyv_xor_b64 vec_xor
+NPYV_IMPL_VSX_BIN_B64(xor)
// NOT
// note: we implement npyv_not_b*(boolen types) for internal use*/
@@ -141,7 +150,8 @@ NPY_FINLINE npyv_f64 npyv_not_f64(npyv_f64 a)
#define npyv_cmpeq_f64 vec_cmpeq
// Int Not Equal
-#ifdef NPY_HAVE_VSX3
+#if defined(NPY_HAVE_VSX3) && (!defined(__GNUC__) || defined(vec_cmpne))
+ // vec_cmpne supported by gcc since version 7
#define npyv_cmpneq_u8 vec_cmpne
#define npyv_cmpneq_s8 vec_cmpne
#define npyv_cmpneq_u16 vec_cmpne