在 2023/11/14 上午7:18, Xi Ruoyao 写道:
/* snip */
  (define_insn "mem_thread_fence_1"
    [(set (match_operand:BLK 0 "" "")
        (unspec:BLK [(match_dup 0)] UNSPEC_MEMORY_BARRIER))
     (match_operand:SI 1 "const_int_operand" "")] ;; model
    ""
-  "dbar\t0")
+  {
+    enum memmodel model = memmodel_base (INTVAL (operands[1]));
+
+    switch (model)
+      {
+      case MEMMODEL_ACQUIRE:
+      case MEMMODEL_CONSUME:

Hi,

 * Before calling this template, the function get_memmodel is called to
   process memmodel, which has a piece of code:
 *

   /* Workaround for Bugzilla 59448. GCC doesn't track consume
   properly, so be conservative and promote consume to acquire. */ if
   (val == MEMMODEL_CONSUME) val = MEMMODEL_ACQUIRE;

 *


 * So I think MEMMODEL_CONSUME don't need to be processed here either.

Otherwise is OK.

 * Thanks.

+       /* Consume is implemented using the stronger acquire memory order
+          because of a deficiency in C++11's semantics.  */
+       return "dbar\t0b10100";
+      case MEMMODEL_RELEASE:
+       return "dbar\t0b10010";
+      case MEMMODEL_ACQ_REL:
+      case MEMMODEL_SEQ_CST:
+       return "dbar\t0b10000";
+      default:
+       /* GCC internal: "For the '__ATOMIC_RELAXED' model no instructions
+          need to be issued and this expansion is not invoked."
+          Other values should not be returned by memmodel_base.  */
+       gcc_unreachable ();
+      }
+  })
;; Atomic memory operations.

Reply via email to