Regarding the amocas.q follow-up patch:
I'm having trouble with matching any TImode compare-and-swap patterns.
Here's the RTL I'm trying:
(define_mode_iterator SUPERGPR [SI DI TI])
(define_insn "zacas_atomic_cas_value<mode>"
[(set (match_operand:SUPERGPR 0 "register_operand" "=&r")
(match_operand:SUPERGPR 1 "memory_operand" "+A"))
(set (match_dup 1)
(unspec_volatile:SUPERGPR [(match_operand:SUPERGPR 2 "reg_or_0_operand"
"rJ")
(match_operand:SUPERGPR 3 "reg_or_0_operand" "rJ")
(match_operand:SI 4 "const_int_operand") ;; mod_s
(match_operand:SI 5 "const_int_operand")] ;; mod_f
UNSPEC_COMPARE_AND_SWAP))]
"TARGET_ZACAS"
{
return "amocassupergpr<MODE>";
}
[(set_attr "type" "atomic")
(set (attr "length") (const_int 4))])
(define_expand "atomic_compare_and_swap<mode>"
[(match_operand:SI 0 "register_operand" "") ;; bool output
(match_operand:SUPERGPR 1 "register_operand" "") ;; val output
(match_operand:SUPERGPR 2 "memory_operand" "") ;; memory
(match_operand:SUPERGPR 3 "reg_or_0_operand" "") ;; expected value
(match_operand:SUPERGPR 4 "reg_or_0_operand" "") ;; desired value
(match_operand:SI 5 "const_int_operand" "") ;; is_weak
(match_operand:SI 6 "const_int_operand" "") ;; mod_s
(match_operand:SI 7 "const_int_operand" "")] ;; mod_f
"TARGET_ZACAS"
{
emit_insn (gen_zacas_atomic_cas_value<mode> (operands[1], operands[2],
operands[3], operands[4],
operands[6], operands[7]));
DONE;
})
and here's my testcase:
void atomic_compare_exchange_long_long_seq_cst (__int128 *bar, __int128 *baz,
__int128 qux)
{
__atomic_compare_exchange_n(bar, baz, qux, 1, __ATOMIC_SEQ_CST,
__ATOMIC_SEQ_CST);
}
void atomic_compare_exchange_int_seq_cst (int *bar, int *baz, int qux)
{
__atomic_compare_exchange_n(bar, baz, qux, 1, __ATOMIC_SEQ_CST,
__ATOMIC_SEQ_CST);
}
void atomic_compare_exchange_long_seq_cst (long *bar, long *baz, long qux)
{
__atomic_compare_exchange_n(bar, baz, qux, 1, __ATOMIC_SEQ_CST,
__ATOMIC_SEQ_CST);
}
and generated asm:
atomic_compare_exchange_long_long_seq_cst:
li a5,5
addi sp,sp,-16
mv a4,a5
sd ra,8(sp)
call __atomic_compare_exchange_16
ld ra,8(sp)
addi sp,sp,16
jr ra
.size atomic_compare_exchange_long_long_seq_cst,
.-atomic_compare_exchange_long_long_seq_cst
.align 1
.globl atomic_compare_exchange_int_seq_cst
.type atomic_compare_exchange_int_seq_cst, @function
atomic_compare_exchange_int_seq_cst:
lw a4,0(a1)
amocassupergprSI
sw a5,0(a1)
ret
.size atomic_compare_exchange_int_seq_cst,
.-atomic_compare_exchange_int_seq_cst
.align 1
.globl atomic_compare_exchange_long_seq_cst
.type atomic_compare_exchange_long_seq_cst, @function
atomic_compare_exchange_long_seq_cst:
ld a4,0(a1)
amocassupergprDI
sd a5,0(a1)
ret
.size atomic_compare_exchange_long_seq_cst,
.-atomic_compare_exchange_long_seq_cst
.ident "GCC: (GNU) 15.0.0 20240627 (experimental)"
.section .note.GNU-stack,"",@progbits
The SI/DI patterns match fine but TI generates a call.
I've also tried doing things similar to:
(define_expand "<u>mulditi3"
where only the define_expand has TImode operands and the define_insn
uses placeholder SI operands.
No luck with that approach either.
I'd appreciate any guidance here - otherwise I'll keep trying to make
sense of what's happening in insn-recog.cc ;)
Thanks,
Patrick
On 7/3/24 11:16, Patrick O'Neill wrote:
From: Gianluca Guida<gianl...@rivosinc.com>
This patch adds support for amocas.{b|h|w|d}. Support for amocas.q
(64/128 bit cas for rv32/64) will be added in a future patch.
Extension:https://github.com/riscv/riscv-zacas
Ratification:https://jira.riscv.org/browse/RVS-680
gcc/ChangeLog:
* common/config/riscv/riscv-common.cc
(riscv_subset_list::to_string): Skip zacas when not supported by
the assembler.
* config.in: Regenerate.
* config/riscv/arch-canonicalize: Make zacas imply zaamo.
* config/riscv/riscv.opt: Add zacas.
* config/riscv/sync.md (zacas_atomic_cas_value<mode>): New pattern.
(atomic_compare_and_swap<mode>): Use new pattern for compare-and-swap
ops.
* configure: Regenerate.
* configure.ac: Regenerate.
* doc/sourcebuild.texi: Add Zacas documentation.
gcc/testsuite/ChangeLog:
* lib/target-supports.exp: Add zacas testsuite infra support.
*
gcc.target/riscv/amo/zalrsc-rvwmo-compare-exchange-int-acquire-release.c:
Remove zacas to continue to test the lr/sc pairs.
* gcc.target/riscv/amo/zalrsc-rvwmo-compare-exchange-int-acquire.c:
Ditto.
* gcc.target/riscv/amo/zalrsc-rvwmo-compare-exchange-int-consume.c:
Ditto.
* gcc.target/riscv/amo/zalrsc-rvwmo-compare-exchange-int-relaxed.c:
Ditto.
* gcc.target/riscv/amo/zalrsc-rvwmo-compare-exchange-int-release.c:
Ditto.
*
gcc.target/riscv/amo/zalrsc-rvwmo-compare-exchange-int-seq-cst-relaxed.c: Ditto.
* gcc.target/riscv/amo/zalrsc-rvwmo-compare-exchange-int-seq-cst.c:
Ditto.
*
gcc.target/riscv/amo/zalrsc-ztso-compare-exchange-int-acquire-release.c: Ditto.
* gcc.target/riscv/amo/zalrsc-ztso-compare-exchange-int-acquire.c:
Ditto.
* gcc.target/riscv/amo/zalrsc-ztso-compare-exchange-int-consume.c:
Ditto.
* gcc.target/riscv/amo/zalrsc-ztso-compare-exchange-int-relaxed.c:
Ditto.
* gcc.target/riscv/amo/zalrsc-ztso-compare-exchange-int-release.c:
Ditto.
*
gcc.target/riscv/amo/zalrsc-ztso-compare-exchange-int-seq-cst-relaxed.c: Ditto.
* gcc.target/riscv/amo/zalrsc-ztso-compare-exchange-int-seq-cst.c:
Ditto.
* gcc.target/riscv/amo/zabha-zacas-preferred-over-zalrsc.c: New test.
* gcc.target/riscv/amo/zacas-char-requires-zabha.c: New test.
* gcc.target/riscv/amo/zacas-char-requires-zacas.c: New test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-char-acq-rel.c: New
test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-char-acquire.c: New
test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-char-relaxed.c: New
test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-char-release.c: New
test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-char-seq-cst.c: New
test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-int-acq-rel.c: New
test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-int-acquire.c: New
test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-int-relaxed.c: New
test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-int-release.c: New
test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-int-seq-cst.c: New
test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-short-acq-rel.c:
New test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-short-acquire.c:
New test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-short-relaxed.c:
New test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-short-release.c:
New test.
* gcc.target/riscv/amo/zacas-rvwmo-compare-exchange-short-seq-cst.c:
New test.
* gcc.target/riscv/amo/zacas-ztso-compare-exchange-char-seq-cst.c: New
test.
* gcc.target/riscv/amo/zacas-ztso-compare-exchange-char.c: New test.
* gcc.target/riscv/amo/zacas-ztso-compare-exchange-int-seq-cst.c: New
test.
* gcc.target/riscv/amo/zacas-ztso-compare-exchange-int.c: New test.
* gcc.target/riscv/amo/zacas-ztso-compare-exchange-short-seq-cst.c: New
test.
* gcc.target/riscv/amo/zacas-ztso-compare-exchange-short.c: New test.
Co-authored-by: Patrick O'Neill<patr...@rivosinc.com>
---
Gianluca Guida created the initial patch. Rebased and added more
testcases/docs/etc.
Tested using amo.exp with rv64gc_zalrsc and rv64gc_ztso.
Relying on precommit for full testing.
---