https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67334
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- That is: __asm__ volatile ("\n" " adds %0,%2,%4\n" " adc %1,%3,$0" : "=&r"(c),"=r"(d) : "r"(a),"r"(b),"r"(i) : "cc"); Because the first (0th) operand gets clobbered (set) before you use the other ones.