Re: cmpxchg and x86 flags output

From: H. Peter Anvin
Date: Thu Jun 16 2016 - 18:22:29 EST


On 06/15/16 01:50, Peter Zijlstra wrote:
>>
>> It seems to me that the sanest way to handle this is to add a new
>> interface with a fourth parameter, so:
>>
>> changed = cmpxchgx(ptr, old, new, out);
>
> See also:
>
> lkml.kernel.org/r/146358429016.8596.3381723959064491676.stgit@xxxxxxxxxxxxxxxxxxxxxx
>
> where David suggests the same.
>
>>
>> A generic implementation of cmpxchgx() would be provided, looking like:
>>
>> #define cmpxchgx(ptr, old, new, out) ({ \
>> __typeof__((*(ptr))) __old = (old); \
>> __typeof__((*(ptr))) __new = (new); \
>> __typeof__((*(ptr))) __old = (old); \
>> __typeof__((*(ptr))) __out; \
>> (out) = __out = cmpxchg(ptr, __old, __new); \
>> (__old != __out); \
>> })
>>
>> ... and so on for all the many other variants.
>>
>> However, I'm wondering how well this will fit in with other
>> architectures.
>
> All ll/sc based archs also already know if the operation succeeded
> without having to do the extra comparison.
>
> SPARCv9,S390x which are native CAS architectures, also places the
> success of the operation in condition codes.
>
> IA64 might be the odd duck out (or I'm not reading the manual right,
> which is entirely possible).
>
>> Keep in mind gcc will probably gain this ability for
>> other architectures with flags at some point, although that doesn't
>> inherently mean that cmpxchg will be able to make use of it.
>>
>> This means a lot of changes even to common code, so I want to make sure
>> the interface is right before embarking on an implementation.
>>
>> Thoughts?
>
> David has already done lots of the conversions for you.
>

Well, that sounds promising. I wonder how David's model, using
intrinsics (do we have enough intrinsics to actually be able to do this
"correctly"?), compare to using the flags output from assembly.

-hpa