[PATCH] RISC-V: Support Zmmul extension

Tsukasa OI research_trasio@irq.a4lg.com
Wed Jul 13 03:42:24 GMT 2022


廖先生,

I submitted a patchset for pretty much the same purpose:
<https://sourceware.org/pipermail/binutils/2022-July/121685.html>
but my testcase part could coexist with yours.

Note that my and your patchset has a key technical difference:
-   In Tsukasa OI's patch, "M" implies "Zmmul" but
-   in LIAO Shihua's patch, it does not.

I have no (or a little) preference here as long as you clean the patch a
bit.



On 2022/07/11 16:30, shihua@iscas.ac.cn wrote:
> From: LiaoShihua <shihua@iscas.ac.cn>
> 
>     Zmmul extension is Multiply only extension for RISC-V.It implements the multiplication subset of the M extension. 
>     The encodings are identical to those of the corresponding M-extension instructions.
> 
> bfd\ChangeLog:

A backslash seems odd here.  Just for curiosity, is it what you get when
you run contrib/mklog.py on Windows?

> 
>         * elfxx-riscv.c (riscv_multi_subset_supports):Add support for Zmmul extension
>         (riscv_multi_subset_supports_ext):Ditto.
> 
> include\ChangeLog:
> 
>         * opcode/riscv.h (enum riscv_insn_class):Ditto.
> 
> opcodes\ChangeLog:
> 
>         * riscv-opc.c:Ditto.
> ---
>  bfd/elfxx-riscv.c      |  6 ++++++
>  include/opcode/riscv.h |  1 +
>  opcodes/riscv-opc.c    | 10 +++++-----
>  3 files changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
> index bf7dc20e892..3c9c961352a 100644
> --- a/bfd/elfxx-riscv.c
> +++ b/bfd/elfxx-riscv.c
> @@ -1226,6 +1226,7 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] =
>    {"zvl16384b",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
>    {"zvl32768b",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
>    {"zvl65536b",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
> +  {"zmmul",		  ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },

Although complying the rule:

> /* The standard extensions must be added in canonical order.  */

is not strictly necessary (in fact, some Zvl* extensions are not
canonically ordered), it would be good to have added in pretty much
canonical order (put "zmmul" after "zihintpause").

>    {NULL, 0, 0, 0, 0}
>  };
>  
> @@ -2395,6 +2396,9 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps,
>        return riscv_subset_supports (rps, "svinval");
>      case INSN_CLASS_H:
>        return riscv_subset_supports (rps, "h");
> +    case INSN_CLASS_M_OR_ZMMUL:
> +      return (riscv_subset_supports (rps, "m")
> +	      || riscv_subset_supports (rps, "zmmul"));

How about putting INSN_CLASS_M_OR_ZMMUL just after INSN_CLASS_M?

>      default:
>        rps->error_handler
>          (_("internal: unreachable INSN_CLASS_*"));
> @@ -2500,6 +2504,8 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
>        return _("('q' and 'zfh') or 'zhinx");
>      case INSN_CLASS_H:
>        return _("h");
> +    case INSN_CLASS_M_OR_ZMMUL:
> +      return _("m' or `zmmul");

Likewise.

>      default:
>        rps->error_handler
>          (_("internal: unreachable INSN_CLASS_*"));
> diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h
> index 808f05f3d7a..0021b7434ea 100644
> --- a/include/opcode/riscv.h
> +++ b/include/opcode/riscv.h
> @@ -396,6 +396,7 @@ enum riscv_insn_class
>    INSN_CLASS_ZICBOP,
>    INSN_CLASS_ZICBOZ,
>    INSN_CLASS_H,
> +  INSN_CLASS_M_OR_ZMMUL,

Because switch case ordering above is not the same as riscv_insn_class
ordering, we would have multiple candidates.  I chose to place
INSN_CLASS_ZMMUL right after INSN_CLASS_ZIHINTPAUSE but putting
INSN_CLASS_M_OR_ZMMUL right after INSN_CLASS_M seems equivalently good.


Thanks,
Tsukasa

>  };
>  
>  /* This structure holds information for a particular instruction.  */
> diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
> index d5cedbe176c..958364fd5c0 100644
> --- a/opcodes/riscv-opc.c
> +++ b/opcodes/riscv-opc.c
> @@ -558,15 +558,15 @@ const struct riscv_opcode riscv_opcodes[] =
>  {"amominu.d.aqrl", 64, INSN_CLASS_A, "d,t,0(s)", MATCH_AMOMINU_D|MASK_AQRL, MASK_AMOMINU_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
>  
>  /* Multiply/Divide instruction subset.  */
> -{"mul",        0, INSN_CLASS_M,   "d,s,t",     MATCH_MUL, MASK_MUL, match_opcode, 0 },
> -{"mulh",       0, INSN_CLASS_M,   "d,s,t",     MATCH_MULH, MASK_MULH, match_opcode, 0 },
> -{"mulhu",      0, INSN_CLASS_M,   "d,s,t",     MATCH_MULHU, MASK_MULHU, match_opcode, 0 },
> -{"mulhsu",     0, INSN_CLASS_M,   "d,s,t",     MATCH_MULHSU, MASK_MULHSU, match_opcode, 0 },
> +{"mul",        0, INSN_CLASS_M_OR_ZMMUL,   "d,s,t",     MATCH_MUL, MASK_MUL, match_opcode, 0 },
> +{"mulh",       0, INSN_CLASS_M_OR_ZMMUL,   "d,s,t",     MATCH_MULH, MASK_MULH, match_opcode, 0 },
> +{"mulhu",      0, INSN_CLASS_M_OR_ZMMUL,   "d,s,t",     MATCH_MULHU, MASK_MULHU, match_opcode, 0 },
> +{"mulhsu",     0, INSN_CLASS_M_OR_ZMMUL,   "d,s,t",     MATCH_MULHSU, MASK_MULHSU, match_opcode, 0 },
>  {"div",        0, INSN_CLASS_M,   "d,s,t",     MATCH_DIV, MASK_DIV, match_opcode, 0 },
>  {"divu",       0, INSN_CLASS_M,   "d,s,t",     MATCH_DIVU, MASK_DIVU, match_opcode, 0 },
>  {"rem",        0, INSN_CLASS_M,   "d,s,t",     MATCH_REM, MASK_REM, match_opcode, 0 },
>  {"remu",       0, INSN_CLASS_M,   "d,s,t",     MATCH_REMU, MASK_REMU, match_opcode, 0 },
> -{"mulw",      64, INSN_CLASS_M,   "d,s,t",     MATCH_MULW, MASK_MULW, match_opcode, 0 },
> +{"mulw",      64, INSN_CLASS_M_OR_ZMMUL,   "d,s,t",     MATCH_MULW, MASK_MULW, match_opcode, 0 },
>  {"divw",      64, INSN_CLASS_M,   "d,s,t",     MATCH_DIVW, MASK_DIVW, match_opcode, 0 },
>  {"divuw",     64, INSN_CLASS_M,   "d,s,t",     MATCH_DIVUW, MASK_DIVUW, match_opcode, 0 },
>  {"remw",      64, INSN_CLASS_M,   "d,s,t",     MATCH_REMW, MASK_REMW, match_opcode, 0 },


More information about the Binutils mailing list