https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109457
lyazj <seeson at pku dot edu.cn> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|INVALID |FIXED CC| |seeson at pku dot edu.cn --- Comment #2 from lyazj <seeson at pku dot edu.cn> --- ](In reply to Andrew Pinski from comment #1) > 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. Thanks very much for the quick and concise solution. I'm sorry that I missed the truth that I could have probably put the modifier `z` on an immediate and did the substitution that broke the equivalence to the original code. However, since the modifier is case-sensitive, I suggest revising the error reporting routines to report the improper modifier 'z' instead of 'Z' looked like a bug. :)