[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.LFD.0.999.0707231043540.3607@woody.linux-foundation.org>
Date: Mon, 23 Jul 2007 10:46:04 -0700 (PDT)
From: Linus Torvalds <torvalds@...ux-foundation.org>
To: Satyam Sharma <ssatyam@....iitk.ac.in>
cc: Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
David Howells <dhowells@...hat.com>,
Nick Piggin <nickpiggin@...oo.com.au>, Andi Kleen <ak@...e.de>,
Andrew Morton <akpm@...ux-foundation.org>
Subject: Re: [PATCH 3/8] i386: bitops: Rectify bogus "+m" constraints
On Mon, 23 Jul 2007, Satyam Sharma wrote:
>
> [3/8] i386: bitops: Rectify bogus "+m" constraints
>
> From the gcc manual:
>
> Extended asm supports input-output or read-write operands. Use the
> constraint character `+' to indicate such an operand and list it with
> the output operands. You should only use read-write operands when the
> constraints for the operand (or the operand in which only some of the
> bits are to be changed) allow a register.
>
> So, using the "+" constraint modifier for memory, like "+m" is bogus.
> We must simply specify "=m" which handles the case correctly.
No. This is wrong.
"=m" means that the new value of the memory location is *set*.
Which means that gcc will potentially optimize away any previous stores to
that memory location.
And yes, it happens, and yes, we've seen it.
The gcc docs are secondary. They're not updated, they aren't correct, they
don't reflect reality, and they don't matter. The only correct thing to
use is "+m" for things like this, or alternatively to just use the
"memory" specifier at the end and make gcc generate really crappy code.
Linus
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists