Replace inline assembly in task system with equivalent gcc intrinsics.
gcc/icc build only: the Windows build still uses the Win32 calls for these.
This commit is contained in:
@@ -331,21 +331,12 @@ TaskGroupBase::AllocMemory(int64_t size, int32_t alignment) {
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// Atomics and the like
|
// Atomics and the like
|
||||||
|
|
||||||
#if (__SIZEOF_POINTER__ == 4) || defined(__i386__) || defined(_WIN32)
|
|
||||||
#define ISPC_POINTER_BYTES 4
|
|
||||||
#elif (__SIZEOF_POINTER__ == 8) || defined(__x86_64__) || defined(__amd64__) || defined(_WIN64)
|
|
||||||
#define ISPC_POINTER_BYTES 8
|
|
||||||
#else
|
|
||||||
#error "Pointer size unknown!"
|
|
||||||
#endif // __SIZEOF_POINTER__
|
|
||||||
|
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
lMemFence() {
|
lMemFence() {
|
||||||
// Windows atomic functions already contain the fence
|
// Windows atomic functions already contain the fence
|
||||||
// KNC doesn't need the memory barrier
|
// KNC doesn't need the memory barrier
|
||||||
#if !defined ISPC_IS_KNC && !defined ISPC_IS_WINDOWS
|
#if !defined ISPC_IS_KNC && !defined ISPC_IS_WINDOWS
|
||||||
__asm__ __volatile__("mfence":::"memory");
|
__sync_synchronize();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -354,18 +345,7 @@ lAtomicCompareAndSwapPointer(void **v, void *newValue, void *oldValue) {
|
|||||||
#ifdef ISPC_IS_WINDOWS
|
#ifdef ISPC_IS_WINDOWS
|
||||||
return InterlockedCompareExchangePointer(v, newValue, oldValue);
|
return InterlockedCompareExchangePointer(v, newValue, oldValue);
|
||||||
#else
|
#else
|
||||||
void *result;
|
void *result = __sync_val_compare_and_swap(v, oldValue, newValue);
|
||||||
#if (ISPC_POINTER_BYTES == 4)
|
|
||||||
__asm__ __volatile__("lock\ncmpxchgl %2,%1"
|
|
||||||
: "=a"(result), "=m"(*v)
|
|
||||||
: "q"(newValue), "0"(oldValue)
|
|
||||||
: "memory");
|
|
||||||
#else
|
|
||||||
__asm__ __volatile__("lock\ncmpxchgq %2,%1"
|
|
||||||
: "=a"(result), "=m"(*v)
|
|
||||||
: "q"(newValue), "0"(oldValue)
|
|
||||||
: "memory");
|
|
||||||
#endif // ISPC_POINTER_BYTES
|
|
||||||
lMemFence();
|
lMemFence();
|
||||||
return result;
|
return result;
|
||||||
#endif // ISPC_IS_WINDOWS
|
#endif // ISPC_IS_WINDOWS
|
||||||
@@ -376,11 +356,7 @@ lAtomicCompareAndSwap32(volatile int32_t *v, int32_t newValue, int32_t oldValue)
|
|||||||
#ifdef ISPC_IS_WINDOWS
|
#ifdef ISPC_IS_WINDOWS
|
||||||
return InterlockedCompareExchange((volatile LONG *)v, newValue, oldValue);
|
return InterlockedCompareExchange((volatile LONG *)v, newValue, oldValue);
|
||||||
#else
|
#else
|
||||||
int32_t result;
|
int32_t result = __sync_val_compare_and_swap(v, oldValue, newValue);
|
||||||
__asm__ __volatile__("lock\ncmpxchgl %2,%1"
|
|
||||||
: "=a"(result), "=m"(*v)
|
|
||||||
: "q"(newValue), "0"(oldValue)
|
|
||||||
: "memory");
|
|
||||||
lMemFence();
|
lMemFence();
|
||||||
return result;
|
return result;
|
||||||
#endif // ISPC_IS_WINDOWS
|
#endif // ISPC_IS_WINDOWS
|
||||||
@@ -391,12 +367,7 @@ lAtomicAdd(volatile int32_t *v, int32_t delta) {
|
|||||||
#ifdef ISPC_IS_WINDOWS
|
#ifdef ISPC_IS_WINDOWS
|
||||||
return InterlockedAdd((volatile LONG *)v, delta);
|
return InterlockedAdd((volatile LONG *)v, delta);
|
||||||
#else
|
#else
|
||||||
int32_t origValue;
|
return __sync_fetch_and_add(v, delta);
|
||||||
__asm__ __volatile__("lock\n"
|
|
||||||
"xaddl %0,%1"
|
|
||||||
: "=r"(origValue), "=m"(*v) : "0"(delta)
|
|
||||||
: "memory");
|
|
||||||
return origValue;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user