diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-17 19:29:04 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-17 19:29:04 +0000 |
commit | fe54c06bb15e4aac831d34510f85ac60a05819a9 (patch) | |
tree | c5fe338ba828667922ef001c6df7a932a78412e6 /gcc/builtins.c | |
parent | 522983c25b6397988b0be1d3c76a57ba46aee9c7 (diff) | |
download | gcc-fe54c06bb15e4aac831d34510f85ac60a05819a9.tar.gz |
Unify implementations of __builtin_mem_*_fence and __sync_synchronize.
* builtins.c (expand_builtin_mem_thread_fence): Remove.
(expand_builtin_mem_signal_fence): Remove.
(expand_builtin_atomic_thread_fence): Use expand_mem_thread_fence.
(expand_builtin_sync_synchronize): Likewise.
(expand_builtin_atomic_signal_fence): Use expand_mem_signal_fence.
* optabs.c (expand_asm_memory_barrier): Split out from
expand_builtin_mem_signal_fence.
(expand_mem_thread_fence): New, a combination of code from
expand_builtin_mem_thread_fence and expand_builtin_sync_synchronize.
(expand_mem_signal_fence): Moved and renamed from
expand_builtin_mem_signal_fence.
(expand_atomic_exchange): Use expand_mem_thread_fence.
(expand_atomic_load, expand_atomic_store): Likewise.
* expr.h, optabs.h: Update decls.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181451 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 91 |
1 files changed, 5 insertions, 86 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 9dc68cc341f..fe0260ff33e 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -5672,23 +5672,6 @@ expand_builtin_atomic_is_lock_free (tree exp) return NULL_RTX; } -/* 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 (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: void __atomic_thread_fence (enum memmodel) EXP is the CALL_EXPR. */ @@ -5696,46 +5679,8 @@ expand_builtin_mem_thread_fence (enum memmodel model) static void expand_builtin_atomic_thread_fence (tree exp) { - enum memmodel model; - - model = get_memmodel (CALL_EXPR_ARG (exp, 0)); - expand_builtin_mem_thread_fence (model); -} - -/* 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) -{ - if (HAVE_mem_signal_fence) - emit_insn (gen_mem_signal_fence (GEN_INT (model))); - else if (model != MEMMODEL_RELAXED) - { - rtx asm_op, clob; - - /* By default 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. */ - - /* Generate asm volatile("" : : : "memory") as the memory barrier. */ - asm_op = gen_rtx_ASM_OPERANDS (VOIDmode, empty_string, empty_string, 0, - rtvec_alloc (0), rtvec_alloc (0), - rtvec_alloc (0), UNKNOWN_LOCATION); - MEM_VOLATILE_P (asm_op) = 1; - - clob = gen_rtx_SCRATCH (VOIDmode); - clob = gen_rtx_MEM (BLKmode, clob); - clob = gen_rtx_CLOBBER (VOIDmode, clob); - - emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, asm_op, clob))); - } + enum memmodel model = get_memmodel (CALL_EXPR_ARG (exp, 0)); + expand_mem_thread_fence (model); } /* Expand the __atomic_signal_fence intrinsic: @@ -5745,10 +5690,8 @@ expand_builtin_mem_signal_fence (enum memmodel model) static void expand_builtin_atomic_signal_fence (tree exp) { - enum memmodel model; - - model = get_memmodel (CALL_EXPR_ARG (exp, 0)); - expand_builtin_mem_signal_fence (model); + enum memmodel model = get_memmodel (CALL_EXPR_ARG (exp, 0)); + expand_mem_signal_fence (model); } /* Expand the __sync_synchronize intrinsic. */ @@ -5756,31 +5699,7 @@ expand_builtin_atomic_signal_fence (tree exp) static void expand_builtin_sync_synchronize (void) { - gimple x; - VEC (tree, gc) *v_clobbers; - -#ifdef HAVE_memory_barrier - if (HAVE_memory_barrier) - { - emit_insn (gen_memory_barrier ()); - return; - } -#endif - - if (synchronize_libfunc != NULL_RTX) - { - emit_library_call (synchronize_libfunc, LCT_NORMAL, VOIDmode, 0); - return; - } - - /* If no explicit memory barrier instruction is available, create an - empty asm stmt with a memory clobber. */ - v_clobbers = VEC_alloc (tree, gc, 1); - VEC_quick_push (tree, v_clobbers, - tree_cons (NULL, build_string (6, "memory"), NULL)); - x = gimple_build_asm_vec ("", NULL, NULL, v_clobbers, NULL); - gimple_asm_set_volatile (x, true); - expand_asm_stmt (x); + expand_mem_thread_fence (MEMMODEL_SEQ_CST); } |