* Makefile.in (expmed.o, target-globals.o): Depend on expmed.h.
* expmed.h: New file.
* expmed.c (default_target_costs): New variable.
(this_target_costs): New conditional variable.
(sdiv_pow2_cheap, smod_pow2_cheap, zero_cost, add_cost, neg_cost)
(shift_cost, shiftadd_cost, shiftsub0_cost, shiftsub1_cost, mul_cost)
(sdiv_cost, udiv_cost, mul_widen_cost, mul_highpart_cost): Delete.
* target-globals.h (this_target_expmed): Declare.
(target_globals): Add a expmed field.
(restore_target_globals): Copy the expmed field to
this_target_expmed.
* target-globals.c: Include expmed.h.
(default_target_globals): Initialize the expmed field.
(save_target_globals): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162094
138bc75d-0d04-0410-961f-
82ee72b054a4
2010-07-12 Richard Sandiford <rdsandiford@googlemail.com>
+ * Makefile.in (expmed.o, target-globals.o): Depend on expmed.h.
+ * expmed.h: New file.
+ * expmed.c (default_target_costs): New variable.
+ (this_target_costs): New conditional variable.
+ (sdiv_pow2_cheap, smod_pow2_cheap, zero_cost, add_cost, neg_cost)
+ (shift_cost, shiftadd_cost, shiftsub0_cost, shiftsub1_cost, mul_cost)
+ (sdiv_cost, udiv_cost, mul_widen_cost, mul_highpart_cost): Delete.
+ * target-globals.h (this_target_expmed): Declare.
+ (target_globals): Add a expmed field.
+ (restore_target_globals): Copy the expmed field to
+ this_target_expmed.
+ * target-globals.c: Include expmed.h.
+ (default_target_globals): Initialize the expmed field.
+ (save_target_globals): Likewise.
+
+2010-07-12 Richard Sandiford <rdsandiford@googlemail.com>
+
* Makefile.in (target-globals.o): Depend on reload.h.
* reload.h (target_reload): New structure.
(default_target_reload): Declare.
$(CGRAPH_H) $(EXCEPT_H) sbitmap.h $(DBGCNT_H) $(TREE_FLOW_H)
expmed.o : expmed.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \
$(FLAGS_H) insn-config.h $(EXPR_H) $(OPTABS_H) $(RECOG_H) \
- $(TOPLEV_H) $(DIAGNOSTIC_CORE_H) $(TM_P_H) langhooks.h $(DF_H) $(TARGET_H)
+ $(TOPLEV_H) $(DIAGNOSTIC_CORE_H) $(TM_P_H) langhooks.h $(DF_H) $(TARGET_H) \
+ expmed.h
explow.o : explow.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \
$(FLAGS_H) hard-reg-set.h insn-config.h $(EXPR_H) $(OPTABS_H) $(RECOG_H) \
$(TOPLEV_H) $(DIAGNOSTIC_CORE_H) $(EXCEPT_H) $(FUNCTION_H) $(GGC_H) $(TM_P_H) langhooks.h gt-explow.h \
$(EXPR_H) $(EXCEPT_H) $(REGS_H) $(TREE_PASS_H) $(DF_H)
target-globals.o : target-globals.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) insn-config.h $(MACHMODE_H) $(GGC_H) $(TOPLEV_H) target-globals.h \
- $(FLAGS_H) $(REGS_H) $(RTL_H) reload.h
+ $(FLAGS_H) $(REGS_H) $(RTL_H) reload.h expmed.h
$(out_object_file): $(out_file) $(CONFIG_H) coretypes.h $(TM_H) $(TREE_H) \
$(RTL_H) $(REGS_H) hard-reg-set.h insn-config.h conditions.h \
#include "langhooks.h"
#include "df.h"
#include "target.h"
+#include "expmed.h"
+
+struct target_expmed default_target_expmed;
+#if SWITCHABLE_TARGET
+struct target_expmed *this_target_expmed = &default_target_expmed;
+#endif
static void store_fixed_bit_field (rtx, unsigned HOST_WIDE_INT,
unsigned HOST_WIDE_INT,
/* Test whether a value is zero of a power of two. */
#define EXACT_POWER_OF_2_OR_ZERO_P(x) (((x) & ((x) - 1)) == 0)
-/* Nonzero means divides or modulus operations are relatively cheap for
- powers of two, so don't use branches; emit the operation instead.
- Usually, this will mean that the MD file will emit non-branch
- sequences. */
-
-static bool sdiv_pow2_cheap[2][NUM_MACHINE_MODES];
-static bool smod_pow2_cheap[2][NUM_MACHINE_MODES];
-
#ifndef SLOW_UNALIGNED_ACCESS
#define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) STRICT_ALIGNMENT
#endif
#define gen_extzv(a,b,c,d) NULL_RTX
#endif
-/* Cost of various pieces of RTL. Note that some of these are indexed by
- shift count and some by mode. */
-static int zero_cost[2];
-static int add_cost[2][NUM_MACHINE_MODES];
-static int neg_cost[2][NUM_MACHINE_MODES];
-static int shift_cost[2][NUM_MACHINE_MODES][MAX_BITS_PER_WORD];
-static int shiftadd_cost[2][NUM_MACHINE_MODES][MAX_BITS_PER_WORD];
-static int shiftsub0_cost[2][NUM_MACHINE_MODES][MAX_BITS_PER_WORD];
-static int shiftsub1_cost[2][NUM_MACHINE_MODES][MAX_BITS_PER_WORD];
-static int mul_cost[2][NUM_MACHINE_MODES];
-static int sdiv_cost[2][NUM_MACHINE_MODES];
-static int udiv_cost[2][NUM_MACHINE_MODES];
-static int mul_widen_cost[2][NUM_MACHINE_MODES];
-static int mul_highpart_cost[2][NUM_MACHINE_MODES];
-
void
init_expmed (void)
{
--- /dev/null
+/* Target-dependent costs for expmed.c.
+ Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+ Free Software Foundation, Inc.
+
+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 EXPMED_H
+#define EXPMED_H 1
+
+/* Target-dependent globals. */
+struct target_expmed {
+ /* Nonzero means divides or modulus operations are relatively cheap for
+ powers of two, so don't use branches; emit the operation instead.
+ Usually, this will mean that the MD file will emit non-branch
+ sequences. */
+ bool x_sdiv_pow2_cheap[2][NUM_MACHINE_MODES];
+ bool x_smod_pow2_cheap[2][NUM_MACHINE_MODES];
+
+ /* Cost of various pieces of RTL. Note that some of these are indexed by
+ shift count and some by mode. */
+ int x_zero_cost[2];
+ int x_add_cost[2][NUM_MACHINE_MODES];
+ int x_neg_cost[2][NUM_MACHINE_MODES];
+ int x_shift_cost[2][NUM_MACHINE_MODES][MAX_BITS_PER_WORD];
+ int x_shiftadd_cost[2][NUM_MACHINE_MODES][MAX_BITS_PER_WORD];
+ int x_shiftsub0_cost[2][NUM_MACHINE_MODES][MAX_BITS_PER_WORD];
+ int x_shiftsub1_cost[2][NUM_MACHINE_MODES][MAX_BITS_PER_WORD];
+ int x_mul_cost[2][NUM_MACHINE_MODES];
+ int x_sdiv_cost[2][NUM_MACHINE_MODES];
+ int x_udiv_cost[2][NUM_MACHINE_MODES];
+ int x_mul_widen_cost[2][NUM_MACHINE_MODES];
+ int x_mul_highpart_cost[2][NUM_MACHINE_MODES];
+};
+
+extern struct target_expmed default_target_expmed;
+#if SWITCHABLE_TARGET
+extern struct target_expmed *this_target_expmed;
+#else
+#define this_target_expmed (&default_target_expmed)
+#endif
+
+#define sdiv_pow2_cheap \
+ (this_target_expmed->x_sdiv_pow2_cheap)
+#define smod_pow2_cheap \
+ (this_target_expmed->x_smod_pow2_cheap)
+#define zero_cost \
+ (this_target_expmed->x_zero_cost)
+#define add_cost \
+ (this_target_expmed->x_add_cost)
+#define neg_cost \
+ (this_target_expmed->x_neg_cost)
+#define shift_cost \
+ (this_target_expmed->x_shift_cost)
+#define shiftadd_cost \
+ (this_target_expmed->x_shiftadd_cost)
+#define shiftsub0_cost \
+ (this_target_expmed->x_shiftsub0_cost)
+#define shiftsub1_cost \
+ (this_target_expmed->x_shiftsub1_cost)
+#define mul_cost \
+ (this_target_expmed->x_mul_cost)
+#define sdiv_cost \
+ (this_target_expmed->x_sdiv_cost)
+#define udiv_cost \
+ (this_target_expmed->x_udiv_cost)
+#define mul_widen_cost \
+ (this_target_expmed->x_mul_widen_cost)
+#define mul_highpart_cost \
+ (this_target_expmed->x_mul_highpart_cost)
+
+#endif
#include "rtl.h"
#include "hard-reg-set.h"
#include "reload.h"
+#include "expmed.h"
#if SWITCHABLE_TARGET
struct target_globals default_target_globals = {
&default_target_regs,
&default_target_rtl,
&default_target_hard_regs,
- &default_target_reload
+ &default_target_reload,
+ &default_target_expmed
};
struct target_globals *
g->rtl = ggc_alloc_cleared_target_rtl ();
g->hard_regs = XCNEW (struct target_hard_regs);
g->reload = XCNEW (struct target_reload);
+ g->expmed = XCNEW (struct target_expmed);
restore_target_globals (g);
target_reinit ();
return g;
extern struct target_rtl *this_target_rtl;
extern struct target_hard_regs *this_target_hard_regs;
extern struct target_reload *this_target_reload;
+extern struct target_expmed *this_target_expmed;
struct GTY(()) target_globals {
struct target_flag_state *GTY((skip)) flag_state;
struct target_rtl *rtl;
struct target_hard_regs *GTY((skip)) hard_regs;
struct target_reload *GTY((skip)) reload;
+ struct target_expmed *GTY((skip)) expmed;
};
extern struct target_globals default_target_globals;
this_target_rtl = g->rtl;
this_target_hard_regs = g->hard_regs;
this_target_reload = g->reload;
+ this_target_expmed = g->expmed;
}
#endif