diff --git a/hal/ipp/CMakeLists.txt b/hal/ipp/CMakeLists.txt index 345a7534b1..db2b7dada7 100644 --- a/hal/ipp/CMakeLists.txt +++ b/hal/ipp/CMakeLists.txt @@ -9,6 +9,7 @@ set(IPP_HAL_HEADERS CACHE INTERNAL "") add_library(ipphal STATIC + "${CMAKE_CURRENT_SOURCE_DIR}/src/math_ipp.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/mean_ipp.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/minmax_ipp.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/norm_ipp.cpp" diff --git a/hal/ipp/include/ipp_hal_core.hpp b/hal/ipp/include/ipp_hal_core.hpp index 7b71c8d28a..cd138c1ae7 100644 --- a/hal/ipp/include/ipp_hal_core.hpp +++ b/hal/ipp/include/ipp_hal_core.hpp @@ -74,6 +74,33 @@ int ipp_hal_transpose2d(const uchar* src_data, size_t src_step, uchar* dst_data, #undef cv_hal_transpose2d #define cv_hal_transpose2d ipp_hal_transpose2d +int ipp_hal_invSqrt32f(const float* src, float* dst, int len); +int ipp_hal_invSqrt64f(const double* src, double* dst, int len); + +#undef cv_hal_invSqrt32f +#define cv_hal_invSqrt32f ipp_hal_invSqrt32f + +#undef cv_hal_invSqrt64f +#define cv_hal_invSqrt64f ipp_hal_invSqrt64f + +int ipp_hal_exp32f(const float* src, float* dst, int len); +int ipp_hal_exp64f(const double* src, double* dst, int len); + +#undef cv_hal_exp32f +#define cv_hal_exp32f ipp_hal_exp32f + +#undef cv_hal_exp64f +#define cv_hal_exp64f ipp_hal_exp64f + +int ipp_hal_log32f(const float* src, float* dst, int len); +int ipp_hal_log64f(const double* src, double* dst, int len); + +#undef cv_hal_log32f +#define cv_hal_log32f ipp_hal_log32f + +#undef cv_hal_log64f +#define cv_hal_log64f ipp_hal_log64f + //! @endcond #endif diff --git a/hal/ipp/src/math_ipp.cpp b/hal/ipp/src/math_ipp.cpp new file mode 100644 index 0000000000..cb83a34264 --- /dev/null +++ b/hal/ipp/src/math_ipp.cpp @@ -0,0 +1,80 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +#include "ipp_hal_core.hpp" + +#include +#include + +int ipp_hal_invSqrt32f(const float* src, float* dst, int len) +{ + CV_HAL_CHECK_USE_IPP(); + IppStatus status = CV_INSTRUMENT_FUN_IPP(ippsInvSqrt_32f_A21, src, dst, len); + if (status >= 0) + { + return CV_HAL_ERROR_OK; + } + + return CV_HAL_ERROR_NOT_IMPLEMENTED; +} + +int ipp_hal_invSqrt64f(const double* src, double* dst, int len) +{ + CV_HAL_CHECK_USE_IPP(); + IppStatus status = CV_INSTRUMENT_FUN_IPP(ippsInvSqrt_64f_A50, src, dst, len); + if (status >= 0) + { + return CV_HAL_ERROR_OK; + } + + return CV_HAL_ERROR_NOT_IMPLEMENTED; +} + +int ipp_hal_exp32f(const float* src, float* dst, int len) +{ + CV_HAL_CHECK_USE_IPP(); + IppStatus status = CV_INSTRUMENT_FUN_IPP(ippsExp_32f_A21, src, dst, len); + if (status >= 0) + { + return CV_HAL_ERROR_OK; + } + + return CV_HAL_ERROR_NOT_IMPLEMENTED; +} + +int ipp_hal_exp64f(const double* src, double* dst, int len) +{ + CV_HAL_CHECK_USE_IPP(); + IppStatus status = CV_INSTRUMENT_FUN_IPP(ippsExp_64f_A50, src, dst, len); + if (status >= 0) + { + return CV_HAL_ERROR_OK; + } + + return CV_HAL_ERROR_NOT_IMPLEMENTED; +} + +int ipp_hal_log32f(const float* src, float* dst, int len) +{ + CV_HAL_CHECK_USE_IPP(); + IppStatus status = CV_INSTRUMENT_FUN_IPP(ippsLn_32f_A21, src, dst, len); + if (status >= 0) + { + return CV_HAL_ERROR_OK; + } + + return CV_HAL_ERROR_NOT_IMPLEMENTED; +} + +int ipp_hal_log64f(const double* src, double* dst, int len) +{ + CV_HAL_CHECK_USE_IPP(); + IppStatus status = CV_INSTRUMENT_FUN_IPP(ippsLn_64f_A50, src, dst, len); + if (status >= 0) + { + return CV_HAL_ERROR_OK; + } + + return CV_HAL_ERROR_NOT_IMPLEMENTED; +} diff --git a/modules/core/src/mathfuncs_core.dispatch.cpp b/modules/core/src/mathfuncs_core.dispatch.cpp index 84e4e6a652..db27713c51 100644 --- a/modules/core/src/mathfuncs_core.dispatch.cpp +++ b/modules/core/src/mathfuncs_core.dispatch.cpp @@ -107,7 +107,6 @@ void invSqrt32f(const float* src, float* dst, int len) CV_INSTRUMENT_REGION(); CALL_HAL(invSqrt32f, cv_hal_invSqrt32f, src, dst, len); - CV_IPP_RUN_FAST(CV_INSTRUMENT_FUN_IPP(ippsInvSqrt_32f_A21, src, dst, len) >= 0); CV_CPU_DISPATCH(invSqrt32f, (src, dst, len), CV_CPU_DISPATCH_MODES_ALL); @@ -119,7 +118,6 @@ void invSqrt64f(const double* src, double* dst, int len) CV_INSTRUMENT_REGION(); CALL_HAL(invSqrt64f, cv_hal_invSqrt64f, src, dst, len); - CV_IPP_RUN_FAST(CV_INSTRUMENT_FUN_IPP(ippsInvSqrt_64f_A50, src, dst, len) >= 0); CV_CPU_DISPATCH(invSqrt64f, (src, dst, len), CV_CPU_DISPATCH_MODES_ALL); @@ -152,7 +150,6 @@ void exp32f(const float *src, float *dst, int n) CV_INSTRUMENT_REGION(); CALL_HAL(exp32f, cv_hal_exp32f, src, dst, n); - CV_IPP_RUN_FAST(CV_INSTRUMENT_FUN_IPP(ippsExp_32f_A21, src, dst, n) >= 0); CV_CPU_DISPATCH(exp32f, (src, dst, n), CV_CPU_DISPATCH_MODES_ALL); @@ -163,7 +160,6 @@ void exp64f(const double *src, double *dst, int n) CV_INSTRUMENT_REGION(); CALL_HAL(exp64f, cv_hal_exp64f, src, dst, n); - CV_IPP_RUN_FAST(CV_INSTRUMENT_FUN_IPP(ippsExp_64f_A50, src, dst, n) >= 0); CV_CPU_DISPATCH(exp64f, (src, dst, n), CV_CPU_DISPATCH_MODES_ALL); @@ -174,7 +170,6 @@ void log32f(const float *src, float *dst, int n) CV_INSTRUMENT_REGION(); CALL_HAL(log32f, cv_hal_log32f, src, dst, n); - CV_IPP_RUN_FAST(CV_INSTRUMENT_FUN_IPP(ippsLn_32f_A21, src, dst, n) >= 0); CV_CPU_DISPATCH(log32f, (src, dst, n), CV_CPU_DISPATCH_MODES_ALL); @@ -185,7 +180,6 @@ void log64f(const double *src, double *dst, int n) CV_INSTRUMENT_REGION(); CALL_HAL(log64f, cv_hal_log64f, src, dst, n); - CV_IPP_RUN_FAST(CV_INSTRUMENT_FUN_IPP(ippsLn_64f_A50, src, dst, n) >= 0); CV_CPU_DISPATCH(log64f, (src, dst, n), CV_CPU_DISPATCH_MODES_ALL);