diff options
Diffstat (limited to 'gcc/testsuite/gcc.target/riscv/amo/zacas-ztso-compare-exchange-compatability-mapping.cc')
-rw-r--r-- | gcc/testsuite/gcc.target/riscv/amo/zacas-ztso-compare-exchange-compatability-mapping.cc | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/riscv/amo/zacas-ztso-compare-exchange-compatability-mapping.cc b/gcc/testsuite/gcc.target/riscv/amo/zacas-ztso-compare-exchange-compatability-mapping.cc new file mode 100644 index 0000000..560172b --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/amo/zacas-ztso-compare-exchange-compatability-mapping.cc @@ -0,0 +1,58 @@ +/* +** Verify that atomic op mappings match the PSABI doc's recommended mapping. +** compare_exchange ops with seq_cst failure ordering need a leading fence +** to remain compatible with Table A.6 (A6C). +*/ +/* { dg-do compile } */ +/* { dg-options "-O3 -std=c++17" } */ +/* { dg-add-options riscv_zacas } */ +/* { dg-add-options riscv_ztso } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +/* +** atomic_compare_exchange_weak_int_relaxed_seq_cst: +** ... +** fence\trw,rw +** amoadd\.w\t[atx][0-9]+,a2,0\(a0\) +** ... +*/ +void atomic_compare_exchange_weak_int_relaxed_seq_cst (int *bar, int *baz, int qux) +{ + __atomic_compare_exchange_n(bar, baz, qux, 0, __ATOMIC_RELAXED, __ATOMIC_SEQ_CST); +} + +/* +** atomic_compare_exchange_weak_int_seq_cst_seq_cst: +** ... +** fence\trw,rw +** amoadd\.w\t[atx][0-9]+,a2,0\(a0\) +** ... +*/ +void atomic_compare_exchange_weak_int_seq_cst_seq_cst (int *bar, int *baz, int qux) +{ + __atomic_compare_exchange_n(bar, baz, qux, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); +} + +/* +** atomic_compare_exchange_strong_int_relaxed_seq_cst: +** ... +** fence\trw,rw +** amoadd\.w\t[atx][0-9]+,a2,0\(a0\) +** ... +*/ +void atomic_compare_exchange_strong_int_relaxed_seq_cst (int *bar, int *baz, int qux) +{ + __atomic_compare_exchange_n(bar, baz, qux, 1, __ATOMIC_RELAXED, __ATOMIC_SEQ_CST); +} + +/* +** atomic_compare_exchange_strong_int_seq_cst_seq_cst: +** ... +** fence\trw,rw +** amoadd\.w\t[atx][0-9]+,a2,0\(a0\) +** ... +*/ +void atomic_compare_exchange_strong_int_seq_cst_seq_cst (int *bar, int *baz, int qux) +{ + __atomic_compare_exchange_n(bar, baz, qux, 1, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); +} |