From 6dbce0cb9f12d1bea21bcef8d9a661ddec2ba6a4 Mon Sep 17 00:00:00 2001 From: davem Date: Thu, 2 Mar 2006 22:47:02 +0000 Subject: [PATCH] Sun Niagara specific optimizations. * config.gcc: Recognize niagara as target. * config/sparc/sparc.h (SPARC_RELAXED_ORDERING): Mention Niagara. (TARGET_CPU_niagara): Define. (CPP_CPU64_DEFAULT_SPEC): Define __sparc_v9__ for Niagara. (ASM_CPU64_DEFAULT_SPEC): Pass -Av9b for Niagara. (CPP_CPU_SPEC): Handle -mcpu=niagara. (ASM_CPU_SPEC): Likewise. (PROCESSOR_NIAGARA): New enum entry. (REGISTER_MOVE_COST): Handle Niagara. (BRANCH_COST, PREFETCH_BLOCK, SIMULTANEOUS_PREFETCHES): Likewise. * config/sparc/sparc.c (niagara_costs): New processor_costs entry. (sparc_override_options): Recognize "niagara", set appropriate default MASK_* values for it, and align functions to 32-bytes by default just like ULTRASPARC/ULTRASPARC3. (sparc_initialize_trampoline): Handle niagara like ultrasparc. (sparc64_initialize_trampoline): Likewise. (sparc_use_sched_lookahead): Use zero for niagara. (sparc_issue_rate): Use one for niagara. * config/sparc/niagara.md: New file. * config/sparc/sparc.md: Include it. * config/sparc/sol2-bi.h (CPP_CPU64_DEFAULT_SPEC, ASM_CPU32_DEFAULT_SPEC, ASM_CPU64_DEFAULT_SPEC): Set appropriately when default cpu is niagara. (CPP_CPU_SPEC): Handle -mcpu=niagara. (ASM_CPU_SPEC): Likewise. * config/sparc/sol2.h (ASM_CPU_DEFAULT_SPEC): Set appropriately when default cpu is niagara. (ASM_CPU_SPEC): Handle -mcpu=niagara. * config/sparc/linux64.h: Handle a default of TARGET_CPU_niagara just like v9/ultrasparc/ultrasparc3. * doc/invoke.texi: Add documentation for "niagara" and improve existing documentation for ultrasparc variants. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111648 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 36 ++++++++++++++ gcc/config.gcc | 2 +- gcc/config/sparc/linux64.h | 3 +- gcc/config/sparc/niagara.md | 119 ++++++++++++++++++++++++++++++++++++++++++++ gcc/config/sparc/sol2-bi.h | 14 +++++- gcc/config/sparc/sol2.h | 10 +++- gcc/config/sparc/sparc.c | 42 ++++++++++++++-- gcc/config/sparc/sparc.h | 36 ++++++++++---- gcc/config/sparc/sparc.md | 6 ++- gcc/doc/invoke.texi | 16 +++--- 10 files changed, 257 insertions(+), 27 deletions(-) create mode 100644 gcc/config/sparc/niagara.md diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cfc4b0afe83..53fbd75baf7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,39 @@ +2006-03-02 David S. Miller + + Sun Niagara specific optimizations. + * config.gcc: Recognize niagara as target. + * config/sparc/sparc.h (SPARC_RELAXED_ORDERING): Mention Niagara. + (TARGET_CPU_niagara): Define. + (CPP_CPU64_DEFAULT_SPEC): Define __sparc_v9__ for Niagara. + (ASM_CPU64_DEFAULT_SPEC): Pass -Av9b for Niagara. + (CPP_CPU_SPEC): Handle -mcpu=niagara. + (ASM_CPU_SPEC): Likewise. + (PROCESSOR_NIAGARA): New enum entry. + (REGISTER_MOVE_COST): Handle Niagara. + (BRANCH_COST, PREFETCH_BLOCK, SIMULTANEOUS_PREFETCHES): Likewise. + * config/sparc/sparc.c (niagara_costs): New processor_costs entry. + (sparc_override_options): Recognize "niagara", set appropriate + default MASK_* values for it, and align functions to 32-bytes + by default just like ULTRASPARC/ULTRASPARC3. + (sparc_initialize_trampoline): Handle niagara like ultrasparc. + (sparc64_initialize_trampoline): Likewise. + (sparc_use_sched_lookahead): Use zero for niagara. + (sparc_issue_rate): Use one for niagara. + * config/sparc/niagara.md: New file. + * config/sparc/sparc.md: Include it. + * config/sparc/sol2-bi.h (CPP_CPU64_DEFAULT_SPEC, + ASM_CPU32_DEFAULT_SPEC, ASM_CPU64_DEFAULT_SPEC): Set appropriately + when default cpu is niagara. + (CPP_CPU_SPEC): Handle -mcpu=niagara. + (ASM_CPU_SPEC): Likewise. + * config/sparc/sol2.h (ASM_CPU_DEFAULT_SPEC): Set appropriately + when default cpu is niagara. + (ASM_CPU_SPEC): Handle -mcpu=niagara. + * config/sparc/linux64.h: Handle a default of TARGET_CPU_niagara + just like v9/ultrasparc/ultrasparc3. + * doc/invoke.texi: Add documentation for "niagara" and improve + existing documentation for ultrasparc variants. + 2006-03-02 Diego Novillo * tree-ssa-operands.c (update_stmt_operands): Update documentation. diff --git a/gcc/config.gcc b/gcc/config.gcc index c7890374c3b..403fb1039cc 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -2830,7 +2830,7 @@ case "${target}" in "" | sparc | sparcv9 | sparc64 | sparc86x \ | v7 | cypress | v8 | supersparc | sparclite | f930 \ | f934 | hypersparc | sparclite86x | sparclet | tsc701 \ - | v9 | ultrasparc | ultrasparc3) + | v9 | ultrasparc | ultrasparc3 | niagara) # OK ;; *) diff --git a/gcc/config/sparc/linux64.h b/gcc/config/sparc/linux64.h index a6244f1ed8a..b0ddf4b3d3b 100644 --- a/gcc/config/sparc/linux64.h +++ b/gcc/config/sparc/linux64.h @@ -43,7 +43,8 @@ Boston, MA 02110-1301, USA. */ #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc \ - || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc3 + || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc3 \ + || TARGET_CPU_DEFAULT == TARGET_CPU_niagara /* A 64 bit v9 compiler with stack-bias, in a Medium/Low code model environment. */ diff --git a/gcc/config/sparc/niagara.md b/gcc/config/sparc/niagara.md new file mode 100644 index 00000000000..ea431b521d6 --- /dev/null +++ b/gcc/config/sparc/niagara.md @@ -0,0 +1,119 @@ +;; Scheduling description for Niagara. +;; Copyright (C) 2006 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 2, 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 COPYING. If not, write to +;; the Free Software Foundation, 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;; Niagara is a single-issue processor. + +(define_automaton "niagara_0") + +(define_cpu_unit "niag_pipe" "niagara_0") + +(define_insn_reservation "niag_5cycle" 5 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "multi,flushw,iflush,trap")) + "niag_pipe*5") + +(define_insn_reservation "niag_4cycle" 4 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "savew")) + "niag_pipe*4") + +/* Most basic operations are single-cycle. */ +(define_insn_reservation "niag_ialu" 1 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "ialu,shift,compare,cmove")) + "niag_pipe") + +(define_insn_reservation "niag_imul" 11 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "imul")) + "niag_pipe*11") + +(define_insn_reservation "niag_idiv" 72 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "idiv")) + "niag_pipe*72") + +(define_insn_reservation "niag_branch" 3 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "call,sibcall,call_no_delay_slot,uncond_branch,branch")) + "niag_pipe*3") + +(define_insn_reservation "niag_3cycle_load" 3 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "load")) + "niag_pipe*3") + +(define_insn_reservation "niag_9cycle_load" 9 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "fpload")) + "niag_pipe*9") + +(define_insn_reservation "niag_1cycle_store" 1 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "store")) + "niag_pipe") + +(define_insn_reservation "niag_8cycle_store" 8 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "fpstore")) + "niag_pipe*8") + +/* Things incorrectly modelled here: + * FPADD{s,d}: 26 cycles + * FPSUB{s,d}: 26 cycles + * FABSD: 26 cycles + * F{s,d}TO{s,d}: 26 cycles + * F{s,d}TO{i,x}: 26 cycles + * FSMULD: 29 cycles + */ +(define_insn_reservation "niag_fmov" 8 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "fpmove,fpcmove,fpcrmove")) + "niag_pipe*8") + +(define_insn_reservation "niag_fpcmp" 26 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "fpcmp")) + "niag_pipe*26") + +(define_insn_reservation "niag_fmult" 29 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "fpmul")) + "niag_pipe*29") + +(define_insn_reservation "niag_fdivs" 54 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "fpdivs")) + "niag_pipe*54") + +(define_insn_reservation "niag_fdivd" 83 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "fpdivd")) + "niag_pipe*83") + +/* Things incorrectly modelled here: + * FPADD{16,32}: 10 cycles + * FPSUB{16,32}: 10 cycles + * FALIGNDATA: 10 cycles + */ +(define_insn_reservation "niag_vis" 8 + (and (eq_attr "cpu" "niagara") + (eq_attr "type" "fga,fgm_pack,fgm_mul,fgm_cmp,fgm_pdist")) + "niag_pipe*8") diff --git a/gcc/config/sparc/sol2-bi.h b/gcc/config/sparc/sol2-bi.h index c41d50f6eed..87d14f0f1cd 100644 --- a/gcc/config/sparc/sol2-bi.h +++ b/gcc/config/sparc/sol2-bi.h @@ -39,6 +39,15 @@ #define ASM_CPU64_DEFAULT_SPEC AS_SPARC64_FLAG "b" #endif +#if TARGET_CPU_DEFAULT == TARGET_CPU_niagara +#undef CPP_CPU64_DEFAULT_SPEC +#define CPP_CPU64_DEFAULT_SPEC "" +#undef ASM_CPU32_DEFAULT_SPEC +#define ASM_CPU32_DEFAULT_SPEC "-xarch=v8plusb" +#undef ASM_CPU64_DEFAULT_SPEC +#define ASM_CPU64_DEFAULT_SPEC AS_SPARC64_FLAG "b" +#endif + #if DEFAULT_ARCH32_P #define DEF_ARCH32_SPEC(__str) "%{!m64:" __str "}" #define DEF_ARCH64_SPEC(__str) "%{m64:" __str "}" @@ -57,7 +66,7 @@ %{mcpu=sparclite|mcpu-f930|mcpu=f934:-D__sparclite__} \ %{mcpu=v8:" DEF_ARCH32_SPEC("-D__sparcv8") "} \ %{mcpu=supersparc:-D__supersparc__ " DEF_ARCH32_SPEC("-D__sparcv8") "} \ -%{mcpu=v9|mcpu=ultrasparc|mcpu=ultrasparc3:" DEF_ARCH32_SPEC("-D__sparcv8") "} \ +%{mcpu=v9|mcpu=ultrasparc|mcpu=ultrasparc3|mcpu=niagara:" DEF_ARCH32_SPEC("-D__sparcv8") "} \ %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:%(cpp_cpu_default)}}}}}}} \ " @@ -66,7 +75,8 @@ %{mcpu=v9:" DEF_ARCH32_SPEC("-xarch=v8plus") DEF_ARCH64_SPEC(AS_SPARC64_FLAG) "} \ %{mcpu=ultrasparc:" DEF_ARCH32_SPEC("-xarch=v8plusa") DEF_ARCH64_SPEC(AS_SPARC64_FLAG "a") "} \ %{mcpu=ultrasparc3:" DEF_ARCH32_SPEC("-xarch=v8plusb") DEF_ARCH64_SPEC(AS_SPARC64_FLAG "b") "} \ -%{!mcpu=ultrasparc3:%{!mcpu=ultrasparc:%{!mcpu=v9:%{mcpu*:" DEF_ARCH32_SPEC("-xarch=v8") DEF_ARCH64_SPEC(AS_SPARC64_FLAG) "}}}} \ +%{mcpu=niagara:" DEF_ARCH32_SPEC("-xarch=v8plusb") DEF_ARCH64_SPEC(AS_SPARC64_FLAG "b") "} \ +%{!mcpu=niagara:%{!mcpu=ultrasparc3:%{!mcpu=ultrasparc:%{!mcpu=v9:%{mcpu*:" DEF_ARCH32_SPEC("-xarch=v8") DEF_ARCH64_SPEC(AS_SPARC64_FLAG) "}}}}} \ %{!mcpu*:%(asm_cpu_default)} \ " diff --git a/gcc/config/sparc/sol2.h b/gcc/config/sparc/sol2.h index 4b3ee2d7f23..d07e0c63685 100644 --- a/gcc/config/sparc/sol2.h +++ b/gcc/config/sparc/sol2.h @@ -1,6 +1,6 @@ /* Definitions of target machine for GCC, for SPARC running Solaris 2 - Copyright 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005 - Free Software Foundation, Inc. + Copyright 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005, + 2006 Free Software Foundation, Inc. Contributed by Ron Guilmette (rfg@netcom.com). Additional changes by David V. Henkel-Wallace (gumby@cygnus.com). @@ -41,11 +41,17 @@ Boston, MA 02110-1301, USA. */ #define ASM_CPU_DEFAULT_SPEC "-xarch=v8plusb" #endif +#if TARGET_CPU_DEFAULT == TARGET_CPU_niagara +#undef ASM_CPU_DEFAULT_SPEC +#define ASM_CPU_DEFAULT_SPEC "-xarch=v8plusb" +#endif + #undef ASM_CPU_SPEC #define ASM_CPU_SPEC "\ %{mcpu=v9:-xarch=v8plus} \ %{mcpu=ultrasparc:-xarch=v8plusa} \ %{mcpu=ultrasparc3:-xarch=v8plusb} \ +%{mcpu=niagara:-xarch=v8plusb} \ %{!mcpu*:%(asm_cpu_default)} \ " diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index f44c6d0ad19..709a92b518e 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -197,6 +197,30 @@ struct processor_costs ultrasparc3_costs = { 0, /* shift penalty */ }; +static const +struct processor_costs niagara_costs = { + COSTS_N_INSNS (3), /* int load */ + COSTS_N_INSNS (3), /* int signed load */ + COSTS_N_INSNS (3), /* int zeroed load */ + COSTS_N_INSNS (9), /* float load */ + COSTS_N_INSNS (8), /* fmov, fneg, fabs */ + COSTS_N_INSNS (8), /* fadd, fsub */ + COSTS_N_INSNS (26), /* fcmp */ + COSTS_N_INSNS (8), /* fmov, fmovr */ + COSTS_N_INSNS (29), /* fmul */ + COSTS_N_INSNS (54), /* fdivs */ + COSTS_N_INSNS (83), /* fdivd */ + COSTS_N_INSNS (100), /* fsqrts - not implemented in hardware */ + COSTS_N_INSNS (100), /* fsqrtd - not implemented in hardware */ + COSTS_N_INSNS (11), /* imul */ + COSTS_N_INSNS (11), /* imulX */ + 0, /* imul bit factor */ + COSTS_N_INSNS (72), /* idiv */ + COSTS_N_INSNS (72), /* idivX */ + COSTS_N_INSNS (1), /* movcc/movr */ + 0, /* shift penalty */ +}; + const struct processor_costs *sparc_costs = &cypress_costs; #ifdef HAVE_AS_RELAX_OPTION @@ -597,6 +621,7 @@ sparc_override_options (void) { TARGET_CPU_v9, "v9" }, { TARGET_CPU_ultrasparc, "ultrasparc" }, { TARGET_CPU_ultrasparc3, "ultrasparc3" }, + { TARGET_CPU_niagara, "niagara" }, { 0, 0 } }; const struct cpu_default *def; @@ -632,6 +657,8 @@ sparc_override_options (void) /* TI ultrasparc III */ /* ??? Check if %y issue still holds true in ultra3. */ { "ultrasparc3", PROCESSOR_ULTRASPARC3, MASK_ISA, MASK_V9|MASK_DEPRECATED_V8_INSNS}, + /* UltraSPARC T1 */ + { "niagara", PROCESSOR_NIAGARA, MASK_ISA, MASK_V9|MASK_DEPRECATED_V8_INSNS}, { 0, 0, 0, 0 } }; const struct cpu_table *cpu; @@ -741,7 +768,8 @@ sparc_override_options (void) /* Supply a default value for align_functions. */ if (align_functions == 0 && (sparc_cpu == PROCESSOR_ULTRASPARC - || sparc_cpu == PROCESSOR_ULTRASPARC3)) + || sparc_cpu == PROCESSOR_ULTRASPARC3 + || sparc_cpu == PROCESSOR_NIAGARA)) align_functions = 32; /* Validate PCC_STRUCT_RETURN. */ @@ -790,6 +818,9 @@ sparc_override_options (void) case PROCESSOR_ULTRASPARC3: sparc_costs = &ultrasparc3_costs; break; + case PROCESSOR_NIAGARA: + sparc_costs = &niagara_costs; + break; }; #ifdef TARGET_DEFAULT_LONG_DOUBLE_128 @@ -7099,7 +7130,8 @@ sparc_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt) aligned on a 16 byte boundary so one flush clears it all. */ emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode, tramp)))); if (sparc_cpu != PROCESSOR_ULTRASPARC - && sparc_cpu != PROCESSOR_ULTRASPARC3) + && sparc_cpu != PROCESSOR_ULTRASPARC3 + && sparc_cpu != PROCESSOR_NIAGARA) emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode, plus_constant (tramp, 8))))); @@ -7141,7 +7173,8 @@ sparc64_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt) emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode, tramp)))); if (sparc_cpu != PROCESSOR_ULTRASPARC - && sparc_cpu != PROCESSOR_ULTRASPARC3) + && sparc_cpu != PROCESSOR_ULTRASPARC3 + && sparc_cpu != PROCESSOR_NIAGARA) emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode, plus_constant (tramp, 8))))); /* Call __enable_execute_stack after writing onto the stack to make sure @@ -7321,6 +7354,8 @@ sparc_sched_init (FILE *dump ATTRIBUTE_UNUSED, static int sparc_use_sched_lookahead (void) { + if (sparc_cpu == PROCESSOR_NIAGARA) + return 0; if (sparc_cpu == PROCESSOR_ULTRASPARC || sparc_cpu == PROCESSOR_ULTRASPARC3) return 4; @@ -7336,6 +7371,7 @@ sparc_issue_rate (void) { switch (sparc_cpu) { + case PROCESSOR_NIAGARA: default: return 1; case PROCESSOR_V9: diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index bb4647c1e86..1d595bc395b 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -1,6 +1,6 @@ /* Definitions of target machine for GNU compiler, for Sun SPARC. Copyright (C) 1987, 1988, 1989, 1992, 1994, 1995, 1996, 1997, 1998, 1999 - 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com). 64-bit SPARC-V9 support by Michael Tiemann, Jim Wilson, and Doug Evans, at Cygnus Support. @@ -206,7 +206,7 @@ extern enum cmodel sparc_cmodel; which requires the following macro to be true if enabled. Prior to V9, there are no instructions to even talk about memory synchronization. Note that the UltraSPARC III processors don't implement RMO, unlike the - UltraSPARC II processors. + UltraSPARC II processors. Niagara does not implement RMO either. Default to false; for example, Solaris never enables RMO, only ever uses total memory ordering (TMO). */ @@ -238,10 +238,12 @@ extern enum cmodel sparc_cmodel; #define TARGET_CPU_sparc64 7 /* alias */ #define TARGET_CPU_ultrasparc 8 #define TARGET_CPU_ultrasparc3 9 +#define TARGET_CPU_niagara 10 #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc \ - || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc3 + || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc3 \ + || TARGET_CPU_DEFAULT == TARGET_CPU_niagara #define CPP_CPU32_DEFAULT_SPEC "" #define ASM_CPU32_DEFAULT_SPEC "" @@ -262,6 +264,10 @@ extern enum cmodel sparc_cmodel; #define CPP_CPU64_DEFAULT_SPEC "-D__sparc_v9__" #define ASM_CPU64_DEFAULT_SPEC "-Av9b" #endif +#if TARGET_CPU_DEFAULT == TARGET_CPU_niagara +#define CPP_CPU64_DEFAULT_SPEC "-D__sparc_v9__" +#define ASM_CPU64_DEFAULT_SPEC "-Av9b" +#endif #else @@ -352,6 +358,7 @@ extern enum cmodel sparc_cmodel; %{mcpu=v9:-D__sparc_v9__} \ %{mcpu=ultrasparc:-D__sparc_v9__} \ %{mcpu=ultrasparc3:-D__sparc_v9__} \ +%{mcpu=niagara:-D__sparc_v9__} \ %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:%(cpp_cpu_default)}}}}}}} \ " #define CPP_ARCH32_SPEC "" @@ -401,6 +408,7 @@ extern enum cmodel sparc_cmodel; %{mcpu=v9:-Av9} \ %{mcpu=ultrasparc:%{!mv8plus:-Av9a}} \ %{mcpu=ultrasparc3:%{!mv8plus:-Av9b}} \ +%{mcpu=niagara:%{!mv8plus:-Av9b}} \ %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:%(asm_cpu_default)}}}}}}} \ " @@ -524,7 +532,8 @@ enum processor_type { PROCESSOR_TSC701, PROCESSOR_V9, PROCESSOR_ULTRASPARC, - PROCESSOR_ULTRASPARC3 + PROCESSOR_ULTRASPARC3, + PROCESSOR_NIAGARA }; /* This is set from -m{cpu,tune}=xxx. */ @@ -2137,7 +2146,8 @@ do { \ || (GENERAL_OR_I64 (CLASS1) && FP_REG_CLASS_P (CLASS2)) \ || (CLASS1) == FPCC_REGS || (CLASS2) == FPCC_REGS) \ ? ((sparc_cpu == PROCESSOR_ULTRASPARC \ - || sparc_cpu == PROCESSOR_ULTRASPARC3) ? 12 : 6) : 2) + || sparc_cpu == PROCESSOR_ULTRASPARC3 \ + || sparc_cpu == PROCESSOR_NIAGARA) ? 12 : 6) : 2) /* Provide the cost of a branch. For pre-v9 processors we use a value of 3 to take into account the potential annulling of @@ -2147,22 +2157,30 @@ do { \ On v9 and later, which have branch prediction facilities, we set it to the depth of the pipeline as that is the cost of a - mispredicted branch. */ + mispredicted branch. + + On Niagara, normal branches insert 3 bubbles into the pipe + and annulled branches insert 4 bubbles. */ #define BRANCH_COST \ ((sparc_cpu == PROCESSOR_V9 \ || sparc_cpu == PROCESSOR_ULTRASPARC) \ ? 7 \ : (sparc_cpu == PROCESSOR_ULTRASPARC3 \ - ? 9 : 3)) + ? 9 \ + : (sparc_cpu == PROCESSOR_NIAGARA \ + ? 4 \ + : 3))) #define PREFETCH_BLOCK \ ((sparc_cpu == PROCESSOR_ULTRASPARC \ - || sparc_cpu == PROCESSOR_ULTRASPARC3) \ + || sparc_cpu == PROCESSOR_ULTRASPARC3 \ + || sparc_cpu == PROCESSOR_NIAGARA) \ ? 64 : 32) #define SIMULTANEOUS_PREFETCHES \ - ((sparc_cpu == PROCESSOR_ULTRASPARC) \ + ((sparc_cpu == PROCESSOR_ULTRASPARC \ + || sparc_cpu == PROCESSOR_NIAGARA) \ ? 2 \ : (sparc_cpu == PROCESSOR_ULTRASPARC3 \ ? 8 : 3)) diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md index 0adb300c338..b6ebb8287a1 100644 --- a/gcc/config/sparc/sparc.md +++ b/gcc/config/sparc/sparc.md @@ -1,6 +1,6 @@ ;; Machine description for SPARC chip for GCC ;; Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, -;; 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +;; 1999, 2000, 2001, 2002, 2003, 2004, 2005,2006 Free Software Foundation, Inc. ;; Contributed by Michael Tiemann (tiemann@cygnus.com) ;; 64-bit SPARC-V9 support by Michael Tiemann, Jim Wilson, and Doug Evans, ;; at Cygnus Support. @@ -94,7 +94,8 @@ sparclet,tsc701, v9, ultrasparc, - ultrasparc3" + ultrasparc3, + niagara" (const (symbol_ref "sparc_cpu_attr"))) ;; Attribute for the instruction set. @@ -315,6 +316,7 @@ (include "sparclet.md") (include "ultra1_2.md") (include "ultra3.md") +(include "niagara.md") ;; Operand and operator predicates. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 1c4f90922d9..d1c2efdb98f 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -12268,8 +12268,8 @@ Set the instruction set, register set, and instruction scheduling parameters for machine type @var{cpu_type}. Supported values for @var{cpu_type} are @samp{v7}, @samp{cypress}, @samp{v8}, @samp{supersparc}, @samp{sparclite}, @samp{f930}, @samp{f934}, @samp{hypersparc}, @samp{sparclite86x}, -@samp{sparclet}, @samp{tsc701}, @samp{v9}, @samp{ultrasparc}, and -@samp{ultrasparc3}. +@samp{sparclet}, @samp{tsc701}, @samp{v9}, @samp{ultrasparc}, +@samp{ultrasparc3}, and @samp{niagara}. Default instruction scheduling parameters are used for values that select an architecture and not an implementation. These are @samp{v7}, @samp{v8}, @@ -12283,7 +12283,7 @@ implementations. v8: supersparc, hypersparc sparclite: f930, f934, sparclite86x sparclet: tsc701 - v9: ultrasparc, ultrasparc3 + v9: ultrasparc, ultrasparc3, niagara @end smallexample By default (unless configured otherwise), GCC generates code for the V7 @@ -12317,9 +12317,11 @@ With @option{-mcpu=v9}, GCC generates code for the V9 variant of the SPARC architecture. This adds 64-bit integer and floating-point move instructions, 3 additional floating-point condition code registers and conditional move instructions. With @option{-mcpu=ultrasparc}, the compiler additionally -optimizes it for the Sun UltraSPARC I/II chips. With +optimizes it for the Sun UltraSPARC I/II/IIi chips. With @option{-mcpu=ultrasparc3}, the compiler additionally optimizes it for the -Sun UltraSPARC III chip. +Sun UltraSPARC III/III+/IIIi/IIIi+/IV/IV+ chips. With +@option{-mcpu=niagara}, the compiler additionally optimizes it for +Sun UltraSPARC T1 chips. @item -mtune=@var{cpu_type} @opindex mtune @@ -12331,8 +12333,8 @@ The same values for @option{-mcpu=@var{cpu_type}} can be used for @option{-mtune=@var{cpu_type}}, but the only useful values are those that select a particular cpu implementation. Those are @samp{cypress}, @samp{supersparc}, @samp{hypersparc}, @samp{f930}, @samp{f934}, -@samp{sparclite86x}, @samp{tsc701}, @samp{ultrasparc}, and -@samp{ultrasparc3}. +@samp{sparclite86x}, @samp{tsc701}, @samp{ultrasparc}, +@samp{ultrasparc3}, and @samp{niagara}. @item -mv8plus @itemx -mno-v8plus -- 2.11.4.GIT