]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
RISC-V: Add support for subword atomic loads/stores
authorPatrick O'Neill <patrick@rivosinc.com>
Thu, 13 Jun 2024 00:10:13 +0000 (17:10 -0700)
committerPatrick O'Neill <patrick@rivosinc.com>
Thu, 13 Jun 2024 23:36:30 +0000 (16:36 -0700)
Andrea Parri recently pointed out that we were emitting overly conservative
fences for seq_cst atomic loads/stores. This adds support for the optimized
fences specified in the PSABI:
https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/2092568f7896ceaa1ec0f02569b19eaa42cd51c9/riscv-atomic.adoc

gcc/ChangeLog:

* config/riscv/sync-rvwmo.md: Add support for subword fenced
loads/stores.
* config/riscv/sync-ztso.md: Ditto.
* config/riscv/sync.md: Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/amo/amo-table-a-6-load-1.c: Increase test coverage to
include longs, shorts, chars, and bools.
* gcc.target/riscv/amo/amo-table-a-6-load-2.c: Ditto.
* gcc.target/riscv/amo/amo-table-a-6-load-3.c: Ditto.
* gcc.target/riscv/amo/amo-table-a-6-store-1.c: Ditto.
* gcc.target/riscv/amo/amo-table-a-6-store-2.c: Ditto.
* gcc.target/riscv/amo/amo-table-a-6-store-compat-3.c: Ditto.
* gcc.target/riscv/amo/amo-table-ztso-load-1.c: Ditto.
* gcc.target/riscv/amo/amo-table-ztso-load-2.c: Ditto.
* gcc.target/riscv/amo/amo-table-ztso-load-3.c: Ditto.
* gcc.target/riscv/amo/amo-table-ztso-store-1.c: Ditto.
* gcc.target/riscv/amo/amo-table-ztso-store-2.c: Ditto.
* gcc.target/riscv/amo/amo-table-ztso-store-3.c: Ditto.

Signed-off-by: Patrick O'Neill <patrick@rivosinc.com>
Tested-by: Andrea Parri <andrea@rivosinc.com>
15 files changed:
gcc/config/riscv/sync-rvwmo.md
gcc/config/riscv/sync-ztso.md
gcc/config/riscv/sync.md
gcc/testsuite/gcc.target/riscv/amo/amo-table-a-6-load-1.c
gcc/testsuite/gcc.target/riscv/amo/amo-table-a-6-load-2.c
gcc/testsuite/gcc.target/riscv/amo/amo-table-a-6-load-3.c
gcc/testsuite/gcc.target/riscv/amo/amo-table-a-6-store-1.c
gcc/testsuite/gcc.target/riscv/amo/amo-table-a-6-store-2.c
gcc/testsuite/gcc.target/riscv/amo/amo-table-a-6-store-compat-3.c
gcc/testsuite/gcc.target/riscv/amo/amo-table-ztso-load-1.c
gcc/testsuite/gcc.target/riscv/amo/amo-table-ztso-load-2.c
gcc/testsuite/gcc.target/riscv/amo/amo-table-ztso-load-3.c
gcc/testsuite/gcc.target/riscv/amo/amo-table-ztso-store-1.c
gcc/testsuite/gcc.target/riscv/amo/amo-table-ztso-store-2.c
gcc/testsuite/gcc.target/riscv/amo/amo-table-ztso-store-3.c

index e639a1e23924d9807eec785de9a9691b766e95ad..5db94c8c27fa250220a059ed19d68cc6ea378a6d 100644 (file)
@@ -47,9 +47,9 @@
 ;; Atomic memory operations.
 
 (define_insn "atomic_load_rvwmo<mode>"
-  [(set (match_operand:GPR 0 "register_operand" "=r")
-       (unspec_volatile:GPR
-           [(match_operand:GPR 1 "memory_operand" "A")
+  [(set (match_operand:ANYI 0 "register_operand" "=r")
+       (unspec_volatile:ANYI
+           [(match_operand:ANYI 1 "memory_operand" "A")
             (match_operand:SI 2 "const_int_operand")]  ;; model
         UNSPEC_ATOMIC_LOAD))]
   "!TARGET_ZTSO"
 
     if (model == MEMMODEL_SEQ_CST)
       return "fence\trw,rw\;"
-            "l<amo>\t%0,%1\;"
+            "<load>\t%0,%1\;"
             "fence\tr,rw";
     if (model == MEMMODEL_ACQUIRE)
-      return "l<amo>\t%0,%1\;"
+      return "<load>\t%0,%1\;"
             "fence\tr,rw";
     else
-      return "l<amo>\t%0,%1";
+      return "<load>\t%0,%1";
   }
   [(set_attr "type" "multi")
    (set (attr "length") (const_int 12))])
@@ -73,9 +73,9 @@
 ;; Implement atomic stores with conservative fences.
 ;; This allows us to be compatible with the ISA manual Table A.6 and Table A.7.
 (define_insn "atomic_store_rvwmo<mode>"
-  [(set (match_operand:GPR 0 "memory_operand" "=A")
-       (unspec_volatile:GPR
-           [(match_operand:GPR 1 "reg_or_0_operand" "rJ")
+  [(set (match_operand:ANYI 0 "memory_operand" "=A")
+       (unspec_volatile:ANYI
+           [(match_operand:ANYI 1 "reg_or_0_operand" "rJ")
             (match_operand:SI 2 "const_int_operand")]  ;; model
         UNSPEC_ATOMIC_STORE))]
   "!TARGET_ZTSO"
 
     if (model == MEMMODEL_SEQ_CST)
       return "fence\trw,w\;"
-            "s<amo>\t%z1,%0\;"
+            "<store>\t%z1,%0\;"
             "fence\trw,rw";
     if (model == MEMMODEL_RELEASE)
       return "fence\trw,w\;"
-            "s<amo>\t%z1,%0";
+            "<store>\t%z1,%0";
     else
-      return "s<amo>\t%z1,%0";
+      return "<store>\t%z1,%0";
   }
   [(set_attr "type" "multi")
    (set (attr "length") (const_int 12))])
index 0a866d2906bdbfe0589dc71de9818315b93954a9..f99a21b45ca415603130faeef8e1fb0cbb792eb7 100644 (file)
@@ -41,9 +41,9 @@
 ;; Atomic memory operations.
 
 (define_insn "atomic_load_ztso<mode>"
-  [(set (match_operand:GPR 0 "register_operand" "=r")
-       (unspec_volatile:GPR
-           [(match_operand:GPR 1 "memory_operand" "A")
+  [(set (match_operand:ANYI 0 "register_operand" "=r")
+       (unspec_volatile:ANYI
+           [(match_operand:ANYI 1 "memory_operand" "A")
             (match_operand:SI 2 "const_int_operand")]  ;; model
         UNSPEC_ATOMIC_LOAD))]
   "TARGET_ZTSO"
 
     if (model == MEMMODEL_SEQ_CST)
       return "fence\trw,rw\;"
-            "l<amo>\t%0,%1";
+            "<load>\t%0,%1";
     else
-      return "l<amo>\t%0,%1";
+      return "<load>\t%0,%1";
   }
   [(set_attr "type" "multi")
    (set (attr "length") (const_int 12))])
 
 (define_insn "atomic_store_ztso<mode>"
-  [(set (match_operand:GPR 0 "memory_operand" "=A")
-       (unspec_volatile:GPR
-           [(match_operand:GPR 1 "reg_or_0_operand" "rJ")
+  [(set (match_operand:ANYI 0 "memory_operand" "=A")
+       (unspec_volatile:ANYI
+           [(match_operand:ANYI 1 "reg_or_0_operand" "rJ")
             (match_operand:SI 2 "const_int_operand")]  ;; model
         UNSPEC_ATOMIC_STORE))]
   "TARGET_ZTSO"
     model = memmodel_base (model);
 
     if (model == MEMMODEL_SEQ_CST)
-      return "s<amo>\t%z1,%0\;"
+      return "<store>\t%z1,%0\;"
             "fence\trw,rw";
     else
-      return "s<amo>\t%z1,%0";
+      return "<store>\t%z1,%0";
   }
   [(set_attr "type" "multi")
    (set (attr "length") (const_int 8))])
index 4df9d0b5a5ff4ef50376fa66a8d1cd12289d642f..4784375449f02301137383aa2257ea7bfe881050 100644 (file)
@@ -57,8 +57,8 @@
 ;; Atomic memory operations.
 
 (define_expand "atomic_load<mode>"
-  [(match_operand:GPR 0 "register_operand")
-   (match_operand:GPR 1 "memory_operand")
+  [(match_operand:ANYI 0 "register_operand")
+   (match_operand:ANYI 1 "memory_operand")
    (match_operand:SI 2 "const_int_operand")] ;; model
   ""
   {
@@ -72,8 +72,8 @@
   })
 
 (define_expand "atomic_store<mode>"
-  [(match_operand:GPR 0 "memory_operand")
-   (match_operand:GPR 1 "reg_or_0_operand")
+  [(match_operand:ANYI 0 "memory_operand")
+   (match_operand:ANYI 1 "reg_or_0_operand")
    (match_operand:SI 2 "const_int_operand")] ;; model
   ""
   {
index 53dd523445273da4ed456b5cfce788ef119b8295..948fece6125128e92eb6effe6a2962e326cf2a78 100644 (file)
@@ -5,12 +5,56 @@
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
-** foo:
+** atomic_load_long_relaxed:
+**     l[wd]\t[atx][0-9]+,0\(a0\)
+**     s[wd]\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_long_relaxed (long* bar, long* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_load_int_relaxed:
 **     lw\t[atx][0-9]+,0\(a0\)
 **     sw\t[atx][0-9]+,0\(a1\)
 **     ret
 */
-void foo (int* bar, int* baz)
+void atomic_load_int_relaxed (int* bar, int* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_load_short_relaxed:
+**     lh\t[atx][0-9]+,0\(a0\)
+**     sh\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_short_relaxed (short* bar, short* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_load_char_relaxed:
+**     lb\t[atx][0-9]+,0\(a0\)
+**     sb\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_char_relaxed (char* bar, char* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_load_bool_relaxed:
+**     lb\t[atx][0-9]+,0\(a0\)
+**     sb\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_bool_relaxed (_Bool* bar, _Bool* baz)
 {
   __atomic_load(bar, baz, __ATOMIC_RELAXED);
 }
index dda0f541515653af40a05f3e54ef11b6411191ce..e855db9b761c911016a967803d290094cdba7eff 100644 (file)
@@ -5,13 +5,61 @@
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
-** foo:
+** atomic_load_long_acquire:
+**     l[wd]\t[atx][0-9]+,0\(a0\)
+**     fence\tr,rw
+**     s[wd]\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_long_acquire (long* bar, long* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_ACQUIRE);
+}
+
+/*
+** atomic_load_int_acquire:
 **     lw\t[atx][0-9]+,0\(a0\)
 **     fence\tr,rw
 **     sw\t[atx][0-9]+,0\(a1\)
 **     ret
 */
-void foo (int* bar, int* baz)
+void atomic_load_int_acquire (int* bar, int* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_ACQUIRE);
+}
+
+/*
+** atomic_load_short_acquire:
+**     lh\t[atx][0-9]+,0\(a0\)
+**     fence\tr,rw
+**     sh\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_short_acquire (short* bar, short* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_ACQUIRE);
+}
+
+/*
+** atomic_load_char_acquire:
+**     lb\t[atx][0-9]+,0\(a0\)
+**     fence\tr,rw
+**     sb\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_char_acquire (char* bar, char* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_ACQUIRE);
+}
+
+/*
+** atomic_load_bool_acquire:
+**     lb\t[atx][0-9]+,0\(a0\)
+**     fence\tr,rw
+**     sb\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_bool_acquire (_Bool* bar, _Bool* baz)
 {
   __atomic_load(bar, baz, __ATOMIC_ACQUIRE);
 }
index 3279557fa4a92e05553cabf1507efe09adb199ce..6e79ca72abc7a95e25a05a078b10396664c7176e 100644 (file)
@@ -5,14 +5,66 @@
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
-** foo:
+** atomic_load_long_seq_cst:
+**     fence\trw,rw
+**     l[wd]\t[atx][0-9]+,0\(a0\)
+**     fence\tr,rw
+**     s[wd]\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_long_seq_cst (long* bar, long* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_load_int_seq_cst:
 **     fence\trw,rw
 **     lw\t[atx][0-9]+,0\(a0\)
 **     fence\tr,rw
 **     sw\t[atx][0-9]+,0\(a1\)
 **     ret
 */
-void foo (int* bar, int* baz)
+void atomic_load_int_seq_cst (int* bar, int* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_load_short_seq_cst:
+**     fence\trw,rw
+**     lh\t[atx][0-9]+,0\(a0\)
+**     fence\tr,rw
+**     sh\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_short_seq_cst (short* bar, short* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_load_char_seq_cst:
+**     fence\trw,rw
+**     lb\t[atx][0-9]+,0\(a0\)
+**     fence\tr,rw
+**     sb\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_char_seq_cst (char* bar, char* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_load_bool_seq_cst:
+**     fence\trw,rw
+**     lb\t[atx][0-9]+,0\(a0\)
+**     fence\tr,rw
+**     sb\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_bool_seq_cst (_Bool* bar, _Bool* baz)
 {
   __atomic_load(bar, baz, __ATOMIC_SEQ_CST);
 }
index 6b05429520bf6a00a51fe1473db203bcc5d3f0aa..ee7e7dbc8ee2cb03e22bf9108edb643f783eb77b 100644 (file)
@@ -5,12 +5,56 @@
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
-** foo:
+** atomic_store_long_relaxed:
+**     l[wd]\t[atx][0-9]+,0\(a1\)
+**     s[wd]\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_long_relaxed (long* bar, long* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_store_int_relaxed:
 **     lw\t[atx][0-9]+,0\(a1\)
 **     sw\t[atx][0-9]+,0\(a0\)
 **     ret
 */
-void foo (int* bar, int* baz)
+void atomic_store_int_relaxed (int* bar, int* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_store_short_relaxed:
+**     lhu\t[atx][0-9]+,0\(a1\)
+**     sh\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_short_relaxed (short* bar, short* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_store_char_relaxed:
+**     lbu\t[atx][0-9]+,0\(a1\)
+**     sb\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_char_relaxed (char* bar, char* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_store_bool_relaxed:
+**     lbu\t[atx][0-9]+,0\(a1\)
+**     sb\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_bool_relaxed (_Bool* bar, _Bool* baz)
 {
   __atomic_store(bar, baz, __ATOMIC_RELAXED);
 }
index 1ad7dede931bd965dce63ac8a56cb4806a081e3e..5110512e1ad6477513dba74eeba7d320174fdcc7 100644 (file)
@@ -5,13 +5,61 @@
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
-** foo:
+** atomic_store_long_release:
+**     l[wd]\t[atx][0-9]+,0\(a1\)
+**     fence\trw,w
+**     s[wd]\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_long_release (long* bar, long* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELEASE);
+}
+
+/*
+** atomic_store_int_release:
 **     lw\t[atx][0-9]+,0\(a1\)
 **     fence\trw,w
 **     sw\t[atx][0-9]+,0\(a0\)
 **     ret
 */
-void foo (int* bar, int* baz)
+void atomic_store_int_release (int* bar, int* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELEASE);
+}
+
+/*
+** atomic_store_short_release:
+**     lhu\t[atx][0-9]+,0\(a1\)
+**     fence\trw,w
+**     sh\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_short_release (short* bar, short* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELEASE);
+}
+
+/*
+** atomic_store_char_release:
+**     lbu\t[atx][0-9]+,0\(a1\)
+**     fence\trw,w
+**     sb\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_char_release (char* bar, char* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELEASE);
+}
+
+/*
+** atomic_store_bool_release:
+**     lbu\t[atx][0-9]+,0\(a1\)
+**     fence\trw,w
+**     sb\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_bool_release (_Bool* bar, _Bool* baz)
 {
   __atomic_store(bar, baz, __ATOMIC_RELEASE);
 }
index b16b2058413a3704f2cdd5925de64cad51444319..016e5dec87d4014531b0cd5b25d357ca713ead82 100644 (file)
@@ -5,14 +5,66 @@
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
-** foo:
+** atomic_store_long_seq_cst:
+**     l[wd]\t[atx][0-9]+,0\(a1\)
+**     fence\trw,w
+**     s[wd]\t[atx][0-9]+,0\(a0\)
+**     fence\trw,rw
+**     ret
+*/
+void atomic_store_long_seq_cst (long* bar, long* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_store_int_seq_cst:
 **     lw\t[atx][0-9]+,0\(a1\)
 **     fence\trw,w
 **     sw\t[atx][0-9]+,0\(a0\)
 **     fence\trw,rw
 **     ret
 */
-void foo (int* bar, int* baz)
+void atomic_store_int_seq_cst (int* bar, int* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_store_short_seq_cst:
+**     lhu\t[atx][0-9]+,0\(a1\)
+**     fence\trw,w
+**     sh\t[atx][0-9]+,0\(a0\)
+**     fence\trw,rw
+**     ret
+*/
+void atomic_store_short_seq_cst (short* bar, short* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_store_char_seq_cst:
+**     lbu\t[atx][0-9]+,0\(a1\)
+**     fence\trw,w
+**     sb\t[atx][0-9]+,0\(a0\)
+**     fence\trw,rw
+**     ret
+*/
+void atomic_store_char_seq_cst (char* bar, char* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_store_bool_seq_cst:
+**     lbu\t[atx][0-9]+,0\(a1\)
+**     fence\trw,w
+**     sb\t[atx][0-9]+,0\(a0\)
+**     fence\trw,rw
+**     ret
+*/
+void atomic_store_bool_seq_cst (_Bool* bar, _Bool* baz)
 {
   __atomic_store(bar, baz, __ATOMIC_SEQ_CST);
 }
index ebb0a2e1d38e7e81b1701946bbe881eca4f0459d..ef5dee6ee60e0f9779bea58fd9c33cf5b111b2d9 100644 (file)
@@ -6,12 +6,56 @@
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
-** foo:
+** atomic_load_long_relaxed:
+**     l[wd]\t[atx][0-9]+,0\(a0\)
+**     s[wd]\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_long_relaxed (long* bar, long* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_load_int_relaxed:
 **     lw\t[atx][0-9]+,0\(a0\)
 **     sw\t[atx][0-9]+,0\(a1\)
 **     ret
 */
-void foo (int* bar, int* baz)
+void atomic_load_int_relaxed (int* bar, int* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_load_short_relaxed:
+**     lh\t[atx][0-9]+,0\(a0\)
+**     sh\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_short_relaxed (short* bar, short* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_load_char_relaxed:
+**     lb\t[atx][0-9]+,0\(a0\)
+**     sb\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_char_relaxed (char* bar, char* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_load_bool_relaxed:
+**     lb\t[atx][0-9]+,0\(a0\)
+**     sb\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_bool_relaxed (_Bool* bar, _Bool* baz)
 {
   __atomic_load(bar, baz, __ATOMIC_RELAXED);
 }
index c88c4be5aea62bfeab73a422c4dd581d5ce26419..4e94191812b1e6360f0dffc14aea9a04cd409412 100644 (file)
@@ -6,12 +6,56 @@
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
-** foo:
+** atomic_load_long_acquire:
+**     l[wd]\t[atx][0-9]+,0\(a0\)
+**     s[wd]\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_long_acquire (long* bar, long* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_ACQUIRE);
+}
+
+/*
+** atomic_load_int_acquire:
 **     lw\t[atx][0-9]+,0\(a0\)
 **     sw\t[atx][0-9]+,0\(a1\)
 **     ret
 */
-void foo (int* bar, int* baz)
+void atomic_load_int_acquire (int* bar, int* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_ACQUIRE);
+}
+
+/*
+** atomic_load_short_acquire:
+**     lh\t[atx][0-9]+,0\(a0\)
+**     sh\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_short_acquire (short* bar, short* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_ACQUIRE);
+}
+
+/*
+** atomic_load_char_acquire:
+**     lb\t[atx][0-9]+,0\(a0\)
+**     sb\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_char_acquire (char* bar, char* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_ACQUIRE);
+}
+
+/*
+** atomic_load_bool_acquire:
+**     lb\t[atx][0-9]+,0\(a0\)
+**     sb\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_bool_acquire (_Bool* bar, _Bool* baz)
 {
   __atomic_load(bar, baz, __ATOMIC_ACQUIRE);
 }
index 8713729c378b8da2807659723a597f13b8bfa6b8..93cd8bb909cc246d7e4481def6fcd8e90228f235 100644 (file)
@@ -6,13 +6,61 @@
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
-** foo:
+** atomic_load_long_seq_cst:
+**     fence\trw,rw
+**     l[wd]\t[atx][0-9]+,0\(a0\)
+**     s[wd]\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_long_seq_cst (long* bar, long* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_load_int_seq_cst:
 **     fence\trw,rw
 **     lw\t[atx][0-9]+,0\(a0\)
 **     sw\t[atx][0-9]+,0\(a1\)
 **     ret
 */
-void foo (int* bar, int* baz)
+void atomic_load_int_seq_cst (int* bar, int* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_load_short_seq_cst:
+**     fence\trw,rw
+**     lh\t[atx][0-9]+,0\(a0\)
+**     sh\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_short_seq_cst (short* bar, short* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_load_char_seq_cst:
+**     fence\trw,rw
+**     lb\t[atx][0-9]+,0\(a0\)
+**     sb\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_char_seq_cst (char* bar, char* baz)
+{
+  __atomic_load(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_load_bool_seq_cst:
+**     fence\trw,rw
+**     lb\t[atx][0-9]+,0\(a0\)
+**     sb\t[atx][0-9]+,0\(a1\)
+**     ret
+*/
+void atomic_load_bool_seq_cst (_Bool* bar, _Bool* baz)
 {
   __atomic_load(bar, baz, __ATOMIC_SEQ_CST);
 }
index ca8d5ed7515daf433e880544d2a33748d99f4296..2f46470ae153b027f483b738ecee1f7d2d45faf5 100644 (file)
@@ -6,12 +6,56 @@
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
-** foo:
+** atomic_store_long_relaxed:
+**     l[wd]\t[atx][0-9]+,0\(a1\)
+**     s[wd]\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_long_relaxed (long* bar, long* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_store_int_relaxed:
 **     lw\t[atx][0-9]+,0\(a1\)
 **     sw\t[atx][0-9]+,0\(a0\)
 **     ret
 */
-void foo (int* bar, int* baz)
+void atomic_store_int_relaxed (int* bar, int* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_store_short_relaxed:
+**     lhu\t[atx][0-9]+,0\(a1\)
+**     sh\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_short_relaxed (short* bar, short* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_store_char_relaxed:
+**     lbu\t[atx][0-9]+,0\(a1\)
+**     sb\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_char_relaxed (char* bar, char* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELAXED);
+}
+
+/*
+** atomic_store_bool_relaxed:
+**     lbu\t[atx][0-9]+,0\(a1\)
+**     sb\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_bool_relaxed (_Bool* bar, _Bool* baz)
 {
   __atomic_store(bar, baz, __ATOMIC_RELAXED);
 }
index 23957198cfbd2d01704439198ce00b5a9d647e51..dd2db3a787867e1a25309a79d4dadd5a8032915d 100644 (file)
@@ -6,12 +6,56 @@
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
-** foo:
+** atomic_store_long_release:
+**     l[wd]\t[atx][0-9]+,0\(a1\)
+**     s[wd]\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_long_release (long* bar, long* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELEASE);
+}
+
+/*
+** atomic_store_int_release:
 **     lw\t[atx][0-9]+,0\(a1\)
 **     sw\t[atx][0-9]+,0\(a0\)
 **     ret
 */
-void foo (int* bar, int* baz)
+void atomic_store_int_release (int* bar, int* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELEASE);
+}
+
+/*
+** atomic_store_short_release:
+**     lhu\t[atx][0-9]+,0\(a1\)
+**     sh\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_short_release (short* bar, short* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELEASE);
+}
+
+/*
+** atomic_store_char_release:
+**     lbu\t[atx][0-9]+,0\(a1\)
+**     sb\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_char_release (char* bar, char* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_RELEASE);
+}
+
+/*
+** atomic_store_bool_release:
+**     lbu\t[atx][0-9]+,0\(a1\)
+**     sb\t[atx][0-9]+,0\(a0\)
+**     ret
+*/
+void atomic_store_bool_release (_Bool* bar, _Bool* baz)
 {
   __atomic_store(bar, baz, __ATOMIC_RELEASE);
 }
index 11c12f0ca1ad14a1615680e32461fee0385d01fb..e32cfb1a3cbd3cd2ae02d50c4af31b5967910192 100644 (file)
@@ -6,13 +6,61 @@
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
-** foo:
+** atomic_store_long_seq_cst:
+**     l[wd]\t[atx][0-9]+,0\(a1\)
+**     s[wd]\t[atx][0-9]+,0\(a0\)
+**     fence\trw,rw
+**     ret
+*/
+void atomic_store_long_seq_cst (long* bar, long* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_store_int_seq_cst:
 **     lw\t[atx][0-9]+,0\(a1\)
 **     sw\t[atx][0-9]+,0\(a0\)
 **     fence\trw,rw
 **     ret
 */
-void foo (int* bar, int* baz)
+void atomic_store_int_seq_cst (int* bar, int* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_store_short_seq_cst:
+**     lhu\t[atx][0-9]+,0\(a1\)
+**     sh\t[atx][0-9]+,0\(a0\)
+**     fence\trw,rw
+**     ret
+*/
+void atomic_store_short_seq_cst (short* bar, short* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_store_char_seq_cst:
+**     lbu\t[atx][0-9]+,0\(a1\)
+**     sb\t[atx][0-9]+,0\(a0\)
+**     fence\trw,rw
+**     ret
+*/
+void atomic_store_char_seq_cst (char* bar, char* baz)
+{
+  __atomic_store(bar, baz, __ATOMIC_SEQ_CST);
+}
+
+/*
+** atomic_store_bool_seq_cst:
+**     lbu\t[atx][0-9]+,0\(a1\)
+**     sb\t[atx][0-9]+,0\(a0\)
+**     fence\trw,rw
+**     ret
+*/
+void atomic_store_bool_seq_cst (_Bool* bar, _Bool* baz)
 {
   __atomic_store(bar, baz, __ATOMIC_SEQ_CST);
 }