qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 03/72] qemu/host-utils: Add wrappers for carry builtins


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~



reply via email to

[Prev in Thread] Current Thread [Next in Thread]