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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Feb 4, 2014 at 1:16 PM, Jeffrey Walton <noloader@xxxxxxxxx> 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 of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux