Skip to content

Commit

Permalink
Fix atomic add and atomic subtract. Now passes tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
amejia1 committed Jun 22, 2012
1 parent 3d4ab0b commit ee92ffd
Showing 1 changed file with 38 additions and 0 deletions.
38 changes: 38 additions & 0 deletions xbmc/threads/Atomics.cpp
Expand Up @@ -306,6 +306,25 @@ long AtomicAdd(volatile long* pAddr, long amount)
return amount;
}

#elif defined(__GNUC__)

long AtomicAdd(volatile long* pAddr, long amount)
{
return __sync_add_and_fetch(pAddr, amount);
}

#elif defined(__x86_64__)

long AtomicAdd(volatile long* pAddr, long amount)
{
register long result;
__asm__ __volatile__ (
"lock/xaddq %q0, %1"
: "=r" (result), "=m" (*pAddr)
: "0" ((long) (amount)), "m" (*pAddr));
return *pAddr;
}

#else // Linux / OSX86 (GCC)

long AtomicAdd(volatile long* pAddr, long amount)
Expand Down Expand Up @@ -466,6 +485,25 @@ long AtomicSubtract(volatile long* pAddr, long amount)
return amount;
}

#elif defined(__GNUC__)

long AtomicSubtract(volatile long* pAddr, long amount)
{
return __sync_sub_and_fetch(pAddr, amount);
}

#elif defined(__x86_64__)

long AtomicSubtract(volatile long* pAddr, long amount)
{
register long result;
__asm__ __volatile__ (
"lock/xaddq %q0, %1"
: "=r" (result), "=m" (*pAddr)
: "0" ((long) (-1 * amount)), "m" (*pAddr));
return *pAddr;
}

#else // Linux / OSX86 (GCC)

long AtomicSubtract(volatile long* pAddr, long amount)
Expand Down

0 comments on commit ee92ffd

Please sign in to comment.