From patchwork Wed Jul 7 20:53:26 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 58175 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 3C028B6F15 for ; Thu, 8 Jul 2010 06:53:42 +1000 (EST) Received: (qmail 30704 invoked by alias); 7 Jul 2010 20:53:40 -0000 Received: (qmail 30694 invoked by uid 22791); 7 Jul 2010 20:53:39 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, TW_XT, T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-wy0-f175.google.com (HELO mail-wy0-f175.google.com) (74.125.82.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 07 Jul 2010 20:53:32 +0000 Received: by wye20 with SMTP id 20so75593wye.20 for ; Wed, 07 Jul 2010 13:53:29 -0700 (PDT) Received: by 10.227.157.201 with SMTP id c9mr5652770wbx.20.1278536009712; Wed, 07 Jul 2010 13:53:29 -0700 (PDT) Received: from localhost (rsandifo.gotadsl.co.uk [82.133.89.107]) by mx.google.com with ESMTPS id a27sm45511327wbe.12.2010.07.07.13.53.27 (version=TLSv1/SSLv3 cipher=RC4-MD5); Wed, 07 Jul 2010 13:53:28 -0700 (PDT) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, rdsandiford@googlemail.com Subject: [10/27] Using target structures for init_expmed References: <87d3v2oqyt.fsf@firetop.home> Date: Wed, 07 Jul 2010 21:53:26 +0100 In-Reply-To: <87d3v2oqyt.fsf@firetop.home> (Richard Sandiford's message of "Sun, 04 Jul 2010 22:51:54 +0100") Message-ID: <87vd8rt3nd.fsf@firetop.home> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org 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. 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 +. */ + +#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;