/* Generated automatically by the program `genattr'
   from the machine description file `md'.  */

#ifndef GCC_INSN_ATTR_H
#define GCC_INSN_ATTR_H

#include "insn-attr-common.h"

#define HAVE_ATTR_nonce_enabled 1
extern enum attr_nonce_enabled get_attr_nonce_enabled (rtx_insn *);

#define HAVE_ATTR_ce_enabled 1
extern enum attr_ce_enabled get_attr_ce_enabled (rtx_insn *);

#define HAVE_ATTR_tune 1
extern enum attr_tune get_attr_tune (void);

#define HAVE_ATTR_type 1
extern enum attr_type get_attr_type (rtx_insn *);

#define HAVE_ATTR_mul32 1
extern enum attr_mul32 get_attr_mul32 (rtx_insn *);

#define HAVE_ATTR_widen_mul64 1
extern enum attr_widen_mul64 get_attr_widen_mul64 (rtx_insn *);

#define HAVE_ATTR_is_neon_type 1
extern enum attr_is_neon_type get_attr_is_neon_type (rtx_insn *);

#define HAVE_ATTR_is_mve_type 1
extern enum attr_is_mve_type get_attr_is_mve_type (rtx_insn *);

#define HAVE_ATTR_is_thumb 1
extern enum attr_is_thumb get_attr_is_thumb (void);

#define HAVE_ATTR_is_arch6 1
extern enum attr_is_arch6 get_attr_is_arch6 (void);

#define HAVE_ATTR_is_thumb1 1
extern enum attr_is_thumb1 get_attr_is_thumb1 (void);

#define HAVE_ATTR_predicable_short_it 1
extern enum attr_predicable_short_it get_attr_predicable_short_it (rtx_insn *);

#define HAVE_ATTR_enabled_for_short_it 1
extern enum attr_enabled_for_short_it get_attr_enabled_for_short_it (rtx_insn *);

#define HAVE_ATTR_required_for_purecode 1
extern enum attr_required_for_purecode get_attr_required_for_purecode (rtx_insn *);

#define HAVE_ATTR_shift 1
extern int get_attr_shift (rtx_insn *);
#define HAVE_ATTR_fp 1
extern enum attr_fp get_attr_fp (rtx_insn *);

#define HAVE_ATTR_fpu 1
extern enum attr_fpu get_attr_fpu (void);

#define HAVE_ATTR_predicated 1
extern enum attr_predicated get_attr_predicated (rtx_insn *);

#define HAVE_ATTR_length 1
extern int get_attr_length (rtx_insn *);
extern void shorten_branches (rtx_insn *);
extern int insn_default_length (rtx_insn *);
extern int insn_min_length (rtx_insn *);
extern int insn_variable_length_p (rtx_insn *);
extern int insn_current_length (rtx_insn *);

#include "insn-addr.h"

#define HAVE_ATTR_arch 1
extern enum attr_arch get_attr_arch (rtx_insn *);

#define HAVE_ATTR_arch_enabled 1
extern enum attr_arch_enabled get_attr_arch_enabled (rtx_insn *);

#define HAVE_ATTR_opt 1
extern enum attr_opt get_attr_opt (rtx_insn *);

#define HAVE_ATTR_opt_enabled 1
extern enum attr_opt_enabled get_attr_opt_enabled (rtx_insn *);

#define HAVE_ATTR_use_literal_pool 1
extern enum attr_use_literal_pool get_attr_use_literal_pool (rtx_insn *);

#define HAVE_ATTR_enabled 1
extern enum attr_enabled get_attr_enabled (rtx_insn *);

#define HAVE_ATTR_arm_pool_range 1
extern int get_attr_arm_pool_range (rtx_insn *);
#define HAVE_ATTR_thumb2_pool_range 1
extern int get_attr_thumb2_pool_range (rtx_insn *);
#define HAVE_ATTR_arm_neg_pool_range 1
extern int get_attr_arm_neg_pool_range (rtx_insn *);
#define HAVE_ATTR_thumb2_neg_pool_range 1
extern int get_attr_thumb2_neg_pool_range (rtx_insn *);
#define HAVE_ATTR_pool_range 1
extern int get_attr_pool_range (rtx_insn *);
#define HAVE_ATTR_neg_pool_range 1
extern int get_attr_neg_pool_range (rtx_insn *);
#define HAVE_ATTR_ldsched 1
extern enum attr_ldsched get_attr_ldsched (void);

#define HAVE_ATTR_conds 1
extern enum attr_conds get_attr_conds (rtx_insn *);

#define HAVE_ATTR_predicable 1
extern enum attr_predicable get_attr_predicable (rtx_insn *);

#define HAVE_ATTR_model_wbuf 1
extern enum attr_model_wbuf get_attr_model_wbuf (void);

#define HAVE_ATTR_write_conflict 1
extern enum attr_write_conflict get_attr_write_conflict (rtx_insn *);

#define HAVE_ATTR_core_cycles 1
extern enum attr_core_cycles get_attr_core_cycles (rtx_insn *);

#define HAVE_ATTR_far_jump 1
extern enum attr_far_jump get_attr_far_jump (rtx_insn *);

#define HAVE_ATTR_ce_count 1
extern int get_attr_ce_count (rtx_insn *);
#define HAVE_ATTR_tune_cortexr4 1
extern enum attr_tune_cortexr4 get_attr_tune_cortexr4 (void);

#define HAVE_ATTR_generic_sched 1
extern enum attr_generic_sched get_attr_generic_sched (void);

#define HAVE_ATTR_generic_vfp 1
extern enum attr_generic_vfp get_attr_generic_vfp (void);

#define HAVE_ATTR_marvell_f_iwmmxt 1
extern enum attr_marvell_f_iwmmxt get_attr_marvell_f_iwmmxt (void);

#define HAVE_ATTR_wmmxt_shift 1
extern enum attr_wmmxt_shift get_attr_wmmxt_shift (rtx_insn *);

#define HAVE_ATTR_wmmxt_pack 1
extern enum attr_wmmxt_pack get_attr_wmmxt_pack (rtx_insn *);

#define HAVE_ATTR_wmmxt_mult_c1 1
extern enum attr_wmmxt_mult_c1 get_attr_wmmxt_mult_c1 (rtx_insn *);

#define HAVE_ATTR_wmmxt_mult_c2 1
extern enum attr_wmmxt_mult_c2 get_attr_wmmxt_mult_c2 (rtx_insn *);

#define HAVE_ATTR_wmmxt_alu_c1 1
extern enum attr_wmmxt_alu_c1 get_attr_wmmxt_alu_c1 (rtx_insn *);

#define HAVE_ATTR_wmmxt_alu_c2 1
extern enum attr_wmmxt_alu_c2 get_attr_wmmxt_alu_c2 (rtx_insn *);

#define HAVE_ATTR_wmmxt_alu_c3 1
extern enum attr_wmmxt_alu_c3 get_attr_wmmxt_alu_c3 (rtx_insn *);

#define HAVE_ATTR_wmmxt_transfer_c1 1
extern enum attr_wmmxt_transfer_c1 get_attr_wmmxt_transfer_c1 (rtx_insn *);

#define HAVE_ATTR_wmmxt_transfer_c2 1
extern enum attr_wmmxt_transfer_c2 get_attr_wmmxt_transfer_c2 (rtx_insn *);

#define HAVE_ATTR_wmmxt_transfer_c3 1
extern enum attr_wmmxt_transfer_c3 get_attr_wmmxt_transfer_c3 (rtx_insn *);

#define HAVE_ATTR_vfp10 1
extern enum attr_vfp10 get_attr_vfp10 (void);

#define HAVE_ATTR_cortex_a7_neon_type 1
extern enum attr_cortex_a7_neon_type get_attr_cortex_a7_neon_type (rtx_insn *);

#define HAVE_ATTR_cortex_a8_neon_type 1
extern enum attr_cortex_a8_neon_type get_attr_cortex_a8_neon_type (rtx_insn *);

#define HAVE_ATTR_cortex_a9_neon_type 1
extern enum attr_cortex_a9_neon_type get_attr_cortex_a9_neon_type (rtx_insn *);

#define HAVE_ATTR_cortex_a15_neon_type 1
extern enum attr_cortex_a15_neon_type get_attr_cortex_a15_neon_type (rtx_insn *);

#define HAVE_ATTR_cortex_a17_neon_type 1
extern enum attr_cortex_a17_neon_type get_attr_cortex_a17_neon_type (rtx_insn *);

#define HAVE_ATTR_cortex_a53_advsimd_type 1
extern enum attr_cortex_a53_advsimd_type get_attr_cortex_a53_advsimd_type (rtx_insn *);

#define HAVE_ATTR_cortex_a57_neon_type 1
extern enum attr_cortex_a57_neon_type get_attr_cortex_a57_neon_type (rtx_insn *);

#define HAVE_ATTR_exynos_m1_neon_type 1
extern enum attr_exynos_m1_neon_type get_attr_exynos_m1_neon_type (rtx_insn *);

#define HAVE_ATTR_add_setq 1
extern enum attr_add_setq get_attr_add_setq (rtx_insn *);

#define HAVE_ATTR_vqh_mnem 1
extern enum attr_vqh_mnem get_attr_vqh_mnem (rtx_insn *);

extern int num_delay_slots (rtx_insn *);
extern int eligible_for_delay (rtx_insn *, int, rtx_insn *, int);

extern int const_num_delay_slots (rtx_insn *);

#define ANNUL_IFTRUE_SLOTS 0
extern int eligible_for_annul_true (rtx_insn *, int, rtx_insn *, int);
#define ANNUL_IFFALSE_SLOTS 0
extern int eligible_for_annul_false (rtx_insn *, int, rtx_insn *, int);

/* DFA based pipeline interface.  */
#ifndef AUTOMATON_ALTS
#define AUTOMATON_ALTS 0
#endif


#ifndef AUTOMATON_STATE_ALTS
#define AUTOMATON_STATE_ALTS 0
#endif

#ifndef CPU_UNITS_QUERY
#define CPU_UNITS_QUERY 0
#endif

#define init_sched_attrs() do { } while (0)

/* Internal insn code number used by automata.  */
extern int internal_dfa_insn_code (rtx_insn *);

/* Insn latency time defined in define_insn_reservation. */
extern int insn_default_latency (rtx_insn *);

/* Return nonzero if there is a bypass for given insn
   which is a data producer.  */
extern int bypass_p (rtx_insn *);

/* Insn latency time on data consumed by the 2nd insn.
   Use the function if bypass_p returns nonzero for
   the 1st insn. */
extern int insn_latency (rtx_insn *, rtx_insn *);

/* Maximal insn latency time possible of all bypasses for this insn.
   Use the function if bypass_p returns nonzero for
   the 1st insn. */
extern int maximal_insn_latency (rtx_insn *);


#if AUTOMATON_ALTS
/* The following function returns number of alternative
   reservations of given insn.  It may be used for better
   insns scheduling heuristics. */
extern int insn_alts (rtx);

#endif

/* Maximal possible number of insns waiting results being
   produced by insns whose execution is not finished. */
extern const int max_insn_queue_index;

/* Pointer to data describing current state of DFA.  */
typedef void *state_t;

/* Size of the data in bytes.  */
extern int state_size (void);

/* Initiate given DFA state, i.e. Set up the state
   as all functional units were not reserved.  */
extern void state_reset (state_t);
/* The following function returns negative value if given
   insn can be issued in processor state described by given
   DFA state.  In this case, the DFA state is changed to
   reflect the current and future reservations by given
   insn.  Otherwise the function returns minimal time
   delay to issue the insn.  This delay may be zero
   for superscalar or VLIW processors.  If the second
   parameter is NULL the function changes given DFA state
   as new processor cycle started.  */
extern int state_transition (state_t, rtx);

#if AUTOMATON_STATE_ALTS
/* The following function returns number of possible
   alternative reservations of given insn in given
   DFA state.  It may be used for better insns scheduling
   heuristics.  By default the function is defined if
   macro AUTOMATON_STATE_ALTS is defined because its
   implementation may require much memory.  */
extern int state_alts (state_t, rtx);
#endif

extern int min_issue_delay (state_t, rtx_insn *);
/* The following function returns nonzero if no one insn
   can be issued in current DFA state. */
extern int state_dead_lock_p (state_t);
/* The function returns minimal delay of issue of the 2nd
   insn after issuing the 1st insn in given DFA state.
   The 1st insn should be issued in given state (i.e.
    state_transition should return negative value for
    the insn and the state).  Data dependencies between
    the insns are ignored by the function.  */
extern int min_insn_conflict_delay (state_t, rtx_insn *, rtx_insn *);
/* The following function outputs reservations for given
   insn as they are described in the corresponding
   define_insn_reservation.  */
extern void print_reservation (FILE *, rtx_insn *);

#if CPU_UNITS_QUERY
/* The following function returns code of functional unit
   with given name (see define_cpu_unit). */
extern int get_cpu_unit_code (const char *);
/* The following function returns nonzero if functional
   unit with given code is currently reserved in given
   DFA state.  */
extern int cpu_unit_reservation_p (state_t, int);
#endif

/* The following function returns true if insn
   has a dfa reservation.  */
extern bool insn_has_dfa_reservation_p (rtx_insn *);

/* Clean insn code cache.  It should be called if there
   is a chance that condition value in a
   define_insn_reservation will be changed after
   last call of dfa_start.  */
extern void dfa_clean_insn_cache (void);

extern void dfa_clear_single_insn_cache (rtx_insn *);

/* Initiate and finish work with DFA.  They should be
   called as the first and the last interface
   functions.  */
extern void dfa_start (void);
extern void dfa_finish (void);
#ifndef HAVE_ATTR_length
#define HAVE_ATTR_length 0
#endif
#ifndef HAVE_ATTR_enabled
#define HAVE_ATTR_enabled 0
#endif
#ifndef HAVE_ATTR_preferred_for_size
#define HAVE_ATTR_preferred_for_size 0
#endif
#ifndef HAVE_ATTR_preferred_for_speed
#define HAVE_ATTR_preferred_for_speed 0
#endif
#if !HAVE_ATTR_length
extern int hook_int_rtx_insn_unreachable (rtx_insn *);
#define insn_default_length hook_int_rtx_insn_unreachable
#define insn_min_length hook_int_rtx_insn_unreachable
#define insn_variable_length_p hook_int_rtx_insn_unreachable
#define insn_current_length hook_int_rtx_insn_unreachable
#include "insn-addr.h"
#endif
extern int hook_int_rtx_1 (rtx);
#if !HAVE_ATTR_enabled
#define get_attr_enabled hook_int_rtx_1
#endif
#if !HAVE_ATTR_preferred_for_size
#define get_attr_preferred_for_size hook_int_rtx_1
#endif
#if !HAVE_ATTR_preferred_for_speed
#define get_attr_preferred_for_speed hook_int_rtx_1
#endif


#define ATTR_FLAG_forward	0x1
#define ATTR_FLAG_backward	0x2

#endif /* GCC_INSN_ATTR_H */
