[Bug inline-asm/68095] "cc" clobber with Flag Output Operands
gccbugzilla at limegreensocks dot com
gcc-bugzilla@gcc.gnu.org
Mon Nov 16 00:25:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68095
--- Comment #5 from David <gccbugzilla at limegreensocks dot com> ---
> the target code adds a cc clobber always.
Agreed. On i386, there is no way to say that an extended asm doesn't clobber
"cc", so it only serves as a comment on that specific platform.
> There is no conflict.
I believe we may be talking about two different things. From the point of view
of -da and -S, no conflicting code is generated. The output is correct and
functions as expected.
But looking at the definition of a clobber:
- "values changed by the AssemblerTemplate, beyond those listed as outputs."
- "Clobber descriptions may not in any way overlap with an input or output
operand."
It's hard to reconcile those statements with this code (which the compiler
currently accepts):
asm("bt $0, %1" : "@ccc" (vout) : "r" (vin) : "cc");
Looking at -da output, it looks like "cc" generates "clobber reg:CC", while @cc
generates "set reg:CC". It makes no sense to ever generate both, which is what
this C statement implies.
I believe the correct way to write this (which the compiler also accepts and
generates identical code) is:
asm("bt $0, %1" : "@ccc" (vout) : "r" (vin));
Silently ignoring the user's attempt to simultaneously use and clobber cc is a
logical guess about what the user really wants. But I'm saying the compiler
should instead treat that the same way it treats simultaneously clobbering and
using other things. For example: asm volatile ("" : "=a"(a) :: "eax")
generates an "impossible constraints" error.
If I have not convinced you to generate an error for the simultaneously use,
can I at least write a doc patch for this to help clarify things for users?
Something that points out that there is no way to disable "cc" for i386, and
provides a sample for using @cc?
More information about the Gcc-bugs
mailing list