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