1 // -*- C++ -*- 2 3 #pragma once 4 5 6 #ifdef __cplusplus 7 extern "C" 8 { 9 #endif 10 11 /* Compiler specific diagnostic adjustment */ 12 #if defined ( __CC_ARM ) 13 14 #elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) 15 16 #elif defined ( __APPLE_CC__ ) 17 #pragma GCC diagnostic ignored "-Wold-style-cast" 18 19 #elif defined ( __GNUC__ ) 20 #pragma GCC diagnostic push 21 #pragma GCC diagnostic ignored "-Wsign-conversion" 22 #pragma GCC diagnostic ignored "-Wconversion" 23 #pragma GCC diagnostic ignored "-Wunused-parameter" 24 #define GCC_COMPILER 25 26 #elif defined ( __ICCARM__ ) 27 28 #elif defined ( __TI_ARM__ ) 29 30 #elif defined ( __CSMC__ ) 31 32 #elif defined ( __TASKING__ ) 33 34 #elif defined ( _MSC_VER ) 35 36 #else 37 #error Unknown compiler 38 #endif 39 40 41 /* Included for instrinsics definitions */ 42 #if defined (_MSC_VER ) 43 #include <stdint.h> 44 #define __STATIC_FORCEINLINE static __forceinline 45 #define __STATIC_INLINE static __inline 46 #define __ALIGNED(x) __declspec(align(x)) 47 #define __WEAK 48 #elif defined ( __APPLE_CC__ ) 49 #include <stdint.h> 50 #define __ALIGNED(x) __attribute__((aligned(x))) 51 #define __STATIC_FORCEINLINE static inline __attribute__((always_inline)) 52 #define __STATIC_INLINE static inline 53 #define __WEAK 54 #elif defined (__GNUC_PYTHON__) 55 #include <stdint.h> 56 #define __ALIGNED(x) __attribute__((aligned(x))) 57 #define __STATIC_FORCEINLINE static inline __attribute__((always_inline)) 58 #define __STATIC_INLINE static inline 59 #define __WEAK 60 #else 61 #include "cmsis_compiler.h" 62 #endif 63 64 65 66 #include <string.h> 67 #include <math.h> 68 #include <float.h> 69 #include <limits.h> 70 71 /* evaluate ARM DSP feature */ 72 #if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) 73 #define ARM_MATH_DSP 1 74 #endif 75 76 #if defined(ARM_MATH_NEON) 77 #if defined(_MSC_VER) && defined(_M_ARM64EC) 78 #include <arm64_neon.h> 79 #else 80 #include <arm_neon.h> 81 #endif 82 #if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) && __ARM_FEATURE_FP16_VECTOR_ARITHMETIC 83 #if !defined(ARM_MATH_NEON_FLOAT16) 84 #define ARM_MATH_NEON_FLOAT16 85 #endif 86 #endif 87 #endif 88 89 #if !defined(ARM_MATH_AUTOVECTORIZE) 90 91 92 #if defined(__ARM_FEATURE_MVE) 93 #if __ARM_FEATURE_MVE 94 #if !defined(ARM_MATH_MVEI) 95 #define ARM_MATH_MVEI 96 #endif 97 #endif 98 99 #if (__ARM_FEATURE_MVE & 2) 100 #if !defined(ARM_MATH_MVEF) 101 #define ARM_MATH_MVEF 102 #endif 103 #if !defined(ARM_MATH_MVE_FLOAT16) 104 #define ARM_MATH_MVE_FLOAT16 105 #endif 106 #endif 107 108 #endif /*defined(__ARM_FEATURE_MVE)*/ 109 #endif /*!defined(ARM_MATH_AUTOVECTORIZE)*/ 110 111 112 #if defined (ARM_MATH_HELIUM) 113 #if !defined(ARM_MATH_MVEF) 114 #define ARM_MATH_MVEF 115 #endif 116 117 #if !defined(ARM_MATH_MVEI) 118 #define ARM_MATH_MVEI 119 #endif 120 121 #if !defined(ARM_MATH_MVE_FLOAT16) 122 #define ARM_MATH_MVE_FLOAT16 123 #endif 124 #endif 125 126 127 128 #if defined ( __CC_ARM ) 129 /* Enter low optimization region - place directly above function definition */ 130 #if defined( __ARM_ARCH_7EM__ ) 131 #define LOW_OPTIMIZATION_ENTER \ 132 _Pragma ("push") \ 133 _Pragma ("O1") 134 #else 135 #define LOW_OPTIMIZATION_ENTER 136 #endif 137 138 /* Exit low optimization region - place directly after end of function definition */ 139 #if defined ( __ARM_ARCH_7EM__ ) 140 #define LOW_OPTIMIZATION_EXIT \ 141 _Pragma ("pop") 142 #else 143 #define LOW_OPTIMIZATION_EXIT 144 #endif 145 146 /* Enter low optimization region - place directly above function definition */ 147 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 148 149 /* Exit low optimization region - place directly after end of function definition */ 150 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 151 152 #elif defined (__ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) 153 #define LOW_OPTIMIZATION_ENTER 154 #define LOW_OPTIMIZATION_EXIT 155 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 156 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 157 158 #elif defined ( __APPLE_CC__ ) 159 #define LOW_OPTIMIZATION_ENTER 160 #define LOW_OPTIMIZATION_EXIT 161 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 162 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 163 164 #elif defined ( __GNUC__ ) 165 #define LOW_OPTIMIZATION_ENTER \ 166 __attribute__(( optimize("-O1") )) 167 #define LOW_OPTIMIZATION_EXIT 168 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 169 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 170 171 #elif defined ( __ICCARM__ ) 172 /* Enter low optimization region - place directly above function definition */ 173 #if defined ( __ARM_ARCH_7EM__ ) 174 #define LOW_OPTIMIZATION_ENTER \ 175 _Pragma ("optimize=low") 176 #else 177 #define LOW_OPTIMIZATION_ENTER 178 #endif 179 180 /* Exit low optimization region - place directly after end of function definition */ 181 #define LOW_OPTIMIZATION_EXIT 182 183 /* Enter low optimization region - place directly above function definition */ 184 #if defined ( __ARM_ARCH_7EM__ ) 185 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \ 186 _Pragma ("optimize=low") 187 #else 188 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 189 #endif 190 191 /* Exit low optimization region - place directly after end of function definition */ 192 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 193 194 #elif defined ( __TI_ARM__ ) 195 #define LOW_OPTIMIZATION_ENTER 196 #define LOW_OPTIMIZATION_EXIT 197 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 198 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 199 200 #elif defined ( __CSMC__ ) 201 #define LOW_OPTIMIZATION_ENTER 202 #define LOW_OPTIMIZATION_EXIT 203 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 204 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 205 206 #elif defined ( __TASKING__ ) 207 #define LOW_OPTIMIZATION_ENTER 208 #define LOW_OPTIMIZATION_EXIT 209 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 210 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 211 212 #elif defined ( _MSC_VER ) || defined(__GNUC_PYTHON__) 213 #define LOW_OPTIMIZATION_ENTER 214 #define LOW_OPTIMIZATION_EXIT 215 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 216 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 217 #endif 218 219 220 221 /* Compiler specific diagnostic adjustment */ 222 #if defined ( __CC_ARM ) 223 224 #elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) 225 226 #elif defined ( __APPLE_CC__ ) 227 228 #elif defined ( __GNUC__ ) 229 #pragma GCC diagnostic pop 230 231 #elif defined ( __ICCARM__ ) 232 233 #elif defined ( __TI_ARM__ ) 234 235 #elif defined ( __CSMC__ ) 236 237 #elif defined ( __TASKING__ ) 238 239 #elif defined ( _MSC_VER ) 240 241 #else 242 #error Unknown compiler 243 #endif 244 245 #ifdef __cplusplus 246 } 247 #endif 248 249 #if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE 250 #include <arm_mve.h> 251 #endif 252 253 #if !(__ARM_FEATURE_MVE & 2) 254 #if !defined(DISABLEFLOAT16) 255 #if defined(__ARM_FP16_FORMAT_IEEE) || defined(__ARM_FP16_FORMAT_ALTERNATIVE) 256 typedef __fp16 float16_t; 257 #define ARM_FLOAT16_SUPPORTED 258 #endif 259 #endif 260 #else 261 /* When Vector float16, this flag is always defined and can't be disabled */ 262 #define ARM_FLOAT16_SUPPORTED 263 #endif 264 265 #if defined(ARM_FLOAT16_SUPPORTED) 266 267 #if defined(__ICCARM__) 268 269 #define F16INFINITY ((float16_t) INFINITY) 270 271 #else 272 273 #define F16INFINITY ((float16_t)__builtin_inf()) 274 275 #endif 276 277 #endif 278 279 280 281 282