|
|
dd89bb |
#include <psxtypes/psxtypes.h>
|
|
|
dd89bb |
|
|
|
dd89bb |
long _InterlockedIncrement(int32_t volatile * ptr);
|
|
|
dd89bb |
int64_t _InterlockedIncrement64(int64_t volatile * ptr);
|
|
|
dd89bb |
long _InterlockedDecrement(int32_t volatile * ptr);
|
|
|
dd89bb |
int64_t _InterlockedDecrement64(int64_t volatile * ptr);
|
|
|
dd89bb |
long _InterlockedExchangeAdd(int32_t volatile * ptr, int32_t val);
|
|
|
dd89bb |
int64_t _InterlockedExchangeAdd64(int64_t volatile * ptr, int64_t val);
|
|
|
dd89bb |
long _InterlockedCompareExchange(int32_t volatile * dst, int32_t xchg, int32_t cmp);
|
|
|
dd89bb |
int64_t _InterlockedCompareExchange64(int64_t volatile * dst, int64_t xchg, int64_t cmp);
|
|
|
dd89bb |
long _InterlockedAnd(int32_t volatile * dst, int32_t mask);
|
|
|
dd89bb |
int64_t _InterlockedAnd64(int64_t volatile * dst, int64_t mask);
|
|
|
dd89bb |
long _InterlockedOr(int32_t volatile * dst, int32_t mask);
|
|
|
dd89bb |
int64_t _InterlockedOr64(int64_t volatile * dst, int64_t mask);
|
|
|
dd89bb |
long _InterlockedXor(int32_t volatile * dst, int32_t mask);
|
|
|
dd89bb |
int64_t _InterlockedXor64(int64_t volatile * dst, int64_t mask);
|
|
|
dd89bb |
uint16_t __popcnt16(uint16_t mask);
|
|
|
dd89bb |
uint32_t __popcnt(uint32_t mask);
|
|
|
dd89bb |
uint64_t __popcnt64(uint64_t mask);
|
|
|
dd89bb |
void _ReadWriteBarrier(void);
|
|
|
dd89bb |
unsigned char _BitScanForward64(unsigned int * index, uintptr_t mask);
|
|
|
dd89bb |
unsigned char _BitScanReverse64(unsigned int * index, uintptr_t mask);
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_locked_inc(
|
|
|
dd89bb |
intptr_t volatile * ptr)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_InterlockedIncrement64(ptr);
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_locked_inc_32(
|
|
|
dd89bb |
int32_t volatile * ptr)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_InterlockedIncrement(ptr);
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_locked_inc_64(
|
|
|
dd89bb |
int64_t volatile * ptr)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_InterlockedIncrement64(ptr);
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_locked_dec(
|
|
|
dd89bb |
intptr_t volatile * ptr)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_InterlockedDecrement64(ptr);
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_locked_dec_32(
|
|
|
dd89bb |
int32_t volatile * ptr)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_InterlockedDecrement(ptr);
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_locked_dec_64(
|
|
|
dd89bb |
int64_t volatile * ptr)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_InterlockedDecrement64(ptr);
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_locked_add(
|
|
|
dd89bb |
intptr_t volatile * ptr,
|
|
|
dd89bb |
intptr_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_InterlockedExchangeAdd64(ptr, val);
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_locked_add_32(
|
|
|
dd89bb |
int32_t volatile * ptr,
|
|
|
dd89bb |
int32_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_InterlockedExchangeAdd(ptr, val);
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_locked_add_64(
|
|
|
dd89bb |
int64_t volatile * ptr,
|
|
|
dd89bb |
int64_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_InterlockedExchangeAdd64(ptr, val);
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_locked_sub(
|
|
|
dd89bb |
intptr_t volatile * ptr,
|
|
|
dd89bb |
intptr_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_InterlockedExchangeAdd64(ptr, -val);
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_locked_sub_32(
|
|
|
dd89bb |
int32_t volatile * ptr,
|
|
|
dd89bb |
int32_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_InterlockedExchangeAdd(ptr, -val);
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_locked_sub_64(
|
|
|
dd89bb |
int64_t volatile * ptr,
|
|
|
dd89bb |
int64_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_InterlockedExchangeAdd64(ptr, -val);
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ intptr_t at_locked_xadd(
|
|
|
dd89bb |
intptr_t volatile * ptr,
|
|
|
dd89bb |
intptr_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedExchangeAdd64(ptr, val);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int32_t at_locked_xadd_32(
|
|
|
dd89bb |
int32_t volatile * ptr,
|
|
|
dd89bb |
int32_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedExchangeAdd(ptr, val);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int64_t at_locked_xadd_64(
|
|
|
dd89bb |
int64_t volatile * ptr,
|
|
|
dd89bb |
int64_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedExchangeAdd64(ptr, val);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ intptr_t at_locked_xsub(
|
|
|
dd89bb |
intptr_t volatile * ptr,
|
|
|
dd89bb |
intptr_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedExchangeAdd64(ptr, -val);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int32_t at_locked_xsub_32(
|
|
|
dd89bb |
int32_t volatile * ptr,
|
|
|
dd89bb |
int32_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedExchangeAdd(ptr, -val);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int64_t at_locked_xsub_64(
|
|
|
dd89bb |
int64_t volatile * ptr,
|
|
|
dd89bb |
int64_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedExchangeAdd64(ptr, -val);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ intptr_t at_locked_cas(
|
|
|
dd89bb |
intptr_t volatile * dst,
|
|
|
dd89bb |
intptr_t cmp,
|
|
|
dd89bb |
intptr_t xchg)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedCompareExchange64(dst,xchg,cmp);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int32_t at_locked_cas_32(
|
|
|
dd89bb |
int32_t volatile * dst,
|
|
|
dd89bb |
int32_t cmp,
|
|
|
dd89bb |
int32_t xchg)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedCompareExchange(dst,xchg,cmp);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int64_t at_locked_cas_64(
|
|
|
dd89bb |
int64_t volatile * dst,
|
|
|
dd89bb |
int64_t cmp,
|
|
|
dd89bb |
int64_t xchg)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedCompareExchange64(dst,xchg,cmp);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ intptr_t at_locked_and(
|
|
|
dd89bb |
intptr_t volatile * dst,
|
|
|
dd89bb |
intptr_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedAnd64(dst,mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int32_t at_locked_and_32(
|
|
|
dd89bb |
int32_t volatile * dst,
|
|
|
dd89bb |
int32_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedAnd(dst,mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int64_t at_locked_and_64(
|
|
|
dd89bb |
int64_t volatile * dst,
|
|
|
dd89bb |
int64_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedAnd64(dst,mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ intptr_t at_locked_or(
|
|
|
dd89bb |
intptr_t volatile * dst,
|
|
|
dd89bb |
intptr_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedOr64(dst,mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int32_t at_locked_or_32(
|
|
|
dd89bb |
int32_t volatile * dst,
|
|
|
dd89bb |
int32_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedOr(dst,mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int64_t at_locked_or_64(
|
|
|
dd89bb |
int64_t volatile * dst,
|
|
|
dd89bb |
int64_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedOr64(dst,mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ intptr_t at_locked_xor(
|
|
|
dd89bb |
intptr_t volatile * dst,
|
|
|
dd89bb |
intptr_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedXor64(dst,mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int32_t at_locked_xor_32(
|
|
|
dd89bb |
int32_t volatile * dst,
|
|
|
dd89bb |
int32_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedXor(dst,mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int64_t at_locked_xor_64(
|
|
|
dd89bb |
int64_t volatile * dst,
|
|
|
dd89bb |
int64_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return _InterlockedXor64(dst,mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_store(
|
|
|
dd89bb |
volatile intptr_t * dst,
|
|
|
dd89bb |
intptr_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_ReadWriteBarrier();
|
|
|
dd89bb |
*dst = val;
|
|
|
dd89bb |
_ReadWriteBarrier();
|
|
|
dd89bb |
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_store_32(
|
|
|
dd89bb |
volatile int32_t * dst,
|
|
|
dd89bb |
int32_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_ReadWriteBarrier();
|
|
|
dd89bb |
*dst = val;
|
|
|
dd89bb |
_ReadWriteBarrier();
|
|
|
dd89bb |
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ void at_store_64(
|
|
|
dd89bb |
volatile int64_t * dst,
|
|
|
dd89bb |
int64_t val)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
_ReadWriteBarrier();
|
|
|
dd89bb |
*dst = val;
|
|
|
dd89bb |
_ReadWriteBarrier();
|
|
|
dd89bb |
|
|
|
dd89bb |
return;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int at_bsf(
|
|
|
dd89bb |
unsigned int * index,
|
|
|
dd89bb |
uintptr_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return (int)_BitScanForward64(index,mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ int at_bsr(
|
|
|
dd89bb |
unsigned int * index,
|
|
|
dd89bb |
uintptr_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return (int)_BitScanReverse64(index,mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ size_t at_popcount(
|
|
|
dd89bb |
uintptr_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return __popcnt64(mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ size_t at_popcount_16(
|
|
|
dd89bb |
uint16_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return __popcnt16(mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ size_t at_popcount_32(
|
|
|
dd89bb |
uint32_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return __popcnt(mask);
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
static __inline__ size_t at_popcount_64(
|
|
|
dd89bb |
uint64_t mask)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
return __popcnt64(mask);
|
|
|
dd89bb |
}
|