From c81eb4cc894c94b23f9e1312fcb906b8f3c60383 Mon Sep 17 00:00:00 2001 From: Edmar Wienskoski Date: Fri, 31 May 2024 08:41:52 -0700 Subject: [PATCH 1/5] Add support for zilsd new instructions --- bfd/elfxx-riscv.c | 1 + opcodes/riscv-opc.c | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c index dfacb87eda0..fc3912e8bc5 100644 --- a/bfd/elfxx-riscv.c +++ b/bfd/elfxx-riscv.c @@ -1354,6 +1354,7 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] = {"zihintntl", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zihintpause", ISA_SPEC_CLASS_DRAFT, 2, 0, 0 }, {"zihpm", ISA_SPEC_CLASS_DRAFT, 2, 0, 0 }, + {"zilsd", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zmmul", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zaamo", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zabha", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c index 1ef4eaddf4d..272d2b5e0ae 100644 --- a/opcodes/riscv-opc.c +++ b/opcodes/riscv-opc.c @@ -554,14 +554,14 @@ const struct riscv_opcode riscv_opcodes[] = {"xor", 0, INSN_CLASS_I, "d,s,t", MATCH_XOR, MASK_XOR, match_opcode, 0 }, {"lwu", 64, INSN_CLASS_I, "d,o(s)", MATCH_LWU, MASK_LWU, match_opcode, INSN_DREF|INSN_4_BYTE }, {"lwu", 64, INSN_CLASS_I, "d,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, -{"ld", 64, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"ld", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"ld", 64, INSN_CLASS_I, "d,o(s)", MATCH_LD, MASK_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"ld", 64, INSN_CLASS_I, "d,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, -{"sd", 64, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"sd", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"sd", 64, INSN_CLASS_I, "t,q(s)", MATCH_SD, MASK_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"sd", 64, INSN_CLASS_I, "t,A,s", 0, (int) M_Sx_FSx, match_rs1_nonzero, INSN_MACRO }, +{"ld", 0, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"ld", 0, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"ld", 0, INSN_CLASS_I, "d,o(s)", MATCH_LD, MASK_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"ld", 0, INSN_CLASS_I, "d,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, +{"sd", 0, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"sd", 0, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"sd", 0, INSN_CLASS_I, "t,q(s)", MATCH_SD, MASK_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"sd", 0, INSN_CLASS_I, "t,A,s", 0, (int) M_Sx_FSx, match_rs1_nonzero, INSN_MACRO }, {"sext.w", 64, INSN_CLASS_C, "d,CU", MATCH_C_ADDIW, MASK_C_ADDIW|MASK_RVC_IMM, match_rd_nonzero, INSN_ALIAS }, {"sext.w", 64, INSN_CLASS_I, "d,s", MATCH_ADDIW, MASK_ADDIW|MASK_IMM, match_opcode, INSN_ALIAS }, {"addiw", 64, INSN_CLASS_C, "d,CU,Co", MATCH_C_ADDIW, MASK_C_ADDIW, match_rd_nonzero, INSN_ALIAS }, @@ -1062,10 +1062,10 @@ const struct riscv_opcode riscv_opcodes[] = {"c.addiw", 64, INSN_CLASS_C, "d,Co", MATCH_C_ADDIW, MASK_C_ADDIW, match_rd_nonzero, 0 }, {"c.addw", 64, INSN_CLASS_C, "Cs,Ct", MATCH_C_ADDW, MASK_C_ADDW, match_opcode, 0 }, {"c.subw", 64, INSN_CLASS_C, "Cs,Ct", MATCH_C_SUBW, MASK_C_SUBW, match_opcode, 0 }, -{"c.ldsp", 64, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_DREF|INSN_8_BYTE }, -{"c.ld", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"c.sdsp", 64, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"c.sd", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.ldsp", 0, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_DREF|INSN_8_BYTE }, +{"c.ld", 0, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.sdsp", 0, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.sd", 0, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.fldsp", 0, INSN_CLASS_D_AND_C, "D,Cn(Cc)", MATCH_C_FLDSP, MASK_C_FLDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.fld", 0, INSN_CLASS_D_AND_C, "CD,Cl(Cs)", MATCH_C_FLD, MASK_C_FLD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.fsdsp", 0, INSN_CLASS_D_AND_C, "CT,CN(Cc)", MATCH_C_FSDSP, MASK_C_FSDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, From 1afc3be64f67d5861b2229779a4b01d457500d33 Mon Sep 17 00:00:00 2001 From: Edmar Wienskoski Date: Fri, 31 May 2024 08:41:52 -0700 Subject: [PATCH 2/5] Add support for zilsd new instructions --- bfd/elfxx-riscv.c | 1 + opcodes/riscv-opc.c | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c index 49c644bafd1..0561c3aa28c 100644 --- a/bfd/elfxx-riscv.c +++ b/bfd/elfxx-riscv.c @@ -1360,6 +1360,7 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] = {"zihintntl", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zihintpause", ISA_SPEC_CLASS_DRAFT, 2, 0, 0 }, {"zihpm", ISA_SPEC_CLASS_DRAFT, 2, 0, 0 }, + {"zilsd", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zmmul", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zaamo", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zabha", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c index f7c0f5c7c83..23ba852a654 100644 --- a/opcodes/riscv-opc.c +++ b/opcodes/riscv-opc.c @@ -562,14 +562,14 @@ const struct riscv_opcode riscv_opcodes[] = {"xor", 0, INSN_CLASS_I, "d,s,t", MATCH_XOR, MASK_XOR, match_opcode, 0 }, {"lwu", 64, INSN_CLASS_I, "d,o(s)", MATCH_LWU, MASK_LWU, match_opcode, INSN_DREF|INSN_4_BYTE }, {"lwu", 64, INSN_CLASS_I, "d,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, -{"ld", 64, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"ld", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"ld", 64, INSN_CLASS_I, "d,o(s)", MATCH_LD, MASK_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"ld", 64, INSN_CLASS_I, "d,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, -{"sd", 64, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"sd", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"sd", 64, INSN_CLASS_I, "t,q(s)", MATCH_SD, MASK_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"sd", 64, INSN_CLASS_I, "t,A,s", 0, (int) M_Sx_FSx, match_rs1_nonzero, INSN_MACRO }, +{"ld", 0, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"ld", 0, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"ld", 0, INSN_CLASS_I, "d,o(s)", MATCH_LD, MASK_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"ld", 0, INSN_CLASS_I, "d,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, +{"sd", 0, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"sd", 0, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"sd", 0, INSN_CLASS_I, "t,q(s)", MATCH_SD, MASK_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"sd", 0, INSN_CLASS_I, "t,A,s", 0, (int) M_Sx_FSx, match_rs1_nonzero, INSN_MACRO }, {"sext.w", 64, INSN_CLASS_C, "d,CU", MATCH_C_ADDIW, MASK_C_ADDIW|MASK_RVC_IMM, match_rd_nonzero, INSN_ALIAS }, {"sext.w", 64, INSN_CLASS_I, "d,s", MATCH_ADDIW, MASK_ADDIW|MASK_IMM, match_opcode, INSN_ALIAS }, {"addiw", 64, INSN_CLASS_C, "d,CU,Co", MATCH_C_ADDIW, MASK_C_ADDIW, match_rd_nonzero, INSN_ALIAS }, @@ -1093,10 +1093,10 @@ const struct riscv_opcode riscv_opcodes[] = {"c.addiw", 64, INSN_CLASS_C, "d,Co", MATCH_C_ADDIW, MASK_C_ADDIW, match_rd_nonzero, 0 }, {"c.addw", 64, INSN_CLASS_C, "Cs,Ct", MATCH_C_ADDW, MASK_C_ADDW, match_opcode, 0 }, {"c.subw", 64, INSN_CLASS_C, "Cs,Ct", MATCH_C_SUBW, MASK_C_SUBW, match_opcode, 0 }, -{"c.ldsp", 64, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_DREF|INSN_8_BYTE }, -{"c.ld", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"c.sdsp", 64, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"c.sd", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.ldsp", 0, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_DREF|INSN_8_BYTE }, +{"c.ld", 0, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.sdsp", 0, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.sd", 0, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.fldsp", 0, INSN_CLASS_D_AND_C, "D,Cn(Cc)", MATCH_C_FLDSP, MASK_C_FLDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.fld", 0, INSN_CLASS_D_AND_C, "CD,Cl(Cs)", MATCH_C_FLD, MASK_C_FLD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.fsdsp", 0, INSN_CLASS_D_AND_C, "CT,CN(Cc)", MATCH_C_FSDSP, MASK_C_FSDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, From e47484e1024d7e4a9405f1b81465abded0a8df2d Mon Sep 17 00:00:00 2001 From: Edmar Wienskoski Date: Wed, 26 Jun 2024 07:46:16 -0700 Subject: [PATCH 3/5] Re-implement zilsd in binutils using Nuclei patch --- bfd/elfxx-riscv.c | 24 ++++++++++++++++++++++-- gas/config/tc-riscv.c | 36 ++++++++++++++++++++++++++++++++++++ include/opcode/riscv.h | 2 ++ opcodes/riscv-dis.c | 18 ++++++++++++++++++ opcodes/riscv-opc.c | 36 ++++++++++++++++++++++++------------ 5 files changed, 102 insertions(+), 14 deletions(-) diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c index 0561c3aa28c..71a095728af 100644 --- a/bfd/elfxx-riscv.c +++ b/bfd/elfxx-riscv.c @@ -1288,7 +1288,8 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] = {"b", "zbs", check_implicit_always}, {"a", "zaamo", check_implicit_always}, {"a", "zalrsc", check_implicit_always}, - + {"zcmlsd", "zilsd", check_implicit_always}, + {"zcmlsd", "zca", check_implicit_always}, {"xsfvcp", "zve32x", check_implicit_always}, {NULL, NULL, NULL} }; @@ -1360,7 +1361,6 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] = {"zihintntl", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zihintpause", ISA_SPEC_CLASS_DRAFT, 2, 0, 0 }, {"zihpm", ISA_SPEC_CLASS_DRAFT, 2, 0, 0 }, - {"zilsd", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zmmul", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zaamo", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zabha", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, @@ -1436,6 +1436,8 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] = {"zcf", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zcd", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zcmp", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, + {"zilsd", ISA_SPEC_CLASS_DRAFT, 0, 81, 0 }, + {"zcmlsd", ISA_SPEC_CLASS_DRAFT, 0, 81, 0 }, {NULL, 0, 0, 0, 0} }; @@ -2111,6 +2113,16 @@ riscv_parse_check_conflicts (riscv_parse_subset_t *rps) (_("`xtheadvector' is conflict with the `v' extension")); no_conflict = false; } + //Add zcmlsd conflicts + if (riscv_lookup_subset (rps->subset_list, "zcmlsd", &subset) + && ((riscv_lookup_subset (rps->subset_list, "c", &subset) + && riscv_lookup_subset (rps->subset_list, "f", &subset)) + || riscv_lookup_subset (rps->subset_list, "zcf", &subset))) + { + rps->error_handler + (_("`zcmlsd' is conflict with the `c+f'/ `zcf' extension")); + no_conflict = false; + } bool support_zve = false; bool support_zvl = false; @@ -2739,6 +2751,10 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps, return riscv_subset_supports (rps, "xsfvcp"); case INSN_CLASS_XSFCEASE: return riscv_subset_supports (rps, "xsfcease"); + case INSN_CLASS_ZILSD: + return riscv_subset_supports(rps, "zilsd"); + case INSN_CLASS_ZCMLSD: + return riscv_subset_supports(rps, "zcmlsd"); default: rps->error_handler (_("internal: unreachable INSN_CLASS_*")); @@ -3009,6 +3025,10 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps, return "xtheadzvamo"; case INSN_CLASS_XSFCEASE: return "xsfcease"; + case INSN_CLASS_ZILSD: + return "zilsd"; + case INSN_CLASS_ZCMLSD: + return "zcmlsd"; default: rps->error_handler (_("internal: unreachable INSN_CLASS_*")); diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index e0083702fbd..f71d089fc0d 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -1714,6 +1714,15 @@ validate_riscv_insn (const struct riscv_opcode *opc, int length) goto unknown_validate_operand; } break; + case 'G': /* Zilsd operand */ + switch (*++oparg) + { + case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break; + case 't': USE_BITS (OP_MASK_RS2, OP_SH_RS2); break; + default: + goto unknown_validate_operand; + } + break; default: unknown_validate_operand: as_bad (_("internal: bad RISC-V opcode " @@ -4048,6 +4057,33 @@ riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr, } break; + case 'G': /* Zilsd ld,sd specific operands. */ + switch(*++oparg) + { + case 'd': + case 't': + if (reg_lookup (&asarg, RCLASS_GPR, ®no)&&(regno%2==0)) + { + char c = *oparg; + if (*asarg == ' ') + ++asarg; + + /* Now that we have assembled one operand, we use the args + string to figure out where it goes in the instruction. */ + switch (c) + { + case 'd': + INSERT_OPERAND (RD, *ip, regno); + break; + case 't': + INSERT_OPERAND (RS2, *ip, regno); + break; + } + continue; + } + } + break; + default: unknown_riscv_ip_operand: as_fatal (_("internal: unknown argument type `%s'"), diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h index ece2963d531..91f9a844bd4 100644 --- a/include/opcode/riscv.h +++ b/include/opcode/riscv.h @@ -516,6 +516,8 @@ enum riscv_insn_class INSN_CLASS_XVENTANACONDOPS, INSN_CLASS_XSFVCP, INSN_CLASS_XSFCEASE, + INSN_CLASS_ZILSD, + INSN_CLASS_ZCMLSD, }; /* This structure holds information for a particular instruction. */ diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c index 9c5e6ce1e69..02f9e59338a 100644 --- a/opcodes/riscv-dis.c +++ b/opcodes/riscv-dis.c @@ -838,6 +838,24 @@ print_insn_args (const char *oparg, insn_t l, bfd_vma pc, disassemble_info *info goto undefined_modifier; } break; + case 'G': /* Zilsd ld,sd specific operands. */ + switch (*++oparg) + { + case 'd': + if ((l & MASK_AUIPC) == MATCH_AUIPC) + pd->hi_addr[rd] = pc + EXTRACT_UTYPE_IMM (l); + else if ((l & MASK_LUI) == MATCH_LUI) + pd->hi_addr[rd] = EXTRACT_UTYPE_IMM (l); + else if ((l & MASK_C_LUI) == MATCH_C_LUI) + pd->hi_addr[rd] = EXTRACT_CITYPE_LUI_IMM (l); + print (info->stream, dis_style_register, "%s", riscv_gpr_names[rd]); + break; + case 't': + print (info->stream, dis_style_register, "%s", + riscv_gpr_names[EXTRACT_OPERAND (RS2, l)]); + break; + } + break; default: undefined_modifier: diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c index 23ba852a654..1c712d0d60c 100644 --- a/opcodes/riscv-opc.c +++ b/opcodes/riscv-opc.c @@ -562,14 +562,22 @@ const struct riscv_opcode riscv_opcodes[] = {"xor", 0, INSN_CLASS_I, "d,s,t", MATCH_XOR, MASK_XOR, match_opcode, 0 }, {"lwu", 64, INSN_CLASS_I, "d,o(s)", MATCH_LWU, MASK_LWU, match_opcode, INSN_DREF|INSN_4_BYTE }, {"lwu", 64, INSN_CLASS_I, "d,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, -{"ld", 0, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"ld", 0, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"ld", 0, INSN_CLASS_I, "d,o(s)", MATCH_LD, MASK_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"ld", 0, INSN_CLASS_I, "d,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, -{"sd", 0, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"sd", 0, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"sd", 0, INSN_CLASS_I, "t,q(s)", MATCH_SD, MASK_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"sd", 0, INSN_CLASS_I, "t,A,s", 0, (int) M_Sx_FSx, match_rs1_nonzero, INSN_MACRO }, +{"ld", 32, INSN_CLASS_ZCMLSD, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"ld", 32, INSN_CLASS_ZCMLSD, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"ld", 32, INSN_CLASS_ZILSD, "Gd,o(s)", MATCH_LD, MASK_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"ld", 32, INSN_CLASS_ZILSD, "Gd,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, +{"ld", 64, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"ld", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"ld", 64, INSN_CLASS_I, "d,o(s)", MATCH_LD, MASK_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"ld", 64, INSN_CLASS_I, "d,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, +{"sd", 32, INSN_CLASS_ZCMLSD, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"sd", 32, INSN_CLASS_ZCMLSD, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"sd", 32, INSN_CLASS_ZILSD, "Gt,q(s)", MATCH_SD, MASK_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"sd", 32, INSN_CLASS_ZILSD, "Gt,A,s", 0, (int) M_Sx_FSx, match_rs1_nonzero, INSN_MACRO }, +{"sd", 64, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"sd", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"sd", 64, INSN_CLASS_I, "t,q(s)", MATCH_SD, MASK_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"sd", 64, INSN_CLASS_I, "t,A,s", 0, (int) M_Sx_FSx, match_rs1_nonzero, INSN_MACRO }, {"sext.w", 64, INSN_CLASS_C, "d,CU", MATCH_C_ADDIW, MASK_C_ADDIW|MASK_RVC_IMM, match_rd_nonzero, INSN_ALIAS }, {"sext.w", 64, INSN_CLASS_I, "d,s", MATCH_ADDIW, MASK_ADDIW|MASK_IMM, match_opcode, INSN_ALIAS }, {"addiw", 64, INSN_CLASS_C, "d,CU,Co", MATCH_C_ADDIW, MASK_C_ADDIW, match_rd_nonzero, INSN_ALIAS }, @@ -1093,10 +1101,14 @@ const struct riscv_opcode riscv_opcodes[] = {"c.addiw", 64, INSN_CLASS_C, "d,Co", MATCH_C_ADDIW, MASK_C_ADDIW, match_rd_nonzero, 0 }, {"c.addw", 64, INSN_CLASS_C, "Cs,Ct", MATCH_C_ADDW, MASK_C_ADDW, match_opcode, 0 }, {"c.subw", 64, INSN_CLASS_C, "Cs,Ct", MATCH_C_SUBW, MASK_C_SUBW, match_opcode, 0 }, -{"c.ldsp", 0, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_DREF|INSN_8_BYTE }, -{"c.ld", 0, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"c.sdsp", 0, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"c.sd", 0, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.ldsp", 32, INSN_CLASS_ZCMLSD, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_DREF|INSN_8_BYTE }, +{"c.ldsp", 64, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_DREF|INSN_8_BYTE }, +{"c.ld", 32, INSN_CLASS_ZCMLSD, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.ld", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.sdsp", 32, INSN_CLASS_ZCMLSD, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.sdsp", 64, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.sd", 32, INSN_CLASS_ZCMLSD, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.sd", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.fldsp", 0, INSN_CLASS_D_AND_C, "D,Cn(Cc)", MATCH_C_FLDSP, MASK_C_FLDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.fld", 0, INSN_CLASS_D_AND_C, "CD,Cl(Cs)", MATCH_C_FLD, MASK_C_FLD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.fsdsp", 0, INSN_CLASS_D_AND_C, "CT,CN(Cc)", MATCH_C_FSDSP, MASK_C_FSDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, From 1050940613998a7f47c66040481fb8a92f38ff43 Mon Sep 17 00:00:00 2001 From: TelGome <2657726985@qq.com> Date: Tue, 24 Dec 2024 22:52:33 +0800 Subject: [PATCH 4/5] new modified for zilsd --- bfd/elfxx-riscv.c | 48 ++++++++++++------- gas/testsuite/gas/riscv/march-fail-zclsd-01.d | 3 ++ gas/testsuite/gas/riscv/march-fail-zclsd-01.l | 2 + gas/testsuite/gas/riscv/march-fail-zclsd-02.d | 3 ++ gas/testsuite/gas/riscv/march-fail-zclsd-02.l | 2 + gas/testsuite/gas/riscv/march-fail-zilsd.d | 3 ++ gas/testsuite/gas/riscv/march-fail-zilsd.l | 2 + gas/testsuite/gas/riscv/zclsd.d | 13 +++++ gas/testsuite/gas/riscv/zclsd.s | 6 +++ gas/testsuite/gas/riscv/zilsd.d | 11 +++++ gas/testsuite/gas/riscv/zilsd.s | 3 ++ include/opcode/riscv.h | 2 +- opcodes/riscv-opc.c | 16 +++---- 13 files changed, 89 insertions(+), 25 deletions(-) create mode 100644 gas/testsuite/gas/riscv/march-fail-zclsd-01.d create mode 100644 gas/testsuite/gas/riscv/march-fail-zclsd-01.l create mode 100644 gas/testsuite/gas/riscv/march-fail-zclsd-02.d create mode 100644 gas/testsuite/gas/riscv/march-fail-zclsd-02.l create mode 100644 gas/testsuite/gas/riscv/march-fail-zilsd.d create mode 100644 gas/testsuite/gas/riscv/march-fail-zilsd.l create mode 100644 gas/testsuite/gas/riscv/zclsd.d create mode 100644 gas/testsuite/gas/riscv/zclsd.s create mode 100644 gas/testsuite/gas/riscv/zilsd.d create mode 100644 gas/testsuite/gas/riscv/zilsd.s diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c index 71a095728af..969a127a032 100644 --- a/bfd/elfxx-riscv.c +++ b/bfd/elfxx-riscv.c @@ -1288,8 +1288,8 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] = {"b", "zbs", check_implicit_always}, {"a", "zaamo", check_implicit_always}, {"a", "zalrsc", check_implicit_always}, - {"zcmlsd", "zilsd", check_implicit_always}, - {"zcmlsd", "zca", check_implicit_always}, + {"zclsd", "zilsd", check_implicit_always}, + {"zclsd", "zca", check_implicit_always}, {"xsfvcp", "zve32x", check_implicit_always}, {NULL, NULL, NULL} }; @@ -1436,8 +1436,8 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] = {"zcf", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zcd", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zcmp", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, - {"zilsd", ISA_SPEC_CLASS_DRAFT, 0, 81, 0 }, - {"zcmlsd", ISA_SPEC_CLASS_DRAFT, 0, 81, 0 }, + {"zilsd", ISA_SPEC_CLASS_DRAFT, 0, 1, 0 }, + {"zclsd", ISA_SPEC_CLASS_DRAFT, 0, 1, 0 }, {NULL, 0, 0, 0, 0} }; @@ -2106,21 +2106,37 @@ riscv_parse_check_conflicts (riscv_parse_subset_t *rps) (_("`zfinx' is conflict with the `f/d/q/zfh/zfhmin' extension")); no_conflict = false; } - if (riscv_lookup_subset (rps->subset_list, "xtheadvector", &subset) - && riscv_lookup_subset (rps->subset_list, "v", &subset)) + //Add zclsd conflicts + if (riscv_lookup_subset (rps->subset_list, "zclsd", &subset) + && ((riscv_lookup_subset (rps->subset_list, "c", &subset) + && riscv_lookup_subset (rps->subset_list, "f", &subset)) + || riscv_lookup_subset (rps->subset_list, "zcf", &subset))) + { + rps->error_handler + (_("`zclsd' is conflict with the `c+f'/ `zcf' extension")); + no_conflict = false; + } + if (riscv_lookup_subset (rps->subset_list, "zilsd", &subset) + && xlen > 32) { rps->error_handler - (_("`xtheadvector' is conflict with the `v' extension")); + (_("rv%d does not support the `zilsd' extension"), xlen); no_conflict = false; } - //Add zcmlsd conflicts - if (riscv_lookup_subset (rps->subset_list, "zcmlsd", &subset) + if (riscv_lookup_subset (rps->subset_list, "zclsd", &subset) + && xlen > 32) + { + rps->error_handler + (_("rv%d does not support the `zclsd' extension"), xlen); + no_conflict = false; + } + if (riscv_lookup_subset (rps->subset_list, "zclsd", &subset) && ((riscv_lookup_subset (rps->subset_list, "c", &subset) - && riscv_lookup_subset (rps->subset_list, "f", &subset)) - || riscv_lookup_subset (rps->subset_list, "zcf", &subset))) + && riscv_lookup_subset (rps->subset_list, "f", &subset)) + || riscv_lookup_subset (rps->subset_list, "zcf", &subset))) { rps->error_handler - (_("`zcmlsd' is conflict with the `c+f'/ `zcf' extension")); + (_("`zclsd' is conflict with the `c+f'/ `zcf' extension")); no_conflict = false; } @@ -2753,8 +2769,8 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps, return riscv_subset_supports (rps, "xsfcease"); case INSN_CLASS_ZILSD: return riscv_subset_supports(rps, "zilsd"); - case INSN_CLASS_ZCMLSD: - return riscv_subset_supports(rps, "zcmlsd"); + case INSN_CLASS_ZCLSD: + return riscv_subset_supports(rps, "zclsd"); default: rps->error_handler (_("internal: unreachable INSN_CLASS_*")); @@ -3027,8 +3043,8 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps, return "xsfcease"; case INSN_CLASS_ZILSD: return "zilsd"; - case INSN_CLASS_ZCMLSD: - return "zcmlsd"; + case INSN_CLASS_ZCLSD: + return "zclsd"; default: rps->error_handler (_("internal: unreachable INSN_CLASS_*")); diff --git a/gas/testsuite/gas/riscv/march-fail-zclsd-01.d b/gas/testsuite/gas/riscv/march-fail-zclsd-01.d new file mode 100644 index 00000000000..003f26c14c7 --- /dev/null +++ b/gas/testsuite/gas/riscv/march-fail-zclsd-01.d @@ -0,0 +1,3 @@ +#as: -march=rv64i_zca_zclsd +#source: empty.s +#error_output: march-fail-zclsd-01.l \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/march-fail-zclsd-01.l b/gas/testsuite/gas/riscv/march-fail-zclsd-01.l new file mode 100644 index 00000000000..07d631da9b3 --- /dev/null +++ b/gas/testsuite/gas/riscv/march-fail-zclsd-01.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*Error: .*rv64 does not support the `zclsd' extension \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/march-fail-zclsd-02.d b/gas/testsuite/gas/riscv/march-fail-zclsd-02.d new file mode 100644 index 00000000000..91f3ce5d81a --- /dev/null +++ b/gas/testsuite/gas/riscv/march-fail-zclsd-02.d @@ -0,0 +1,3 @@ +#as: -march=rv32i_zcf_zclsd +#source: empty.s +#error_output: march-fail-zclsd-02.l \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/march-fail-zclsd-02.l b/gas/testsuite/gas/riscv/march-fail-zclsd-02.l new file mode 100644 index 00000000000..db5d57918e2 --- /dev/null +++ b/gas/testsuite/gas/riscv/march-fail-zclsd-02.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*Error: .*`zclsd' is conflict with the `c+f'/ `zcf' extension \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/march-fail-zilsd.d b/gas/testsuite/gas/riscv/march-fail-zilsd.d new file mode 100644 index 00000000000..49866d2a078 --- /dev/null +++ b/gas/testsuite/gas/riscv/march-fail-zilsd.d @@ -0,0 +1,3 @@ +#as: -march=rv64i_zilsd +#source: empty.s +#error_output: march-fail-zilsd.l \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/march-fail-zilsd.l b/gas/testsuite/gas/riscv/march-fail-zilsd.l new file mode 100644 index 00000000000..af8152fdf33 --- /dev/null +++ b/gas/testsuite/gas/riscv/march-fail-zilsd.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*Error: .*rv64 does not support the `zilsd' extension \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/zclsd.d b/gas/testsuite/gas/riscv/zclsd.d new file mode 100644 index 00000000000..3b17630842c --- /dev/null +++ b/gas/testsuite/gas/riscv/zclsd.d @@ -0,0 +1,13 @@ +#as: -march=rv32g_zca_zilsd_zclsd +#source: zclsd.s +#objdump: -dr -Mno-aliases + +.*:[ ]+file format .* + +Disassembly of section .text: + +0+000 : +[ ]+[0-9a-f]+:[ ]+7218[ ]+c.ld[ ]+a4,32\(a2\) +[ ]+[0-9a-f]+:[ ]+f218[ ]+c.sd[ ]+a4,32\(a2\) +[ ]+[0-9a-f]+:[ ]+6222[ ]+c.ldsp[ ]+tp,8\(sp\) +[ ]+[0-9a-f]+:[ ]+e412[ ]+c.sdsp[ ]+tp,8\(sp\) \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/zclsd.s b/gas/testsuite/gas/riscv/zclsd.s new file mode 100644 index 00000000000..206170b90e1 --- /dev/null +++ b/gas/testsuite/gas/riscv/zclsd.s @@ -0,0 +1,6 @@ ++target: + c.ld a4, 32(a2) + c.sd a4, 32(a2) + c.ldsp x4, 8(x2) + c.sdsp x4, 8(x2) + \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/zilsd.d b/gas/testsuite/gas/riscv/zilsd.d new file mode 100644 index 00000000000..8d5aba659ba --- /dev/null +++ b/gas/testsuite/gas/riscv/zilsd.d @@ -0,0 +1,11 @@ +#as: -march=rv64g_zilsd +#source: zilsd.s +#objdump: -dr + +.*:[ ]+file format .* + +Disassembly of section .text: + +0+000 : +[ ]+[0-9a-f]+:[ ]+00053503[ ]+ld[ ]+a0,0\(a0\) +[ ]+[0-9a-f]+:[ ]+00a53023[ ]+sd[ ]+a0,0\(a0\) \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/zilsd.s b/gas/testsuite/gas/riscv/zilsd.s new file mode 100644 index 00000000000..6adffcd01cc --- /dev/null +++ b/gas/testsuite/gas/riscv/zilsd.s @@ -0,0 +1,3 @@ +target: + ld a0, 0(a0) + sd a0, 0(a0) \ No newline at end of file diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h index 91f9a844bd4..52912a2c815 100644 --- a/include/opcode/riscv.h +++ b/include/opcode/riscv.h @@ -517,7 +517,7 @@ enum riscv_insn_class INSN_CLASS_XSFVCP, INSN_CLASS_XSFCEASE, INSN_CLASS_ZILSD, - INSN_CLASS_ZCMLSD, + INSN_CLASS_ZCLSD, }; /* This structure holds information for a particular instruction. */ diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c index 1c712d0d60c..4d481e615f5 100644 --- a/opcodes/riscv-opc.c +++ b/opcodes/riscv-opc.c @@ -562,16 +562,16 @@ const struct riscv_opcode riscv_opcodes[] = {"xor", 0, INSN_CLASS_I, "d,s,t", MATCH_XOR, MASK_XOR, match_opcode, 0 }, {"lwu", 64, INSN_CLASS_I, "d,o(s)", MATCH_LWU, MASK_LWU, match_opcode, INSN_DREF|INSN_4_BYTE }, {"lwu", 64, INSN_CLASS_I, "d,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, -{"ld", 32, INSN_CLASS_ZCMLSD, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"ld", 32, INSN_CLASS_ZCMLSD, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"ld", 32, INSN_CLASS_ZCLSD, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"ld", 32, INSN_CLASS_ZCLSD, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, {"ld", 32, INSN_CLASS_ZILSD, "Gd,o(s)", MATCH_LD, MASK_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"ld", 32, INSN_CLASS_ZILSD, "Gd,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, {"ld", 64, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, {"ld", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, {"ld", 64, INSN_CLASS_I, "d,o(s)", MATCH_LD, MASK_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"ld", 64, INSN_CLASS_I, "d,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, -{"sd", 32, INSN_CLASS_ZCMLSD, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"sd", 32, INSN_CLASS_ZCMLSD, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"sd", 32, INSN_CLASS_ZCLSD, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"sd", 32, INSN_CLASS_ZCLSD, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, {"sd", 32, INSN_CLASS_ZILSD, "Gt,q(s)", MATCH_SD, MASK_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"sd", 32, INSN_CLASS_ZILSD, "Gt,A,s", 0, (int) M_Sx_FSx, match_rs1_nonzero, INSN_MACRO }, {"sd", 64, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, @@ -1101,13 +1101,13 @@ const struct riscv_opcode riscv_opcodes[] = {"c.addiw", 64, INSN_CLASS_C, "d,Co", MATCH_C_ADDIW, MASK_C_ADDIW, match_rd_nonzero, 0 }, {"c.addw", 64, INSN_CLASS_C, "Cs,Ct", MATCH_C_ADDW, MASK_C_ADDW, match_opcode, 0 }, {"c.subw", 64, INSN_CLASS_C, "Cs,Ct", MATCH_C_SUBW, MASK_C_SUBW, match_opcode, 0 }, -{"c.ldsp", 32, INSN_CLASS_ZCMLSD, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_DREF|INSN_8_BYTE }, +{"c.ldsp", 32, INSN_CLASS_ZCLSD, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_DREF|INSN_8_BYTE }, {"c.ldsp", 64, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_DREF|INSN_8_BYTE }, -{"c.ld", 32, INSN_CLASS_ZCMLSD, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.ld", 32, INSN_CLASS_ZCLSD, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.ld", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"c.sdsp", 32, INSN_CLASS_ZCMLSD, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.sdsp", 32, INSN_CLASS_ZCLSD, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.sdsp", 64, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"c.sd", 32, INSN_CLASS_ZCMLSD, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.sd", 32, INSN_CLASS_ZCLSD, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.sd", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.fldsp", 0, INSN_CLASS_D_AND_C, "D,Cn(Cc)", MATCH_C_FLDSP, MASK_C_FLDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.fld", 0, INSN_CLASS_D_AND_C, "CD,Cl(Cs)", MATCH_C_FLD, MASK_C_FLD, match_opcode, INSN_DREF|INSN_8_BYTE }, From 88bca8ce10eed5885c3ff38a87094d84be2111c0 Mon Sep 17 00:00:00 2001 From: TelGome <2657726985@qq.com> Date: Tue, 24 Dec 2024 22:52:33 +0800 Subject: [PATCH 5/5] new modified for zilsd --- bfd/elfxx-riscv.c | 55 +++++++++++++------ gas/testsuite/gas/riscv/march-fail-zclsd-01.d | 3 + gas/testsuite/gas/riscv/march-fail-zclsd-01.l | 2 + gas/testsuite/gas/riscv/march-fail-zclsd-02.d | 3 + gas/testsuite/gas/riscv/march-fail-zclsd-02.l | 2 + gas/testsuite/gas/riscv/march-fail-zilsd.d | 3 + gas/testsuite/gas/riscv/march-fail-zilsd.l | 2 + gas/testsuite/gas/riscv/zclsd.d | 13 +++++ gas/testsuite/gas/riscv/zclsd.s | 6 ++ gas/testsuite/gas/riscv/zilsd.d | 11 ++++ gas/testsuite/gas/riscv/zilsd.s | 3 + include/opcode/riscv.h | 2 +- opcodes/riscv-opc.c | 16 +++--- 13 files changed, 96 insertions(+), 25 deletions(-) create mode 100644 gas/testsuite/gas/riscv/march-fail-zclsd-01.d create mode 100644 gas/testsuite/gas/riscv/march-fail-zclsd-01.l create mode 100644 gas/testsuite/gas/riscv/march-fail-zclsd-02.d create mode 100644 gas/testsuite/gas/riscv/march-fail-zclsd-02.l create mode 100644 gas/testsuite/gas/riscv/march-fail-zilsd.d create mode 100644 gas/testsuite/gas/riscv/march-fail-zilsd.l create mode 100644 gas/testsuite/gas/riscv/zclsd.d create mode 100644 gas/testsuite/gas/riscv/zclsd.s create mode 100644 gas/testsuite/gas/riscv/zilsd.d create mode 100644 gas/testsuite/gas/riscv/zilsd.s diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c index 71a095728af..12931a31ee2 100644 --- a/bfd/elfxx-riscv.c +++ b/bfd/elfxx-riscv.c @@ -1288,8 +1288,8 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] = {"b", "zbs", check_implicit_always}, {"a", "zaamo", check_implicit_always}, {"a", "zalrsc", check_implicit_always}, - {"zcmlsd", "zilsd", check_implicit_always}, - {"zcmlsd", "zca", check_implicit_always}, + {"zclsd", "zilsd", check_implicit_always}, + {"zclsd", "zca", check_implicit_always}, {"xsfvcp", "zve32x", check_implicit_always}, {NULL, NULL, NULL} }; @@ -1436,8 +1436,8 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] = {"zcf", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zcd", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zcmp", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, - {"zilsd", ISA_SPEC_CLASS_DRAFT, 0, 81, 0 }, - {"zcmlsd", ISA_SPEC_CLASS_DRAFT, 0, 81, 0 }, + {"zilsd", ISA_SPEC_CLASS_DRAFT, 0, 1, 0 }, + {"zclsd", ISA_SPEC_CLASS_DRAFT, 0, 1, 0 }, {NULL, 0, 0, 0, 0} }; @@ -2106,21 +2106,44 @@ riscv_parse_check_conflicts (riscv_parse_subset_t *rps) (_("`zfinx' is conflict with the `f/d/q/zfh/zfhmin' extension")); no_conflict = false; } - if (riscv_lookup_subset (rps->subset_list, "xtheadvector", &subset) - && riscv_lookup_subset (rps->subset_list, "v", &subset)) + //Add zclsd conflicts + if (riscv_lookup_subset (rps->subset_list, "zclsd", &subset) + && ((riscv_lookup_subset (rps->subset_list, "c", &subset) + && riscv_lookup_subset (rps->subset_list, "f", &subset)) + || riscv_lookup_subset (rps->subset_list, "zcf", &subset))) { rps->error_handler - (_("`xtheadvector' is conflict with the `v' extension")); + (_("`zclsd' is conflict with the `c+f'/ `zcf' extension")); no_conflict = false; } - //Add zcmlsd conflicts - if (riscv_lookup_subset (rps->subset_list, "zcmlsd", &subset) + if (riscv_lookup_subset (rps->subset_list, "zilsd", &subset) + && xlen > 32) + { + rps->error_handler + (_("rv%d does not support the `zilsd' extension"), xlen); + no_conflict = false; + } + if (riscv_lookup_subset (rps->subset_list, "zclsd", &subset) + && xlen > 32) + { + rps->error_handler + (_("rv%d does not support the `zclsd' extension"), xlen); + no_conflict = false; + } + if (riscv_lookup_subset (rps->subset_list, "zclsd", &subset) && ((riscv_lookup_subset (rps->subset_list, "c", &subset) - && riscv_lookup_subset (rps->subset_list, "f", &subset)) - || riscv_lookup_subset (rps->subset_list, "zcf", &subset))) + && riscv_lookup_subset (rps->subset_list, "f", &subset)) + || riscv_lookup_subset (rps->subset_list, "zcf", &subset))) + { + rps->error_handler + (_("`zclsd' is conflict with the `c+f'/ `zcf' extension")); + no_conflict = false; + } + if (riscv_lookup_subset (rps->subset_list, "xtheadvector", &subset) + && riscv_lookup_subset (rps->subset_list, "v", &subset)) { rps->error_handler - (_("`zcmlsd' is conflict with the `c+f'/ `zcf' extension")); + (_("`xtheadvector' is conflict with the `v' extension")); no_conflict = false; } @@ -2753,8 +2776,8 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps, return riscv_subset_supports (rps, "xsfcease"); case INSN_CLASS_ZILSD: return riscv_subset_supports(rps, "zilsd"); - case INSN_CLASS_ZCMLSD: - return riscv_subset_supports(rps, "zcmlsd"); + case INSN_CLASS_ZCLSD: + return riscv_subset_supports(rps, "zclsd"); default: rps->error_handler (_("internal: unreachable INSN_CLASS_*")); @@ -3027,8 +3050,8 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps, return "xsfcease"; case INSN_CLASS_ZILSD: return "zilsd"; - case INSN_CLASS_ZCMLSD: - return "zcmlsd"; + case INSN_CLASS_ZCLSD: + return "zclsd"; default: rps->error_handler (_("internal: unreachable INSN_CLASS_*")); diff --git a/gas/testsuite/gas/riscv/march-fail-zclsd-01.d b/gas/testsuite/gas/riscv/march-fail-zclsd-01.d new file mode 100644 index 00000000000..003f26c14c7 --- /dev/null +++ b/gas/testsuite/gas/riscv/march-fail-zclsd-01.d @@ -0,0 +1,3 @@ +#as: -march=rv64i_zca_zclsd +#source: empty.s +#error_output: march-fail-zclsd-01.l \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/march-fail-zclsd-01.l b/gas/testsuite/gas/riscv/march-fail-zclsd-01.l new file mode 100644 index 00000000000..07d631da9b3 --- /dev/null +++ b/gas/testsuite/gas/riscv/march-fail-zclsd-01.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*Error: .*rv64 does not support the `zclsd' extension \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/march-fail-zclsd-02.d b/gas/testsuite/gas/riscv/march-fail-zclsd-02.d new file mode 100644 index 00000000000..91f3ce5d81a --- /dev/null +++ b/gas/testsuite/gas/riscv/march-fail-zclsd-02.d @@ -0,0 +1,3 @@ +#as: -march=rv32i_zcf_zclsd +#source: empty.s +#error_output: march-fail-zclsd-02.l \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/march-fail-zclsd-02.l b/gas/testsuite/gas/riscv/march-fail-zclsd-02.l new file mode 100644 index 00000000000..db5d57918e2 --- /dev/null +++ b/gas/testsuite/gas/riscv/march-fail-zclsd-02.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*Error: .*`zclsd' is conflict with the `c+f'/ `zcf' extension \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/march-fail-zilsd.d b/gas/testsuite/gas/riscv/march-fail-zilsd.d new file mode 100644 index 00000000000..49866d2a078 --- /dev/null +++ b/gas/testsuite/gas/riscv/march-fail-zilsd.d @@ -0,0 +1,3 @@ +#as: -march=rv64i_zilsd +#source: empty.s +#error_output: march-fail-zilsd.l \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/march-fail-zilsd.l b/gas/testsuite/gas/riscv/march-fail-zilsd.l new file mode 100644 index 00000000000..af8152fdf33 --- /dev/null +++ b/gas/testsuite/gas/riscv/march-fail-zilsd.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*Error: .*rv64 does not support the `zilsd' extension \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/zclsd.d b/gas/testsuite/gas/riscv/zclsd.d new file mode 100644 index 00000000000..3b17630842c --- /dev/null +++ b/gas/testsuite/gas/riscv/zclsd.d @@ -0,0 +1,13 @@ +#as: -march=rv32g_zca_zilsd_zclsd +#source: zclsd.s +#objdump: -dr -Mno-aliases + +.*:[ ]+file format .* + +Disassembly of section .text: + +0+000 : +[ ]+[0-9a-f]+:[ ]+7218[ ]+c.ld[ ]+a4,32\(a2\) +[ ]+[0-9a-f]+:[ ]+f218[ ]+c.sd[ ]+a4,32\(a2\) +[ ]+[0-9a-f]+:[ ]+6222[ ]+c.ldsp[ ]+tp,8\(sp\) +[ ]+[0-9a-f]+:[ ]+e412[ ]+c.sdsp[ ]+tp,8\(sp\) \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/zclsd.s b/gas/testsuite/gas/riscv/zclsd.s new file mode 100644 index 00000000000..206170b90e1 --- /dev/null +++ b/gas/testsuite/gas/riscv/zclsd.s @@ -0,0 +1,6 @@ ++target: + c.ld a4, 32(a2) + c.sd a4, 32(a2) + c.ldsp x4, 8(x2) + c.sdsp x4, 8(x2) + \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/zilsd.d b/gas/testsuite/gas/riscv/zilsd.d new file mode 100644 index 00000000000..8d5aba659ba --- /dev/null +++ b/gas/testsuite/gas/riscv/zilsd.d @@ -0,0 +1,11 @@ +#as: -march=rv64g_zilsd +#source: zilsd.s +#objdump: -dr + +.*:[ ]+file format .* + +Disassembly of section .text: + +0+000 : +[ ]+[0-9a-f]+:[ ]+00053503[ ]+ld[ ]+a0,0\(a0\) +[ ]+[0-9a-f]+:[ ]+00a53023[ ]+sd[ ]+a0,0\(a0\) \ No newline at end of file diff --git a/gas/testsuite/gas/riscv/zilsd.s b/gas/testsuite/gas/riscv/zilsd.s new file mode 100644 index 00000000000..6adffcd01cc --- /dev/null +++ b/gas/testsuite/gas/riscv/zilsd.s @@ -0,0 +1,3 @@ +target: + ld a0, 0(a0) + sd a0, 0(a0) \ No newline at end of file diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h index 91f9a844bd4..52912a2c815 100644 --- a/include/opcode/riscv.h +++ b/include/opcode/riscv.h @@ -517,7 +517,7 @@ enum riscv_insn_class INSN_CLASS_XSFVCP, INSN_CLASS_XSFCEASE, INSN_CLASS_ZILSD, - INSN_CLASS_ZCMLSD, + INSN_CLASS_ZCLSD, }; /* This structure holds information for a particular instruction. */ diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c index 1c712d0d60c..4d481e615f5 100644 --- a/opcodes/riscv-opc.c +++ b/opcodes/riscv-opc.c @@ -562,16 +562,16 @@ const struct riscv_opcode riscv_opcodes[] = {"xor", 0, INSN_CLASS_I, "d,s,t", MATCH_XOR, MASK_XOR, match_opcode, 0 }, {"lwu", 64, INSN_CLASS_I, "d,o(s)", MATCH_LWU, MASK_LWU, match_opcode, INSN_DREF|INSN_4_BYTE }, {"lwu", 64, INSN_CLASS_I, "d,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, -{"ld", 32, INSN_CLASS_ZCMLSD, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"ld", 32, INSN_CLASS_ZCMLSD, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"ld", 32, INSN_CLASS_ZCLSD, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"ld", 32, INSN_CLASS_ZCLSD, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, {"ld", 32, INSN_CLASS_ZILSD, "Gd,o(s)", MATCH_LD, MASK_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"ld", 32, INSN_CLASS_ZILSD, "Gd,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, {"ld", 64, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, {"ld", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, {"ld", 64, INSN_CLASS_I, "d,o(s)", MATCH_LD, MASK_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"ld", 64, INSN_CLASS_I, "d,A", 0, (int) M_Lx, match_rd_nonzero, INSN_MACRO }, -{"sd", 32, INSN_CLASS_ZCMLSD, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, -{"sd", 32, INSN_CLASS_ZCMLSD, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"sd", 32, INSN_CLASS_ZCLSD, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, +{"sd", 32, INSN_CLASS_ZCLSD, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, {"sd", 32, INSN_CLASS_ZILSD, "Gt,q(s)", MATCH_SD, MASK_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"sd", 32, INSN_CLASS_ZILSD, "Gt,A,s", 0, (int) M_Sx_FSx, match_rs1_nonzero, INSN_MACRO }, {"sd", 64, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS|INSN_DREF|INSN_8_BYTE }, @@ -1101,13 +1101,13 @@ const struct riscv_opcode riscv_opcodes[] = {"c.addiw", 64, INSN_CLASS_C, "d,Co", MATCH_C_ADDIW, MASK_C_ADDIW, match_rd_nonzero, 0 }, {"c.addw", 64, INSN_CLASS_C, "Cs,Ct", MATCH_C_ADDW, MASK_C_ADDW, match_opcode, 0 }, {"c.subw", 64, INSN_CLASS_C, "Cs,Ct", MATCH_C_SUBW, MASK_C_SUBW, match_opcode, 0 }, -{"c.ldsp", 32, INSN_CLASS_ZCMLSD, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_DREF|INSN_8_BYTE }, +{"c.ldsp", 32, INSN_CLASS_ZCLSD, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_DREF|INSN_8_BYTE }, {"c.ldsp", 64, INSN_CLASS_C, "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_DREF|INSN_8_BYTE }, -{"c.ld", 32, INSN_CLASS_ZCMLSD, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.ld", 32, INSN_CLASS_ZCLSD, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.ld", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"c.sdsp", 32, INSN_CLASS_ZCMLSD, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.sdsp", 32, INSN_CLASS_ZCLSD, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.sdsp", 64, INSN_CLASS_C, "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, -{"c.sd", 32, INSN_CLASS_ZCMLSD, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, +{"c.sd", 32, INSN_CLASS_ZCLSD, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.sd", 64, INSN_CLASS_C, "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.fldsp", 0, INSN_CLASS_D_AND_C, "D,Cn(Cc)", MATCH_C_FLDSP, MASK_C_FLDSP, match_opcode, INSN_DREF|INSN_8_BYTE }, {"c.fld", 0, INSN_CLASS_D_AND_C, "CD,Cl(Cs)", MATCH_C_FLD, MASK_C_FLD, match_opcode, INSN_DREF|INSN_8_BYTE },