From: Thomas Preud'homme Date: Tue, 29 Mar 2016 17:09:50 +0000 (+0100) Subject: Revert "Control extension availability with all arch bits" X-Git-Tag: users/ARM/embedded-binutils-2_26-branch-2016q1~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c48c191161297918176cb08e3042cfcbbf3fe142;p=thirdparty%2Fbinutils-gdb.git Revert "Control extension availability with all arch bits" This reverts commit 96f57b18abb56c7f7387055f814d828614f199c8. --- diff --git a/gas/ChangeLog.arm b/gas/ChangeLog.arm index 384d8fcd3c2..6b05177640e 100644 --- a/gas/ChangeLog.arm +++ b/gas/ChangeLog.arm @@ -1,3 +1,20 @@ +2016-03-29 Thomas Preud'homme + + Revert + 2015-12-17 Thomas Preud'homme + + * 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 Revert diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 989b30b3edc..6f072e37490 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -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); diff --git a/include/opcode/ChangeLog.arm b/include/opcode/ChangeLog.arm index b9ccf39cc07..69b56e23827 100644 --- a/include/opcode/ChangeLog.arm +++ b/include/opcode/ChangeLog.arm @@ -1,3 +1,11 @@ +2016-03-29 Thomas Preud'homme + + Revert + 2015-12-17 Thomas Preud'homme + + * arm.h (ARM_CPU_HAS_FEATURE): Add comment. + (ARM_FSET_CPU_SUBSET): Define macro. + 2015-12-17 Thomas Preud'homme * arm.h (ARM_CPU_HAS_FEATURE): Add comment. diff --git a/include/opcode/arm.h b/include/opcode/arm.h index e9cde31768a..f8b12a4a75a 100644 --- a/include/opcode/arm.h +++ b/include/opcode/arm.h @@ -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])