Commit 7612f14d by Paul Brook Committed by Paul Brook

arm.c (arm_tune_cortex_a9): Define.

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.

From-SVN: r139891
parent a1b969a0
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
......
......@@ -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)
......
;; -*- 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")))
......@@ -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:
......
......@@ -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
......
......@@ -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")
......
;; 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")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment