55 lines
1.1 KiB
C
55 lines
1.1 KiB
C
#ifdef __i386__
|
|
|
|
#define bitop(name,op) \
|
|
static inline int name(char * addr,unsigned int nr) \
|
|
{ \
|
|
int __res; \
|
|
__asm__ __volatile__("bt" op " %1,%2; adcl $0,%0" \
|
|
:"=g" (__res) \
|
|
:"r" (nr),"m" (*(addr)),"0" (0)); \
|
|
return __res; \
|
|
}
|
|
|
|
bitop(bit,"")
|
|
bitop(setbit,"s")
|
|
bitop(clrbit,"r")
|
|
|
|
#elif defined(__mc68000__)
|
|
|
|
#define bitop(name,op) \
|
|
static inline int name (char *addr, unsigned int nr) \
|
|
{ \
|
|
char __res; \
|
|
__asm__ __volatile__("bf" op " %2@{%1:#1}; sne %0" \
|
|
: "=d" (__res) \
|
|
: "d" (nr ^ 15), "a" (addr)); \
|
|
return __res != 0; \
|
|
}
|
|
|
|
bitop (bit, "tst")
|
|
bitop (setbit, "set")
|
|
bitop (clrbit, "clr")
|
|
|
|
#else
|
|
static inline int bit(char * addr,unsigned int nr)
|
|
{
|
|
return (addr[nr >> 3] & (1<<(nr & 7))) != 0;
|
|
}
|
|
|
|
static inline int setbit(char * addr,unsigned int nr)
|
|
{
|
|
int __res = bit(addr, nr);
|
|
addr[nr >> 3] |= (1<<(nr & 7));
|
|
return __res != 0; \
|
|
}
|
|
|
|
static inline int clrbit(char * addr,unsigned int nr)
|
|
{
|
|
int __res = bit(addr, nr);
|
|
addr[nr >> 3] &= ~(1<<(nr & 7));
|
|
return __res != 0;
|
|
}
|
|
|
|
#endif
|
|
|