diff --git a/modules/core/include/opencv2/core/cvdef.h b/modules/core/include/opencv2/core/cvdef.h index 87fe88594e..b48dcdd7fa 100644 --- a/modules/core/include/opencv2/core/cvdef.h +++ b/modules/core/include/opencv2/core/cvdef.h @@ -307,10 +307,16 @@ enum CpuFeatures { #define CV_2PI 6.283185307179586476925286766559 #define CV_LOG2 0.69314718055994530941723212145818 +#if defined (__ARM_FP16_FORMAT_IEEE) +# define CV_FP16_TYPE 1 +#else +# define CV_FP16_TYPE 0 +#endif + typedef union Cv16suf { short i; -#if ( defined (__arm__) || defined (__aarch64__) ) && !defined (__CUDACC__) && ( defined (__GNUC__) && ( ( ( 4 <= __GNUC__ ) && ( 7 <= __GNUC_MINOR__ ) ) || ( 5 <= __GNUC__ ) ) ) +#if CV_FP16_TYPE __fp16 h; #endif struct _fp16Format diff --git a/modules/core/src/convert.cpp b/modules/core/src/convert.cpp index dc2da5e611..de36cc67a2 100644 --- a/modules/core/src/convert.cpp +++ b/modules/core/src/convert.cpp @@ -4380,7 +4380,7 @@ struct Cvt_SIMD #endif -#if !( ( defined (__arm__) || defined (__aarch64__) ) && ( defined (__GNUC__) && ( ( ( 4 <= __GNUC__ ) && ( 7 <= __GNUC_MINOR__ ) ) || ( 5 <= __GNUC__ ) ) ) ) +#if !CV_FP16_TYPE // const numbers for floating points format const unsigned int kShiftSignificand = 13; const unsigned int kMaskFp16Significand = 0x3ff; @@ -4388,7 +4388,7 @@ const unsigned int kBiasFp16Exponent = 15; const unsigned int kBiasFp32Exponent = 127; #endif -#if ( defined (__arm__) || defined (__aarch64__) ) && ( defined (__GNUC__) && ( ( ( 4 <= __GNUC__ ) && ( 7 <= __GNUC_MINOR__ ) ) || ( 5 <= __GNUC__ ) ) ) +#if CV_FP16_TYPE static float convertFp16SW(short fp16) { // Fp16 -> Fp32 @@ -4450,7 +4450,7 @@ static float convertFp16SW(short fp16) } #endif -#if ( defined (__arm__) || defined (__aarch64__) ) && ( defined (__GNUC__) && ( ( ( 4 <= __GNUC__ ) && ( 7 <= __GNUC_MINOR__ ) ) || ( 5 <= __GNUC__ ) ) ) +#if CV_FP16_TYPE static short convertFp16SW(float fp32) { // Fp32 -> Fp16