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>
* 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);
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_cvt (enum rtx_code, 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);
extern void alpha_expand_compare_and_swap_12 (rtx, rtx, rtx, rtx);
extern void alpha_split_compare_and_swap_12 (enum machine_mode, rtx, rtx,
rtx, rtx, rtx, rtx, rtx);
extern void alpha_split_lock_test_and_set (rtx, rtx, rtx, rtx);
extern void alpha_expand_lock_test_and_set_12 (rtx, rtx, rtx);
extern void alpha_split_lock_test_and_set_12 (enum machine_mode, rtx, rtx,
rtx, rtx, rtx);
extern void alpha_split_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx,
enum memmodel);
extern void alpha_split_compare_and_swap (rtx op[]);
extern void alpha_expand_compare_and_swap_12 (rtx op[]);
extern void alpha_split_compare_and_swap_12 (rtx op[]);
extern void alpha_split_atomic_exchange (rtx op[]);
extern void alpha_expand_atomic_exchange_12 (rtx op[]);
extern void alpha_split_atomic_exchange_12 (rtx op[]);
#endif
extern rtx alpha_use_linkage (rtx, bool, bool);
......
......@@ -81,6 +81,7 @@
UNSPECV_SETJMPR_ER ; builtin_setjmp_receiver fragment
UNSPECV_LL ; load-locked
UNSPECV_SC ; store-conditional
UNSPECV_CMPXCHG
])
;; On non-BWX targets, CQImode must be handled the similarly to HImode
......
......@@ -19,7 +19,7 @@
;;; Unused letters:
;;; ABCDEF V YZ
;;; de ghijklmnopq stu wxyz
;;; de ghijkl pq tu wxyz
;; Integer register constraints.
......@@ -38,6 +38,10 @@
(define_register_constraint "v" "R0_REG"
"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.
(define_constraint "I"
"An unsigned 8 bit constant"
......
......@@ -623,3 +623,8 @@
(ior (match_operand 0 "register_operand")
(and (match_test "TARGET_BWX")
(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