aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Carlotti <andrew.carlotti@arm.com>2024-05-10 13:34:34 +0100
committerAndrew Carlotti <andrew.carlotti@arm.com>2024-07-24 16:54:53 +0100
commit129b40529e906f423f008b484206ef6edeb21f42 (patch)
tree5bd57fbe81cc57bd328cbd61b4b52ae818d2cdb4
parent181fdad106c353529850b3af7687a1b9b7509b0b (diff)
downloadgcc-129b40529e906f423f008b484206ef6edeb21f42.zip
gcc-129b40529e906f423f008b484206ef6edeb21f42.tar.gz
gcc-129b40529e906f423f008b484206ef6edeb21f42.tar.bz2
aarch64: Extend aarch64_feature_flags to 128 bits
Replace the existing uint64_t typedef with a bbitmap<2> typedef. Most of the preparatory work was carried out in previous commits, so this patch itself is fairly small. gcc/ChangeLog: * common/config/aarch64/aarch64-common.cc (aarch64_set_asm_isa_flags): Store a second uint64_t value. * config/aarch64/aarch64-opts.h (aarch64_feature_flags): Switch typedef to bbitmap<2>. * config/aarch64/aarch64.cc (aarch64_set_current_function): Extract isa mode from val[0]. * config/aarch64/aarch64.h (aarch64_get_asm_isa_flags): Load a second uint64_t value. (aarch64_get_isa_flags): Ditto. (aarch64_asm_isa_flags): Ditto. (aarch64_isa_flags): Ditto. (HANDLE): Use bbitmap<2>::from_index to initialise flags. (AARCH64_FL_ISA_MODES): Do arithmetic on integer type. (AARCH64_ISA_MODE): Extract value from bbitmap<2> array. * config/aarch64/aarch64.opt (aarch64_asm_isa_flags_1): New variable. (aarch64_isa_flags_1): Ditto.
-rw-r--r--gcc/common/config/aarch64/aarch64-common.cc12
-rw-r--r--gcc/config/aarch64/aarch64-opts.h6
-rw-r--r--gcc/config/aarch64/aarch64.cc6
-rw-r--r--gcc/config/aarch64/aarch64.h20
-rw-r--r--gcc/config/aarch64/aarch64.opt6
5 files changed, 33 insertions, 17 deletions
diff --git a/gcc/common/config/aarch64/aarch64-common.cc b/gcc/common/config/aarch64/aarch64-common.cc
index bd0770d..64b65b7 100644
--- a/gcc/common/config/aarch64/aarch64-common.cc
+++ b/gcc/common/config/aarch64/aarch64-common.cc
@@ -67,15 +67,19 @@ static const struct default_options aarch_option_optimization_table[] =
};
-/* Set OPTS->x_aarch64_asm_isa_flags_0 to FLAGS and update
- OPTS->x_aarch64_isa_flags_0 accordingly. */
+/* Set OPTS->x_aarch64_asm_isa_flags_<0..n> to FLAGS and update
+ OPTS->x_aarch64_isa_flags_<0..n> accordingly. */
void
aarch64_set_asm_isa_flags (gcc_options *opts, aarch64_feature_flags flags)
{
- opts->x_aarch64_asm_isa_flags_0 = flags;
+ opts->x_aarch64_asm_isa_flags_0 = flags.val[0];
+ opts->x_aarch64_asm_isa_flags_1 = flags.val[1];
+
if (opts->x_target_flags & MASK_GENERAL_REGS_ONLY)
flags &= ~feature_deps::get_flags_off (AARCH64_FL_FP);
- opts->x_aarch64_isa_flags_0 = flags;
+
+ opts->x_aarch64_isa_flags_0 = flags.val[0];
+ opts->x_aarch64_isa_flags_1 = flags.val[1];
}
/* Implement TARGET_HANDLE_OPTION.
diff --git a/gcc/config/aarch64/aarch64-opts.h b/gcc/config/aarch64/aarch64-opts.h
index 2c36bfa..80ec1a0 100644
--- a/gcc/config/aarch64/aarch64-opts.h
+++ b/gcc/config/aarch64/aarch64-opts.h
@@ -23,14 +23,16 @@
#define GCC_AARCH64_OPTS_H
#ifndef USED_FOR_TARGET
-typedef uint64_t aarch64_isa_mode;
+#include "bbitmap.h"
-typedef uint64_t aarch64_feature_flags;
+typedef uint64_t aarch64_isa_mode;
constexpr unsigned int AARCH64_NUM_ISA_MODES = (0
#define DEF_AARCH64_ISA_MODE(IDENT) + 1
#include "aarch64-isa-modes.def"
);
+
+typedef bbitmap<2> aarch64_feature_flags;
#endif
/* The various cores that implement AArch64. */
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 7c2af13..e0cf382 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -19119,7 +19119,7 @@ aarch64_set_current_function (tree fndecl)
aarch64_pragma_target_parse. */
if (old_tree == new_tree
&& (!fndecl || aarch64_previous_fndecl)
- && (aarch64_isa_mode) (isa_flags & AARCH64_FL_ISA_MODES) == new_isa_mode)
+ && (isa_flags & AARCH64_FL_ISA_MODES).val[0] == new_isa_mode)
{
gcc_assert (AARCH64_ISA_MODE == new_isa_mode);
return;
@@ -19134,11 +19134,11 @@ aarch64_set_current_function (tree fndecl)
/* The ISA mode can vary based on function type attributes and
function declaration attributes. Make sure that the target
options correctly reflect these attributes. */
- if ((aarch64_isa_mode) (isa_flags & AARCH64_FL_ISA_MODES) != new_isa_mode)
+ if ((isa_flags & AARCH64_FL_ISA_MODES).val[0] != new_isa_mode)
{
auto base_flags = (aarch64_asm_isa_flags & ~AARCH64_FL_ISA_MODES);
aarch64_set_asm_isa_flags (base_flags
- | (aarch64_feature_flags) new_isa_mode);
+ | aarch64_feature_flags (new_isa_mode));
aarch64_override_options_internal (&global_options);
new_tree = build_target_option_node (&global_options,
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
index 6310ebd..b7e3304 100644
--- a/gcc/config/aarch64/aarch64.h
+++ b/gcc/config/aarch64/aarch64.h
@@ -23,17 +23,21 @@
#define GCC_AARCH64_H
#define aarch64_get_asm_isa_flags(opts) \
- (aarch64_feature_flags ((opts)->x_aarch64_asm_isa_flags_0))
+ (aarch64_feature_flags ((opts)->x_aarch64_asm_isa_flags_0, \
+ (opts)->x_aarch64_asm_isa_flags_1))
#define aarch64_get_isa_flags(opts) \
- (aarch64_feature_flags ((opts)->x_aarch64_isa_flags_0))
+ (aarch64_feature_flags ((opts)->x_aarch64_isa_flags_0, \
+ (opts)->x_aarch64_isa_flags_1))
/* Make these flags read-only so that all uses go via
aarch64_set_asm_isa_flags. */
#ifdef GENERATOR_FILE
#undef aarch64_asm_isa_flags
-#define aarch64_asm_isa_flags (aarch64_feature_flags (aarch64_asm_isa_flags_0))
+#define aarch64_asm_isa_flags (aarch64_feature_flags (aarch64_asm_isa_flags_0,\
+ aarch64_asm_isa_flags_1))
#undef aarch64_isa_flags
-#define aarch64_isa_flags (aarch64_feature_flags (aarch64_isa_flags_0))
+#define aarch64_isa_flags (aarch64_feature_flags (aarch64_isa_flags_0, \
+ aarch64_isa_flags_1))
#else
#undef aarch64_asm_isa_flags
#define aarch64_asm_isa_flags (aarch64_get_asm_isa_flags (&global_options))
@@ -167,8 +171,8 @@ enum class aarch64_feature : unsigned char {
/* Define unique flags for each of the above. */
#define HANDLE(IDENT) \
- constexpr auto AARCH64_FL_##IDENT \
- = aarch64_feature_flags (1) << int (aarch64_feature::IDENT);
+ constexpr auto AARCH64_FL_##IDENT ATTRIBUTE_UNUSED \
+ = aarch64_feature_flags::from_index (int (aarch64_feature::IDENT));
#define DEF_AARCH64_ISA_MODE(IDENT) HANDLE (IDENT)
#define AARCH64_OPT_EXTENSION(A, IDENT, C, D, E, F) HANDLE (IDENT)
#define AARCH64_ARCH(A, B, IDENT, D, E) HANDLE (IDENT)
@@ -191,7 +195,7 @@ constexpr auto AARCH64_ISA_MODE_SM_STATE ATTRIBUTE_UNUSED
/* The mask of all ISA modes. */
constexpr auto AARCH64_FL_ISA_MODES
- = (aarch64_feature_flags (1) << AARCH64_NUM_ISA_MODES) - 1;
+ = aarch64_feature_flags ((1 << AARCH64_NUM_ISA_MODES) - 1);
/* The default ISA mode, for functions with no attributes that specify
something to the contrary. */
@@ -210,7 +214,7 @@ constexpr auto AARCH64_FL_DEFAULT_ISA_MODE ATTRIBUTE_UNUSED
#define AARCH64_HAVE_ISA(X) (bool (aarch64_isa_flags & AARCH64_FL_##X))
-#define AARCH64_ISA_MODE (aarch64_isa_mode) (aarch64_isa_flags & AARCH64_FL_ISA_MODES)
+#define AARCH64_ISA_MODE ((aarch64_isa_flags & AARCH64_FL_ISA_MODES).val[0])
/* The current function is a normal non-streaming function. */
#define TARGET_NON_STREAMING AARCH64_HAVE_ISA (SM_OFF)
diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt
index 45aab49..2f90f10 100644
--- a/gcc/config/aarch64/aarch64.opt
+++ b/gcc/config/aarch64/aarch64.opt
@@ -34,9 +34,15 @@ TargetVariable
uint64_t aarch64_asm_isa_flags_0 = 0
TargetVariable
+uint64_t aarch64_asm_isa_flags_1 = 0
+
+TargetVariable
uint64_t aarch64_isa_flags_0 = 0
TargetVariable
+uint64_t aarch64_isa_flags_1 = 0
+
+TargetVariable
unsigned aarch_enable_bti = 2
TargetVariable