* [PATCH 0/3] RISC-V: Zfinx extension support @ 2021-10-28 16:47 jiawei 2021-10-28 16:47 ` [PATCH 1/3] RISC-V: Add mininal support for z[fdq]inx jiawei ` (3 more replies) 0 siblings, 4 replies; 8+ messages in thread From: jiawei @ 2021-10-28 16:47 UTC (permalink / raw) To: binutils Cc: tariq.kurd, kito.cheng, jimw, jeremy.bennett, cmuellner, palmer, andrew, lazyparser, jiawei This patch is support zfinx extension on binutils, zfinx is not compatible with any float extension and use gpr replace fpr, we adjust the opreand set when zfinx used. For disassemble part, we add a flag ZFINX(0x10) as ELF-header to distinguish whether use gpr or fpr name for float instructions. jiawei (3): RISC-V: Add mininal support for z[fdq]inx RISC-V: Add instructions and operand set for z[fdq]inx RISC-V: Add testcases and disassemble support for z[fdq]inx bfd/elfxx-riscv.c | 32 +++++++ binutils/readelf.c | 3 + gas/config/tc-riscv.c | 33 +++++++- gas/testsuite/gas/riscv/zdinx.d | 41 +++++++++ gas/testsuite/gas/riscv/zdinx.s | 33 ++++++++ gas/testsuite/gas/riscv/zfinx.d | 39 +++++++++ gas/testsuite/gas/riscv/zfinx.s | 31 +++++++ gas/testsuite/gas/riscv/zqinx.d | 43 ++++++++++ gas/testsuite/gas/riscv/zqinx.s | 35 ++++++++ include/elf/riscv.h | 3 + include/opcode/riscv.h | 3 + opcodes/riscv-dis.c | 4 + opcodes/riscv-opc.c | 146 ++++++++++++++++++++++++++++++++ 13 files changed, 443 insertions(+), 3 deletions(-) create mode 100644 gas/testsuite/gas/riscv/zdinx.d create mode 100644 gas/testsuite/gas/riscv/zdinx.s create mode 100644 gas/testsuite/gas/riscv/zfinx.d create mode 100644 gas/testsuite/gas/riscv/zfinx.s create mode 100644 gas/testsuite/gas/riscv/zqinx.d create mode 100644 gas/testsuite/gas/riscv/zqinx.s ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/3] RISC-V: Add mininal support for z[fdq]inx 2021-10-28 16:47 [PATCH 0/3] RISC-V: Zfinx extension support jiawei @ 2021-10-28 16:47 ` jiawei 2021-11-09 6:32 ` Nelson Chu 2021-10-28 16:47 ` [PATCH 2/3] RISC-V: Add instructions and operand set " jiawei ` (2 subsequent siblings) 3 siblings, 1 reply; 8+ messages in thread From: jiawei @ 2021-10-28 16:47 UTC (permalink / raw) To: binutils Cc: tariq.kurd, kito.cheng, jimw, jeremy.bennett, cmuellner, palmer, andrew, lazyparser, jiawei --- bfd/elfxx-riscv.c | 32 ++++++++++++++++++++++++++++++++ gas/config/tc-riscv.c | 7 +++++++ include/opcode/riscv.h | 3 +++ 3 files changed, 42 insertions(+) diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c index cdb4fa0996a..e62c63abbb4 100644 --- a/bfd/elfxx-riscv.c +++ b/bfd/elfxx-riscv.c @@ -1075,6 +1075,8 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] = {"q", "d", check_implicit_always}, {"d", "f", check_implicit_always}, {"f", "zicsr", check_implicit_always}, + {"zqinx", "zdinx", check_implicit_always}, + {"zdinx", "zfinx", check_implicit_always}, {NULL, NULL, NULL} }; @@ -1146,6 +1148,9 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] = {"zba", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zbc", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zbs", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zfinx", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zdinx", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zqinx", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {NULL, 0, 0, 0, 0} }; @@ -1824,6 +1829,33 @@ riscv_parse_check_conflicts (riscv_parse_subset_t *rps) (_("rv32e does not support the `f' extension")); no_conflict = false; } + if (riscv_lookup_subset (rps->subset_list, "zfinx", &subset) + && (riscv_lookup_subset (rps->subset_list, "f", &subset) + || riscv_lookup_subset (rps->subset_list, "d", &subset) + || riscv_lookup_subset (rps->subset_list, "q", &subset))) + { + rps->error_handler + (_("`zfinx' is conflict with the `f/d/q' extension")); + no_conflict = false; + } + if (riscv_lookup_subset (rps->subset_list, "zdinx", &subset) + && (riscv_lookup_subset (rps->subset_list, "f", &subset) + || riscv_lookup_subset (rps->subset_list, "d", &subset) + || riscv_lookup_subset (rps->subset_list, "q", &subset))) + { + rps->error_handler + (_("`zdinx' is conflict with the `f/d/q' extension")); + no_conflict = false; + } + if (riscv_lookup_subset (rps->subset_list, "zqinx", &subset) + && (riscv_lookup_subset (rps->subset_list, "f", &subset) + || riscv_lookup_subset (rps->subset_list, "d", &subset) + || riscv_lookup_subset (rps->subset_list, "q", &subset))) + { + rps->error_handler + (_("`zqinx' is conflict with the `f/d/q' extension")); + no_conflict = false; + } return no_conflict; } diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index f7e0c929aa0..2c4df208664 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -286,6 +286,13 @@ riscv_multi_subset_supports (enum riscv_insn_class insn_class) case INSN_CLASS_ZBS: return riscv_subset_supports ("zbs"); + case INSN_CLASS_ZFINX: + return riscv_subset_supports ("zfinx"); + case INSN_CLASS_ZDINX: + return riscv_subset_supports ("zdinx"); + case INSN_CLASS_ZQINX: + return riscv_subset_supports ("zqinx"); + default: as_fatal ("internal: unreachable"); return false; diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h index afcd41ff1dd..a23cd010e4a 100644 --- a/include/opcode/riscv.h +++ b/include/opcode/riscv.h @@ -320,6 +320,9 @@ enum riscv_insn_class INSN_CLASS_ZBB, INSN_CLASS_ZBC, INSN_CLASS_ZBS, + INSN_CLASS_ZFINX, + INSN_CLASS_ZDINX, + INSN_CLASS_ZQINX, }; /* This structure holds information for a particular instruction. */ -- 2.25.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] RISC-V: Add mininal support for z[fdq]inx 2021-10-28 16:47 ` [PATCH 1/3] RISC-V: Add mininal support for z[fdq]inx jiawei @ 2021-11-09 6:32 ` Nelson Chu 0 siblings, 0 replies; 8+ messages in thread From: Nelson Chu @ 2021-11-09 6:32 UTC (permalink / raw) To: jiawei; +Cc: Binutils, tariq.kurd, cmuellner, Kito Cheng On Fri, Oct 29, 2021 at 12:49 AM jiawei <jiawei@iscas.ac.cn> wrote: > > --- > bfd/elfxx-riscv.c | 32 ++++++++++++++++++++++++++++++++ > gas/config/tc-riscv.c | 7 +++++++ > include/opcode/riscv.h | 3 +++ > 3 files changed, 42 insertions(+) > > diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c > index cdb4fa0996a..e62c63abbb4 100644 > --- a/bfd/elfxx-riscv.c > +++ b/bfd/elfxx-riscv.c > @@ -1075,6 +1075,8 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] = > {"q", "d", check_implicit_always}, > {"d", "f", check_implicit_always}, > {"f", "zicsr", check_implicit_always}, > + {"zqinx", "zdinx", check_implicit_always}, > + {"zdinx", "zfinx", check_implicit_always}, > {NULL, NULL, NULL} > }; > > @@ -1146,6 +1148,9 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] = > {"zba", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, > {"zbc", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, > {"zbs", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, > + {"zfinx", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, > + {"zdinx", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, > + {"zqinx", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, > {NULL, 0, 0, 0, 0} > }; > > @@ -1824,6 +1829,33 @@ riscv_parse_check_conflicts (riscv_parse_subset_t *rps) > (_("rv32e does not support the `f' extension")); > no_conflict = false; > } > + if (riscv_lookup_subset (rps->subset_list, "zfinx", &subset) > + && (riscv_lookup_subset (rps->subset_list, "f", &subset) > + || riscv_lookup_subset (rps->subset_list, "d", &subset) > + || riscv_lookup_subset (rps->subset_list, "q", &subset))) > + { > + rps->error_handler > + (_("`zfinx' is conflict with the `f/d/q' extension")); > + no_conflict = false; > + } > + if (riscv_lookup_subset (rps->subset_list, "zdinx", &subset) > + && (riscv_lookup_subset (rps->subset_list, "f", &subset) > + || riscv_lookup_subset (rps->subset_list, "d", &subset) > + || riscv_lookup_subset (rps->subset_list, "q", &subset))) > + { > + rps->error_handler > + (_("`zdinx' is conflict with the `f/d/q' extension")); > + no_conflict = false; > + } > + if (riscv_lookup_subset (rps->subset_list, "zqinx", &subset) > + && (riscv_lookup_subset (rps->subset_list, "f", &subset) > + || riscv_lookup_subset (rps->subset_list, "d", &subset) > + || riscv_lookup_subset (rps->subset_list, "q", &subset))) > + { > + rps->error_handler > + (_("`zqinx' is conflict with the `f/d/q' extension")); > + no_conflict = false; > + } > return no_conflict; > } For two reasons, 1. zqinx imply zdinx, and zdinx imply zfinx. 2. q imply d, and d imply f. I would suggest that we only check the conflict between zfinx and f should be enough. > diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c > index f7e0c929aa0..2c4df208664 100644 > --- a/gas/config/tc-riscv.c > +++ b/gas/config/tc-riscv.c > @@ -286,6 +286,13 @@ riscv_multi_subset_supports (enum riscv_insn_class insn_class) > case INSN_CLASS_ZBS: > return riscv_subset_supports ("zbs"); > > + case INSN_CLASS_ZFINX: > + return riscv_subset_supports ("zfinx"); > + case INSN_CLASS_ZDINX: > + return riscv_subset_supports ("zdinx"); > + case INSN_CLASS_ZQINX: > + return riscv_subset_supports ("zqinx"); > + > default: > as_fatal ("internal: unreachable"); > return false; > diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h > index afcd41ff1dd..a23cd010e4a 100644 > --- a/include/opcode/riscv.h > +++ b/include/opcode/riscv.h > @@ -320,6 +320,9 @@ enum riscv_insn_class > INSN_CLASS_ZBB, > INSN_CLASS_ZBC, > INSN_CLASS_ZBS, > + INSN_CLASS_ZFINX, > + INSN_CLASS_ZDINX, > + INSN_CLASS_ZQINX, > }; This patch seems to support the zfinx, zdinx and zqinx extensions for the architecture parser, so it is better to move these INSN_CLASS_* changes to the remaining patches, since they won't be used here. > /* This structure holds information for a particular instruction. */ > -- > 2.25.1 > Thanks Nelson ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/3] RISC-V: Add instructions and operand set for z[fdq]inx 2021-10-28 16:47 [PATCH 0/3] RISC-V: Zfinx extension support jiawei 2021-10-28 16:47 ` [PATCH 1/3] RISC-V: Add mininal support for z[fdq]inx jiawei @ 2021-10-28 16:47 ` jiawei 2021-11-09 9:51 ` Nelson Chu 2021-10-28 16:47 ` [PATCH 3/3] RISC-V: Add testcases and disassemble support " jiawei 2021-11-09 10:06 ` [PATCH 0/3] RISC-V: Zfinx extension support Nelson Chu 3 siblings, 1 reply; 8+ messages in thread From: jiawei @ 2021-10-28 16:47 UTC (permalink / raw) To: binutils Cc: tariq.kurd, kito.cheng, jimw, jeremy.bennett, cmuellner, palmer, andrew, lazyparser, jiawei --- gas/config/tc-riscv.c | 11 +++- opcodes/riscv-opc.c | 146 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+), 3 deletions(-) diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 2c4df208664..b879bf1ea8b 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -1158,6 +1158,7 @@ validate_riscv_insn (const struct riscv_opcode *opc, int length) USE_BITS (OP_MASK_RS1, OP_SH_RS1); /* Fall through. */ case 'T': /* RS2, floating point. */ + case 'x': USE_BITS (OP_MASK_RS1, OP_SH_RS1); /* Fall through. */ case 't': USE_BITS (OP_MASK_RS2, OP_SH_RS2); break; case 'R': /* RS3, floating point. */ case 'r': USE_BITS (OP_MASK_RS3, OP_SH_RS3); break; @@ -2508,6 +2509,7 @@ riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr, case 'd': /* Destination register. */ case 's': /* Source register. */ case 't': /* Target register. */ + case 'x': /* rs1 and rs2. */ case 'r': /* RS3 */ if (reg_lookup (&s, RCLASS_GPR, ®no)) { @@ -2519,12 +2521,15 @@ riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr, string to figure out where it goes in the instruction. */ switch (c) { + case 'd': + INSERT_OPERAND (RD, *ip, regno); + break; case 's': INSERT_OPERAND (RS1, *ip, regno); break; - case 'd': - INSERT_OPERAND (RD, *ip, regno); - break; + case 'x': + INSERT_OPERAND (RS1, *ip, regno); + /* fallthru */ case 't': INSERT_OPERAND (RS2, *ip, regno); break; diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c index b756bae64ab..435fb434161 100644 --- a/opcodes/riscv-opc.c +++ b/opcodes/riscv-opc.c @@ -534,52 +534,99 @@ const struct riscv_opcode riscv_opcodes[] = {"fmv.s.x", 0, INSN_CLASS_F, "D,s", MATCH_FMV_S_X, MASK_FMV_S_X, match_opcode, 0 }, {"fmv.s", 0, INSN_CLASS_F, "D,U", MATCH_FSGNJ_S, MASK_FSGNJ_S, match_rs1_eq_rs2, INSN_ALIAS }, {"fneg.s", 0, INSN_CLASS_F, "D,U", MATCH_FSGNJN_S, MASK_FSGNJN_S, match_rs1_eq_rs2, INSN_ALIAS }, +{"fneg.s", 0, INSN_CLASS_ZFINX, "d,x", MATCH_FSGNJN_S, MASK_FSGNJN_S, match_rs1_eq_rs2, INSN_ALIAS }, {"fabs.s", 0, INSN_CLASS_F, "D,U", MATCH_FSGNJX_S, MASK_FSGNJX_S, match_rs1_eq_rs2, INSN_ALIAS }, +{"fabs.s", 0, INSN_CLASS_ZFINX, "d,x", MATCH_FSGNJX_S, MASK_FSGNJX_S, match_rs1_eq_rs2, INSN_ALIAS }, {"fsgnj.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FSGNJ_S, MASK_FSGNJ_S, match_opcode, 0 }, +{"fsgnj.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FSGNJ_S, MASK_FSGNJ_S, match_opcode, 0 }, {"fsgnjn.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FSGNJN_S, MASK_FSGNJN_S, match_opcode, 0 }, +{"fsgnjn.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FSGNJN_S, MASK_FSGNJN_S, match_opcode, 0 }, {"fsgnjx.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FSGNJX_S, MASK_FSGNJX_S, match_opcode, 0 }, +{"fsgnjx.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FSGNJX_S, MASK_FSGNJX_S, match_opcode, 0 }, {"fadd.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FADD_S|MASK_RM, MASK_FADD_S|MASK_RM, match_opcode, 0 }, {"fadd.s", 0, INSN_CLASS_F, "D,S,T,m", MATCH_FADD_S, MASK_FADD_S, match_opcode, 0 }, +{"fadd.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FADD_S|MASK_RM, MASK_FADD_S|MASK_RM, match_opcode, 0 }, +{"fadd.s", 0, INSN_CLASS_ZFINX, "d,s,t,m", MATCH_FADD_S, MASK_FADD_S, match_opcode, 0 }, {"fsub.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FSUB_S|MASK_RM, MASK_FSUB_S|MASK_RM, match_opcode, 0 }, {"fsub.s", 0, INSN_CLASS_F, "D,S,T,m", MATCH_FSUB_S, MASK_FSUB_S, match_opcode, 0 }, +{"fsub.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FSUB_S|MASK_RM, MASK_FSUB_S|MASK_RM, match_opcode, 0 }, +{"fsub.s", 0, INSN_CLASS_ZFINX, "d,s,t,m", MATCH_FSUB_S, MASK_FSUB_S, match_opcode, 0 }, {"fmul.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FMUL_S|MASK_RM, MASK_FMUL_S|MASK_RM, match_opcode, 0 }, {"fmul.s", 0, INSN_CLASS_F, "D,S,T,m", MATCH_FMUL_S, MASK_FMUL_S, match_opcode, 0 }, +{"fmul.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FMUL_S|MASK_RM, MASK_FMUL_S|MASK_RM, match_opcode, 0 }, +{"fmul.s", 0, INSN_CLASS_ZFINX, "d,s,t,m", MATCH_FMUL_S, MASK_FMUL_S, match_opcode, 0 }, {"fdiv.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FDIV_S|MASK_RM, MASK_FDIV_S|MASK_RM, match_opcode, 0 }, {"fdiv.s", 0, INSN_CLASS_F, "D,S,T,m", MATCH_FDIV_S, MASK_FDIV_S, match_opcode, 0 }, +{"fdiv.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FDIV_S|MASK_RM, MASK_FDIV_S|MASK_RM, match_opcode, 0 }, +{"fdiv.s", 0, INSN_CLASS_ZFINX, "d,s,t,m", MATCH_FDIV_S, MASK_FDIV_S, match_opcode, 0 }, {"fsqrt.s", 0, INSN_CLASS_F, "D,S", MATCH_FSQRT_S|MASK_RM, MASK_FSQRT_S|MASK_RM, match_opcode, 0 }, {"fsqrt.s", 0, INSN_CLASS_F, "D,S,m", MATCH_FSQRT_S, MASK_FSQRT_S, match_opcode, 0 }, +{"fsqrt.s", 0, INSN_CLASS_ZFINX, "d,s", MATCH_FSQRT_S|MASK_RM, MASK_FSQRT_S|MASK_RM, match_opcode, 0 }, +{"fsqrt.s", 0, INSN_CLASS_ZFINX, "d,s,m", MATCH_FSQRT_S, MASK_FSQRT_S, match_opcode, 0 }, {"fmin.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FMIN_S, MASK_FMIN_S, match_opcode, 0 }, +{"fmin.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FMIN_S, MASK_FMIN_S, match_opcode, 0 }, {"fmax.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FMAX_S, MASK_FMAX_S, match_opcode, 0 }, +{"fmax.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FMAX_S, MASK_FMAX_S, match_opcode, 0 }, {"fmadd.s", 0, INSN_CLASS_F, "D,S,T,R", MATCH_FMADD_S|MASK_RM, MASK_FMADD_S|MASK_RM, match_opcode, 0 }, {"fmadd.s", 0, INSN_CLASS_F, "D,S,T,R,m", MATCH_FMADD_S, MASK_FMADD_S, match_opcode, 0 }, +{"fmadd.s", 0, INSN_CLASS_ZFINX, "d,s,t,r", MATCH_FMADD_S|MASK_RM, MASK_FMADD_S|MASK_RM, match_opcode, 0 }, +{"fmadd.s", 0, INSN_CLASS_ZFINX, "d,s,t,r,m", MATCH_FMADD_S, MASK_FMADD_S, match_opcode, 0 }, {"fnmadd.s", 0, INSN_CLASS_F, "D,S,T,R", MATCH_FNMADD_S|MASK_RM, MASK_FNMADD_S|MASK_RM, match_opcode, 0 }, {"fnmadd.s", 0, INSN_CLASS_F, "D,S,T,R,m", MATCH_FNMADD_S, MASK_FNMADD_S, match_opcode, 0 }, +{"fnmadd.s", 0, INSN_CLASS_ZFINX, "d,s,t,r", MATCH_FNMADD_S|MASK_RM, MASK_FNMADD_S|MASK_RM, match_opcode, 0 }, +{"fnmadd.s", 0, INSN_CLASS_ZFINX, "d,s,t,r,m", MATCH_FNMADD_S, MASK_FNMADD_S, match_opcode, 0 }, {"fmsub.s", 0, INSN_CLASS_F, "D,S,T,R", MATCH_FMSUB_S|MASK_RM, MASK_FMSUB_S|MASK_RM, match_opcode, 0 }, {"fmsub.s", 0, INSN_CLASS_F, "D,S,T,R,m", MATCH_FMSUB_S, MASK_FMSUB_S, match_opcode, 0 }, +{"fmsub.s", 0, INSN_CLASS_ZFINX, "d,s,t,r", MATCH_FMSUB_S|MASK_RM, MASK_FMSUB_S|MASK_RM, match_opcode, 0 }, +{"fmsub.s", 0, INSN_CLASS_ZFINX, "d,s,t,r,m", MATCH_FMSUB_S, MASK_FMSUB_S, match_opcode, 0 }, {"fnmsub.s", 0, INSN_CLASS_F, "D,S,T,R", MATCH_FNMSUB_S|MASK_RM, MASK_FNMSUB_S|MASK_RM, match_opcode, 0 }, {"fnmsub.s", 0, INSN_CLASS_F, "D,S,T,R,m", MATCH_FNMSUB_S, MASK_FNMSUB_S, match_opcode, 0 }, +{"fnmsub.s", 0, INSN_CLASS_ZFINX, "d,s,t,r", MATCH_FNMSUB_S|MASK_RM, MASK_FNMSUB_S|MASK_RM, match_opcode, 0 }, +{"fnmsub.s", 0, INSN_CLASS_ZFINX, "d,s,t,r,m", MATCH_FNMSUB_S, MASK_FNMSUB_S, match_opcode, 0 }, {"fcvt.w.s", 0, INSN_CLASS_F, "d,S", MATCH_FCVT_W_S|MASK_RM, MASK_FCVT_W_S|MASK_RM, match_opcode, 0 }, {"fcvt.w.s", 0, INSN_CLASS_F, "d,S,m", MATCH_FCVT_W_S, MASK_FCVT_W_S, match_opcode, 0 }, +{"fcvt.w.s", 0, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_W_S|MASK_RM, MASK_FCVT_W_S|MASK_RM, match_opcode, 0 }, +{"fcvt.w.s", 0, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_W_S, MASK_FCVT_W_S, match_opcode, 0 }, {"fcvt.wu.s", 0, INSN_CLASS_F, "d,S", MATCH_FCVT_WU_S|MASK_RM, MASK_FCVT_WU_S|MASK_RM, match_opcode, 0 }, {"fcvt.wu.s", 0, INSN_CLASS_F, "d,S,m", MATCH_FCVT_WU_S, MASK_FCVT_WU_S, match_opcode, 0 }, +{"fcvt.wu.s", 0, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_WU_S|MASK_RM, MASK_FCVT_WU_S|MASK_RM, match_opcode, 0 }, +{"fcvt.wu.s", 0, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_WU_S, MASK_FCVT_WU_S, match_opcode, 0 }, {"fcvt.s.w", 0, INSN_CLASS_F, "D,s", MATCH_FCVT_S_W|MASK_RM, MASK_FCVT_S_W|MASK_RM, match_opcode, 0 }, {"fcvt.s.w", 0, INSN_CLASS_F, "D,s,m", MATCH_FCVT_S_W, MASK_FCVT_S_W, match_opcode, 0 }, +{"fcvt.s.w", 0, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_S_W|MASK_RM, MASK_FCVT_S_W|MASK_RM, match_opcode, 0 }, +{"fcvt.s.w", 0, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_S_W, MASK_FCVT_S_W, match_opcode, 0 }, {"fcvt.s.wu", 0, INSN_CLASS_F, "D,s", MATCH_FCVT_S_WU|MASK_RM, MASK_FCVT_S_W|MASK_RM, match_opcode, 0 }, {"fcvt.s.wu", 0, INSN_CLASS_F, "D,s,m", MATCH_FCVT_S_WU, MASK_FCVT_S_WU, match_opcode, 0 }, +{"fcvt.s.wu", 0, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_S_WU|MASK_RM, MASK_FCVT_S_W|MASK_RM, match_opcode, 0 }, +{"fcvt.s.wu", 0, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_S_WU, MASK_FCVT_S_WU, match_opcode, 0 }, {"fclass.s", 0, INSN_CLASS_F, "d,S", MATCH_FCLASS_S, MASK_FCLASS_S, match_opcode, 0 }, +{"fclass.s", 0, INSN_CLASS_ZFINX, "d,s", MATCH_FCLASS_S, MASK_FCLASS_S, match_opcode, 0 }, {"feq.s", 0, INSN_CLASS_F, "d,S,T", MATCH_FEQ_S, MASK_FEQ_S, match_opcode, 0 }, +{"feq.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FEQ_S, MASK_FEQ_S, match_opcode, 0 }, {"flt.s", 0, INSN_CLASS_F, "d,S,T", MATCH_FLT_S, MASK_FLT_S, match_opcode, 0 }, +{"flt.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FLT_S, MASK_FLT_S, match_opcode, 0 }, {"fle.s", 0, INSN_CLASS_F, "d,S,T", MATCH_FLE_S, MASK_FLE_S, match_opcode, 0 }, +{"fle.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FLE_S, MASK_FLE_S, match_opcode, 0 }, {"fgt.s", 0, INSN_CLASS_F, "d,T,S", MATCH_FLT_S, MASK_FLT_S, match_opcode, 0 }, +{"fgt.s", 0, INSN_CLASS_ZFINX, "d,t,s", MATCH_FLT_S, MASK_FLT_S, match_opcode, 0 }, {"fge.s", 0, INSN_CLASS_F, "d,T,S", MATCH_FLE_S, MASK_FLE_S, match_opcode, 0 }, +{"fge.s", 0, INSN_CLASS_ZFINX, "d,t,s", MATCH_FLE_S, MASK_FLE_S, match_opcode, 0 }, {"fcvt.l.s", 64, INSN_CLASS_F, "d,S", MATCH_FCVT_L_S|MASK_RM, MASK_FCVT_L_S|MASK_RM, match_opcode, 0 }, {"fcvt.l.s", 64, INSN_CLASS_F, "d,S,m", MATCH_FCVT_L_S, MASK_FCVT_L_S, match_opcode, 0 }, +{"fcvt.l.s", 64, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_L_S | MASK_RM, MASK_FCVT_L_S | MASK_RM, match_opcode, 0 }, +{"fcvt.l.s", 64, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_L_S, MASK_FCVT_L_S, match_opcode, 0 }, {"fcvt.lu.s", 64, INSN_CLASS_F, "d,S", MATCH_FCVT_LU_S|MASK_RM, MASK_FCVT_LU_S|MASK_RM, match_opcode, 0 }, {"fcvt.lu.s", 64, INSN_CLASS_F, "d,S,m", MATCH_FCVT_LU_S, MASK_FCVT_LU_S, match_opcode, 0 }, +{"fcvt.lu.s", 64, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_LU_S | MASK_RM, MASK_FCVT_LU_S | MASK_RM, match_opcode, 0 }, +{"fcvt.lu.s", 64, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_LU_S, MASK_FCVT_LU_S, match_opcode, 0 }, {"fcvt.s.l", 64, INSN_CLASS_F, "D,s", MATCH_FCVT_S_L|MASK_RM, MASK_FCVT_S_L|MASK_RM, match_opcode, 0 }, {"fcvt.s.l", 64, INSN_CLASS_F, "D,s,m", MATCH_FCVT_S_L, MASK_FCVT_S_L, match_opcode, 0 }, +{"fcvt.s.l", 64, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_S_L | MASK_RM, MASK_FCVT_S_L | MASK_RM, match_opcode, 0 }, +{"fcvt.s.l", 64, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_S_L, MASK_FCVT_S_L, match_opcode, 0 }, {"fcvt.s.lu", 64, INSN_CLASS_F, "D,s", MATCH_FCVT_S_LU|MASK_RM, MASK_FCVT_S_L|MASK_RM, match_opcode, 0 }, {"fcvt.s.lu", 64, INSN_CLASS_F, "D,s,m", MATCH_FCVT_S_LU, MASK_FCVT_S_LU, match_opcode, 0 }, +{"fcvt.s.lu", 64, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_S_LU | MASK_RM, MASK_FCVT_S_L | MASK_RM, match_opcode, 0 }, +{"fcvt.s.lu", 64, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_S_LU, MASK_FCVT_S_LU, match_opcode, 0 }, /* Double-precision floating-point instruction subset. */ {"fld", 0, INSN_CLASS_D_AND_C, "D,Cn(Cc)", MATCH_C_FLDSP, MASK_C_FLDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, @@ -592,55 +639,103 @@ const struct riscv_opcode riscv_opcodes[] = {"fsd", 0, INSN_CLASS_D, "T,A,s", 0, (int) M_FSD, match_never, INSN_MACRO }, {"fmv.d", 0, INSN_CLASS_D, "D,U", MATCH_FSGNJ_D, MASK_FSGNJ_D, match_rs1_eq_rs2, INSN_ALIAS }, {"fneg.d", 0, INSN_CLASS_D, "D,U", MATCH_FSGNJN_D, MASK_FSGNJN_D, match_rs1_eq_rs2, INSN_ALIAS }, +{"fneg.d", 0, INSN_CLASS_ZDINX, "d,x", MATCH_FSGNJN_D, MASK_FSGNJN_D, match_rs1_eq_rs2, INSN_ALIAS }, {"fabs.d", 0, INSN_CLASS_D, "D,U", MATCH_FSGNJX_D, MASK_FSGNJX_D, match_rs1_eq_rs2, INSN_ALIAS }, +{"fabs.d", 0, INSN_CLASS_ZDINX, "d,x", MATCH_FSGNJX_D, MASK_FSGNJX_D, match_rs1_eq_rs2, INSN_ALIAS }, {"fsgnj.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FSGNJ_D, MASK_FSGNJ_D, match_opcode, 0 }, +{"fsgnj.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FSGNJ_D, MASK_FSGNJ_D, match_opcode, 0 }, {"fsgnjn.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FSGNJN_D, MASK_FSGNJN_D, match_opcode, 0 }, +{"fsgnjn.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FSGNJN_D, MASK_FSGNJN_D, match_opcode, 0 }, {"fsgnjx.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FSGNJX_D, MASK_FSGNJX_D, match_opcode, 0 }, +{"fsgnjx.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FSGNJX_D, MASK_FSGNJX_D, match_opcode, 0 }, {"fadd.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FADD_D|MASK_RM, MASK_FADD_D|MASK_RM, match_opcode, 0 }, {"fadd.d", 0, INSN_CLASS_D, "D,S,T,m", MATCH_FADD_D, MASK_FADD_D, match_opcode, 0 }, +{"fadd.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FADD_D | MASK_RM, MASK_FADD_D | MASK_RM, match_opcode, 0 }, +{"fadd.d", 0, INSN_CLASS_ZDINX, "d,s,t,m", MATCH_FADD_D, MASK_FADD_D, match_opcode, 0 }, {"fsub.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FSUB_D|MASK_RM, MASK_FSUB_D|MASK_RM, match_opcode, 0 }, {"fsub.d", 0, INSN_CLASS_D, "D,S,T,m", MATCH_FSUB_D, MASK_FSUB_D, match_opcode, 0 }, +{"fsub.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FSUB_D | MASK_RM, MASK_FSUB_D | MASK_RM, match_opcode, 0 }, +{"fsub.d", 0, INSN_CLASS_ZDINX, "d,s,t,m", MATCH_FSUB_D, MASK_FSUB_D, match_opcode, 0 }, {"fmul.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FMUL_D|MASK_RM, MASK_FMUL_D|MASK_RM, match_opcode, 0 }, {"fmul.d", 0, INSN_CLASS_D, "D,S,T,m", MATCH_FMUL_D, MASK_FMUL_D, match_opcode, 0 }, +{"fmul.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FMUL_D | MASK_RM, MASK_FMUL_D | MASK_RM, match_opcode, 0 }, +{"fmul.d", 0, INSN_CLASS_ZDINX, "d,s,t,m", MATCH_FMUL_D, MASK_FMUL_D, match_opcode, 0 }, {"fdiv.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FDIV_D|MASK_RM, MASK_FDIV_D|MASK_RM, match_opcode, 0 }, {"fdiv.d", 0, INSN_CLASS_D, "D,S,T,m", MATCH_FDIV_D, MASK_FDIV_D, match_opcode, 0 }, +{"fdiv.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FDIV_D | MASK_RM, MASK_FDIV_D | MASK_RM, match_opcode, 0 }, +{"fdiv.d", 0, INSN_CLASS_ZDINX, "d,s,t,m", MATCH_FDIV_D, MASK_FDIV_D, match_opcode, 0 }, {"fsqrt.d", 0, INSN_CLASS_D, "D,S", MATCH_FSQRT_D|MASK_RM, MASK_FSQRT_D|MASK_RM, match_opcode, 0 }, {"fsqrt.d", 0, INSN_CLASS_D, "D,S,m", MATCH_FSQRT_D, MASK_FSQRT_D, match_opcode, 0 }, +{"fsqrt.d", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FSQRT_D | MASK_RM, MASK_FSQRT_D | MASK_RM, match_opcode, 0 }, +{"fsqrt.d", 0, INSN_CLASS_ZDINX, "d,s,m", MATCH_FSQRT_D, MASK_FSQRT_D, match_opcode, 0 }, {"fmin.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FMIN_D, MASK_FMIN_D, match_opcode, 0 }, +{"fmin.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FMIN_D, MASK_FMIN_D, match_opcode, 0 }, {"fmax.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FMAX_D, MASK_FMAX_D, match_opcode, 0 }, +{"fmax.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FMAX_D, MASK_FMAX_D, match_opcode, 0 }, {"fmadd.d", 0, INSN_CLASS_D, "D,S,T,R", MATCH_FMADD_D|MASK_RM, MASK_FMADD_D|MASK_RM, match_opcode, 0 }, {"fmadd.d", 0, INSN_CLASS_D, "D,S,T,R,m", MATCH_FMADD_D, MASK_FMADD_D, match_opcode, 0 }, +{"fmadd.d", 0, INSN_CLASS_ZDINX, "d,s,t,r", MATCH_FMADD_D | MASK_RM, MASK_FMADD_D | MASK_RM, match_opcode, 0 }, +{"fmadd.d", 0, INSN_CLASS_ZDINX, "d,s,t,r,m", MATCH_FMADD_D, MASK_FMADD_D, match_opcode, 0 }, {"fnmadd.d", 0, INSN_CLASS_D, "D,S,T,R", MATCH_FNMADD_D|MASK_RM, MASK_FNMADD_D|MASK_RM, match_opcode, 0 }, {"fnmadd.d", 0, INSN_CLASS_D, "D,S,T,R,m", MATCH_FNMADD_D, MASK_FNMADD_D, match_opcode, 0 }, +{"fnmadd.d", 0, INSN_CLASS_ZDINX, "d,s,t,r", MATCH_FNMADD_D | MASK_RM, MASK_FNMADD_D | MASK_RM, match_opcode, 0 }, +{"fnmadd.d", 0, INSN_CLASS_ZDINX, "d,s,t,r,m", MATCH_FNMADD_D, MASK_FNMADD_D, match_opcode, 0 }, {"fmsub.d", 0, INSN_CLASS_D, "D,S,T,R", MATCH_FMSUB_D|MASK_RM, MASK_FMSUB_D|MASK_RM, match_opcode, 0 }, {"fmsub.d", 0, INSN_CLASS_D, "D,S,T,R,m", MATCH_FMSUB_D, MASK_FMSUB_D, match_opcode, 0 }, +{"fmsub.d", 0, INSN_CLASS_ZDINX, "d,s,t,r", MATCH_FMSUB_D | MASK_RM, MASK_FMSUB_D | MASK_RM, match_opcode, 0 }, +{"fmsub.d", 0, INSN_CLASS_ZDINX, "d,s,t,r,m", MATCH_FMSUB_D, MASK_FMSUB_D, match_opcode, 0 }, {"fnmsub.d", 0, INSN_CLASS_D, "D,S,T,R", MATCH_FNMSUB_D|MASK_RM, MASK_FNMSUB_D|MASK_RM, match_opcode, 0 }, {"fnmsub.d", 0, INSN_CLASS_D, "D,S,T,R,m", MATCH_FNMSUB_D, MASK_FNMSUB_D, match_opcode, 0 }, +{"fnmsub.d", 0, INSN_CLASS_ZDINX, "d,s,t,r", MATCH_FNMSUB_D | MASK_RM, MASK_FNMSUB_D | MASK_RM, match_opcode, 0 }, +{"fnmsub.d", 0, INSN_CLASS_ZDINX, "d,s,t,r,m", MATCH_FNMSUB_D, MASK_FNMSUB_D, match_opcode, 0 }, {"fcvt.w.d", 0, INSN_CLASS_D, "d,S", MATCH_FCVT_W_D|MASK_RM, MASK_FCVT_W_D|MASK_RM, match_opcode, 0 }, {"fcvt.w.d", 0, INSN_CLASS_D, "d,S,m", MATCH_FCVT_W_D, MASK_FCVT_W_D, match_opcode, 0 }, +{"fcvt.w.d", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_W_D | MASK_RM, MASK_FCVT_W_D | MASK_RM, match_opcode, 0 }, +{"fcvt.w.d", 0, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_W_D, MASK_FCVT_W_D, match_opcode, 0 }, {"fcvt.wu.d", 0, INSN_CLASS_D, "d,S", MATCH_FCVT_WU_D|MASK_RM, MASK_FCVT_WU_D|MASK_RM, match_opcode, 0 }, {"fcvt.wu.d", 0, INSN_CLASS_D, "d,S,m", MATCH_FCVT_WU_D, MASK_FCVT_WU_D, match_opcode, 0 }, +{"fcvt.wu.d", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_WU_D | MASK_RM, MASK_FCVT_WU_D | MASK_RM, match_opcode, 0 }, +{"fcvt.wu.d", 0, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_WU_D, MASK_FCVT_WU_D, match_opcode, 0 }, {"fcvt.d.w", 0, INSN_CLASS_D, "D,s", MATCH_FCVT_D_W, MASK_FCVT_D_W|MASK_RM, match_opcode, 0 }, +{"fcvt.d.w", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_D_W, MASK_FCVT_D_W | MASK_RM, match_opcode, 0 }, {"fcvt.d.wu", 0, INSN_CLASS_D, "D,s", MATCH_FCVT_D_WU, MASK_FCVT_D_WU|MASK_RM, match_opcode, 0 }, +{"fcvt.d.wu", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_D_WU, MASK_FCVT_D_WU | MASK_RM, match_opcode, 0 }, {"fcvt.d.s", 0, INSN_CLASS_D, "D,S", MATCH_FCVT_D_S, MASK_FCVT_D_S|MASK_RM, match_opcode, 0 }, +{"fcvt.d.s", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_D_S, MASK_FCVT_D_S | MASK_RM, match_opcode, 0 }, {"fcvt.s.d", 0, INSN_CLASS_D, "D,S", MATCH_FCVT_S_D|MASK_RM, MASK_FCVT_S_D|MASK_RM, match_opcode, 0 }, {"fcvt.s.d", 0, INSN_CLASS_D, "D,S,m", MATCH_FCVT_S_D, MASK_FCVT_S_D, match_opcode, 0 }, +{"fcvt.s.d", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_S_D | MASK_RM, MASK_FCVT_S_D | MASK_RM, match_opcode, 0 }, +{"fcvt.s.d", 0, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_S_D, MASK_FCVT_S_D, match_opcode, 0 }, {"fclass.d", 0, INSN_CLASS_D, "d,S", MATCH_FCLASS_D, MASK_FCLASS_D, match_opcode, 0 }, +{"fclass.d", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCLASS_D, MASK_FCLASS_D, match_opcode, 0 }, {"feq.d", 0, INSN_CLASS_D, "d,S,T", MATCH_FEQ_D, MASK_FEQ_D, match_opcode, 0 }, +{"feq.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FEQ_D, MASK_FEQ_D, match_opcode, 0 }, {"flt.d", 0, INSN_CLASS_D, "d,S,T", MATCH_FLT_D, MASK_FLT_D, match_opcode, 0 }, +{"flt.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FLT_D, MASK_FLT_D, match_opcode, 0 }, {"fle.d", 0, INSN_CLASS_D, "d,S,T", MATCH_FLE_D, MASK_FLE_D, match_opcode, 0 }, +{"fle.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FLE_D, MASK_FLE_D, match_opcode, 0 }, {"fgt.d", 0, INSN_CLASS_D, "d,T,S", MATCH_FLT_D, MASK_FLT_D, match_opcode, 0 }, +{"fgt.d", 0, INSN_CLASS_ZDINX, "d,t,s", MATCH_FLT_D, MASK_FLT_D, match_opcode, 0 }, {"fge.d", 0, INSN_CLASS_D, "d,T,S", MATCH_FLE_D, MASK_FLE_D, match_opcode, 0 }, +{"fge.d", 0, INSN_CLASS_ZDINX, "d,t,s", MATCH_FLE_D, MASK_FLE_D, match_opcode, 0 }, {"fmv.x.d", 64, INSN_CLASS_D, "d,S", MATCH_FMV_X_D, MASK_FMV_X_D, match_opcode, 0 }, {"fmv.d.x", 64, INSN_CLASS_D, "D,s", MATCH_FMV_D_X, MASK_FMV_D_X, match_opcode, 0 }, {"fcvt.l.d", 64, INSN_CLASS_D, "d,S", MATCH_FCVT_L_D|MASK_RM, MASK_FCVT_L_D|MASK_RM, match_opcode, 0 }, {"fcvt.l.d", 64, INSN_CLASS_D, "d,S,m", MATCH_FCVT_L_D, MASK_FCVT_L_D, match_opcode, 0 }, +{"fcvt.l.d", 64, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_L_D | MASK_RM, MASK_FCVT_L_D | MASK_RM, match_opcode, 0 }, +{"fcvt.l.d", 64, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_L_D, MASK_FCVT_L_D, match_opcode, 0 }, {"fcvt.lu.d", 64, INSN_CLASS_D, "d,S", MATCH_FCVT_LU_D|MASK_RM, MASK_FCVT_LU_D|MASK_RM, match_opcode, 0 }, {"fcvt.lu.d", 64, INSN_CLASS_D, "d,S,m", MATCH_FCVT_LU_D, MASK_FCVT_LU_D, match_opcode, 0 }, +{"fcvt.lu.d", 64, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_LU_D | MASK_RM, MASK_FCVT_LU_D | MASK_RM, match_opcode, 0 }, +{"fcvt.lu.d", 64, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_LU_D, MASK_FCVT_LU_D, match_opcode, 0 }, {"fcvt.d.l", 64, INSN_CLASS_D, "D,s", MATCH_FCVT_D_L|MASK_RM, MASK_FCVT_D_L|MASK_RM, match_opcode, 0 }, {"fcvt.d.l", 64, INSN_CLASS_D, "D,s,m", MATCH_FCVT_D_L, MASK_FCVT_D_L, match_opcode, 0 }, +{"fcvt.d.l", 64, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_D_L | MASK_RM, MASK_FCVT_D_L | MASK_RM, match_opcode, 0 }, +{"fcvt.d.l", 64, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_D_L, MASK_FCVT_D_L, match_opcode, 0 }, {"fcvt.d.lu", 64, INSN_CLASS_D, "D,s", MATCH_FCVT_D_LU|MASK_RM, MASK_FCVT_D_L|MASK_RM, match_opcode, 0 }, {"fcvt.d.lu", 64, INSN_CLASS_D, "D,s,m", MATCH_FCVT_D_LU, MASK_FCVT_D_LU, match_opcode, 0 }, +{"fcvt.d.lu", 64, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_D_LU | MASK_RM, MASK_FCVT_D_L | MASK_RM, match_opcode, 0 }, +{"fcvt.d.lu", 64, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_D_LU, MASK_FCVT_D_LU, match_opcode, 0 }, /* Quad-precision floating-point instruction subset. */ {"flq", 0, INSN_CLASS_Q, "D,o(s)", MATCH_FLQ, MASK_FLQ, match_opcode, INSN_DREF|INSN_16_BYTE }, @@ -649,58 +744,109 @@ const struct riscv_opcode riscv_opcodes[] = {"fsq", 0, INSN_CLASS_Q, "T,A,s", 0, (int) M_FSQ, match_never, INSN_MACRO }, {"fmv.q", 0, INSN_CLASS_Q, "D,U", MATCH_FSGNJ_Q, MASK_FSGNJ_Q, match_rs1_eq_rs2, INSN_ALIAS }, {"fneg.q", 0, INSN_CLASS_Q, "D,U", MATCH_FSGNJN_Q, MASK_FSGNJN_Q, match_rs1_eq_rs2, INSN_ALIAS }, +{"fneg.q", 0, INSN_CLASS_ZQINX, "d,x", MATCH_FSGNJN_Q, MASK_FSGNJN_Q, match_rs1_eq_rs2, INSN_ALIAS }, {"fabs.q", 0, INSN_CLASS_Q, "D,U", MATCH_FSGNJX_Q, MASK_FSGNJX_Q, match_rs1_eq_rs2, INSN_ALIAS }, +{"fabs.q", 0, INSN_CLASS_ZQINX, "d,x", MATCH_FSGNJX_Q, MASK_FSGNJX_Q, match_rs1_eq_rs2, INSN_ALIAS }, {"fsgnj.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FSGNJ_Q, MASK_FSGNJ_Q, match_opcode, 0 }, +{"fsgnj.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FSGNJ_Q, MASK_FSGNJ_Q, match_opcode, 0 }, {"fsgnjn.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FSGNJN_Q, MASK_FSGNJN_Q, match_opcode, 0 }, +{"fsgnjn.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FSGNJN_Q, MASK_FSGNJN_Q, match_opcode, 0 }, {"fsgnjx.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FSGNJX_Q, MASK_FSGNJX_Q, match_opcode, 0 }, +{"fsgnjx.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FSGNJX_Q, MASK_FSGNJX_Q, match_opcode, 0 }, {"fadd.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FADD_Q|MASK_RM, MASK_FADD_Q|MASK_RM, match_opcode, 0 }, {"fadd.q", 0, INSN_CLASS_Q, "D,S,T,m", MATCH_FADD_Q, MASK_FADD_Q, match_opcode, 0 }, +{"fadd.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FADD_Q|MASK_RM, MASK_FADD_Q|MASK_RM, match_opcode, 0 }, +{"fadd.q", 0, INSN_CLASS_ZQINX, "d,s,t,m", MATCH_FADD_Q, MASK_FADD_Q, match_opcode, 0 }, {"fsub.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FSUB_Q|MASK_RM, MASK_FSUB_Q|MASK_RM, match_opcode, 0 }, {"fsub.q", 0, INSN_CLASS_Q, "D,S,T,m", MATCH_FSUB_Q, MASK_FSUB_Q, match_opcode, 0 }, +{"fsub.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FSUB_Q|MASK_RM, MASK_FSUB_Q|MASK_RM, match_opcode, 0 }, +{"fsub.q", 0, INSN_CLASS_ZQINX, "d,s,t,m", MATCH_FSUB_Q, MASK_FSUB_Q, match_opcode, 0 }, {"fmul.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FMUL_Q|MASK_RM, MASK_FMUL_Q|MASK_RM, match_opcode, 0 }, {"fmul.q", 0, INSN_CLASS_Q, "D,S,T,m", MATCH_FMUL_Q, MASK_FMUL_Q, match_opcode, 0 }, +{"fmul.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FMUL_Q|MASK_RM, MASK_FMUL_Q|MASK_RM, match_opcode, 0 }, +{"fmul.q", 0, INSN_CLASS_ZQINX, "d,s,t,m", MATCH_FMUL_Q, MASK_FMUL_Q, match_opcode, 0 }, {"fdiv.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FDIV_Q|MASK_RM, MASK_FDIV_Q|MASK_RM, match_opcode, 0 }, {"fdiv.q", 0, INSN_CLASS_Q, "D,S,T,m", MATCH_FDIV_Q, MASK_FDIV_Q, match_opcode, 0 }, +{"fdiv.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FDIV_Q|MASK_RM, MASK_FDIV_Q|MASK_RM, match_opcode, 0 }, +{"fdiv.q", 0, INSN_CLASS_ZQINX, "d,s,t,m", MATCH_FDIV_Q, MASK_FDIV_Q, match_opcode, 0 }, {"fsqrt.q", 0, INSN_CLASS_Q, "D,S", MATCH_FSQRT_Q|MASK_RM, MASK_FSQRT_Q|MASK_RM, match_opcode, 0 }, {"fsqrt.q", 0, INSN_CLASS_Q, "D,S,m", MATCH_FSQRT_Q, MASK_FSQRT_Q, match_opcode, 0 }, +{"fsqrt.q", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FSQRT_Q|MASK_RM, MASK_FSQRT_Q|MASK_RM, match_opcode, 0 }, +{"fsqrt.q", 0, INSN_CLASS_ZQINX, "d,s,m", MATCH_FSQRT_Q, MASK_FSQRT_Q, match_opcode, 0 }, {"fmin.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FMIN_Q, MASK_FMIN_Q, match_opcode, 0 }, +{"fmin.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FMIN_Q, MASK_FMIN_Q, match_opcode, 0 }, {"fmax.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FMAX_Q, MASK_FMAX_Q, match_opcode, 0 }, +{"fmax.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FMAX_Q, MASK_FMAX_Q, match_opcode, 0 }, {"fmadd.q", 0, INSN_CLASS_Q, "D,S,T,R", MATCH_FMADD_Q|MASK_RM, MASK_FMADD_Q|MASK_RM, match_opcode, 0 }, {"fmadd.q", 0, INSN_CLASS_Q, "D,S,T,R,m", MATCH_FMADD_Q, MASK_FMADD_Q, match_opcode, 0 }, +{"fmadd.q", 0, INSN_CLASS_ZQINX, "d,s,t,r", MATCH_FMADD_Q|MASK_RM, MASK_FMADD_Q|MASK_RM, match_opcode, 0 }, +{"fmadd.q", 0, INSN_CLASS_ZQINX, "d,s,t,r,m", MATCH_FMADD_Q, MASK_FMADD_Q, match_opcode, 0 }, {"fnmadd.q", 0, INSN_CLASS_Q, "D,S,T,R", MATCH_FNMADD_Q|MASK_RM, MASK_FNMADD_Q|MASK_RM, match_opcode, 0 }, {"fnmadd.q", 0, INSN_CLASS_Q, "D,S,T,R,m", MATCH_FNMADD_Q, MASK_FNMADD_Q, match_opcode, 0 }, +{"fnmadd.q", 0, INSN_CLASS_ZQINX, "d,s,t,r", MATCH_FNMADD_Q|MASK_RM, MASK_FNMADD_Q|MASK_RM, match_opcode, 0 }, +{"fnmadd.q", 0, INSN_CLASS_ZQINX, "d,s,t,r,m", MATCH_FNMADD_Q, MASK_FNMADD_Q, match_opcode, 0 }, {"fmsub.q", 0, INSN_CLASS_Q, "D,S,T,R", MATCH_FMSUB_Q|MASK_RM, MASK_FMSUB_Q|MASK_RM, match_opcode, 0 }, {"fmsub.q", 0, INSN_CLASS_Q, "D,S,T,R,m", MATCH_FMSUB_Q, MASK_FMSUB_Q, match_opcode, 0 }, +{"fmsub.q", 0, INSN_CLASS_ZQINX, "d,s,t,r", MATCH_FMSUB_Q|MASK_RM, MASK_FMSUB_Q|MASK_RM, match_opcode, 0 }, +{"fmsub.q", 0, INSN_CLASS_ZQINX, "d,s,t,r,m", MATCH_FMSUB_Q, MASK_FMSUB_Q, match_opcode, 0 }, {"fnmsub.q", 0, INSN_CLASS_Q, "D,S,T,R", MATCH_FNMSUB_Q|MASK_RM, MASK_FNMSUB_Q|MASK_RM, match_opcode, 0 }, {"fnmsub.q", 0, INSN_CLASS_Q, "D,S,T,R,m", MATCH_FNMSUB_Q, MASK_FNMSUB_Q, match_opcode, 0 }, +{"fnmsub.q", 0, INSN_CLASS_ZQINX, "d,s,t,r", MATCH_FNMSUB_Q|MASK_RM, MASK_FNMSUB_Q|MASK_RM, match_opcode, 0 }, +{"fnmsub.q", 0, INSN_CLASS_ZQINX, "d,s,t,r,m", MATCH_FNMSUB_Q, MASK_FNMSUB_Q, match_opcode, 0 }, {"fcvt.w.q", 0, INSN_CLASS_Q, "d,S", MATCH_FCVT_W_Q|MASK_RM, MASK_FCVT_W_Q|MASK_RM, match_opcode, 0 }, {"fcvt.w.q", 0, INSN_CLASS_Q, "d,S,m", MATCH_FCVT_W_Q, MASK_FCVT_W_Q, match_opcode, 0 }, +{"fcvt.w.q", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_W_Q|MASK_RM, MASK_FCVT_W_Q|MASK_RM, match_opcode, 0 }, +{"fcvt.w.q", 0, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_W_Q, MASK_FCVT_W_Q, match_opcode, 0 }, {"fcvt.wu.q", 0, INSN_CLASS_Q, "d,S", MATCH_FCVT_WU_Q|MASK_RM, MASK_FCVT_WU_Q|MASK_RM, match_opcode, 0 }, {"fcvt.wu.q", 0, INSN_CLASS_Q, "d,S,m", MATCH_FCVT_WU_Q, MASK_FCVT_WU_Q, match_opcode, 0 }, +{"fcvt.wu.q", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_WU_Q|MASK_RM, MASK_FCVT_WU_Q|MASK_RM, match_opcode, 0 }, +{"fcvt.wu.q", 0, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_WU_Q, MASK_FCVT_WU_Q, match_opcode, 0 }, {"fcvt.q.w", 0, INSN_CLASS_Q, "D,s", MATCH_FCVT_Q_W, MASK_FCVT_Q_W|MASK_RM, match_opcode, 0 }, +{"fcvt.q.w", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_Q_W, MASK_FCVT_Q_W|MASK_RM, match_opcode, 0 }, {"fcvt.q.wu", 0, INSN_CLASS_Q, "D,s", MATCH_FCVT_Q_WU, MASK_FCVT_Q_WU|MASK_RM, match_opcode, 0 }, +{"fcvt.q.wu", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_Q_WU, MASK_FCVT_Q_WU|MASK_RM, match_opcode, 0 }, {"fcvt.q.s", 0, INSN_CLASS_Q, "D,S", MATCH_FCVT_Q_S, MASK_FCVT_Q_S|MASK_RM, match_opcode, 0 }, +{"fcvt.q.s", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_Q_S, MASK_FCVT_Q_S|MASK_RM, match_opcode, 0 }, {"fcvt.q.d", 0, INSN_CLASS_Q, "D,S", MATCH_FCVT_Q_D, MASK_FCVT_Q_D|MASK_RM, match_opcode, 0 }, +{"fcvt.q.d", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_Q_D, MASK_FCVT_Q_D|MASK_RM, match_opcode, 0 }, {"fcvt.s.q", 0, INSN_CLASS_Q, "D,S", MATCH_FCVT_S_Q|MASK_RM, MASK_FCVT_S_Q|MASK_RM, match_opcode, 0 }, {"fcvt.s.q", 0, INSN_CLASS_Q, "D,S,m", MATCH_FCVT_S_Q, MASK_FCVT_S_Q, match_opcode, 0 }, +{"fcvt.s.q", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_S_Q|MASK_RM, MASK_FCVT_S_Q|MASK_RM, match_opcode, 0 }, +{"fcvt.s.q", 0, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_S_Q, MASK_FCVT_S_Q, match_opcode, 0 }, {"fcvt.d.q", 0, INSN_CLASS_Q, "D,S", MATCH_FCVT_D_Q|MASK_RM, MASK_FCVT_D_Q|MASK_RM, match_opcode, 0 }, {"fcvt.d.q", 0, INSN_CLASS_Q, "D,S,m", MATCH_FCVT_D_Q, MASK_FCVT_D_Q, match_opcode, 0 }, +{"fcvt.d.q", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_D_Q|MASK_RM, MASK_FCVT_D_Q|MASK_RM, match_opcode, 0 }, +{"fcvt.d.q", 0, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_D_Q, MASK_FCVT_D_Q, match_opcode, 0 }, {"fclass.q", 0, INSN_CLASS_Q, "d,S", MATCH_FCLASS_Q, MASK_FCLASS_Q, match_opcode, 0 }, +{"fclass.q", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCLASS_Q, MASK_FCLASS_Q, match_opcode, 0 }, {"feq.q", 0, INSN_CLASS_Q, "d,S,T", MATCH_FEQ_Q, MASK_FEQ_Q, match_opcode, 0 }, +{"feq.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FEQ_Q, MASK_FEQ_Q, match_opcode, 0 }, {"flt.q", 0, INSN_CLASS_Q, "d,S,T", MATCH_FLT_Q, MASK_FLT_Q, match_opcode, 0 }, +{"flt.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FLT_Q, MASK_FLT_Q, match_opcode, 0 }, {"fle.q", 0, INSN_CLASS_Q, "d,S,T", MATCH_FLE_Q, MASK_FLE_Q, match_opcode, 0 }, +{"fle.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FLE_Q, MASK_FLE_Q, match_opcode, 0 }, {"fgt.q", 0, INSN_CLASS_Q, "d,T,S", MATCH_FLT_Q, MASK_FLT_Q, match_opcode, 0 }, +{"fgt.q", 0, INSN_CLASS_ZQINX, "d,t,s", MATCH_FLT_Q, MASK_FLT_Q, match_opcode, 0 }, {"fge.q", 0, INSN_CLASS_Q, "d,T,S", MATCH_FLE_Q, MASK_FLE_Q, match_opcode, 0 }, +{"fge.q", 0, INSN_CLASS_ZQINX, "d,t,s", MATCH_FLE_Q, MASK_FLE_Q, match_opcode, 0 }, {"fmv.x.q", 64, INSN_CLASS_Q, "d,S", MATCH_FMV_X_Q, MASK_FMV_X_Q, match_opcode, 0 }, {"fmv.q.x", 64, INSN_CLASS_Q, "D,s", MATCH_FMV_Q_X, MASK_FMV_Q_X, match_opcode, 0 }, {"fcvt.l.q", 64, INSN_CLASS_Q, "d,S", MATCH_FCVT_L_Q|MASK_RM, MASK_FCVT_L_Q|MASK_RM, match_opcode, 0 }, {"fcvt.l.q", 64, INSN_CLASS_Q, "d,S,m", MATCH_FCVT_L_Q, MASK_FCVT_L_Q, match_opcode, 0 }, +{"fcvt.l.q", 64, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_L_Q|MASK_RM, MASK_FCVT_L_Q|MASK_RM, match_opcode, 0 }, +{"fcvt.l.q", 64, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_L_Q, MASK_FCVT_L_Q, match_opcode, 0 }, {"fcvt.lu.q", 64, INSN_CLASS_Q, "d,S", MATCH_FCVT_LU_Q|MASK_RM, MASK_FCVT_LU_Q|MASK_RM, match_opcode, 0 }, {"fcvt.lu.q", 64, INSN_CLASS_Q, "d,S,m", MATCH_FCVT_LU_Q, MASK_FCVT_LU_Q, match_opcode, 0 }, +{"fcvt.lu.q", 64, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_LU_Q|MASK_RM, MASK_FCVT_LU_Q|MASK_RM, match_opcode, 0 }, +{"fcvt.lu.q", 64, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_LU_Q, MASK_FCVT_LU_Q, match_opcode, 0 }, {"fcvt.q.l", 64, INSN_CLASS_Q, "D,s", MATCH_FCVT_Q_L|MASK_RM, MASK_FCVT_Q_L|MASK_RM, match_opcode, 0 }, {"fcvt.q.l", 64, INSN_CLASS_Q, "D,s,m", MATCH_FCVT_Q_L, MASK_FCVT_Q_L, match_opcode, 0 }, +{"fcvt.q.l", 64, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_Q_L|MASK_RM, MASK_FCVT_Q_L|MASK_RM, match_opcode, 0 }, +{"fcvt.q.l", 64, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_Q_L, MASK_FCVT_Q_L, match_opcode, 0 }, {"fcvt.q.lu", 64, INSN_CLASS_Q, "D,s", MATCH_FCVT_Q_LU|MASK_RM, MASK_FCVT_Q_L|MASK_RM, match_opcode, 0 }, {"fcvt.q.lu", 64, INSN_CLASS_Q, "D,s,m", MATCH_FCVT_Q_LU, MASK_FCVT_Q_LU, match_opcode, 0 }, +{"fcvt.q.lu", 64, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_Q_LU|MASK_RM, MASK_FCVT_Q_L|MASK_RM, match_opcode, 0 }, +{"fcvt.q.lu", 64, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_Q_LU, MASK_FCVT_Q_LU, match_opcode, 0 }, /* Compressed instructions. */ {"c.unimp", 0, INSN_CLASS_C, "", 0, 0xffffU, match_opcode, 0 }, -- 2.25.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] RISC-V: Add instructions and operand set for z[fdq]inx 2021-10-28 16:47 ` [PATCH 2/3] RISC-V: Add instructions and operand set " jiawei @ 2021-11-09 9:51 ` Nelson Chu 0 siblings, 0 replies; 8+ messages in thread From: Nelson Chu @ 2021-11-09 9:51 UTC (permalink / raw) To: jiawei; +Cc: Binutils, tariq.kurd, cmuellner, Kito Cheng This patch should work for zfinx. But we need to add a new operand 'x', and add multiple extra entries of riscv_opcodes. Jim has suggested before, and after discussing with Kito, I think the better solution should be as follows: * Just change the zfinx instructions from INSN_CLASS_F to INSN_CLASS_ZFINX class (or probably INSN_CLASS_F_OR_ZFINX), but keep the original operands. And then update the riscv_multi_subset_supports, @@ -287,6 +287,8 @@ riscv_multi_subset_supports (enum riscv_insn_class insn_class) return riscv_subset_supports ("zbc"); case INSN_CLASS_ZBS: return riscv_subset_supports ("zbs"); + case INSN_CLASS_F_OR_ZFINX: + return (riscv_subset_supports ("f") || riscv_subset_supports ("zfinx")); default: as_fatal ("internal: unreachable"); return false; * In gas/config/tc-riscv.c:riscv_ip, @@ -2530,7 +2532,8 @@ riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr, case 'T': /* Floating point RS2. */ case 'U': /* Floating point RS1 and RS2. */ case 'R': /* Floating point RS3. */ - if (reg_lookup (&asarg, RCLASS_FPR, ®no)) + if (reg_lookup (&asarg, (riscv_subset_supports ("zfinx") + ? RCLASS_GPR : RCLASS_FPR), ®no)) { char c = *oparg; if (*asarg == ' ') Therefore, I can get the expected results as follows, nelson@LAPTOP-QFSGI1F2:~/test$ cat tmp.s foo: fadd.s fa0, fa1, fa2 nelson@LAPTOP-QFSGI1F2:~/test$ ~/binutils-dev/build-elf64-upstream/build-install/bin/riscv64-unknown-elf-as -march=rv32i_zfinx tmp.s -o tmp.o tmp.s: Assembler messages: tmp.s:2: Error: illegal operands `fadd.s fa0,fa1,fa2' nelson@LAPTOP-QFSGI1F2:~/test$ ~/binutils-dev/build-elf64-upstream/build-install/bin/riscv64-unknown-elf-as -march=rv32if tmp.s -o tmp.o nelson@LAPTOP-QFSGI1F2:~/test$ echo $? nelson@LAPTOP-QFSGI1F2:~/test$ cat tmp.s foo: fadd.s a0, a1, a2 nelson@LAPTOP-QFSGI1F2:~/test$ ~/binutils-dev/build-elf64-upstream/build-install/bin/riscv64-unknown-elf-as -march=rv32i_zfinx tmp.s -o tmp.o nelson@LAPTOP-QFSGI1F2:~/test$ echo $? nelson@LAPTOP-QFSGI1F2:~/test$ ~/binutils-dev/build-elf64-upstream/build-install/bin/riscv64-unknown-elf-as -march=rv32if tmp.s -o tmp.o tmp.s: Assembler messages: tmp.s:2: Error: illegal operands `fadd.s a0,a1,a2' nelson@LAPTOP-QFSGI1F2:~/test$ cat tmp.s foo: flw fa0, foo, a1 nelson@LAPTOP-QFSGI1F2:~/test$ ~/binutils-dev/build-elf64-upstream/build-install/bin/riscv64-unknown-elf-as -march=rv32i_zfinx tmp.s -o tmp.o tmp.s: Assembler messages: tmp.s:2: Error: unrecognized opcode `flw fa0,foo,a1' nelson@LAPTOP-QFSGI1F2:~/test$ ~/binutils-dev/build-elf64-upstream/build-install/bin/riscv64-unknown-elf-as -march=rv32if tmp.s -o tmp.o nelson@LAPTOP-QFSGI1F2:~/test$ echo $? Note that the error of flw is "unrecognized opcode", since we are using INSN_CLASS_F for these non-zfinx instructions, and f cannot be used with zfinx at the same time. And fortunately, we only need to hack this check for U, S, T, ... floating operand in the riscv_ip, we don't need to handle them in the macro_build. Thanks Nelson On Fri, Oct 29, 2021 at 12:50 AM jiawei <jiawei@iscas.ac.cn> wrote: > > --- > gas/config/tc-riscv.c | 11 +++- > opcodes/riscv-opc.c | 146 ++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 154 insertions(+), 3 deletions(-) > > diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c > index 2c4df208664..b879bf1ea8b 100644 > --- a/gas/config/tc-riscv.c > +++ b/gas/config/tc-riscv.c > @@ -1158,6 +1158,7 @@ validate_riscv_insn (const struct riscv_opcode *opc, int length) > USE_BITS (OP_MASK_RS1, OP_SH_RS1); > /* Fall through. */ > case 'T': /* RS2, floating point. */ > + case 'x': USE_BITS (OP_MASK_RS1, OP_SH_RS1); /* Fall through. */ > case 't': USE_BITS (OP_MASK_RS2, OP_SH_RS2); break; > case 'R': /* RS3, floating point. */ > case 'r': USE_BITS (OP_MASK_RS3, OP_SH_RS3); break; > @@ -2508,6 +2509,7 @@ riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr, > case 'd': /* Destination register. */ > case 's': /* Source register. */ > case 't': /* Target register. */ > + case 'x': /* rs1 and rs2. */ > case 'r': /* RS3 */ > if (reg_lookup (&s, RCLASS_GPR, ®no)) > { > @@ -2519,12 +2521,15 @@ riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr, > string to figure out where it goes in the instruction. */ > switch (c) > { > + case 'd': > + INSERT_OPERAND (RD, *ip, regno); > + break; > case 's': > INSERT_OPERAND (RS1, *ip, regno); > break; > - case 'd': > - INSERT_OPERAND (RD, *ip, regno); > - break; > + case 'x': > + INSERT_OPERAND (RS1, *ip, regno); > + /* fallthru */ > case 't': > INSERT_OPERAND (RS2, *ip, regno); > break; > diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c > index b756bae64ab..435fb434161 100644 > --- a/opcodes/riscv-opc.c > +++ b/opcodes/riscv-opc.c > @@ -534,52 +534,99 @@ const struct riscv_opcode riscv_opcodes[] = > {"fmv.s.x", 0, INSN_CLASS_F, "D,s", MATCH_FMV_S_X, MASK_FMV_S_X, match_opcode, 0 }, > {"fmv.s", 0, INSN_CLASS_F, "D,U", MATCH_FSGNJ_S, MASK_FSGNJ_S, match_rs1_eq_rs2, INSN_ALIAS }, > {"fneg.s", 0, INSN_CLASS_F, "D,U", MATCH_FSGNJN_S, MASK_FSGNJN_S, match_rs1_eq_rs2, INSN_ALIAS }, > +{"fneg.s", 0, INSN_CLASS_ZFINX, "d,x", MATCH_FSGNJN_S, MASK_FSGNJN_S, match_rs1_eq_rs2, INSN_ALIAS }, > {"fabs.s", 0, INSN_CLASS_F, "D,U", MATCH_FSGNJX_S, MASK_FSGNJX_S, match_rs1_eq_rs2, INSN_ALIAS }, > +{"fabs.s", 0, INSN_CLASS_ZFINX, "d,x", MATCH_FSGNJX_S, MASK_FSGNJX_S, match_rs1_eq_rs2, INSN_ALIAS }, > {"fsgnj.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FSGNJ_S, MASK_FSGNJ_S, match_opcode, 0 }, > +{"fsgnj.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FSGNJ_S, MASK_FSGNJ_S, match_opcode, 0 }, > {"fsgnjn.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FSGNJN_S, MASK_FSGNJN_S, match_opcode, 0 }, > +{"fsgnjn.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FSGNJN_S, MASK_FSGNJN_S, match_opcode, 0 }, > {"fsgnjx.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FSGNJX_S, MASK_FSGNJX_S, match_opcode, 0 }, > +{"fsgnjx.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FSGNJX_S, MASK_FSGNJX_S, match_opcode, 0 }, > {"fadd.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FADD_S|MASK_RM, MASK_FADD_S|MASK_RM, match_opcode, 0 }, > {"fadd.s", 0, INSN_CLASS_F, "D,S,T,m", MATCH_FADD_S, MASK_FADD_S, match_opcode, 0 }, > +{"fadd.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FADD_S|MASK_RM, MASK_FADD_S|MASK_RM, match_opcode, 0 }, > +{"fadd.s", 0, INSN_CLASS_ZFINX, "d,s,t,m", MATCH_FADD_S, MASK_FADD_S, match_opcode, 0 }, > {"fsub.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FSUB_S|MASK_RM, MASK_FSUB_S|MASK_RM, match_opcode, 0 }, > {"fsub.s", 0, INSN_CLASS_F, "D,S,T,m", MATCH_FSUB_S, MASK_FSUB_S, match_opcode, 0 }, > +{"fsub.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FSUB_S|MASK_RM, MASK_FSUB_S|MASK_RM, match_opcode, 0 }, > +{"fsub.s", 0, INSN_CLASS_ZFINX, "d,s,t,m", MATCH_FSUB_S, MASK_FSUB_S, match_opcode, 0 }, > {"fmul.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FMUL_S|MASK_RM, MASK_FMUL_S|MASK_RM, match_opcode, 0 }, > {"fmul.s", 0, INSN_CLASS_F, "D,S,T,m", MATCH_FMUL_S, MASK_FMUL_S, match_opcode, 0 }, > +{"fmul.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FMUL_S|MASK_RM, MASK_FMUL_S|MASK_RM, match_opcode, 0 }, > +{"fmul.s", 0, INSN_CLASS_ZFINX, "d,s,t,m", MATCH_FMUL_S, MASK_FMUL_S, match_opcode, 0 }, > {"fdiv.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FDIV_S|MASK_RM, MASK_FDIV_S|MASK_RM, match_opcode, 0 }, > {"fdiv.s", 0, INSN_CLASS_F, "D,S,T,m", MATCH_FDIV_S, MASK_FDIV_S, match_opcode, 0 }, > +{"fdiv.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FDIV_S|MASK_RM, MASK_FDIV_S|MASK_RM, match_opcode, 0 }, > +{"fdiv.s", 0, INSN_CLASS_ZFINX, "d,s,t,m", MATCH_FDIV_S, MASK_FDIV_S, match_opcode, 0 }, > {"fsqrt.s", 0, INSN_CLASS_F, "D,S", MATCH_FSQRT_S|MASK_RM, MASK_FSQRT_S|MASK_RM, match_opcode, 0 }, > {"fsqrt.s", 0, INSN_CLASS_F, "D,S,m", MATCH_FSQRT_S, MASK_FSQRT_S, match_opcode, 0 }, > +{"fsqrt.s", 0, INSN_CLASS_ZFINX, "d,s", MATCH_FSQRT_S|MASK_RM, MASK_FSQRT_S|MASK_RM, match_opcode, 0 }, > +{"fsqrt.s", 0, INSN_CLASS_ZFINX, "d,s,m", MATCH_FSQRT_S, MASK_FSQRT_S, match_opcode, 0 }, > {"fmin.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FMIN_S, MASK_FMIN_S, match_opcode, 0 }, > +{"fmin.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FMIN_S, MASK_FMIN_S, match_opcode, 0 }, > {"fmax.s", 0, INSN_CLASS_F, "D,S,T", MATCH_FMAX_S, MASK_FMAX_S, match_opcode, 0 }, > +{"fmax.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FMAX_S, MASK_FMAX_S, match_opcode, 0 }, > {"fmadd.s", 0, INSN_CLASS_F, "D,S,T,R", MATCH_FMADD_S|MASK_RM, MASK_FMADD_S|MASK_RM, match_opcode, 0 }, > {"fmadd.s", 0, INSN_CLASS_F, "D,S,T,R,m", MATCH_FMADD_S, MASK_FMADD_S, match_opcode, 0 }, > +{"fmadd.s", 0, INSN_CLASS_ZFINX, "d,s,t,r", MATCH_FMADD_S|MASK_RM, MASK_FMADD_S|MASK_RM, match_opcode, 0 }, > +{"fmadd.s", 0, INSN_CLASS_ZFINX, "d,s,t,r,m", MATCH_FMADD_S, MASK_FMADD_S, match_opcode, 0 }, > {"fnmadd.s", 0, INSN_CLASS_F, "D,S,T,R", MATCH_FNMADD_S|MASK_RM, MASK_FNMADD_S|MASK_RM, match_opcode, 0 }, > {"fnmadd.s", 0, INSN_CLASS_F, "D,S,T,R,m", MATCH_FNMADD_S, MASK_FNMADD_S, match_opcode, 0 }, > +{"fnmadd.s", 0, INSN_CLASS_ZFINX, "d,s,t,r", MATCH_FNMADD_S|MASK_RM, MASK_FNMADD_S|MASK_RM, match_opcode, 0 }, > +{"fnmadd.s", 0, INSN_CLASS_ZFINX, "d,s,t,r,m", MATCH_FNMADD_S, MASK_FNMADD_S, match_opcode, 0 }, > {"fmsub.s", 0, INSN_CLASS_F, "D,S,T,R", MATCH_FMSUB_S|MASK_RM, MASK_FMSUB_S|MASK_RM, match_opcode, 0 }, > {"fmsub.s", 0, INSN_CLASS_F, "D,S,T,R,m", MATCH_FMSUB_S, MASK_FMSUB_S, match_opcode, 0 }, > +{"fmsub.s", 0, INSN_CLASS_ZFINX, "d,s,t,r", MATCH_FMSUB_S|MASK_RM, MASK_FMSUB_S|MASK_RM, match_opcode, 0 }, > +{"fmsub.s", 0, INSN_CLASS_ZFINX, "d,s,t,r,m", MATCH_FMSUB_S, MASK_FMSUB_S, match_opcode, 0 }, > {"fnmsub.s", 0, INSN_CLASS_F, "D,S,T,R", MATCH_FNMSUB_S|MASK_RM, MASK_FNMSUB_S|MASK_RM, match_opcode, 0 }, > {"fnmsub.s", 0, INSN_CLASS_F, "D,S,T,R,m", MATCH_FNMSUB_S, MASK_FNMSUB_S, match_opcode, 0 }, > +{"fnmsub.s", 0, INSN_CLASS_ZFINX, "d,s,t,r", MATCH_FNMSUB_S|MASK_RM, MASK_FNMSUB_S|MASK_RM, match_opcode, 0 }, > +{"fnmsub.s", 0, INSN_CLASS_ZFINX, "d,s,t,r,m", MATCH_FNMSUB_S, MASK_FNMSUB_S, match_opcode, 0 }, > {"fcvt.w.s", 0, INSN_CLASS_F, "d,S", MATCH_FCVT_W_S|MASK_RM, MASK_FCVT_W_S|MASK_RM, match_opcode, 0 }, > {"fcvt.w.s", 0, INSN_CLASS_F, "d,S,m", MATCH_FCVT_W_S, MASK_FCVT_W_S, match_opcode, 0 }, > +{"fcvt.w.s", 0, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_W_S|MASK_RM, MASK_FCVT_W_S|MASK_RM, match_opcode, 0 }, > +{"fcvt.w.s", 0, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_W_S, MASK_FCVT_W_S, match_opcode, 0 }, > {"fcvt.wu.s", 0, INSN_CLASS_F, "d,S", MATCH_FCVT_WU_S|MASK_RM, MASK_FCVT_WU_S|MASK_RM, match_opcode, 0 }, > {"fcvt.wu.s", 0, INSN_CLASS_F, "d,S,m", MATCH_FCVT_WU_S, MASK_FCVT_WU_S, match_opcode, 0 }, > +{"fcvt.wu.s", 0, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_WU_S|MASK_RM, MASK_FCVT_WU_S|MASK_RM, match_opcode, 0 }, > +{"fcvt.wu.s", 0, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_WU_S, MASK_FCVT_WU_S, match_opcode, 0 }, > {"fcvt.s.w", 0, INSN_CLASS_F, "D,s", MATCH_FCVT_S_W|MASK_RM, MASK_FCVT_S_W|MASK_RM, match_opcode, 0 }, > {"fcvt.s.w", 0, INSN_CLASS_F, "D,s,m", MATCH_FCVT_S_W, MASK_FCVT_S_W, match_opcode, 0 }, > +{"fcvt.s.w", 0, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_S_W|MASK_RM, MASK_FCVT_S_W|MASK_RM, match_opcode, 0 }, > +{"fcvt.s.w", 0, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_S_W, MASK_FCVT_S_W, match_opcode, 0 }, > {"fcvt.s.wu", 0, INSN_CLASS_F, "D,s", MATCH_FCVT_S_WU|MASK_RM, MASK_FCVT_S_W|MASK_RM, match_opcode, 0 }, > {"fcvt.s.wu", 0, INSN_CLASS_F, "D,s,m", MATCH_FCVT_S_WU, MASK_FCVT_S_WU, match_opcode, 0 }, > +{"fcvt.s.wu", 0, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_S_WU|MASK_RM, MASK_FCVT_S_W|MASK_RM, match_opcode, 0 }, > +{"fcvt.s.wu", 0, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_S_WU, MASK_FCVT_S_WU, match_opcode, 0 }, > {"fclass.s", 0, INSN_CLASS_F, "d,S", MATCH_FCLASS_S, MASK_FCLASS_S, match_opcode, 0 }, > +{"fclass.s", 0, INSN_CLASS_ZFINX, "d,s", MATCH_FCLASS_S, MASK_FCLASS_S, match_opcode, 0 }, > {"feq.s", 0, INSN_CLASS_F, "d,S,T", MATCH_FEQ_S, MASK_FEQ_S, match_opcode, 0 }, > +{"feq.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FEQ_S, MASK_FEQ_S, match_opcode, 0 }, > {"flt.s", 0, INSN_CLASS_F, "d,S,T", MATCH_FLT_S, MASK_FLT_S, match_opcode, 0 }, > +{"flt.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FLT_S, MASK_FLT_S, match_opcode, 0 }, > {"fle.s", 0, INSN_CLASS_F, "d,S,T", MATCH_FLE_S, MASK_FLE_S, match_opcode, 0 }, > +{"fle.s", 0, INSN_CLASS_ZFINX, "d,s,t", MATCH_FLE_S, MASK_FLE_S, match_opcode, 0 }, > {"fgt.s", 0, INSN_CLASS_F, "d,T,S", MATCH_FLT_S, MASK_FLT_S, match_opcode, 0 }, > +{"fgt.s", 0, INSN_CLASS_ZFINX, "d,t,s", MATCH_FLT_S, MASK_FLT_S, match_opcode, 0 }, > {"fge.s", 0, INSN_CLASS_F, "d,T,S", MATCH_FLE_S, MASK_FLE_S, match_opcode, 0 }, > +{"fge.s", 0, INSN_CLASS_ZFINX, "d,t,s", MATCH_FLE_S, MASK_FLE_S, match_opcode, 0 }, > {"fcvt.l.s", 64, INSN_CLASS_F, "d,S", MATCH_FCVT_L_S|MASK_RM, MASK_FCVT_L_S|MASK_RM, match_opcode, 0 }, > {"fcvt.l.s", 64, INSN_CLASS_F, "d,S,m", MATCH_FCVT_L_S, MASK_FCVT_L_S, match_opcode, 0 }, > +{"fcvt.l.s", 64, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_L_S | MASK_RM, MASK_FCVT_L_S | MASK_RM, match_opcode, 0 }, > +{"fcvt.l.s", 64, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_L_S, MASK_FCVT_L_S, match_opcode, 0 }, > {"fcvt.lu.s", 64, INSN_CLASS_F, "d,S", MATCH_FCVT_LU_S|MASK_RM, MASK_FCVT_LU_S|MASK_RM, match_opcode, 0 }, > {"fcvt.lu.s", 64, INSN_CLASS_F, "d,S,m", MATCH_FCVT_LU_S, MASK_FCVT_LU_S, match_opcode, 0 }, > +{"fcvt.lu.s", 64, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_LU_S | MASK_RM, MASK_FCVT_LU_S | MASK_RM, match_opcode, 0 }, > +{"fcvt.lu.s", 64, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_LU_S, MASK_FCVT_LU_S, match_opcode, 0 }, > {"fcvt.s.l", 64, INSN_CLASS_F, "D,s", MATCH_FCVT_S_L|MASK_RM, MASK_FCVT_S_L|MASK_RM, match_opcode, 0 }, > {"fcvt.s.l", 64, INSN_CLASS_F, "D,s,m", MATCH_FCVT_S_L, MASK_FCVT_S_L, match_opcode, 0 }, > +{"fcvt.s.l", 64, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_S_L | MASK_RM, MASK_FCVT_S_L | MASK_RM, match_opcode, 0 }, > +{"fcvt.s.l", 64, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_S_L, MASK_FCVT_S_L, match_opcode, 0 }, > {"fcvt.s.lu", 64, INSN_CLASS_F, "D,s", MATCH_FCVT_S_LU|MASK_RM, MASK_FCVT_S_L|MASK_RM, match_opcode, 0 }, > {"fcvt.s.lu", 64, INSN_CLASS_F, "D,s,m", MATCH_FCVT_S_LU, MASK_FCVT_S_LU, match_opcode, 0 }, > +{"fcvt.s.lu", 64, INSN_CLASS_ZFINX, "d,s", MATCH_FCVT_S_LU | MASK_RM, MASK_FCVT_S_L | MASK_RM, match_opcode, 0 }, > +{"fcvt.s.lu", 64, INSN_CLASS_ZFINX, "d,s,m", MATCH_FCVT_S_LU, MASK_FCVT_S_LU, match_opcode, 0 }, > > /* Double-precision floating-point instruction subset. */ > {"fld", 0, INSN_CLASS_D_AND_C, "D,Cn(Cc)", MATCH_C_FLDSP, MASK_C_FLDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, > @@ -592,55 +639,103 @@ const struct riscv_opcode riscv_opcodes[] = > {"fsd", 0, INSN_CLASS_D, "T,A,s", 0, (int) M_FSD, match_never, INSN_MACRO }, > {"fmv.d", 0, INSN_CLASS_D, "D,U", MATCH_FSGNJ_D, MASK_FSGNJ_D, match_rs1_eq_rs2, INSN_ALIAS }, > {"fneg.d", 0, INSN_CLASS_D, "D,U", MATCH_FSGNJN_D, MASK_FSGNJN_D, match_rs1_eq_rs2, INSN_ALIAS }, > +{"fneg.d", 0, INSN_CLASS_ZDINX, "d,x", MATCH_FSGNJN_D, MASK_FSGNJN_D, match_rs1_eq_rs2, INSN_ALIAS }, > {"fabs.d", 0, INSN_CLASS_D, "D,U", MATCH_FSGNJX_D, MASK_FSGNJX_D, match_rs1_eq_rs2, INSN_ALIAS }, > +{"fabs.d", 0, INSN_CLASS_ZDINX, "d,x", MATCH_FSGNJX_D, MASK_FSGNJX_D, match_rs1_eq_rs2, INSN_ALIAS }, > {"fsgnj.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FSGNJ_D, MASK_FSGNJ_D, match_opcode, 0 }, > +{"fsgnj.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FSGNJ_D, MASK_FSGNJ_D, match_opcode, 0 }, > {"fsgnjn.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FSGNJN_D, MASK_FSGNJN_D, match_opcode, 0 }, > +{"fsgnjn.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FSGNJN_D, MASK_FSGNJN_D, match_opcode, 0 }, > {"fsgnjx.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FSGNJX_D, MASK_FSGNJX_D, match_opcode, 0 }, > +{"fsgnjx.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FSGNJX_D, MASK_FSGNJX_D, match_opcode, 0 }, > {"fadd.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FADD_D|MASK_RM, MASK_FADD_D|MASK_RM, match_opcode, 0 }, > {"fadd.d", 0, INSN_CLASS_D, "D,S,T,m", MATCH_FADD_D, MASK_FADD_D, match_opcode, 0 }, > +{"fadd.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FADD_D | MASK_RM, MASK_FADD_D | MASK_RM, match_opcode, 0 }, > +{"fadd.d", 0, INSN_CLASS_ZDINX, "d,s,t,m", MATCH_FADD_D, MASK_FADD_D, match_opcode, 0 }, > {"fsub.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FSUB_D|MASK_RM, MASK_FSUB_D|MASK_RM, match_opcode, 0 }, > {"fsub.d", 0, INSN_CLASS_D, "D,S,T,m", MATCH_FSUB_D, MASK_FSUB_D, match_opcode, 0 }, > +{"fsub.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FSUB_D | MASK_RM, MASK_FSUB_D | MASK_RM, match_opcode, 0 }, > +{"fsub.d", 0, INSN_CLASS_ZDINX, "d,s,t,m", MATCH_FSUB_D, MASK_FSUB_D, match_opcode, 0 }, > {"fmul.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FMUL_D|MASK_RM, MASK_FMUL_D|MASK_RM, match_opcode, 0 }, > {"fmul.d", 0, INSN_CLASS_D, "D,S,T,m", MATCH_FMUL_D, MASK_FMUL_D, match_opcode, 0 }, > +{"fmul.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FMUL_D | MASK_RM, MASK_FMUL_D | MASK_RM, match_opcode, 0 }, > +{"fmul.d", 0, INSN_CLASS_ZDINX, "d,s,t,m", MATCH_FMUL_D, MASK_FMUL_D, match_opcode, 0 }, > {"fdiv.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FDIV_D|MASK_RM, MASK_FDIV_D|MASK_RM, match_opcode, 0 }, > {"fdiv.d", 0, INSN_CLASS_D, "D,S,T,m", MATCH_FDIV_D, MASK_FDIV_D, match_opcode, 0 }, > +{"fdiv.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FDIV_D | MASK_RM, MASK_FDIV_D | MASK_RM, match_opcode, 0 }, > +{"fdiv.d", 0, INSN_CLASS_ZDINX, "d,s,t,m", MATCH_FDIV_D, MASK_FDIV_D, match_opcode, 0 }, > {"fsqrt.d", 0, INSN_CLASS_D, "D,S", MATCH_FSQRT_D|MASK_RM, MASK_FSQRT_D|MASK_RM, match_opcode, 0 }, > {"fsqrt.d", 0, INSN_CLASS_D, "D,S,m", MATCH_FSQRT_D, MASK_FSQRT_D, match_opcode, 0 }, > +{"fsqrt.d", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FSQRT_D | MASK_RM, MASK_FSQRT_D | MASK_RM, match_opcode, 0 }, > +{"fsqrt.d", 0, INSN_CLASS_ZDINX, "d,s,m", MATCH_FSQRT_D, MASK_FSQRT_D, match_opcode, 0 }, > {"fmin.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FMIN_D, MASK_FMIN_D, match_opcode, 0 }, > +{"fmin.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FMIN_D, MASK_FMIN_D, match_opcode, 0 }, > {"fmax.d", 0, INSN_CLASS_D, "D,S,T", MATCH_FMAX_D, MASK_FMAX_D, match_opcode, 0 }, > +{"fmax.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FMAX_D, MASK_FMAX_D, match_opcode, 0 }, > {"fmadd.d", 0, INSN_CLASS_D, "D,S,T,R", MATCH_FMADD_D|MASK_RM, MASK_FMADD_D|MASK_RM, match_opcode, 0 }, > {"fmadd.d", 0, INSN_CLASS_D, "D,S,T,R,m", MATCH_FMADD_D, MASK_FMADD_D, match_opcode, 0 }, > +{"fmadd.d", 0, INSN_CLASS_ZDINX, "d,s,t,r", MATCH_FMADD_D | MASK_RM, MASK_FMADD_D | MASK_RM, match_opcode, 0 }, > +{"fmadd.d", 0, INSN_CLASS_ZDINX, "d,s,t,r,m", MATCH_FMADD_D, MASK_FMADD_D, match_opcode, 0 }, > {"fnmadd.d", 0, INSN_CLASS_D, "D,S,T,R", MATCH_FNMADD_D|MASK_RM, MASK_FNMADD_D|MASK_RM, match_opcode, 0 }, > {"fnmadd.d", 0, INSN_CLASS_D, "D,S,T,R,m", MATCH_FNMADD_D, MASK_FNMADD_D, match_opcode, 0 }, > +{"fnmadd.d", 0, INSN_CLASS_ZDINX, "d,s,t,r", MATCH_FNMADD_D | MASK_RM, MASK_FNMADD_D | MASK_RM, match_opcode, 0 }, > +{"fnmadd.d", 0, INSN_CLASS_ZDINX, "d,s,t,r,m", MATCH_FNMADD_D, MASK_FNMADD_D, match_opcode, 0 }, > {"fmsub.d", 0, INSN_CLASS_D, "D,S,T,R", MATCH_FMSUB_D|MASK_RM, MASK_FMSUB_D|MASK_RM, match_opcode, 0 }, > {"fmsub.d", 0, INSN_CLASS_D, "D,S,T,R,m", MATCH_FMSUB_D, MASK_FMSUB_D, match_opcode, 0 }, > +{"fmsub.d", 0, INSN_CLASS_ZDINX, "d,s,t,r", MATCH_FMSUB_D | MASK_RM, MASK_FMSUB_D | MASK_RM, match_opcode, 0 }, > +{"fmsub.d", 0, INSN_CLASS_ZDINX, "d,s,t,r,m", MATCH_FMSUB_D, MASK_FMSUB_D, match_opcode, 0 }, > {"fnmsub.d", 0, INSN_CLASS_D, "D,S,T,R", MATCH_FNMSUB_D|MASK_RM, MASK_FNMSUB_D|MASK_RM, match_opcode, 0 }, > {"fnmsub.d", 0, INSN_CLASS_D, "D,S,T,R,m", MATCH_FNMSUB_D, MASK_FNMSUB_D, match_opcode, 0 }, > +{"fnmsub.d", 0, INSN_CLASS_ZDINX, "d,s,t,r", MATCH_FNMSUB_D | MASK_RM, MASK_FNMSUB_D | MASK_RM, match_opcode, 0 }, > +{"fnmsub.d", 0, INSN_CLASS_ZDINX, "d,s,t,r,m", MATCH_FNMSUB_D, MASK_FNMSUB_D, match_opcode, 0 }, > {"fcvt.w.d", 0, INSN_CLASS_D, "d,S", MATCH_FCVT_W_D|MASK_RM, MASK_FCVT_W_D|MASK_RM, match_opcode, 0 }, > {"fcvt.w.d", 0, INSN_CLASS_D, "d,S,m", MATCH_FCVT_W_D, MASK_FCVT_W_D, match_opcode, 0 }, > +{"fcvt.w.d", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_W_D | MASK_RM, MASK_FCVT_W_D | MASK_RM, match_opcode, 0 }, > +{"fcvt.w.d", 0, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_W_D, MASK_FCVT_W_D, match_opcode, 0 }, > {"fcvt.wu.d", 0, INSN_CLASS_D, "d,S", MATCH_FCVT_WU_D|MASK_RM, MASK_FCVT_WU_D|MASK_RM, match_opcode, 0 }, > {"fcvt.wu.d", 0, INSN_CLASS_D, "d,S,m", MATCH_FCVT_WU_D, MASK_FCVT_WU_D, match_opcode, 0 }, > +{"fcvt.wu.d", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_WU_D | MASK_RM, MASK_FCVT_WU_D | MASK_RM, match_opcode, 0 }, > +{"fcvt.wu.d", 0, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_WU_D, MASK_FCVT_WU_D, match_opcode, 0 }, > {"fcvt.d.w", 0, INSN_CLASS_D, "D,s", MATCH_FCVT_D_W, MASK_FCVT_D_W|MASK_RM, match_opcode, 0 }, > +{"fcvt.d.w", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_D_W, MASK_FCVT_D_W | MASK_RM, match_opcode, 0 }, > {"fcvt.d.wu", 0, INSN_CLASS_D, "D,s", MATCH_FCVT_D_WU, MASK_FCVT_D_WU|MASK_RM, match_opcode, 0 }, > +{"fcvt.d.wu", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_D_WU, MASK_FCVT_D_WU | MASK_RM, match_opcode, 0 }, > {"fcvt.d.s", 0, INSN_CLASS_D, "D,S", MATCH_FCVT_D_S, MASK_FCVT_D_S|MASK_RM, match_opcode, 0 }, > +{"fcvt.d.s", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_D_S, MASK_FCVT_D_S | MASK_RM, match_opcode, 0 }, > {"fcvt.s.d", 0, INSN_CLASS_D, "D,S", MATCH_FCVT_S_D|MASK_RM, MASK_FCVT_S_D|MASK_RM, match_opcode, 0 }, > {"fcvt.s.d", 0, INSN_CLASS_D, "D,S,m", MATCH_FCVT_S_D, MASK_FCVT_S_D, match_opcode, 0 }, > +{"fcvt.s.d", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_S_D | MASK_RM, MASK_FCVT_S_D | MASK_RM, match_opcode, 0 }, > +{"fcvt.s.d", 0, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_S_D, MASK_FCVT_S_D, match_opcode, 0 }, > {"fclass.d", 0, INSN_CLASS_D, "d,S", MATCH_FCLASS_D, MASK_FCLASS_D, match_opcode, 0 }, > +{"fclass.d", 0, INSN_CLASS_ZDINX, "d,s", MATCH_FCLASS_D, MASK_FCLASS_D, match_opcode, 0 }, > {"feq.d", 0, INSN_CLASS_D, "d,S,T", MATCH_FEQ_D, MASK_FEQ_D, match_opcode, 0 }, > +{"feq.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FEQ_D, MASK_FEQ_D, match_opcode, 0 }, > {"flt.d", 0, INSN_CLASS_D, "d,S,T", MATCH_FLT_D, MASK_FLT_D, match_opcode, 0 }, > +{"flt.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FLT_D, MASK_FLT_D, match_opcode, 0 }, > {"fle.d", 0, INSN_CLASS_D, "d,S,T", MATCH_FLE_D, MASK_FLE_D, match_opcode, 0 }, > +{"fle.d", 0, INSN_CLASS_ZDINX, "d,s,t", MATCH_FLE_D, MASK_FLE_D, match_opcode, 0 }, > {"fgt.d", 0, INSN_CLASS_D, "d,T,S", MATCH_FLT_D, MASK_FLT_D, match_opcode, 0 }, > +{"fgt.d", 0, INSN_CLASS_ZDINX, "d,t,s", MATCH_FLT_D, MASK_FLT_D, match_opcode, 0 }, > {"fge.d", 0, INSN_CLASS_D, "d,T,S", MATCH_FLE_D, MASK_FLE_D, match_opcode, 0 }, > +{"fge.d", 0, INSN_CLASS_ZDINX, "d,t,s", MATCH_FLE_D, MASK_FLE_D, match_opcode, 0 }, > {"fmv.x.d", 64, INSN_CLASS_D, "d,S", MATCH_FMV_X_D, MASK_FMV_X_D, match_opcode, 0 }, > {"fmv.d.x", 64, INSN_CLASS_D, "D,s", MATCH_FMV_D_X, MASK_FMV_D_X, match_opcode, 0 }, > {"fcvt.l.d", 64, INSN_CLASS_D, "d,S", MATCH_FCVT_L_D|MASK_RM, MASK_FCVT_L_D|MASK_RM, match_opcode, 0 }, > {"fcvt.l.d", 64, INSN_CLASS_D, "d,S,m", MATCH_FCVT_L_D, MASK_FCVT_L_D, match_opcode, 0 }, > +{"fcvt.l.d", 64, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_L_D | MASK_RM, MASK_FCVT_L_D | MASK_RM, match_opcode, 0 }, > +{"fcvt.l.d", 64, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_L_D, MASK_FCVT_L_D, match_opcode, 0 }, > {"fcvt.lu.d", 64, INSN_CLASS_D, "d,S", MATCH_FCVT_LU_D|MASK_RM, MASK_FCVT_LU_D|MASK_RM, match_opcode, 0 }, > {"fcvt.lu.d", 64, INSN_CLASS_D, "d,S,m", MATCH_FCVT_LU_D, MASK_FCVT_LU_D, match_opcode, 0 }, > +{"fcvt.lu.d", 64, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_LU_D | MASK_RM, MASK_FCVT_LU_D | MASK_RM, match_opcode, 0 }, > +{"fcvt.lu.d", 64, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_LU_D, MASK_FCVT_LU_D, match_opcode, 0 }, > {"fcvt.d.l", 64, INSN_CLASS_D, "D,s", MATCH_FCVT_D_L|MASK_RM, MASK_FCVT_D_L|MASK_RM, match_opcode, 0 }, > {"fcvt.d.l", 64, INSN_CLASS_D, "D,s,m", MATCH_FCVT_D_L, MASK_FCVT_D_L, match_opcode, 0 }, > +{"fcvt.d.l", 64, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_D_L | MASK_RM, MASK_FCVT_D_L | MASK_RM, match_opcode, 0 }, > +{"fcvt.d.l", 64, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_D_L, MASK_FCVT_D_L, match_opcode, 0 }, > {"fcvt.d.lu", 64, INSN_CLASS_D, "D,s", MATCH_FCVT_D_LU|MASK_RM, MASK_FCVT_D_L|MASK_RM, match_opcode, 0 }, > {"fcvt.d.lu", 64, INSN_CLASS_D, "D,s,m", MATCH_FCVT_D_LU, MASK_FCVT_D_LU, match_opcode, 0 }, > +{"fcvt.d.lu", 64, INSN_CLASS_ZDINX, "d,s", MATCH_FCVT_D_LU | MASK_RM, MASK_FCVT_D_L | MASK_RM, match_opcode, 0 }, > +{"fcvt.d.lu", 64, INSN_CLASS_ZDINX, "d,s,m", MATCH_FCVT_D_LU, MASK_FCVT_D_LU, match_opcode, 0 }, > > /* Quad-precision floating-point instruction subset. */ > {"flq", 0, INSN_CLASS_Q, "D,o(s)", MATCH_FLQ, MASK_FLQ, match_opcode, INSN_DREF|INSN_16_BYTE }, > @@ -649,58 +744,109 @@ const struct riscv_opcode riscv_opcodes[] = > {"fsq", 0, INSN_CLASS_Q, "T,A,s", 0, (int) M_FSQ, match_never, INSN_MACRO }, > {"fmv.q", 0, INSN_CLASS_Q, "D,U", MATCH_FSGNJ_Q, MASK_FSGNJ_Q, match_rs1_eq_rs2, INSN_ALIAS }, > {"fneg.q", 0, INSN_CLASS_Q, "D,U", MATCH_FSGNJN_Q, MASK_FSGNJN_Q, match_rs1_eq_rs2, INSN_ALIAS }, > +{"fneg.q", 0, INSN_CLASS_ZQINX, "d,x", MATCH_FSGNJN_Q, MASK_FSGNJN_Q, match_rs1_eq_rs2, INSN_ALIAS }, > {"fabs.q", 0, INSN_CLASS_Q, "D,U", MATCH_FSGNJX_Q, MASK_FSGNJX_Q, match_rs1_eq_rs2, INSN_ALIAS }, > +{"fabs.q", 0, INSN_CLASS_ZQINX, "d,x", MATCH_FSGNJX_Q, MASK_FSGNJX_Q, match_rs1_eq_rs2, INSN_ALIAS }, > {"fsgnj.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FSGNJ_Q, MASK_FSGNJ_Q, match_opcode, 0 }, > +{"fsgnj.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FSGNJ_Q, MASK_FSGNJ_Q, match_opcode, 0 }, > {"fsgnjn.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FSGNJN_Q, MASK_FSGNJN_Q, match_opcode, 0 }, > +{"fsgnjn.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FSGNJN_Q, MASK_FSGNJN_Q, match_opcode, 0 }, > {"fsgnjx.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FSGNJX_Q, MASK_FSGNJX_Q, match_opcode, 0 }, > +{"fsgnjx.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FSGNJX_Q, MASK_FSGNJX_Q, match_opcode, 0 }, > {"fadd.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FADD_Q|MASK_RM, MASK_FADD_Q|MASK_RM, match_opcode, 0 }, > {"fadd.q", 0, INSN_CLASS_Q, "D,S,T,m", MATCH_FADD_Q, MASK_FADD_Q, match_opcode, 0 }, > +{"fadd.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FADD_Q|MASK_RM, MASK_FADD_Q|MASK_RM, match_opcode, 0 }, > +{"fadd.q", 0, INSN_CLASS_ZQINX, "d,s,t,m", MATCH_FADD_Q, MASK_FADD_Q, match_opcode, 0 }, > {"fsub.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FSUB_Q|MASK_RM, MASK_FSUB_Q|MASK_RM, match_opcode, 0 }, > {"fsub.q", 0, INSN_CLASS_Q, "D,S,T,m", MATCH_FSUB_Q, MASK_FSUB_Q, match_opcode, 0 }, > +{"fsub.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FSUB_Q|MASK_RM, MASK_FSUB_Q|MASK_RM, match_opcode, 0 }, > +{"fsub.q", 0, INSN_CLASS_ZQINX, "d,s,t,m", MATCH_FSUB_Q, MASK_FSUB_Q, match_opcode, 0 }, > {"fmul.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FMUL_Q|MASK_RM, MASK_FMUL_Q|MASK_RM, match_opcode, 0 }, > {"fmul.q", 0, INSN_CLASS_Q, "D,S,T,m", MATCH_FMUL_Q, MASK_FMUL_Q, match_opcode, 0 }, > +{"fmul.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FMUL_Q|MASK_RM, MASK_FMUL_Q|MASK_RM, match_opcode, 0 }, > +{"fmul.q", 0, INSN_CLASS_ZQINX, "d,s,t,m", MATCH_FMUL_Q, MASK_FMUL_Q, match_opcode, 0 }, > {"fdiv.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FDIV_Q|MASK_RM, MASK_FDIV_Q|MASK_RM, match_opcode, 0 }, > {"fdiv.q", 0, INSN_CLASS_Q, "D,S,T,m", MATCH_FDIV_Q, MASK_FDIV_Q, match_opcode, 0 }, > +{"fdiv.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FDIV_Q|MASK_RM, MASK_FDIV_Q|MASK_RM, match_opcode, 0 }, > +{"fdiv.q", 0, INSN_CLASS_ZQINX, "d,s,t,m", MATCH_FDIV_Q, MASK_FDIV_Q, match_opcode, 0 }, > {"fsqrt.q", 0, INSN_CLASS_Q, "D,S", MATCH_FSQRT_Q|MASK_RM, MASK_FSQRT_Q|MASK_RM, match_opcode, 0 }, > {"fsqrt.q", 0, INSN_CLASS_Q, "D,S,m", MATCH_FSQRT_Q, MASK_FSQRT_Q, match_opcode, 0 }, > +{"fsqrt.q", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FSQRT_Q|MASK_RM, MASK_FSQRT_Q|MASK_RM, match_opcode, 0 }, > +{"fsqrt.q", 0, INSN_CLASS_ZQINX, "d,s,m", MATCH_FSQRT_Q, MASK_FSQRT_Q, match_opcode, 0 }, > {"fmin.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FMIN_Q, MASK_FMIN_Q, match_opcode, 0 }, > +{"fmin.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FMIN_Q, MASK_FMIN_Q, match_opcode, 0 }, > {"fmax.q", 0, INSN_CLASS_Q, "D,S,T", MATCH_FMAX_Q, MASK_FMAX_Q, match_opcode, 0 }, > +{"fmax.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FMAX_Q, MASK_FMAX_Q, match_opcode, 0 }, > {"fmadd.q", 0, INSN_CLASS_Q, "D,S,T,R", MATCH_FMADD_Q|MASK_RM, MASK_FMADD_Q|MASK_RM, match_opcode, 0 }, > {"fmadd.q", 0, INSN_CLASS_Q, "D,S,T,R,m", MATCH_FMADD_Q, MASK_FMADD_Q, match_opcode, 0 }, > +{"fmadd.q", 0, INSN_CLASS_ZQINX, "d,s,t,r", MATCH_FMADD_Q|MASK_RM, MASK_FMADD_Q|MASK_RM, match_opcode, 0 }, > +{"fmadd.q", 0, INSN_CLASS_ZQINX, "d,s,t,r,m", MATCH_FMADD_Q, MASK_FMADD_Q, match_opcode, 0 }, > {"fnmadd.q", 0, INSN_CLASS_Q, "D,S,T,R", MATCH_FNMADD_Q|MASK_RM, MASK_FNMADD_Q|MASK_RM, match_opcode, 0 }, > {"fnmadd.q", 0, INSN_CLASS_Q, "D,S,T,R,m", MATCH_FNMADD_Q, MASK_FNMADD_Q, match_opcode, 0 }, > +{"fnmadd.q", 0, INSN_CLASS_ZQINX, "d,s,t,r", MATCH_FNMADD_Q|MASK_RM, MASK_FNMADD_Q|MASK_RM, match_opcode, 0 }, > +{"fnmadd.q", 0, INSN_CLASS_ZQINX, "d,s,t,r,m", MATCH_FNMADD_Q, MASK_FNMADD_Q, match_opcode, 0 }, > {"fmsub.q", 0, INSN_CLASS_Q, "D,S,T,R", MATCH_FMSUB_Q|MASK_RM, MASK_FMSUB_Q|MASK_RM, match_opcode, 0 }, > {"fmsub.q", 0, INSN_CLASS_Q, "D,S,T,R,m", MATCH_FMSUB_Q, MASK_FMSUB_Q, match_opcode, 0 }, > +{"fmsub.q", 0, INSN_CLASS_ZQINX, "d,s,t,r", MATCH_FMSUB_Q|MASK_RM, MASK_FMSUB_Q|MASK_RM, match_opcode, 0 }, > +{"fmsub.q", 0, INSN_CLASS_ZQINX, "d,s,t,r,m", MATCH_FMSUB_Q, MASK_FMSUB_Q, match_opcode, 0 }, > {"fnmsub.q", 0, INSN_CLASS_Q, "D,S,T,R", MATCH_FNMSUB_Q|MASK_RM, MASK_FNMSUB_Q|MASK_RM, match_opcode, 0 }, > {"fnmsub.q", 0, INSN_CLASS_Q, "D,S,T,R,m", MATCH_FNMSUB_Q, MASK_FNMSUB_Q, match_opcode, 0 }, > +{"fnmsub.q", 0, INSN_CLASS_ZQINX, "d,s,t,r", MATCH_FNMSUB_Q|MASK_RM, MASK_FNMSUB_Q|MASK_RM, match_opcode, 0 }, > +{"fnmsub.q", 0, INSN_CLASS_ZQINX, "d,s,t,r,m", MATCH_FNMSUB_Q, MASK_FNMSUB_Q, match_opcode, 0 }, > {"fcvt.w.q", 0, INSN_CLASS_Q, "d,S", MATCH_FCVT_W_Q|MASK_RM, MASK_FCVT_W_Q|MASK_RM, match_opcode, 0 }, > {"fcvt.w.q", 0, INSN_CLASS_Q, "d,S,m", MATCH_FCVT_W_Q, MASK_FCVT_W_Q, match_opcode, 0 }, > +{"fcvt.w.q", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_W_Q|MASK_RM, MASK_FCVT_W_Q|MASK_RM, match_opcode, 0 }, > +{"fcvt.w.q", 0, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_W_Q, MASK_FCVT_W_Q, match_opcode, 0 }, > {"fcvt.wu.q", 0, INSN_CLASS_Q, "d,S", MATCH_FCVT_WU_Q|MASK_RM, MASK_FCVT_WU_Q|MASK_RM, match_opcode, 0 }, > {"fcvt.wu.q", 0, INSN_CLASS_Q, "d,S,m", MATCH_FCVT_WU_Q, MASK_FCVT_WU_Q, match_opcode, 0 }, > +{"fcvt.wu.q", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_WU_Q|MASK_RM, MASK_FCVT_WU_Q|MASK_RM, match_opcode, 0 }, > +{"fcvt.wu.q", 0, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_WU_Q, MASK_FCVT_WU_Q, match_opcode, 0 }, > {"fcvt.q.w", 0, INSN_CLASS_Q, "D,s", MATCH_FCVT_Q_W, MASK_FCVT_Q_W|MASK_RM, match_opcode, 0 }, > +{"fcvt.q.w", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_Q_W, MASK_FCVT_Q_W|MASK_RM, match_opcode, 0 }, > {"fcvt.q.wu", 0, INSN_CLASS_Q, "D,s", MATCH_FCVT_Q_WU, MASK_FCVT_Q_WU|MASK_RM, match_opcode, 0 }, > +{"fcvt.q.wu", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_Q_WU, MASK_FCVT_Q_WU|MASK_RM, match_opcode, 0 }, > {"fcvt.q.s", 0, INSN_CLASS_Q, "D,S", MATCH_FCVT_Q_S, MASK_FCVT_Q_S|MASK_RM, match_opcode, 0 }, > +{"fcvt.q.s", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_Q_S, MASK_FCVT_Q_S|MASK_RM, match_opcode, 0 }, > {"fcvt.q.d", 0, INSN_CLASS_Q, "D,S", MATCH_FCVT_Q_D, MASK_FCVT_Q_D|MASK_RM, match_opcode, 0 }, > +{"fcvt.q.d", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_Q_D, MASK_FCVT_Q_D|MASK_RM, match_opcode, 0 }, > {"fcvt.s.q", 0, INSN_CLASS_Q, "D,S", MATCH_FCVT_S_Q|MASK_RM, MASK_FCVT_S_Q|MASK_RM, match_opcode, 0 }, > {"fcvt.s.q", 0, INSN_CLASS_Q, "D,S,m", MATCH_FCVT_S_Q, MASK_FCVT_S_Q, match_opcode, 0 }, > +{"fcvt.s.q", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_S_Q|MASK_RM, MASK_FCVT_S_Q|MASK_RM, match_opcode, 0 }, > +{"fcvt.s.q", 0, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_S_Q, MASK_FCVT_S_Q, match_opcode, 0 }, > {"fcvt.d.q", 0, INSN_CLASS_Q, "D,S", MATCH_FCVT_D_Q|MASK_RM, MASK_FCVT_D_Q|MASK_RM, match_opcode, 0 }, > {"fcvt.d.q", 0, INSN_CLASS_Q, "D,S,m", MATCH_FCVT_D_Q, MASK_FCVT_D_Q, match_opcode, 0 }, > +{"fcvt.d.q", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_D_Q|MASK_RM, MASK_FCVT_D_Q|MASK_RM, match_opcode, 0 }, > +{"fcvt.d.q", 0, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_D_Q, MASK_FCVT_D_Q, match_opcode, 0 }, > {"fclass.q", 0, INSN_CLASS_Q, "d,S", MATCH_FCLASS_Q, MASK_FCLASS_Q, match_opcode, 0 }, > +{"fclass.q", 0, INSN_CLASS_ZQINX, "d,s", MATCH_FCLASS_Q, MASK_FCLASS_Q, match_opcode, 0 }, > {"feq.q", 0, INSN_CLASS_Q, "d,S,T", MATCH_FEQ_Q, MASK_FEQ_Q, match_opcode, 0 }, > +{"feq.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FEQ_Q, MASK_FEQ_Q, match_opcode, 0 }, > {"flt.q", 0, INSN_CLASS_Q, "d,S,T", MATCH_FLT_Q, MASK_FLT_Q, match_opcode, 0 }, > +{"flt.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FLT_Q, MASK_FLT_Q, match_opcode, 0 }, > {"fle.q", 0, INSN_CLASS_Q, "d,S,T", MATCH_FLE_Q, MASK_FLE_Q, match_opcode, 0 }, > +{"fle.q", 0, INSN_CLASS_ZQINX, "d,s,t", MATCH_FLE_Q, MASK_FLE_Q, match_opcode, 0 }, > {"fgt.q", 0, INSN_CLASS_Q, "d,T,S", MATCH_FLT_Q, MASK_FLT_Q, match_opcode, 0 }, > +{"fgt.q", 0, INSN_CLASS_ZQINX, "d,t,s", MATCH_FLT_Q, MASK_FLT_Q, match_opcode, 0 }, > {"fge.q", 0, INSN_CLASS_Q, "d,T,S", MATCH_FLE_Q, MASK_FLE_Q, match_opcode, 0 }, > +{"fge.q", 0, INSN_CLASS_ZQINX, "d,t,s", MATCH_FLE_Q, MASK_FLE_Q, match_opcode, 0 }, > {"fmv.x.q", 64, INSN_CLASS_Q, "d,S", MATCH_FMV_X_Q, MASK_FMV_X_Q, match_opcode, 0 }, > {"fmv.q.x", 64, INSN_CLASS_Q, "D,s", MATCH_FMV_Q_X, MASK_FMV_Q_X, match_opcode, 0 }, > {"fcvt.l.q", 64, INSN_CLASS_Q, "d,S", MATCH_FCVT_L_Q|MASK_RM, MASK_FCVT_L_Q|MASK_RM, match_opcode, 0 }, > {"fcvt.l.q", 64, INSN_CLASS_Q, "d,S,m", MATCH_FCVT_L_Q, MASK_FCVT_L_Q, match_opcode, 0 }, > +{"fcvt.l.q", 64, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_L_Q|MASK_RM, MASK_FCVT_L_Q|MASK_RM, match_opcode, 0 }, > +{"fcvt.l.q", 64, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_L_Q, MASK_FCVT_L_Q, match_opcode, 0 }, > {"fcvt.lu.q", 64, INSN_CLASS_Q, "d,S", MATCH_FCVT_LU_Q|MASK_RM, MASK_FCVT_LU_Q|MASK_RM, match_opcode, 0 }, > {"fcvt.lu.q", 64, INSN_CLASS_Q, "d,S,m", MATCH_FCVT_LU_Q, MASK_FCVT_LU_Q, match_opcode, 0 }, > +{"fcvt.lu.q", 64, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_LU_Q|MASK_RM, MASK_FCVT_LU_Q|MASK_RM, match_opcode, 0 }, > +{"fcvt.lu.q", 64, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_LU_Q, MASK_FCVT_LU_Q, match_opcode, 0 }, > {"fcvt.q.l", 64, INSN_CLASS_Q, "D,s", MATCH_FCVT_Q_L|MASK_RM, MASK_FCVT_Q_L|MASK_RM, match_opcode, 0 }, > {"fcvt.q.l", 64, INSN_CLASS_Q, "D,s,m", MATCH_FCVT_Q_L, MASK_FCVT_Q_L, match_opcode, 0 }, > +{"fcvt.q.l", 64, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_Q_L|MASK_RM, MASK_FCVT_Q_L|MASK_RM, match_opcode, 0 }, > +{"fcvt.q.l", 64, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_Q_L, MASK_FCVT_Q_L, match_opcode, 0 }, > {"fcvt.q.lu", 64, INSN_CLASS_Q, "D,s", MATCH_FCVT_Q_LU|MASK_RM, MASK_FCVT_Q_L|MASK_RM, match_opcode, 0 }, > {"fcvt.q.lu", 64, INSN_CLASS_Q, "D,s,m", MATCH_FCVT_Q_LU, MASK_FCVT_Q_LU, match_opcode, 0 }, > +{"fcvt.q.lu", 64, INSN_CLASS_ZQINX, "d,s", MATCH_FCVT_Q_LU|MASK_RM, MASK_FCVT_Q_L|MASK_RM, match_opcode, 0 }, > +{"fcvt.q.lu", 64, INSN_CLASS_ZQINX, "d,s,m", MATCH_FCVT_Q_LU, MASK_FCVT_Q_LU, match_opcode, 0 }, > > /* Compressed instructions. */ > {"c.unimp", 0, INSN_CLASS_C, "", 0, 0xffffU, match_opcode, 0 }, > -- > 2.25.1 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/3] RISC-V: Add testcases and disassemble support for z[fdq]inx 2021-10-28 16:47 [PATCH 0/3] RISC-V: Zfinx extension support jiawei 2021-10-28 16:47 ` [PATCH 1/3] RISC-V: Add mininal support for z[fdq]inx jiawei 2021-10-28 16:47 ` [PATCH 2/3] RISC-V: Add instructions and operand set " jiawei @ 2021-10-28 16:47 ` jiawei 2021-11-09 10:03 ` Nelson Chu 2021-11-09 10:06 ` [PATCH 0/3] RISC-V: Zfinx extension support Nelson Chu 3 siblings, 1 reply; 8+ messages in thread From: jiawei @ 2021-10-28 16:47 UTC (permalink / raw) To: binutils Cc: tariq.kurd, kito.cheng, jimw, jeremy.bennett, cmuellner, palmer, andrew, lazyparser, jiawei --- binutils/readelf.c | 3 +++ gas/config/tc-riscv.c | 15 ++++++++++++ gas/testsuite/gas/riscv/zdinx.d | 41 +++++++++++++++++++++++++++++++ gas/testsuite/gas/riscv/zdinx.s | 33 +++++++++++++++++++++++++ gas/testsuite/gas/riscv/zfinx.d | 39 ++++++++++++++++++++++++++++++ gas/testsuite/gas/riscv/zfinx.s | 31 ++++++++++++++++++++++++ gas/testsuite/gas/riscv/zqinx.d | 43 +++++++++++++++++++++++++++++++++ gas/testsuite/gas/riscv/zqinx.s | 35 +++++++++++++++++++++++++++ include/elf/riscv.h | 3 +++ opcodes/riscv-dis.c | 4 +++ 10 files changed, 247 insertions(+) create mode 100644 gas/testsuite/gas/riscv/zdinx.d create mode 100644 gas/testsuite/gas/riscv/zdinx.s create mode 100644 gas/testsuite/gas/riscv/zfinx.d create mode 100644 gas/testsuite/gas/riscv/zfinx.s create mode 100644 gas/testsuite/gas/riscv/zqinx.d create mode 100644 gas/testsuite/gas/riscv/zqinx.s diff --git a/binutils/readelf.c b/binutils/readelf.c index 682eacdef14..fc889c6c3ff 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -3717,6 +3717,9 @@ get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine) if (e_flags & EF_RISCV_RVE) strcat (buf, ", RVE"); + if (e_flags & EF_RISCV_ZFINX) + strcat (buf, ", ZFINX"); + switch (e_flags & EF_RISCV_FLOAT_ABI) { case EF_RISCV_FLOAT_ABI_SOFT: diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index b879bf1ea8b..ff279263ffb 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -204,6 +204,7 @@ struct riscv_set_options int pic; /* Generate position-independent code. */ int rvc; /* Generate RVC code. */ int rve; /* Generate RVE code. */ + int zfinx; /* Generate ZFINX code. */ int relax; /* Emit relocs the linker is allowed to relax. */ int arch_attr; /* Emit architecture and privileged elf attributes. */ int csr_check; /* Enable the CSR checking. */ @@ -214,6 +215,7 @@ static struct riscv_set_options riscv_opts = 0, /* pic */ 0, /* rvc */ 0, /* rve */ + 0, /* ZFINX */ 1, /* relax */ DEFAULT_RISCV_ATTR, /* arch_attr */ 0, /* csr_check */ @@ -234,6 +236,15 @@ riscv_set_rve (bool rve_value) riscv_opts.rve = rve_value; } +static void +riscv_set_zfinx (bool finx_value) +{ + if (finx_value) + elf_flags |= EF_RISCV_ZFINX; + + riscv_opts.finx = finx_value; +} + static riscv_subset_list_t riscv_subsets; static bool @@ -328,6 +339,10 @@ riscv_set_arch (const char *s) riscv_set_rve (false); if (riscv_subset_supports ("e")) riscv_set_rve (true); + if (riscv_subset_supports ("zfinx") + || riscv_subset_supports ("zdinx") + || riscv_subset_supports ("zqinx")) + riscv_set_finx (true); } /* Indicate -mabi option is explictly set. */ diff --git a/gas/testsuite/gas/riscv/zdinx.d b/gas/testsuite/gas/riscv/zdinx.d new file mode 100644 index 00000000000..3e4c1a73388 --- /dev/null +++ b/gas/testsuite/gas/riscv/zdinx.d @@ -0,0 +1,41 @@ +#as: -march=rv64ima_zdinx +#source: zdinx.s +#objdump: -dr + +.*:[ ]+file format .* + +Disassembly of section .text: + +0+000 <target>: +[ ]+[0-9a-f]+:[ ]+02c5f553[ ]+fadd.d[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+0ac5f553[ ]+fsub.d[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+12c5f553[ ]+fmul.d[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+1ac5f553[ ]+fdiv.d[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+5a057553[ ]+fsqrt.d[ ]+a0,a0 +[ ]+[0-9a-f]+:[ ]+2ac58553[ ]+fmin.d[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+2ac59553[ ]+fmax.d[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+6ac5f543[ ]+fmadd.d[ ]+a0,a1,a2,a3 +[ ]+[0-9a-f]+:[ ]+6ac5f54f[ ]+fnmadd.d[ ]+a0,a1,a2,a3 +[ ]+[0-9a-f]+:[ ]+6ac5f547[ ]+fmsub.d[ ]+a0,a1,a2,a3 +[ ]+[0-9a-f]+:[ ]+6ac5f54b[ ]+fnmsub.d[ ]+a0,a1,a2,a3 +[ ]+[0-9a-f]+:[ ]+c205f553[ ]+fcvt.w.d[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+c215f553[ ]+fcvt.wu.d[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+c225f553[ ]+fcvt.l.d[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+c235f553[ ]+fcvt.lu.d[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+4015f553[ ]+fcvt.s.d[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+42058553[ ]+fcvt.d.s[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+d2058553[ ]+fcvt.d.w[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+d2158553[ ]+fcvt.d.wu[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+d225f553[ ]+fcvt.d.l[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+d235f553[ ]+fcvt.d.lu[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+22c58553[ ]+fsgnj.d[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+22c59553[ ]+fsgnjn.d[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+22c5a553[ ]+fsgnjx.d[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+a2c5a553[ ]+feq.d[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+a2c59553[ ]+flt.d[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+a2c58553[ ]+fle.d[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+a2b61553[ ]+flt.d[ ]+a0,a2,a1 +[ ]+[0-9a-f]+:[ ]+a2b60553[ ]+fle.d[ ]+a0,a2,a1 +[ ]+[0-9a-f]+:[ ]+22a51553[ ]+fneg.d[ ]+a0,a0 +[ ]+[0-9a-f]+:[ ]+22a52553[ ]+fabs.d[ ]+a0,a0 +[ ]+[0-9a-f]+:[ ]+e2059553[ ]+fclass.d[ ]+a0,a1 diff --git a/gas/testsuite/gas/riscv/zdinx.s b/gas/testsuite/gas/riscv/zdinx.s new file mode 100644 index 00000000000..c427d982aaf --- /dev/null +++ b/gas/testsuite/gas/riscv/zdinx.s @@ -0,0 +1,33 @@ +target: + fadd.d a0, a1, a2 + fsub.d a0, a1, a2 + fmul.d a0, a1, a2 + fdiv.d a0, a1, a2 + fsqrt.d a0, a0 + fmin.d a0, a1, a2 + fmax.d a0, a1, a2 + fmadd.d a0, a1, a2, a3 + fnmadd.d a0, a1, a2, a3 + fmsub.d a0, a1, a2, a3 + fnmsub.d a0, a1, a2, a3 + fcvt.w.d a0, a1 + fcvt.wu.d a0, a1 + fcvt.l.d a0, a1 + fcvt.lu.d a0, a1 + fcvt.s.d a0, a1 + fcvt.d.s a0, a1 + fcvt.d.w a0, a1 + fcvt.d.wu a0, a1 + fcvt.d.l a0, a1 + fcvt.d.lu a0, a1 + fsgnj.d a0, a1, a2 + fsgnjn.d a0, a1, a2 + fsgnjx.d a0, a1, a2 + feq.d a0, a1, a2 + flt.d a0, a1, a2 + fle.d a0, a1, a2 + fgt.d a0, a1, a2 + fge.d a0, a1, a2 + fneg.d a0, a0 + fabs.d a0, a0 + fclass.d a0, a1 diff --git a/gas/testsuite/gas/riscv/zfinx.d b/gas/testsuite/gas/riscv/zfinx.d new file mode 100644 index 00000000000..d5499aa9131 --- /dev/null +++ b/gas/testsuite/gas/riscv/zfinx.d @@ -0,0 +1,39 @@ +#as: -march=rv64ima_zfinx +#source: zfinx.s +#objdump: -dr + +.*:[ ]+file format .* + +Disassembly of section .text: + +0+000 <target>: +[ ]+[0-9a-f]+:[ ]+00c5f553[ ]+fadd.s[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+08c5f553[ ]+fsub.s[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+10c5f553[ ]+fmul.s[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+18c5f553[ ]+fdiv.s[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+58057553[ ]+fsqrt.s[ ]+a0,a0 +[ ]+[0-9a-f]+:[ ]+28c58553[ ]+fmin.s[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+28c59553[ ]+fmax.s[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+68c5f543[ ]+fmadd.s[ ]+a0,a1,a2,a3 +[ ]+[0-9a-f]+:[ ]+68c5f54f[ ]+fnmadd.s[ ]+a0,a1,a2,a3 +[ ]+[0-9a-f]+:[ ]+68c5f547[ ]+fmsub.s[ ]+a0,a1,a2,a3 +[ ]+[0-9a-f]+:[ ]+68c5f54b[ ]+fnmsub.s[ ]+a0,a1,a2,a3 +[ ]+[0-9a-f]+:[ ]+c005f553[ ]+fcvt.w.s[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+c015f553[ ]+fcvt.wu.s[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+c025f553[ ]+fcvt.l.s[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+c035f553[ ]+fcvt.lu.s[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+d005f553[ ]+fcvt.s.w[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+d015f553[ ]+fcvt.s.wu[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+d025f553[ ]+fcvt.s.l[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+d035f553[ ]+fcvt.s.lu[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+20c58553[ ]+fsgnj.s[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+20c59553[ ]+fsgnjn.s[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+20c5a553[ ]+fsgnjx.s[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+a0c5a553[ ]+feq.s[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+a0c59553[ ]+flt.s[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+a0c58553[ ]+fle.s[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+a0b61553[ ]+flt.s[ ]+a0,a2,a1 +[ ]+[0-9a-f]+:[ ]+a0b60553[ ]+fle.s[ ]+a0,a2,a1 +[ ]+[0-9a-f]+:[ ]+20a51553[ ]+fneg.s[ ]+a0,a0 +[ ]+[0-9a-f]+:[ ]+20a52553[ ]+fabs.s[ ]+a0,a0 +[ ]+[0-9a-f]+:[ ]+e0059553[ ]+fclass.s[ ]+a0,a1 diff --git a/gas/testsuite/gas/riscv/zfinx.s b/gas/testsuite/gas/riscv/zfinx.s new file mode 100644 index 00000000000..af50490fadf --- /dev/null +++ b/gas/testsuite/gas/riscv/zfinx.s @@ -0,0 +1,31 @@ +target: + fadd.s a0, a1, a2 + fsub.s a0, a1, a2 + fmul.s a0, a1, a2 + fdiv.s a0, a1, a2 + fsqrt.s a0, a0 + fmin.s a0, a1, a2 + fmax.s a0, a1, a2 + fmadd.s a0, a1, a2, a3 + fnmadd.s a0, a1, a2, a3 + fmsub.s a0, a1, a2, a3 + fnmsub.s a0, a1, a2, a3 + fcvt.w.s a0, a1 + fcvt.wu.s a0, a1 + fcvt.l.s a0, a1 + fcvt.lu.s a0, a1 + fcvt.s.w a0, a1 + fcvt.s.wu a0, a1 + fcvt.s.l a0, a1 + fcvt.s.lu a0, a1 + fsgnj.s a0, a1, a2 + fsgnjn.s a0, a1, a2 + fsgnjx.s a0, a1, a2 + feq.s a0, a1, a2 + flt.s a0, a1, a2 + fle.s a0, a1, a2 + fgt.s a0, a1, a2 + fge.s a0, a1, a2 + fneg.s a0, a0 + fabs.s a0, a0 + fclass.s a0, a1 diff --git a/gas/testsuite/gas/riscv/zqinx.d b/gas/testsuite/gas/riscv/zqinx.d new file mode 100644 index 00000000000..a1c9eab4e1d --- /dev/null +++ b/gas/testsuite/gas/riscv/zqinx.d @@ -0,0 +1,43 @@ +#as: -march=rv64ima_zqinx +#source: zqinx.s +#objdump: -dr + +.*:[ ]+file format .* + +Disassembly of section .text: + +0+000 <target>: +[ ]+[0-9a-f]+:[ ]+02c5f553[ ]+fadd.q[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+0ac5f553[ ]+fsub.q[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+12c5f553[ ]+fmul.q[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+1ac5f553[ ]+fdiv.q[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+5a057553[ ]+fsqrt.q[ ]+a0,a0 +[ ]+[0-9a-f]+:[ ]+2ac58553[ ]+fmin.q[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+2ac59553[ ]+fmax.q[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+6ac5f543[ ]+fmadd.q[ ]+a0,a1,a2,a3 +[ ]+[0-9a-f]+:[ ]+6ac5f54f[ ]+fnmadd.q[ ]+a0,a1,a2,a3 +[ ]+[0-9a-f]+:[ ]+6ac5f547[ ]+fmsub.q[ ]+a0,a1,a2,a3 +[ ]+[0-9a-f]+:[ ]+6ac5f54b[ ]+fnmsub.q[ ]+a0,a1,a2,a3 +[ ]+[0-9a-f]+:[ ]+c205f553[ ]+fcvt.w.q[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+c215f553[ ]+fcvt.wu.q[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+c225f553[ ]+fcvt.l.q[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+c235f553[ ]+fcvt.lu.q[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+4015f553[ ]+fcvt.s.q[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+4015f553[ ]+fcvt.d.q[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+46058553[ ]+fcvt.q.s[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+42058553[ ]+fcvt.q.d[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+d2058553[ ]+fcvt.q.w[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+d2158553[ ]+fcvt.q.wu[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+d225f553[ ]+fcvt.q.l[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+d235f553[ ]+fcvt.q.lu[ ]+a0,a1 +[ ]+[0-9a-f]+:[ ]+22c58553[ ]+fsgnj.q[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+22c59553[ ]+fsgnjn.q[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+22c5a553[ ]+fsgnjx.q[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+a2c5a553[ ]+feq.q[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+a2c59553[ ]+flt.q[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+a2c58553[ ]+fle.q[ ]+a0,a1,a2 +[ ]+[0-9a-f]+:[ ]+a2b61553[ ]+flt.q[ ]+a0,a2,a1 +[ ]+[0-9a-f]+:[ ]+a2b60553[ ]+fle.q[ ]+a0,a2,a1 +[ ]+[0-9a-f]+:[ ]+22a51553[ ]+fneg.q[ ]+a0,a0 +[ ]+[0-9a-f]+:[ ]+22a52553[ ]+fabs.q[ ]+a0,a0 +[ ]+[0-9a-f]+:[ ]+e2059553[ ]+fclass.q[ ]+a0,a1 diff --git a/gas/testsuite/gas/riscv/zqinx.s b/gas/testsuite/gas/riscv/zqinx.s new file mode 100644 index 00000000000..8372ba57c71 --- /dev/null +++ b/gas/testsuite/gas/riscv/zqinx.s @@ -0,0 +1,35 @@ +target: + fadd.q a0, a1, a2 + fsub.q a0, a1, a2 + fmul.q a0, a1, a2 + fdiv.q a0, a1, a2 + fsqrt.q a0, a0 + fmin.q a0, a1, a2 + fmax.q a0, a1, a2 + fmadd.q a0, a1, a2, a3 + fnmadd.q a0, a1, a2, a3 + fmsub.q a0, a1, a2, a3 + fnmsub.q a0, a1, a2, a3 + fcvt.w.q a0, a1 + fcvt.wu.q a0, a1 + fcvt.l.q a0, a1 + fcvt.lu.q a0, a1 + fcvt.s.q a0, a1 + fcvt.d.q a0, a1 + fcvt.q.s a0, a1 + fcvt.q.d a0, a1 + fcvt.q.w a0, a1 + fcvt.q.wu a0, a1 + fcvt.q.l a0, a1 + fcvt.q.lu a0, a1 + fsgnj.q a0, a1, a2 + fsgnjn.q a0, a1, a2 + fsgnjx.q a0, a1, a2 + feq.q a0, a1, a2 + flt.q a0, a1, a2 + fle.q a0, a1, a2 + fgt.q a0, a1, a2 + fge.q a0, a1, a2 + fneg.q a0, a0 + fabs.q a0, a0 + fclass.q a0, a1 diff --git a/include/elf/riscv.h b/include/elf/riscv.h index 80822835cd9..a73623d315d 100644 --- a/include/elf/riscv.h +++ b/include/elf/riscv.h @@ -114,6 +114,9 @@ END_RELOC_NUMBERS (R_RISCV_max) /* File uses the 32E base integer instruction. */ #define EF_RISCV_RVE 0x0008 +/* File uses the gpr base ZFINX instruction. */ +#define EF_RISCV_ZFINX 0x0010 + /* The name of the global pointer symbol. */ #define RISCV_GP_SYMBOL "__global_pointer$" diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c index 2e28ba77e60..4bf640e6f53 100644 --- a/opcodes/riscv-dis.c +++ b/opcodes/riscv-dis.c @@ -513,6 +513,10 @@ riscv_disassemble_insn (bfd_vma memaddr, insn_t word, disassemble_info *info) xlen = ehdr->e_ident[EI_CLASS] == ELFCLASS64 ? 64 : 32; } + /* If ELF has ZFINX flags, use gpr for disassemble. */ + if ((ehdr->e_flags & EF_RISCV_ZFINX_ABI) == EF_RISCV_ZFINX_ABI) + riscv_fpr_names = riscv_gpr_names_abi; + for (; op->name; op++) { /* Does the opcode match? */ -- 2.25.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 3/3] RISC-V: Add testcases and disassemble support for z[fdq]inx 2021-10-28 16:47 ` [PATCH 3/3] RISC-V: Add testcases and disassemble support " jiawei @ 2021-11-09 10:03 ` Nelson Chu 0 siblings, 0 replies; 8+ messages in thread From: Nelson Chu @ 2021-11-09 10:03 UTC (permalink / raw) To: jiawei; +Cc: Binutils, tariq.kurd, cmuellner, Kito Cheng Umm, adding a new flag in the elf header needs to change the riscv psabi, but in fact we could try to get the information from the elf architecture attribute. I have sent a patch to let dis-assembler can access the elf attributes, and then parse the architecture string: https://sourceware.org/pipermail/binutils/2021-November/118444.html So that you can call "riscv_subset_supports (&riscv_rps_dis, "zfinx")" to check if the zfinx extension is enable or not, and without adding and checking the new elf header flag. I will commit my patch in a few days, so please feel free to contact me if you have any questions. Thanks Nelson On Fri, Oct 29, 2021 at 12:50 AM jiawei <jiawei@iscas.ac.cn> wrote: > > --- > binutils/readelf.c | 3 +++ > gas/config/tc-riscv.c | 15 ++++++++++++ > gas/testsuite/gas/riscv/zdinx.d | 41 +++++++++++++++++++++++++++++++ > gas/testsuite/gas/riscv/zdinx.s | 33 +++++++++++++++++++++++++ > gas/testsuite/gas/riscv/zfinx.d | 39 ++++++++++++++++++++++++++++++ > gas/testsuite/gas/riscv/zfinx.s | 31 ++++++++++++++++++++++++ > gas/testsuite/gas/riscv/zqinx.d | 43 +++++++++++++++++++++++++++++++++ > gas/testsuite/gas/riscv/zqinx.s | 35 +++++++++++++++++++++++++++ > include/elf/riscv.h | 3 +++ > opcodes/riscv-dis.c | 4 +++ > 10 files changed, 247 insertions(+) > create mode 100644 gas/testsuite/gas/riscv/zdinx.d > create mode 100644 gas/testsuite/gas/riscv/zdinx.s > create mode 100644 gas/testsuite/gas/riscv/zfinx.d > create mode 100644 gas/testsuite/gas/riscv/zfinx.s > create mode 100644 gas/testsuite/gas/riscv/zqinx.d > create mode 100644 gas/testsuite/gas/riscv/zqinx.s > > diff --git a/binutils/readelf.c b/binutils/readelf.c > index 682eacdef14..fc889c6c3ff 100644 > --- a/binutils/readelf.c > +++ b/binutils/readelf.c > @@ -3717,6 +3717,9 @@ get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine) > if (e_flags & EF_RISCV_RVE) > strcat (buf, ", RVE"); > > + if (e_flags & EF_RISCV_ZFINX) > + strcat (buf, ", ZFINX"); > + > switch (e_flags & EF_RISCV_FLOAT_ABI) > { > case EF_RISCV_FLOAT_ABI_SOFT: > diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c > index b879bf1ea8b..ff279263ffb 100644 > --- a/gas/config/tc-riscv.c > +++ b/gas/config/tc-riscv.c > @@ -204,6 +204,7 @@ struct riscv_set_options > int pic; /* Generate position-independent code. */ > int rvc; /* Generate RVC code. */ > int rve; /* Generate RVE code. */ > + int zfinx; /* Generate ZFINX code. */ > int relax; /* Emit relocs the linker is allowed to relax. */ > int arch_attr; /* Emit architecture and privileged elf attributes. */ > int csr_check; /* Enable the CSR checking. */ > @@ -214,6 +215,7 @@ static struct riscv_set_options riscv_opts = > 0, /* pic */ > 0, /* rvc */ > 0, /* rve */ > + 0, /* ZFINX */ > 1, /* relax */ > DEFAULT_RISCV_ATTR, /* arch_attr */ > 0, /* csr_check */ > @@ -234,6 +236,15 @@ riscv_set_rve (bool rve_value) > riscv_opts.rve = rve_value; > } > > +static void > +riscv_set_zfinx (bool finx_value) > +{ > + if (finx_value) > + elf_flags |= EF_RISCV_ZFINX; > + > + riscv_opts.finx = finx_value; > +} > + > static riscv_subset_list_t riscv_subsets; > > static bool > @@ -328,6 +339,10 @@ riscv_set_arch (const char *s) > riscv_set_rve (false); > if (riscv_subset_supports ("e")) > riscv_set_rve (true); > + if (riscv_subset_supports ("zfinx") > + || riscv_subset_supports ("zdinx") > + || riscv_subset_supports ("zqinx")) > + riscv_set_finx (true); > } > > /* Indicate -mabi option is explictly set. */ > diff --git a/gas/testsuite/gas/riscv/zdinx.d b/gas/testsuite/gas/riscv/zdinx.d > new file mode 100644 > index 00000000000..3e4c1a73388 > --- /dev/null > +++ b/gas/testsuite/gas/riscv/zdinx.d > @@ -0,0 +1,41 @@ > +#as: -march=rv64ima_zdinx > +#source: zdinx.s > +#objdump: -dr > + > +.*:[ ]+file format .* > + > +Disassembly of section .text: > + > +0+000 <target>: > +[ ]+[0-9a-f]+:[ ]+02c5f553[ ]+fadd.d[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+0ac5f553[ ]+fsub.d[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+12c5f553[ ]+fmul.d[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+1ac5f553[ ]+fdiv.d[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+5a057553[ ]+fsqrt.d[ ]+a0,a0 > +[ ]+[0-9a-f]+:[ ]+2ac58553[ ]+fmin.d[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+2ac59553[ ]+fmax.d[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+6ac5f543[ ]+fmadd.d[ ]+a0,a1,a2,a3 > +[ ]+[0-9a-f]+:[ ]+6ac5f54f[ ]+fnmadd.d[ ]+a0,a1,a2,a3 > +[ ]+[0-9a-f]+:[ ]+6ac5f547[ ]+fmsub.d[ ]+a0,a1,a2,a3 > +[ ]+[0-9a-f]+:[ ]+6ac5f54b[ ]+fnmsub.d[ ]+a0,a1,a2,a3 > +[ ]+[0-9a-f]+:[ ]+c205f553[ ]+fcvt.w.d[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+c215f553[ ]+fcvt.wu.d[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+c225f553[ ]+fcvt.l.d[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+c235f553[ ]+fcvt.lu.d[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+4015f553[ ]+fcvt.s.d[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+42058553[ ]+fcvt.d.s[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+d2058553[ ]+fcvt.d.w[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+d2158553[ ]+fcvt.d.wu[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+d225f553[ ]+fcvt.d.l[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+d235f553[ ]+fcvt.d.lu[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+22c58553[ ]+fsgnj.d[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+22c59553[ ]+fsgnjn.d[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+22c5a553[ ]+fsgnjx.d[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+a2c5a553[ ]+feq.d[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+a2c59553[ ]+flt.d[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+a2c58553[ ]+fle.d[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+a2b61553[ ]+flt.d[ ]+a0,a2,a1 > +[ ]+[0-9a-f]+:[ ]+a2b60553[ ]+fle.d[ ]+a0,a2,a1 > +[ ]+[0-9a-f]+:[ ]+22a51553[ ]+fneg.d[ ]+a0,a0 > +[ ]+[0-9a-f]+:[ ]+22a52553[ ]+fabs.d[ ]+a0,a0 > +[ ]+[0-9a-f]+:[ ]+e2059553[ ]+fclass.d[ ]+a0,a1 > diff --git a/gas/testsuite/gas/riscv/zdinx.s b/gas/testsuite/gas/riscv/zdinx.s > new file mode 100644 > index 00000000000..c427d982aaf > --- /dev/null > +++ b/gas/testsuite/gas/riscv/zdinx.s > @@ -0,0 +1,33 @@ > +target: > + fadd.d a0, a1, a2 > + fsub.d a0, a1, a2 > + fmul.d a0, a1, a2 > + fdiv.d a0, a1, a2 > + fsqrt.d a0, a0 > + fmin.d a0, a1, a2 > + fmax.d a0, a1, a2 > + fmadd.d a0, a1, a2, a3 > + fnmadd.d a0, a1, a2, a3 > + fmsub.d a0, a1, a2, a3 > + fnmsub.d a0, a1, a2, a3 > + fcvt.w.d a0, a1 > + fcvt.wu.d a0, a1 > + fcvt.l.d a0, a1 > + fcvt.lu.d a0, a1 > + fcvt.s.d a0, a1 > + fcvt.d.s a0, a1 > + fcvt.d.w a0, a1 > + fcvt.d.wu a0, a1 > + fcvt.d.l a0, a1 > + fcvt.d.lu a0, a1 > + fsgnj.d a0, a1, a2 > + fsgnjn.d a0, a1, a2 > + fsgnjx.d a0, a1, a2 > + feq.d a0, a1, a2 > + flt.d a0, a1, a2 > + fle.d a0, a1, a2 > + fgt.d a0, a1, a2 > + fge.d a0, a1, a2 > + fneg.d a0, a0 > + fabs.d a0, a0 > + fclass.d a0, a1 > diff --git a/gas/testsuite/gas/riscv/zfinx.d b/gas/testsuite/gas/riscv/zfinx.d > new file mode 100644 > index 00000000000..d5499aa9131 > --- /dev/null > +++ b/gas/testsuite/gas/riscv/zfinx.d > @@ -0,0 +1,39 @@ > +#as: -march=rv64ima_zfinx > +#source: zfinx.s > +#objdump: -dr > + > +.*:[ ]+file format .* > + > +Disassembly of section .text: > + > +0+000 <target>: > +[ ]+[0-9a-f]+:[ ]+00c5f553[ ]+fadd.s[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+08c5f553[ ]+fsub.s[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+10c5f553[ ]+fmul.s[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+18c5f553[ ]+fdiv.s[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+58057553[ ]+fsqrt.s[ ]+a0,a0 > +[ ]+[0-9a-f]+:[ ]+28c58553[ ]+fmin.s[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+28c59553[ ]+fmax.s[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+68c5f543[ ]+fmadd.s[ ]+a0,a1,a2,a3 > +[ ]+[0-9a-f]+:[ ]+68c5f54f[ ]+fnmadd.s[ ]+a0,a1,a2,a3 > +[ ]+[0-9a-f]+:[ ]+68c5f547[ ]+fmsub.s[ ]+a0,a1,a2,a3 > +[ ]+[0-9a-f]+:[ ]+68c5f54b[ ]+fnmsub.s[ ]+a0,a1,a2,a3 > +[ ]+[0-9a-f]+:[ ]+c005f553[ ]+fcvt.w.s[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+c015f553[ ]+fcvt.wu.s[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+c025f553[ ]+fcvt.l.s[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+c035f553[ ]+fcvt.lu.s[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+d005f553[ ]+fcvt.s.w[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+d015f553[ ]+fcvt.s.wu[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+d025f553[ ]+fcvt.s.l[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+d035f553[ ]+fcvt.s.lu[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+20c58553[ ]+fsgnj.s[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+20c59553[ ]+fsgnjn.s[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+20c5a553[ ]+fsgnjx.s[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+a0c5a553[ ]+feq.s[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+a0c59553[ ]+flt.s[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+a0c58553[ ]+fle.s[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+a0b61553[ ]+flt.s[ ]+a0,a2,a1 > +[ ]+[0-9a-f]+:[ ]+a0b60553[ ]+fle.s[ ]+a0,a2,a1 > +[ ]+[0-9a-f]+:[ ]+20a51553[ ]+fneg.s[ ]+a0,a0 > +[ ]+[0-9a-f]+:[ ]+20a52553[ ]+fabs.s[ ]+a0,a0 > +[ ]+[0-9a-f]+:[ ]+e0059553[ ]+fclass.s[ ]+a0,a1 > diff --git a/gas/testsuite/gas/riscv/zfinx.s b/gas/testsuite/gas/riscv/zfinx.s > new file mode 100644 > index 00000000000..af50490fadf > --- /dev/null > +++ b/gas/testsuite/gas/riscv/zfinx.s > @@ -0,0 +1,31 @@ > +target: > + fadd.s a0, a1, a2 > + fsub.s a0, a1, a2 > + fmul.s a0, a1, a2 > + fdiv.s a0, a1, a2 > + fsqrt.s a0, a0 > + fmin.s a0, a1, a2 > + fmax.s a0, a1, a2 > + fmadd.s a0, a1, a2, a3 > + fnmadd.s a0, a1, a2, a3 > + fmsub.s a0, a1, a2, a3 > + fnmsub.s a0, a1, a2, a3 > + fcvt.w.s a0, a1 > + fcvt.wu.s a0, a1 > + fcvt.l.s a0, a1 > + fcvt.lu.s a0, a1 > + fcvt.s.w a0, a1 > + fcvt.s.wu a0, a1 > + fcvt.s.l a0, a1 > + fcvt.s.lu a0, a1 > + fsgnj.s a0, a1, a2 > + fsgnjn.s a0, a1, a2 > + fsgnjx.s a0, a1, a2 > + feq.s a0, a1, a2 > + flt.s a0, a1, a2 > + fle.s a0, a1, a2 > + fgt.s a0, a1, a2 > + fge.s a0, a1, a2 > + fneg.s a0, a0 > + fabs.s a0, a0 > + fclass.s a0, a1 > diff --git a/gas/testsuite/gas/riscv/zqinx.d b/gas/testsuite/gas/riscv/zqinx.d > new file mode 100644 > index 00000000000..a1c9eab4e1d > --- /dev/null > +++ b/gas/testsuite/gas/riscv/zqinx.d > @@ -0,0 +1,43 @@ > +#as: -march=rv64ima_zqinx > +#source: zqinx.s > +#objdump: -dr > + > +.*:[ ]+file format .* > + > +Disassembly of section .text: > + > +0+000 <target>: > +[ ]+[0-9a-f]+:[ ]+02c5f553[ ]+fadd.q[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+0ac5f553[ ]+fsub.q[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+12c5f553[ ]+fmul.q[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+1ac5f553[ ]+fdiv.q[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+5a057553[ ]+fsqrt.q[ ]+a0,a0 > +[ ]+[0-9a-f]+:[ ]+2ac58553[ ]+fmin.q[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+2ac59553[ ]+fmax.q[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+6ac5f543[ ]+fmadd.q[ ]+a0,a1,a2,a3 > +[ ]+[0-9a-f]+:[ ]+6ac5f54f[ ]+fnmadd.q[ ]+a0,a1,a2,a3 > +[ ]+[0-9a-f]+:[ ]+6ac5f547[ ]+fmsub.q[ ]+a0,a1,a2,a3 > +[ ]+[0-9a-f]+:[ ]+6ac5f54b[ ]+fnmsub.q[ ]+a0,a1,a2,a3 > +[ ]+[0-9a-f]+:[ ]+c205f553[ ]+fcvt.w.q[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+c215f553[ ]+fcvt.wu.q[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+c225f553[ ]+fcvt.l.q[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+c235f553[ ]+fcvt.lu.q[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+4015f553[ ]+fcvt.s.q[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+4015f553[ ]+fcvt.d.q[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+46058553[ ]+fcvt.q.s[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+42058553[ ]+fcvt.q.d[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+d2058553[ ]+fcvt.q.w[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+d2158553[ ]+fcvt.q.wu[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+d225f553[ ]+fcvt.q.l[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+d235f553[ ]+fcvt.q.lu[ ]+a0,a1 > +[ ]+[0-9a-f]+:[ ]+22c58553[ ]+fsgnj.q[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+22c59553[ ]+fsgnjn.q[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+22c5a553[ ]+fsgnjx.q[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+a2c5a553[ ]+feq.q[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+a2c59553[ ]+flt.q[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+a2c58553[ ]+fle.q[ ]+a0,a1,a2 > +[ ]+[0-9a-f]+:[ ]+a2b61553[ ]+flt.q[ ]+a0,a2,a1 > +[ ]+[0-9a-f]+:[ ]+a2b60553[ ]+fle.q[ ]+a0,a2,a1 > +[ ]+[0-9a-f]+:[ ]+22a51553[ ]+fneg.q[ ]+a0,a0 > +[ ]+[0-9a-f]+:[ ]+22a52553[ ]+fabs.q[ ]+a0,a0 > +[ ]+[0-9a-f]+:[ ]+e2059553[ ]+fclass.q[ ]+a0,a1 > diff --git a/gas/testsuite/gas/riscv/zqinx.s b/gas/testsuite/gas/riscv/zqinx.s > new file mode 100644 > index 00000000000..8372ba57c71 > --- /dev/null > +++ b/gas/testsuite/gas/riscv/zqinx.s > @@ -0,0 +1,35 @@ > +target: > + fadd.q a0, a1, a2 > + fsub.q a0, a1, a2 > + fmul.q a0, a1, a2 > + fdiv.q a0, a1, a2 > + fsqrt.q a0, a0 > + fmin.q a0, a1, a2 > + fmax.q a0, a1, a2 > + fmadd.q a0, a1, a2, a3 > + fnmadd.q a0, a1, a2, a3 > + fmsub.q a0, a1, a2, a3 > + fnmsub.q a0, a1, a2, a3 > + fcvt.w.q a0, a1 > + fcvt.wu.q a0, a1 > + fcvt.l.q a0, a1 > + fcvt.lu.q a0, a1 > + fcvt.s.q a0, a1 > + fcvt.d.q a0, a1 > + fcvt.q.s a0, a1 > + fcvt.q.d a0, a1 > + fcvt.q.w a0, a1 > + fcvt.q.wu a0, a1 > + fcvt.q.l a0, a1 > + fcvt.q.lu a0, a1 > + fsgnj.q a0, a1, a2 > + fsgnjn.q a0, a1, a2 > + fsgnjx.q a0, a1, a2 > + feq.q a0, a1, a2 > + flt.q a0, a1, a2 > + fle.q a0, a1, a2 > + fgt.q a0, a1, a2 > + fge.q a0, a1, a2 > + fneg.q a0, a0 > + fabs.q a0, a0 > + fclass.q a0, a1 > diff --git a/include/elf/riscv.h b/include/elf/riscv.h > index 80822835cd9..a73623d315d 100644 > --- a/include/elf/riscv.h > +++ b/include/elf/riscv.h > @@ -114,6 +114,9 @@ END_RELOC_NUMBERS (R_RISCV_max) > /* File uses the 32E base integer instruction. */ > #define EF_RISCV_RVE 0x0008 > > +/* File uses the gpr base ZFINX instruction. */ > +#define EF_RISCV_ZFINX 0x0010 > + > /* The name of the global pointer symbol. */ > #define RISCV_GP_SYMBOL "__global_pointer$" > > diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c > index 2e28ba77e60..4bf640e6f53 100644 > --- a/opcodes/riscv-dis.c > +++ b/opcodes/riscv-dis.c > @@ -513,6 +513,10 @@ riscv_disassemble_insn (bfd_vma memaddr, insn_t word, disassemble_info *info) > xlen = ehdr->e_ident[EI_CLASS] == ELFCLASS64 ? 64 : 32; > } > > + /* If ELF has ZFINX flags, use gpr for disassemble. */ > + if ((ehdr->e_flags & EF_RISCV_ZFINX_ABI) == EF_RISCV_ZFINX_ABI) > + riscv_fpr_names = riscv_gpr_names_abi; > + > for (; op->name; op++) > { > /* Does the opcode match? */ > -- > 2.25.1 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 0/3] RISC-V: Zfinx extension support 2021-10-28 16:47 [PATCH 0/3] RISC-V: Zfinx extension support jiawei ` (2 preceding siblings ...) 2021-10-28 16:47 ` [PATCH 3/3] RISC-V: Add testcases and disassemble support " jiawei @ 2021-11-09 10:06 ` Nelson Chu 3 siblings, 0 replies; 8+ messages in thread From: Nelson Chu @ 2021-11-09 10:06 UTC (permalink / raw) To: jiawei; +Cc: Binutils, tariq.kurd, cmuellner, Kito Cheng Hi Jiawei, Thanks for implementing the zfinx support both in gcc and binutils :) I have given some comments, so please see the details in the related mails. Thanks Nelson On Fri, Oct 29, 2021 at 12:48 AM jiawei <jiawei@iscas.ac.cn> wrote: > > This patch is support zfinx extension on binutils, zfinx is not compatible with any float extension and use gpr replace fpr, we adjust the opreand set when zfinx used. For disassemble part, we add a flag ZFINX(0x10) as ELF-header to distinguish whether use gpr or fpr name for float instructions. > > jiawei (3): > RISC-V: Add mininal support for z[fdq]inx > RISC-V: Add instructions and operand set for z[fdq]inx > RISC-V: Add testcases and disassemble support for z[fdq]inx > > bfd/elfxx-riscv.c | 32 +++++++ > binutils/readelf.c | 3 + > gas/config/tc-riscv.c | 33 +++++++- > gas/testsuite/gas/riscv/zdinx.d | 41 +++++++++ > gas/testsuite/gas/riscv/zdinx.s | 33 ++++++++ > gas/testsuite/gas/riscv/zfinx.d | 39 +++++++++ > gas/testsuite/gas/riscv/zfinx.s | 31 +++++++ > gas/testsuite/gas/riscv/zqinx.d | 43 ++++++++++ > gas/testsuite/gas/riscv/zqinx.s | 35 ++++++++ > include/elf/riscv.h | 3 + > include/opcode/riscv.h | 3 + > opcodes/riscv-dis.c | 4 + > opcodes/riscv-opc.c | 146 ++++++++++++++++++++++++++++++++ > 13 files changed, 443 insertions(+), 3 deletions(-) > create mode 100644 gas/testsuite/gas/riscv/zdinx.d > create mode 100644 gas/testsuite/gas/riscv/zdinx.s > create mode 100644 gas/testsuite/gas/riscv/zfinx.d > create mode 100644 gas/testsuite/gas/riscv/zfinx.s > create mode 100644 gas/testsuite/gas/riscv/zqinx.d > create mode 100644 gas/testsuite/gas/riscv/zqinx.s > ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2021-11-09 10:06 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-10-28 16:47 [PATCH 0/3] RISC-V: Zfinx extension support jiawei 2021-10-28 16:47 ` [PATCH 1/3] RISC-V: Add mininal support for z[fdq]inx jiawei 2021-11-09 6:32 ` Nelson Chu 2021-10-28 16:47 ` [PATCH 2/3] RISC-V: Add instructions and operand set " jiawei 2021-11-09 9:51 ` Nelson Chu 2021-10-28 16:47 ` [PATCH 3/3] RISC-V: Add testcases and disassemble support " jiawei 2021-11-09 10:03 ` Nelson Chu 2021-11-09 10:06 ` [PATCH 0/3] RISC-V: Zfinx extension support Nelson Chu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).