Просмотр исходного кода

CMSIS-DSP: Added a ARM_MATH_FLOAT16 compilation option.
It is automatically enabled when MVE support is enabled.

Christophe Favergeon 6 лет назад
Родитель
Сommit
c19c41d261

+ 30 - 1
Include/arm_math.h

@@ -385,17 +385,31 @@ extern "C"
 
 
 #define F64_MAX   DBL_MAX
 #define F64_MAX   DBL_MAX
 #define F32_MAX   FLT_MAX
 #define F32_MAX   FLT_MAX
+
+#if defined(ARM_MATH_FLOAT16)
 #define F16_MAX   (float16_t)FLT_MAX
 #define F16_MAX   (float16_t)FLT_MAX
+#endif
+
 #define F64_MIN   -DBL_MAX
 #define F64_MIN   -DBL_MAX
 #define F32_MIN   -FLT_MAX
 #define F32_MIN   -FLT_MAX
+
+#if defined(ARM_MATH_FLOAT16)
 #define F16_MIN   -(float16_t)FLT_MAX
 #define F16_MIN   -(float16_t)FLT_MAX
+#endif
 
 
 #define F64_ABSMAX   DBL_MAX
 #define F64_ABSMAX   DBL_MAX
 #define F32_ABSMAX   FLT_MAX
 #define F32_ABSMAX   FLT_MAX
+
+#if defined(ARM_MATH_FLOAT16)
 #define F16_ABSMAX   (float16_t)FLT_MAX
 #define F16_ABSMAX   (float16_t)FLT_MAX
+#endif
+
 #define F64_ABSMIN   (float64_t)0.0
 #define F64_ABSMIN   (float64_t)0.0
 #define F32_ABSMIN   (float32_t)0.0
 #define F32_ABSMIN   (float32_t)0.0
+
+#if defined(ARM_MATH_FLOAT16)
 #define F16_ABSMIN   (float16_t)0.0
 #define F16_ABSMIN   (float16_t)0.0
+#endif
 
 
 #define Q31_MAX   (0x7FFFFFFFL)
 #define Q31_MAX   (0x7FFFFFFFL)
 #define Q15_MAX   (0x7FFF)
 #define Q15_MAX   (0x7FFF)
@@ -422,10 +436,12 @@ extern "C"
 
 
 #if defined (ARM_MATH_HELIUM)
 #if defined (ARM_MATH_HELIUM)
   #define ARM_MATH_MVEF
   #define ARM_MATH_MVEF
+  #define ARM_MATH_FLOAT16
 #endif
 #endif
 
 
 #if defined (ARM_MATH_MVEF)
 #if defined (ARM_MATH_MVEF)
   #define ARM_MATH_MVEI
   #define ARM_MATH_MVEI
+  #define ARM_MATH_FLOAT16
 #endif
 #endif
 
 
 #if defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI)
 #if defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI)
@@ -608,10 +624,12 @@ extern "C"
    */
    */
   typedef float32x4_t f32x4_t;
   typedef float32x4_t f32x4_t;
 
 
+#if defined(ARM_MATH_FLOAT16)
   /**
   /**
    * @brief 16-bit floating-point 128-bit vector data type
    * @brief 16-bit floating-point 128-bit vector data type
    */
    */
   typedef __ALIGNED(2) float16x8_t f16x8_t;
   typedef __ALIGNED(2) float16x8_t f16x8_t;
+#endif
 
 
   /**
   /**
    * @brief 32-bit floating-point 128-bit vector pair data type
    * @brief 32-bit floating-point 128-bit vector pair data type
@@ -623,6 +641,7 @@ extern "C"
    */
    */
   typedef float32x4x4_t f32x4x4_t;
   typedef float32x4x4_t f32x4x4_t;
 
 
+#if defined(ARM_MATH_FLOAT16)
   /**
   /**
    * @brief 16-bit floating-point 128-bit vector pair data type
    * @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
    * @brief 16-bit floating-point 128-bit vector quadruplet data type
    */
    */
   typedef float16x8x4_t f16x8x4_t;
   typedef float16x8x4_t f16x8x4_t;
+#endif
 
 
   /**
   /**
    * @brief 32-bit ubiquitous 128-bit vector data type
    * @brief 32-bit ubiquitous 128-bit vector data type
@@ -642,6 +662,7 @@ extern "C"
       int32x4_t       i;
       int32x4_t       i;
   } any32x4_t;
   } any32x4_t;
 
 
+#if defined(ARM_MATH_FLOAT16)
   /**
   /**
    * @brief 16-bit ubiquitous 128-bit vector data type
    * @brief 16-bit ubiquitous 128-bit vector data type
    */
    */
@@ -650,6 +671,7 @@ extern "C"
       float16x8_t     f;
       float16x8_t     f;
       int16x8_t       i;
       int16x8_t       i;
   } any16x8_t;
   } any16x8_t;
+#endif
 
 
 #endif
 #endif
 
 
@@ -674,21 +696,24 @@ extern "C"
    */
    */
   typedef float32x2_t  f32x2_t;
   typedef float32x2_t  f32x2_t;
 
 
+#if defined(ARM_MATH_FLOAT16)
   /**
   /**
    * @brief 16-bit float 64-bit vector data type.
    * @brief 16-bit float 64-bit vector data type.
    */
    */
   typedef  __ALIGNED(2) float16x4_t f16x4_t;
   typedef  __ALIGNED(2) float16x4_t f16x4_t;
+#endif 
 
 
   /**
   /**
    * @brief 32-bit floating-point 128-bit vector triplet data type
    * @brief 32-bit floating-point 128-bit vector triplet data type
    */
    */
   typedef float32x4x3_t f32x4x3_t;
   typedef float32x4x3_t f32x4x3_t;
 
 
+#if defined(ARM_MATH_FLOAT16)
   /**
   /**
    * @brief 16-bit floating-point 128-bit vector triplet data type
    * @brief 16-bit floating-point 128-bit vector triplet data type
    */
    */
   typedef float16x8x3_t f16x8x3_t;
   typedef float16x8x3_t f16x8x3_t;
-
+#endif
 
 
   /**
   /**
    * @brief 32-bit fractional 128-bit vector triplet data type in 1.31 format
    * @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;
   typedef float32x2x4_t f32x2x4_t;
 
 
+#if defined(ARM_MATH_FLOAT16)
   /**
   /**
    * @brief 16-bit floating-point 64-bit vector pair data type
    * @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
    * @brief 16-bit floating-point 64-bit vector quadruplet data type
    */
    */
   typedef float16x4x4_t f16x4x4_t;
   typedef float16x4x4_t f16x4x4_t;
+#endif 
 
 
   /**
   /**
    * @brief 32-bit fractional 64-bit vector pair data type in 1.31 format
    * @brief 32-bit fractional 64-bit vector pair data type in 1.31 format
@@ -789,6 +816,7 @@ extern "C"
       int32x2_t       i;
       int32x2_t       i;
   } any32x2_t;
   } any32x2_t;
 
 
+#if defined(ARM_MATH_FLOAT16)
   /**
   /**
    * @brief 16-bit ubiquitous 64-bit vector data type
    * @brief 16-bit ubiquitous 64-bit vector data type
    */
    */
@@ -797,6 +825,7 @@ extern "C"
       float16x4_t     f;
       float16x4_t     f;
       int16x4_t       i;
       int16x4_t       i;
   } any16x4_t;
   } any16x4_t;
+#endif 
 
 
   /**
   /**
    * @brief 32-bit status 64-bit vector data type.
    * @brief 32-bit status 64-bit vector data type.

+ 1 - 0
Source/BasicMathFunctions/arm_abs_f32.c

@@ -60,6 +60,7 @@
   @return        none
   @return        none
  */
  */
 
 
+
 #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
 #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
 
 
 #include "arm_helium_utils.h"
 #include "arm_helium_utils.h"

+ 4 - 0
Source/configDsp.cmake

@@ -26,6 +26,10 @@ if (NEON OR NEONEXPERIMENTAL)
     target_include_directories(${project} PRIVATE "${root}/CMSIS/DSP/ComputeLibrary/Include")
     target_include_directories(${project} PRIVATE "${root}/CMSIS/DSP/ComputeLibrary/Include")
 endif()
 endif()
 
 
+if (FLOAT16)
+    target_compile_definitions(${project} PRIVATE ARM_MATH_FLOAT16) 
+endif()
+
 
 
 
 
 endfunction()
 endfunction()

+ 2 - 2
Testing/Source/Tests/BasicTestsQ31.cpp

@@ -9,8 +9,8 @@ Reference patterns are generated with
 a double precision computation.
 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
 #define ONEHALF 0x40000000
 
 

+ 2 - 2
Testing/Source/Tests/StatsTestsQ31.cpp

@@ -12,8 +12,8 @@ Reference patterns are generated with
 a double precision computation.
 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()
     void StatsTestsQ31::test_max_q31()
     {
     {

+ 2 - 2
Toolchain/GCC.cmake

@@ -55,8 +55,8 @@ function(compilerSpecificCompileOptions PROJECTNAME)
   
   
   if (ARM_CPU STREQUAL "cortex-a5" )
   if (ARM_CPU STREQUAL "cortex-a5" )
       if ((NEON OR NEONEXPERIMENTAL))
       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()
       else()
         target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
         target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
         target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
         target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")