diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/config/arm/arm-cores.def | 1 | ||||
-rw-r--r-- | gcc/config/arm/arm-tune.md | 2 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 18 | ||||
-rw-r--r-- | gcc/config/arm/arm.h | 3 | ||||
-rw-r--r-- | gcc/config/arm/arm.md | 5 | ||||
-rw-r--r-- | gcc/config/arm/cortex-a9.md | 65 |
7 files changed, 102 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0766ec3..a80ef31 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2008-09-02 Paul Brook <paul@codesourcery.com> + + * config/arm/arm.c (arm_tune_cortex_a9): Define. + (arm_override_options): Set arm_tune_cortex_a9. + (arm_rtx_costs_1): Make register shifts more expensive on Cortex-A9. + (arm_issue_rate): Handle cortexa9. + * config/arm/arm.h (arm_tune_cortex_a9): Declare. + * config/arm/arm-cores.def: Add cortex-a9. + * config/arm/arm-tune.md: Regenerate. + * config/arm/arm.md: Include cortex-a9.md. + (generic_sched, generic_vfp): Add cortexa9. + * config/arm/cortex-a9.md: New file. + 2008-09-02 Richard Guenther <rguenther@suse.de> PR tree-optimization/37327 diff --git a/gcc/config/arm/arm-cores.def b/gcc/config/arm/arm-cores.def index c7e425b..fe2f2b5 100644 --- a/gcc/config/arm/arm-cores.def +++ b/gcc/config/arm/arm-cores.def @@ -116,6 +116,7 @@ ARM_CORE("mpcorenovfp", mpcorenovfp, 6K, FL_LDSCHED, 9e) ARM_CORE("mpcore", mpcore, 6K, FL_LDSCHED | FL_VFPV2, 9e) ARM_CORE("arm1156t2-s", arm1156t2s, 6T2, FL_LDSCHED, 9e) ARM_CORE("cortex-a8", cortexa8, 7A, FL_LDSCHED, 9e) +ARM_CORE("cortex-a9", cortexa9, 7A, FL_LDSCHED, 9e) ARM_CORE("cortex-r4", cortexr4, 7R, FL_LDSCHED, 9e) ARM_CORE("cortex-r4f", cortexr4f, 7R, FL_LDSCHED, 9e) ARM_CORE("cortex-m3", cortexm3, 7M, FL_LDSCHED, 9e) diff --git a/gcc/config/arm/arm-tune.md b/gcc/config/arm/arm-tune.md index ee5606b..beb8f9f 100644 --- a/gcc/config/arm/arm-tune.md +++ b/gcc/config/arm/arm-tune.md @@ -1,5 +1,5 @@ ;; -*- buffer-read-only: t -*- ;; Generated automatically by gentune.sh from arm-cores.def (define_attr "tune" - "arm2,arm250,arm3,arm6,arm60,arm600,arm610,arm620,arm7,arm7d,arm7di,arm70,arm700,arm700i,arm710,arm720,arm710c,arm7100,arm7500,arm7500fe,arm7m,arm7dm,arm7dmi,arm8,arm810,strongarm,strongarm110,strongarm1100,strongarm1110,arm7tdmi,arm7tdmis,arm710t,arm720t,arm740t,arm9,arm9tdmi,arm920,arm920t,arm922t,arm940t,ep9312,arm10tdmi,arm1020t,arm9e,arm946es,arm966es,arm968es,arm10e,arm1020e,arm1022e,xscale,iwmmxt,arm926ejs,arm1026ejs,arm1136js,arm1136jfs,arm1176jzs,arm1176jzfs,mpcorenovfp,mpcore,arm1156t2s,cortexa8,cortexr4,cortexr4f,cortexm3,cortexm1" + "arm2,arm250,arm3,arm6,arm60,arm600,arm610,arm620,arm7,arm7d,arm7di,arm70,arm700,arm700i,arm710,arm720,arm710c,arm7100,arm7500,arm7500fe,arm7m,arm7dm,arm7dmi,arm8,arm810,strongarm,strongarm110,strongarm1100,strongarm1110,arm7tdmi,arm7tdmis,arm710t,arm720t,arm740t,arm9,arm9tdmi,arm920,arm920t,arm922t,arm940t,ep9312,arm10tdmi,arm1020t,arm9e,arm946es,arm966es,arm968es,arm10e,arm1020e,arm1022e,xscale,iwmmxt,arm926ejs,arm1026ejs,arm1136js,arm1136jfs,arm1176jzs,arm1176jzfs,mpcorenovfp,mpcore,arm1156t2s,cortexa8,cortexa9,cortexr4,cortexr4f,cortexm3,cortexm1" (const (symbol_ref "arm_tune"))) diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 724f1ac..ec28f79 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -544,6 +544,9 @@ int arm_tune_xscale = 0; This typically means an ARM6 or ARM7 with MMU or MPU. */ int arm_tune_wbuf = 0; +/* Nonzero if tuning for Cortex-A9. */ +int arm_tune_cortex_a9 = 0; + /* Nonzero if generating Thumb instructions. */ int thumb_code = 0; @@ -1289,6 +1292,7 @@ arm_override_options (void) arm_tune_xscale = (tune_flags & FL_XSCALE) != 0; arm_arch_iwmmxt = (insn_flags & FL_IWMMXT) != 0; arm_arch_hwdiv = (insn_flags & FL_DIV) != 0; + arm_tune_cortex_a9 = (arm_tune == cortexa9) != 0; /* If we are not using the default (ARM mode) section anchor offset ranges, then set the correct ranges now. */ @@ -4913,7 +4917,15 @@ arm_rtx_costs_1 (rtx x, enum rtx_code code, enum rtx_code outer) || (GET_CODE (XEXP (x, 0)) == SUBREG && GET_CODE (SUBREG_REG (XEXP (x, 0))) == REG)) ? 0 : 8)); - return (1 + ((GET_CODE (XEXP (x, 0)) == REG + + extra_cost = 1; + /* Increase the cost of complex shifts because they aren't any faster, + and reduce dual issue opportunities. */ + if (arm_tune_cortex_a9 + && outer != SET && GET_CODE (XEXP (x, 1)) != CONST_INT) + extra_cost++; + + return (extra_cost + ((GET_CODE (XEXP (x, 0)) == REG || (GET_CODE (XEXP (x, 0)) == SUBREG && GET_CODE (SUBREG_REG (XEXP (x, 0))) == REG)) ? 0 : 4) @@ -5028,7 +5040,8 @@ arm_rtx_costs_1 (rtx x, enum rtx_code code, enum rtx_code outer) && ((INTVAL (XEXP (XEXP (x, 0), 1)) & (INTVAL (XEXP (XEXP (x, 0), 1)) - 1)) == 0))) && (REG_OR_SUBREG_REG (XEXP (XEXP (x, 0), 0))) - && ((REG_OR_SUBREG_REG (XEXP (XEXP (x, 0), 1))) + && ((REG_OR_SUBREG_REG (XEXP (XEXP (x, 0), 1)) + && !arm_tune_cortex_a9) || GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)) ? 0 : 4)); @@ -19066,6 +19079,7 @@ arm_issue_rate (void) case cortexr4: case cortexr4f: case cortexa8: + case cortexa9: return 2; default: diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index e12c3f9..f83aaba 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -407,6 +407,9 @@ extern int arm_tune_xscale; /* Nonzero if tuning for stores via the write buffer. */ extern int arm_tune_wbuf; +/* Nonzero if tuning for Cortex-A9. */ +extern int arm_tune_cortex_a9; + /* Nonzero if we should define __THUMB_INTERWORK__ in the preprocessor. XXX This is a bit of a hack, it's intended to help work around diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index c5708d6..1c27909 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -341,7 +341,7 @@ (define_attr "generic_sched" "yes,no" (const (if_then_else - (ior (eq_attr "tune" "arm926ejs,arm1020e,arm1026ejs,arm1136js,arm1136jfs,cortexa8") + (ior (eq_attr "tune" "arm926ejs,arm1020e,arm1026ejs,arm1136js,arm1136jfs,cortexa8,cortexa9") (eq_attr "tune_cortexr4" "yes")) (const_string "no") (const_string "yes")))) @@ -349,7 +349,7 @@ (define_attr "generic_vfp" "yes,no" (const (if_then_else (and (eq_attr "fpu" "vfp") - (eq_attr "tune" "!arm1020e,arm1022e,cortexa8") + (eq_attr "tune" "!arm1020e,arm1022e,cortexa8,cortexa9") (eq_attr "tune_cortexr4" "no")) (const_string "yes") (const_string "no")))) @@ -360,6 +360,7 @@ (include "arm1026ejs.md") (include "arm1136jfs.md") (include "cortex-a8.md") +(include "cortex-a9.md") (include "cortex-r4.md") (include "cortex-r4f.md") (include "vfp11.md") diff --git a/gcc/config/arm/cortex-a9.md b/gcc/config/arm/cortex-a9.md new file mode 100644 index 0000000..121fd2d --- /dev/null +++ b/gcc/config/arm/cortex-a9.md @@ -0,0 +1,65 @@ +;; ARM Cortex-A9 VFP pipeline description +;; Copyright (C) 2008 Free Software Foundation, Inc. +;; Written by CodeSourcery. +;; +;; 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/>. + +(define_automaton "cortex_a9") + +;; FIXME: We model a single pipeline for all instructions. +;; Is dual-issue possible, and do we have other pipelines? +(define_cpu_unit "cortex_a9_vfp" "cortex_a9") + +(define_insn_reservation "cortex_a9_ffarith" 1 + (and (eq_attr "tune" "cortexa9") + (eq_attr "type" "fcpys,ffariths,ffarithd,fcmps,fcmpd,fconsts,fconstd")) + "cortex_a9_vfp") + +(define_insn_reservation "cortex_a9_fadd" 4 + (and (eq_attr "tune" "cortexa9") + (eq_attr "type" "fadds,faddd,f_cvt")) + "cortex_a9_vfp") + +(define_insn_reservation "cortex_a9_fmuls" 5 + (and (eq_attr "tune" "cortexa9") + (eq_attr "type" "fmuls")) + "cortex_a9_vfp") + +(define_insn_reservation "cortex_a9_fmuld" 6 + (and (eq_attr "tune" "cortexa9") + (eq_attr "type" "fmuld")) + "cortex_a9_vfp*2") + +(define_insn_reservation "cortex_a9_fmacs" 8 + (and (eq_attr "tune" "cortexa9") + (eq_attr "type" "fmacs")) + "cortex_a9_vfp") + +(define_insn_reservation "cortex_a9_fmacd" 8 + (and (eq_attr "tune" "cortexa9") + (eq_attr "type" "fmacd")) + "cortex_a9_vfp*2") + +(define_insn_reservation "cortex_a9_fdivs" 15 + (and (eq_attr "tune" "cortexa9") + (eq_attr "type" "fdivs")) + "cortex_a9_vfp*10") + +(define_insn_reservation "cortex_a9_fdivd" 25 + (and (eq_attr "tune" "cortexa9") + (eq_attr "type" "fdivd")) + "cortex_a9_vfp*20") |