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.
:)

Reply via email to