blob: 377637de58a265a421f593d8bf21b2870701035e [file] [log] [blame]
#include <windows.h>
BOOLEAN _bittest(LONG const *Base,LONG Offset)
{
int old = 0;
__asm__ __volatile__("btl %2,%1\n\tsbbl %0,%0 "
:"=r" (old),"=m" ((*(volatile long *) Base))
:"Ir" (Offset));
return (BOOLEAN) (old!=0);
}
BOOLEAN _bittestandcomplement(LONG *Base,LONG Offset)
{
int old = 0;
__asm__ __volatile__("btcl %2,%1\n\tsbbl %0,%0 "
:"=r" (old),"=m" ((*(volatile long *) Base))
:"Ir" (Offset));
return (BOOLEAN) (old!=0);
}
BOOLEAN InterlockedBitTestAndComplement(LONG *Base,LONG Bit)
{
int old = 0;
__asm__ __volatile__("lock ; btcl %2,%1\n\tsbbl %0,%0 "
:"=r" (old),"=m" ((*(volatile long *) Base))
:"Ir" (Bit));
return (BOOLEAN) (old!=0);
}
BOOLEAN _bittestandset(LONG *Base,LONG Offset)
{
int old = 0;
__asm__ __volatile__("btsl %2,%1\n\tsbbl %0,%0 "
:"=r" (old),"=m" ((*(volatile long *) Base))
:"Ir" (Offset));
return (BOOLEAN) (old!=0);
}
BOOLEAN _bittestandreset(LONG *Base,LONG Offset)
{
int old = 0;
__asm__ __volatile__("btrl %2,%1\n\tsbbl %0,%0 "
:"=r" (old),"=m" ((*(volatile long *) Base))
:"Ir" (Offset));
return (BOOLEAN) (old!=0);
}
BOOLEAN _interlockedbittestandset(LONG *Base,LONG Offset)
{
int old = 0;
__asm__ __volatile__("lock ; btsl %2,%1\n\tsbbl %0,%0 "
:"=r" (old),"=m" ((*(volatile long *) Base))
:"Ir" (Offset));
return (BOOLEAN) (old!=0);
}
BOOLEAN _interlockedbittestandreset(LONG *Base,LONG Offset)
{
int old = 0;
__asm__ __volatile__("lock ; btrl %2,%1\n\tsbbl %0,%0 "
:"=r" (old),"=m" ((*(volatile long *) Base))
:"Ir" (Offset));
return (BOOLEAN) (old!=0);
}
#ifdef _WIN64
BOOLEAN _bittest64(LONG64 const *Base,LONG64 Offset)
{
int old = 0;
__asm__ __volatile__("btq %2,%1\n\tsbbl %0,%0 "
:"=r" (old),"=m" ((*(volatile long long *) Base))
:"Ir" (Offset));
return (BOOLEAN) (old!=0);
}
BOOLEAN _bittestandcomplement64(LONG64 *Base,LONG64 Offset)
{
int old = 0;
__asm__ __volatile__("btcq %2,%1\n\tsbbl %0,%0 "
:"=r" (old),"=m" ((*(volatile long long *) Base))
:"Ir" (Offset));
return (BOOLEAN) (old!=0);
}
BOOLEAN _bittestandset64(LONG64 *Base,LONG64 Offset)
{
int old = 0;
__asm__ __volatile__("btsq %2,%1\n\tsbbl %0,%0 "
:"=r" (old),"=m" ((*(volatile long long *) Base))
:"Ir" (Offset));
return (BOOLEAN) (old!=0);
}
BOOLEAN _bittestandreset64(LONG64 *Base,LONG64 Offset)
{
int old = 0;
__asm__ __volatile__("btrq %2,%1\n\tsbbl %0,%0 "
:"=r" (old),"=m" ((*(volatile long long *) Base))
:"Ir" (Offset));
return (BOOLEAN) (old!=0);
}
BOOLEAN _interlockedbittestandset64(LONG64 *Base,LONG64 Offset)
{
int old = 0;
__asm__ __volatile__("lock ; btsq %2,%1\n\tsbbl %0,%0 "
:"=r" (old),"=m" ((*(volatile long long *) Base))
:"Ir" (Offset));
return (BOOLEAN) (old!=0);
}
BOOLEAN _interlockedbittestandreset64(LONG64 *Base,LONG64 Offset)
{
int old = 0;
__asm__ __volatile__("lock ; btrq %2,%1\n\tsbbl %0,%0 "
:"=r" (old),"=m" ((*(volatile long long *) Base))
:"Ir" (Offset));
return (BOOLEAN) (old!=0);
}
#endif
BOOLEAN _BitScanForward(DWORD *Index,DWORD Mask)
{
__asm__ __volatile__("bsfl %1,%0" : "=r" (Mask),"=m" ((*(volatile long *)Index)));
return Mask!=0;
}
BOOLEAN _BitScanReverse(DWORD *Index,DWORD Mask)
{
__asm__ __volatile__("bsrl %1,%0" : "=r" (Mask),"=m" ((*(volatile long *)Index)));
return Mask!=0;
}
#ifdef _WIN64
BOOLEAN _BitScanForward64(DWORD *Index,DWORD64 Mask)
{
__asm__ __volatile__("bsfq %1,%0" : "=r" (Mask),"=m" ((*(volatile long long *)Index)));
return Mask!=0;
}
BOOLEAN _BitScanReverse64(DWORD *Index,DWORD64 Mask)
{
__asm__ __volatile__("bsrq %1,%0" : "=r" (Mask),"=m" ((*(volatile long long *)Index)));
return Mask!=0;
}
#endif
SHORT InterlockedIncrement16(SHORT volatile *Addend)
{
unsigned char c;
unsigned char s;
__asm__ __volatile__(
"lock ; addw $1,%0; sete %1 ; sets %2"
:"=m" (*Addend), "=qm" (c), "=qm" (s)
:"m" (*Addend) : "memory");
return (c != 0 ? 0 : (s != 0 ? -1 : 1));
}
SHORT InterlockedDecrement16(SHORT volatile *Addend)
{
unsigned char c;
unsigned char s;
__asm__ __volatile__(
"lock ; subw $1,%0; sete %1 ; sets %2"
:"=m" (*Addend), "=qm" (c), "=qm" (s)
:"m" (*Addend) : "memory");
return (c != 0 ? 0 : (s != 0 ? -1 : 1));
}
SHORT InterlockedCompareExchange16(SHORT volatile *Destination,SHORT ExChange,SHORT Comperand)
{
SHORT prev;
__asm__ __volatile__("lock ; cmpxchgw %w1,%2"
:"=a"(prev)
:"q"(ExChange), "m"(*Destination), "0"(Comperand)
: "memory");
return prev;
}
LONG InterlockedAnd(LONG volatile *Destination,LONG Value)
{
__asm__ __volatile__("lock ; andl %0,%1"
: :"r"(Value),"m"(*Destination)
: "memory");
return *Destination;
}
LONG InterlockedOr(LONG volatile *Destination,LONG Value)
{
__asm__ __volatile__("lock ; orl %0,%1"
: : "r"(Value),"m"(*Destination) : "memory");
return *Destination;
}
LONG InterlockedXor(LONG volatile *Destination,LONG Value)
{
__asm__ __volatile__("lock ; xorl %0,%1"
: : "r"(Value),"m"(*Destination) : "memory");
return *Destination;
}
#ifdef _WIN64
LONG64 InterlockedAnd64(LONG64 volatile *Destination,LONG64 Value)
{
__asm__ __volatile__("lock ; andq %0,%1"
: : "r"(Value),"m"(*Destination) : "memory");
return *Destination;
}
LONG64 InterlockedOr64(LONG64 volatile *Destination,LONG64 Value)
{
__asm__ __volatile__("lock ; orq %0,%1"
: : "r"(Value),"m"(*Destination) : "memory");
return *Destination;
}
LONG64 InterlockedXor64(LONG64 volatile *Destination,LONG64 Value)
{
__asm__ __volatile__("lock ; xorq %0,%1"
: : "r"(Value),"m"(*Destination) : "memory");
return *Destination;
}
LONG InterlockedIncrement(LONG volatile *Addend)
{
unsigned char c;
unsigned char s;
__asm__ __volatile__(
"lock ; addl $1,%0; sete %1 ; sets %2"
:"=m" (*Addend), "=qm" (c), "=qm" (s)
:"m" (*Addend) : "memory");
return (c != 0 ? 0 : (s != 0 ? -1 : 1));
}
LONG InterlockedDecrement(LONG volatile *Addend)
{
unsigned char c;
unsigned char s;
__asm__ __volatile__(
"lock ; subl $1,%0; sete %1 ; sets %2"
:"=m" (*Addend), "=qm" (c), "=qm" (s)
:"m" (*Addend) : "memory");
return (c != 0 ? 0 : (s != 0 ? -1 : 1));
}
LONG InterlockedExchange(LONG volatile *Target,LONG Value)
{
__asm__ __volatile("lock ; xchgl %0,%1"
: "=r"(Value)
: "m"(*Target),"0"(Value)
: "memory");
return Value;
}
LONG InterlockedCompareExchange(LONG volatile *Destination,LONG ExChange,LONG Comperand)
{
LONG prev;
__asm__ __volatile__("lock ; cmpxchgl %1,%2" : "=a" (prev) : "q" (ExChange),"m" (*Destination), "0" (Comperand) : "memory");
return prev;
}
LONG64 InterlockedIncrement64(LONG64 volatile *Addend)
{
unsigned char c;
unsigned char s;
__asm__ __volatile__(
"lock ; addq $1,%0; sete %1 ; sets %2"
:"=m" (*Addend), "=qm" (c), "=qm" (s)
:"m" (*Addend) : "memory");
return (c != 0 ? 0 : (s != 0 ? -1 : 1));
}
LONG64 InterlockedDecrement64(LONG64 volatile *Addend)
{
unsigned char c;
unsigned char s;
__asm__ __volatile__(
"lock ; subq $1,%0; sete %1 ; sets %2"
:"=m" (*Addend), "=qm" (c), "=qm" (s)
:"m" (*Addend) : "memory");
return (c != 0 ? 0 : (s != 0 ? -1 : 1));
}
LONG64 InterlockedExchange64(LONG64 volatile *Target,LONG64 Value)
{
__asm__ __volatile("lock ; xchgq %0,%1"
: "=r"(Value)
: "m"(*Target),"0"(Value)
: "memory");
return Value;
}
LONG64 InterlockedCompareExchange64(LONG64 volatile *Destination,LONG64 ExChange,LONG64 Comperand)
{
LONG64 prev;
__asm__ __volatile__("lock ; cmpxchgq %1,%2" : "=a" (prev) : "q" (ExChange),"m" (*Destination), "0" (Comperand) : "memory");
return prev;
}
#endif
#ifdef _WIN64
PVOID InterlockedCompareExchangePointer(PVOID volatile *Destination,PVOID ExChange,PVOID Comperand)
{
PVOID prev;
__asm__ __volatile__("lock ; cmpxchgq %1,%2" : "=a" (prev) : "q" (ExChange),"m" (*Destination), "0" (Comperand) : "memory");
return prev;
}
PVOID InterlockedExchangePointer(PVOID volatile *Target,PVOID Value)
{
__asm__ __volatile("lock ; xchgq %0,%1"
: "=r"(Value)
: "m"(*Target),"0"(Value)
: "memory");
return Value;
}
#endif
#ifdef _WIN64
#if defined(__x86_64)
struct _TEB *NtCurrentTeb(VOID)
{
return (struct _TEB *)__readgsqword(FIELD_OFFSET(NT_TIB,Self));
}
PVOID GetCurrentFiber(VOID)
{
return(PVOID)__readgsqword(FIELD_OFFSET(NT_TIB,FiberData));
}
PVOID GetFiberData(VOID)
{
return *(PVOID *)GetCurrentFiber();
}
BYTE __readgsbyte(DWORD Offset)
{
BYTE ret;
__asm__ volatile ("movb %%gs:%1,%0"
: "=r" (ret) ,"=m" ((*(volatile long *) (DWORD64) Offset)));
return ret;
}
WORD __readgsword(DWORD Offset)
{
WORD ret;
__asm__ volatile ("movw %%gs:%1,%0"
: "=r" (ret) ,"=m" ((*(volatile long *) (DWORD64) Offset)));
return ret;
}
DWORD __readgsdword(DWORD Offset)
{
DWORD ret;
__asm__ volatile ("movl %%gs:%1,%0"
: "=r" (ret) ,"=m" ((*(volatile long *) (DWORD64) Offset)));
return ret;
}
DWORD64 __readgsqword(DWORD Offset)
{
void *ret;
__asm__ volatile ("movq %%gs:%1,%0"
: "=r" (ret) ,"=m" ((*(volatile long *) (DWORD64) Offset)));
return (DWORD64) ret;
}
VOID __writegsbyte(DWORD Offset,BYTE Data)
{
__asm__ volatile ("movb %0,%%gs:%1"
: "=r" (Data) ,"=m" ((*(volatile long *) (DWORD64) Offset)));
}
VOID __writegsword(DWORD Offset,WORD Data)
{
__asm__ volatile ("movw %0,%%gs:%1"
: "=r" (Data) ,"=m" ((*(volatile long *) (DWORD64) Offset)));
}
VOID __writegsdword(DWORD Offset,DWORD Data)
{
__asm__ volatile ("movl %0,%%gs:%1"
: "=r" (Data) ,"=m" ((*(volatile long *) (DWORD64) Offset)));
}
VOID __writegsqword(DWORD Offset,DWORD64 Data)
{
__asm__ volatile ("movq %0,%%gs:%1"
: "=r" (Data) ,"=m" ((*(volatile long *) (DWORD64) Offset)));
}
#endif
#else
struct _TEB *NtCurrentTeb(void)
{
struct _TEB *ret;
__asm__ volatile ("movl %%fs:0x18,%0"
: "=r" (ret));
return ret;
}
#endif