[OPCODE][ARM]Correct disassembler for cdp/cdp2, mcr/mcr2, mrc/mrc2, ldc/ldc2, stc...
authorRenlin Li <renlin.li@arm.com>
Wed, 24 Feb 2016 13:48:59 +0000 (13:48 +0000)
committerRenlin Li <renlin.li@arm.com>
Wed, 24 Feb 2016 14:02:51 +0000 (14:02 +0000)
opcodes/

2016-02-24  Renlin Li  <renlin.li@arm.com>

* arm-dis.c (print_insn_coprocessor): Check co-processor number for
cpd/cpd2, mcr/mcr2, mrc/mrc2, ldc/ldc2, stc/stc2.

gas/

2016-02-24  Renlin Li  <renlin.li@arm.com>

* testsuite/gas/arm/copro.s: Use coprocessor other than 10, 11.
* testsuite/gas/arm/copro.d: Update.

gas/ChangeLog
gas/testsuite/gas/arm/copro.d
gas/testsuite/gas/arm/copro.s
opcodes/ChangeLog
opcodes/arm-dis.c

index 0ca8031d78969b9c6dd7a344bd546d3db722a78b..9efeae474a83b36fda7df2faa5cd2bd692d1f248 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-24  Renlin Li  <renlin.li@arm.com>
+
+       * testsuite/gas/arm/copro.s: Use coprocessor other than 10, 11.
+       * testsuite/gas/arm/copro.d: Update.
+
 2016-02-24  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * config/tc-arm.c (arm_cpus): Add entry for cortex-a32.
index d007c81177d727055abe3ffdf5e4231f88703fa2..eb7b4549b6bd9ff5c7384f631ade5bb4c9e9abf0 100644 (file)
@@ -30,7 +30,7 @@ Disassembly of section .text:
 0+050 <[^>]*> ecd43704         ldcl    7, cr3, \[r4\], \{4\}
 0+054 <[^>]*> ecc52805         stcl    8, cr2, \[r5\], \{5\}
 0+058 <[^>]*> fcd61906         ldc2l   9, cr1, \[r6\], \{6\}
-0+05c <[^>]*> fcc70a07         stc2l   10, cr0, \[r7\], \{7\}
+0+05c <[^>]*> fcc70c07         stc2l   12, cr0, \[r7\], \{7\}
 0+060 <[^>]*> ecd88cff         ldcl    12, cr8, \[r8\], \{255\}.*
 0+064 <[^>]*> ecc99cfe         stcl    12, cr9, \[r9\], \{254\}.*
 0+068 <[^>]*> ec507d04         mrrc    13, 0, r7, r0, cr4
index 0ed0e054358a867bfe50483bb9925bb186b8df15..f03f5aed0605e26e11954e377d47da4a94e33402 100644 (file)
@@ -32,7 +32,8 @@ bar:
         ldcl    7,   c3, [r4], {4}
         stcl    p8,  c2, [r5], {5}
         ldc2l   9,   c1, [r6], {6}
-        stc2l   p10, c0, [r7], {7}
+        @ using '10, 11' below results in an invalid stc2l instruction.
+        stc2l   p12, c0, [r7], {7}
         @ using '11' below results in an (invalid) Neon vldmia instruction.
         ldcl    12,  c8, [r8], {255}
         stcl    p12, c9, [r9], {254}
index e9f157880d609476e1faa00f572c13571cbca529..60d2d7d8efb6c4e5dd958c98af2120a0ac233255 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-24  Renlin Li  <renlin.li@arm.com>
+
+       * arm-dis.c (print_insn_coprocessor): Check co-processor number for
+       cpd/cpd2, mcr/mcr2, mrc/mrc2, ldc/ldc2, stc/stc2.
+
 2016-02-15  H.J. Lu  <hongjiu.lu@intel.com>
 
        * i386-dis.c (print_insn): Parenthesize expression to prevent
index 481270eacea4aab726f590372d19176fda179d10..4960140e2db29093c007be428ca81db6c4646e45 100644 (file)
@@ -3198,6 +3198,7 @@ print_insn_coprocessor (bfd_vma pc,
   unsigned long mask;
   unsigned long value = 0;
   int cond;
+  int cp_num;
   struct arm_private_data *private_data = info->private_data;
   arm_feature_set allowed_arches = ARM_ARCH_NONE;
 
@@ -3236,6 +3237,8 @@ print_insn_coprocessor (bfd_vma pc,
 
       mask = insn->mask;
       value = insn->value;
+      cp_num = (given >> 8) & 0xf;
+
       if (thumb)
        {
          /* The high 4 bits are 0xe for Arm conditional instructions, and
@@ -3271,6 +3274,26 @@ print_insn_coprocessor (bfd_vma pc,
       if (! ARM_CPU_HAS_FEATURE (insn->arch, allowed_arches))
        continue;
 
+      if (insn->value == 0xfe000010     /* mcr2  */
+         || insn->value == 0xfe100010  /* mrc2  */
+         || insn->value == 0xfc100000  /* ldc2  */
+         || insn->value == 0xfc000000) /* stc2  */
+       {
+         if (cp_num == 10 || cp_num == 11)
+           is_unpredictable = TRUE;
+       }
+      else if (insn->value == 0x0e000000     /* cdp  */
+              || insn->value == 0xfe000000  /* cdp2  */
+              || insn->value == 0x0e000010  /* mcr  */
+              || insn->value == 0x0e100010  /* mrc  */
+              || insn->value == 0x0c100000  /* ldc  */
+              || insn->value == 0x0c000000) /* stc  */
+       {
+         /* Floating-point instructions.  */
+         if (cp_num == 10 || cp_num == 11)
+           continue;
+       }
+
       for (c = insn->assembler; *c; c++)
        {
          if (*c == '%')