RFR(xs): 8211387: [Zero] atomic_copy64: Use ldrexd for atomic reads on ARMv7

dean.long at oracle.com dean.long at oracle.com
Sat Oct 6 20:11:01 UTC 2018


On 10/5/18 5:18 PM, David Holmes wrote:
> On 6/10/2018 12:18 AM, Andrew Haley wrote:
>> On 10/05/2018 02:40 PM, Severin Gehwolf wrote:
>>>> Also I thought that if ldrex was not paired with a strex then you 
>>>> should
>>>> at least issue clrex - as done in generate_atomic_load_long() in
>>>> stubGenerator_arm.cpp
>>>
>>> I'll defer to Andrew Haley for this.
>>
>> I'm skeptical that CLREX is necessary. The classic CAS for Arm is
>>
>>      MOV  R1, #0xFF             ; load the ?lock taken? value
>> try LDREX    R0, [LockAddr]    ; load the lock value
>>      CMP R0,  #0                ; is the lock free?
>>      STREXEQ  R1, R0, [LockAddr]; try and claim the lock
>>      CMPEQ R0, #0               ; did this succeed?
>>      BNE try                    ; no ? try again. . .
>> ; yes ? we have the lock
>>
>> There's no CLREX, and no-one ever reported any problem. CLREX could be
>> a performance boost because it takes the cache line out of exclusive
>> state back to shared state, reducing later bus traffic.
>
> I would see CLREX as a potential performance boost not something 
> needed for correctness. But you're right that failure paths from 
> typical CAS code won't execute the strex and don't include a clrex.
>

I think it's needed for correctness only at context-switch time.  If you 
context switch after the LDREX, you don't want the exclusive state to 
remain for the next thread scheduled.

dl

> David



More information about the hotspot-dev mailing list