|
|
|
@ -804,138 +804,6 @@ extern "C" {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
|
* Tru64 (OSF1) / Alpha (Native compiler)
|
|
|
|
|
*
|
|
|
|
|
* Implementation Notes:
|
|
|
|
|
*
|
|
|
|
|
* The Alpha CPU provides instructions to load-lock a value,
|
|
|
|
|
* modify it, and attempt to write it back. If the value has
|
|
|
|
|
* been modified by someone else since the load-lock occurred,
|
|
|
|
|
* the write will fail and you can check the status code to
|
|
|
|
|
* know whether you need to retry or not.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
#elif defined (__alpha)
|
|
|
|
|
|
|
|
|
|
#include <c_asm.h>
|
|
|
|
|
|
|
|
|
|
/* Increment by 1 and return new value */
|
|
|
|
|
inline INT32
|
|
|
|
|
HXAtomicIncRetINT32(INT32* pNum)
|
|
|
|
|
{
|
|
|
|
|
return asm (
|
|
|
|
|
"10: ldl_l %t0, (%a0);" // Load-lock value into a register
|
|
|
|
|
" addl %t0, 1, %t0;" // Increment value
|
|
|
|
|
" or %t0, %zero, %v0;" // set new value for return.
|
|
|
|
|
" stl_c %t0, (%a0);" // Save new value into *pNum
|
|
|
|
|
" beq %t0, 10b;" // Retry if sequence failed
|
|
|
|
|
, pNum);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Decrement by 1 and return new value */
|
|
|
|
|
inline INT32
|
|
|
|
|
HXAtomicDecRetINT32(INT32* pNum)
|
|
|
|
|
{
|
|
|
|
|
return asm (
|
|
|
|
|
"10: ldl_l %t0, (%a0);" // Load-lock value into a register
|
|
|
|
|
" subl %t0, 1, %t0;" // Decrement value
|
|
|
|
|
" or %t0, %zero, %v0;" // set new value for return.
|
|
|
|
|
" stl_c %t0, (%a0);" // Save new value into *pNum
|
|
|
|
|
" beq %t0, 10b;" // Retry if sequence failed
|
|
|
|
|
, pNum);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Add n and return new value */
|
|
|
|
|
inline INT32
|
|
|
|
|
HXAtomicAddRetINT32(INT32* pNum, INT32 n)
|
|
|
|
|
{
|
|
|
|
|
return asm (
|
|
|
|
|
"10: ldl_l %t0, (%a0);" // Load-lock value into a register
|
|
|
|
|
" addl %t0, %a1, %t0;" // Add n to value
|
|
|
|
|
" or %t0, %zero, %v0;" // set new value for return.
|
|
|
|
|
" stl_c %t0, (%a0);" // Save new value into *pNum
|
|
|
|
|
" beq %t0, 10b;" // Retry if sequence failed
|
|
|
|
|
, pNum, n);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Subtract n and return new value */
|
|
|
|
|
inline INT32
|
|
|
|
|
HXAtomicSubRetINT32(INT32* pNum, INT32 n)
|
|
|
|
|
{
|
|
|
|
|
return asm (
|
|
|
|
|
"10: ldl_l %t0, (%a0);" // Load-lock value into a register
|
|
|
|
|
" subl %t0, %a1, %t0;" // Subtract n from value
|
|
|
|
|
" or %t0, %zero, %v0;" // set new value for return.
|
|
|
|
|
" stl_c %t0, (%a0);" // Save new value into *pNum
|
|
|
|
|
" beq %t0, 10b;" // Retry if sequence failed
|
|
|
|
|
, pNum, n);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Increment by 1 and return new value */
|
|
|
|
|
inline UINT32
|
|
|
|
|
HXAtomicIncRetUINT32(UINT32* pNum)
|
|
|
|
|
{
|
|
|
|
|
return asm (
|
|
|
|
|
"10: ldl_l %t0, (%a0);" // Load-lock value into a register
|
|
|
|
|
" addl %t0, 1, %t0;" // Increment value
|
|
|
|
|
" or %t0, %zero, %v0;" // set new value for return.
|
|
|
|
|
" stl_c %t0, (%a0);" // Save new value into *pNum
|
|
|
|
|
" beq %t0, 10b;" // Retry if sequence failed
|
|
|
|
|
, pNum);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Decrement by 1 and return new value */
|
|
|
|
|
inline UINT32
|
|
|
|
|
HXAtomicDecRetUINT32(UINT32* pNum)
|
|
|
|
|
{
|
|
|
|
|
return asm (
|
|
|
|
|
"10: ldl_l %t0, (%a0);" // Load-lock value into a register
|
|
|
|
|
" subl %t0, 1, %t0;" // Decrement value
|
|
|
|
|
" or %t0, %zero, %v0;" // set new value for return.
|
|
|
|
|
" stl_c %t0, (%a0);" // Save new value into *pNum
|
|
|
|
|
" beq %t0, 10b;" // Retry if sequence failed
|
|
|
|
|
, pNum);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Add n and return new value */
|
|
|
|
|
inline UINT32
|
|
|
|
|
HXAtomicAddRetUINT32(UINT32* pNum, UINT32 n)
|
|
|
|
|
{
|
|
|
|
|
return asm (
|
|
|
|
|
"10: ldl_l %t0, (%a0);" // Load-lock value into a register
|
|
|
|
|
" addl %t0, %a1, %t0;" // Add n to value
|
|
|
|
|
" or %t0, %zero, %v0;" // set new value for return.
|
|
|
|
|
" stl_c %t0, (%a0);" // Save new value into *pNum
|
|
|
|
|
" beq %t0, 10b;" // Retry if sequence failed
|
|
|
|
|
, pNum, n);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Subtract n and return new value */
|
|
|
|
|
inline UINT32
|
|
|
|
|
HXAtomicSubRetUINT32(UINT32* pNum, UINT32 n)
|
|
|
|
|
{
|
|
|
|
|
return asm (
|
|
|
|
|
"10: ldl_l %t0, (%a0);" // Load-lock value into a register
|
|
|
|
|
" subl %t0, %a1, %t0;" // Subtract n from value
|
|
|
|
|
" or %t0, %zero, %v0;" // set new value for return.
|
|
|
|
|
" stl_c %t0, (%a0);" // Save new value into *pNum
|
|
|
|
|
" beq %t0, 10b;" // Retry if sequence failed
|
|
|
|
|
, pNum, n);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define HXAtomicIncINT32(p) HXAtomicIncRetINT32((p))
|
|
|
|
|
#define HXAtomicDecINT32(p) HXAtomicDecRetINT32((p))
|
|
|
|
|
#define HXAtomicAddINT32(p,n) HXAtomicAddRetINT32((p),(n))
|
|
|
|
|
#define HXAtomicSubINT32(p,n) HXAtomicSubRetINT32((p),(n))
|
|
|
|
|
|
|
|
|
|
#define HXAtomicIncUINT32(p) HXAtomicIncRetUINT32((p))
|
|
|
|
|
#define HXAtomicDecUINT32(p) HXAtomicDecRetUINT32((p))
|
|
|
|
|
#define HXAtomicAddUINT32(p,n) HXAtomicAddRetUINT32((p),(n))
|
|
|
|
|
#define HXAtomicSubUINT32(p,n) HXAtomicSubRetUINT32((p),(n))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
|
* AIX / PowerPC (Native compiler)
|
|
|
|
|
*
|
|
|
|
|