Index: opcodes/sparc-dis.c |
diff --git a/opcodes/sparc-dis.c b/opcodes/sparc-dis.c |
index b7f0cc2ace2270698914de616ffba3cb232ef6b3..73f01d3f44ec05078e829bdd5e0035331c610422 100644 |
--- a/opcodes/sparc-dis.c |
+++ b/opcodes/sparc-dis.c |
@@ -1,6 +1,6 @@ |
/* Print SPARC instructions. |
Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, |
- 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 |
+ 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2012 |
Free Software Foundation, Inc. |
This file is part of the GNU opcodes library. |
@@ -20,9 +20,8 @@ |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
-#include <stdio.h> |
- |
#include "sysdep.h" |
+#include <stdio.h> |
#include "opcode/sparc.h" |
#include "dis-asm.h" |
#include "libiberty.h" |
@@ -108,8 +107,8 @@ static char *v9_hpriv_reg_names[] = |
static char *v9a_asr_reg_names[] = |
{ |
"pcr", "pic", "dcr", "gsr", "set_softint", "clear_softint", |
- "softint", "tick_cmpr", "stick", "stick_cmpr", "resv26", |
- "resv27", "cps" |
+ "softint", "tick_cmpr", "stick", "stick_cmpr", "cfr", |
+ "pause", "cps" |
}; |
/* Macros used to extract instruction fields. Not all fields have |
@@ -129,6 +128,7 @@ static char *v9a_asr_reg_names[] = |
/* These are for v9. */ |
#define X_DISP16(i) (((((i) >> 20) & 3) << 14) | (((i) >> 0) & 0x3fff)) |
+#define X_DISP10(i) (((((i) >> 19) & 3) << 8) | (((i) >> 5) & 0xff)) |
#define X_DISP19(i) (((i) >> 0) & 0x7ffff) |
#define X_MEMBAR(i) ((i) & 0x7f) |
@@ -703,6 +703,10 @@ print_insn_sparc (bfd_vma memaddr, disassemble_info *info) |
} |
break; |
+ case ')': /* 5 bit unsigned immediate from RS3. */ |
+ (info->fprintf_func) (stream, "%#x", X_RS3 (insn)); |
+ break; |
+ |
case 'X': /* 5 bit unsigned immediate. */ |
case 'Y': /* 6 bit unsigned immediate. */ |
{ |
@@ -743,6 +747,11 @@ print_insn_sparc (bfd_vma memaddr, disassemble_info *info) |
break; |
} |
+ case '=': |
+ info->target = memaddr + SEX (X_DISP10 (insn), 10) * 4; |
+ (*info->print_address_func) (info->target, info); |
+ break; |
+ |
case 'k': |
info->target = memaddr + SEX (X_DISP16 (insn), 16) * 4; |
(*info->print_address_func) (info->target, info); |