]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
LoongArch: Allow using bstrins for masking the address in atomic_test_and_set
authorXi Ruoyao <xry111@xry111.site>
Sat, 1 Mar 2025 03:46:44 +0000 (11:46 +0800)
committerLulu Cheng <chenglulu@loongson.cn>
Mon, 18 Aug 2025 01:09:34 +0000 (09:09 +0800)
We can use bstrins for masking the address here.  As people are already
working on LA32R (which lacks bstrins instructions), for future-proofing
we check whether (const_int -4) is an and_operand and force it into an
register if not.

gcc/ChangeLog:

* config/loongarch/sync.md (atomic_test_and_set): Use bstrins
for masking the address if possible.

gcc/config/loongarch/sync.md

index 63929abba457e2bc19dd5d8aaf783961b46ff629..01346a79da227b2f6363bb05310eb849ff7627a5 100644 (file)
   rtx mem = operands[1];
   rtx model = operands[2];
   rtx addr = force_reg (Pmode, XEXP (mem, 0));
-  rtx tmp_reg = gen_reg_rtx (Pmode);
-  rtx zero_reg = gen_rtx_REG (Pmode, 0);
-
+  rtx mask = gen_int_mode (-4, Pmode);
   rtx aligned_addr = gen_reg_rtx (Pmode);
-  emit_move_insn (tmp_reg, gen_rtx_PLUS (Pmode, zero_reg, GEN_INT (-4)));
-  emit_move_insn (aligned_addr, gen_rtx_AND (Pmode, addr, tmp_reg));
+
+  if (!and_operand (mask, Pmode))
+    mask = force_reg (Pmode, mask);
+
+  emit_move_insn (aligned_addr, gen_rtx_AND (Pmode, addr, mask));
 
   rtx aligned_mem = change_address (mem, SImode, aligned_addr);
   set_mem_alias_set (aligned_mem, 0);