Commit 2747a046 by Richard Henderson Committed by Richard Henderson

rs6000: Rewrite sync patterns for atomic; expand early.

The conversion of the __sync post-reload splitters was half
complete.  Since there are nearly no restrictions on what may
appear between LL and SC, expand all the patterns immediatly.
This allows significantly easier code generation for subword
atomic operations.

From-SVN: r181370
parent 674a3581
2011-11-14 Richard Henderson <rth@redhat.com>
* config/rs6000/rs6000.c (emit_load_locked): Assert the mode is handled.
(emit_store_conditional): Likewise.
(rs6000_pre_atomic_barrier, rs6000_post_atomic_barrier): New.
(rs6000_adjust_atomic_subword): New.
(rs6000_mask_atomic_subword, rs6000_finish_atomic_subword): New.
(rs6000_expand_atomic_op): Rename from rs6000_emit_sync; rewrite
for pre-reload expansion.
(rs6000_split_compare_and_swap, rs6000_split_compare_and_swapqhi,
rs6000_expand_compare_and_swapqhi): Merge into ...
(rs6000_expand_atomic_compare_and_swap): ... here. New function.
rs6000_split_lock_test_and_set; expand immediately. Handle
QImode and HImode.
* config/rs6000/rs6000.md (UNSPEC_LWSYNC): Move and rename
from UNSPECV_LWSYNC.
* config/rs6000/sync.md (fetchopsi_constr, fetchopdi_constr): Remove.
(mem_thread_fence): New.
(hwsync): Rename from memory_barrier.
(*hwsync): Rename from *sync_internal.
(lwsync, *lwsync): Mirror hwsync implementation.
(isync): Don't reference memory.
(loadsync): New.
(atomic_load<INT>, atomic_store<INT>): New.
(ATOMIC): New mode iterator.
(load_locked<ATOMIC>): Rename from load_locked_<GPR>.
(store_conditional<ATOMIC>): Rename from store_conditional_<GPR>.
(sync_compare_and_swap<GPR>): Remove.
(sync_compare_and_swaphi, sync_compare_and_swapqi): Remove.
(sync_compare_and_swapqhi_internal): Remove.
(sync_lock_test_and_set<GPR>): Remove.
(sync_<FETCHOP><INT1>): Remove.
(*sync_<FETCHOP>si_internal, *sync_<FETCHOP>di_internal): Remove.
(sync_nand<INT1>, *sync_nand<GPR>_internal): Remove.
(sync_old_<FETCHOP><GPR>): Remove.
(*sync_old_<FETCHOP>si_internal): Remove.
(*sync_old_<FETCHOP>di_internal): Remove.
(sync_old_nand<INT1>): Remove.
(*sync_old_nand<GPR>_internal): Remove.
(sync_new_<FETCHOP><GPR>): Remove.
(*sync_new_<FETCHOP>si_internal): Remove.
(*sync_new_<FETCHOP>di_internal): Remove.
(sync_new_nand<INT1>): Remove.
(*sync_new_nand<GPR>_internal): Remove.
(*atomic_andsi, *atomic_anddi): Remove.
(*sync_addshort_internal, *sync_subshort_internal): Remove.
(*sync_andsi_internal, *sync_boolsi_internal): Remove.
(*sync_boolcshort_internal): Remove.
(sync_lock_release<INT1>): Remove.
(atomic_compare_and_swap<INT1>): New.
(atomic_exchange<INT1>): New.
(atomic_<FETCHOP><INT1>, atomic_nand<INT1>): New.
(atomic_fetch_<FETCHOP><INT1>, atomic_fetch_nand<INT1>): New.
(atomic_<FETCHOP>_fetch<INT1>, atomic_nand_fetch<INT1>): New.
2011-11-14 Uros Bizjak <ubizjak@gmail.com>
* config/i386/sse.md (round<mode>2): Use register_operand for
......@@ -103,13 +103,9 @@ extern rtx rs6000_emit_set_const (rtx, enum machine_mode, rtx, int);
extern int rs6000_emit_cmove (rtx, rtx, rtx, rtx);
extern int rs6000_emit_vector_cond_expr (rtx, rtx, rtx, rtx, rtx, rtx);
extern void rs6000_emit_minmax (rtx, enum rtx_code, rtx, rtx);
extern void rs6000_emit_sync (enum rtx_code, enum machine_mode,
rtx, rtx, rtx, rtx, bool);
extern void rs6000_split_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx);
extern void rs6000_split_compare_and_swap (rtx, rtx, rtx, rtx, rtx);
extern void rs6000_expand_compare_and_swapqhi (rtx, rtx, rtx, rtx);
extern void rs6000_split_compare_and_swapqhi (rtx, rtx, rtx, rtx, rtx, rtx);
extern void rs6000_split_lock_test_and_set (rtx, rtx, rtx, rtx);
extern void rs6000_expand_atomic_compare_and_swap (rtx op[]);
extern void rs6000_expand_atomic_exchange (rtx op[]);
extern void rs6000_expand_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx);
extern void rs6000_emit_swdiv (rtx, rtx, rtx, bool);
extern void rs6000_emit_swrsqrt (rtx, rtx);
extern void output_toc (FILE *, rtx, int, enum machine_mode);
......
......@@ -106,6 +106,7 @@
UNSPEC_SP_SET
UNSPEC_SP_TEST
UNSPEC_SYNC
UNSPEC_LWSYNC
UNSPEC_SYNC_OP
UNSPEC_ATOMIC
UNSPEC_CMPXCHG
......@@ -138,7 +139,6 @@
UNSPECV_PROBE_STACK_RANGE ; probe range of stack addresses
UNSPECV_EH_RR ; eh_reg_restore
UNSPECV_ISYNC ; isync instruction
UNSPECV_LWSYNC ; lwsync
])
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment