diff --git a/src/functions-simd.c b/src/functions-simd.c index 90ce8bc..b5b6d80 100644 --- src/functions-simd.c +++ src/functions-simd.c @@ -24,6 +24,17 @@ #if ME_USE_ACCELERATE && defined(__APPLE__) #include +#include +/* vForce gained fabs/copysign/fmod/remainder/nextafter/expm1/log1p/log2/ + * cbrt/sinpi/cospi (and their float variants) in OS X 10.9; SDKs targeting + * older deployment targets (e.g. legacy PowerPC toolchains still on 10.6) + * don't declare them, so gate their use on the SDK version instead of + * assuming every Apple target ships the full modern vForce API. */ +#if defined(MAC_OS_X_VERSION_10_9) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9 +#define ME_VFORCE_HAVE_10_9 1 +#else +#define ME_VFORCE_HAVE_10_9 0 +#endif #endif #if defined(_MSC_VER) @@ -1001,13 +1012,19 @@ ME_VFORCE_UNARY_F64(vec_tan_accelerate, vvtan) ME_VFORCE_UNARY_F64(vec_asin_accelerate, vvasin) ME_VFORCE_UNARY_F64(vec_acos_accelerate, vvacos) ME_VFORCE_UNARY_F64(vec_atan_accelerate, vvatan) +#if ME_VFORCE_HAVE_10_9 ME_VFORCE_UNARY_F64(vec_abs_accelerate, vvfabs) +#endif ME_VFORCE_UNARY_F64(vec_exp_accelerate, vvexp) +#if ME_VFORCE_HAVE_10_9 ME_VFORCE_UNARY_F64(vec_expm1_accelerate, vvexpm1) +#endif ME_VFORCE_UNARY_F64(vec_log_accelerate, vvlog) ME_VFORCE_UNARY_F64(vec_log10_accelerate, vvlog10) +#if ME_VFORCE_HAVE_10_9 ME_VFORCE_UNARY_F64(vec_log1p_accelerate, vvlog1p) ME_VFORCE_UNARY_F64(vec_log2_accelerate, vvlog2) +#endif ME_VFORCE_UNARY_F64(vec_sqrt_accelerate, vvsqrt) ME_VFORCE_UNARY_F64(vec_sinh_accelerate, vvsinh) ME_VFORCE_UNARY_F64(vec_cosh_accelerate, vvcosh) @@ -1017,9 +1034,11 @@ ME_VFORCE_UNARY_F64(vec_asinh_accelerate, vvasinh) ME_VFORCE_UNARY_F64(vec_atanh_accelerate, vvatanh) ME_VFORCE_UNARY_F64(vec_ceil_accelerate, vvceil) ME_VFORCE_UNARY_F64(vec_floor_accelerate, vvfloor) +#if ME_VFORCE_HAVE_10_9 ME_VFORCE_UNARY_F64(vec_cbrt_accelerate, vvcbrt) ME_VFORCE_UNARY_F64(vec_sinpi_accelerate, vvsinpi) ME_VFORCE_UNARY_F64(vec_cospi_accelerate, vvcospi) +#endif ME_VFORCE_UNARY_F32(vec_sin_f32_accelerate, vvsinf) ME_VFORCE_UNARY_F32(vec_cos_f32_accelerate, vvcosf) @@ -1027,13 +1046,19 @@ ME_VFORCE_UNARY_F32(vec_tan_f32_accelerate, vvtanf) ME_VFORCE_UNARY_F32(vec_asin_f32_accelerate, vvasinf) ME_VFORCE_UNARY_F32(vec_acos_f32_accelerate, vvacosf) ME_VFORCE_UNARY_F32(vec_atan_f32_accelerate, vvatanf) +#if ME_VFORCE_HAVE_10_9 ME_VFORCE_UNARY_F32(vec_abs_f32_accelerate, vvfabsf) +#endif ME_VFORCE_UNARY_F32(vec_exp_f32_accelerate, vvexpf) +#if ME_VFORCE_HAVE_10_9 ME_VFORCE_UNARY_F32(vec_expm1_f32_accelerate, vvexpm1f) +#endif ME_VFORCE_UNARY_F32(vec_log_f32_accelerate, vvlogf) ME_VFORCE_UNARY_F32(vec_log10_f32_accelerate, vvlog10f) +#if ME_VFORCE_HAVE_10_9 ME_VFORCE_UNARY_F32(vec_log1p_f32_accelerate, vvlog1pf) ME_VFORCE_UNARY_F32(vec_log2_f32_accelerate, vvlog2f) +#endif ME_VFORCE_UNARY_F32(vec_sqrt_f32_accelerate, vvsqrtf) ME_VFORCE_UNARY_F32(vec_sinh_f32_accelerate, vvsinhf) ME_VFORCE_UNARY_F32(vec_cosh_f32_accelerate, vvcoshf) @@ -1043,21 +1068,27 @@ ME_VFORCE_UNARY_F32(vec_asinh_f32_accelerate, vvasinhf) ME_VFORCE_UNARY_F32(vec_atanh_f32_accelerate, vvatanhf) ME_VFORCE_UNARY_F32(vec_ceil_f32_accelerate, vvceilf) ME_VFORCE_UNARY_F32(vec_floor_f32_accelerate, vvfloorf) +#if ME_VFORCE_HAVE_10_9 ME_VFORCE_UNARY_F32(vec_cbrt_f32_accelerate, vvcbrtf) ME_VFORCE_UNARY_F32(vec_sinpi_f32_accelerate, vvsinpif) ME_VFORCE_UNARY_F32(vec_cospi_f32_accelerate, vvcospif) +#endif ME_VFORCE_BINARY_F64(vec_atan2_accelerate, vvatan2) +#if ME_VFORCE_HAVE_10_9 ME_VFORCE_BINARY_F64(vec_copysign_accelerate, vvcopysign) ME_VFORCE_BINARY_F64(vec_fmod_accelerate, vvfmod) ME_VFORCE_BINARY_F64(vec_remainder_accelerate, vvremainder) ME_VFORCE_BINARY_F64(vec_nextafter_accelerate, vvnextafter) +#endif ME_VFORCE_BINARY_F32(vec_atan2_f32_accelerate, vvatan2f) +#if ME_VFORCE_HAVE_10_9 ME_VFORCE_BINARY_F32(vec_copysign_f32_accelerate, vvcopysignf) ME_VFORCE_BINARY_F32(vec_fmod_f32_accelerate, vvfmodf) ME_VFORCE_BINARY_F32(vec_remainder_f32_accelerate, vvremainderf) ME_VFORCE_BINARY_F32(vec_nextafter_f32_accelerate, vvnextafterf) +#endif static void vec_pow_accelerate(const double* a, const double* b, double* out, int n) { vvpow(out, b, a, &n); @@ -3850,13 +3881,19 @@ static void me_set_accelerate_backend(void) { vec_acos_impl = vec_acos_accelerate; vec_atan_impl = vec_atan_accelerate; vec_atan2_impl = vec_atan2_accelerate; +#if ME_VFORCE_HAVE_10_9 vec_abs_impl = vec_abs_accelerate; +#endif vec_exp_impl = vec_exp_accelerate; +#if ME_VFORCE_HAVE_10_9 vec_expm1_impl = vec_expm1_accelerate; +#endif vec_log_impl = vec_log_accelerate; vec_log10_impl = vec_log10_accelerate; +#if ME_VFORCE_HAVE_10_9 vec_log1p_impl = vec_log1p_accelerate; vec_log2_impl = vec_log2_accelerate; +#endif vec_sqrt_impl = vec_sqrt_accelerate; vec_sinh_impl = vec_sinh_accelerate; vec_cosh_impl = vec_cosh_accelerate; @@ -3866,14 +3903,18 @@ static void me_set_accelerate_backend(void) { vec_atanh_impl = vec_atanh_accelerate; vec_ceil_impl = vec_ceil_accelerate; vec_floor_impl = vec_floor_accelerate; +#if ME_VFORCE_HAVE_10_9 vec_cbrt_impl = vec_cbrt_accelerate; vec_sinpi_impl = vec_sinpi_accelerate; vec_cospi_impl = vec_cospi_accelerate; +#endif vec_pow_impl = vec_pow_accelerate; +#if ME_VFORCE_HAVE_10_9 vec_copysign_impl = vec_copysign_accelerate; vec_fmod_impl = vec_fmod_accelerate; vec_nextafter_impl = vec_nextafter_accelerate; vec_remainder_impl = vec_remainder_accelerate; +#endif vec_sin_f32_impl = vec_sin_f32_accelerate; vec_cos_f32_impl = vec_cos_f32_accelerate; vec_tan_f32_impl = vec_tan_f32_accelerate; @@ -3881,13 +3922,19 @@ static void me_set_accelerate_backend(void) { vec_acos_f32_impl = vec_acos_f32_accelerate; vec_atan_f32_impl = vec_atan_f32_accelerate; vec_atan2_f32_impl = vec_atan2_f32_accelerate; +#if ME_VFORCE_HAVE_10_9 vec_abs_f32_impl = vec_abs_f32_accelerate; +#endif vec_exp_f32_impl = vec_exp_f32_accelerate; +#if ME_VFORCE_HAVE_10_9 vec_expm1_f32_impl = vec_expm1_f32_accelerate; +#endif vec_log_f32_impl = vec_log_f32_accelerate; vec_log10_f32_impl = vec_log10_f32_accelerate; +#if ME_VFORCE_HAVE_10_9 vec_log1p_f32_impl = vec_log1p_f32_accelerate; vec_log2_f32_impl = vec_log2_f32_accelerate; +#endif vec_sqrt_f32_impl = vec_sqrt_f32_accelerate; vec_sinh_f32_impl = vec_sinh_f32_accelerate; vec_cosh_f32_impl = vec_cosh_f32_accelerate; @@ -3897,14 +3944,18 @@ static void me_set_accelerate_backend(void) { vec_atanh_f32_impl = vec_atanh_f32_accelerate; vec_ceil_f32_impl = vec_ceil_f32_accelerate; vec_floor_f32_impl = vec_floor_f32_accelerate; +#if ME_VFORCE_HAVE_10_9 vec_cbrt_f32_impl = vec_cbrt_f32_accelerate; vec_sinpi_f32_impl = vec_sinpi_f32_accelerate; vec_cospi_f32_impl = vec_cospi_f32_accelerate; +#endif vec_pow_f32_impl = vec_pow_f32_accelerate; +#if ME_VFORCE_HAVE_10_9 vec_copysign_f32_impl = vec_copysign_f32_accelerate; vec_fmod_f32_impl = vec_fmod_f32_accelerate; vec_nextafter_f32_impl = vec_nextafter_f32_accelerate; vec_remainder_f32_impl = vec_remainder_f32_accelerate; +#endif vec_sincos_impl = vec_sincos_accelerate; vec_sincos_f32_impl = vec_sincos_f32_accelerate; }