diff options
author | Jose E. Marchesi <jose.marchesi@oracle.com> | 2016-03-24 10:28:41 -0700 |
---|---|---|
committer | Jose E. Marchesi <jose.marchesi@oracle.com> | 2016-03-24 10:28:41 -0700 |
commit | f65c3d1b26e05f445d976aabd48d4b1264c182bc (patch) | |
tree | 796d86af695843bb83b63ab412449fdbb8fec17c /gas/config | |
parent | a6b71f422b2a4c1dae639064945bc8697528c57b (diff) | |
download | gdb-f65c3d1b26e05f445d976aabd48d4b1264c182bc.zip gdb-f65c3d1b26e05f445d976aabd48d4b1264c182bc.tar.gz gdb-f65c3d1b26e05f445d976aabd48d4b1264c182bc.tar.bz2 |
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.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-sparc.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/gas/config/tc-sparc.c b/gas/config/tc-sparc.c index 5d4e0d6..dfb84ef 100644 --- a/gas/config/tc-sparc.c +++ b/gas/config/tc-sparc.c @@ -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; |