12#ifndef ZEPHYR_INCLUDE_SYS_MATH_EXTRAS_H_
13#error "please include <sys/math_extras.h> instead of this file"
25#ifdef PORTABLE_MISC_MATH_EXTRAS
26#define use_builtin(x) 0
27#define __has_type_128 0
29#define use_builtin(x) HAS_BUILTIN(x)
30#ifdef __SIZEOF_INT128__
31 #define __has_type_128 1
33 #define __has_type_128 0
37#if use_builtin(__builtin_add_overflow)
40 return __builtin_add_overflow(a, b, result);
45 return __builtin_add_overflow(a, b, result);
50 return __builtin_add_overflow(a, b, result);
55 return __builtin_add_overflow(a, b, result);
95#if use_builtin(__builtin_mul_overflow)
98 return __builtin_mul_overflow(a, b, result);
103 return __builtin_mul_overflow(a, b, result);
108 return __builtin_mul_overflow(a, b, result);
113 return __builtin_mul_overflow(a, b, result);
122 return a != 0 && (c / a) != b;
131 return a != 0 && (c / a) != b;
140 return a != 0 && (c / a) != b;
149 return a != 0 && (c / a) != b;
193#if use_builtin(__builtin_clz)
196 return (x == 0) ? 32 : __builtin_clz(x);
203 for (b = 0; b < 32 && (x >> 31) == 0; b++) {
211#if use_builtin(__builtin_clzll)
214 return (x == 0) ? 64 : __builtin_clzll(x);
227#if use_builtin(__builtin_ctz)
230 return (x == 0) ? 32 : __builtin_ctz(x);
237 for (b = 0; b < 32 && (x & 1) == 0; b++) {
245#if use_builtin(__builtin_ctzll)
248 return (x == 0) ? 64 : __builtin_ctzll(x);
274 __int128 c = (__int128)a * (__int128)b;
284 int sign = (a < 0) ^ (b < 0);
287 uint64_t a_lo = u_a & 0xFFFFFFFFULL;
289 uint64_t b_lo = u_b & 0xFFFFFFFFULL;
300 uint64_t middle = (res_0 >> 32) + (res_1 & 0xFFFFFFFFULL) + (res_2 & 0xFFFFFFFFULL);
302 result->
low = (res_0 & 0xFFFFFFFFULL) | (middle << 32);
305 carry = (middle >> 32) + (res_1 >> 32) + (res_2 >> 32) + res_3;
306 result->
high = carry;
310 result->
low = ~result->low + 1;
311 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:181
uint64_t high
High-order 64 bits (includes sign bit).
Definition math_extras.h:185
uint64_t low
Low-order 64 bits.
Definition math_extras.h:183