]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - bfd/elfxx-riscv.c
Revert "2.41 Release sources"
[thirdparty/binutils-gdb.git] / bfd / elfxx-riscv.c
index b34898af8c98c3ee559e9c3126aa70180b653d72..ba5165766b2b149bd82e065fec64d870ddc7a695 100644 (file)
@@ -1132,6 +1132,8 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] =
   {"zvl256b", "zvl128b",       check_implicit_always},
   {"zvl128b", "zvl64b",                check_implicit_always},
   {"zvl64b", "zvl32b",         check_implicit_always},
+  {"zcd", "d",         check_implicit_always},
+  {"zcf", "f",         check_implicit_always},
   {"zfa", "f",         check_implicit_always},
   {"d", "f",           check_implicit_always},
   {"zfh", "zfhmin",    check_implicit_always},
@@ -1173,6 +1175,9 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] =
   {"zvksg", "zvkg",    check_implicit_always},
   {"zvksc", "zvks",    check_implicit_always},
   {"zvksc", "zvbc",    check_implicit_always},
+  {"zcf", "zca",       check_implicit_always},
+  {"zcd", "zca",       check_implicit_always},
+  {"zcb", "zca",       check_implicit_always},
   {"smaia", "ssaia",           check_implicit_always},
   {"smstateen", "ssstateen",   check_implicit_always},
   {"smepmp", "zicsr",          check_implicit_always},
@@ -1307,6 +1312,10 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] =
   {"zvl32768b",                ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zvl65536b",                ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"ztso",             ISA_SPEC_CLASS_DRAFT,           0, 1,  0 },
+  {"zca",              ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
+  {"zcb",              ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
+  {"zcf",              ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
+  {"zcd",              ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {NULL, 0, 0, 0, 0}
 };
 
@@ -1942,6 +1951,13 @@ riscv_parse_check_conflicts (riscv_parse_subset_t *rps)
       rps->error_handler (_("rv%d does not support the `q' extension"), xlen);
       no_conflict = false;
     }
+  if (riscv_lookup_subset (rps->subset_list, "zcf", &subset)
+      && xlen > 32)
+    {
+      rps->error_handler
+       (_("rv%d does not support the `zcf' extension"), xlen);
+      no_conflict = false;
+    }
   if (riscv_lookup_subset (rps->subset_list, "zfinx", &subset)
       && riscv_lookup_subset (rps->subset_list, "f", &subset))
     {
@@ -2387,13 +2403,16 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps,
     case INSN_CLASS_Q:
       return riscv_subset_supports (rps, "q");
     case INSN_CLASS_C:
-      return riscv_subset_supports (rps, "c");
+      return (riscv_subset_supports (rps, "c")
+             || riscv_subset_supports (rps, "zca"));
     case INSN_CLASS_F_AND_C:
       return (riscv_subset_supports (rps, "f")
-             && riscv_subset_supports (rps, "c"));
+             && (riscv_subset_supports (rps, "c")
+                 || riscv_subset_supports (rps, "zcf")));
     case INSN_CLASS_D_AND_C:
       return (riscv_subset_supports (rps, "d")
-             && riscv_subset_supports (rps, "c"));
+             && (riscv_subset_supports (rps, "c")
+                 || riscv_subset_supports (rps, "zcd")));
     case INSN_CLASS_F_INX:
       return (riscv_subset_supports (rps, "f")
              || riscv_subset_supports (rps, "zfinx"));
@@ -2482,10 +2501,6 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps,
       return riscv_subset_supports (rps, "zvkg");
     case INSN_CLASS_ZVKNED:
       return riscv_subset_supports (rps, "zvkned");
-    case INSN_CLASS_ZVKNHA:
-      return riscv_subset_supports (rps, "zvknha");
-    case INSN_CLASS_ZVKNHB:
-      return riscv_subset_supports (rps, "zvknhb");
     case INSN_CLASS_ZVKNHA_OR_ZVKNHB:
       return (riscv_subset_supports (rps, "zvknha")
              || riscv_subset_supports (rps, "zvknhb"));
@@ -2493,6 +2508,17 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps,
       return riscv_subset_supports (rps, "zvksed");
     case INSN_CLASS_ZVKSH:
       return riscv_subset_supports (rps, "zvksh");
+    case INSN_CLASS_ZCB:
+      return riscv_subset_supports (rps, "zcb");
+    case INSN_CLASS_ZCB_AND_ZBB:
+      return (riscv_subset_supports (rps, "zcb")
+             && riscv_subset_supports (rps, "zbb"));
+    case INSN_CLASS_ZCB_AND_ZBA:
+      return (riscv_subset_supports (rps, "zcb")
+             && riscv_subset_supports (rps, "zba"));
+    case INSN_CLASS_ZCB_AND_ZMMUL:
+      return (riscv_subset_supports (rps, "zcb")
+             && riscv_subset_supports (rps, "zmmul"));
     case INSN_CLASS_SVINVAL:
       return riscv_subset_supports (rps, "svinval");
     case INSN_CLASS_H:
@@ -2572,21 +2598,27 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
     case INSN_CLASS_C:
       return "c";
     case INSN_CLASS_F_AND_C:
-      if (!riscv_subset_supports (rps, "f")
-         && !riscv_subset_supports (rps, "c"))
-       return _("f' and `c");
-      else if (!riscv_subset_supports (rps, "f"))
-       return "f";
+      if (!riscv_subset_supports (rps, "f"))
+       {
+         if (!riscv_subset_supports (rps, "c")
+             && !riscv_subset_supports (rps, "zcf"))
+           return _("f' and `c', or `f' and `zcf"); 
+         else
+           return "f";
+       }
       else
-       return "c";
+       return _("c' or `zcf");
     case INSN_CLASS_D_AND_C:
-      if (!riscv_subset_supports (rps, "d")
-         && !riscv_subset_supports (rps, "c"))
-       return _("d' and `c");
-      else if (!riscv_subset_supports (rps, "d"))
-       return "d";
+      if (!riscv_subset_supports (rps, "d"))
+       {
+         if (!riscv_subset_supports (rps, "c")
+             && !riscv_subset_supports (rps, "zcd"))
+           return _("d' and `c', or `d' and `zcd");
+         else
+           return "d";
+       }
       else
-       return "c";
+       return _("c' or `zcd");
     case INSN_CLASS_F_INX:
       return _("f' or `zfinx");
     case INSN_CLASS_D_INX:
@@ -2689,14 +2721,20 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
       return _("zvkg");
     case INSN_CLASS_ZVKNED:
       return _("zvkned");
-    case INSN_CLASS_ZVKNHA:
-      return _("zvknha");
-    case INSN_CLASS_ZVKNHB:
-      return _("zvknhb");
+    case INSN_CLASS_ZVKNHA_OR_ZVKNHB:
+      return _("zvknha' or `zvknhb");
     case INSN_CLASS_ZVKSED:
       return _("zvksed");
     case INSN_CLASS_ZVKSH:
       return _("zvksh");
+    case INSN_CLASS_ZCB:
+      return "zcb";
+    case INSN_CLASS_ZCB_AND_ZBA:
+      return _("zcb' and `zba");
+    case INSN_CLASS_ZCB_AND_ZBB:
+      return _("zcb' and `zbb");
+    case INSN_CLASS_ZCB_AND_ZMMUL:
+      return _("zcb' and `zmmul', or `zcb' and `m");
     case INSN_CLASS_SVINVAL:
       return "svinval";
     case INSN_CLASS_H: