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.

Reply via email to