http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51423
Richard Earnshaw <rearnsha at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |RESOLVED Resolution| |FIXED --- Comment #1 from Richard Earnshaw <rearnsha at gcc dot gnu.org> 2011-12-05 16:22:14 UTC --- Bugzilla is for reporting bugs, please use gcc-h...@gcc.gnu.org for questions. If you use specific registers in an ASM statement you have to declare all of them, even if the register is call-clobbered. The compiler does not try to parse the contents of the asm statement (it does simple substitution of the declared operands) so if you don't specify which registers you are modifying the compiler might try to use them for other purposes. In GCC-4.5 and earlier you have to specify the smallest addressable register unit in any clobber list (so s0...s31 and d16...d31)[1]. GCC-4.6 and later are smarter: the compiler now knows that q0 is equivalent to d0+d1 is equivalent to s0+s1+s2+s3 etc. [1] in these older compilers saying "q0" or "d0" will be interpreted as "s0" and not clobber what you think it should.