[jmm-dev] bitwise RMW operators, specifically testAndSetBit/BTS
Andrew Haley
aph at redhat.com
Fri Jul 15 08:06:45 UTC 2016
On 15/07/16 04:16, David Holmes wrote:
> On 15/07/2016 12:09 PM, John Rose wrote:
>> > I think we are missing an important opportunity by not supporting
>> > single-bit RMW operations in VarHandles.
>> >
>> > In particular, the x86 "bts" (bit-test-and-test) "btr"
>> > (bit-test-and-reset) and "btc" (bit-test-and-clear) are sometimes
>> > the right way to modify some data structure, when the alternative
>> > is a load and "cmpxchg" in a loop. The overall costs are
>> > probably the same in the best case, but the loop-based idiom has
>> > some danger (relative to the single-instruction idiom) of costs
>> > stemming from larger code size.
> Is this readily supported on non-x86?
On ARMv8, yes.
>> > In a nutshell, testAndSetBitAcquire behaves as if it were built
>> > on top of compareAndExchangeAcquire (which it may on some
>> > platforms).
>> > The outgoing value parameter is not a value but a bit position
>> > within the memory value (zero = LSB, range-checked). On x86 it
>> > compiles to "lock;bts" with appropriate fencing. It is a great
>> > candidate for building a mutex-enter operation.
It's a huge mistake to insist that only a single bit can be set or
cleared. If it just so happens that a "bts" can be used, fine, but to
bake such a restriction into the library and VM is wrong. The C++
atomic functions which do this job are
++
--
+=
-=
&=
|=
^=
All of these take a std::memory_order argument. C++ compatibility
should be our starting point for such things, IMO.
Andrew.
More information about the jmm-dev
mailing list