CSKY: Support two operands form for bloop.
authorCooper Qu <cooper.qu@linux.alibaba.com>
Fri, 21 Aug 2020 08:17:36 +0000 (16:17 +0800)
committerLifang Xia <lifang_xia@c-sky.com>
Fri, 21 Aug 2020 08:50:11 +0000 (16:50 +0800)
gas/
        * config/tc-csky.c (csky_insn_info): Add member last_isize.
        (md_assemble): Assign value to csky_insn.last_isize.
        * testsuite/gas/csky/enhance_dsp.d: Test bloop's two operands form.
        * testsuite/gas/csky/enhance_dsp.s: Likewise.

opcodes/
        * csky-opc.h (csky_v2_opcodes): Add two operands form for bloop.

gas/ChangeLog
gas/config/tc-csky.c
gas/testsuite/gas/csky/enhance_dsp.d
gas/testsuite/gas/csky/enhance_dsp.s
opcodes/ChangeLog
opcodes/csky-opc.h

index 0ba47b886065163ae9fb0e3c0fc0b625bb2e687c..94ad709568faa7331b55f8713967d7a616d76c24 100644 (file)
@@ -1,3 +1,10 @@
+2020-08-21  Cooper Qu  <cooper.qu@linux.alibaba.com>
+
+       * config/tc-csky.c (csky_insn_info): Add member last_isize.
+       (md_assemble): Assign value to csky_insn.last_isize.
+       * testsuite/gas/csky/enhance_dsp.d: Test bloop's two operands form.
+       * testsuite/gas/csky/enhance_dsp.s: Likewise.
+
 2020-08-20  Martin Liska  <mliska@suse.cz>
 
        * NEWS: Mention --reduce-memory-overheads and --hash-size arguments
index d56bcc222a3afd999269ecfb8b5ec9f93d466e2f..49a52d442a056ab773ad44ef0e9d76a80aee35d1 100644 (file)
@@ -272,6 +272,7 @@ struct csky_insn_info
   struct csky_macro_info *macro;
   /* Insn size for check_literal.  */
   unsigned int isize;
+  unsigned int last_isize;
   /* Max size of insn for relax frag_var.  */
   unsigned int max;
   /* Indicates which element is in csky_opcode_info op[] array.  */
@@ -4145,6 +4146,7 @@ md_assemble (char *str)
        check_literals (csky_insn.opcode->transfer, csky_insn.max);
     }
 
+  csky_insn.last_isize = csky_insn.isize;
   insn_reloc = BFD_RELOC_NONE;
 }
 
@@ -6900,7 +6902,8 @@ dsp_work_bloop (void)
   csky_insn.inst = csky_insn.opcode->op32[0].opcode | (reg << 16);
   csky_insn.isize = 4;
 
-  if (csky_insn.e1.X_op == O_symbol
+  if (csky_insn.number == 3
+      && csky_insn.e1.X_op == O_symbol
       && csky_insn.e2.X_op == O_symbol)
     {
        fix_new_exp (frag_now, csky_insn.output - frag_now->fr_literal,
@@ -6910,6 +6913,23 @@ dsp_work_bloop (void)
                     4, &csky_insn.e2, 1,
                     BFD_RELOC_CKCORE_PCREL_BLOOP_IMM4BY4);
     }
+  else if (csky_insn.number == 2
+          && csky_insn.e1.X_op == O_symbol)
+    {
+      fix_new_exp (frag_now, csky_insn.output-frag_now->fr_literal,
+                  4, &csky_insn.e1, 1,
+                  BFD_RELOC_CKCORE_PCREL_BLOOP_IMM12BY4);
+      if (csky_insn.last_isize == 2)
+       csky_insn.inst |= (0xf << 12);
+      else if (csky_insn.last_isize != 0)
+       csky_insn.inst |= (0xe << 12);
+      else
+       {
+         void *arg = (void *)"bloop can not be the first instruction"\
+                     "when the end label is not specified.\n";
+         csky_show_error (ERROR_UNDEFINE, 0, arg, NULL);
+       }
+    }
 
   csky_write_insn (csky_insn.output, csky_insn.inst, csky_insn.isize);
   return TRUE;
index 431703821f1545bfd8683d7bbda8a337bf73cdaf..eaf91259f8b86f838c4cd30f08ef646c79cdfa45 100644 (file)
@@ -11,6 +11,7 @@ Disassembly of section \.text:
 \s*[0-9a-f]*:\s*d0038802\s*ldbi.w\s*r2,\s*\(r3\)
 #...
 \s*[0-9a-f]*:\s*e9c20ffa\s*bloop\s*r2,\s*0x0,\s*0xc.*
+\s*[0-9a-f]*:\s*e9c2eff8\s*bloop\s*r2,\s*0x0,\s*0xc.*
 \s*[0-9a-f]*:\s*d0038c02\s*pldbi.d\s*r2,\s*\(r3\)
 \s*[0-9a-f]*:\s*d0039002\s*ldbi.hs\s*r2,\s*\(r3\)
 \s*[0-9a-f]*:\s*d0039402\s*ldbi.bs\s*r2,\s*\(r3\)
index 0491a53e32b5e0e00ec1281cd220ec1d904c93b8..755235dab3a8cf22dcd543144d756ea0d895e91f 100644 (file)
@@ -7,6 +7,7 @@ hello:
     ldbi.w r2, (r3)
 .loop_end:
     bloop r2, .loop_start, .loop_end
+    bloop r2, .loop_start
     pldbi.d r2, (r3)
     ldbi.hs r2, (r3)
     ldbi.bs r2, (r3)
index 40caaf97b7f20ba63d7547dce4db561f5cdeddf2..6578fbf37f03ac53e74030620e03203c8d7281fa 100644 (file)
@@ -1,3 +1,7 @@
+2020-08-21  Cooper Qu  <cooper.qu@linux.alibaba.com>
+
+       * csky-opc.h (csky_v2_opcodes): Add two operands form for bloop.
+
 2020-08-19  Alan Modra  <amodra@gmail.com>
 
        * ppc-opc.c (powerpc_opcodes): Replace OBF with BF for vcmpsq,
index bb35fe1f86ef5d9c3f8af050cda9c434c8ad6a3d..6dcf742e4828a0c218f9a2e90496447da2ecd783 100644 (file)
@@ -4675,13 +4675,16 @@ const struct csky_opcode csky_v2_opcodes[] =
 #define _RELAX      0
 
     /* The followings are enhance DSP instructions.  */
-    OP32_WITH_WORK ("bloop",
-                   OPCODE_INFO3 (0xe9c00000,
+    DOP32_WITH_WORK ("bloop",
+                    OPCODE_INFO3 (0xe9c00000,
                                  (16_20, AREG, OPRND_SHIFT_0_BIT),
                                  (0_11, BLOOP_OFF12b, OPRND_SHIFT_1_BIT),
                                  (12_15, BLOOP_OFF4b, OPRND_SHIFT_1_BIT)),
-                   CSKY_ISA_DSP_ENHANCE,
-                   dsp_work_bloop),
+                    OPCODE_INFO2 (0xe9c00000,
+                                 (16_20, AREG, OPRND_SHIFT_0_BIT),
+                                 (0_11, BLOOP_OFF12b, OPRND_SHIFT_1_BIT)),
+                    CSKY_ISA_DSP_ENHANCE,
+                    dsp_work_bloop),
     /* The followings are ld/st instructions.  */
     OP32 ("ldbi.b",
          OPCODE_INFO2 (0xd0008000,