[ARC] Enhance enter/leave mnemonics.
authorClaudiu Zissulescu <claziss@synopsys.com>
Tue, 25 Apr 2017 15:07:00 +0000 (17:07 +0200)
committerclaziss <claziss@synopsys.com>
Tue, 25 Apr 2017 15:07:00 +0000 (17:07 +0200)
enter/leave mnemonics are enhanced to not only accept register ranges
but also single register (i.e., r13) or even no GPR register at all.

gas/
2017-04-25  Claudiu Zissulescu  <claziss@synopsys.com>

* testsuite/gas/arc/leave_enter.d: Update test.
* testsuite/gas/arc/leave_enter.s: Likewise.

opcodes/
2017-04-25  Claudiu Zissulescu  <claziss@synopsys.com>

* arc-dis.c (print_insn_arc): Smartly print enter/leave mnemonics.
* arc-opc.c (insert_r13el): New function.
(R13_EL): Define.
* arc-tbl.h: Add new enter/leave variants.

gas/ChangeLog
gas/testsuite/gas/arc/leave_enter.d
gas/testsuite/gas/arc/leave_enter.s
opcodes/ChangeLog
opcodes/arc-dis.c
opcodes/arc-opc.c
opcodes/arc-tbl.h

index 4be806e4a4f883923734dbc60a260a29ab7fbc23..ded300db80f64c5f32024482174c71b823f6ceb7 100644 (file)
@@ -1,3 +1,8 @@
+2017-04-25  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * testsuite/gas/arc/leave_enter.d: Update test.
+       * testsuite/gas/arc/leave_enter.s: Likewise.
+
 2017-04-25  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * testsuite/gas/arc/b.d: Update test.
index 5eb1aefcca6801e75f27b24ecdb00ac8949f3d81..821656af3de1496d90f253a39248773e4e27a613 100644 (file)
@@ -1,21 +1,30 @@
-#objdump: -dr
+#objdump: -dr --prefix-addresses --show-raw-insn
 
 .*: +file format .*arc.*
 
 
 Disassembly of section .text:
-
-[0-9a-f]+ <.text>:
-   0:  c0c2                    leave_s \[r13-r13\]
-   2:  c4dc                    leave_s \[r13-gp,pcl\]
-   4:  c1dc                    leave_s \[r13-gp,fp\]
-   6:  c2dc                    leave_s \[r13-gp,blink\]
-   8:  c3dc                    leave_s \[r13-gp,fp,blink\]
-   a:  c5dc                    leave_s \[r13-gp,fp,pcl\]
-   c:  c6dc                    leave_s \[r13-gp,blink,pcl\]
-   e:  c7dc                    leave_s \[r13-gp,fp,blink,pcl\]
-  10:  1100 0000               ld      r0,\[r1\]
-  14:  c0e2                    enter_s \[r13-r13\]
-  16:  c1fc                    enter_s \[r13-gp,fp\]
-  18:  c2fc                    enter_s \[r13-gp,blink\]
-  1a:  c3fc                    enter_s \[r13-gp,fp,blink\]
+0x[0-9a-f]+\s+c0c2\s+leave_s   \[r13\]
+0x[0-9a-f]+\s+c0c2\s+leave_s   \[r13\]
+0x[0-9a-f]+\s+c4dc\s+leave_s   \[r13-gp,pcl\]
+0x[0-9a-f]+\s+c1dc\s+leave_s   \[r13-gp,fp\]
+0x[0-9a-f]+\s+c2dc\s+leave_s   \[r13-gp,blink\]
+0x[0-9a-f]+\s+c3dc\s+leave_s   \[r13-gp,fp,blink\]
+0x[0-9a-f]+\s+c5dc\s+leave_s   \[r13-gp,fp,pcl\]
+0x[0-9a-f]+\s+c6dc\s+leave_s   \[r13-gp,blink,pcl\]
+0x[0-9a-f]+\s+c7dc\s+leave_s   \[r13-gp,fp,blink,pcl\]
+0x[0-9a-f]+\s+c6c2\s+leave_s   \[r13,blink,pcl\]
+0x[0-9a-f]+\s+c6c0\s+leave_s   \[blink,pcl\]
+0x[0-9a-f]+\s+c1c0\s+leave_s   \[fp\]
+0x[0-9a-f]+\s+c2c0\s+leave_s   \[blink\]
+0x[0-9a-f]+\s+c4c0\s+leave_s   \[pcl\]
+0x[0-9a-f]+\s+1100 0000\s+ld   r0,\[r1\]
+0x[0-9a-f]+\s+c0e2\s+enter_s   \[r13\]
+0x[0-9a-f]+\s+c0e2\s+enter_s   \[r13\]
+0x[0-9a-f]+\s+c1fc\s+enter_s   \[r13-gp,fp\]
+0x[0-9a-f]+\s+c2fc\s+enter_s   \[r13-gp,blink\]
+0x[0-9a-f]+\s+c3fc\s+enter_s   \[r13-gp,fp,blink\]
+0x[0-9a-f]+\s+c2e2\s+enter_s   \[r13,blink]
+0x[0-9a-f]+\s+c2e0\s+enter_s   \[blink\]
+0x[0-9a-f]+\s+c3e0\s+enter_s   \[fp,blink\]
+0x[0-9a-f]+\s+c1e0\s+enter_s   \[fp\]
index 1bdcc06e27b5aee5dbcd9e49310d09720b02f942..75cf9133afd5db09818daa4341c6bea56f1cf270 100644 (file)
@@ -1,4 +1,5 @@
        .cpu HS
+       leave_s {r13}
        leave_s {r13-r13}
        leave_s {r13-r26,pcl}
        leave_s {r13-r26,fp}
@@ -7,10 +8,20 @@
        leave_s {r13-r26,fp,pcl}
        leave_s {r13-r26,blink,pcl}
        leave_s {r13-r26,fp,blink,pcl}
+       leave_s {r13,blink,pcl}
+       leave_s {blink,pcl}
+       leave_s {fp}
+       leave_s {blink}
+       leave_s {pcl}
 
        ld      r0,[r1]
 
+       enter_s {r13}
        enter_s {r13-r13}
        enter_s {r13-r26,fp}
        enter_s {r13-r26,blink}
        enter_s {r13-r26,fp,blink}
+       enter_s {r13,blink}
+       enter_s {blink}
+       enter_s {fp, blink}
+       enter_s {fp}
index 7076de5ca2504740b1f6a53d67070a08274904b5..b9d67d2745f3839994b3eac2c88e0e98fbc7b26d 100644 (file)
@@ -1,3 +1,10 @@
+2017-04-25  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * arc-dis.c (print_insn_arc): Smartly print enter/leave mnemonics.
+       * arc-opc.c (insert_r13el): New function.
+       (R13_EL): Define.
+       * arc-tbl.h: Add new enter/leave variants.
+
 2017-04-25  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * arc-tbl.h: Reorder NOP entry to be before MOV instructions.
index 4beca689c397c42ee33c13da3024927d13f3b7d3..6fb030e5dbe031d840250f2650c7f5a71349351b 100644 (file)
@@ -1208,9 +1208,22 @@ print_insn_arc (bfd_vma memaddr,
          if (operand->flags & ARC_OPERAND_TRUNCATE
              && !(operand->flags & ARC_OPERAND_ALIGNED32)
              && !(operand->flags & ARC_OPERAND_ALIGNED16)
-             && value > 0 && value <= 14)
-           (*info->fprintf_func) (info->stream, "r13-%s",
-                                  regnames[13 + value - 1]);
+             && value >= 0 && value <= 14)
+           {
+             switch (value)
+               {
+               case 0:
+                 need_comma = FALSE;
+                 break;
+               case 1:
+                 (*info->fprintf_func) (info->stream, "r13");
+                 break;
+               default:
+                 (*info->fprintf_func) (info->stream, "r13-%s",
+                                        regnames[13 + value - 1]);
+                 break;
+               }
+           }
          else
            {
              const char *rname = get_auxreg (opcode, value, isa_mask);
index 41cd0375d28cab89dd64cafb7f2919aebec51cf1..c266f4f1ac9d1102ba5b3034ff4181638340710b 100644 (file)
@@ -545,6 +545,21 @@ extract_rrange (unsigned long long  insn,
   return (insn >> 1) & 0x0F;
 }
 
+static unsigned long long
+insert_r13el (unsigned long long insn,
+             long long int value,
+             const char **errmsg)
+{
+  if (value != 13)
+    {
+      *errmsg = _("Invalid register number, should be fp");
+      return insn;
+    }
+
+  insn |= 0x02;
+  return insn;
+}
+
 static unsigned long long
 insert_fpel (unsigned long long  insn,
             long long           value,
@@ -1876,7 +1891,10 @@ const struct arc_operand arc_operands[] =
 #define RRANGE_EL      (ZA + 1)
   { 4, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK | ARC_OPERAND_TRUNCATE,
     insert_rrange, extract_rrange},
-#define FP_EL          (RRANGE_EL + 1)
+#define R13_EL         (RRANGE_EL + 1)
+  { 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_IGNORE | ARC_OPERAND_NCHK,
+    insert_r13el, extract_rrange },
+#define FP_EL          (R13_EL + 1)
   { 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_IGNORE | ARC_OPERAND_NCHK,
     insert_fpel, extract_fpel },
 #define BLINK_EL       (FP_EL + 1)
index 6b8a589cfac969086afd019f8de1f6f4cda07aca..826b2ce97ccde3286163411a710a8790bf868b0f 100644 (file)
 
 /* enter_s u6 110000UU111uuuu0.  */
 { "enter_s", 0x0000C0E0, 0x0000FCE1, ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ENTER, CD1, { BRAKET, RRANGE_EL, FP_EL, BLINK_EL, BRAKETdup }, { 0 }},
+{ "enter_s", 0x0000C0E0, 0x0000FCE1, ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ENTER, CD1, { BRAKET, R13_EL, FP_EL, BLINK_EL, BRAKETdup }, { 0 }},
 { "enter_s", 0x0000C0E0, 0x0000FCE1, ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ENTER, CD1, { UIMM6_11_S }, { 0 }},
 
 /* ex<.di> b,c 00100bbb00101111DBBBCCCCCC001100.  */
 
 /* leave_s u7 11000UUU110uuuu0.  */
 { "leave_s", 0x0000C0C0, 0x0000F8E1, ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, LEAVE, CD1, { BRAKET, RRANGE_EL, FP_EL, BLINK_EL, PCL_EL, BRAKETdup }, { 0 }},
+{ "leave_s", 0x0000C0C0, 0x0000F8E1, ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, LEAVE, CD1, { BRAKET, R13_EL, FP_EL, BLINK_EL, PCL_EL, BRAKETdup }, { 0 }},
 { "leave_s", 0x0000C0C0, 0x0000F8E1, ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, LEAVE, CD1, { UIMM7_11_S }, { 0 }},
 
 /* llock<.di> b,c 00100bbb00101111DBBBCCCCCC010000.  */
This page took 0.032293 seconds and 4 git commands to generate.