[PATCH] RISC-V: add Smrnmi 1.0 instruction support

Nelson Chu nelson@rivosinc.com
Wed Mar 26 02:43:32 GMT 2025


Okay, I also added the missing support in riscv_multi_subset_supports_ext,
and mentioned the encoding from riscv-opcodes tool.  Committed.

Nelson

On Tue, Mar 25, 2025 at 12:33 AM Jerry Zhang Jian <
jerry.zhangjian@sifive.com> wrote:

> Add instruction `mnret' support
>
> Ref:
> https://github.com/riscv/riscv-isa-manual/blob/bb8b9127f81965eeff2d150c211d1c89376591c4/src/rnmi.adoc
>
> bfd/ChangeLog:
>     * elfxx-riscv.c: Add new Smrnmi instruction class handling
>
> gas/ChangeLog:
>     * testsuite/gas/riscv/smrnmi.s: New test for mnret
>     * testsuite/gas/riscv/rmrnmi.d: Likewise
>
> include/ChangeLog:
>     * opcode/ricsv-opc.h: Add MATCH_MNRET, MASK_MNRET
>     * opcode/riscv.h: Add new instruction class
>
> opcodes/ChangeLog:
>     * riscv-opc.c: Add `mnret' instruction
>
> Signed-off-by: Jerry Zhang Jian <jerry.zhangjian@sifive.com>
> ---
>  bfd/elfxx-riscv.c                |  2 ++
>  gas/testsuite/gas/riscv/smrnmi.d | 10 ++++++++++
>  gas/testsuite/gas/riscv/smrnmi.s |  1 +
>  include/opcode/riscv-opc.h       |  5 +++++
>  include/opcode/riscv.h           |  1 +
>  opcodes/riscv-opc.c              |  3 +++
>  6 files changed, 22 insertions(+)
>  create mode 100644 gas/testsuite/gas/riscv/smrnmi.d
>  create mode 100644 gas/testsuite/gas/riscv/smrnmi.s
>
> diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
> index 92e024bbe35..7dc80d12cbc 100644
> --- a/bfd/elfxx-riscv.c
> +++ b/bfd/elfxx-riscv.c
> @@ -2801,6 +2801,8 @@ riscv_multi_subset_supports (riscv_parse_subset_t
> *rps,
>      case INSN_CLASS_SMCTR_OR_SSCTR:
>        return (riscv_subset_supports (rps, "smctr")
>               || riscv_subset_supports (rps, "ssctr"));
> +    case INSN_CLASS_SMRNMI:
> +      return riscv_subset_supports (rps, "smrnmi");
>      case INSN_CLASS_SVINVAL:
>        return riscv_subset_supports (rps, "svinval");
>      case INSN_CLASS_H:
> diff --git a/gas/testsuite/gas/riscv/smrnmi.d
> b/gas/testsuite/gas/riscv/smrnmi.d
> new file mode 100644
> index 00000000000..e0659be53c9
> --- /dev/null
> +++ b/gas/testsuite/gas/riscv/smrnmi.d
> @@ -0,0 +1,10 @@
> +#as: -march=rv32i_smrnmi
> +#source: smrnmi.s
> +#objdump: -d
> +
> +.*:[   ]+file format .*
> +
> +Disassembly of section .text:
> +
> +0+000 <.text>:
> +[      ]+[0-9a-f]+:[   ]+70200073[     ]+mnret
> diff --git a/gas/testsuite/gas/riscv/smrnmi.s
> b/gas/testsuite/gas/riscv/smrnmi.s
> new file mode 100644
> index 00000000000..085c10deaf0
> --- /dev/null
> +++ b/gas/testsuite/gas/riscv/smrnmi.s
> @@ -0,0 +1 @@
> +    mnret
> diff --git a/include/opcode/riscv-opc.h b/include/opcode/riscv-opc.h
> index 1f56317e255..fea49481498 100644
> --- a/include/opcode/riscv-opc.h
> +++ b/include/opcode/riscv-opc.h
> @@ -2311,6 +2311,9 @@
>  /* Smctr/Ssctr instruction.  */
>  #define MATCH_SCTRCLR 0x10400073
>  #define MASK_SCTRCLR 0xffffffff
> +/* Smrnmi instruction.  */
> +#define MATCH_MNRET 0x70200073
> +#define MASK_MNRET 0xffffffff
>  /* Svinval instruction.  */
>  #define MATCH_SINVAL_VMA 0x16000073
>  #define MASK_SINVAL_VMA 0xfe007fff
> @@ -4808,6 +4811,8 @@ DECLARE_INSN(cm_jt, MATCH_CM_JT, MASK_CM_JT)
>  DECLARE_INSN(cm_jalt, MATCH_CM_JALT, MASK_CM_JALT)
>  /* Smctr/Ssctr instruction.  */
>  DECLARE_INSN(sctrclr, MATCH_SCTRCLR, MASK_SCTRCLR)
> +/* Smrnmi instruction */
> +DECLARE_INSN(mnret, MATCH_MNRET, MASK_MNRET)
>  /* Vendor-specific (T-Head) XTheadBa instructions.  */
>  DECLARE_INSN(th_addsl, MATCH_TH_ADDSL, MASK_TH_ADDSL)
>  /* Vendor-specific (T-Head) XTheadBb instructions.  */
> diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h
> index 1f4bede428e..d76bcdb295c 100644
> --- a/include/opcode/riscv.h
> +++ b/include/opcode/riscv.h
> @@ -526,6 +526,7 @@ enum riscv_insn_class
>    INSN_CLASS_ZCMP,
>    INSN_CLASS_ZCMT,
>    INSN_CLASS_SMCTR_OR_SSCTR,
> +  INSN_CLASS_SMRNMI,
>    INSN_CLASS_SVINVAL,
>    INSN_CLASS_ZICBOM,
>    INSN_CLASS_ZICBOP,
> diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
> index b83dcabf7fc..e07f72b89f2 100644
> --- a/opcodes/riscv-opc.c
> +++ b/opcodes/riscv-opc.c
> @@ -2305,6 +2305,9 @@ const struct riscv_opcode riscv_opcodes[] =
>  {"hinval.vvma",     0, INSN_CLASS_SVINVAL, "s,t", MATCH_HINVAL_VVMA,
> MASK_HINVAL_VVMA, match_opcode, 0 },
>  {"hinval.gvma",     0, INSN_CLASS_SVINVAL, "s,t", MATCH_HINVAL_GVMA,
> MASK_HINVAL_GVMA, match_opcode, 0 },
>
> +/* Smrnmi instruction */
> +{"mnret", 0, INSN_CLASS_SMRNMI, "", MATCH_MNRET, MASK_MNRET,
> match_opcode, 0 },
> +
>  /* Hypervisor instructions.  */
>  {"hfence.vvma", 0, INSN_CLASS_H, "",       MATCH_HFENCE_VVMA,
> MASK_HFENCE_VVMA|MASK_RS1|MASK_RS2, match_opcode, INSN_ALIAS },
>  {"hfence.vvma", 0, INSN_CLASS_H, "s",      MATCH_HFENCE_VVMA,
> MASK_HFENCE_VVMA|MASK_RS2, match_opcode, INSN_ALIAS },
> --
> 2.46.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://sourceware.org/pipermail/binutils/attachments/20250326/9fe47fbe/attachment.htm>


More information about the Binutils mailing list