public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] PowerPC atomic memmodel cleanup
@ 2015-06-09 17:31 David Edelsohn
  0 siblings, 0 replies; only message in thread
From: David Edelsohn @ 2015-06-09 17:31 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 966 bytes --]

The infrastructure for atomic operations in the rs6000 port has not
utilized the cleaner GCC internal APIs for manipulating memmodel.  The
appended patch converts the direct casts and use of memmodel_from_int
to consistently use memmodel_base.  This also allows the SYNC variants
to be removed from switch case statements.  This should not change any
semantics or behavior of atomics in PowerPC code generation.

Comments?

Bootstrapped on powerpc-ibm-aix7.1.0.0

        * config/rs6000/rs6000.c (rs6000_pre_atomic_barrier): Remove SYNC
        variants cases from switch.
        (rs6000_post_atomic_barrier): Same.
        (rs6000_expand_atomic_compare_and_swap): Use memmodel_base.
        (rs6000_expand_atomic_exchange): Same.
        (rs6000_expand_atomic_op): Same.
        * config/rs6000/sync.md (mem_thread_fence): Use memodel_base. Remove
        SYNC variants cases from switch.
        (atomic_load): Same.
        (atomic_store): Same.

Thanks, David

[-- Attachment #2: memmodel.txt --]
[-- Type: text/plain, Size: 4404 bytes --]

	* config/rs6000/rs6000.c (rs6000_pre_atomic_barrier): Remove SYNC
	variants cases from switch.
	(rs6000_post_atomic_barrier): Same.
	(rs6000_expand_atomic_compare_and_swap): Use memmodel_base.
	(rs6000_expand_atomic_exchange): Same.
	(rs6000_expand_atomic_op): Same.
	* config/rs6000/sync.md (mem_thread_fence): Use memodel_base. Remove
	SYNC variants cases from switch.
	(atomic_load): Same.
	(atomic_store): Same.

Index: rs6000.c
===================================================================
--- rs6000.c	(revision 224288)
+++ rs6000.c	(working copy)
@@ -20558,15 +20558,12 @@ rs6000_pre_atomic_barrier (rtx mem, enum memmodel
     case MEMMODEL_RELAXED:
     case MEMMODEL_CONSUME:
     case MEMMODEL_ACQUIRE:
-    case MEMMODEL_SYNC_ACQUIRE:
       break;
     case MEMMODEL_RELEASE:
-    case MEMMODEL_SYNC_RELEASE:
     case MEMMODEL_ACQ_REL:
       emit_insn (gen_lwsync ());
       break;
     case MEMMODEL_SEQ_CST:
-    case MEMMODEL_SYNC_SEQ_CST:
       emit_insn (gen_hwsync ());
       break;
     default:
@@ -20583,13 +20580,10 @@ rs6000_post_atomic_barrier (enum memmodel model)
     case MEMMODEL_RELAXED:
     case MEMMODEL_CONSUME:
     case MEMMODEL_RELEASE:
-    case MEMMODEL_SYNC_RELEASE:
       break;
     case MEMMODEL_ACQUIRE:
-    case MEMMODEL_SYNC_ACQUIRE:
     case MEMMODEL_ACQ_REL:
     case MEMMODEL_SEQ_CST:
-    case MEMMODEL_SYNC_SEQ_CST:
       emit_insn (gen_isync ());
       break;
     default:
@@ -20690,8 +20684,8 @@ rs6000_expand_atomic_compare_and_swap (rtx operand
   oldval = operands[3];
   newval = operands[4];
   is_weak = (INTVAL (operands[5]) != 0);
-  mod_s = memmodel_from_int (INTVAL (operands[6]));
-  mod_f = memmodel_from_int (INTVAL (operands[7]));
+  mod_s = memmodel_base (INTVAL (operands[6]));
+  mod_f = memmodel_base (INTVAL (operands[7]));
   orig_mode = mode = GET_MODE (mem);
 
   mask = shift = NULL_RTX;
@@ -20810,7 +20804,7 @@ rs6000_expand_atomic_exchange (rtx operands[])
   retval = operands[0];
   mem = operands[1];
   val = operands[2];
-  model = (enum memmodel) INTVAL (operands[3]);
+  model = memmodel_base (INTVAL (operands[3]));
   mode = GET_MODE (mem);
 
   mask = shift = NULL_RTX;
@@ -20861,7 +20855,7 @@ void
 rs6000_expand_atomic_op (enum rtx_code code, rtx mem, rtx val,
 			 rtx orig_before, rtx orig_after, rtx model_rtx)
 {
-  enum memmodel model = (enum memmodel) INTVAL (model_rtx);
+  enum memmodel model = memmodel_base (INTVAL (model_rtx));
   machine_mode mode = GET_MODE (mem);
   machine_mode store_mode = mode;
   rtx label, x, cond, mask, shift;
Index: sync.md
===================================================================
--- sync.md	(revision 224288)
+++ sync.md	(working copy)
@@ -41,7 +41,7 @@
   [(match_operand:SI 0 "const_int_operand" "")]		;; model
   ""
 {
-  enum memmodel model = memmodel_from_int (INTVAL (operands[0]));
+  enum memmodel model = memmodel_base (INTVAL (operands[0]));
   switch (model)
     {
     case MEMMODEL_RELAXED:
@@ -48,14 +48,11 @@
       break;
     case MEMMODEL_CONSUME:
     case MEMMODEL_ACQUIRE:
-    case MEMMODEL_SYNC_ACQUIRE:
     case MEMMODEL_RELEASE:
-    case MEMMODEL_SYNC_RELEASE:
     case MEMMODEL_ACQ_REL:
       emit_insn (gen_lwsync ());
       break;
     case MEMMODEL_SEQ_CST:
-    case MEMMODEL_SYNC_SEQ_CST:
       emit_insn (gen_hwsync ());
       break;
     default:
@@ -147,7 +144,7 @@
   if (<MODE>mode == TImode && !TARGET_SYNC_TI)
     FAIL;
 
-  enum memmodel model = memmodel_from_int (INTVAL (operands[2]));
+  enum memmodel model = memmodel_base (INTVAL (operands[2]));
 
   if (is_mm_seq_cst (model))
     emit_insn (gen_hwsync ());
@@ -185,9 +182,7 @@
       break;
     case MEMMODEL_CONSUME:
     case MEMMODEL_ACQUIRE:
-    case MEMMODEL_SYNC_ACQUIRE:
     case MEMMODEL_SEQ_CST:
-    case MEMMODEL_SYNC_SEQ_CST:
       emit_insn (gen_loadsync_<mode> (operands[0]));
       break;
     default:
@@ -214,17 +209,15 @@
   if (<MODE>mode == TImode && !TARGET_SYNC_TI)
     FAIL;
 
-  enum memmodel model = memmodel_from_int (INTVAL (operands[2]));
+  enum memmodel model = memmodel_base (INTVAL (operands[2]));
   switch (model)
     {
     case MEMMODEL_RELAXED:
       break;
     case MEMMODEL_RELEASE:
-    case MEMMODEL_SYNC_RELEASE:
       emit_insn (gen_lwsync ());
       break;
     case MEMMODEL_SEQ_CST:
-    case MEMMODEL_SYNC_SEQ_CST:
       emit_insn (gen_hwsync ());
       break;
     default:

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2015-06-09 17:24 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-06-09 17:31 [PATCH] PowerPC atomic memmodel cleanup David Edelsohn

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).