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.
+2015-11-02 Nick Clifton <nickc@redhat.com>
+
+ * gas/rx/max.d: Update expected disassembly.
+ * gas/rx/nod.d: Likewise.
+ * gas/rx/nop.sm: Add tests of more NOP instructions.
+
2015-11-02 Nick Clifton <nickc@redhat.com>
* gas/rx/mov.sm: Add tests for zero offset indirect moves.
dump\.o: file format .*
-Disassembly of section \.text:
+Disassembly of section \..*:
-00000000 <\.text>:
+00000000 <\..*>:
0: fd 74 40 80 max #-128, r0
4: fd 74 4f 80 max #-128, r15
8: fd 74 40 7f max #127, r0
2c: fd 7c 4f 00 00 80 max #0xff800000, r15
32: fd 7c 40 ff ff 7f max #0x7fffff, r0
38: fd 7c 4f ff ff 7f max #0x7fffff, r15
- 3e: fd 70 40 00 00 00 80 max #0x80000000, r0
+ 3e: fd 70 40 00 00 00 80 nop ; max #0x80000000, r0
45: fd 70 4f 00 00 00 80 max #0x80000000, r15
4c: fd 70 40 ff ff ff 7f max #0x7fffffff, r0
53: fd 70 4f ff ff ff 7f max #0x7fffffff, r15
dump\.o: file format .*
-Disassembly of section \.text:
+Disassembly of section \..*:
-00000000 <\.text>:
+00000000 <\..*>:
0: 03 nop
+ 1: ef 00 nop ; mov.l r0, r0
+ 3: 63 10 nop ; mul #1, r0
+ 5: fc 13 00 nop ; max r0, r0
+ 8: 76 10 01 00 nop ; mul #1, r0
+ c: 77 10 01 00 00 nop ; mul #1, r0
+ 11: 74 10 01 00 00 00 nop ; mul #1, r0
+ 17: fd 70 40 00 00 00 80 nop ; max #0x80000000, r0
nop
+ mov.l r0,r0
+ mul #1,r0
+ max r0,r0
+ .byte 0x76, 0x10, 0x01, 0x00
+ .byte 0x77, 0x10, 0x01, 0x00, 0x00
+ .byte 0x74, 0x10, 0x01, 0x00, 0x00, 0x00
+ max #0x80000000,r0
+2015-11-02 Nick Clifton <nickc@redhat.com>
+
+ * rx.h (enum RX_Opcode_ID): Add more NOP opcodes.
+
2015-11-02 Nick Clifton <nickc@redhat.com>
* rx.h (enum RX_Operand_Type): Add RX_Operand_Zero_Indirect.
RXO_nop,
RXO_nop2,
RXO_nop3,
+ RXO_nop4,
+ RXO_nop5,
+ RXO_nop6,
+ RXO_nop7,
RXO_scmpu,
RXO_smovu,
+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
}
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;
}
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",
}
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;
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);
+ }
}
}
if (ss == 3 && rsrc == 0 && rdst == 0)
{
ID(nop3);
- rx->syntax = "nop";
+ SYNTAX ("nop\t; max\tr0, r0");
}
else
{
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",
}
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:
if (sd == 3 && ss == 3 && sz == 2 && rsrc == 0 && rdst == 0)
{
ID(nop2);
- rx->syntax = "nop";
+ SYNTAX ("nop\t; mov.l\tr0, r0");
}
else
{
/* 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
{
/* 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_____;