1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) 2023 Marvell. 3 */ 4 5 #include <errno.h> 6 #include <math.h> 7 #include <stdint.h> 8 9 #include "mldev_utils.h" 10 11 #ifndef BIT 12 #define BIT(nr) (1UL << (nr)) 13 #endif 14 15 #ifndef BITS_PER_LONG 16 #define BITS_PER_LONG (__SIZEOF_LONG__ * 8) 17 #endif 18 19 #ifndef GENMASK_U32 20 #define GENMASK_U32(h, l) (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) 21 #endif 22 23 /* float32: bit index of MSB & LSB of sign, exponent and mantissa */ 24 #define FP32_LSB_M 0 25 #define FP32_MSB_M 22 26 #define FP32_LSB_E 23 27 #define FP32_MSB_E 30 28 #define FP32_LSB_S 31 29 #define FP32_MSB_S 31 30 31 /* float32: bitmask for sign, exponent and mantissa */ 32 #define FP32_MASK_S GENMASK_U32(FP32_MSB_S, FP32_LSB_S) 33 #define FP32_MASK_E GENMASK_U32(FP32_MSB_E, FP32_LSB_E) 34 #define FP32_MASK_M GENMASK_U32(FP32_MSB_M, FP32_LSB_M) 35 36 /* float16: bit index of MSB & LSB of sign, exponent and mantissa */ 37 #define FP16_LSB_M 0 38 #define FP16_MSB_M 9 39 #define FP16_LSB_E 10 40 #define FP16_MSB_E 14 41 #define FP16_LSB_S 15 42 #define FP16_MSB_S 15 43 44 /* float16: bitmask for sign, exponent and mantissa */ 45 #define FP16_MASK_S GENMASK_U32(FP16_MSB_S, FP16_LSB_S) 46 #define FP16_MASK_E GENMASK_U32(FP16_MSB_E, FP16_LSB_E) 47 #define FP16_MASK_M GENMASK_U32(FP16_MSB_M, FP16_LSB_M) 48 49 /* bfloat16: bit index of MSB & LSB of sign, exponent and mantissa */ 50 #define BF16_LSB_M 0 51 #define BF16_MSB_M 6 52 #define BF16_LSB_E 7 53 #define BF16_MSB_E 14 54 #define BF16_LSB_S 15 55 #define BF16_MSB_S 15 56 57 /* bfloat16: bitmask for sign, exponent and mantissa */ 58 #define BF16_MASK_S GENMASK_U32(BF16_MSB_S, BF16_LSB_S) 59 #define BF16_MASK_E GENMASK_U32(BF16_MSB_E, BF16_LSB_E) 60 #define BF16_MASK_M GENMASK_U32(BF16_MSB_M, BF16_LSB_M) 61 62 /* Exponent bias */ 63 #define FP32_BIAS_E 127 64 #define FP16_BIAS_E 15 65 #define BF16_BIAS_E 127 66 67 #define FP32_PACK(sign, exponent, mantissa) \ 68 (((sign) << FP32_LSB_S) | ((exponent) << FP32_LSB_E) | (mantissa)) 69 70 #define FP16_PACK(sign, exponent, mantissa) \ 71 (((sign) << FP16_LSB_S) | ((exponent) << FP16_LSB_E) | (mantissa)) 72 73 #define BF16_PACK(sign, exponent, mantissa) \ 74 (((sign) << BF16_LSB_S) | ((exponent) << BF16_LSB_E) | (mantissa)) 75 76 /* Represent float32 as float and uint32_t */ 77 union float32 { 78 float f; 79 uint32_t u; 80 }; 81