This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

x86: AT&T syntax operand size defaults


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]