Hello!

> __atomic_clear and __atomic_store_n didn't have code to generate
> the TSX HLE RELEASE prefix. Add this plus test cases.

+(define_insn "atomic_store_hle_release<mode>"
+  [(set (match_operand:ATOMIC 0 "memory_operand")
+       (unspec:ATOMIC [(match_operand:ATOMIC 1 "register_operand")
+                       (match_operand:SI 2 "const_int_operand")]
+                      UNSPEC_MOVA_RELEASE))]
+  ""
+  "%K2mov{<imodesuffix>}\t{%1, %0|%0, %1}")

This pattern doesn't have any constraints! Also, mov insn can store
immediates directly.

+      if (model & IX86_HLE_RELEASE)
+        {
+         emit_insn (gen_atomic_store_hle_release<mode> (operands[0],
operands[1],
+                                                        operands[2]));
+         DONE;
+        }                                      
+
       /* For seq-cst stores, when we lack MFENCE, use XCHG.  */
       if (model == MEMMODEL_SEQ_CST && !(TARGET_64BIT || TARGET_SSE2))

What about __ATOMIC_SEQ_CST; should

  __atomic_clear (p, __ATOMIC_SEQ_CST | __ATOMIC_HLE_RELEASE);

emit a mfence at the end; in case of for your test:

        xrelease movb   $0, (%rdi)
        mfence
        ret
?

+
+void
+hle_clear (int *p, int v)

hle_clear (char *p)

This argument should correspond to a bool, please see documentation.

I have also attached the patch that implements sync.md fixes.

Uros.
Index: config/i386/sync.md
===================================================================
--- config/i386/sync.md (revision 195137)
+++ config/i386/sync.md (working copy)
@@ -224,8 +224,12 @@
          DONE;
        }
 
-      /* Otherwise use a normal store.  */
-      emit_move_insn (operands[0], operands[1]);
+      /* Otherwise use a store...  */
+      if (INTVAL (operands[2]) & IX86_HLE_RELEASE)
+       emit_insn (gen_atomic_store<mode>_1 (operands[0], operands[1],
+                                            operands[2]));
+      else
+       emit_move_insn (operands[0], operands[1]);
     }
   /* ... followed by an MFENCE, if required.  */
   if (model == MEMMODEL_SEQ_CST)
@@ -233,6 +237,14 @@
   DONE;
 })
 
+(define_insn "atomic_store<mode>_1"
+  [(set (match_operand:ATOMIC 0 "memory_operand" "=m")
+       (unspec:ATOMIC [(match_operand:ATOMIC 1 "<nonmemory_operand>" "<r><i>")
+                       (match_operand:SI 2 "const_int_operand")]
+                      UNSPEC_MOVA))]
+  ""
+  "%K2mov{<imodesuffix>}\t{%1, %0|%0, %1}")
+
 (define_insn_and_split "atomic_storedi_fpu"
   [(set (match_operand:DI 0 "memory_operand" "=m,m,m")
        (unspec:DI [(match_operand:DI 1 "register_operand" "x,m,?r")]

Reply via email to