Annotation of Gnu-Mach/i386/i386at/gpl/linux/include/asm/bitops.h, revision 1.1.1.1

1.1       root        1: #ifndef _I386_BITOPS_H
                      2: #define _I386_BITOPS_H
                      3: 
                      4: /*
                      5:  * Copyright 1992, Linus Torvalds.
                      6:  */
                      7: 
                      8: /*
                      9:  * These have to be done with inline assembly: that way the bit-setting
                     10:  * is guaranteed to be atomic. All bit operations return 0 if the bit
                     11:  * was cleared before the operation and != 0 if it was not.
                     12:  *
                     13:  * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
                     14:  */
                     15: 
                     16: #ifdef __SMP__
                     17: #define LOCK_PREFIX "lock ; "
                     18: #else
                     19: #define LOCK_PREFIX ""
                     20: #endif
                     21: 
                     22: /*
                     23:  * Some hacks to defeat gcc over-optimizations..
                     24:  */
                     25: struct __dummy { unsigned long a[100]; };
                     26: #define ADDR (*(struct __dummy *) addr)
                     27: #define CONST_ADDR (*(const struct __dummy *) addr)
                     28: 
                     29: extern __inline__ int set_bit(int nr, void * addr)
                     30: {
                     31:        int oldbit;
                     32: 
                     33:        __asm__ __volatile__(LOCK_PREFIX
                     34:                "btsl %2,%1\n\tsbbl %0,%0"
                     35:                :"=r" (oldbit),"=m" (ADDR)
                     36:                :"ir" (nr));
                     37:        return oldbit;
                     38: }
                     39: 
                     40: extern __inline__ int clear_bit(int nr, void * addr)
                     41: {
                     42:        int oldbit;
                     43: 
                     44:        __asm__ __volatile__(LOCK_PREFIX
                     45:                "btrl %2,%1\n\tsbbl %0,%0"
                     46:                :"=r" (oldbit),"=m" (ADDR)
                     47:                :"ir" (nr));
                     48:        return oldbit;
                     49: }
                     50: 
                     51: extern __inline__ int change_bit(int nr, void * addr)
                     52: {
                     53:        int oldbit;
                     54: 
                     55:        __asm__ __volatile__(LOCK_PREFIX
                     56:                "btcl %2,%1\n\tsbbl %0,%0"
                     57:                :"=r" (oldbit),"=m" (ADDR)
                     58:                :"ir" (nr));
                     59:        return oldbit;
                     60: }
                     61: 
                     62: /*
                     63:  * This routine doesn't need to be atomic.
                     64:  */
                     65: extern __inline__ int test_bit(int nr, const void * addr)
                     66: {
                     67:        return 1UL & (((const unsigned int *) addr)[nr >> 5] >> (nr & 31));
                     68: }
                     69: 
                     70: /*
                     71:  * Find-bit routines..
                     72:  */
                     73: extern __inline__ int find_first_zero_bit(void * addr, unsigned size)
                     74: {
                     75:        int res;
                     76: 
                     77:        if (!size)
                     78:                return 0;
                     79:        __asm__("
                     80:                cld
                     81:                movl $-1,%%eax
                     82:                xorl %%edx,%%edx
                     83:                repe; scasl
                     84:                je 1f
                     85:                xorl -4(%%edi),%%eax
                     86:                subl $4,%%edi
                     87:                bsfl %%eax,%%edx
                     88: 1:             subl %%ebx,%%edi
                     89:                shll $3,%%edi
                     90:                addl %%edi,%%edx"
                     91:                :"=d" (res)
                     92:                :"c" ((size + 31) >> 5), "D" (addr), "b" (addr)
                     93:                :"ax", "cx", "di");
                     94:        return res;
                     95: }
                     96: 
                     97: extern __inline__ int find_next_zero_bit (void * addr, int size, int offset)
                     98: {
                     99:        unsigned long * p = ((unsigned long *) addr) + (offset >> 5);
                    100:        int set = 0, bit = offset & 31, res;
                    101:        
                    102:        if (bit) {
                    103:                /*
                    104:                 * Look for zero in first byte
                    105:                 */
                    106:                __asm__("
                    107:                        bsfl %1,%0
                    108:                        jne 1f
                    109:                        movl $32, %0
                    110: 1:                     "
                    111:                        : "=r" (set)
                    112:                        : "r" (~(*p >> bit)));
                    113:                if (set < (32 - bit))
                    114:                        return set + offset;
                    115:                set = 32 - bit;
                    116:                p++;
                    117:        }
                    118:        /*
                    119:         * No zero yet, search remaining full bytes for a zero
                    120:         */
                    121:        res = find_first_zero_bit (p, size - 32 * (p - (unsigned long *) addr));
                    122:        return (offset + set + res);
                    123: }
                    124: 
                    125: /*
                    126:  * ffz = Find First Zero in word. Undefined if no zero exists,
                    127:  * so code should check against ~0UL first..
                    128:  */
                    129: extern __inline__ unsigned long ffz(unsigned long word)
                    130: {
                    131:        __asm__("bsfl %1,%0"
                    132:                :"=r" (word)
                    133:                :"r" (~word));
                    134:        return word;
                    135: }
                    136: 
                    137: #endif /* _I386_BITOPS_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.