@@ -5530,16 +5530,18 @@ expand_builtin_atomic_is_lock_free (tree exp)
/* This routine will either emit the mem_thread_fence pattern or issue a
sync_synchronize to generate a fence for memory model MEMMODEL. */
+#ifndef HAVE_mem_thread_fence
+# define HAVE_mem_thread_fence 0
+# define gen_mem_thread_fence(x) (gcc_unreachable (), NULL_RTX)
+#endif
+
void
expand_builtin_mem_thread_fence (enum memmodel model)
{
- if (model == MEMMODEL_RELAXED)
- return;
-#ifdef HAVE_mem_thread_fence
- emit_insn (gen_mem_thread_fence (GEN_INT (model)));
-#else
- expand_builtin_sync_synchronize ();
-#endif
+ if (HAVE_mem_thread_fence)
+ emit_insn (gen_mem_thread_fence (GEN_INT (model)));
+ else if (model != MEMMODEL_RELAXED)
+ expand_builtin_sync_synchronize ();
}
/* Expand the __atomic_thread_fence intrinsic:
@@ -5558,15 +5560,38 @@ expand_builtin_atomic_thread_fence (tree exp)
/* This routine will either emit the mem_signal_fence pattern or issue a
sync_synchronize to generate a fence for memory model MEMMODEL. */
+#ifndef HAVE_mem_signal_fence
+# define HAVE_mem_signal_fence 0
+# define gen_mem_signal_fence(x) (gcc_unreachable (), NULL_RTX)
+#endif
+
static void
expand_builtin_mem_signal_fence (enum memmodel model)
{
-#ifdef HAVE_mem_signal_fence
- emit_insn (gen_mem_signal_fence (memmodel));
-#else
- if (model != MEMMODEL_RELAXED)
- expand_builtin_sync_synchronize ();
-#endif
+ if (HAVE_mem_signal_fence)
+ emit_insn (gen_mem_signal_fence (GEN_INT (model)));
+ else
+ {
+ rtx x;
+
+ /* By default I expect that targets are coherent between a thread and
+ the signal handler running on the same thread. Thus this really
+ becomes a compiler barrier, in that stores must not be sunk past
+ (or raised above) a given point. */
+ switch (model)
+ {
+ case MEMMODEL_RELAXED:
+ break;
+ case MEMMODEL_SEQ_CST:
+ gen_blockage ();
+ break;
+ default:
+ x = gen_rtx_SCRATCH (Pmode);
+ x = gen_rtx_MEM (BLKmode, x);
+ emit_insn (gen_rtx_USE (x));
+ break;
+ }
+ }
}
/* Expand the __atomic_signal_fence intrinsic: