aboutsummaryrefslogtreecommitdiff
path: root/opcodes
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2015-11-02 14:37:33 +0000
committerNick Clifton <nickc@redhat.com>2015-11-02 14:37:33 +0000
commit854eb72b00ba46d65ce36dc3432f01e223ce44cb (patch)
tree18788cd50dc3359a7d71b3036252d8da777ce4f1 /opcodes
parente292aa7a9529771c04e9578a2307b8c95bb5591c (diff)
downloadgdb-854eb72b00ba46d65ce36dc3432f01e223ce44cb.zip
gdb-854eb72b00ba46d65ce36dc3432f01e223ce44cb.tar.gz
gdb-854eb72b00ba46d65ce36dc3432f01e223ce44cb.tar.bz2
Disassemble RX NOP instructions as such.
opcode * rx.h (enum RX_Opcode_ID): Add more NOP opcodes. opcodes * rx-decode.opc (rx_decode_opcode): Decode extra NOP instructions. * rx-decode.c: Regenerate. tests * gas/rx/max.d: Update expecetd disassembly. * gas/rx/nod.d: Likewise. * gas/rx/nop.sm: Add tests of more NOP instructions.
Diffstat (limited to 'opcodes')
-rw-r--r--opcodes/ChangeLog6
-rw-r--r--opcodes/rx-decode.c62
-rw-r--r--opcodes/rx-decode.opc48
3 files changed, 98 insertions, 18 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 1ca97ee..7c30a48 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,5 +1,11 @@
2015-11-02 Nick Clifton <nickc@redhat.com>
+ * rx-decode.opc (rx_decode_opcode): Decode extra NOP
+ instructions.
+ * rx-decode.c: Regenerate.
+
+2015-11-02 Nick Clifton <nickc@redhat.com>
+
* rx-decode.opc (rx_disp): If the displacement is zero, set the
type to RX_Operand_Zero_Indirect.
* rx-decode.c: Regenerate.
diff --git a/opcodes/rx-decode.c b/opcodes/rx-decode.c
index ada3993..3a9099b 100644
--- a/opcodes/rx-decode.c
+++ b/opcodes/rx-decode.c
@@ -4256,8 +4256,16 @@ rx_decode_opcode (unsigned long pc AU,
}
SYNTAX("mul #%1, %0");
#line 602 "rx-decode.opc"
- ID(mul); DR(rdst); SC(immm); F_____;
-
+ if (immm == 1 && rdst == 0)
+ {
+ ID(nop2);
+ SYNTAX ("nop\t; mul\t#1, r0");
+ }
+ else
+ {
+ ID(mul);
+ }
+ DR(rdst); SC(immm); F_____;
}
break;
}
@@ -4624,6 +4632,7 @@ rx_decode_opcode (unsigned long pc AU,
int im AU = op[0] & 0x03;
#line 605 "rx-decode.opc"
int rdst AU = op[1] & 0x0f;
+ int val = IMMex(im);
if (trace)
{
printf ("\033[33m%s\033[0m %02x %02x\n",
@@ -4634,7 +4643,25 @@ rx_decode_opcode (unsigned long pc AU,
}
SYNTAX("mul #%1, %0");
#line 605 "rx-decode.opc"
- ID(mul); DR(rdst); SC(IMMex(im)); F_____;
+ if (val == 1 && rdst == 0)
+ {
+ SYNTAX("nop\t; mul\t#1, r0");
+ switch (im)
+ {
+ case 2: ID(nop4); break;
+ case 3: ID(nop5); break;
+ case 0: ID(nop6); break;
+ default:
+ ID(mul);
+ SYNTAX("mul #%1, %0");
+ break;
+ }
+ }
+ else
+ {
+ ID(mul);
+ }
+ DR(rdst); SC(val); F_____;
}
break;
@@ -6346,19 +6373,19 @@ rx_decode_opcode (unsigned long pc AU,
if (sd == 3 && ss == 3 && sz == 2 && rsrc == 0 && rdst == 0)
{
ID(nop2);
- rx->syntax = "nop";
+ SYNTAX ("nop\t; mov.l\tr0, r0");
}
else
{
ID(mov); sBWL(sz); F_____;
if ((ss == 3) && (sd != 3))
- {
- SD(ss, rdst, sz); DD(sd, rsrc, sz);
- }
+ {
+ SD(ss, rdst, sz); DD(sd, rsrc, sz);
+ }
else
- {
- SD(ss, rsrc, sz); DD(sd, rdst, sz);
- }
+ {
+ SD(ss, rsrc, sz); DD(sd, rdst, sz);
+ }
}
}
@@ -7204,7 +7231,7 @@ rx_decode_opcode (unsigned long pc AU,
if (ss == 3 && rsrc == 0 && rdst == 0)
{
ID(nop3);
- rx->syntax = "nop";
+ SYNTAX ("nop\t; max\tr0, r0");
}
else
{
@@ -10331,6 +10358,7 @@ rx_decode_opcode (unsigned long pc AU,
int im AU = (op[1] >> 2) & 0x03;
#line 570 "rx-decode.opc"
int rdst AU = op[2] & 0x0f;
+ int val = IMMex (im);
if (trace)
{
printf ("\033[33m%s\033[0m %02x %02x %02x\n",
@@ -10341,8 +10369,16 @@ rx_decode_opcode (unsigned long pc AU,
}
SYNTAX("max #%1, %0");
#line 570 "rx-decode.opc"
- ID(max); DR(rdst); SC(IMMex(im));
-
+ if (im == 0 && (unsigned) val == 0x80000000 && rdst == 0)
+ {
+ ID(nop7);
+ SYNTAX ("nop\t; max\t#0x80000000, r0");
+ }
+ else
+ {
+ ID(max);
+ }
+ DR(rdst); SC(val);
}
break;
case 0x50:
diff --git a/opcodes/rx-decode.opc b/opcodes/rx-decode.opc
index 2409f7f..12f6893 100644
--- a/opcodes/rx-decode.opc
+++ b/opcodes/rx-decode.opc
@@ -310,7 +310,7 @@ rx_decode_opcode (unsigned long pc AU,
if (sd == 3 && ss == 3 && sz == 2 && rsrc == 0 && rdst == 0)
{
ID(nop2);
- rx->syntax = "nop";
+ SYNTAX ("nop\t; mov.l\tr0, r0");
}
else
{
@@ -567,13 +567,23 @@ rx_decode_opcode (unsigned long pc AU,
/* MAX */
/** 1111 1101 0111 im00 0100rdst max #%1, %0 */
- ID(max); DR(rdst); SC(IMMex(im));
+ int val = IMMex (im);
+ if (im == 0 && (unsigned) val == 0x80000000 && rdst == 0)
+ {
+ ID (nop7);
+ SYNTAX("nop\t; max\t#0x80000000, r0");
+ }
+ else
+ {
+ ID(max);
+ }
+ DR(rdst); SC(val);
/** 1111 1100 0001 00ss rsrc rdst max %1%S1, %0 */
if (ss == 3 && rsrc == 0 && rdst == 0)
{
ID(nop3);
- rx->syntax = "nop";
+ SYNTAX("nop\t; max\tr0, r0");
}
else
{
@@ -599,10 +609,38 @@ rx_decode_opcode (unsigned long pc AU,
/* MUL */
/** 0110 0011 immm rdst mul #%1, %0 */
- ID(mul); DR(rdst); SC(immm); F_____;
+ if (immm == 1 && rdst == 0)
+ {
+ ID(nop2);
+ SYNTAX ("nop\t; mul\t#1, r0");
+ }
+ else
+ {
+ ID(mul);
+ }
+ DR(rdst); SC(immm); F_____;
/** 0111 01im 0001rdst mul #%1, %0 */
- ID(mul); DR(rdst); SC(IMMex(im)); F_____;
+ int val = IMMex(im);
+ if (val == 1 && rdst == 0)
+ {
+ SYNTAX("nop\t; mul\t#1, r0");
+ switch (im)
+ {
+ case 2: ID(nop4); break;
+ case 3: ID(nop5); break;
+ case 0: ID(nop6); break;
+ default:
+ ID(mul);
+ SYNTAX("mul #%1, %0");
+ break;
+ }
+ }
+ else
+ {
+ ID(mul);
+ }
+ DR(rdst); SC(val); F_____;
/** 0100 11ss rsrc rdst mul %1%S1, %0 */
ID(mul); SP(ss, rsrc); DR(rdst); F_____;