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.
---

Reply via email to