On Thu, Aug 15, 2024 at 2:16 AM Nathan Bossart <nathandboss...@gmail.com> wrote: >
+static inline bool +pg_neg_u64_overflow(uint64 a, int64 *result) +{ +#if defined(HAVE__BUILTIN_OP_OVERFLOW) + return __builtin_sub_overflow(0, a, result); +#elif defined(HAVE_INT128) + uint128 res = -((int128) a); + + if (unlikely(res < PG_INT64_MIN)) + { + *result = 0x5EED; /* to avoid spurious warnings */ + return true; + } + *result = res; + return false; +#else + if (unlikely(a > (uint64) PG_INT64_MAX + 1)) + { + *result = 0x5EED; /* to avoid spurious warnings */ + return true; + } + if (unlikely(a == (uint64) PG_INT64_MAX + 1)) + *result = PG_INT64_MIN; + else + *result = -((int64) a); + return false; +#endif sorry to bother you. i am confused with " +#elif defined(HAVE_INT128) + uint128 res = -((int128) a); " I thought "unsigned" means non-negative, therefore uint128 means non-negative. therefore "int128 res = -((int128) a);" makes sense to me. also in HAVE_INT128 branch do we need cast int128 to int64, like *result = (int64) res;