c_target_objs="aarch64-c.o"
cxx_target_objs="aarch64-c.o"
d_target_objs="aarch64-d.o"
- extra_objs="aarch64-builtins.o aarch-common.o aarch64-elf-metadata.o aarch64-sve-builtins.o aarch64-sve-builtins-shapes.o aarch64-sve-builtins-base.o aarch64-sve-builtins-sve2.o aarch64-sve-builtins-sme.o cortex-a57-fma-steering.o aarch64-speculation.o aarch-bti-insert.o aarch64-early-ra.o aarch64-ldp-fusion.o"
+ extra_objs="aarch64-builtins.o aarch-common.o aarch64-elf-metadata.o aarch64-sve-builtins.o aarch64-sve-builtins-shapes.o aarch64-sve-builtins-base.o aarch64-sve-builtins-sve2.o aarch64-sve-builtins-sme.o cortex-a57-fma-steering.o aarch64-speculation.o aarch-bti-insert.o aarch64-early-ra.o aarch64-ldp-fusion.o aarch64-sched-dispatch.o"
target_gtfiles="\$(srcdir)/config/aarch64/aarch64-protos.h \$(srcdir)/config/aarch64/aarch64-builtins.h \$(srcdir)/config/aarch64/aarch64-builtins.cc \$(srcdir)/config/aarch64/aarch64-sve-builtins.h \$(srcdir)/config/aarch64/aarch64-sve-builtins.cc"
target_has_targetm_common=yes
;;
/* Define models for the aarch64_ldp_stp_policy. */
enum aarch64_ldp_stp_policy ldp_policy_model, stp_policy_model;
+
+ /* Dispatch constraints for instruction scheduling. */
+ const struct dispatch_constraint_info *dispatch_constraints;
};
/* Classifies an address.
AARCH64_EXTRA_TUNE_index_END
};
+/* Dispatch constraints configuration for instruction scheduling. */
+struct dispatch_constraint_info
+{
+ const int *max_slots;
+ int num_constraints;
+ vec<std::pair<int, int>> (*callback) (rtx_insn *);
+};
+
#define AARCH64_EXTRA_TUNING_OPTION(x, name) \
AARCH64_EXTRA_TUNE_##name = (1u << AARCH64_EXTRA_TUNE_##name##_index),
--- /dev/null
+/* Dispatch scheduling hooks for AArch64.
+ Copyright The GNU Toolchain Authors.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GCC is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "backend.h"
+#include "rtl.h"
+#include "insn-attr.h"
+#include "insn-attr-common.h"
+#include "aarch64-protos.h"
+#include "aarch64-sched-dispatch.h"
+#include "regset.h"
+#include "sched-int.h"
+#include "dumpfile.h"
+#include "print-rtl.h"
+
+/* This file implements the target hooks for dispatch scheduling for AArch64.
+ Instructions are scheduled into the current dispatch window according to
+ dispatch constraints provided by the tuning model.
+
+ To enable dispatch scheduling for a core (see Neoverse V2 for an example):
+ - in the tuning model, add the AARCH64_EXTRA_TUNE_DISPATCH_SCHED tune flag
+ - in the tuning model, add an array of max slot counts for each constraint
+ and add its reference and length to the tune_params struct
+ - in the tuning model, add a callback function to determine slot requirements
+ - optionally, create a new instruction attribute to classify instructions
+ into dispatch groups (e.g. neoversev2_dispatch) */
+
+static dispatch_window *current_dispatch_window;
+
+/* Constructor for class dispatch_window. */
+dispatch_window::dispatch_window (const dispatch_constraint_info &constraint_info)
+ : m_max_slots (constraint_info.max_slots),
+ m_num_constraints (constraint_info.num_constraints),
+ m_callback (constraint_info.callback),
+ m_violation (false)
+{
+ m_free_slots = XNEWVEC (int, m_num_constraints);
+ reset_constraints ();
+}
+
+/* Destructor for class dispatch_window. */
+dispatch_window::~dispatch_window ()
+{
+ XDELETEVEC (m_free_slots);
+}
+
+/* Return TRUE iff the given constraints fit into the dispatch window. */
+bool
+dispatch_window::fits_window (rtx_insn *insn,
+ const vec<std::pair<int, int>> &constraints) const
+{
+ if (INSN_CODE (insn) < 0)
+ return true;
+
+ if (dump_file)
+ {
+ fprintf (dump_file, "Checking if insn fits into dispatch window:\n");
+ print_rtl_single (dump_file, insn);
+ }
+
+ for (const auto &constraint : constraints)
+ {
+ if (constraint.second > m_free_slots[constraint.first])
+ {
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, "Constraint %d needs %d slot(s), "
+ "only %d free.\n",
+ constraint.first, constraint.second,
+ m_free_slots[constraint.first]);
+ }
+ return false;
+ }
+ }
+ return true;
+}
+
+/* Get the constraints for an instruction. */
+vec<std::pair<int, int>>
+dispatch_window::get_constraints (rtx_insn *insn) const
+{
+ return m_callback (insn);
+}
+
+/* Add INSN to the dispatch window and set the violation flag
+ if there is a constraint violation. */
+void
+dispatch_window::add_insn_to_window (rtx_insn *insn)
+{
+ if (INSN_CODE (insn) < 0)
+ return;
+
+ auto constraints = m_callback (insn);
+
+ if (!fits_window (insn, constraints))
+ {
+ if (dump_file)
+ fprintf (dump_file, "Window full. Starting new dispatch window.\n");
+ reset_constraints ();
+ }
+
+ for (const auto &constraint : constraints)
+ {
+ m_free_slots[constraint.first] -= constraint.second;
+ if (m_free_slots[constraint.first] < 0)
+ m_violation = true;
+ }
+
+ if (dump_file)
+ {
+ fprintf (dump_file, "Insn added to dispatch window.\n");
+ if (dump_flags & TDF_DETAILS)
+ print_window (dump_file);
+ }
+}
+
+/* Return TRUE iff there is a dispatch violation, i.e. one of the dispatch
+ constraints has a negative number of free slots. */
+bool
+dispatch_window::has_violation () const
+{
+ return m_violation;
+}
+
+/* Print information about the dispatch window to the given FILE. */
+void
+dispatch_window::print_window (FILE *file) const
+{
+ fprintf (file, "==== Current dispatch window ====\n");
+ fprintf (file, "Violation: %s\n", m_violation ? "true" : "false");
+ for (int i = 0; i < m_num_constraints; i++)
+ {
+ fprintf (file, "Constraint %d: %d of %d slots free\n",
+ i, m_free_slots[i], m_max_slots[i]);
+ }
+ fprintf (file, "\n");
+}
+
+/* For all dispatch constraints, reset the number of free slots to the
+ maximum number of slots.
+ This is called when the next dispatch window is started. */
+void
+dispatch_window::reset_constraints ()
+{
+ for (int i = 0; i < m_num_constraints; i++)
+ m_free_slots[i] = m_max_slots[i];
+ m_violation = false;
+}
+
+/* Initialize the dispatch window using the constraints from the tuning model.
+ This is called once at the beginning of scheduling. */
+void
+init_dispatch_window (void)
+{
+ const struct dispatch_constraint_info *dispatch_constraints
+ = aarch64_tune_params.dispatch_constraints;
+ current_dispatch_window = new dispatch_window (*dispatch_constraints);
+
+ if (dump_file)
+ {
+ fprintf (dump_file, "DISPATCH WINDOW INITIALIZED\n");
+ if (dump_flags & TDF_DETAILS)
+ current_dispatch_window->print_window (dump_file);
+ }
+}
+
+/* The next two functions implement the dispatch-scheduling target hooks
+ for aarch64 and are the drivers of the dispatch scheduler. */
+void
+aarch64_sched_dispatch_do (rtx_insn *insn, int mode)
+{
+ if (mode == DISPATCH_INIT)
+ init_dispatch_window ();
+ else if (mode == ADD_TO_DISPATCH_WINDOW && current_dispatch_window)
+ current_dispatch_window->add_insn_to_window (insn);
+}
+
+bool
+aarch64_sched_dispatch (rtx_insn *insn, int action)
+{
+ /* We only want dispatch scheduling to be enabled during the last
+ scheduling pass, i.e. after reload and sched_fusion. */
+ if ((aarch64_tune_params.extra_tuning_flags
+ & AARCH64_EXTRA_TUNE_DISPATCH_SCHED)
+ && reload_completed && !sched_fusion)
+ switch (action)
+ {
+ case IS_DISPATCH_ON:
+ return true;
+
+ /* IS_CMP may be used to delay scheduling of flag setting instructions
+ to keep them close to their consumers, e.g. branches at the end of a BB.
+ However, we don't want to delay scheduling of flag setting instructions,
+ because many consumers are not branches. */
+ case IS_CMP:
+ return false;
+
+ case DISPATCH_VIOLATION:
+ return current_dispatch_window->has_violation ();
+
+ case FITS_DISPATCH_WINDOW:
+ {
+ auto constraints = current_dispatch_window->get_constraints (insn);
+ return current_dispatch_window->fits_window (insn, constraints);
+ }
+
+ default:
+ return false;
+ }
+ return false;
+}
\ No newline at end of file
--- /dev/null
+/* Dispatch scheduling hooks for AArch64.
+ Copyright The GNU Toolchain Authors.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GCC is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef GCC_AARCH64_SCHED_DISPATCH_H
+#define GCC_AARCH64_SCHED_DISPATCH_H
+
+void aarch64_sched_dispatch_do (rtx_insn *, int);
+bool aarch64_sched_dispatch (rtx_insn *, int);
+
+/* Describes a dispatch window and keeps track of the dispatch constraints.
+ The constraints are represented as array of slot counts, where each
+ index corresponds to a dispatch constraint type. */
+class dispatch_window
+{
+public:
+ dispatch_window (const dispatch_constraint_info &constraint_info);
+ ~dispatch_window ();
+
+ bool fits_window (rtx_insn *insn,
+ const vec<std::pair<int, int>> &constraints) const;
+ vec<std::pair<int, int>> get_constraints (rtx_insn *) const;
+ void add_insn_to_window (rtx_insn *);
+ bool has_violation () const;
+ void print_window (FILE *) const;
+
+private:
+ void reset_constraints ();
+
+ const int *m_max_slots;
+ int *m_free_slots;
+ const int m_num_constraints;
+ vec<std::pair<int, int>> (*const m_callback) (rtx_insn *);
+ bool m_violation;
+};
+
+#endif /* GCC_AARCH64_SCHED_DISPATCH_H */
#define AARCH64_EXTRA_TUNE_BASE (AARCH64_EXTRA_TUNE_CHEAP_SHIFT_EXTEND \
| AARCH64_EXTRA_TUNE_FULLY_PIPELINED_FMA)
+/* Enables dispatch scheduling. */
+AARCH64_EXTRA_TUNING_OPTION ("dispatch_sched", DISPATCH_SCHED)
+
#undef AARCH64_EXTRA_TUNING_OPTION
#include "ipa-prop.h"
#include "ipa-fnsummary.h"
#include "hash-map.h"
+#include "aarch64-sched-dispatch.h"
/* This file should be included last. */
#include "target-def.h"
SET_OPTION_IF_UNSET (opts, &global_options_set, param_fully_pipelined_fma,
1);
+ /* If dispatch scheduling is enabled, the dispatch_constraints in the
+ tune_params struct must be defined. */
+ if (aarch64_tune_params.extra_tuning_flags
+ & AARCH64_EXTRA_TUNE_DISPATCH_SCHED)
+ gcc_assert (aarch64_tune_params.dispatch_constraints != NULL);
+
/* TODO: SME codegen without SVE2 is not supported, once this support is added
remove this 'sorry' and the implicit enablement of SVE2 in the checks for
streaming mode above in this function. */
#undef TARGET_SCHED_REASSOCIATION_WIDTH
#define TARGET_SCHED_REASSOCIATION_WIDTH aarch64_reassociation_width
+#undef TARGET_SCHED_DISPATCH
+#define TARGET_SCHED_DISPATCH aarch64_sched_dispatch
+
+#undef TARGET_SCHED_DISPATCH_DO
+#define TARGET_SCHED_DISPATCH_DO aarch64_sched_dispatch_do
+
#undef TARGET_DWARF_FRAME_REG_MODE
#define TARGET_DWARF_FRAME_REG_MODE aarch64_dwarf_frame_reg_mode
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
$(srcdir)/config/aarch64/aarch64-ldp-fusion.cc
+aarch64-sched-dispatch.o: $(srcdir)/config/aarch64/aarch64-sched-dispatch.cc \
+ $(CONFIG_H) $(SYSTEM_H) $(CORETYPES_H) $(BACKEND_H) $(RTL_H) \
+ $(INSN_ATTR_H) $(REGSET_H) sched-int.h $(DUMPFILE_H) \
+ $(srcdir)/config/aarch64/aarch64-protos.h \
+ $(srcdir)/config/aarch64/aarch64-sched-dispatch.h
+ $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ $(srcdir)/config/aarch64/aarch64-sched-dispatch.cc
+
comma=,
MULTILIB_OPTIONS = $(subst $(comma),/, $(patsubst %, mabi=%, $(subst $(comma),$(comma)mabi=,$(TM_MULTILIB_CONFIG))))
MULTILIB_DIRNAMES = $(subst $(comma), ,$(TM_MULTILIB_CONFIG))
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&a64fx_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_A64FX. */
| AARCH64_EXTRA_TUNE_FULLY_PIPELINED_FMA), /* tune_flags. */
&ere1_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALIGNED, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALIGNED /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALIGNED, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_AMPERE1. */
| AARCH64_EXTRA_TUNE_FULLY_PIPELINED_FMA), /* tune_flags. */
&ere1_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALIGNED, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALIGNED /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALIGNED, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_AMPERE1A. */
| AARCH64_EXTRA_TUNE_AVOID_CROSS_LOOP_FMA), /* tune_flags. */
&ere1b_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALIGNED, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALIGNED /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALIGNED, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_AMPERE1B */
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&generic_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_CORTEXA35. */
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&generic_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_CORTEXA53. */
(AARCH64_EXTRA_TUNE_RENAME_FMA_REGS), /* tune_flags. */
&generic_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_CORTEXA57. */
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&generic_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_CORTEXA72. */
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&generic_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
| AARCH64_EXTRA_TUNE_AVOID_LDAPUR), /* tune_flags. */
&generic_armv9a_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_CORTEXX925. */
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&xgene1_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_EMAG. */
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&exynosm1_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_EXYNOSM1. */
| AARCH64_EXTRA_TUNE_MATCHED_VECTOR_THROUGHPUT), /* tune_flags. */
&generic_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_FUJITSU_MONAKA. */
(AARCH64_EXTRA_TUNE_CSE_SVE_VL_CONSTANTS), /* tune_flags. */
&generic_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_GENERIC. */
| AARCH64_EXTRA_TUNE_MATCHED_VECTOR_THROUGHPUT), /* tune_flags. */
&generic_armv8_a_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_GENERIC_ARMV8_A. */
| AARCH64_EXTRA_TUNE_MATCHED_VECTOR_THROUGHPUT), /* tune_flags. */
&generic_armv9a_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_GENERIC_ARMV9_A. */
| AARCH64_EXTRA_TUNE_AVOID_PRED_RMW), /* tune_flags. */
&generic_armv9a_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_NEOVERSE512TVB. */
(AARCH64_EXTRA_TUNE_BASE), /* tune_flags. */
&generic_armv9a_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_NEOVERSEN1. */
| AARCH64_EXTRA_TUNE_AVOID_PRED_RMW), /* tune_flags. */
&generic_armv9a_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_NEOVERSEN2. */
| AARCH64_EXTRA_TUNE_MATCHED_VECTOR_THROUGHPUT), /* tune_flags. */
&generic_armv9a_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_NEOVERSEN3. */
| AARCH64_EXTRA_TUNE_AVOID_PRED_RMW), /* tune_flags. */
&generic_armv9a_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
| AARCH64_EXTRA_TUNE_AVOID_LDAPUR), /* tune_flags. */
&generic_armv9a_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_NEOVERSEV2. */
| AARCH64_EXTRA_TUNE_AVOID_LDAPUR), /* tune_flags. */
&generic_armv9a_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_NEOVERSEV3. */
| AARCH64_EXTRA_TUNE_AVOID_LDAPUR), /* tune_flags. */
&generic_armv9a_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_NEOVERSEV3AE. */
| AARCH64_EXTRA_TUNE_AVOID_PRED_RMW), /* tune_flags. */
&olympus_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_OLYMPUS. */
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&qdf24xx_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_QDF24XX. */
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&generic_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_SAPHIRA. */
(AARCH64_EXTRA_TUNE_CHEAP_SHIFT_EXTEND), /* tune_flags. */
&thunderx_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALIGNED, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALIGNED /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALIGNED, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_THUNDERX. */
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&thunderx2t99_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_THUNDERX2T99. */
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&thunderx3t110_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_THUNDERX3T110. */
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&thunderxt88_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALIGNED, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALIGNED /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALIGNED, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_THUNDERXT88. */
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&tsv110_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_TSV110. */
(AARCH64_EXTRA_TUNE_NONE), /* tune_flags. */
&xgene1_prefetch_tune,
AARCH64_LDP_STP_POLICY_ALWAYS, /* ldp_policy_model. */
- AARCH64_LDP_STP_POLICY_ALWAYS /* stp_policy_model. */
+ AARCH64_LDP_STP_POLICY_ALWAYS, /* stp_policy_model. */
+ nullptr /* dispatch_constraints. */
};
#endif /* GCC_AARCH64_H_XGENE1. */