aboutsummaryrefslogtreecommitdiff
path: root/opcodes/sparc-dis.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@redhat.com>2006-02-25 01:33:24 +0000
committerDavid S. Miller <davem@redhat.com>2006-02-25 01:33:24 +0000
commitff3f9d5b2aa1a57de59495d64b77ded11bd4def2 (patch)
tree9c9f7fd61707033cf85453c5036a215fa6f69a39 /opcodes/sparc-dis.c
parentc40c02dcc9eaad2b745e7a8bf023cae159f207eb (diff)
downloadfsf-binutils-gdb-ff3f9d5b2aa1a57de59495d64b77ded11bd4def2.zip
fsf-binutils-gdb-ff3f9d5b2aa1a57de59495d64b77ded11bd4def2.tar.gz
fsf-binutils-gdb-ff3f9d5b2aa1a57de59495d64b77ded11bd4def2.tar.bz2
2006-02-24 David S. Miller <davem@sunset.davemloft.net>
* sparc-dis.c (v9_priv_reg_names): Add "gl" entry. (v9_hpriv_reg_names): New table. (print_insn_sparc): Allow values up to 16 for '?' and '!'. New cases '$' and '%' for read/write hyperprivileged register. * sparc-opc.c (sparc_opcodes): Add new entries for UA2005 window handling and rdhpr/wrhpr instructions.
Diffstat (limited to 'opcodes/sparc-dis.c')
-rw-r--r--opcodes/sparc-dis.c33
1 files changed, 30 insertions, 3 deletions
diff --git a/opcodes/sparc-dis.c b/opcodes/sparc-dis.c
index cbc6d60..bfa7ea2 100644
--- a/opcodes/sparc-dis.c
+++ b/opcodes/sparc-dis.c
@@ -85,11 +85,22 @@ static char *v9_priv_reg_names[] =
{
"tpc", "tnpc", "tstate", "tt", "tick", "tba", "pstate", "tl",
"pil", "cwp", "cansave", "canrestore", "cleanwin", "otherwin",
- "wstate", "fq"
+ "wstate", "fq", "gl"
/* "ver" - special cased */
};
/* These are ordered according to there register number in
+ rdhpr and wrhpr insns. */
+static char *v9_hpriv_reg_names[] =
+{
+ "hpstate", "htstate", "resv2", "hintp", "resv4", "htba", "hver",
+ "resv7", "resv8", "resv9", "resv10", "resv11", "resv12", "resv13",
+ "resv14", "resv15", "resv16", "resv17", "resv18", "resv19", "resv20",
+ "resv21", "resv22", "resv23", "resv24", "resv25", "resv26", "resv27",
+ "resv28", "resv29", "resv30", "hstick_cmpr"
+};
+
+/* These are ordered according to there register number in
rd and wr insns (-16). */
static char *v9a_asr_reg_names[] =
{
@@ -768,7 +779,7 @@ print_insn_sparc (bfd_vma memaddr, disassemble_info *info)
case '?':
if (X_RS1 (insn) == 31)
(*info->fprintf_func) (stream, "%%ver");
- else if ((unsigned) X_RS1 (insn) < 16)
+ else if ((unsigned) X_RS1 (insn) < 17)
(*info->fprintf_func) (stream, "%%%s",
v9_priv_reg_names[X_RS1 (insn)]);
else
@@ -776,13 +787,29 @@ print_insn_sparc (bfd_vma memaddr, disassemble_info *info)
break;
case '!':
- if ((unsigned) X_RD (insn) < 15)
+ if ((unsigned) X_RD (insn) < 17)
(*info->fprintf_func) (stream, "%%%s",
v9_priv_reg_names[X_RD (insn)]);
else
(*info->fprintf_func) (stream, "%%reserved");
break;
+ case '$':
+ if ((unsigned) X_RS1 (insn) < 32)
+ (*info->fprintf_func) (stream, "%%%s",
+ v9_hpriv_reg_names[X_RS1 (insn)]);
+ else
+ (*info->fprintf_func) (stream, "%%reserved");
+ break;
+
+ case '%':
+ if ((unsigned) X_RD (insn) < 32)
+ (*info->fprintf_func) (stream, "%%%s",
+ v9_hpriv_reg_names[X_RD (insn)]);
+ else
+ (*info->fprintf_func) (stream, "%%reserved");
+ break;
+
case '/':
if (X_RS1 (insn) < 16 || X_RS1 (insn) > 25)
(*info->fprintf_func) (stream, "%%reserved");