Commit bad4408c by John David Anglin

pa.md (atomic_storeqi): Restore deleted expander.

	* config/pa/pa.md (atomic_storeqi): Restore deleted expander.
	(atomic_storehi): Likewise.
	(atomic_storesi): Likewise.
	(atomic_loaddi): Restore compare and swap exchange loop code.

From-SVN: r264433
parent fa8332f1
2018-09-19 John David Anglin <danglin@gcc.gnu.org>
* config/pa/pa.md (atomic_storeqi): Restore deleted expander.
(atomic_storehi): Likewise.
(atomic_storesi): Likewise.
(atomic_loaddi): Restore compare and swap exchange loop code.
2018-09-19 Segher Boessenkool <segher@kernel.crashing.org>
PR rtl-optimization/86902
......
......@@ -9958,7 +9958,59 @@ add,l %2,%3,%3\;bv,n %%r0(%3)"
;; These patterns are at the bottom so the non atomic versions are preferred.
;; Implement atomic DImode load using 64-bit floating point load.
(define_expand "atomic_storeqi"
[(match_operand:QI 0 "memory_operand") ;; memory
(match_operand:QI 1 "register_operand") ;; val out
(match_operand:SI 2 "const_int_operand")] ;; model
""
{
if (TARGET_SYNC_LIBCALL)
{
rtx mem = operands[0];
rtx val = operands[1];
if (pa_maybe_emit_compare_and_swap_exchange_loop (NULL_RTX, mem, val))
DONE;
}
FAIL;
})
;; Implement atomic HImode stores using exchange.
(define_expand "atomic_storehi"
[(match_operand:HI 0 "memory_operand") ;; memory
(match_operand:HI 1 "register_operand") ;; val out
(match_operand:SI 2 "const_int_operand")] ;; model
""
{
if (TARGET_SYNC_LIBCALL)
{
rtx mem = operands[0];
rtx val = operands[1];
if (pa_maybe_emit_compare_and_swap_exchange_loop (NULL_RTX, mem, val))
DONE;
}
FAIL;
})
;; Implement atomic SImode store using exchange.
(define_expand "atomic_storesi"
[(match_operand:SI 0 "memory_operand") ;; memory
(match_operand:SI 1 "register_operand") ;; val out
(match_operand:SI 2 "const_int_operand")] ;; model
""
{
if (TARGET_SYNC_LIBCALL)
{
rtx mem = operands[0];
rtx val = operands[1];
if (pa_maybe_emit_compare_and_swap_exchange_loop (NULL_RTX, mem, val))
DONE;
}
FAIL;
})
;; Implement atomic DImode load.
(define_expand "atomic_loaddi"
[(match_operand:DI 0 "register_operand") ;; val out
......@@ -9999,6 +10051,14 @@ add,l %2,%3,%3\;bv,n %%r0(%3)"
{
enum memmodel model;
if (TARGET_SYNC_LIBCALL)
{
rtx mem = operands[0];
rtx val = operands[1];
if (pa_maybe_emit_compare_and_swap_exchange_loop (NULL_RTX, mem, val))
DONE;
}
if (TARGET_64BIT || TARGET_DISABLE_FPREGS || TARGET_SOFT_FLOAT)
FAIL;
......
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