This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
x86: AT&T syntax operand size defaults
- From: "Jan Beulich" <JBeulich at suse dot com>
- To: <binutils at sourceware dot org>
- Cc: "H.J. Lu" <hjl dot tools at gmail dot com>
- Date: Fri, 13 Oct 2017 07:44:47 -0600
- Subject: x86: AT&T syntax operand size defaults
- Authentication-results: sourceware.org; auth=none
All,
according to the only reasonable document about AT&T assembler
syntax (Solaris'es / Oracles "x86 Assembly Language Reference
Manual", operand size is supposed to default to "long".
However, of these two
add $1, (%eax)
add $0x1234, (%eax)
the first indeed defaults to "long" (except in 16-bit mode, but I think
that's fine despite what that doc says) while the second causes an
error. That's because of
if (i.tm.opcode_modifier.w)
{
as_bad (_("no instruction mnemonic suffix given and "
"no register operands; can't size instruction"));
return 0;
}
in process_suffix(): The pattern for the 8-bit sign extended
immediate does no have W set, while most other instructions
allowing for no register operands at all have it set. I'm of the
strong opinion that the behavior of the assembler should at least
be consistent, i.e. in particular it should not depend on the value
of an immediate.
Which way to make it consistent, though, I'm not sure about:
It could be made match Intel syntax behavior, where an error is
being flagged whenever multiple operand sizes are permitted for
a mnemonic (that's imo the model most helpful to the programmer),
or it could be made match that doc by simply removing the as_bad()
invocation above (which is the model accepting the widest set of
originally non-gas sources). Of course it would be possible to have
the user select between the two by command line option and/or
directive, but even then we would need to settle on what default
behavior should be.
Jan