Skip to content

Commit 4e8e72b

Browse files
Flavio Ceolinjhedberg
authored andcommitted
math: extras: Add overflow functions to u16
Add functions to addition and multiplication for u16_t. Signed-off-by: Flavio Ceolin <[email protected]>
1 parent eee10e9 commit 4e8e72b

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

include/sys/math_extras.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
* true if the operation overflowed.
2929
*/
3030
/**@{*/
31+
static bool u16_add_overflow(u16_t a, u16_t b, u16_t *result);
3132
static bool u32_add_overflow(u32_t a, u32_t b, u32_t *result);
3233
static bool u64_add_overflow(u64_t a, u64_t b, u64_t *result);
3334
static bool size_add_overflow(size_t a, size_t b, size_t *result);
@@ -40,6 +41,7 @@ static bool size_add_overflow(size_t a, size_t b, size_t *result);
4041
* true if the operation overflowed.
4142
*/
4243
/**@{*/
44+
static bool u16_mul_overflow(u16_t a, u16_t b, u16_t *result);
4345
static bool u32_mul_overflow(u32_t a, u32_t b, u32_t *result);
4446
static bool u64_mul_overflow(u64_t a, u64_t b, u64_t *result);
4547
static bool size_mul_overflow(size_t a, size_t b, size_t *result);

include/sys/math_extras_impl.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@
2929
#endif
3030

3131
#if use_builtin(__builtin_add_overflow)
32+
static inline bool u16_add_overflow(u16_t a, u16_t b, u16_t *result)
33+
{
34+
return __builtin_add_overflow(a, b, result);
35+
}
36+
3237
static inline bool u32_add_overflow(u32_t a, u32_t b, u32_t *result)
3338
{
3439
return __builtin_add_overflow(a, b, result);
@@ -44,6 +49,15 @@ static inline bool size_add_overflow(size_t a, size_t b, size_t *result)
4449
return __builtin_add_overflow(a, b, result);
4550
}
4651
#else /* !use_builtin(__builtin_add_overflow) */
52+
static inline bool u16_add_overflow(u16_t a, u16_t b, u16_t *result)
53+
{
54+
u16_t c = a + b;
55+
56+
*result = c;
57+
58+
return c < a;
59+
}
60+
4761
static inline bool u32_add_overflow(u32_t a, u32_t b, u32_t *result)
4862
{
4963
u32_t c = a + b;
@@ -73,6 +87,11 @@ static inline bool size_add_overflow(size_t a, size_t b, size_t *result)
7387
#endif /* use_builtin(__builtin_add_overflow) */
7488

7589
#if use_builtin(__builtin_mul_overflow)
90+
static inline bool u16_mul_overflow(u16_t a, u16_t b, u16_t *result)
91+
{
92+
return __builtin_mul_overflow(a, b, result);
93+
}
94+
7695
static inline bool u32_mul_overflow(u32_t a, u32_t b, u32_t *result)
7796
{
7897
return __builtin_mul_overflow(a, b, result);
@@ -88,6 +107,15 @@ static inline bool size_mul_overflow(size_t a, size_t b, size_t *result)
88107
return __builtin_mul_overflow(a, b, result);
89108
}
90109
#else /* !use_builtin(__builtin_mul_overflow) */
110+
static inline bool u16_mul_overflow(u16_t a, u16_t b, u16_t *result)
111+
{
112+
u16_t c = a * b;
113+
114+
*result = c;
115+
116+
return a != 0 && (c / a) != b;
117+
}
118+
91119
static inline bool u32_mul_overflow(u32_t a, u32_t b, u32_t *result)
92120
{
93121
u32_t c = a * b;

0 commit comments

Comments
 (0)