diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-06-20 15:50:20 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-06-21 01:57:24 -0400 |
commit | 437a0a54eea7b101e8a5b70688009956f6522ed0 (patch) | |
tree | a0a2b59e4fc40f01d8ad9b5702698f216e79ff49 | |
parent | 7dbceaf9bb68919651901b101f44edd5391ee489 (diff) |
x86, bitops: make constant-bit set/clear_bit ops faster, gcc workaround
Jeremy Fitzhardinge reported this compiler bug:
Suggestion from Linus: add "r" to the input constraint of the
set_bit()/clear_bit()'s constant 'nr' branch:
Blows up on "gcc version 3.4.4 20050314 (prerelease) (Debian 3.4.3-13)":
CC init/main.o
include2/asm/bitops.h: In function `start_kernel':
include2/asm/bitops.h:59: warning: asm operand 1 probably doesn't match constraints
include2/asm/bitops.h:59: warning: asm operand 1 probably doesn't match constraints
include2/asm/bitops.h:59: warning: asm operand 1 probably doesn't match constraints
include2/asm/bitops.h:59: error: impossible constraint in `asm'
include2/asm/bitops.h:59: error: impossible constraint in `asm'
include2/asm/bitops.h:59: error: impossible constraint in `asm'
Reported-by: Jeremy Fitzhardinge <jeremy@goop.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | include/asm-x86/bitops.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/include/asm-x86/bitops.h b/include/asm-x86/bitops.h index 6c5054819719..96b1829cea15 100644 --- a/include/asm-x86/bitops.h +++ b/include/asm-x86/bitops.h | |||
@@ -58,7 +58,7 @@ static inline void set_bit(unsigned int nr, volatile unsigned long *addr) | |||
58 | if (IS_IMMEDIATE(nr)) { | 58 | if (IS_IMMEDIATE(nr)) { |
59 | asm volatile(LOCK_PREFIX "orb %1,%0" | 59 | asm volatile(LOCK_PREFIX "orb %1,%0" |
60 | : CONST_MASK_ADDR(nr, addr) | 60 | : CONST_MASK_ADDR(nr, addr) |
61 | : "i" (CONST_MASK(nr)) | 61 | : "iq" ((u8)CONST_MASK(nr)) |
62 | : "memory"); | 62 | : "memory"); |
63 | } else { | 63 | } else { |
64 | asm volatile(LOCK_PREFIX "bts %1,%0" | 64 | asm volatile(LOCK_PREFIX "bts %1,%0" |
@@ -95,7 +95,7 @@ static inline void clear_bit(int nr, volatile unsigned long *addr) | |||
95 | if (IS_IMMEDIATE(nr)) { | 95 | if (IS_IMMEDIATE(nr)) { |
96 | asm volatile(LOCK_PREFIX "andb %1,%0" | 96 | asm volatile(LOCK_PREFIX "andb %1,%0" |
97 | : CONST_MASK_ADDR(nr, addr) | 97 | : CONST_MASK_ADDR(nr, addr) |
98 | : "i" (~CONST_MASK(nr))); | 98 | : "iq" ((u8)~CONST_MASK(nr))); |
99 | } else { | 99 | } else { |
100 | asm volatile(LOCK_PREFIX "btr %1,%0" | 100 | asm volatile(LOCK_PREFIX "btr %1,%0" |
101 | : BITOP_ADDR(addr) | 101 | : BITOP_ADDR(addr) |