Patchwork [10/27] Using target structures for init_expmed

login
register
mail settings
Submitter Richard Sandiford
Date July 7, 2010, 8:53 p.m.
Message ID <87vd8rt3nd.fsf@firetop.home>
Download mbox | patch
Permalink /patch/58175/
State New
Headers show

Comments

Richard Sandiford - July 7, 2010, 8:53 p.m.
The penultimate patch for backend_init_target:

      /* The following initialization functions need to generate rtl, so
         provide a dummy function context for them.  */
      init_dummy_function_start ();

      /* rtx_cost is mode-dependent, so cached values need to be recomputed
         on a mode change.  */
==>   init_expmed ();

      /* We may need to recompute regno_save_code[] and regno_restore_code[]
         after a mode change as well.  */
      caller_save_initialized_p = false;

A later patch adds more stuff to expmed.h that isn't covered by the
current target_reinit.

Richard

gcc/
	* 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.
Hans-Peter Nilsson - July 12, 2010, 11:19 p.m.
On Wed, 7 Jul 2010, Richard Sandiford wrote:
> gcc/
> 	* Makefile.in (expmed.o, target-globals.o): Depend on expmed.h.
> 	* expmed.h: New file.

Missing the defaults for MAX_BITS_PER_WORD from expmed.c,
breaking non-bi-wordsize ports like cris-elf:

gcc -c   -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE  -W -Wall
-Wwrite-strings -Wcast-qual -Wstrict-prototypes
-Wmissing-prototypes -Wmissing-format-attribute -pedantic
-Wno-long-long -Wno-variadic-macros -Wno-overlength-strings
-Wold-style-definition -Wc++-compat -fno-common -Wno-error
-DHAVE_CONFIG_H -I. -I. -I/tmp/hpautotest-gcc1/gcc/gcc
-I/tmp/hpautotest-gcc1/gcc/gcc/.
-I/tmp/hpautotest-gcc1/gcc/gcc/../include
-I/tmp/hpautotest-gcc1/gcc/gcc/../libcpp/include
-I/tmp/hpautotest-gcc1/cris-elf/gccobj/./gmp
-I/tmp/hpautotest-gcc1/gcc/gmp
-I/tmp/hpautotest-gcc1/cris-elf/gccobj/./mpfr
-I/tmp/hpautotest-gcc1/gcc/mpfr
-I/tmp/hpautotest-gcc1/gcc/mpc/src
-I/tmp/hpautotest-gcc1/gcc/gcc/../libdecnumber
-I/tmp/hpautotest-gcc1/gcc/gcc/../libdecnumber/dpd
-I../libdecnumber   -I/usr/include/libelf
/tmp/hpautotest-gcc1/gcc/gcc/expmed.c -o expmed.o
In file included from /tmp/hpautotest-gcc1/gcc/gcc/expmed.c:41:
/tmp/hpautotest-gcc1/gcc/gcc/expmed.h:96: error:
'MAX_BITS_PER_WORD' undeclared here (not in a function)

Yeah, it's a obvious enough fix, but testing apparently isn't
trivial, so I'll leave the honors to you.

brgds, H-P

Patch

Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in	2010-07-04 13:42:08.000000000 +0100
+++ gcc/Makefile.in	2010-07-04 13:42:37.000000000 +0100
@@ -2915,7 +2915,7 @@  calls.o : calls.c $(CONFIG_H) $(SYSTEM_H
    $(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) $(TM_P_H) langhooks.h $(DF_H) $(TARGET_H)
+   $(TOPLEV_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) $(EXCEPT_H) $(FUNCTION_H) $(GGC_H) $(TM_P_H) langhooks.h gt-explow.h \
@@ -3476,7 +3476,7 @@  lower-subreg.o : lower-subreg.c $(CONFIG
    $(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) $(MACHMODE_H) $(GGC_H) $(TOPLEV_H) target-globals.h $(FLAGS_H) \
-   $(REGS_H) $(RTL_H) reload.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 \
Index: gcc/expmed.h
===================================================================
--- /dev/null	2010-07-04 09:48:55.139146167 +0100
+++ gcc/expmed.h	2010-07-04 13:42:37.000000000 +0100
@@ -0,0 +1,85 @@ 
+/* 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
+
+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
Index: gcc/expmed.c
===================================================================
--- gcc/expmed.c	2010-07-04 12:53:32.000000000 +0100
+++ gcc/expmed.c	2010-07-04 13:42:37.000000000 +0100
@@ -37,6 +37,12 @@  Software Foundation; either version 3, o
 #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;
+#endif
 
 static void store_fixed_bit_field (rtx, unsigned HOST_WIDE_INT,
 				   unsigned HOST_WIDE_INT,
@@ -58,14 +64,6 @@  static rtx expand_sdiv_pow2 (enum machin
 /* 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
@@ -95,21 +93,6 @@  #define CODE_FOR_extzv	CODE_FOR_nothing
 #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)
 {
Index: gcc/target-globals.h
===================================================================
--- gcc/target-globals.h	2010-07-04 13:42:08.000000000 +0100
+++ gcc/target-globals.h	2010-07-04 13:42:37.000000000 +0100
@@ -26,6 +26,7 @@  #define TARGET_GLOBALS_H 1
 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;
@@ -33,6 +34,7 @@  struct GTY(()) target_globals {
   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;
@@ -47,6 +49,7 @@  restore_target_globals (struct target_gl
   this_target_rtl = g->rtl;
   this_target_hard_regs = g->hard_regs;
   this_target_reload = g->reload;
+  this_target_expmed = g->expmed;
 }
 #endif
 
Index: gcc/target-globals.c
===================================================================
--- gcc/target-globals.c	2010-07-04 13:42:08.000000000 +0100
+++ gcc/target-globals.c	2010-07-04 13:42:37.000000000 +0100
@@ -30,6 +30,7 @@  Software Foundation; either version 3, o
 #include "rtl.h"
 #include "hard-reg-set.h"
 #include "reload.h"
+#include "expmed.h"
 
 #if SWITCHABLE_TARGET
 struct target_globals default_target_globals = {
@@ -37,7 +38,8 @@  struct target_globals default_target_glo
   &default_target_regs,
   &default_target_rtl,
   &default_target_hard_regs,
-  &default_target_reload
+  &default_target_reload,
+  &default_target_expmed
 };
 
 struct target_globals *
@@ -51,6 +53,7 @@  save_target_globals (void)
   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;