1 /****************************************************************************** 2 * @file arm_math_types_f16.h 3 * @brief Public header file for f16 function of the CMSIS DSP Library 4 * @version V1.9.0 5 * @date 23 April 2021 6 * Target Processor: Cortex-M and Cortex-A cores 7 ******************************************************************************/ 8 /* 9 * Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved. 10 * 11 * SPDX-License-Identifier: Apache-2.0 12 * 13 * Licensed under the Apache License, Version 2.0 (the License); you may 14 * not use this file except in compliance with the License. 15 * You may obtain a copy of the License at 16 * 17 * www.apache.org/licenses/LICENSE-2.0 18 * 19 * Unless required by applicable law or agreed to in writing, software 20 * distributed under the License is distributed on an AS IS BASIS, WITHOUT 21 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 22 * See the License for the specific language governing permissions and 23 * limitations under the License. 24 */ 25 26 #ifndef _ARM_MATH_TYPES_F16_H 27 #define _ARM_MATH_TYPES_F16_H 28 29 #include "arm_math_types.h" 30 31 #ifdef __cplusplus 32 extern "C" 33 { 34 #endif 35 36 #if !defined( __CC_ARM ) 37 38 /** 39 * @brief 16-bit floating-point type definition. 40 * This is already defined in arm_mve.h 41 * 42 * This is not fully supported on ARM AC5. 43 */ 44 45 /* 46 47 Check if the type __fp16 is available. 48 If it is not available, f16 version of the kernels 49 won't be built. 50 51 */ 52 #if !(__ARM_FEATURE_MVE & 2) 53 #if !defined(DISABLEFLOAT16) 54 #if defined(__ARM_FP16_FORMAT_IEEE) || defined(__ARM_FP16_FORMAT_ALTERNATIVE) 55 typedef __fp16 float16_t; 56 #define ARM_FLOAT16_SUPPORTED 57 #endif 58 #endif 59 #else 60 /* When Vector float16, this flag is always defined and can't be disabled */ 61 #define ARM_FLOAT16_SUPPORTED 62 #endif 63 64 #if defined(ARM_MATH_NEON) || (defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)) /* floating point vector*/ 65 66 #if defined(ARM_MATH_MVE_FLOAT16) || defined(ARM_MATH_NEON_FLOAT16) 67 68 /** 69 * @brief 16-bit floating-point 128-bit vector data type 70 */ 71 typedef __ALIGNED(2) float16x8_t f16x8_t; 72 73 /** 74 * @brief 16-bit floating-point 128-bit vector pair data type 75 */ 76 typedef float16x8x2_t f16x8x2_t; 77 78 /** 79 * @brief 16-bit floating-point 128-bit vector quadruplet data type 80 */ 81 typedef float16x8x4_t f16x8x4_t; 82 83 /** 84 * @brief 16-bit ubiquitous 128-bit vector data type 85 */ 86 typedef union _any16x8_t 87 { 88 float16x8_t f; 89 int16x8_t i; 90 } any16x8_t; 91 #endif 92 93 #endif 94 95 #if defined(ARM_MATH_NEON) 96 97 98 #if defined(ARM_MATH_NEON_FLOAT16) 99 /** 100 * @brief 16-bit float 64-bit vector data type. 101 */ 102 typedef __ALIGNED(2) float16x4_t f16x4_t; 103 104 /** 105 * @brief 16-bit floating-point 128-bit vector triplet data type 106 */ 107 typedef float16x8x3_t f16x8x3_t; 108 109 /** 110 * @brief 16-bit floating-point 64-bit vector pair data type 111 */ 112 typedef float16x4x2_t f16x4x2_t; 113 114 /** 115 * @brief 16-bit floating-point 64-bit vector triplet data type 116 */ 117 typedef float16x4x3_t f16x4x3_t; 118 119 /** 120 * @brief 16-bit floating-point 64-bit vector quadruplet data type 121 */ 122 typedef float16x4x4_t f16x4x4_t; 123 124 /** 125 * @brief 16-bit ubiquitous 64-bit vector data type 126 */ 127 typedef union _any16x4_t 128 { 129 float16x4_t f; 130 int16x4_t i; 131 } any16x4_t; 132 #endif 133 134 #endif 135 136 137 138 #if defined(ARM_FLOAT16_SUPPORTED) 139 #define F16_MAX ((float16_t)__FLT16_MAX__) 140 #define F16_MIN (-(float16_t)__FLT16_MAX__) 141 142 #define F16_ABSMAX ((float16_t)__FLT16_MAX__) 143 #define F16_ABSMIN ((float16_t)0.0f16) 144 145 #define F16INFINITY ((float16_t)__builtin_inf()) 146 147 #endif /* ARM_FLOAT16_SUPPORTED*/ 148 #endif /* !defined( __CC_ARM ) */ 149 150 #ifdef __cplusplus 151 } 152 #endif 153 154 #endif /* _ARM_MATH_F16_H */ 155 156 157