This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: What registers are protected by "cc" in a clobberlist when using inline assembly?


On Tue, Feb 4, 2014 at 1:16 PM, Jeffrey Walton <noloader@gmail.com> wrote:
>
> I'm having trouble locating information on the register(s) protected
> by adding "cc" to a clobber list.
>
> Can anyone confirm (1) FLAGS/EFLAGS on x86/c64, and (2) CPSR on ARM?
>
> The reason I ask is I came across some code that sets the Carry Flag
> (CF) on success, but "cc" was not specified in a clobber list:
>
>     char rc;
>     unsigned int val;
>
>     __asm__ volatile(
>         "rdrand %0 ; setc %1"
>         : "=r" (val), "=qm" (rc)
>     );
>
>     // 1 = success, 0 = underflow
>     if(rc) {
>         // use val
>         ...
>     }
>
> So I'm trying to understand why "cc" was not specified.

I'm not sure that explicitly clobbering "cc" has any effect on x86.
For x86 GCC assumes that all asm statements clobber the flags
register.  See ix86_md_asm_clobbers in gcc/config/i386/i386.c.

For ARM "cc" represents the internal representation of the condition
code flags.  It doesn't mean a specific register, but clobbering it
will mean that GCC drops any information it is carrying about
condition flags.  Internally this is represented as a pseudo-register,
CC_REGNUM.

Ian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]