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