patch-2.4.19 linux-2.4.19/include/asm-mips/bitops.h
Next file: linux-2.4.19/include/asm-mips/bootinfo.h
Previous file: linux-2.4.19/include/asm-mips/bcache.h
Back to the patch index
Back to the overall index
- Lines: 124
- Date:
Fri Aug 2 17:39:45 2002
- Orig file:
linux-2.4.18/include/asm-mips/bitops.h
- Orig date:
Sun Sep 9 10:43:01 2001
diff -urN linux-2.4.18/include/asm-mips/bitops.h linux-2.4.19/include/asm-mips/bitops.h
@@ -9,6 +9,7 @@
#ifndef _ASM_BITOPS_H
#define _ASM_BITOPS_H
+#include <linux/config.h>
#include <linux/types.h>
#include <asm/byteorder.h> /* sigh ... */
@@ -16,13 +17,12 @@
#include <asm/sgidefs.h>
#include <asm/system.h>
-#include <linux/config.h>
/*
* clear_bit() doesn't provide any barrier for the compiler.
*/
-#define smp_mb__before_clear_bit() barrier()
-#define smp_mb__after_clear_bit() barrier()
+#define smp_mb__before_clear_bit() smp_mb()
+#define smp_mb__after_clear_bit() smp_mb()
/*
* Only disable interrupt for kernel mode stuff to keep usermode stuff
@@ -43,8 +43,6 @@
#ifdef CONFIG_CPU_HAS_LLSC
-#include <asm/mipsregs.h>
-
/*
* These functions for MIPS ISA > 1 are interrupt and SMP proof and
* interrupt friendly
@@ -177,6 +175,9 @@
"sc\t%2, %1\n\t"
"beqz\t%2, 1b\n\t"
" and\t%2, %0, %3\n\t"
+#ifdef CONFIG_SMP
+ "sync\n\t"
+#endif
".set\treorder"
: "=&r" (temp), "=m" (*m), "=&r" (res)
: "r" (1UL << (nr & 0x1f)), "m" (*m)
@@ -229,6 +230,9 @@
"sc\t%2, %1\n\t"
"beqz\t%2, 1b\n\t"
" and\t%2, %0, %3\n\t"
+#ifdef CONFIG_SMP
+ "sync\n\t"
+#endif
".set\treorder"
: "=&r" (temp), "=m" (*m), "=&r" (res)
: "r" (1UL << (nr & 0x1f)), "m" (*m)
@@ -280,6 +284,9 @@
"sc\t%2, %1\n\t"
"beqz\t%2, 1b\n\t"
" and\t%2, %0, %3\n\t"
+#ifdef CONFIG_SMP
+ "sync\n\t"
+#endif
".set\treorder"
: "=&r" (temp), "=m" (*m), "=&r" (res)
: "r" (1UL << (nr & 0x1f)), "m" (*m)
@@ -621,8 +628,7 @@
"2:"
: "=r" (res), "=r" (dummy), "=r" (addr)
: "0" ((signed int) 0), "1" ((unsigned int) 0xffffffff),
- "2" (addr), "r" (size)
- : "$1");
+ "2" (addr), "r" (size));
return res;
}
@@ -657,8 +663,7 @@
".set\treorder\n"
"1:"
: "=r" (set), "=r" (dummy)
- : "0" (0), "1" (1 << bit), "r" (*p)
- : "$1");
+ : "0" (0), "1" (1 << bit), "r" (*p));
if (set < (32 - bit))
return set + offset;
set = 32 - bit;
@@ -679,30 +684,21 @@
*
* Undefined if no zero exists, so code should check against ~0UL first.
*/
-extern __inline__ unsigned long ffz(unsigned long word)
+static __inline__ unsigned long ffz(unsigned long word)
{
- unsigned int __res;
- unsigned int mask = 1;
+ int b = 0, s;
- __asm__ (
- ".set\tnoreorder\n\t"
- ".set\tnoat\n\t"
- "move\t%0,$0\n"
- "1:\tand\t$1,%2,%1\n\t"
- "beqz\t$1,2f\n\t"
- "sll\t%1,1\n\t"
- "bnez\t%1,1b\n\t"
- "addiu\t%0,1\n\t"
- ".set\tat\n\t"
- ".set\treorder\n"
- "2:\n\t"
- : "=&r" (__res), "=r" (mask)
- : "r" (word), "1" (mask)
- : "$1");
+ word = ~word;
+ s = 16; if (word << 16 != 0) s = 0; b += s; word >>= s;
+ s = 8; if (word << 24 != 0) s = 0; b += s; word >>= s;
+ s = 4; if (word << 28 != 0) s = 0; b += s; word >>= s;
+ s = 2; if (word << 30 != 0) s = 0; b += s; word >>= s;
+ s = 1; if (word << 31 != 0) s = 0; b += s;
- return __res;
+ return b;
}
+
#ifdef __KERNEL__
/**
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)