|
From: | Richard Henderson |
Subject: | Re: [PATCH 03/72] qemu/host-utils: Add wrappers for carry builtins |
Date: | Tue, 11 May 2021 15:10:34 -0500 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.1 |
On 5/10/21 7:57 AM, Alex Bennée wrote:
Richard Henderson <richard.henderson@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~
[Prev in Thread] | Current Thread | [Next in Thread] |