Messages in this thread | | | Date | Mon, 09 Oct 2006 08:27:54 +0200 | From | Jan Kiszka <> | Subject | Re: 2.4.x: i386/x86_64 bitops clobberings |
| |
Willy Tarreau wrote: > I've done it too, but unfortunately, I discovered that it does not build > with gcc-2.95 anymore, while 3.3 is fine : > > cyclades.c: In function `cyy_interrupt': > /usr/src/git/linux-2.4/include/asm/bitops.h:130: inconsistent operand constraints in an `asm' > cyclades.c: In function `cyz_handle_rx': > /usr/src/git/linux-2.4/include/asm/bitops.h:130: inconsistent operand constraints in an `asm' > > 127 __asm__ __volatile__( LOCK_PREFIX > 128 "btsl %2,%1\n\tsbbl %0,%0" > 129 :"=r" (oldbit),"+m" (ADDR) > 130 :"Ir" (nr) : "memory"); > > > I don't know what the right solution should be. I'm not fond of #ifdefs, > and I'm embarrassed to know that gcc can do all sorts of nasty things due > to a wrong clobbering :-/ > > If you have any idea on the subject, I'm willing to try.
What about
#if __GNUC__ < 3 #define ADDR_DEPS "=m" #else #define ADDR_DEPS "+m" #endif
__asm__ __volatile__( LOCK_PREFIX "btsl %2,%1\n\tsbbl %0,%0" :"=r" (oldbit),ADDR_DEPS (ADDR) :"Ir" (nr) : "memory");
or something similar? Would keep the number of #ifs low.
Jan
[unhandled content-type:application/pgp-signature] | |