Lines Matching defs:mo

36 static bool IsLoadOrder(morder mo) {
37 return mo == mo_relaxed || mo == mo_consume || mo == mo_acquire ||
38 mo == mo_seq_cst;
41 static bool IsStoreOrder(morder mo) {
42 return mo == mo_relaxed || mo == mo_release || mo == mo_seq_cst;
46 static bool IsReleaseOrder(morder mo) {
47 return mo == mo_release || mo == mo_acq_rel || mo == mo_seq_cst;
50 static bool IsAcquireOrder(morder mo) {
51 return mo == mo_consume || mo == mo_acquire || mo == mo_acq_rel ||
52 mo == mo_seq_cst;
55 static bool IsAcqRelOrder(morder mo) {
56 return mo == mo_acq_rel || mo == mo_seq_cst;
206 static memory_order to_mo(morder mo) {
207 switch (mo) {
228 static T AtomicRMW(ThreadState *thr, uptr pc, volatile T *a, T v, morder mo) {
230 if (LIKELY(mo == mo_relaxed))
235 RWLock lock(&s->mtx, IsReleaseOrder(mo));
236 if (IsAcqRelOrder(mo))
238 else if (IsReleaseOrder(mo))
240 else if (IsAcquireOrder(mo))
244 if (IsReleaseOrder(mo))
251 static T NoTsanAtomic(morder mo, const volatile T *a) {
252 return atomic_load(to_atomic(a), to_mo(mo));
256 static a128 NoTsanAtomic(morder mo, const volatile a128 *a) {
263 static T Atomic(ThreadState *thr, uptr pc, morder mo, const volatile T *a) {
264 DCHECK(IsLoadOrder(mo));
267 if (!IsAcquireOrder(mo)) {
270 return NoTsanAtomic(mo, a);
274 T v = NoTsanAtomic(mo, a);
282 v = NoTsanAtomic(mo, a);
292 static void NoTsanAtomic(morder mo, volatile T *a, T v) {
293 atomic_store(to_atomic(a), v, to_mo(mo));
297 static void NoTsanAtomic(morder mo, volatile a128 *a, a128 v) {
304 static void Atomic(ThreadState *thr, uptr pc, morder mo, volatile T *a, T v) {
305 DCHECK(IsStoreOrder(mo));
312 if (!IsReleaseOrder(mo)) {
313 NoTsanAtomic(mo, a, v);
321 NoTsanAtomic(mo, a, v);
329 static T NoTsanAtomic(morder mo, volatile T *a, T v) {
333 static T Atomic(ThreadState *thr, uptr pc, morder mo, volatile T *a, T v) {
334 return AtomicRMW<T, func_xchg>(thr, pc, a, v, mo);
340 static T NoTsanAtomic(morder mo, volatile T *a, T v) {
345 static T Atomic(ThreadState *thr, uptr pc, morder mo, volatile T *a, T v) {
346 return AtomicRMW<T, func_add>(thr, pc, a, v, mo);
352 static T NoTsanAtomic(morder mo, volatile T *a, T v) {
357 static T Atomic(ThreadState *thr, uptr pc, morder mo, volatile T *a, T v) {
358 return AtomicRMW<T, func_sub>(thr, pc, a, v, mo);
364 static T NoTsanAtomic(morder mo, volatile T *a, T v) {
369 static T Atomic(ThreadState *thr, uptr pc, morder mo, volatile T *a, T v) {
370 return AtomicRMW<T, func_and>(thr, pc, a, v, mo);
376 static T NoTsanAtomic(morder mo, volatile T *a, T v) {
381 static T Atomic(ThreadState *thr, uptr pc, morder mo, volatile T *a, T v) {
382 return AtomicRMW<T, func_or>(thr, pc, a, v, mo);
388 static T NoTsanAtomic(morder mo, volatile T *a, T v) {
393 static T Atomic(ThreadState *thr, uptr pc, morder mo, volatile T *a, T v) {
394 return AtomicRMW<T, func_xor>(thr, pc, a, v, mo);
400 static T NoTsanAtomic(morder mo, volatile T *a, T v) {
405 static T Atomic(ThreadState *thr, uptr pc, morder mo, volatile T *a, T v) {
406 return AtomicRMW<T, func_nand>(thr, pc, a, v, mo);
412 static bool NoTsanAtomic(morder mo, morder fmo, volatile T *a, T *c, T v) {
413 return atomic_compare_exchange_strong(to_atomic(a), c, v, to_mo(mo));
417 static bool NoTsanAtomic(morder mo, morder fmo, volatile a128 *a, a128 *c,
429 static T NoTsanAtomic(morder mo, morder fmo, volatile T *a, T c, T v) {
430 NoTsanAtomic(mo, fmo, a, &c, v);
435 static bool Atomic(ThreadState *thr, uptr pc, morder mo, morder fmo,
444 if (LIKELY(mo == mo_relaxed && fmo == mo_relaxed)) {
453 bool release = IsReleaseOrder(mo);
463 mo = fmo;
465 if (success && IsAcqRelOrder(mo))
467 else if (success && IsReleaseOrder(mo))
469 else if (IsAcquireOrder(mo))
478 static T Atomic(ThreadState *thr, uptr pc, morder mo, morder fmo,
480 Atomic(thr, pc, mo, fmo, a, &c, v);
487 static void NoTsanAtomic(morder mo) { __sync_synchronize(); }
489 static void Atomic(ThreadState *thr, uptr pc, morder mo) {
503 static morder convert_morder(morder mo) {
504 return flags()->force_seq_cst_atomics ? mo_seq_cst : mo;
507 static morder to_morder(int mo) {
518 morder res = static_cast<morder>(static_cast<u8>(mo));
524 ALWAYS_INLINE auto AtomicImpl(morder mo, Types... args) {
528 return Op::NoTsanAtomic(mo, args...);
529 return Op::Atomic(thr, GET_CALLER_PC(), convert_morder(mo), args...);
534 a8 __tsan_atomic8_load(const volatile a8 *a, int mo) {
535 return AtomicImpl<OpLoad>(to_morder(mo), a);
539 a16 __tsan_atomic16_load(const volatile a16 *a, int mo) {
540 return AtomicImpl<OpLoad>(to_morder(mo), a);
544 a32 __tsan_atomic32_load(const volatile a32 *a, int mo) {
545 return AtomicImpl<OpLoad>(to_morder(mo), a);
549 a64 __tsan_atomic64_load(const volatile a64 *a, int mo) {
550 return AtomicImpl<OpLoad>(to_morder(mo), a);
555 a128 __tsan_atomic128_load(const volatile a128 *a, int mo) {
556 return AtomicImpl<OpLoad>(to_morder(mo), a);
561 void __tsan_atomic8_store(volatile a8 *a, a8 v, int mo) {
562 return AtomicImpl<OpStore>(to_morder(mo), a, v);
566 void __tsan_atomic16_store(volatile a16 *a, a16 v, int mo) {
567 return AtomicImpl<OpStore>(to_morder(mo), a, v);
571 void __tsan_atomic32_store(volatile a32 *a, a32 v, int mo) {
572 return AtomicImpl<OpStore>(to_morder(mo), a, v);
576 void __tsan_atomic64_store(volatile a64 *a, a64 v, int mo) {
577 return AtomicImpl<OpStore>(to_morder(mo), a, v);
582 void __tsan_atomic128_store(volatile a128 *a, a128 v, int mo) {
583 return AtomicImpl<OpStore>(to_morder(mo), a, v);
588 a8 __tsan_atomic8_exchange(volatile a8 *a, a8 v, int mo) {
589 return AtomicImpl<OpExchange>(to_morder(mo), a, v);
593 a16 __tsan_atomic16_exchange(volatile a16 *a, a16 v, int mo) {
594 return AtomicImpl<OpExchange>(to_morder(mo), a, v);
598 a32 __tsan_atomic32_exchange(volatile a32 *a, a32 v, int mo) {
599 return AtomicImpl<OpExchange>(to_morder(mo), a, v);
603 a64 __tsan_atomic64_exchange(volatile a64 *a, a64 v, int mo) {
604 return AtomicImpl<OpExchange>(to_morder(mo), a, v);
609 a128 __tsan_atomic128_exchange(volatile a128 *a, a128 v, int mo) {
610 return AtomicImpl<OpExchange>(to_morder(mo), a, v);
615 a8 __tsan_atomic8_fetch_add(volatile a8 *a, a8 v, int mo) {
616 return AtomicImpl<OpFetchAdd>(to_morder(mo), a, v);
620 a16 __tsan_atomic16_fetch_add(volatile a16 *a, a16 v, int mo) {
621 return AtomicImpl<OpFetchAdd>(to_morder(mo), a, v);
625 a32 __tsan_atomic32_fetch_add(volatile a32 *a, a32 v, int mo) {
626 return AtomicImpl<OpFetchAdd>(to_morder(mo), a, v);
630 a64 __tsan_atomic64_fetch_add(volatile a64 *a, a64 v, int mo) {
631 return AtomicImpl<OpFetchAdd>(to_morder(mo), a, v);
636 a128 __tsan_atomic128_fetch_add(volatile a128 *a, a128 v, int mo) {
637 return AtomicImpl<OpFetchAdd>(to_morder(mo), a, v);
642 a8 __tsan_atomic8_fetch_sub(volatile a8 *a, a8 v, int mo) {
643 return AtomicImpl<OpFetchSub>(to_morder(mo), a, v);
647 a16 __tsan_atomic16_fetch_sub(volatile a16 *a, a16 v, int mo) {
648 return AtomicImpl<OpFetchSub>(to_morder(mo), a, v);
652 a32 __tsan_atomic32_fetch_sub(volatile a32 *a, a32 v, int mo) {
653 return AtomicImpl<OpFetchSub>(to_morder(mo), a, v);
657 a64 __tsan_atomic64_fetch_sub(volatile a64 *a, a64 v, int mo) {
658 return AtomicImpl<OpFetchSub>(to_morder(mo), a, v);
663 a128 __tsan_atomic128_fetch_sub(volatile a128 *a, a128 v, int mo) {
664 return AtomicImpl<OpFetchSub>(to_morder(mo), a, v);
669 a8 __tsan_atomic8_fetch_and(volatile a8 *a, a8 v, int mo) {
670 return AtomicImpl<OpFetchAnd>(to_morder(mo), a, v);
674 a16 __tsan_atomic16_fetch_and(volatile a16 *a, a16 v, int mo) {
675 return AtomicImpl<OpFetchAnd>(to_morder(mo), a, v);
679 a32 __tsan_atomic32_fetch_and(volatile a32 *a, a32 v, int mo) {
680 return AtomicImpl<OpFetchAnd>(to_morder(mo), a, v);
684 a64 __tsan_atomic64_fetch_and(volatile a64 *a, a64 v, int mo) {
685 return AtomicImpl<OpFetchAnd>(to_morder(mo), a, v);
690 a128 __tsan_atomic128_fetch_and(volatile a128 *a, a128 v, int mo) {
691 return AtomicImpl<OpFetchAnd>(to_morder(mo), a, v);
696 a8 __tsan_atomic8_fetch_or(volatile a8 *a, a8 v, int mo) {
697 return AtomicImpl<OpFetchOr>(to_morder(mo), a, v);
701 a16 __tsan_atomic16_fetch_or(volatile a16 *a, a16 v, int mo) {
702 return AtomicImpl<OpFetchOr>(to_morder(mo), a, v);
706 a32 __tsan_atomic32_fetch_or(volatile a32 *a, a32 v, int mo) {
707 return AtomicImpl<OpFetchOr>(to_morder(mo), a, v);
711 a64 __tsan_atomic64_fetch_or(volatile a64 *a, a64 v, int mo) {
712 return AtomicImpl<OpFetchOr>(to_morder(mo), a, v);
717 a128 __tsan_atomic128_fetch_or(volatile a128 *a, a128 v, int mo) {
718 return AtomicImpl<OpFetchOr>(to_morder(mo), a, v);
723 a8 __tsan_atomic8_fetch_xor(volatile a8 *a, a8 v, int mo) {
724 return AtomicImpl<OpFetchXor>(to_morder(mo), a, v);
728 a16 __tsan_atomic16_fetch_xor(volatile a16 *a, a16 v, int mo) {
729 return AtomicImpl<OpFetchXor>(to_morder(mo), a, v);
733 a32 __tsan_atomic32_fetch_xor(volatile a32 *a, a32 v, int mo) {
734 return AtomicImpl<OpFetchXor>(to_morder(mo), a, v);
738 a64 __tsan_atomic64_fetch_xor(volatile a64 *a, a64 v, int mo) {
739 return AtomicImpl<OpFetchXor>(to_morder(mo), a, v);
744 a128 __tsan_atomic128_fetch_xor(volatile a128 *a, a128 v, int mo) {
745 return AtomicImpl<OpFetchXor>(to_morder(mo), a, v);
750 a8 __tsan_atomic8_fetch_nand(volatile a8 *a, a8 v, int mo) {
751 return AtomicImpl<OpFetchNand>(to_morder(mo), a, v);
755 a16 __tsan_atomic16_fetch_nand(volatile a16 *a, a16 v, int mo) {
756 return AtomicImpl<OpFetchNand>(to_morder(mo), a, v);
760 a32 __tsan_atomic32_fetch_nand(volatile a32 *a, a32 v, int mo) {
761 return AtomicImpl<OpFetchNand>(to_morder(mo), a, v);
765 a64 __tsan_atomic64_fetch_nand(volatile a64 *a, a64 v, int mo) {
766 return AtomicImpl<OpFetchNand>(to_morder(mo), a, v);
771 a128 __tsan_atomic128_fetch_nand(volatile a128 *a, a128 v, int mo) {
772 return AtomicImpl<OpFetchNand>(to_morder(mo), a, v);
777 int __tsan_atomic8_compare_exchange_strong(volatile a8 *a, a8 *c, a8 v, int mo,
779 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
784 int mo, int fmo) {
785 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
790 int mo, int fmo) {
791 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
796 int mo, int fmo) {
797 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
803 int mo, int fmo) {
804 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
809 int __tsan_atomic8_compare_exchange_weak(volatile a8 *a, a8 *c, a8 v, int mo,
811 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
816 int mo, int fmo) {
817 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
822 int mo, int fmo) {
823 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
828 int mo, int fmo) {
829 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
835 int mo, int fmo) {
836 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
841 a8 __tsan_atomic8_compare_exchange_val(volatile a8 *a, a8 c, a8 v, int mo,
843 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
847 a16 __tsan_atomic16_compare_exchange_val(volatile a16 *a, a16 c, a16 v, int mo,
849 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
853 a32 __tsan_atomic32_compare_exchange_val(volatile a32 *a, a32 c, a32 v, int mo,
855 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
859 a64 __tsan_atomic64_compare_exchange_val(volatile a64 *a, a64 c, a64 v, int mo,
861 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
867 int mo, int fmo) {
868 return AtomicImpl<OpCAS>(to_morder(mo), to_morder(fmo), a, c, v);
873 void __tsan_atomic_thread_fence(int mo) {
874 return AtomicImpl<OpFence>(to_morder(mo));
878 void __tsan_atomic_signal_fence(int mo) {}