https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109457
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |RESOLVED Resolution|--- |INVALID --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- This has nothing to do with [x] but rather the constraint g and z operand modifier. The g constraint is defined as: Any register, memory or immediate integer operand is allowed, except for registers that are not general registers. So constant 1 will be allowed here. While the modifier z says: z Print the opcode suffix for the size of the current integer operand (one of b/w/l/q). %z0 l Note integer constants don't have a size ... This is the corrected inline-asm: template<class T> inline T onec_add(T a, T b) { asm( "add%z[a]\t%[b], %[a]" "\n\tadc%z[a]\t$0, %[a]" : [a]"+g"(a) // inputs : [b]"g"(b) // outputs : "cc" // clobbers ); return a; } Note I see you did the replacement of [a] and [b] in your example but when you replaced %z[b], you replaced it with %z0 rather than what it was originally which was %z1.