gas: sparc: allow ASR registers in the 0..31 range in V9 and later

In the SPARC V9 (and later) versions of the SPARC specification, the
section C.1.1 "Register Names" specifies that:

"asr_reg.  An asr_reg is an Ancillary State Register name.  It may have
 one of the following values:

  %asr16-%asr31"

The rationale of having this restriction was that the registers from 16
to 31 are reserved to implementations, and are therefore "non-V9".  It
also assumes that the existing ASR registers in the range 0..31 will
have their own names such as %y, that can be used to access such
registers.

However, this is problematic.  When a new ASR register is introduced,
such as %mcdper a.k.a. %asr14, it is useful to be able to use %asr14 in
order to not depend on the latest version of the assembler.

The Solaris assembler is lax and allows to assembly instructions
referring to %asr0 to %asr31.  This patch makes the GNU assembler to
mimic that behavior.

gas/ChangeLog:

  2016-03-24  Jose E. Marchesi  <jose.marchesi@oracle.com>

	* config/tc-sparc.c (sparc_ip): Remove the V9 restriction on ASR
	registers to be in the 16..31 range.
This commit is contained in:
Jose E. Marchesi
2016-03-24 10:28:41 -07:00
parent a6b71f422b
commit f65c3d1b26
2 changed files with 21 additions and 16 deletions

View File

@ -1,3 +1,8 @@
2016-03-24 Jose E. Marchesi <jose.marchesi@oracle.com>
* config/tc-sparc.c (sparc_ip): Remove the V9 restriction on ASR
registers to be in the 16..31 range.
2016-03-24 Trevor Saunders <tbsaunde+binutils@tbsaunde.org>
* config/tc-microblaze.c (md_assemble): Cast opc to char * when calling

View File

@ -1841,22 +1841,22 @@ sparc_ip (char *str, const struct sparc_opcode **pinsn)
++s;
}
if (current_architecture >= SPARC_OPCODE_ARCH_V9)
{
if (num < 16 || 31 < num)
{
error_message = _(": asr number must be between 16 and 31");
goto error;
}
}
else
{
if (num < 0 || 31 < num)
{
error_message = _(": asr number must be between 0 and 31");
goto error;
}
}
/* We used to check here for the asr number to
be between 16 and 31 in V9 and later, as
mandated by the section C.1.1 "Register
Names" in the SPARC spec. However, we
decided to remove this restriction as a) it
introduces problems when new V9 asr registers
are introduced, b) the Solaris assembler
doesn't implement this restriction and c) the
restriction will go away in future revisions
of the Oracle SPARC Architecture. */
if (num < 0 || 31 < num)
{
error_message = _(": asr number must be between 0 and 31");
goto error;
}
opcode |= (*args == 'M' ? RS1 (num) : RD (num));
continue;