This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: basic asm and memory clobbers
- From: Segher Boessenkool <segher at kernel dot crashing dot org>
- To: David Wohlferd <dw at LimeGreenSocks dot com>
- Cc: "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>, rth at gcc dot gnu dot org, pinskia at gcc dot gnu dot org, Jeff Law <law at redhat dot com>, Sandra Loosemore <sandra at codesourcery dot com>
- Date: Mon, 9 Nov 2015 03:32:29 -0600
- Subject: Re: basic asm and memory clobbers
- Authentication-results: sourceware.org; auth=none
- References: <563FE459 dot 3000003 at LimeGreenSocks dot com>
On Sun, Nov 08, 2015 at 04:10:01PM -0800, David Wohlferd wrote:
> It seems like a doc update is what is needed to close PR24414 (Old-style
> asms don't clobber memory).
What is needed to close the bug is to make the compiler work properly.
Whether that means clobbering memory or not, I don't much care -- with
the status quo, if you want your asm to clobber memory you have to use
extended asm; if basic asm is made to clobber memory, if you want your
asm to *not* clobber memory you have to use extended asm (which you
can with no operands by writing e.g. asm("bork" : ); ). So both
behaviours are available whether we make a change or not.
But changing things now will likely break user code.
> Safely accessing C data and calling functions from basic @code{asm} is more
> -complex than it may appear. To access C data, it is better to use extended
> +complex than it may appear. To access C data (including both local and
> +global register variables), use extended
> @code{asm}.
I don't think this makes things clearer. Register vars are described
elsewhere already; if you really think it needs mentioning here, put
it at the end (in its own sentence), don't break up this sentence.
(dot space space).
> +Basic @code{asm} statements are not treated as though they used a "memory"
> +clobber, although they do implicitly perform a clobber of the flags
> +(@pxref{Clobbers}).
They do not clobber the flags. Observe:
===
void f(int a)
{
a = a >> 2;
if (a <= 0)
asm("OHAI");
if (a >= 0)
asm("OHAI2");
}
===
Compiling this for powerpc gives (-m32, edited):
f:
srawi. 9,3,2 # this sets cr0
ble 0,.L5 # this uses cr0
.L2:
OHAI2
blr
.p2align 4,,15
.L5:
OHAI
bnelr 0 # this uses cr0
b .L2
which shows that CR0 (which is "cc") is live over the asm. So are all
other condition regs.
It is true for cc0 targets I guess, but there aren't many of those left.
> Also, there is no implicit clobbering of registers,
> +so any registers changed must be restored to their original value before
> +exiting the @code{asm}.
One of the important uses of asm is to set registers GCC does not know
about, so you might want to phrase this differently.
Segher