1 /*
2  * Copyright (c) 2019 Facebook.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /**
8  * @brief Extra arithmetic and bit manipulation functions.
9  * @defgroup math_extras Math extras
10  * @ingroup utilities
11  *
12  * Portable wrapper functions for a number of arithmetic and bit-counting functions that are often
13  * provided by compiler builtins. If the compiler does not have an appropriate builtin, a portable C
14  * implementation is used instead.
15  *
16  * @{
17  */
18 
19 #ifndef ZEPHYR_INCLUDE_SYS_MATH_EXTRAS_H_
20 #define ZEPHYR_INCLUDE_SYS_MATH_EXTRAS_H_
21 
22 #include <zephyr/types.h>
23 #include <stdbool.h>
24 #include <stddef.h>
25 
26 /**
27  * @name Unsigned integer addition with overflow detection.
28  *
29  * These functions compute `a + b` and store the result in `*result`, returning
30  * true if the operation overflowed.
31  */
32 /**@{*/
33 
34 /**
35  * @brief Add two unsigned 16-bit integers.
36  * @param a First operand.
37  * @param b Second operand.
38  * @param result Pointer to the result.
39  * @return true if the operation overflowed.
40  */
41 static bool u16_add_overflow(uint16_t a, uint16_t b, uint16_t *result);
42 
43 /**
44  * @brief Add two unsigned 32-bit integers.
45  * @param a First operand.
46  * @param b Second operand.
47  * @param result Pointer to the result.
48  * @return true if the operation overflowed.
49  */
50 
51 static bool u32_add_overflow(uint32_t a, uint32_t b, uint32_t *result);
52 
53 /**
54  * @brief Add two unsigned 64-bit integers.
55  * @param a First operand.
56  * @param b Second operand.
57  * @param result Pointer to the result.
58  * @return true if the operation overflowed.
59  */
60 static bool u64_add_overflow(uint64_t a, uint64_t b, uint64_t *result);
61 
62 /**
63  * @brief Add two size_t integers.
64  * @param a First operand.
65  * @param b Second operand.
66  * @param result Pointer to the result.
67  * @return true if the operation overflowed.
68  */
69 static bool size_add_overflow(size_t a, size_t b, size_t *result);
70 
71 /**@}*/
72 
73 /**
74  * @name Unsigned integer multiplication with overflow detection.
75  *
76  * These functions compute `a * b` and store the result in `*result`, returning
77  * true if the operation overflowed.
78  */
79 /**@{*/
80 
81 /**
82  * @brief Multiply two unsigned 16-bit integers.
83  * @param a First operand.
84  * @param b Second operand.
85  * @param result Pointer to the result.
86  * @return true if the operation overflowed.
87  */
88 static bool u16_mul_overflow(uint16_t a, uint16_t b, uint16_t *result);
89 
90 /**
91  * @brief Multiply two unsigned 32-bit integers.
92  * @param a First operand.
93  * @param b Second operand.
94  * @param result Pointer to the result.
95  * @return true if the operation overflowed.
96  */
97 
98 static bool u32_mul_overflow(uint32_t a, uint32_t b, uint32_t *result);
99 /**
100  * @brief Multiply two unsigned 64-bit integers.
101  * @param a First operand.
102  * @param b Second operand.
103  * @param result Pointer to the result.
104  * @return true if the operation overflowed.
105  */
106 static bool u64_mul_overflow(uint64_t a, uint64_t b, uint64_t *result);
107 
108 /**
109  * @brief Multiply two size_t integers.
110  * @param a First operand.
111  * @param b Second operand.
112  * @param result Pointer to the result.
113  * @return true if the operation overflowed.
114  */
115 static bool size_mul_overflow(size_t a, size_t b, size_t *result);
116 
117 /**@}*/
118 
119 /**
120  * @name Count leading zeros.
121  *
122  * Count the number of leading zero bits in the bitwise representation of `x`.
123  * When `x = 0`, this is the size of `x` in bits.
124  */
125 /**@{*/
126 
127 /**
128  * @brief Count the number of leading zero bits in a 32-bit integer.
129  * @param x Integer to count leading zeros in.
130  * @return Number of leading zero bits in `x`.
131  */
132 static int u32_count_leading_zeros(uint32_t x);
133 
134 /**
135  * @brief Count the number of leading zero bits in a 64-bit integer.
136  * @param x Integer to count leading zeros in.
137  * @return Number of leading zero bits in `x`.
138  */
139 static int u64_count_leading_zeros(uint64_t x);
140 
141 /**@}*/
142 
143 /**
144  * @name Count trailing zeros.
145  *
146  * Count the number of trailing zero bits in the bitwise representation of `x`.
147  * When `x = 0`, this is the size of `x` in bits.
148  */
149 /**@{*/
150 
151 /**
152  * @brief Count the number of trailing zero bits in a 32-bit integer.
153  * @param x Integer to count trailing zeros in.
154  * @return Number of trailing zero bits in `x`.
155  */
156 static int u32_count_trailing_zeros(uint32_t x);
157 
158 /**
159  * @brief Count the number of trailing zero bits in a 64-bit integer.
160  * @param x Integer to count trailing zeros in.
161  * @return Number of trailing zero bits in `x`.
162  */
163 static int u64_count_trailing_zeros(uint64_t x);
164 
165 /**@}*/
166 
167 /**@}*/
168 
169 #include <zephyr/sys/math_extras_impl.h>
170 
171 #endif /* ZEPHYR_INCLUDE_SYS_MATH_EXTRAS_H_ */
172