]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Revert "Control extension availability with all arch bits"
authorThomas Preud'homme <thomas.preudhomme@arm.com>
Tue, 29 Mar 2016 17:09:50 +0000 (18:09 +0100)
committerThomas Preud'homme <thomas.preudhomme@arm.com>
Tue, 29 Mar 2016 18:44:05 +0000 (19:44 +0100)
This reverts commit 96f57b18abb56c7f7387055f814d828614f199c8.

gas/ChangeLog.arm
gas/config/tc-arm.c
include/opcode/ChangeLog.arm
include/opcode/arm.h

index 384d8fcd3c2b38ecd88725bb41a83038fd028988..6b05177640e822feba0aed2f9c128dac1dfeb045 100644 (file)
@@ -1,3 +1,20 @@
+2016-03-29  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       Revert
+       2015-12-17  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       * config/tc-arm.c
+       (struct arm_option_extension_value_table): Make allowed_archs an array
+       with 2 entries.
+       (ARM_EXT_OPT): Adapt to only fill the first entry of allowed_archs.
+       (ARM_EXT_OPT2): New macro filling the two entries of allowed_archs.
+       (arm_extensions): Use separate entries in allowed_archs when several
+       archs are allowed to use an extension and change ARCH_ANY in
+       ARM_ARCH_NONE in allowed_archs.
+       (arm_parse_extension): Check that, for each allowed_archs entry, all
+       bits are set in the current architecture, ignoring ARM_ANY entries.
+       (s_arm_arch_extension): Likewise.
+
 2016-03-29  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        Revert
index 989b30b3edc4bc071c9e121e44e24df94180c584..6f072e37490091bceaccfea0e3d6fbe40a64907f 100644 (file)
@@ -24949,16 +24949,12 @@ struct arm_option_extension_value_table
   size_t name_len;
   const arm_feature_set merge_value;
   const arm_feature_set clear_value;
-  /* List of architectures for which an extension is available.  ARM_ARCH_NONE
-     indicates that an extension is available for all architectures while
-     ARM_ANY marks an empty entry.  */
-  const arm_feature_set allowed_archs[2];
+  const arm_feature_set allowed_archs;
 };
 
 /* The following table must be in alphabetical order with a NULL last entry.
    */
-#define ARM_EXT_OPT(N, M, C, AA) { N, sizeof (N) - 1, M, C, { AA, ARM_ANY } }
-#define ARM_EXT_OPT2(N, M, C, AA1, AA2) { N, sizeof (N) - 1, M, C, {AA1, AA2} }
+#define ARM_EXT_OPT(N, M, C, AA) { N, sizeof (N) - 1, M, C, AA }
 static const struct arm_option_extension_value_table arm_extensions[] =
 {
   ARM_EXT_OPT ("crc",  ARCH_CRC_ARMV8, ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
@@ -24968,20 +24964,18 @@ static const struct arm_option_extension_value_table arm_extensions[] =
                                   ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
   ARM_EXT_OPT ("fp",     FPU_ARCH_VFP_ARMV8, ARM_FEATURE_COPROC (FPU_VFP_ARMV8),
                                   ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
-  ARM_EXT_OPT2 ("idiv",        ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV | ARM_EXT_DIV),
+  ARM_EXT_OPT ("idiv", ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV | ARM_EXT_DIV),
                        ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV | ARM_EXT_DIV),
-                       ARM_FEATURE_CORE_LOW (ARM_EXT_V7A),
-                       ARM_FEATURE_CORE_LOW (ARM_EXT_V7R)),
+                                  ARM_FEATURE_CORE_LOW (ARM_EXT_V7A | ARM_EXT_V7R)),
   ARM_EXT_OPT ("iwmmxt",ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT),
-                       ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT), ARM_ARCH_NONE),
+                       ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT), ARM_ANY),
   ARM_EXT_OPT ("iwmmxt2", ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT2),
-                       ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT2), ARM_ARCH_NONE),
+                       ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT2), ARM_ANY),
   ARM_EXT_OPT ("maverick", ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
-                       ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), ARM_ARCH_NONE),
-  ARM_EXT_OPT2 ("mp",  ARM_FEATURE_CORE_LOW (ARM_EXT_MP),
+                       ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), ARM_ANY),
+  ARM_EXT_OPT ("mp",   ARM_FEATURE_CORE_LOW (ARM_EXT_MP),
                        ARM_FEATURE_CORE_LOW (ARM_EXT_MP),
-                       ARM_FEATURE_CORE_LOW (ARM_EXT_V7A),
-                       ARM_FEATURE_CORE_LOW (ARM_EXT_V7R)),
+                                  ARM_FEATURE_CORE_LOW (ARM_EXT_V7A | ARM_EXT_V7R)),
   ARM_EXT_OPT ("simd",   FPU_ARCH_NEON_VFP_ARMV8,
                        ARM_FEATURE_COPROC (FPU_NEON_ARMV8),
                                   ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
@@ -24991,10 +24985,9 @@ static const struct arm_option_extension_value_table arm_extensions[] =
   ARM_EXT_OPT ("pan",  ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN),
                        ARM_FEATURE (ARM_EXT_V8, ARM_EXT2_PAN, 0),
                        ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
-  ARM_EXT_OPT2 ("sec", ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
+  ARM_EXT_OPT ("sec",  ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
                        ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
-                       ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
-                       ARM_FEATURE_CORE_LOW (ARM_EXT_V7A)),
+                                  ARM_FEATURE_CORE_LOW (ARM_EXT_V6K | ARM_EXT_V7A)),
   ARM_EXT_OPT ("virt", ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT | ARM_EXT_ADIV
                                     | ARM_EXT_DIV),
                        ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT),
@@ -25003,8 +24996,8 @@ static const struct arm_option_extension_value_table arm_extensions[] =
                        ARM_FEATURE_COPROC (FPU_NEON_ARMV8 | FPU_NEON_EXT_RDMA),
                                   ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
   ARM_EXT_OPT ("xscale",ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
-                       ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), ARM_ARCH_NONE),
-  { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, { ARM_ARCH_NONE, ARM_ARCH_NONE } }
+                       ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), ARM_ANY),
+  { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, ARM_ARCH_NONE }
 };
 #undef ARM_EXT_OPT
 
@@ -25111,7 +25104,6 @@ arm_parse_extension (char *str, const arm_feature_set **opt_p)
      or removing it (0) and only allowing it to change in the order
      -1 -> 1 -> 0.  */
   const struct arm_option_extension_value_table * opt = NULL;
-  const arm_feature_set arm_any = ARM_ANY;
   int adding_value = -1;
 
   /* Copy the feature set, so that we can modify it.  */
@@ -25176,18 +25168,8 @@ arm_parse_extension (char *str, const arm_feature_set **opt_p)
       for (; opt->name != NULL; opt++)
        if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
          {
-           int i, nb_allowed_archs =
-             sizeof (opt->allowed_archs) / sizeof (opt->allowed_archs[0]);
            /* Check we can apply the extension to this architecture.  */
-           for (i = 0; i < nb_allowed_archs; i++)
-             {
-               /* Empty entry.  */
-               if (ARM_FEATURE_EQUAL (opt->allowed_archs[i], arm_any))
-                 continue;
-               if (ARM_FSET_CPU_SUBSET (opt->allowed_archs[i], *ext_set))
-                 break;
-             }
-           if (i == nb_allowed_archs)
+           if (!ARM_CPU_HAS_FEATURE (*ext_set, opt->allowed_archs))
              {
                as_bad (_("extension does not apply to the base architecture"));
                return FALSE;
@@ -25941,7 +25923,6 @@ static void
 s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
 {
   const struct arm_option_extension_value_table *opt;
-  const arm_feature_set arm_any = ARM_ANY;
   char saved_char;
   char *name;
   int adding_value = 1;
@@ -25962,18 +25943,7 @@ s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
   for (opt = arm_extensions; opt->name != NULL; opt++)
     if (streq (opt->name, name))
       {
-       int i, nb_allowed_archs =
-         sizeof (opt->allowed_archs) / sizeof (opt->allowed_archs[i]);
-       for (i = 0; i < nb_allowed_archs; i++)
-         {
-           /* Empty entry.  */
-           if (ARM_FEATURE_EQUAL (opt->allowed_archs[i], arm_any))
-             continue;
-           if (ARM_FSET_CPU_SUBSET (opt->allowed_archs[i], *mcpu_cpu_opt))
-             break;
-         }
-
-       if (i == nb_allowed_archs)
+       if (!ARM_CPU_HAS_FEATURE (*mcpu_cpu_opt, opt->allowed_archs))
          {
            as_bad (_("architectural extension `%s' is not allowed for the "
                      "current base architecture"), name);
index b9ccf39cc07dd5fbcdbc7e2d935315ff061f2867..69b56e23827e5c360f5860bf43fe1e770a1b89bd 100644 (file)
@@ -1,3 +1,11 @@
+2016-03-29  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       Revert
+       2015-12-17  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       * arm.h (ARM_CPU_HAS_FEATURE): Add comment.
+       (ARM_FSET_CPU_SUBSET): Define macro.
+
 2015-12-17  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * arm.h (ARM_CPU_HAS_FEATURE): Add comment.
index e9cde31768a0ea040b53b6785aa27eb8bb9c9ed5..f8b12a4a75ac1aad5e8c372bef9493bf9b39faaa 100644 (file)
@@ -316,18 +316,11 @@ typedef struct
   unsigned long coproc;
 } arm_feature_set;
 
-/* Returns whether one of the feature bits set in FEAT is also set in CPU.  */
 #define ARM_CPU_HAS_FEATURE(CPU,FEAT) \
   (((CPU).core[0] & (FEAT).core[0]) != 0 \
    || ((CPU).core[1] & (FEAT).core[1]) != 0 \
    || ((CPU).coproc & (FEAT).coproc) != 0)
 
-/* Tests whether the features of A are a subset of B.  */
-#define ARM_FSET_CPU_SUBSET(A,B) \
-  (((A).core[0] & (B).core[0]) == (A).core[0] \
-   && ((A).core[1] & (B).core[1]) == (A).core[1] \
-   && ((A).coproc & (B).coproc) == (A).coproc)
-
 #define ARM_CPU_IS_ANY(CPU) \
   ((CPU).core[0] == ((arm_feature_set)ARM_ANY).core[0] \
    && (CPU).core[1] == ((arm_feature_set)ARM_ANY).core[1])