emit-rtl.c (need_atomic_barrier_p): New function.
authorMaxim Kuvyrkov <maxim@codesourcery.com>
Wed, 20 Jun 2012 01:05:25 +0000 (01:05 +0000)
committerMaxim Kuvyrkov <mkuvyrkov@gcc.gnu.org>
Wed, 20 Jun 2012 01:05:25 +0000 (01:05 +0000)
* emit-rtl.c (need_atomic_barrier_p): New function.
* emit-rtl.h (need_atomic_barrier_p): Declare it.
* config/alpha/alpha.c (alpha_{pre,post}_atomic_barrier): Use it.
* config/arm/arm.c (arm_{pre,post}_atomic_barrier): Use it.
* config/tilegx/tilegx.c (tile_{pre,post}_atomic_barrier): Use it.
* config/mips/mips.c (mips_{pre,post}_atomic_barrier_p): Remove.
(mips_process_sync_loop): Use generic version instead.

From-SVN: r188806

gcc/ChangeLog
gcc/config/alpha/alpha.c
gcc/config/arm/arm.c
gcc/config/mips/mips.c
gcc/config/tilegx/tilegx.c
gcc/emit-rtl.c
gcc/emit-rtl.h

index e1a1d0048d9ec9ae01ebe2d5d99ad3c07a7823bf..6df2e6cb2a29dc60d96358442a4732bd08d63fcf 100644 (file)
@@ -1,3 +1,13 @@
+2012-06-19  Maxim Kuvyrkov  <maxim@codesourcery.com>
+
+       * emit-rtl.c (need_atomic_barrier_p): New function.
+       * emit-rtl.h (need_atomic_barrier_p): Declare it.
+       * config/alpha/alpha.c (alpha_{pre,post}_atomic_barrier): Use it.
+       * config/arm/arm.c (arm_{pre,post}_atomic_barrier): Use it.
+       * config/tilegx/tilegx.c (tile_{pre,post}_atomic_barrier): Use it.
+       * config/mips/mips.c (mips_{pre,post}_atomic_barrier_p): Remove.
+       (mips_process_sync_loop): Use generic version instead.
+
 2012-06-19  Maxim Kuvyrkov  <maxim@codesourcery.com>
 
        * config/mips/mips.c (mips_process_sync_loop): Emit cmp result only if
index 374986674daa62b951151f9f666fa5d55f96c6e4..a881a9ed675a8605c27534494479c929ce7e10da 100644 (file)
@@ -4262,39 +4262,15 @@ emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val)
 static void
 alpha_pre_atomic_barrier (enum memmodel model)
 {
-  switch (model)
-    {
-    case MEMMODEL_RELAXED:
-    case MEMMODEL_CONSUME:
-    case MEMMODEL_ACQUIRE:
-      break;
-    case MEMMODEL_RELEASE:
-    case MEMMODEL_ACQ_REL:
-    case MEMMODEL_SEQ_CST:
-      emit_insn (gen_memory_barrier ());
-      break;
-    default:
-      gcc_unreachable ();
-    }
+  if (need_atomic_barrier_p (model, true))
+    emit_insn (gen_memory_barrier ());
 }
 
 static void
 alpha_post_atomic_barrier (enum memmodel model)
 {
-  switch (model)
-    {
-    case MEMMODEL_RELAXED:
-    case MEMMODEL_CONSUME:
-    case MEMMODEL_RELEASE:
-      break;
-    case MEMMODEL_ACQUIRE:
-    case MEMMODEL_ACQ_REL:
-    case MEMMODEL_SEQ_CST:
-      emit_insn (gen_memory_barrier ());
-      break;
-    default:
-      gcc_unreachable ();
-    }
+  if (need_atomic_barrier_p (model, false))
+    emit_insn (gen_memory_barrier ());
 }
 
 /* A subroutine of the atomic operation splitters.  Emit an insxl
index 627b436e1af4c22374191d328605040dd48c25b2..73fc0cb35a761cbd0500a7d122d47389092b1464 100644 (file)
@@ -25572,39 +25572,15 @@ vfp3_const_double_for_fract_bits (rtx operand)
 static void
 arm_pre_atomic_barrier (enum memmodel model)
 {
-  switch (model)
-    {
-    case MEMMODEL_RELAXED:
-    case MEMMODEL_CONSUME:
-    case MEMMODEL_ACQUIRE:
-      break;
-    case MEMMODEL_RELEASE:
-    case MEMMODEL_ACQ_REL:
-    case MEMMODEL_SEQ_CST:
-      emit_insn (gen_memory_barrier ());
-      break;
-    default:
-      gcc_unreachable ();
-    }
+  if (need_atomic_barrier_p (model, true))
+    emit_insn (gen_memory_barrier ());
 }
 
 static void
 arm_post_atomic_barrier (enum memmodel model)
 {
-  switch (model)
-    {
-    case MEMMODEL_RELAXED:
-    case MEMMODEL_CONSUME:
-    case MEMMODEL_RELEASE:
-      break;
-    case MEMMODEL_ACQUIRE:
-    case MEMMODEL_ACQ_REL:
-    case MEMMODEL_SEQ_CST:
-      emit_insn (gen_memory_barrier ());
-      break;
-    default:
-      gcc_unreachable ();
-    }
+  if (need_atomic_barrier_p (model, false))
+    emit_insn (gen_memory_barrier ());
 }
 
 /* Emit the load-exclusive and store-exclusive instructions.  */
index 3bbb3ea19f153285043f55424fb4702d65a176cd..2914d530c5a59bad0a5b78754650047e8a119e83 100644 (file)
@@ -11982,45 +11982,6 @@ mips_sync_insn2_template (enum attr_sync_insn2 type)
   gcc_unreachable ();
 }
 
-/* Subroutines of the mips_process_sync_loop.
-   Emit barriers as needed for the memory MODEL.  */
-
-static bool
-mips_emit_pre_atomic_barrier_p (enum memmodel model)
-{
-  switch (model)
-    {
-    case MEMMODEL_RELAXED:
-    case MEMMODEL_CONSUME:
-    case MEMMODEL_ACQUIRE:
-      return false;
-    case MEMMODEL_RELEASE:
-    case MEMMODEL_ACQ_REL:
-    case MEMMODEL_SEQ_CST:
-      return true;
-    default:
-      gcc_unreachable ();
-    }
-}
-
-static bool
-mips_emit_post_atomic_barrier_p (enum memmodel model)
-{
-  switch (model)
-    {
-    case MEMMODEL_RELAXED:
-    case MEMMODEL_CONSUME:
-    case MEMMODEL_RELEASE:
-      return false;
-    case MEMMODEL_ACQUIRE:
-    case MEMMODEL_ACQ_REL:
-    case MEMMODEL_SEQ_CST:
-      return true;
-    default:
-      gcc_unreachable ();
-    }
-}
-
 /* OPERANDS are the operands to a sync loop instruction and INDEX is
    the value of the one of the sync_* attributes.  Return the operand
    referred to by the attribute, or DEFAULT_VALUE if the insn doesn't
@@ -12093,7 +12054,7 @@ mips_process_sync_loop (rtx insn, rtx *operands)
   mips_multi_start ();
 
   /* Output the release side of the memory barrier.  */
-  if (mips_emit_pre_atomic_barrier_p (model))
+  if (need_atomic_barrier_p (model, true))
     {
       if (required_oldval == 0 && TARGET_OCTEON)
        {
@@ -12206,7 +12167,7 @@ mips_process_sync_loop (rtx insn, rtx *operands)
     mips_multi_add_insn ("li\t%0,1", cmp, NULL);
 
   /* Output the acquire side of the memory barrier.  */
-  if (TARGET_SYNC_AFTER_SC && mips_emit_post_atomic_barrier_p (model))
+  if (TARGET_SYNC_AFTER_SC && need_atomic_barrier_p (model, false))
     mips_multi_add_insn ("sync", NULL);
 
   /* Output the exit label, if needed.  */
index 7ca4eb68be4dd464854418c8ad63646560d0cab3..a5f48a24b221991a42239424ce034ae3f59bfe8c 100644 (file)
@@ -2593,20 +2593,8 @@ tilegx_expand_tablejump (rtx op0, rtx op1)
 void
 tilegx_pre_atomic_barrier (enum memmodel model)
 {
-  switch (model)
-    {
-    case MEMMODEL_RELAXED:
-    case MEMMODEL_CONSUME:
-    case MEMMODEL_ACQUIRE:
-      break;
-    case MEMMODEL_RELEASE:
-    case MEMMODEL_ACQ_REL:
-    case MEMMODEL_SEQ_CST:
-      emit_insn (gen_memory_barrier ());
-      break;
-    default:
-      gcc_unreachable ();
-    }
+  if (need_atomic_barrier_p (model, true))
+    emit_insn (gen_memory_barrier ());
 }
 
 
@@ -2614,20 +2602,8 @@ tilegx_pre_atomic_barrier (enum memmodel model)
 void
 tilegx_post_atomic_barrier (enum memmodel model)
 {
-  switch (model)
-    {
-    case MEMMODEL_RELAXED:
-    case MEMMODEL_CONSUME:
-    case MEMMODEL_RELEASE:
-      break;
-    case MEMMODEL_ACQUIRE:
-    case MEMMODEL_ACQ_REL:
-    case MEMMODEL_SEQ_CST:
-      emit_insn (gen_memory_barrier ());
-      break;
-    default:
-      gcc_unreachable ();
-    }
+  if (need_atomic_barrier_p (model, false))
+    emit_insn (gen_memory_barrier ());
 }
 
 
index c82bd61c7e1fffd86156b761edfa41d3bbcade45..9565c618b815529d2f38f2fead651d14261b604b 100644 (file)
@@ -6161,4 +6161,29 @@ locator_eq (int loc1, int loc2)
   return locator_scope (loc1) == locator_scope (loc2);
 }
 \f
+
+/* Return true if memory model MODEL requires a pre-operation (release-style)
+   barrier or a post-operation (acquire-style) barrier.  While not universal,
+   this function matches behavior of several targets.  */
+
+bool
+need_atomic_barrier_p (enum memmodel model, bool pre)
+{
+  switch (model)
+    {
+    case MEMMODEL_RELAXED:
+    case MEMMODEL_CONSUME:
+      return false;
+    case MEMMODEL_RELEASE:
+      return pre;
+    case MEMMODEL_ACQUIRE:
+      return !pre;
+    case MEMMODEL_ACQ_REL:
+    case MEMMODEL_SEQ_CST:
+      return true;
+    default:
+      gcc_unreachable ();
+    }
+}
+\f
 #include "gt-emit-rtl.h"
index bc91193fb62a849fa7949f7aaaa67042d554196c..715d4dd69840729ac428416ddb8c2f7c632048cf 100644 (file)
@@ -69,6 +69,8 @@ extern void set_reg_attrs_for_decl_rtl (tree t, rtx x);
 extern void adjust_reg_mode (rtx, enum machine_mode);
 extern int mem_expr_equal_p (const_tree, const_tree);
 
+extern bool need_atomic_barrier_p (enum memmodel, bool);
+
 /* Return the first insn of the current sequence or current function.  */
 
 static inline rtx