aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/config/arm/aarch-common-protos.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/config/arm/aarch-common-protos.h')
-rw-r--r--gcc-4.9/gcc/config/arm/aarch-common-protos.h134
1 files changed, 134 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/config/arm/aarch-common-protos.h b/gcc-4.9/gcc/config/arm/aarch-common-protos.h
new file mode 100644
index 000000000..a5ff6b4f9
--- /dev/null
+++ b/gcc-4.9/gcc/config/arm/aarch-common-protos.h
@@ -0,0 +1,134 @@
+/* Functions and structures shared between arm and aarch64.
+
+ Copyright (C) 1991-2014 Free Software Foundation, Inc.
+ Contributed by ARM Ltd.
+
+ 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_AARCH_COMMON_PROTOS_H
+#define GCC_AARCH_COMMON_PROTOS_H
+
+extern int arm_early_load_addr_dep (rtx, rtx);
+extern int arm_early_store_addr_dep (rtx, rtx);
+extern int arm_mac_accumulator_is_mul_result (rtx, rtx);
+extern int arm_mac_accumulator_is_result (rtx, rtx);
+extern int arm_no_early_alu_shift_dep (rtx, rtx);
+extern int arm_no_early_alu_shift_value_dep (rtx, rtx);
+extern int arm_no_early_mul_dep (rtx, rtx);
+extern int arm_no_early_store_addr_dep (rtx, rtx);
+extern bool arm_rtx_shift_left_p (rtx);
+
+/* RTX cost table definitions. These are used when tuning for speed rather
+ than for size and should reflect the _additional_ cost over the cost
+ of the fastest instruction in the machine, which is COSTS_N_INSNS (1).
+ Therefore it's okay for some costs to be 0.
+ Costs may not have a negative value. */
+struct alu_cost_table
+{
+ const int arith; /* ADD/SUB. */
+ const int logical; /* AND/ORR/EOR/BIC, etc. */
+ const int shift; /* Simple shift. */
+ const int shift_reg; /* Simple shift by reg. */
+ const int arith_shift; /* Additional when arith also shifts... */
+ const int arith_shift_reg; /* ... and when the shift is by a reg. */
+ const int log_shift; /* Additional when logic also shifts... */
+ const int log_shift_reg; /* ... and when the shift is by a reg. */
+ const int extend; /* Zero/sign extension. */
+ const int extend_arith; /* Extend and arith. */
+ const int bfi; /* Bit-field insert. */
+ const int bfx; /* Bit-field extraction. */
+ const int clz; /* Count Leading Zeros. */
+ const int non_exec; /* Extra cost when not executing insn. */
+ const bool non_exec_costs_exec; /* True if non-execution must add the exec
+ cost. */
+};
+
+struct mult_cost_table
+{
+ const int simple;
+ const int flag_setting; /* Additional cost if multiply sets flags. */
+ const int extend;
+ const int add;
+ const int extend_add;
+ const int idiv;
+};
+
+/* Calculations of LDM costs are complex. We assume an initial cost
+ (ldm_1st) which will load the number of registers mentioned in
+ ldm_regs_per_insn_1st registers; then each additional
+ ldm_regs_per_insn_subsequent registers cost one more insn.
+ Similarly for STM operations.
+ Therefore the ldm_regs_per_insn_1st/stm_regs_per_insn_1st and
+ ldm_regs_per_insn_subsequent/stm_regs_per_insn_subsequent fields indicate
+ the number of registers loaded/stored and are expressed by a simple integer
+ and not by a COSTS_N_INSNS (N) expression.
+ */
+struct mem_cost_table
+{
+ const int load;
+ const int load_sign_extend; /* Additional to load cost. */
+ const int ldrd; /* Cost of LDRD. */
+ const int ldm_1st;
+ const int ldm_regs_per_insn_1st;
+ const int ldm_regs_per_insn_subsequent;
+ const int loadf; /* SFmode. */
+ const int loadd; /* DFmode. */
+ const int load_unaligned; /* Extra for unaligned loads. */
+ const int store;
+ const int strd;
+ const int stm_1st;
+ const int stm_regs_per_insn_1st;
+ const int stm_regs_per_insn_subsequent;
+ const int storef; /* SFmode. */
+ const int stored; /* DFmode. */
+ const int store_unaligned; /* Extra for unaligned stores. */
+};
+
+struct fp_cost_table
+{
+ const int div;
+ const int mult;
+ const int mult_addsub; /* Non-fused. */
+ const int fma; /* Fused. */
+ const int addsub;
+ const int fpconst; /* Immediate. */
+ const int neg; /* NEG and ABS. */
+ const int compare;
+ const int widen; /* Widen to this size. */
+ const int narrow; /* Narrow from this size. */
+ const int toint;
+ const int fromint;
+ const int roundint; /* V8 round to integral, remains FP format. */
+};
+
+struct vector_cost_table
+{
+ const int alu;
+};
+
+struct cpu_cost_table
+{
+ const struct alu_cost_table alu;
+ const struct mult_cost_table mult[2]; /* SImode and DImode. */
+ const struct mem_cost_table ldst;
+ const struct fp_cost_table fp[2]; /* SFmode and DFmode. */
+ const struct vector_cost_table vect;
+};
+
+
+#endif /* GCC_AARCH_COMMON_PROTOS_H */