Re: [PATCH v2] x86-64: Add -m128bit-atomic

Hongtao Liu <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <CAMZc-bw=AJ5Qfw3x_wL4YQa3JNfbwx=z1E-uuBZBAY7J1qfyaw@mail.gmail.com>
On Wed, Jul 22, 2026 at 2:24 PM H.J. Lu <[email protected]> wrote:
>
> Changes in v2:
>
> 1. Add TARGET_128BIT_ATOMIC_ENABLED.
> 2. Remove __atomic Builtins reference from -mcx16.
> 3. Update -m128bit-atomic documentation.
> 4. Issue an error for -m128bit-atomic with -m32.
>
> --
> H.J.
> --
> With the silicon vendor guarantees from Intel, AMD, Hygon and Zhaoxin in:
>
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104688
>
> many software developers would happily use inline 128-bit atomic loads
> and stores in their programs because they only target compatible CPUs.
> Add -m128bit-atomic to generate 128-bit atomic loads and stores to avoid
> the overhead of calling into libatomic.  Enable -m128bit-atomic in 64-bit
> mode by default if supported by the targeting processor, which is one of
> x86-64-v3 capable processors as well as AVX capable processors from Intel,
> AMD, Hygon and Zhaoxin.
>
> gcc/
>
> PR target/94649
> PR target/126293
> * common/config/i386/i386-cpuinfo.h (ix86_decode_cpu_info): New
> function.
> * config/i386/i386-options.cc
> (ix86_option_override_internal): Issue an error for -m128bit-atomic
> in 32-bit mode.  Turn on -mcx16 if -m128bit-atomic is enabled.
> Enable -m128bit-atomic in 64-bit mode by default if supported by
> the targeting processor.
> * config/i386/i386.h (TARGET_128BIT_ATOMIC_ENABLED): New.
> * config/i386/i386.opt (ix86_flags): New Variable.
> (m128bit-atomic): New option.
> * config/i386/i386.opt.urls: Regenerated.
> * config/i386/sync.md (atomic_loadti): New pattern.
> (atomic_loadti_sse): Likewise.
> (atomic_storeti): Likewise.
> (atomic_storeti_sse): Likewise.
> * doc/invoke.texi: Remove __atomic Builtins reference from -mcx16.
> Document -m128bit-atomic.
>

+          || (subtype >= INTEL_COREI7_GRANITERAPIDS
+              && subtype <= INTEL_COREI7_PANTHERLAKE)
+          || subtype == INTEL_COREI7_DIAMONDRAPIDS
+          || subtype <= INTEL_COREI7_NOVALAKE)
+        {
+          vendor = VENDOR_INTEL;
+          type = INTEL_COREI7;
+        }
|| substype <= INTEL_COREI7_NOVALAKE  classifies AMD/Zhaoxin CPUs as
Intel, is it a typo of *subtype == NTEL_COREI7_NOVALAKE*


+  if (TARGET_128BIT_ATOMIC_P (opts->x_ix86_flags))
+    {
+      if (!TARGET_64BIT_P (opts->x_ix86_isa_flags))
+        error ("%<-m128bit-atomic%> not supported for 32-bit code");
+      else if (!TARGET_CX16_P (opts_set->x_ix86_isa_flags2))
+        {
+          /* Enable CMPXCHG16B when -m128bit-atomic is enabled.  */
+          opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_CX16;
+        }
+    }

With global -march=skylake, a function marked target("arch=x86-64")
still emits movdqa atomic loads. The non-explicit bit needs clearing
before deriving the default for each target option set.

+Variable
+int ix86_flags = 0

Can we reuse ix86_target_flags, m128bit-atomic only need one bit.

+(define_expand "atomic_loadti"
+  [(set (match_operand:TI 0 "nonimmediate_operand")
+     (unspec:TI [(match_operand:TI 1 "memory_operand")
+                 (match_operand:SI 2 "const_int_operand")]
+                UNSPEC_LDA))]
+  "TARGET_128BIT_ATOMIC_ENABLED"
+{
+  emit_insn (gen_atomic_loadti_sse (operands[0], operands[1]));
+  DONE;
+})

change operands[0] from nonimmediate_operand to register_operand?


+(define_expand "atomic_storeti"
+  [(set (match_operand:TI 0 "memory_operand")
+     (unspec:TI [(match_operand:TI 1 "nonimmediate_operand")
+                 (match_operand:SI 2 "const_int_operand")]
+                UNSPEC_STA))]
+  "TARGET_128BIT_ATOMIC_ENABLED"
+{
+  /* Use V1TImode to force vector register for atomic store.  */
+  rtx src = gen_reg_rtx (V1TImode);
+  rtx op1 = gen_lowpart (V1TImode, operands[1]);
+  emit_move_insn (src, op1);
+  emit_insn (gen_atomic_storeti_sse (operands[0], src));
+  DONE;
+})
+
Other atomic store handles sequentially consistent stores with a fence. .i.e

 /* ... followed by an MFENCE, if required.  */
 if (is_mm_seq_cst (model))
   emit_insn (gen_mem_thread_fence (operands[2]));
 DONE;

Do we need a similar handle for atomic_storeti?




-- 
BR,
Hongtao
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.