From patchwork Wed Nov 30 16:39:44 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 128536 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 57B9C1007D3 for ; Thu, 1 Dec 2011 03:40:16 +1100 (EST) Received: (qmail 1441 invoked by alias); 30 Nov 2011 16:40:09 -0000 Received: (qmail 1238 invoked by uid 22791); 30 Nov 2011 16:40:04 -0000 X-SWARE-Spam-Status: No, hits=-7.1 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 30 Nov 2011 16:39:47 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id pAUGdj4b025622 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 30 Nov 2011 11:39:45 -0500 Received: from anchor.twiddle.net (vpn-229-14.phx2.redhat.com [10.3.229.14]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id pAUGdiQ2020048; Wed, 30 Nov 2011 11:39:44 -0500 Message-ID: <4ED65C50.3050701@redhat.com> Date: Wed, 30 Nov 2011 08:39:44 -0800 From: Richard Henderson User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:8.0) Gecko/20111115 Thunderbird/8.0 MIME-Version: 1.0 To: gcc-patches@gcc.gnu.org CC: ebotcazou@libertysurf.fr, davem@davemloft.net Subject: Re: [PATCH v2 0/5] Convert Sparc to atomic optabs References: <1322503941-7067-1-git-send-email-rth@redhat.com> In-Reply-To: <1322503941-7067-1-git-send-email-rth@redhat.com> X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org 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 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 +. */ + + +/* This operating system sets PSTATE.MM to the TSO memory model. */ +#undef SUBTARGET_DEFAULT_MEMORY_MODEL +#define SUBTARGET_DEFAULT_MEMORY_MODEL SMM_TSO