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

Ian Lance Taylor iant@google.com
Tue Feb 4 21:55:00 GMT 2014


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



More information about the Gcc-help mailing list