Commit 2371d1a0 by Richard Henderson Committed by Richard Henderson

alpha: Convert to atomic optabs.

From-SVN: r181395
parent 6dc88283
2011-11-15 Richard Henderson <rth@redhat.com>
* config/alpha/alpha.c (alpha_pre_atomic_barrier): New.
(alpha_post_atomic_barrier): New.
(alpha_split_atomic_op): New memmodel argument; honor it.
(alpha_split_compare_and_swap): Take array of operands. Honor
memmodel; always set bool output
(alpha_expand_compare_and_swap_12): Similarly.
(alpha_split_compare_and_swap_12): Similarly.
(alpha_split_atomic_exchange): Similarly. Rename from
alpha_split_lock_test_and_set.
(alpha_expand_atomic_exchange_12): Similarly. Rename from
alpha_expand_lock_test_and_set_12.
(alpha_split_atomic_exchange_12): Similarly. Rename from
alpha_split_lock_test_and_set_12.
* config/alpha/alpha-protos.h: Update.
* config/alpha/alpha.md (UNSPECV_CMPXCHG): New.
* config/alpha/constraints.md ("w"): New.
* config/alpha/predicates.md (mem_noofs_operand): New.
* config/alpha/sync.md (atomic_compare_and_swap<mode>): Rename from
sync_compare_and_swap<mode>; add the new parameters.
(atomic_exchange<mode>): Update from sync_test_and_set<mode>.
(atomic_fetch_<op><mode>): Update from sync_old_<op><mode>.
(atomic_<op>_fetch<mode>): Update from sync_new_<op><mode>.
(atomic_<op><mode>): Update from sync_<op><mode>.
2011-11-16 Tom de Vries <tom@codesourcery.com> 2011-11-16 Tom de Vries <tom@codesourcery.com>
* tree-ssa-tail-merge.c (replace_block_by): Add frequency of bb2 to bb1. * tree-ssa-tail-merge.c (replace_block_by): Add frequency of bb2 to bb1.
...@@ -88,15 +88,14 @@ extern bool alpha_emit_setcc (rtx[], enum machine_mode); ...@@ -88,15 +88,14 @@ extern bool alpha_emit_setcc (rtx[], enum machine_mode);
extern int alpha_split_conditional_move (enum rtx_code, rtx, rtx, rtx, rtx); extern int alpha_split_conditional_move (enum rtx_code, rtx, rtx, rtx, rtx);
extern void alpha_emit_xfloating_arith (enum rtx_code, rtx[]); extern void alpha_emit_xfloating_arith (enum rtx_code, rtx[]);
extern void alpha_emit_xfloating_cvt (enum rtx_code, rtx[]); extern void alpha_emit_xfloating_cvt (enum rtx_code, rtx[]);
extern void alpha_split_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx); extern void alpha_split_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx,
extern void alpha_split_compare_and_swap (rtx, rtx, rtx, rtx, rtx); enum memmodel);
extern void alpha_expand_compare_and_swap_12 (rtx, rtx, rtx, rtx); extern void alpha_split_compare_and_swap (rtx op[]);
extern void alpha_split_compare_and_swap_12 (enum machine_mode, rtx, rtx, extern void alpha_expand_compare_and_swap_12 (rtx op[]);
rtx, rtx, rtx, rtx, rtx); extern void alpha_split_compare_and_swap_12 (rtx op[]);
extern void alpha_split_lock_test_and_set (rtx, rtx, rtx, rtx); extern void alpha_split_atomic_exchange (rtx op[]);
extern void alpha_expand_lock_test_and_set_12 (rtx, rtx, rtx); extern void alpha_expand_atomic_exchange_12 (rtx op[]);
extern void alpha_split_lock_test_and_set_12 (enum machine_mode, rtx, rtx, extern void alpha_split_atomic_exchange_12 (rtx op[]);
rtx, rtx, rtx);
#endif #endif
extern rtx alpha_use_linkage (rtx, bool, bool); extern rtx alpha_use_linkage (rtx, bool, bool);
......
...@@ -81,6 +81,7 @@ ...@@ -81,6 +81,7 @@
UNSPECV_SETJMPR_ER ; builtin_setjmp_receiver fragment UNSPECV_SETJMPR_ER ; builtin_setjmp_receiver fragment
UNSPECV_LL ; load-locked UNSPECV_LL ; load-locked
UNSPECV_SC ; store-conditional UNSPECV_SC ; store-conditional
UNSPECV_CMPXCHG
]) ])
;; On non-BWX targets, CQImode must be handled the similarly to HImode ;; On non-BWX targets, CQImode must be handled the similarly to HImode
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
;;; Unused letters: ;;; Unused letters:
;;; ABCDEF V YZ ;;; ABCDEF V YZ
;;; de ghijklmnopq stu wxyz ;;; de ghijkl pq tu wxyz
;; Integer register constraints. ;; Integer register constraints.
...@@ -38,6 +38,10 @@ ...@@ -38,6 +38,10 @@
(define_register_constraint "v" "R0_REG" (define_register_constraint "v" "R0_REG"
"General register 0, function value return address") "General register 0, function value return address")
(define_memory_constraint "w"
"A memory whose address is only a register"
(match_operand 0 "mem_noofs_operand"))
;; Integer constant constraints. ;; Integer constant constraints.
(define_constraint "I" (define_constraint "I"
"An unsigned 8 bit constant" "An unsigned 8 bit constant"
......
...@@ -623,3 +623,8 @@ ...@@ -623,3 +623,8 @@
(ior (match_operand 0 "register_operand") (ior (match_operand 0 "register_operand")
(and (match_test "TARGET_BWX") (and (match_test "TARGET_BWX")
(match_operand 0 "memory_operand")))) (match_operand 0 "memory_operand"))))
;; Accept a memory whose address is only a register.
(define_predicate "mem_noofs_operand"
(and (match_code "mem")
(match_code "reg" "0")))
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