Patchwork [16/27] Use target structures for init_expr_target

login
register
mail settings
Submitter Richard Sandiford
Date July 7, 2010, 9:10 p.m.
Message ID <87630rt2vd.fsf@firetop.home>
Download mbox | patch
Permalink /patch/58181/
State New
Headers show

Comments

Richard Sandiford - July 7, 2010, 9:10 p.m.
Third from last:

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

      /* Do the target-specific parts of expr initialization.  */
==>   init_expr_target ();

      /* Although the actions of these functions are language-independent,
         they use optabs, so we cannot call them from backend_init.  */
      init_set_costs ();
      ira_init ();

This is another case where the cached information seems generally
useful, so I've exposed it in regs.h rather than keep it private
to expr.c.

Richard


gcc/
	* regs.h (target_regs): Add x_direct_load, x_direct_store and
	x_float_extend_from_mem.
	(direct_load, direct_store, float_extend_from_mem): New macros.
	* expr.c (direct_load, direct_store, float_extend_from_mem): Delete.

Patch

Index: gcc/regs.h
===================================================================
--- gcc/regs.h	2010-07-07 21:52:27.000000000 +0100
+++ gcc/regs.h	2010-07-07 22:08:03.000000000 +0100
@@ -280,6 +280,15 @@  struct target_regs {
 
   /* Keep track of the last mode we initialized move costs for.  */
   int x_last_mode_for_init_move_cost;
+
+  /* Record for each mode whether we can move a register directly to or
+     from an object of that mode in memory.  If we can't, we won't try
+     to use that mode directly when accessing a field of that mode.  */
+  char x_direct_load[NUM_MACHINE_MODES];
+  char x_direct_store[NUM_MACHINE_MODES];
+
+  /* Record for each mode whether we can float-extend from memory.  */
+  bool x_float_extend_from_mem[NUM_MACHINE_MODES][NUM_MACHINE_MODES];
 };
 
 extern struct target_regs default_target_regs;
@@ -303,6 +312,12 @@  #define may_move_in_cost \
   (this_target_regs->x_may_move_in_cost)
 #define may_move_out_cost \
   (this_target_regs->x_may_move_out_cost)
+#define direct_load \
+  (this_target_regs->x_direct_load)
+#define direct_store \
+  (this_target_regs->x_direct_store)
+#define float_extend_from_mem \
+  (this_target_regs->x_float_extend_from_mem)
 
 /* Return an exclusive upper bound on the registers occupied by hard
    register (reg:MODE REGNO).  */
Index: gcc/expr.c
===================================================================
--- gcc/expr.c	2010-07-07 21:30:42.000000000 +0100
+++ gcc/expr.c	2010-07-07 22:08:03.000000000 +0100
@@ -53,6 +53,7 @@  Software Foundation; either version 3, o
 #include "df.h"
 #include "diagnostic.h"
 #include "ssaexpand.h"
+#include "target-globals.h"
 
 /* Decide whether a function's arguments should be processed
    from first to last or from last to first.
@@ -158,17 +159,6 @@  static void do_tablejump (rtx, enum mach
 static rtx const_vector_from_tree (tree);
 static void write_complex_part (rtx, rtx, bool);
 
-/* Record for each mode whether we can move a register directly to or
-   from an object of that mode in memory.  If we can't, we won't try
-   to use that mode directly when accessing a field of that mode.  */
-
-static char direct_load[NUM_MACHINE_MODES];
-static char direct_store[NUM_MACHINE_MODES];
-
-/* Record for each mode whether we can float-extend from memory.  */
-
-static bool float_extend_from_mem[NUM_MACHINE_MODES][NUM_MACHINE_MODES];
-
 /* This macro is used to determine whether move_by_pieces should be called
    to perform a structure copy.  */
 #ifndef MOVE_BY_PIECES_P