This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] SPARC: add mcpu=leon3v7 target
- From: Joel Sherrill <joel dot sherrill at oarcorp dot com>
- To: Daniel Hellstrom <daniel at gaisler dot com>, "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: "botcazou at adacore dot com" <botcazou at adacore dot com>, "Sebastian dot Huber at embedded-brains dot de" <Sebastian dot Huber at embedded-brains dot de>, "software at gaisler dot com" <software at gaisler dot com>
- Date: Wed, 20 Aug 2014 10:05:56 -0500
- Subject: Re: [PATCH] SPARC: add mcpu=leon3v7 target
- Authentication-results: sourceware.org; auth=none
- References: <1408546862-8236-1-git-send-email-daniel at gaisler dot com>
Daniel,
Does this mean that Sebastian's patch to add a leon3 multilib for
sparc-rtems
needs to be augmented to handled leon3v7? Or does it need to map to a
regular v7 library?
It just seems like the multilibs should have been touched somehow.
--joel
On 8/20/2014 10:01 AM, Daniel Hellstrom wrote:
> The LEON3/4 soft-core CPU has support for both SPARCv7 and SPARCv8 that
> is configurable at design time. The majority of the LEON3 ASICs are v8
> compatible, however when designing an as small LEON3 as possible, v7
> without FPU is frequently used.
>
> The current GCC leon3 support implies the SPARCv8 instruction set
> which is not compatible with SPARCv7. Relying on the standard SPARCv7
> (-mcpu=v7) target for a LEON3-V7 is not feasible since the atomic
> instruction (CAS) can not be generated by standard v7 target. This
> is also a problem for binaries aiming to be compatible with all LEON3/4
> processors.
>
> * config.gcc (sparc*-*-*): Accept mcpu=leon3v7 processor
> * doc/invoke.texi (SPARC options): add mcpu=leon3v7 comment
> * config/sparc/leon.md (leon3_load, leon_store, leon_fp_*):
> handle leon3v7 as leon3
> * config/sparc/sparc-opts.h (enum processor_type): Add PROCESSOR_LEON3V7
> * config/sparc/sparc.c (sparc_option_override): add leon3v7 support
> * config/sparc/sparc.h (TARGET_CPU_leon3v7): new define
> * config/sparc/sparc.md (cpu): add leon3v7
> * config/sparc/sparc.opt (enum processor_type): Add leon3v7
> ---
> gcc/config.gcc | 5 ++++-
> gcc/config/sparc/leon.md | 14 +++++++-------
> gcc/config/sparc/sparc-opts.h | 1 +
> gcc/config/sparc/sparc.c | 3 +++
> gcc/config/sparc/sparc.h | 38 +++++++++++++++++++++++---------------
> gcc/config/sparc/sparc.md | 1 +
> gcc/config/sparc/sparc.opt | 3 +++
> gcc/doc/invoke.texi | 16 ++++++++--------
> 8 files changed, 50 insertions(+), 31 deletions(-)
>
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 605efc0..199e387 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -3065,6 +3065,9 @@ if test x$with_cpu = x ; then
> *-leon[3-9]*)
> with_cpu=leon3
> ;;
> + *-leon[3-9]v7*)
> + with_cpu=leon3v7
> + ;;
> *)
> with_cpu="`echo ${target} | sed 's/-.*$//'`"
> ;;
> @@ -3749,7 +3752,7 @@ case "${target}" in
> case ${val} in
> "" | sparc | sparcv9 | sparc64 \
> | v7 | cypress \
> - | v8 | supersparc | hypersparc | leon | leon3 \
> + | v8 | supersparc | hypersparc | leon | leon3 | leon3v7 \
> | sparclite | f930 | f934 | sparclite86x \
> | sparclet | tsc701 \
> | v9 | ultrasparc | ultrasparc3 | niagara | niagara2 \
> diff --git a/gcc/config/sparc/leon.md b/gcc/config/sparc/leon.md
> index b511397..e8050fa 100644
> --- a/gcc/config/sparc/leon.md
> +++ b/gcc/config/sparc/leon.md
> @@ -29,11 +29,11 @@
>
> ;; Use a double reservation to work around the load pipeline hazard on UT699.
> (define_insn_reservation "leon3_load" 1
> - (and (eq_attr "cpu" "leon3") (eq_attr "type" "load,sload"))
> + (and (eq_attr "cpu" "leon3,leon3v7") (eq_attr "type" "load,sload"))
> "leon_memory*2")
>
> (define_insn_reservation "leon_store" 2
> - (and (eq_attr "cpu" "leon,leon3") (eq_attr "type" "store"))
> + (and (eq_attr "cpu" "leon,leon3,leon3v7") (eq_attr "type" "store"))
> "leon_memory*2")
>
> ;; This describes Gaisler Research's FPU
> @@ -44,21 +44,21 @@
> (define_cpu_unit "grfpu_ds" "grfpu")
>
> (define_insn_reservation "leon_fp_alu" 4
> - (and (eq_attr "cpu" "leon,leon3") (eq_attr "type" "fp,fpcmp,fpmul"))
> + (and (eq_attr "cpu" "leon,leon3,leon3v7") (eq_attr "type" "fp,fpcmp,fpmul"))
> "grfpu_alu, nothing*3")
>
> (define_insn_reservation "leon_fp_divs" 16
> - (and (eq_attr "cpu" "leon,leon3") (eq_attr "type" "fpdivs"))
> + (and (eq_attr "cpu" "leon,leon3,leon3v7") (eq_attr "type" "fpdivs"))
> "grfpu_ds*14, nothing*2")
>
> (define_insn_reservation "leon_fp_divd" 17
> - (and (eq_attr "cpu" "leon,leon3") (eq_attr "type" "fpdivd"))
> + (and (eq_attr "cpu" "leon,leon3,leon3v7") (eq_attr "type" "fpdivd"))
> "grfpu_ds*15, nothing*2")
>
> (define_insn_reservation "leon_fp_sqrts" 24
> - (and (eq_attr "cpu" "leon,leon3") (eq_attr "type" "fpsqrts"))
> + (and (eq_attr "cpu" "leon,leon3,leon3v7") (eq_attr "type" "fpsqrts"))
> "grfpu_ds*22, nothing*2")
>
> (define_insn_reservation "leon_fp_sqrtd" 25
> - (and (eq_attr "cpu" "leon,leon3") (eq_attr "type" "fpsqrtd"))
> + (and (eq_attr "cpu" "leon,leon3,leon3v7") (eq_attr "type" "fpsqrtd"))
> "grfpu_ds*23, nothing*2")
> diff --git a/gcc/config/sparc/sparc-opts.h b/gcc/config/sparc/sparc-opts.h
> index b5e9761..c35bee4 100644
> --- a/gcc/config/sparc/sparc-opts.h
> +++ b/gcc/config/sparc/sparc-opts.h
> @@ -31,6 +31,7 @@ enum processor_type {
> PROCESSOR_HYPERSPARC,
> PROCESSOR_LEON,
> PROCESSOR_LEON3,
> + PROCESSOR_LEON3V7,
> PROCESSOR_SPARCLITE,
> PROCESSOR_F930,
> PROCESSOR_F934,
> diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
> index e9b2bcf..7f3c43e 100644
> --- a/gcc/config/sparc/sparc.c
> +++ b/gcc/config/sparc/sparc.c
> @@ -1125,6 +1125,7 @@ sparc_option_override (void)
> { TARGET_CPU_hypersparc, PROCESSOR_HYPERSPARC },
> { TARGET_CPU_leon, PROCESSOR_LEON },
> { TARGET_CPU_leon3, PROCESSOR_LEON3 },
> + { TARGET_CPU_leon3v7, PROCESSOR_LEON3V7 },
> { TARGET_CPU_sparclite, PROCESSOR_F930 },
> { TARGET_CPU_sparclite86x, PROCESSOR_SPARCLITE86X },
> { TARGET_CPU_sparclet, PROCESSOR_TSC701 },
> @@ -1153,6 +1154,7 @@ sparc_option_override (void)
> { "hypersparc", MASK_ISA, MASK_V8|MASK_FPU },
> { "leon", MASK_ISA, MASK_V8|MASK_LEON|MASK_FPU },
> { "leon3", MASK_ISA, MASK_V8|MASK_LEON3|MASK_FPU },
> + { "leon3v7", MASK_ISA, MASK_LEON3|MASK_FPU },
> { "sparclite", MASK_ISA, MASK_SPARCLITE },
> /* The Fujitsu MB86930 is the original sparclite chip, with no FPU. */
> { "f930", MASK_ISA|MASK_FPU, MASK_SPARCLITE },
> @@ -1405,6 +1407,7 @@ sparc_option_override (void)
> sparc_costs = &leon_costs;
> break;
> case PROCESSOR_LEON3:
> + case PROCESSOR_LEON3V7:
> sparc_costs = &leon3_costs;
> break;
> case PROCESSOR_SPARCLET:
> diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
> index d96c1b6..0a7bcb7 100644
> --- a/gcc/config/sparc/sparc.h
> +++ b/gcc/config/sparc/sparc.h
> @@ -137,21 +137,22 @@ extern enum cmodel sparc_cmodel;
> #define TARGET_CPU_hypersparc 3
> #define TARGET_CPU_leon 4
> #define TARGET_CPU_leon3 5
> -#define TARGET_CPU_sparclite 6
> -#define TARGET_CPU_f930 6 /* alias */
> -#define TARGET_CPU_f934 6 /* alias */
> -#define TARGET_CPU_sparclite86x 7
> -#define TARGET_CPU_sparclet 8
> -#define TARGET_CPU_tsc701 8 /* alias */
> -#define TARGET_CPU_v9 9 /* generic v9 implementation */
> -#define TARGET_CPU_sparcv9 9 /* alias */
> -#define TARGET_CPU_sparc64 9 /* alias */
> -#define TARGET_CPU_ultrasparc 10
> -#define TARGET_CPU_ultrasparc3 11
> -#define TARGET_CPU_niagara 12
> -#define TARGET_CPU_niagara2 13
> -#define TARGET_CPU_niagara3 14
> -#define TARGET_CPU_niagara4 15
> +#define TARGET_CPU_leon3v7 6
> +#define TARGET_CPU_sparclite 7
> +#define TARGET_CPU_f930 7 /* alias */
> +#define TARGET_CPU_f934 7 /* alias */
> +#define TARGET_CPU_sparclite86x 8
> +#define TARGET_CPU_sparclet 9
> +#define TARGET_CPU_tsc701 9 /* alias */
> +#define TARGET_CPU_v9 10 /* generic v9 implementation */
> +#define TARGET_CPU_sparcv9 10 /* alias */
> +#define TARGET_CPU_sparc64 10 /* alias */
> +#define TARGET_CPU_ultrasparc 11
> +#define TARGET_CPU_ultrasparc3 12
> +#define TARGET_CPU_niagara 13
> +#define TARGET_CPU_niagara2 14
> +#define TARGET_CPU_niagara3 15
> +#define TARGET_CPU_niagara4 16
>
> #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \
> || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc \
> @@ -239,6 +240,11 @@ extern enum cmodel sparc_cmodel;
> #define ASM_CPU32_DEFAULT_SPEC AS_LEON_FLAG
> #endif
>
> +#if TARGET_CPU_DEFAULT == TARGET_CPU_leon3v7
> +#define CPP_CPU32_DEFAULT_SPEC "-D__leon__"
> +#define ASM_CPU32_DEFAULT_SPEC AS_LEON_FLAG
> +#endif
> +
> #endif
>
> #if !defined(CPP_CPU32_DEFAULT_SPEC) || !defined(CPP_CPU64_DEFAULT_SPEC)
> @@ -285,6 +291,7 @@ extern enum cmodel sparc_cmodel;
> %{mcpu=hypersparc:-D__hypersparc__ -D__sparc_v8__} \
> %{mcpu=leon:-D__leon__ -D__sparc_v8__} \
> %{mcpu=leon3:-D__leon__ -D__sparc_v8__} \
> +%{mcpu=leon3v7:-D__leon__} \
> %{mcpu=v9:-D__sparc_v9__} \
> %{mcpu=ultrasparc:-D__sparc_v9__} \
> %{mcpu=ultrasparc3:-D__sparc_v9__} \
> @@ -334,6 +341,7 @@ extern enum cmodel sparc_cmodel;
> %{mcpu=hypersparc:-Av8} \
> %{mcpu=leon:" AS_LEON_FLAG "} \
> %{mcpu=leon3:" AS_LEON_FLAG "} \
> +%{mcpu=leon3v7:" AS_LEON_FLAG "} \
> %{mv8plus:-Av8plus} \
> %{mcpu=v9:-Av9} \
> %{mcpu=ultrasparc:%{!mv8plus:-Av9a}} \
> diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md
> index 174a6b1..b074367 100644
> --- a/gcc/config/sparc/sparc.md
> +++ b/gcc/config/sparc/sparc.md
> @@ -215,6 +215,7 @@
> hypersparc,
> leon,
> leon3,
> + leon3v7,
> sparclite,
> f930,
> f934,
> diff --git a/gcc/config/sparc/sparc.opt b/gcc/config/sparc/sparc.opt
> index 3ccd54f..ac9e6b1 100644
> --- a/gcc/config/sparc/sparc.opt
> +++ b/gcc/config/sparc/sparc.opt
> @@ -149,6 +149,9 @@ EnumValue
> Enum(sparc_processor_type) String(leon3) Value(PROCESSOR_LEON3)
>
> EnumValue
> +Enum(sparc_processor_type) String(leon3v7) Value(PROCESSOR_LEON3V7)
> +
> +EnumValue
> Enum(sparc_processor_type) String(sparclite) Value(PROCESSOR_SPARCLITE)
>
> EnumValue
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 508bbb4..21b122a 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -19606,8 +19606,8 @@ the rules of the ABI@.
> 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{hypersparc},
> -@samp{leon}, @samp{leon3}, @samp{sparclite}, @samp{f930}, @samp{f934},
> -@samp{sparclite86x}, @samp{sparclet}, @samp{tsc701}, @samp{v9},
> +@samp{leon}, @samp{leon3}, @samp{leon3v7}, @samp{sparclite}, @samp{f930},
> +@samp{f934}, @samp{sparclite86x}, @samp{sparclet}, @samp{tsc701}, @samp{v9},
> @samp{ultrasparc}, @samp{ultrasparc3}, @samp{niagara}, @samp{niagara2},
> @samp{niagara3} and @samp{niagara4}.
>
> @@ -19625,7 +19625,7 @@ implementations.
>
> @table @asis
> @item v7
> -cypress
> +cypress, leon3v7
>
> @item v8
> supersparc, hypersparc, leon, leon3
> @@ -19690,11 +19690,11 @@ option @option{-mcpu=@var{cpu_type}} does.
> 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{leon}, @samp{leon3}, @samp{f930},
> -@samp{f934}, @samp{sparclite86x}, @samp{tsc701}, @samp{ultrasparc},
> -@samp{ultrasparc3}, @samp{niagara}, @samp{niagara2}, @samp{niagara3} and
> -@samp{niagara4}. With native Solaris and GNU/Linux toolchains, @samp{native}
> -can also be used.
> +@samp{supersparc}, @samp{hypersparc}, @samp{leon}, @samp{leon3},
> +@samp{leon3v7}, @samp{f930}, @samp{f934}, @samp{sparclite86x}, @samp{tsc701},
> +@samp{ultrasparc}, @samp{ultrasparc3}, @samp{niagara}, @samp{niagara2},
> +@samp{niagara3} and @samp{niagara4}. With native Solaris and GNU/Linux
> +toolchains, @samp{native} can also be used.
>
> @item -mv8plus
> @itemx -mno-v8plus
--
Joel Sherrill, Ph.D. Director of Research & Development
joel.sherrill@OARcorp.com On-Line Applications Research
Ask me about RTEMS: a free RTOS Huntsville AL 35805
Support Available (256) 722-9985