7#ifndef ZEPHYR_INCLUDE_SYS_MATH_EXTRAS_IMPL_H_
8#define ZEPHYR_INCLUDE_SYS_MATH_EXTRAS_IMPL_H_
15#ifndef ZEPHYR_INCLUDE_SYS_MATH_EXTRAS_H_
16#error "please include <sys/math_extras.h> instead of this file"
30#ifdef PORTABLE_MISC_MATH_EXTRAS
31#define use_builtin(x) 0
32#define __has_type_128 0
34#define use_builtin(x) HAS_BUILTIN(x)
35#ifdef __SIZEOF_INT128__
36 #define __has_type_128 1
38 #define __has_type_128 0
42#if use_builtin(__builtin_add_overflow)
45 return __builtin_add_overflow(a, b, result);
50 return __builtin_add_overflow(a, b, result);
55 return __builtin_add_overflow(a, b, result);
60 return __builtin_add_overflow(a, b, result);
100#if use_builtin(__builtin_mul_overflow)
103 return __builtin_mul_overflow(a, b, result);
108 return __builtin_mul_overflow(a, b, result);
113 return __builtin_mul_overflow(a, b, result);
118 return __builtin_mul_overflow(a, b, result);
127 return a != 0 && (c / a) != b;
136 return a != 0 && (c / a) != b;
145 return a != 0 && (c / a) != b;
154 return a != 0 && (c / a) != b;
198#if use_builtin(__builtin_clz)
201 return (x == 0) ? 32 : __builtin_clz(x);
208 for (b = 0; b < 32 && (x >> 31) == 0; b++) {
216#if use_builtin(__builtin_clzll)
219 return (x == 0) ? 64 : __builtin_clzll(x);
232#if use_builtin(__builtin_ctz)
235 return (x == 0) ? 32 : __builtin_ctz(x);
242 for (b = 0; b < 32 && (x & 1) == 0; b++) {
250#if use_builtin(__builtin_ctzll)
253 return (x == 0) ? 64 : __builtin_ctzll(x);
279 __int128 c = (__int128)a * (__int128)b;
289 int sign = (a < 0) ^ (b < 0);
292 uint64_t a_lo = u_a & 0xFFFFFFFFULL;
294 uint64_t b_lo = u_b & 0xFFFFFFFFULL;
305 uint64_t middle = (res_0 >> 32) + (res_1 & 0xFFFFFFFFULL) + (res_2 & 0xFFFFFFFFULL);
307 result->
low = (res_0 & 0xFFFFFFFFULL) | (middle << 32);
310 carry = (middle >> 32) + (res_1 >> 32) + (res_2 >> 32) + res_3;
311 result->
high = carry;
315 result->
low = ~result->low + 1;
316 result->
high = ~result->high + (result->
low == 0 ? 1 : 0);
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT64_TYPE__ uint64_t
Definition stdint.h:91
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
__INT64_TYPE__ int64_t
Definition stdint.h:75
128-bit integer structure.
Definition math_extras.h:189
uint64_t high
High-order 64 bits (includes sign bit).
Definition math_extras.h:193
uint64_t low
Low-order 64 bits.
Definition math_extras.h:191