RISC-V: Add pause hint instruction.
authorPhilipp Tomsich <prt@gnu.org>
Thu, 7 Jan 2021 07:53:25 +0000 (15:53 +0800)
committerNelson Chu <nelson.chu@sifive.com>
Thu, 7 Jan 2021 08:45:43 +0000 (16:45 +0800)
Add support for the pause hint instruction, as specified in the
Zihintpause extension.  The pause instruction is encoded as a
special form of a memory fence (which is available as part of the
base instruction set).  The chosen encoding does not mandate any
particular memory ordering and therefore is a true hint.

bfd/
    * elfxx-riscv.c (riscv_std_z_ext_strtab): Added zihintpause.
gas/
    * config/tc-riscv.c (riscv_multi_subset_supports): Added
    INSN_CLASS_ZIHINTPAUSE.
    * testsuite/gas/riscv/pause.d: New testcase.  Adding coverage for
    the pause hint instruction.
    * testsuite/gas/riscv/pause.s: Likewise.
include/
    * opcode/riscv-opc.h: Added MATCH_PAUSE, MASK_PAUSE and DECLARE_INSN
    for pause hint instruction.
    * opcode/riscv.h (enum riscv_insn_class): Added INSN_CLASS_ZIHINTPAUSE.
opcodes/
    * riscv-opc.c (riscv_opcodes): Add pause hint instruction.

bfd/ChangeLog
bfd/elfxx-riscv.c
gas/ChangeLog
gas/config/tc-riscv.c
gas/testsuite/gas/riscv/pause.d [new file with mode: 0644]
gas/testsuite/gas/riscv/pause.s [new file with mode: 0644]
include/ChangeLog
include/opcode/riscv-opc.h
include/opcode/riscv.h
opcodes/ChangeLog
opcodes/riscv-opc.c

index 4843f0a7c6efb87c3192da6e0f54a8624e7a59de..75fb3a5f5a1427a5864c89964bf2ab13fab09048 100644 (file)
@@ -1,3 +1,7 @@
+2021-01-07  Philipp Tomsich  <prt@gnu.org>
+
+       * elfxx-riscv.c (riscv_std_z_ext_strtab): Added zihintpause.
+
 2021-01-07  Claire Xenia Wolf  <claire@symbioticeda.com>
            Jim Wilson  <jimw@sifive.com>
            Andrew Waterman  <andrew@sifive.com>
index f40a923ff6f4073b51dacabb1c59bc47a75bbb19..42aeed767fe96a1e6e3b4fa3d41b8098ba1ff308 100644 (file)
@@ -1597,7 +1597,7 @@ riscv_parse_prefixed_ext (riscv_parse_subset_t *rps,
 
 static const char * const riscv_std_z_ext_strtab[] =
 {
-  "zicsr", "zifencei", "zba", "zbb", "zbc", NULL
+  "zicsr", "zifencei", "zihintpause", "zba", "zbb", "zbc", NULL
 };
 
 static const char * const riscv_std_s_ext_strtab[] =
index c99e1b32004694a44dc9f65298baf842fbcdba23..48c21f71292b809682d9ab026a761ecba68ed00b 100644 (file)
@@ -1,3 +1,11 @@
+2021-01-07  Philipp Tomsich  <prt@gnu.org>
+
+       * config/tc-riscv.c (riscv_multi_subset_supports): Added
+       INSN_CLASS_ZIHINTPAUSE.
+       * testsuite/gas/riscv/pause.d: New testcase.  Adding coverage for
+       the pause hint instruction.
+       * testsuite/gas/riscv/pause.s: Likewise.
+
 2021-01-07  Claire Xenia Wolf  <claire@symbioticeda.com>
            Jim Wilson  <jimw@sifive.com>
            Andrew Waterman  <andrew@sifive.com>
index 052199ea7404f5a8d88e6a68c2529d501b2df3d9..8dc84cbe3dfb4b9928b26e1682229165919b741e 100644 (file)
@@ -250,6 +250,8 @@ riscv_multi_subset_supports (enum riscv_insn_class insn_class)
       return riscv_subset_supports ("zicsr");
     case INSN_CLASS_ZIFENCEI:
       return riscv_subset_supports ("zifencei");
+    case INSN_CLASS_ZIHINTPAUSE:
+      return riscv_subset_supports ("zihintpause");
 
     case INSN_CLASS_ZBA:
       return riscv_subset_supports ("zba");
diff --git a/gas/testsuite/gas/riscv/pause.d b/gas/testsuite/gas/riscv/pause.d
new file mode 100644 (file)
index 0000000..13e581d
--- /dev/null
@@ -0,0 +1,10 @@
+#as: -march=rv32i_zihintpause
+#objdump: -dr
+
+.*:[   ]+file format .*
+
+
+Disassembly of section .text:
+
+0+000 <target>:
+[      ]+0:[   ]+0100000f[     ]+pause
diff --git a/gas/testsuite/gas/riscv/pause.s b/gas/testsuite/gas/riscv/pause.s
new file mode 100644 (file)
index 0000000..4cdf357
--- /dev/null
@@ -0,0 +1,2 @@
+target:
+       pause
index 80be817fe4357010a32f56bee01c45dd38402bb3..6345fc51818b0875660fb9dc4cc66efd0d6733e6 100644 (file)
@@ -1,3 +1,9 @@
+2021-01-07  Philipp Tomsich  <prt@gnu.org>
+
+       * opcode/riscv-opc.h: Added MATCH_PAUSE, MASK_PAUSE and DECLARE_INSN
+       for pause hint instruction.
+       * opcode/riscv.h (enum riscv_insn_class): Added INSN_CLASS_ZIHINTPAUSE.
+
 2021-01-07  Claire Xenia Wolf  <claire@symbioticeda.com>
            Jim Wilson  <jimw@sifive.com>
            Andrew Waterman  <andrew@sifive.com>
index 7dbe8308296993e39725d668d28c179879b84b80..38ce41d8430d18815af52366a8172bd3c0298dad 100644 (file)
 #define MASK_SW  0x707f
 #define MATCH_SD 0x3023
 #define MASK_SD  0x707f
+#define MATCH_PAUSE 0x0100000f
+#define MASK_PAUSE  0xffffffff
 #define MATCH_FENCE 0xf
 #define MASK_FENCE  0x707f
 #define MATCH_FENCE_I 0x100f
@@ -984,6 +986,7 @@ DECLARE_INSN(sb, MATCH_SB, MASK_SB)
 DECLARE_INSN(sh, MATCH_SH, MASK_SH)
 DECLARE_INSN(sw, MATCH_SW, MASK_SW)
 DECLARE_INSN(sd, MATCH_SD, MASK_SD)
+DECLARE_INSN(pause, MATCH_PAUSE, MASK_PAUSE)
 DECLARE_INSN(fence, MATCH_FENCE, MASK_FENCE)
 DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I)
 DECLARE_INSN(mul, MATCH_MUL, MASK_MUL)
index 326d84033412fba284a607dd3c557194281754bc..33ef290bb27e60843d9eb98569ab803c35a81adc 100644 (file)
@@ -311,6 +311,7 @@ enum riscv_insn_class
    INSN_CLASS_D_AND_C,
    INSN_CLASS_ZICSR,
    INSN_CLASS_ZIFENCEI,
+   INSN_CLASS_ZIHINTPAUSE,
    INSN_CLASS_ZBA,
    INSN_CLASS_ZBB,
    INSN_CLASS_ZBC,
index 4f4e54e6b360815171ffb152ede612763c36471f..2add0e75d058b76b863902a99e8b3c871930ba5f 100644 (file)
@@ -1,3 +1,7 @@
+2021-01-07  Philipp Tomsich  <prt@gnu.org>
+
+       * riscv-opc.c (riscv_opcodes): Add pause hint instruction.
+
 2021-01-07  Claire Xenia Wolf  <claire@symbioticeda.com>
            Jim Wilson  <jimw@sifive.com>
            Andrew Waterman  <andrew@sifive.com>
index cb980f23547ac6305cb095aaed3a5ba1f402eb52..7c262ddf53182d4506ad5ec8ca1afbf0a99cb0ce 100644 (file)
@@ -345,6 +345,7 @@ const struct riscv_opcode riscv_opcodes[] =
 {"sw",          0, INSN_CLASS_C,   "Ct,Ck(Cs)",  MATCH_C_SW, MASK_C_SW, match_opcode, INSN_ALIAS|INSN_DREF|INSN_4_BYTE },
 {"sw",          0, INSN_CLASS_I,   "t,q(s)",  MATCH_SW, MASK_SW, match_opcode, INSN_DREF|INSN_4_BYTE },
 {"sw",          0, INSN_CLASS_I,   "t,A,s",  0, (int) M_SW, match_never, INSN_MACRO },
+{"pause",       0, INSN_CLASS_ZIHINTPAUSE,   "",  MATCH_PAUSE, MASK_PAUSE, match_opcode, 0 },
 {"fence",       0, INSN_CLASS_I,   "",  MATCH_FENCE | MASK_PRED | MASK_SUCC, MASK_FENCE | MASK_RD | MASK_RS1 | MASK_IMM, match_opcode, INSN_ALIAS },
 {"fence",       0, INSN_CLASS_I,   "P,Q",  MATCH_FENCE, MASK_FENCE | MASK_RD | MASK_RS1 | (MASK_IMM & ~MASK_PRED & ~MASK_SUCC), match_opcode, 0 },
 {"fence.i",     0, INSN_CLASS_ZIFENCEI,   "",  MATCH_FENCE_I, MASK_FENCE | MASK_RD | MASK_RS1 | MASK_IMM, match_opcode, 0 },
@@ -977,6 +978,8 @@ const struct riscv_ext_version riscv_ext_version_table[] =
 {"zifencei", ISA_SPEC_CLASS_20191213, 2, 0},
 {"zifencei", ISA_SPEC_CLASS_20190608, 2, 0},
 
+{"zihintpause", ISA_SPEC_CLASS_DRAFT, 1, 0},
+
 {"zba", ISA_SPEC_CLASS_DRAFT, 0, 93},
 {"zbb", ISA_SPEC_CLASS_DRAFT, 0, 93},
 {"zbc", ISA_SPEC_CLASS_DRAFT, 0, 93},