summaryrefslogtreecommitdiffstats
path: root/disk-utils/bitops.h
blob: 270dc2d8f98eef738c009da668d3aa537becfef4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#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