public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Henderson <rth@redhat.com>
To: gcc-patches@gcc.gnu.org
Cc: amacleod@redhat.com
Subject: [PATCH 3/9] Introduce and use can_compare_and_swap_p.
Date: Fri, 28 Oct 2011 04:08:00 -0000	[thread overview]
Message-ID: <1319774858-9181-4-git-send-email-rth@redhat.com> (raw)
In-Reply-To: <1319774858-9181-1-git-send-email-rth@redhat.com>

---
 gcc/builtins.c |    7 +++----
 gcc/omp-low.c  |    3 +--
 gcc/optabs.c   |   27 +++++++++++++++++++++++----
 gcc/optabs.h   |    3 +++
 4 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/gcc/builtins.c b/gcc/builtins.c
index 3367b50..cb9da83 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -5452,12 +5452,11 @@ fold_builtin_atomic_always_lock_free (tree arg)
      of the pattern indicates support is present.  */
   size = INTVAL (expand_normal (arg)) * BITS_PER_UNIT;
   mode = mode_for_size (size, MODE_INT, 0);
-  icode = direct_optab_handler (sync_compare_and_swap_optab, mode);
 
-  if (icode == CODE_FOR_nothing)
+  if (can_compare_and_swap_p (mode))
+    return integer_one_node;
+  else
     return integer_zero_node;
-
-  return integer_one_node;
 }
 
 /* Return true if the first argument to call EXP represents a size of
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index 05a3493..5faa084 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -5190,8 +5190,7 @@ expand_omp_atomic_pipeline (basic_block load_bb, basic_block store_bb,
   type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
   itype = TREE_TYPE (TREE_TYPE (cmpxchg));
 
-  if (direct_optab_handler (sync_compare_and_swap_optab, TYPE_MODE (itype))
-      == CODE_FOR_nothing)
+  if (!can_compare_and_swap_p (TYPE_MODE (itype)))
     return false;
 
   /* Load the initial value, replacing the GIMPLE_OMP_ATOMIC_LOAD.  */
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 307101b..9b4d6cf 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -6778,6 +6778,27 @@ expand_vec_cond_expr (tree vec_cond_type, tree op0, tree op1, tree op2,
 }
 
 \f
+/* Return true if there is a compare_and_swap pattern.  */
+
+bool
+can_compare_and_swap_p (enum machine_mode mode)
+{
+  enum insn_code icode;
+
+  /* Check for __sync_compare_and_swap.  */
+  icode = direct_optab_handler (sync_compare_and_swap_optab, mode);
+  if (icode != CODE_FOR_nothing)
+      return true;
+
+  /* Check for __atomic_compare_and_swap.  */
+  icode = direct_optab_handler (atomic_compare_and_swap_optab, mode);
+  if (icode != CODE_FOR_nothing)
+      return true;
+
+  /* No inline compare and swap.  */
+  return false;
+}
+
 /* This is an internal subroutine of the other compare_and_swap expanders.
    MEM, OLD_VAL and NEW_VAL are as you'd expect for a compare-and-swap
    operation.  TARGET is an optional place to store the value result of
@@ -7014,8 +7035,7 @@ expand_atomic_exchange (rtx target, rtx mem, rtx val, enum memmodel model)
     delete_insns_since (last_insn);
 
   /* Otherwise, use a compare-and-swap loop for the exchange.  */
-  if (direct_optab_handler (sync_compare_and_swap_optab, mode)
-      != CODE_FOR_nothing)
+  if (can_compare_and_swap_p (mode))
     {
       if (!target || !register_operand (target, mode))
 	target = gen_reg_rtx (mode);
@@ -7451,8 +7471,7 @@ expand_atomic_fetch_op (rtx target, rtx mem, rtx val, enum rtx_code code,
     }
 
   /* If nothing else has succeeded, default to a compare and swap loop.  */
-  if (direct_optab_handler (sync_compare_and_swap_optab, mode)
-        != CODE_FOR_nothing)
+  if (can_compare_and_swap_p (mode))
     {
       rtx insn;
       rtx t0 = gen_reg_rtx (mode), t1;
diff --git a/gcc/optabs.h b/gcc/optabs.h
index 84e18e6..eabc994 100644
--- a/gcc/optabs.h
+++ b/gcc/optabs.h
@@ -952,6 +952,9 @@ extern void expand_float (rtx, rtx, int);
 /* Return the insn_code for a FLOAT_EXPR.  */
 enum insn_code can_float_p (enum machine_mode, enum machine_mode, int);
 
+/* Return true if there is an inline compare and swap pattern.  */
+extern bool can_compare_and_swap_p (enum machine_mode);
+
 /* Generate code for a FIX_EXPR.  */
 extern void expand_fix (rtx, rtx, int);
 
-- 
1.7.6.4

  parent reply	other threads:[~2011-10-28  4:08 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-28  4:08 [cxx-mem-model][PATCH 0/9] Convert i386 to new atomic optabs Richard Henderson
2011-10-28  4:08 ` [PATCH 2/9] Handle expanding insns with 8 operands Richard Henderson
2011-10-28  4:08 ` [PATCH 1/9] Fix thinko in gen_mem_thread_fence operand Richard Henderson
2011-10-28  4:08 ` [PATCH 7/9] Update omp for new atomic optabs Richard Henderson
2011-10-28  4:08 ` Richard Henderson [this message]
2011-10-28  5:11 ` [PATCH 9/9] Update ChangeLogs Richard Henderson
2011-10-28  5:11 ` [PATCH 6/9] Update cppbuiltins for atomic-compare-and-swap Richard Henderson
2011-10-28  5:20 ` [PATCH 8/9] Convert i386 backend to new atomic patterns Richard Henderson
2011-10-28  5:30 ` [PATCH 5/9] Add missing atomic optab initializations Richard Henderson
2011-10-28  5:40 ` [PATCH 4/9] Rewrite all compare-and-swap in terms of expand_atomic_compare_and_swap Richard Henderson
2011-10-28 11:29 ` [cxx-mem-model][PATCH 0/9] Convert i386 to new atomic optabs Jakub Jelinek
2011-10-28 15:25   ` Richard Henderson
2011-10-29 17:28 ` Andrew MacLeod

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1319774858-9181-4-git-send-email-rth@redhat.com \
    --to=rth@redhat.com \
    --cc=amacleod@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).