From bad4408cadddb199556e7da9fb4b267a4eb42805 Mon Sep 17 00:00:00 2001 From: John David Anglin Date: Thu, 20 Sep 2018 01:04:34 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++ gcc/config/pa/pa.md | 62 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cfd874937b5..30e784e61db 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-09-19 John David Anglin + + * 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 PR rtl-optimization/86902 diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md index 0094c58f5e4..77611503c67 100644 --- a/gcc/config/pa/pa.md +++ b/gcc/config/pa/pa.md @@ -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; -- 2.30.2