diff options
Diffstat (limited to 'llvm/docs/LangRef.rst')
-rw-r--r-- | llvm/docs/LangRef.rst | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index 760a064f69e..cf1243a04b1 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -1496,7 +1496,7 @@ Atomic Memory Ordering Constraints Atomic instructions (:ref:`cmpxchg <i_cmpxchg>`, :ref:`atomicrmw <i_atomicrmw>`, :ref:`fence <i_fence>`, :ref:`atomic load <i_load>`, and :ref:`atomic store <i_store>`) take -an ordering parameter that determines which other atomic instructions on +ordering parameters that determine which other atomic instructions on the same address they *synchronize with*. These semantics are borrowed from Java and C++0x, but are somewhat more colloquial. If these descriptions aren't precise enough, check those specs (see spec @@ -4990,7 +4990,7 @@ Syntax: :: - cmpxchg [volatile] <ty>* <pointer>, <ty> <cmp>, <ty> <new> [singlethread] <ordering> ; yields {ty} + cmpxchg [volatile] <ty>* <pointer>, <ty> <cmp>, <ty> <new> [singlethread] <success ordering> <failure ordering> ; yields {ty} Overview: """"""""" @@ -5013,8 +5013,11 @@ type, and the type of '<pointer>' must be a pointer to that type. If the to modify the number or order of execution of this ``cmpxchg`` with other :ref:`volatile operations <volatile>`. -The :ref:`ordering <ordering>` argument specifies how this ``cmpxchg`` -synchronizes with other atomic operations. +The success and failure :ref:`ordering <ordering>` arguments specify how this +``cmpxchg`` synchronizes with other atomic operations. The both ordering +parameters must be at least ``monotonic``, the ordering constraint on failure +must be no stronger than that on success, and the failure ordering cannot be +either ``release`` or ``acq_rel``. The optional "``singlethread``" argument declares that the ``cmpxchg`` is only atomic with respect to code (usually signal handlers) running in @@ -5032,10 +5035,9 @@ operand is read and compared to '``<cmp>``'; if the read value is the equal, '``<new>``' is written. The original value at the location is returned. -A successful ``cmpxchg`` is a read-modify-write instruction for the purpose -of identifying release sequences. A failed ``cmpxchg`` is equivalent to an -atomic load with an ordering parameter determined by dropping any -``release`` part of the ``cmpxchg``'s ordering. +A successful ``cmpxchg`` is a read-modify-write instruction for the purpose of +identifying release sequences. A failed ``cmpxchg`` is equivalent to an atomic +load with an ordering parameter determined the second ordering parameter. Example: """""""" @@ -5049,7 +5051,7 @@ Example: loop: %cmp = phi i32 [ %orig, %entry ], [%old, %loop] %squared = mul i32 %cmp, %cmp - %old = cmpxchg i32* %ptr, i32 %cmp, i32 %squared ; yields {i32} + %old = cmpxchg i32* %ptr, i32 %cmp, i32 %squared acq_rel monotonic ; yields {i32} %success = icmp eq i32 %cmp, %old br i1 %success, label %done, label %loop |