Automatic date update in version.in
[binutils-gdb.git] / bfd / elfxx-riscv.c
index b34898af8c98c3ee559e9c3126aa70180b653d72..c070394a36671aae0b033292adeac80b90f6477c 100644 (file)
@@ -1110,6 +1110,9 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] =
   {"v", "d",           check_implicit_always},
   {"v", "zve64d",      check_implicit_always},
   {"v", "zvl128b",     check_implicit_always},
+  {"zvfh", "zvfhmin",  check_implicit_always},
+  {"zvfh", "zfhmin",   check_implicit_always},
+  {"zvfhmin", "zve32f",        check_implicit_always},
   {"zve64d", "d",      check_implicit_always},
   {"zve64d", "zve64f", check_implicit_always},
   {"zve64f", "zve32f", check_implicit_always},
@@ -1121,6 +1124,7 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] =
   {"zve64x", "zve32x", check_implicit_always},
   {"zve64x", "zvl64b", check_implicit_always},
   {"zve32x", "zvl32b", check_implicit_always},
+  {"zve32x", "zicsr",  check_implicit_always},
   {"zvl65536b", "zvl32768b",   check_implicit_always},
   {"zvl32768b", "zvl16384b",   check_implicit_always},
   {"zvl16384b", "zvl8192b",    check_implicit_always},
@@ -1132,6 +1136,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,13 +1179,18 @@ 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},
+  {"smcntrpmf", "zicsr",       check_implicit_always},
   {"smstateen", "ssstateen",   check_implicit_always},
   {"smepmp", "zicsr",          check_implicit_always},
   {"ssaia", "zicsr",           check_implicit_always},
   {"sscofpmf", "zicsr",                check_implicit_always},
   {"ssstateen", "zicsr",       check_implicit_always},
   {"sstc", "zicsr",            check_implicit_always},
+  {"svadu", "zicsr",           check_implicit_always},
   {NULL, NULL, NULL}
 };
 
@@ -1245,6 +1256,7 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] =
   {"zicsr",            ISA_SPEC_CLASS_20190608,        2, 0,  0 },
   {"zifencei",         ISA_SPEC_CLASS_20191213,        2, 0,  0 },
   {"zifencei",         ISA_SPEC_CLASS_20190608,        2, 0,  0 },
+  {"zihintntl",                ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zihintpause",      ISA_SPEC_CLASS_DRAFT,           2, 0,  0 },
   {"zmmul",            ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zawrs",            ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
@@ -1275,12 +1287,13 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] =
   {"zkt",              ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zve32x",           ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zve32f",           ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
-  {"zve32d",           ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zve64x",           ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zve64f",           ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zve64d",           ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zvbb",             ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zvbc",             ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
+  {"zvfh",             ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
+  {"zvfhmin",          ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zvkg",             ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zvkn",             ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zvkng",            ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
@@ -1306,19 +1319,25 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] =
   {"zvl16384b",                ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zvl32768b",                ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
   {"zvl65536b",                ISA_SPEC_CLASS_DRAFT,           1, 0,  0 },
-  {"ztso",             ISA_SPEC_CLASS_DRAFT,           0, 1,  0 },
+  {"ztso",             ISA_SPEC_CLASS_DRAFT,           1, 0,  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}
 };
 
 static struct riscv_supported_ext riscv_supported_std_s_ext[] =
 {
   {"smaia",            ISA_SPEC_CLASS_DRAFT,           1, 0, 0 },
+  {"smcntrpmf",                ISA_SPEC_CLASS_DRAFT,           1, 0, 0 },
   {"smepmp",           ISA_SPEC_CLASS_DRAFT,           1, 0, 0 },
   {"smstateen",                ISA_SPEC_CLASS_DRAFT,           1, 0, 0 },
   {"ssaia",            ISA_SPEC_CLASS_DRAFT,           1, 0, 0 },
   {"sscofpmf",         ISA_SPEC_CLASS_DRAFT,           1, 0, 0 },
   {"ssstateen",                ISA_SPEC_CLASS_DRAFT,           1, 0, 0 },
   {"sstc",             ISA_SPEC_CLASS_DRAFT,           1, 0, 0 },
+  {"svadu",            ISA_SPEC_CLASS_DRAFT,           1, 0, 0 },
   {"svinval",          ISA_SPEC_CLASS_DRAFT,           1, 0, 0 },
   {"svnapot",          ISA_SPEC_CLASS_DRAFT,           1, 0, 0 },
   {"svpbmt",           ISA_SPEC_CLASS_DRAFT,           1, 0, 0 },
@@ -1344,7 +1363,6 @@ static struct riscv_supported_ext riscv_supported_vendor_x_ext[] =
   {"xtheadmemidx",     ISA_SPEC_CLASS_DRAFT,   1, 0, 0 },
   {"xtheadmempair",    ISA_SPEC_CLASS_DRAFT,   1, 0, 0 },
   {"xtheadsync",       ISA_SPEC_CLASS_DRAFT,   1, 0, 0 },
-  /* XVentanaCondOps: https://github.com/ventanamicro/ventana-custom-extensions/releases/download/v1.0.0/ventana-custom-extensions-v1.0.0.pdf */
   {"xventanacondops",  ISA_SPEC_CLASS_DRAFT,   1, 0, 0 },
   {NULL, 0, 0, 0, 0}
 };
@@ -1927,11 +1945,11 @@ riscv_parse_check_conflicts (riscv_parse_subset_t *rps)
   int xlen = *rps->xlen;
   bool no_conflict = true;
 
-  if (riscv_lookup_subset (rps->subset_list, "e", &subset)
-      && xlen > 32)
+  if (riscv_subset_supports (rps, "e")
+      && riscv_subset_supports (rps, "h"))
     {
       rps->error_handler
-       (_("rv%d does not support the `e' extension"), xlen);
+       (_("rv%de does not support the `h' extension"), xlen);
       no_conflict = false;
     }
   if (riscv_lookup_subset (rps->subset_list, "q", &subset)
@@ -1942,6 +1960,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))
     {
@@ -2370,6 +2395,12 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps,
       return riscv_subset_supports (rps, "zicsr");
     case INSN_CLASS_ZIFENCEI:
       return riscv_subset_supports (rps, "zifencei");
+    case INSN_CLASS_ZIHINTNTL:
+      return riscv_subset_supports (rps, "zihintntl");
+    case INSN_CLASS_ZIHINTNTL_AND_C:
+      return (riscv_subset_supports (rps, "zihintntl")
+             && (riscv_subset_supports (rps, "c")
+                 || riscv_subset_supports (rps, "zca")));
     case INSN_CLASS_ZIHINTPAUSE:
       return riscv_subset_supports (rps, "zihintpause");
     case INSN_CLASS_M:
@@ -2387,13 +2418,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"));
@@ -2432,6 +2466,10 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps,
     case INSN_CLASS_ZFH_AND_ZFA:
       return riscv_subset_supports (rps, "zfh")
             && riscv_subset_supports (rps, "zfa");
+    case INSN_CLASS_ZFH_OR_ZVFH_AND_ZFA:
+      return (riscv_subset_supports (rps, "zfh")
+             || riscv_subset_supports (rps, "zvfh"))
+            && riscv_subset_supports (rps, "zfa");
     case INSN_CLASS_ZBA:
       return riscv_subset_supports (rps, "zba");
     case INSN_CLASS_ZBB:
@@ -2482,10 +2520,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 +2527,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:
@@ -2553,6 +2598,19 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
       return "zicsr";
     case INSN_CLASS_ZIFENCEI:
       return "zifencei";
+    case INSN_CLASS_ZIHINTNTL:
+      return "zihintntl";
+    case INSN_CLASS_ZIHINTNTL_AND_C:
+      if (!riscv_subset_supports (rps, "zihintntl"))
+       {
+         if (!riscv_subset_supports (rps, "c")
+             && !riscv_subset_supports (rps, "zca"))
+           return _("zihintntl' and `c', or `zihintntl' and `zca");
+         else
+           return "zihintntl";
+       }
+      else
+       return _("c' or `zca");
     case INSN_CLASS_ZIHINTPAUSE:
       return "zihintpause";
     case INSN_CLASS_M:
@@ -2570,23 +2628,29 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
     case INSN_CLASS_Q:
       return "q";
     case INSN_CLASS_C:
-      return "c";
+      return _("c' or `zca");
     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:
@@ -2647,6 +2711,17 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
        return "zfh";
       else
        return "zfa";
+    case INSN_CLASS_ZFH_OR_ZVFH_AND_ZFA:
+      if (!riscv_subset_supports (rps, "zfa"))
+       {
+         if (!riscv_subset_supports (rps, "zfh")
+             && !riscv_subset_supports (rps, "zvfh"))
+           return _("zfh' and `zfa', or `zvfh' and `zfa");
+         else
+           return "zfa";
+       }
+      else
+       return _("zfh' or `zvfh");
     case INSN_CLASS_ZBA:
       return "zba";
     case INSN_CLASS_ZBB:
@@ -2689,14 +2764,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: