Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
openmp/runtime/src/kmp_atomic.cpp
Show First 20 Lines • Show All 826 Lines • ▼ Show 20 Lines | while (!KMP_COMPARE_AND_STORE_ACQ##BITS( \ | ||||
\ | \ | ||||
*old_value.vvv = *(volatile kmp_int##BITS *)lhs; \ | *old_value.vvv = *(volatile kmp_int##BITS *)lhs; \ | ||||
new_value.cmp = (TYPE)(old_value.cmp OP rhs); \ | new_value.cmp = (TYPE)(old_value.cmp OP rhs); \ | ||||
} \ | } \ | ||||
} | } | ||||
// end of the first part of the workaround for C78287 | // end of the first part of the workaround for C78287 | ||||
#endif // USE_CMPXCHG_FIX | #endif // USE_CMPXCHG_FIX | ||||
#if KMP_OS_WINDOWS && KMP_ARCH_AARCH64 | |||||
// Undo explicit type casts to get MSVC ARM64 to build. Uses | |||||
// OP_CMPXCHG_WORKAROUND definition for OP_CMPXCHG | |||||
#undef OP_CMPXCHG | |||||
#define OP_CMPXCHG(TYPE, BITS, OP) \ | |||||
{ \ | |||||
struct _sss { \ | |||||
TYPE cmp; \ | |||||
kmp_int##BITS *vvv; \ | |||||
}; \ | |||||
struct _sss old_value, new_value; \ | |||||
old_value.vvv = (kmp_int##BITS *)&old_value.cmp; \ | |||||
new_value.vvv = (kmp_int##BITS *)&new_value.cmp; \ | |||||
*old_value.vvv = *(volatile kmp_int##BITS *)lhs; \ | |||||
new_value.cmp = old_value.cmp OP rhs; \ | |||||
while (!KMP_COMPARE_AND_STORE_ACQ##BITS( \ | |||||
(kmp_int##BITS *)lhs, *VOLATILE_CAST(kmp_int##BITS *) old_value.vvv, \ | |||||
*VOLATILE_CAST(kmp_int##BITS *) new_value.vvv)) { \ | |||||
KMP_DO_PAUSE; \ | |||||
\ | |||||
*old_value.vvv = *(volatile kmp_int##BITS *)lhs; \ | |||||
new_value.cmp = old_value.cmp OP rhs; \ | |||||
} \ | |||||
} | |||||
#undef OP_UPDATE_CRITICAL | |||||
#define OP_UPDATE_CRITICAL(TYPE, OP, LCK_ID) \ | |||||
__kmp_acquire_atomic_lock(&ATOMIC_LOCK##LCK_ID, gtid); \ | |||||
(*lhs) = (*lhs)OP rhs; \ | |||||
__kmp_release_atomic_lock(&ATOMIC_LOCK##LCK_ID, gtid); | |||||
#endif // KMP_OS_WINDOWS && KMP_ARCH_AARCH64 | |||||
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 | #if KMP_ARCH_X86 || KMP_ARCH_X86_64 | ||||
// ------------------------------------------------------------------------ | // ------------------------------------------------------------------------ | ||||
// X86 or X86_64: no alignment problems ==================================== | // X86 or X86_64: no alignment problems ==================================== | ||||
#define ATOMIC_FIXED_ADD(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, MASK, \ | #define ATOMIC_FIXED_ADD(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, MASK, \ | ||||
GOMP_FLAG) \ | GOMP_FLAG) \ | ||||
ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ | ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ | ||||
OP_UPDATE_GOMP_CRITICAL(TYPE, OP, GOMP_FLAG) \ | OP_UPDATE_GOMP_CRITICAL(TYPE, OP, GOMP_FLAG) \ | ||||
▲ Show 20 Lines • Show All 2,818 Lines • Show Last 20 Lines |