On 5/10/21 7:57 AM, Alex Bennée wrote:
Richard Henderson <richard.hender...@linaro.org> writes:
These builtins came in clang 3.8, but are not present in gcc through
version 11. Even in clang the optimization is not ideal except for
x86_64, but no worse than the hand-coding that we currently do.
Given this statement....
I think you mis-read the "except for x86_64" part?
Anyway, these are simply bugs to be filed against clang, so that hopefully
clang-12 will do a good job with the builtin. And as I said, while the
generated code is not ideal, it's no worse.
+static inline uint64_t uadd64_carry(uint64_t x, uint64_t y, bool *pcarry)
+{
+#if __has_builtin(__builtin_addcll)
+ unsigned long long c = *pcarry;
+ x = __builtin_addcll(x, y, c, &c);
what happens when unsigned long long isn't the same as uint64_t? Doesn't
C99 only specify a minimum?
If you only look at C99, sure. But looking at the set of supported hosts,
unsigned long long is always a 64-bit type.
+ *pcarry = c & 1;
Why do we need to clamp it here? Shouldn't the compiler automatically do
that due to the bool?
This produces a single AND insn, instead of CMP + SETcc.
r~