12#ifndef ZEPHYR_INCLUDE_SYS_MATH_EXTRAS_H_
13#error "please include <sys/math_extras.h> instead of this file"
27#ifdef PORTABLE_MISC_MATH_EXTRAS
28#define use_builtin(x) 0
29#define __has_type_128 0
31#define use_builtin(x) HAS_BUILTIN(x)
32#ifdef __SIZEOF_INT128__
33 #define __has_type_128 1
35 #define __has_type_128 0
39#if use_builtin(__builtin_add_overflow)
42 return __builtin_add_overflow(a, b, result);
47 return __builtin_add_overflow(a, b, result);
52 return __builtin_add_overflow(a, b, result);
57 return __builtin_add_overflow(a, b, result);
97#if use_builtin(__builtin_mul_overflow)
100 return __builtin_mul_overflow(a, b, result);
105 return __builtin_mul_overflow(a, b, result);
110 return __builtin_mul_overflow(a, b, result);
115 return __builtin_mul_overflow(a, b, result);
124 return a != 0 && (c / a) != b;
133 return a != 0 && (c / a) != b;
142 return a != 0 && (c / a) != b;
151 return a != 0 && (c / a) != b;
195#if use_builtin(__builtin_clz)
198 return (x == 0) ? 32 : __builtin_clz(x);
205 for (b = 0; b < 32 && (x >> 31) == 0; b++) {
213#if use_builtin(__builtin_clzll)
216 return (x == 0) ? 64 : __builtin_clzll(x);
229#if use_builtin(__builtin_ctz)
232 return (x == 0) ? 32 : __builtin_ctz(x);
239 for (b = 0; b < 32 && (x & 1) == 0; b++) {
247#if use_builtin(__builtin_ctzll)
250 return (x == 0) ? 64 : __builtin_ctzll(x);
276 __int128 c = (__int128)a * (__int128)b;
286 int sign = (a < 0) ^ (b < 0);
289 uint64_t a_lo = u_a & 0xFFFFFFFFULL;
291 uint64_t b_lo = u_b & 0xFFFFFFFFULL;
302 uint64_t middle = (res_0 >> 32) + (res_1 & 0xFFFFFFFFULL) + (res_2 & 0xFFFFFFFFULL);
304 result->
low = (res_0 & 0xFFFFFFFFULL) | (middle << 32);
307 carry = (middle >> 32) + (res_1 >> 32) + (res_2 >> 32) + res_3;
308 result->
high = carry;
312 result->
low = ~result->low + 1;
313 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:187
uint64_t high
High-order 64 bits (includes sign bit).
Definition math_extras.h:191
uint64_t low
Low-order 64 bits.
Definition math_extras.h:189