On 11/28/2011 10:12 AM, Richard Henderson wrote:
> Richard Henderson (5):
>   sparc: Convert to mem_thread_fence.
>   sparc: Convert to atomic_load/store.
>   sparc: Convert to atomic_compare_and_swap.
>   sparc: Convert to atomic_exchange.
>   sparc: Add -mmemory-model command-line option.
> 
>  gcc/config/sparc/constraints.md |    5 +-
>  gcc/config/sparc/predicates.md  |   13 ++
>  gcc/config/sparc/sparc-opts.h   |   10 ++
>  gcc/config/sparc/sparc-protos.h |    4 +-
>  gcc/config/sparc/sparc.c        |  149 ++++++++++++++++++++++-
>  gcc/config/sparc/sparc.md       |    1 +
>  gcc/config/sparc/sparc.opt      |   22 ++++
>  gcc/config/sparc/sync.md        |  258 
> +++++++++++++++++++++++++--------------
>  gcc/doc/invoke.texi             |   74 ++++++++---
>  9 files changed, 420 insertions(+), 116 deletions(-)

I've committed this sequence to mainline after re-testing on sparc64-linux.

As a follow-up, I have a patch to change the default memory model to TSO for 
all versions of both Linux and Solaris.  This leaves the memory model set to 
the most relaxed for the cpu when targeting other OSs, and I suppose in 
particular RTEMS.

I guess my only question is: has TSO always been the default for Solaris?  I 
seem to recall Dave saying that Linux used to be RMO, but so long ago that 
surely no one is using new software on it...

Please give me a yea or nay on the assumptions above.


r~
commit 8d403cd6a943589c708728ef9c3d472d5f810e44
Author: Richard Henderson <r...@redhat.com>
Date:   Wed Nov 30 08:32:34 2011 -0800

    sparc: Default memory model to TSO for Linux and Solaris.

diff --git a/gcc/config.gcc b/gcc/config.gcc
index a477289..d0f7b28 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -2357,7 +2357,7 @@ sparc-*-rtems*)
        tmake_file="sparc/t-sparc sparc/t-elf t-rtems"
        ;;
 sparc-*-linux*)
-       tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h 
glibc-stdint.h"
+       tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h 
glibc-stdint.h sparc/tso.h"
        extra_options="${extra_options} sparc/long-double-switch.opt"
        case ${target} in
            *-leon-*)
@@ -2384,7 +2384,7 @@ sparc-*-netbsdelf*)
        tmake_file="${tmake_file} sparc/t-sparc"
        ;;
 sparc*-*-solaris2*)
-       tm_file="sparc/biarch64.h ${tm_file} ${sol2_tm_file} sol2-bi.h"
+       tm_file="sparc/biarch64.h ${tm_file} ${sol2_tm_file} sol2-bi.h 
sparc/tso.h"
        case ${target} in
            sparc64-*-* | sparcv9-*-*)
                tm_file="sparc/default-64.h ${tm_file}"
@@ -2410,7 +2410,7 @@ sparc64-*-rtems*)
        tmake_file="${tmake_file} sparc/t-sparc t-rtems"
        ;;
 sparc64-*-linux*)
-       tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h sparc/sysv4.h 
gnu-user.h linux.h glibc-stdint.h sparc/default-64.h sparc/linux64.h"
+       tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h sparc/sysv4.h 
gnu-user.h linux.h glibc-stdint.h sparc/default-64.h sparc/linux64.h 
sparc/tso.h"
        extra_options="${extra_options} sparc/long-double-switch.opt"
        tmake_file="${tmake_file} sparc/t-sparc sparc/t-linux64"
        ;;
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 713db26..20efb00 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -1162,8 +1162,12 @@ sparc_option_override (void)
 
   if (sparc_memory_model == SMM_DEFAULT)
     {
+      /* Choose the memory model for the operating system.  */
+      enum sparc_memory_model_type os_default = SUBTARGET_DEFAULT_MEMORY_MODEL;
+      if (os_default != SMM_DEFAULT)
+       sparc_memory_model = os_default;
       /* Choose the most relaxed model for the processor.  */
-      if (TARGET_V9)
+      else if (TARGET_V9)
        sparc_memory_model = SMM_RMO;
       else if (TARGET_V8)
        sparc_memory_model = SMM_PSO;
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
index 32f8c10..bb6b079 100644
--- a/gcc/config/sparc/sparc.h
+++ b/gcc/config/sparc/sparc.h
@@ -1755,3 +1755,8 @@ extern int sparc_indent_opcode;
 #define MASK_DEBUG_ALL                 MASK_DEBUG_OPTIONS
 
 #define TARGET_DEBUG_OPTIONS           (sparc_debug & MASK_DEBUG_OPTIONS)
+
+/* By default, use the weakest memory model for the cpu.  */
+#ifndef SUBTARGET_DEFAULT_MEMORY_MODEL
+#define SUBTARGET_DEFAULT_MEMORY_MODEL SMM_DEFAULT
+#endif
diff --git a/gcc/config/sparc/tso.h b/gcc/config/sparc/tso.h
new file mode 100644
index 0000000..c81ea4d
--- /dev/null
+++ b/gcc/config/sparc/tso.h
@@ -0,0 +1,23 @@
+/* Include fragment for Sparc TSO operating systems.
+   Copyright (C) 2011 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
+<http://www.gnu.org/licenses/>.  */
+
+
+/* This operating system sets PSTATE.MM to the TSO memory model.  */
+#undef SUBTARGET_DEFAULT_MEMORY_MODEL
+#define SUBTARGET_DEFAULT_MEMORY_MODEL SMM_TSO

Reply via email to