macro: implement ABS via __builtin_imaxabs()
This commit is contained in:
@@ -95,6 +95,7 @@ static inline int errno_or_else(int fallback) {
|
||||
return -ABS(fallback);
|
||||
}
|
||||
|
||||
/* abs(3) says: Trying to take the absolute value of the most negative integer is not defined. */
|
||||
#define _DEFINE_ABS_WRAPPER(name) \
|
||||
static inline bool ERRNO_IS_##name(intmax_t r) { \
|
||||
if (r == INTMAX_MIN) \
|
||||
|
||||
@@ -176,12 +176,12 @@
|
||||
UNIQ_T(A, aq) > UNIQ_T(B, bq) ? UNIQ_T(A, aq) : UNIQ_T(B, bq); \
|
||||
})
|
||||
|
||||
#define ABS(a) __ABS(UNIQ, (a))
|
||||
#define __ABS(aq, a) \
|
||||
({ \
|
||||
const typeof(a) UNIQ_T(A, aq) = (a); \
|
||||
UNIQ_T(A, aq) < 0 ? -UNIQ_T(A, aq) : UNIQ_T(A, aq); \
|
||||
})
|
||||
#ifdef __clang__
|
||||
# define ABS(a) __builtin_llabs(a)
|
||||
#else
|
||||
# define ABS(a) __builtin_imaxabs(a)
|
||||
#endif
|
||||
assert_cc(sizeof(intmax_t) <= sizeof(long long));
|
||||
|
||||
#define IS_UNSIGNED_INTEGER_TYPE(type) \
|
||||
(__builtin_types_compatible_p(typeof(type), unsigned char) || \
|
||||
|
||||
Reference in New Issue
Block a user