From c19c41d261ccdf77adb9ae9e6255e226f09191e7 Mon Sep 17 00:00:00 2001 From: Christophe Favergeon Date: Mon, 21 Oct 2019 13:50:41 +0200 Subject: [PATCH] CMSIS-DSP: Added a ARM_MATH_FLOAT16 compilation option. It is automatically enabled when MVE support is enabled. --- Include/arm_math.h | 31 ++++++++++++++++++++++++- Source/BasicMathFunctions/arm_abs_f32.c | 1 + Source/configDsp.cmake | 4 ++++ Testing/Source/Tests/BasicTestsQ31.cpp | 4 ++-- Testing/Source/Tests/StatsTestsQ31.cpp | 4 ++-- Toolchain/GCC.cmake | 4 ++-- 6 files changed, 41 insertions(+), 7 deletions(-) diff --git a/Include/arm_math.h b/Include/arm_math.h index 092bcbb8..52b3f53e 100644 --- a/Include/arm_math.h +++ b/Include/arm_math.h @@ -385,17 +385,31 @@ extern "C" #define F64_MAX DBL_MAX #define F32_MAX FLT_MAX + +#if defined(ARM_MATH_FLOAT16) #define F16_MAX (float16_t)FLT_MAX +#endif + #define F64_MIN -DBL_MAX #define F32_MIN -FLT_MAX + +#if defined(ARM_MATH_FLOAT16) #define F16_MIN -(float16_t)FLT_MAX +#endif #define F64_ABSMAX DBL_MAX #define F32_ABSMAX FLT_MAX + +#if defined(ARM_MATH_FLOAT16) #define F16_ABSMAX (float16_t)FLT_MAX +#endif + #define F64_ABSMIN (float64_t)0.0 #define F32_ABSMIN (float32_t)0.0 + +#if defined(ARM_MATH_FLOAT16) #define F16_ABSMIN (float16_t)0.0 +#endif #define Q31_MAX (0x7FFFFFFFL) #define Q15_MAX (0x7FFF) @@ -422,10 +436,12 @@ extern "C" #if defined (ARM_MATH_HELIUM) #define ARM_MATH_MVEF + #define ARM_MATH_FLOAT16 #endif #if defined (ARM_MATH_MVEF) #define ARM_MATH_MVEI + #define ARM_MATH_FLOAT16 #endif #if defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI) @@ -608,10 +624,12 @@ extern "C" */ typedef float32x4_t f32x4_t; +#if defined(ARM_MATH_FLOAT16) /** * @brief 16-bit floating-point 128-bit vector data type */ typedef __ALIGNED(2) float16x8_t f16x8_t; +#endif /** * @brief 32-bit floating-point 128-bit vector pair data type @@ -623,6 +641,7 @@ extern "C" */ typedef float32x4x4_t f32x4x4_t; +#if defined(ARM_MATH_FLOAT16) /** * @brief 16-bit floating-point 128-bit vector pair data type */ @@ -632,6 +651,7 @@ extern "C" * @brief 16-bit floating-point 128-bit vector quadruplet data type */ typedef float16x8x4_t f16x8x4_t; +#endif /** * @brief 32-bit ubiquitous 128-bit vector data type @@ -642,6 +662,7 @@ extern "C" int32x4_t i; } any32x4_t; +#if defined(ARM_MATH_FLOAT16) /** * @brief 16-bit ubiquitous 128-bit vector data type */ @@ -650,6 +671,7 @@ extern "C" float16x8_t f; int16x8_t i; } any16x8_t; +#endif #endif @@ -674,21 +696,24 @@ extern "C" */ typedef float32x2_t f32x2_t; +#if defined(ARM_MATH_FLOAT16) /** * @brief 16-bit float 64-bit vector data type. */ typedef __ALIGNED(2) float16x4_t f16x4_t; +#endif /** * @brief 32-bit floating-point 128-bit vector triplet data type */ typedef float32x4x3_t f32x4x3_t; +#if defined(ARM_MATH_FLOAT16) /** * @brief 16-bit floating-point 128-bit vector triplet data type */ typedef float16x8x3_t f16x8x3_t; - +#endif /** * @brief 32-bit fractional 128-bit vector triplet data type in 1.31 format @@ -720,6 +745,7 @@ extern "C" */ typedef float32x2x4_t f32x2x4_t; +#if defined(ARM_MATH_FLOAT16) /** * @brief 16-bit floating-point 64-bit vector pair data type */ @@ -734,6 +760,7 @@ extern "C" * @brief 16-bit floating-point 64-bit vector quadruplet data type */ typedef float16x4x4_t f16x4x4_t; +#endif /** * @brief 32-bit fractional 64-bit vector pair data type in 1.31 format @@ -789,6 +816,7 @@ extern "C" int32x2_t i; } any32x2_t; +#if defined(ARM_MATH_FLOAT16) /** * @brief 16-bit ubiquitous 64-bit vector data type */ @@ -797,6 +825,7 @@ extern "C" float16x4_t f; int16x4_t i; } any16x4_t; +#endif /** * @brief 32-bit status 64-bit vector data type. diff --git a/Source/BasicMathFunctions/arm_abs_f32.c b/Source/BasicMathFunctions/arm_abs_f32.c index c10b50a3..ccae6d31 100644 --- a/Source/BasicMathFunctions/arm_abs_f32.c +++ b/Source/BasicMathFunctions/arm_abs_f32.c @@ -60,6 +60,7 @@ @return none */ + #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) #include "arm_helium_utils.h" diff --git a/Source/configDsp.cmake b/Source/configDsp.cmake index b472be0d..868132f7 100644 --- a/Source/configDsp.cmake +++ b/Source/configDsp.cmake @@ -26,6 +26,10 @@ if (NEON OR NEONEXPERIMENTAL) target_include_directories(${project} PRIVATE "${root}/CMSIS/DSP/ComputeLibrary/Include") endif() +if (FLOAT16) + target_compile_definitions(${project} PRIVATE ARM_MATH_FLOAT16) +endif() + endfunction() \ No newline at end of file diff --git a/Testing/Source/Tests/BasicTestsQ31.cpp b/Testing/Source/Tests/BasicTestsQ31.cpp index 5e9a7275..96e43e0a 100755 --- a/Testing/Source/Tests/BasicTestsQ31.cpp +++ b/Testing/Source/Tests/BasicTestsQ31.cpp @@ -9,8 +9,8 @@ Reference patterns are generated with a double precision computation. */ -#define ABS_ERROR_Q31 2 -#define ABS_ERROR_Q63 (1<<16) +#define ABS_ERROR_Q31 ((q31_t)2) +#define ABS_ERROR_Q63 ((q63_t)(1<<16)) #define ONEHALF 0x40000000 diff --git a/Testing/Source/Tests/StatsTestsQ31.cpp b/Testing/Source/Tests/StatsTestsQ31.cpp index d1df6730..e93f218f 100755 --- a/Testing/Source/Tests/StatsTestsQ31.cpp +++ b/Testing/Source/Tests/StatsTestsQ31.cpp @@ -12,8 +12,8 @@ Reference patterns are generated with a double precision computation. */ -#define ABS_ERROR_Q31 100 -#define ABS_ERROR_Q63 (1<<18) +#define ABS_ERROR_Q31 ((q31_t)(100)) +#define ABS_ERROR_Q63 ((q63_t)(1<<18)) void StatsTestsQ31::test_max_q31() { diff --git a/Toolchain/GCC.cmake b/Toolchain/GCC.cmake index b495c9d7..c2c96a4e 100644 --- a/Toolchain/GCC.cmake +++ b/Toolchain/GCC.cmake @@ -55,8 +55,8 @@ function(compilerSpecificCompileOptions PROJECTNAME) if (ARM_CPU STREQUAL "cortex-a5" ) if ((NEON OR NEONEXPERIMENTAL)) - target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16") - target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16") + target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=neon-vfpv4") + target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=neon-vfpv4") else() target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16") target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")