Lines Matching refs:mo
36 static bool IsLoadOrder(morder mo) { in IsLoadOrder() argument
37 return mo == mo_relaxed || mo == mo_consume in IsLoadOrder()
38 || mo == mo_acquire || mo == mo_seq_cst; in IsLoadOrder()
41 static bool IsStoreOrder(morder mo) { in IsStoreOrder() argument
42 return mo == mo_relaxed || mo == mo_release || mo == mo_seq_cst; in IsStoreOrder()
46 static bool IsReleaseOrder(morder mo) { in IsReleaseOrder() argument
47 return mo == mo_release || mo == mo_acq_rel || mo == mo_seq_cst; in IsReleaseOrder()
50 static bool IsAcquireOrder(morder mo) { in IsAcquireOrder() argument
51 return mo == mo_consume || mo == mo_acquire in IsAcquireOrder()
52 || mo == mo_acq_rel || mo == mo_seq_cst; in IsAcquireOrder()
55 static bool IsAcqRelOrder(morder mo) { in IsAcqRelOrder() argument
56 return mo == mo_acq_rel || mo == mo_seq_cst; in IsAcqRelOrder()
198 static memory_order to_mo(morder mo) { in to_mo() argument
199 switch (mo) { in to_mo()
212 static T NoTsanAtomicLoad(const volatile T *a, morder mo) { in NoTsanAtomicLoad() argument
213 return atomic_load(to_atomic(a), to_mo(mo)); in NoTsanAtomicLoad()
217 static a128 NoTsanAtomicLoad(const volatile a128 *a, morder mo) { in NoTsanAtomicLoad() argument
224 static T AtomicLoad(ThreadState *thr, uptr pc, const volatile T *a, morder mo) { in AtomicLoad() argument
225 DCHECK(IsLoadOrder(mo)); in AtomicLoad()
228 if (!IsAcquireOrder(mo)) { in AtomicLoad()
231 return NoTsanAtomicLoad(a, mo); in AtomicLoad()
235 T v = NoTsanAtomicLoad(a, mo); in AtomicLoad()
242 v = NoTsanAtomicLoad(a, mo); in AtomicLoad()
249 static void NoTsanAtomicStore(volatile T *a, T v, morder mo) { in NoTsanAtomicStore() argument
250 atomic_store(to_atomic(a), v, to_mo(mo)); in NoTsanAtomicStore()
254 static void NoTsanAtomicStore(volatile a128 *a, a128 v, morder mo) { in NoTsanAtomicStore() argument
262 morder mo) { in AtomicStore() argument
263 DCHECK(IsStoreOrder(mo)); in AtomicStore()
269 if (!IsReleaseOrder(mo)) { in AtomicStore()
270 NoTsanAtomicStore(a, v, mo); in AtomicStore()
280 NoTsanAtomicStore(a, v, mo); in AtomicStore()
284 static T AtomicRMW(ThreadState *thr, uptr pc, volatile T *a, T v, morder mo) { in AtomicRMW() argument
286 if (LIKELY(mo == mo_relaxed)) in AtomicRMW()
293 if (IsAcqRelOrder(mo)) in AtomicRMW()
295 else if (IsReleaseOrder(mo)) in AtomicRMW()
297 else if (IsAcquireOrder(mo)) in AtomicRMW()
303 static T NoTsanAtomicExchange(volatile T *a, T v, morder mo) { in NoTsanAtomicExchange() argument
308 static T NoTsanAtomicFetchAdd(volatile T *a, T v, morder mo) { in NoTsanAtomicFetchAdd() argument
313 static T NoTsanAtomicFetchSub(volatile T *a, T v, morder mo) { in NoTsanAtomicFetchSub() argument
318 static T NoTsanAtomicFetchAnd(volatile T *a, T v, morder mo) { in NoTsanAtomicFetchAnd() argument
323 static T NoTsanAtomicFetchOr(volatile T *a, T v, morder mo) { in NoTsanAtomicFetchOr() argument
328 static T NoTsanAtomicFetchXor(volatile T *a, T v, morder mo) { in NoTsanAtomicFetchXor() argument
333 static T NoTsanAtomicFetchNand(volatile T *a, T v, morder mo) { in NoTsanAtomicFetchNand() argument
339 morder mo) { in AtomicExchange() argument
340 return AtomicRMW<T, func_xchg>(thr, pc, a, v, mo); in AtomicExchange()
345 morder mo) { in AtomicFetchAdd() argument
346 return AtomicRMW<T, func_add>(thr, pc, a, v, mo); in AtomicFetchAdd()
351 morder mo) { in AtomicFetchSub() argument
352 return AtomicRMW<T, func_sub>(thr, pc, a, v, mo); in AtomicFetchSub()
357 morder mo) { in AtomicFetchAnd() argument
358 return AtomicRMW<T, func_and>(thr, pc, a, v, mo); in AtomicFetchAnd()
363 morder mo) { in AtomicFetchOr() argument
364 return AtomicRMW<T, func_or>(thr, pc, a, v, mo); in AtomicFetchOr()
369 morder mo) { in AtomicFetchXor() argument
370 return AtomicRMW<T, func_xor>(thr, pc, a, v, mo); in AtomicFetchXor()
375 morder mo) { in AtomicFetchNand() argument
376 return AtomicRMW<T, func_nand>(thr, pc, a, v, mo); in AtomicFetchNand()
380 static bool NoTsanAtomicCAS(volatile T *a, T *c, T v, morder mo, morder fmo) { in NoTsanAtomicCAS() argument
381 return atomic_compare_exchange_strong(to_atomic(a), c, v, to_mo(mo)); in NoTsanAtomicCAS()
386 morder mo, morder fmo) { in NoTsanAtomicCAS() argument
397 static T NoTsanAtomicCAS(volatile T *a, T c, T v, morder mo, morder fmo) { in NoTsanAtomicCAS() argument
398 NoTsanAtomicCAS(a, &c, v, mo, fmo); in NoTsanAtomicCAS()
404 morder mo, morder fmo) { in AtomicCAS() argument
411 if (LIKELY(mo == mo_relaxed && fmo == mo_relaxed)) { in AtomicCAS()
420 bool release = IsReleaseOrder(mo); in AtomicCAS()
428 mo = fmo; in AtomicCAS()
434 if (success && IsAcqRelOrder(mo)) in AtomicCAS()
436 else if (success && IsReleaseOrder(mo)) in AtomicCAS()
438 else if (IsAcquireOrder(mo)) in AtomicCAS()
445 volatile T *a, T c, T v, morder mo, morder fmo) { in AtomicCAS() argument
446 AtomicCAS(thr, pc, a, &c, v, mo, fmo); in AtomicCAS()
451 static void NoTsanAtomicFence(morder mo) { in NoTsanAtomicFence() argument
455 static void AtomicFence(ThreadState *thr, uptr pc, morder mo) { in AtomicFence() argument
466 static morder convert_morder(morder mo) { in convert_morder() argument
480 return (morder)(mo & 0x7fff); in convert_morder()
488 mo = convert_morder(mo); \
493 a8 __tsan_atomic8_load(const volatile a8 *a, morder mo) { in __tsan_atomic8_load() argument
494 ATOMIC_IMPL(Load, a, mo); in __tsan_atomic8_load()
498 a16 __tsan_atomic16_load(const volatile a16 *a, morder mo) { in __tsan_atomic16_load() argument
499 ATOMIC_IMPL(Load, a, mo); in __tsan_atomic16_load()
503 a32 __tsan_atomic32_load(const volatile a32 *a, morder mo) { in __tsan_atomic32_load() argument
504 ATOMIC_IMPL(Load, a, mo); in __tsan_atomic32_load()
508 a64 __tsan_atomic64_load(const volatile a64 *a, morder mo) { in __tsan_atomic64_load() argument
509 ATOMIC_IMPL(Load, a, mo); in __tsan_atomic64_load()
514 a128 __tsan_atomic128_load(const volatile a128 *a, morder mo) { in __tsan_atomic128_load() argument
515 ATOMIC_IMPL(Load, a, mo); in __tsan_atomic128_load()
520 void __tsan_atomic8_store(volatile a8 *a, a8 v, morder mo) { in __tsan_atomic8_store() argument
521 ATOMIC_IMPL(Store, a, v, mo); in __tsan_atomic8_store()
525 void __tsan_atomic16_store(volatile a16 *a, a16 v, morder mo) { in __tsan_atomic16_store() argument
526 ATOMIC_IMPL(Store, a, v, mo); in __tsan_atomic16_store()
530 void __tsan_atomic32_store(volatile a32 *a, a32 v, morder mo) { in __tsan_atomic32_store() argument
531 ATOMIC_IMPL(Store, a, v, mo); in __tsan_atomic32_store()
535 void __tsan_atomic64_store(volatile a64 *a, a64 v, morder mo) { in __tsan_atomic64_store() argument
536 ATOMIC_IMPL(Store, a, v, mo); in __tsan_atomic64_store()
541 void __tsan_atomic128_store(volatile a128 *a, a128 v, morder mo) { in __tsan_atomic128_store() argument
542 ATOMIC_IMPL(Store, a, v, mo); in __tsan_atomic128_store()
547 a8 __tsan_atomic8_exchange(volatile a8 *a, a8 v, morder mo) { in __tsan_atomic8_exchange() argument
548 ATOMIC_IMPL(Exchange, a, v, mo); in __tsan_atomic8_exchange()
552 a16 __tsan_atomic16_exchange(volatile a16 *a, a16 v, morder mo) { in __tsan_atomic16_exchange() argument
553 ATOMIC_IMPL(Exchange, a, v, mo); in __tsan_atomic16_exchange()
557 a32 __tsan_atomic32_exchange(volatile a32 *a, a32 v, morder mo) { in __tsan_atomic32_exchange() argument
558 ATOMIC_IMPL(Exchange, a, v, mo); in __tsan_atomic32_exchange()
562 a64 __tsan_atomic64_exchange(volatile a64 *a, a64 v, morder mo) { in __tsan_atomic64_exchange() argument
563 ATOMIC_IMPL(Exchange, a, v, mo); in __tsan_atomic64_exchange()
568 a128 __tsan_atomic128_exchange(volatile a128 *a, a128 v, morder mo) { in __tsan_atomic128_exchange() argument
569 ATOMIC_IMPL(Exchange, a, v, mo); in __tsan_atomic128_exchange()
574 a8 __tsan_atomic8_fetch_add(volatile a8 *a, a8 v, morder mo) { in __tsan_atomic8_fetch_add() argument
575 ATOMIC_IMPL(FetchAdd, a, v, mo); in __tsan_atomic8_fetch_add()
579 a16 __tsan_atomic16_fetch_add(volatile a16 *a, a16 v, morder mo) { in __tsan_atomic16_fetch_add() argument
580 ATOMIC_IMPL(FetchAdd, a, v, mo); in __tsan_atomic16_fetch_add()
584 a32 __tsan_atomic32_fetch_add(volatile a32 *a, a32 v, morder mo) { in __tsan_atomic32_fetch_add() argument
585 ATOMIC_IMPL(FetchAdd, a, v, mo); in __tsan_atomic32_fetch_add()
589 a64 __tsan_atomic64_fetch_add(volatile a64 *a, a64 v, morder mo) { in __tsan_atomic64_fetch_add() argument
590 ATOMIC_IMPL(FetchAdd, a, v, mo); in __tsan_atomic64_fetch_add()
595 a128 __tsan_atomic128_fetch_add(volatile a128 *a, a128 v, morder mo) { in __tsan_atomic128_fetch_add() argument
596 ATOMIC_IMPL(FetchAdd, a, v, mo); in __tsan_atomic128_fetch_add()
601 a8 __tsan_atomic8_fetch_sub(volatile a8 *a, a8 v, morder mo) { in __tsan_atomic8_fetch_sub() argument
602 ATOMIC_IMPL(FetchSub, a, v, mo); in __tsan_atomic8_fetch_sub()
606 a16 __tsan_atomic16_fetch_sub(volatile a16 *a, a16 v, morder mo) { in __tsan_atomic16_fetch_sub() argument
607 ATOMIC_IMPL(FetchSub, a, v, mo); in __tsan_atomic16_fetch_sub()
611 a32 __tsan_atomic32_fetch_sub(volatile a32 *a, a32 v, morder mo) { in __tsan_atomic32_fetch_sub() argument
612 ATOMIC_IMPL(FetchSub, a, v, mo); in __tsan_atomic32_fetch_sub()
616 a64 __tsan_atomic64_fetch_sub(volatile a64 *a, a64 v, morder mo) { in __tsan_atomic64_fetch_sub() argument
617 ATOMIC_IMPL(FetchSub, a, v, mo); in __tsan_atomic64_fetch_sub()
622 a128 __tsan_atomic128_fetch_sub(volatile a128 *a, a128 v, morder mo) { in __tsan_atomic128_fetch_sub() argument
623 ATOMIC_IMPL(FetchSub, a, v, mo); in __tsan_atomic128_fetch_sub()
628 a8 __tsan_atomic8_fetch_and(volatile a8 *a, a8 v, morder mo) { in __tsan_atomic8_fetch_and() argument
629 ATOMIC_IMPL(FetchAnd, a, v, mo); in __tsan_atomic8_fetch_and()
633 a16 __tsan_atomic16_fetch_and(volatile a16 *a, a16 v, morder mo) { in __tsan_atomic16_fetch_and() argument
634 ATOMIC_IMPL(FetchAnd, a, v, mo); in __tsan_atomic16_fetch_and()
638 a32 __tsan_atomic32_fetch_and(volatile a32 *a, a32 v, morder mo) { in __tsan_atomic32_fetch_and() argument
639 ATOMIC_IMPL(FetchAnd, a, v, mo); in __tsan_atomic32_fetch_and()
643 a64 __tsan_atomic64_fetch_and(volatile a64 *a, a64 v, morder mo) { in __tsan_atomic64_fetch_and() argument
644 ATOMIC_IMPL(FetchAnd, a, v, mo); in __tsan_atomic64_fetch_and()
649 a128 __tsan_atomic128_fetch_and(volatile a128 *a, a128 v, morder mo) { in __tsan_atomic128_fetch_and() argument
650 ATOMIC_IMPL(FetchAnd, a, v, mo); in __tsan_atomic128_fetch_and()
655 a8 __tsan_atomic8_fetch_or(volatile a8 *a, a8 v, morder mo) { in __tsan_atomic8_fetch_or() argument
656 ATOMIC_IMPL(FetchOr, a, v, mo); in __tsan_atomic8_fetch_or()
660 a16 __tsan_atomic16_fetch_or(volatile a16 *a, a16 v, morder mo) { in __tsan_atomic16_fetch_or() argument
661 ATOMIC_IMPL(FetchOr, a, v, mo); in __tsan_atomic16_fetch_or()
665 a32 __tsan_atomic32_fetch_or(volatile a32 *a, a32 v, morder mo) { in __tsan_atomic32_fetch_or() argument
666 ATOMIC_IMPL(FetchOr, a, v, mo); in __tsan_atomic32_fetch_or()
670 a64 __tsan_atomic64_fetch_or(volatile a64 *a, a64 v, morder mo) { in __tsan_atomic64_fetch_or() argument
671 ATOMIC_IMPL(FetchOr, a, v, mo); in __tsan_atomic64_fetch_or()
676 a128 __tsan_atomic128_fetch_or(volatile a128 *a, a128 v, morder mo) { in __tsan_atomic128_fetch_or() argument
677 ATOMIC_IMPL(FetchOr, a, v, mo); in __tsan_atomic128_fetch_or()
682 a8 __tsan_atomic8_fetch_xor(volatile a8 *a, a8 v, morder mo) { in __tsan_atomic8_fetch_xor() argument
683 ATOMIC_IMPL(FetchXor, a, v, mo); in __tsan_atomic8_fetch_xor()
687 a16 __tsan_atomic16_fetch_xor(volatile a16 *a, a16 v, morder mo) { in __tsan_atomic16_fetch_xor() argument
688 ATOMIC_IMPL(FetchXor, a, v, mo); in __tsan_atomic16_fetch_xor()
692 a32 __tsan_atomic32_fetch_xor(volatile a32 *a, a32 v, morder mo) { in __tsan_atomic32_fetch_xor() argument
693 ATOMIC_IMPL(FetchXor, a, v, mo); in __tsan_atomic32_fetch_xor()
697 a64 __tsan_atomic64_fetch_xor(volatile a64 *a, a64 v, morder mo) { in __tsan_atomic64_fetch_xor() argument
698 ATOMIC_IMPL(FetchXor, a, v, mo); in __tsan_atomic64_fetch_xor()
703 a128 __tsan_atomic128_fetch_xor(volatile a128 *a, a128 v, morder mo) { in __tsan_atomic128_fetch_xor() argument
704 ATOMIC_IMPL(FetchXor, a, v, mo); in __tsan_atomic128_fetch_xor()
709 a8 __tsan_atomic8_fetch_nand(volatile a8 *a, a8 v, morder mo) { in __tsan_atomic8_fetch_nand() argument
710 ATOMIC_IMPL(FetchNand, a, v, mo); in __tsan_atomic8_fetch_nand()
714 a16 __tsan_atomic16_fetch_nand(volatile a16 *a, a16 v, morder mo) { in __tsan_atomic16_fetch_nand() argument
715 ATOMIC_IMPL(FetchNand, a, v, mo); in __tsan_atomic16_fetch_nand()
719 a32 __tsan_atomic32_fetch_nand(volatile a32 *a, a32 v, morder mo) { in __tsan_atomic32_fetch_nand() argument
720 ATOMIC_IMPL(FetchNand, a, v, mo); in __tsan_atomic32_fetch_nand()
724 a64 __tsan_atomic64_fetch_nand(volatile a64 *a, a64 v, morder mo) { in __tsan_atomic64_fetch_nand() argument
725 ATOMIC_IMPL(FetchNand, a, v, mo); in __tsan_atomic64_fetch_nand()
730 a128 __tsan_atomic128_fetch_nand(volatile a128 *a, a128 v, morder mo) { in __tsan_atomic128_fetch_nand() argument
731 ATOMIC_IMPL(FetchNand, a, v, mo); in __tsan_atomic128_fetch_nand()
737 morder mo, morder fmo) { in __tsan_atomic8_compare_exchange_strong() argument
738 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic8_compare_exchange_strong()
743 morder mo, morder fmo) { in __tsan_atomic16_compare_exchange_strong() argument
744 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic16_compare_exchange_strong()
749 morder mo, morder fmo) { in __tsan_atomic32_compare_exchange_strong() argument
750 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic32_compare_exchange_strong()
755 morder mo, morder fmo) { in __tsan_atomic64_compare_exchange_strong() argument
756 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic64_compare_exchange_strong()
762 morder mo, morder fmo) { in __tsan_atomic128_compare_exchange_strong() argument
763 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic128_compare_exchange_strong()
769 morder mo, morder fmo) { in __tsan_atomic8_compare_exchange_weak() argument
770 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic8_compare_exchange_weak()
775 morder mo, morder fmo) { in __tsan_atomic16_compare_exchange_weak() argument
776 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic16_compare_exchange_weak()
781 morder mo, morder fmo) { in __tsan_atomic32_compare_exchange_weak() argument
782 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic32_compare_exchange_weak()
787 morder mo, morder fmo) { in __tsan_atomic64_compare_exchange_weak() argument
788 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic64_compare_exchange_weak()
794 morder mo, morder fmo) { in __tsan_atomic128_compare_exchange_weak() argument
795 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic128_compare_exchange_weak()
801 morder mo, morder fmo) { in __tsan_atomic8_compare_exchange_val() argument
802 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic8_compare_exchange_val()
807 morder mo, morder fmo) { in __tsan_atomic16_compare_exchange_val() argument
808 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic16_compare_exchange_val()
813 morder mo, morder fmo) { in __tsan_atomic32_compare_exchange_val() argument
814 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic32_compare_exchange_val()
819 morder mo, morder fmo) { in __tsan_atomic64_compare_exchange_val() argument
820 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic64_compare_exchange_val()
826 morder mo, morder fmo) { in __tsan_atomic128_compare_exchange_val() argument
827 ATOMIC_IMPL(CAS, a, c, v, mo, fmo); in __tsan_atomic128_compare_exchange_val()
832 void __tsan_atomic_thread_fence(morder mo) { ATOMIC_IMPL(Fence, mo); } in __tsan_atomic_thread_fence() argument
835 void __tsan_atomic_signal_fence(morder mo) { in __tsan_atomic_signal_fence() argument