xref: /dpdk/lib/mldev/mldev_utils_scalar.h (revision 538f6997da0c808ec1ae6145f180d73fbabc12c7)
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