pa.md (atomic_storeqi): Restore deleted expander.
authorJohn David Anglin <danglin@gcc.gnu.org>
Thu, 20 Sep 2018 01:04:34 +0000 (01:04 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Thu, 20 Sep 2018 01:04:34 +0000 (01:04 +0000)
* 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
gcc/config/pa/pa.md

index cfd874937b5235341e4c03ffaff0897b3e25b468..30e784e61dbdbc0993886cbccf64bdae9039c534 100644 (file)
@@ -1,3 +1,10 @@
+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
index 0094c58f5e4f097ca4f24ed424c11866e0a131fb..77611503c67732fb71114e7f1d8e7c1a8883ef41 100644 (file)
@@ -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;