Module Name:    src
Committed By:   martin
Date:           Wed Aug 11 17:19:01 UTC 2021

Modified Files:
        src/common/lib/libc/arch/aarch64/atomic [netbsd-9]: atomic_add_16.S
            atomic_add_32.S atomic_add_64.S atomic_add_8.S atomic_and_16.S
            atomic_and_32.S atomic_and_64.S atomic_and_8.S atomic_cas_16.S
            atomic_cas_32.S atomic_cas_64.S atomic_cas_8.S atomic_dec_32.S
            atomic_dec_64.S atomic_inc_32.S atomic_inc_64.S atomic_nand_16.S
            atomic_nand_32.S atomic_nand_64.S atomic_nand_8.S atomic_op_asm.h
            atomic_or_16.S atomic_or_32.S atomic_or_64.S atomic_or_8.S
            atomic_sub_16.S atomic_sub_32.S atomic_sub_64.S atomic_sub_8.S
            atomic_swap_16.S atomic_swap_32.S atomic_swap_64.S atomic_swap_8.S
            atomic_xor_16.S atomic_xor_32.S atomic_xor_64.S atomic_xor_8.S
            membar_ops.S

Log Message:
Pull up following revision(s) (requested by skrll in ticket #1331):

        common/lib/libc/arch/aarch64/atomic/atomic_add_8.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_sub_8.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_sub_64.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S: revision 1.5
        common/lib/libc/arch/aarch64/atomic/atomic_inc_32.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_or_64.S: revision 1.3
        common/lib/libc/arch/aarch64/atomic/atomic_and_16.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_xor_64.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_and_32.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_add_64.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_op_asm.h: revision 1.5
        common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_op_asm.h: revision 1.6
        common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S: revision 1.4
        common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S: revision 1.5
        common/lib/libc/arch/aarch64/atomic/atomic_sub_16.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S: revision 1.6
        common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S: revision 1.5
        common/lib/libc/arch/aarch64/atomic/atomic_sub_32.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_xor_8.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S: revision 1.5
        common/lib/libc/arch/aarch64/atomic/atomic_or_32.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S: revision 1.5
        common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S: revision 1.5
        common/lib/libc/arch/aarch64/atomic/atomic_or_8.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_or_16.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_xor_16.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S: revision 1.4
        common/lib/libc/arch/aarch64/atomic/atomic_add_32.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_xor_32.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_dec_64.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S: revision 1.4
        common/lib/libc/arch/aarch64/atomic/atomic_add_16.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S: revision 1.4
        common/lib/libc/arch/aarch64/atomic/membar_ops.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S: revision 1.5
        common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S: revision 1.5
        common/lib/libc/arch/aarch64/atomic/atomic_inc_64.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_dec_32.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_and_8.S: revision 1.2
        common/lib/libc/arch/aarch64/atomic/atomic_and_64.S: revision 1.2

Part I of ad@'s performance improvements for aarch64
- Remove memory barriers from the atomic ops.  I don't understand why thos=
e
   are there.  Is it some architectural thing, or for a CPU bug, or just
   over-caution maybe?  They're not needed for correctness.
- Have unlikely conditional branches go forwards to help the static branch
   predictor.

Remove memory barriers from the atomic ops macros in the same way as was
done for the other atomic ops earlier.

Use the correct barriers - all of membar_{sync,producer,consumer} have
less scope than before.

LGTM from riastradh

As we're providing the legacy gcc __sync built-in functions for atomic
memory access we might as well get the memory barriers right...

 From the gcc documentation:

In most cases, these built-in functions are considered a full barrier.
That is, no memory operand is moved across the operation, either forward
or backward. Further, instructions are issued as necessary to prevent the
processor from speculating loads across the operation and from queuing
stores after the operation.

type __sync_lock_test_and_set (type *ptr, type value, ...)
    This built-in function is not a full barrier, but rather an acquire
    barrier. This means that references after the operation cannot move to
    (or be speculated to) before the operation, but previous memory stores
    may not be globally visible yet, and previous memory loads may not yet
    be satisfied.

void __sync_lock_release (type *ptr, ...)
    This built-in function is not a full barrier, but rather a release
    barrier. This means that all previous memory stores are globally
    visible, and all previous memory loads have been satisfied, but
    following memory reads are not prevented from being speculated to
    before the barrier.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.1.28.1 \
    src/common/lib/libc/arch/aarch64/atomic/atomic_add_16.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_add_32.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_add_64.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_add_8.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_and_16.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_and_32.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_and_64.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_and_8.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_dec_32.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_dec_64.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_inc_32.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_inc_64.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_or_16.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_or_32.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_or_8.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_sub_16.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_sub_32.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_sub_64.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_sub_8.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_xor_16.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_xor_32.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_xor_64.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_xor_8.S \
    src/common/lib/libc/arch/aarch64/atomic/membar_ops.S
cvs rdiff -u -r1.3 -r1.3.2.1 \
    src/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_op_asm.h
cvs rdiff -u -r1.1.28.2 -r1.1.28.3 \
    src/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S
cvs rdiff -u -r1.1.28.1 -r1.1.28.2 \
    src/common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S \
    src/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/common/lib/libc/arch/aarch64/atomic/atomic_add_16.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_add_16.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_add_16.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_add_16.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_add_16.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_add_16.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_add_16.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP16(add, add)
 
+SYNC_FETCH_OP16(add, add)
+
 ATOMIC_OP_ALIAS(atomic_add_16,_atomic_add_16)
 ATOMIC_OP_ALIAS(atomic_add_short,_atomic_add_16)
-STRONG_ALIAS(__sync_fetch_and_add_2,_atomic_add_16)
 STRONG_ALIAS(_atomic_add_short,_atomic_add_16)
 
 ATOMIC_OP16_NV(add, add)
 
+SYNC_OP16_FETCH(add, add)
+
 ATOMIC_OP_ALIAS(atomic_add_16_nv,_atomic_add_16_nv)
 ATOMIC_OP_ALIAS(atomic_add_short_nv,_atomic_add_16_nv)
-STRONG_ALIAS(__sync_add_and_fetch_2,_atomic_add_16_nv)
 STRONG_ALIAS(_atomic_add_short_nv,_atomic_add_16_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_add_32.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_add_32.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_add_32.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_add_32.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_add_32.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_add_32.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_add_32.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP32(add, add)
 
+SYNC_FETCH_OP32(add, add)
+
 ATOMIC_OP_ALIAS(atomic_add_32,_atomic_add_32)
 ATOMIC_OP_ALIAS(atomic_add_int,_atomic_add_32)
-STRONG_ALIAS(__sync_fetch_and_add_4,_atomic_add_32)
 STRONG_ALIAS(_atomic_add_int,_atomic_add_32)
 
 ATOMIC_OP32_NV(add, add)
 
+SYNC_OP32_FETCH(add, add)
+
 ATOMIC_OP_ALIAS(atomic_add_32_nv,_atomic_add_32_nv)
 ATOMIC_OP_ALIAS(atomic_add_int_nv,_atomic_add_32_nv)
-STRONG_ALIAS(__sync_add_and_fetch_4,_atomic_add_32_nv)
 STRONG_ALIAS(_atomic_add_int_nv,_atomic_add_32_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_add_64.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_add_64.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_add_64.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_add_64.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_add_64.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_add_64.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_add_64.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,18 +33,20 @@
 
 ATOMIC_OP64(add, add)
 
+SYNC_FETCH_OP64(add, add)
+
 ATOMIC_OP_ALIAS(atomic_add_64_nv,_atomic_add_64_nv)
 ATOMIC_OP_ALIAS(atomic_add_ptr_nv,_atomic_add_64_nv)
 ATOMIC_OP_ALIAS(atomic_add_long_nv,_atomic_add_64_nv)
 STRONG_ALIAS(_atomic_add_ptr_nv,_atomic_add_64_nv)
 STRONG_ALIAS(_atomic_add_long_nv,_atomic_add_64_nv)
-STRONG_ALIAS(__sync_add_and_fetch_8,_atomic_add_64_nv)
 
 ATOMIC_OP64_NV(add, add)
 
+SYNC_OP64_FETCH(add, add)
+
 ATOMIC_OP_ALIAS(atomic_add_64,_atomic_add_64)
 ATOMIC_OP_ALIAS(atomic_add_ptr,_atomic_add_64)
 ATOMIC_OP_ALIAS(atomic_add_long,_atomic_add_64)
 STRONG_ALIAS(_atomic_add_ptr,_atomic_add_64)
 STRONG_ALIAS(_atomic_add_long,_atomic_add_64)
-STRONG_ALIAS(__sync_fetch_and_add_8,_atomic_add_64)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_add_8.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_add_8.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_add_8.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_add_8.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_add_8.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_add_8.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_add_8.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP8(add, add)
 
+SYNC_FETCH_OP8(add, add)
+
 ATOMIC_OP_ALIAS(atomic_add_8,_atomic_add_8)
 ATOMIC_OP_ALIAS(atomic_add_char,_atomic_add_8)
-STRONG_ALIAS(__sync_fetch_and_add_1,_atomic_add_8)
 STRONG_ALIAS(_atomic_add_char,_atomic_add_8)
 
 ATOMIC_OP8_NV(add, add)
 
+SYNC_OP8_FETCH(add, add)
+
 ATOMIC_OP_ALIAS(atomic_add_8_nv,_atomic_add_8_nv)
 ATOMIC_OP_ALIAS(atomic_add_char_nv,_atomic_add_8_nv)
-STRONG_ALIAS(__sync_add_and_fetch_1,_atomic_add_8_nv)
 STRONG_ALIAS(_atomic_add_char_nv,_atomic_add_8_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_and_16.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_and_16.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_and_16.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_and_16.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_and_16.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_and_16.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_and_16.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP16(and, and)
 
+SYNC_FETCH_OP16(and, and)
+
 ATOMIC_OP_ALIAS(atomic_and_16,_atomic_and_16)
 ATOMIC_OP_ALIAS(atomic_and_ushort,_atomic_and_16)
-STRONG_ALIAS(__sync_fetch_and_and_2,_atomic_and_16)
 STRONG_ALIAS(_atomic_and_ushort,_atomic_and_16)
 
 ATOMIC_OP16_NV(and, and)
 
+SYNC_OP16_FETCH(and, and)
+
 ATOMIC_OP_ALIAS(atomic_and_16_nv,_atomic_and_16_nv)
 ATOMIC_OP_ALIAS(atomic_and_ushort_nv,_atomic_and_16_nv)
-STRONG_ALIAS(__sync_and_and_fetch_2,_atomic_and_16_nv)
 STRONG_ALIAS(_atomic_and_ushort_nv,_atomic_and_16_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_and_32.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_and_32.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_and_32.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_and_32.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_and_32.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_and_32.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_and_32.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP32(and, and)
 
+SYNC_FETCH_OP32(and, and)
+
 ATOMIC_OP_ALIAS(atomic_and_32,_atomic_and_32)
 ATOMIC_OP_ALIAS(atomic_and_uint,_atomic_and_32)
-STRONG_ALIAS(__sync_fetch_and_and_4,_atomic_and_32)
 STRONG_ALIAS(_atomic_and_uint,_atomic_and_32)
 
 ATOMIC_OP32_NV(and, and)
 
+SYNC_OP32_FETCH(and, and)
+
 ATOMIC_OP_ALIAS(atomic_and_32_nv,_atomic_and_32_nv)
 ATOMIC_OP_ALIAS(atomic_and_uint_nv,_atomic_and_32_nv)
-STRONG_ALIAS(__sync_and_and_fetch_4,_atomic_and_32_nv)
 STRONG_ALIAS(_atomic_and_uint_nv,_atomic_and_32_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_and_64.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_and_64.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_and_64.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_and_64.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_and_64.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_and_64.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_and_64.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP64(and, and)
 
+SYNC_FETCH_OP64(and, and)
+
 ATOMIC_OP_ALIAS(atomic_and_64,_atomic_and_64)
 ATOMIC_OP_ALIAS(atomic_and_ulong,_atomic_and_64)
 STRONG_ALIAS(_atomic_and_ulong,_atomic_and_64)
-STRONG_ALIAS(__sync_fetch_and_and_8,_atomic_and_64)
 
 ATOMIC_OP64_NV(and, and)
 
+SYNC_OP64_FETCH(and, and)
+
 ATOMIC_OP_ALIAS(atomic_and_64_nv,_atomic_and_64_nv)
 ATOMIC_OP_ALIAS(atomic_and_ulong_nv,_atomic_and_64_nv)
 STRONG_ALIAS(_atomic_and_ulong_nv,_atomic_and_64_nv)
-STRONG_ALIAS(__sync_and_and_fetch_8,_atomic_and_64_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_and_8.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_and_8.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_and_8.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_and_8.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_and_8.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_and_8.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_and_8.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP8(and, and)
 
+SYNC_FETCH_OP8(and, and)
+
 ATOMIC_OP_ALIAS(atomic_and_8,_atomic_and_8)
 ATOMIC_OP_ALIAS(atomic_and_uchar,_atomic_and_8)
-STRONG_ALIAS(__sync_fetch_and_and_1,_atomic_and_8)
 STRONG_ALIAS(_atomic_and_uchar,_atomic_and_8)
 
 ATOMIC_OP8_NV(and, and)
 
+SYNC_OP8_FETCH(and, and)
+
 ATOMIC_OP_ALIAS(atomic_and_8_nv,_atomic_and_8_nv)
 ATOMIC_OP_ALIAS(atomic_and_uchar_nv,_atomic_and_8_nv)
-STRONG_ALIAS(__sync_and_and_fetch_1,_atomic_and_8_nv)
 STRONG_ALIAS(_atomic_and_uchar_nv,_atomic_and_8_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_16.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_cas_16.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -37,12 +37,25 @@ ENTRY_NP(_atomic_cas_16)
 	cmp	w0, w1			/*   compare? */
 	b.ne	2f
 	stxrh	w3, w2, [x4]		/* store new value */
-	cbnz	w3, 1b			/*   succeed? nope, try again. */
-	dmb	st			/* data memory barrier */
+	cbnz	w3, 3f			/*   succeed? nope, try again. */
 2:	ret				/* return. */
+3:	b	1b
 END(_atomic_cas_16)
 
 ATOMIC_OP_ALIAS(atomic_cas_16,_atomic_cas_16)
 STRONG_ALIAS(_atomic_cas_short,_atomic_cas_16)
 STRONG_ALIAS(_atomic_cas_ushort,_atomic_cas_16)
 STRONG_ALIAS(__sync_val_compare_and_swap_2,_atomic_cas_16)
+
+ENTRY_NP(__sync_val_compare_and_swap_2)
+	mov	x4, x0			/* we need x0 for return value */
+	dmb	ish
+1:	ldxrh	w0, [x4]		/* load old value */
+	cmp	w0, w1			/*   compare? */
+	b.ne	2f
+	stxrh	w3, w2, [x4]		/* store new value */
+	cbnz	w3, 3f			/*   succeed? nope, try again. */
+	dmb	ish
+2:	ret				/* return. */
+3:	b	1b
+END(__sync_val_compare_and_swap_2)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_32.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_cas_32.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -37,16 +37,28 @@ ENTRY_NP(_atomic_cas_32)
 	cmp	w0, w1			/*   compare? */
 	b.ne	2f			/*     return if different */
 	stxr	w3, w2, [x4]		/* store new value */
-	cbnz	w3, 1b			/*   succeed? nope, try again. */
-	dmb	st
+	cbnz	w3, 3f			/*   succeed? nope, try again. */
 2:	ret				/* return. */
+3:	b	1b
 END(_atomic_cas_32)
 
 ATOMIC_OP_ALIAS(atomic_cas_32,_atomic_cas_32)
 ATOMIC_OP_ALIAS(atomic_cas_uint,_atomic_cas_32)
 ATOMIC_OP_ALIAS(atomic_cas_32_ni,_atomic_cas_32)
 ATOMIC_OP_ALIAS(atomic_cas_uint_ni,_atomic_cas_32)
-STRONG_ALIAS(__sync_val_compare_and_swap_4,_atomic_cas_32)
 STRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32)
 STRONG_ALIAS(_atomic_cas_32_ni,_atomic_cas_32)
 STRONG_ALIAS(_atomic_cas_uint_ni,_atomic_cas_32)
+
+ENTRY_NP(__sync_val_compare_and_swap_4)
+	mov	x4, x0			/* we need x0 for return value */
+	dmb	ish
+1:	ldxr	w0, [x4]		/* load old value */
+	cmp	w0, w1			/*   compare? */
+	b.ne	2f			/*     return if different */
+	stxr	w3, w2, [x4]		/* store new value */
+	cbnz	w3, 3f			/*   succeed? nope, try again. */
+	dmb	ish
+2:	ret				/* return. */
+3:	b	1b
+END(__sync_val_compare_and_swap_4)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_8.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_cas_8.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -37,12 +37,24 @@ ENTRY_NP(_atomic_cas_8)
 	cmp	w0, w1			/*   compare? */
 	b.ne	2f
 	stxrb	w3, w2, [x4]		/* store new value */
-	cbnz	w3, 1b			/*   succeed? nope, try again. */
-	dmb	st			/* data memory barrier */
+	cbnz	w3, 3f			/*   succeed? nope, try again. */
 2:	ret				/* return. */
+3:	b	1b
 END(_atomic_cas_8)
 
 ATOMIC_OP_ALIAS(atomic_cas_8,_atomic_cas_8)
 STRONG_ALIAS(_atomic_cas_char,_atomic_cas_8)
 STRONG_ALIAS(_atomic_cas_uchar,_atomic_cas_8)
-STRONG_ALIAS(__sync_val_compare_and_swap_1,_atomic_cas_8)
+
+ENTRY_NP(__sync_val_compare_and_swap_1)
+	mov	x4, x0			/* we need x0 for return value */
+	dmb	ish
+1:	ldxrb	w0, [x4]		/* load old value */
+	cmp	w0, w1			/*   compare? */
+	b.ne	2f
+	stxrb	w3, w2, [x4]		/* store new value */
+	cbnz	w3, 3f			/*   succeed? nope, try again. */
+	dmb	ish
+2:	ret				/* return. */
+3:	b	1b
+END(__sync_val_compare_and_swap_1)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_dec_32.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_dec_32.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_dec_32.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_dec_32.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_dec_32.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_dec_32.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_dec_32.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,9 +35,9 @@ ENTRY_NP(_atomic_dec_32)
 1:	ldxr	w3, [x0]		/* load old value (return value) */
 	sub	w3, w3, #1		/* calculate new value */
 	stxr	w2, w3, [x0]		/* try to store */
-	cbnz	w2, 1b			/*   succeed? no, try again? */
-	dmb	st
+	cbnz	w2, 2f			/*   succeed? no, try again? */
 	ret				/* return new value */
+2:	b	1b
 END(_atomic_dec_32)
 
 ATOMIC_OP_ALIAS(atomic_dec_32,_atomic_dec_32)
@@ -49,9 +49,9 @@ ENTRY_NP(_atomic_dec_32_nv)
 1:	ldxr	w0, [x4]		/* load old value */
 	sub	w0, w0, #1		/* calculate new value (return value) */
 	stxr	w3, w0, [x4]		/* try to store */
-	cbnz	w3, 1b			/*   succeed? no, try again? */
-	dmb	st
+	cbnz	w3, 2f			/*   succeed? no, try again? */
 	ret				/* return new value */
+2:	b	1b
 END(_atomic_dec_32_nv)
 
 ATOMIC_OP_ALIAS(atomic_dec_32_nv,_atomic_dec_32_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_dec_64.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_dec_64.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_dec_64.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_dec_64.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_dec_64.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_dec_64.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_dec_64.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,9 +35,9 @@ ENTRY_NP(_atomic_dec_64)
 1:	ldxr	x2, [x0]		/* load old value (return value) */
 	sub	x2, x2, #1		/* calculate new value */
 	stxr	w3, x2, [x0]		/* try to store */
-	cbnz	w3, 1b			/*   succeed? no, try again? */
-	dmb	st
+	cbnz	w3, 2f			/*   succeed? no, try again? */
 	ret				/* return new value */
+2:	b	1b
 END(_atomic_dec_64)
 
 ATOMIC_OP_ALIAS(atomic_dec_64,_atomic_dec_64)
@@ -51,9 +51,9 @@ ENTRY_NP(_atomic_dec_64_nv)
 1:	ldxr	x0, [x4]		/* load old value */
 	sub	x0, x0, #1		/* calculate new value (return value) */
 	stxr	w3, x0, [x4]		/* try to store */
-	cbnz	w3, 1b			/*   succeed? no, try again? */
-	dmb	st
+	cbnz	w3, 2f			/*   succeed? no, try again? */
 	ret				/* return new value */
+2:	b	1b
 END(_atomic_dec_64_nv)
 
 ATOMIC_OP_ALIAS(atomic_dec_64_nv,_atomic_dec_64_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_inc_32.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_inc_32.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_inc_32.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_inc_32.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_inc_32.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_inc_32.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_inc_32.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,9 +35,9 @@ ENTRY_NP(_atomic_inc_32)
 1:	ldxr	w3, [x0]		/* load old value (return value) */
 	add	w3, w3, #1		/* calculate new value */
 	stxr	w2, w3, [x0]		/* try to store */
-	cbnz	w2, 1b			/*   succeed? no, try again? */
-	dmb	st
+	cbnz	w2, 2f			/*   succeed? no, try again? */
 	ret				/* return new value */
+2:	b	1b
 END(_atomic_inc_32)
 
 ATOMIC_OP_ALIAS(atomic_inc_32,_atomic_inc_32)
@@ -49,9 +49,9 @@ ENTRY_NP(_atomic_inc_32_nv)
 1:	ldxr	w0, [x4]		/* load old value */
 	add	w0, w0, #1		/* calculate new value (return value) */
 	stxr	w3, w0, [x4]		/* try to store */
-	cbnz	w3, 1b			/*   succeed? no, try again? */
-	dmb	st
+	cbnz	w3, 2f			/*   succeed? no, try again? */
 	ret				/* return new value */
+2:	b	1b
 END(_atomic_inc_32_nv)
 
 ATOMIC_OP_ALIAS(atomic_inc_32_nv,_atomic_inc_32_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_inc_64.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_inc_64.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_inc_64.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_inc_64.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_inc_64.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_inc_64.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_inc_64.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,9 +35,9 @@ ENTRY_NP(_atomic_inc_64)
 1:	ldxr	x2, [x0]		/* load old value (return value) */
 	add	x2, x2, #1		/* calculate new value */
 	stxr	w3, x2, [x0]		/* try to store */
-	cbnz	w3, 1b			/*   succeed? no, try again? */
-	dmb	st
+	cbnz	w3, 2f			/*   succeed? no, try again? */
 	ret				/* return new value */
+2:	b	1b
 END(_atomic_inc_64)
 
 ATOMIC_OP_ALIAS(atomic_inc_64,_atomic_inc_64)
@@ -51,9 +51,9 @@ ENTRY_NP(_atomic_inc_64_nv)
 1:	ldxr	x0, [x4]		/* load old value */
 	add	x0, x0, #1		/* calculate new value (return value) */
 	stxr	w3, x0, [x4]		/* try to store */
-	cbnz	w3, 1b			/*   succeed? no, try again? */
-	dmb	st
+	cbnz	w3, 2f			/*   succeed? no, try again? */
 	ret				/* return new value */
+2:	b	1b
 END(_atomic_inc_64_nv)
 
 ATOMIC_OP_ALIAS(atomic_inc_64_nv,_atomic_inc_64_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_or_16.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_or_16.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_or_16.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_or_16.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_or_16.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_or_16.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_or_16.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP16(or, orr)
 
+SYNC_FETCH_OP16(or, orr)
+
 ATOMIC_OP_ALIAS(atomic_or_16,_atomic_or_16)
 ATOMIC_OP_ALIAS(atomic_or_ushort,_atomic_or_16)
-STRONG_ALIAS(__sync_fetch_and_or_2,_atomic_or_16)
 STRONG_ALIAS(_atomic_or_ushort,_atomic_or_16)
 
 ATOMIC_OP16_NV(or, orr)
 
+SYNC_OP16_FETCH(or, orr)
+
 ATOMIC_OP_ALIAS(atomic_or_16_nv,_atomic_or_16_nv)
 ATOMIC_OP_ALIAS(atomic_or_ushort_nv,_atomic_or_16_nv)
-STRONG_ALIAS(__sync_or_and_fetch_2,_atomic_or_16_nv)
 STRONG_ALIAS(_atomic_or_ushort_nv,_atomic_or_16_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_or_32.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_or_32.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_or_32.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_or_32.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_or_32.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_or_32.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_or_32.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP32(or, orr)
 
+SYNC_FETCH_OP32(or, orr)
+
 ATOMIC_OP_ALIAS(atomic_or_32,_atomic_or_32)
 ATOMIC_OP_ALIAS(atomic_or_uint,_atomic_or_32)
-STRONG_ALIAS(__sync_fetch_and_or_4,_atomic_or_32)
 STRONG_ALIAS(_atomic_or_uint,_atomic_or_32)
 
 ATOMIC_OP32_NV(or, orr)
 
+SYNC_OP32_FETCH(or, orr)
+
 ATOMIC_OP_ALIAS(atomic_or_32_nv,_atomic_or_32_nv)
 ATOMIC_OP_ALIAS(atomic_or_uint_nv,_atomic_or_32_nv)
-STRONG_ALIAS(__sync_or_and_fetch_4,_atomic_or_32_nv)
 STRONG_ALIAS(_atomic_or_uint_nv,_atomic_or_32_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_or_8.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_or_8.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_or_8.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_or_8.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_or_8.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_or_8.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_or_8.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP8(or, orr)
 
+SYNC_FETCH_OP8(or, orr)
+
 ATOMIC_OP_ALIAS(atomic_or_8,_atomic_or_8)
 ATOMIC_OP_ALIAS(atomic_or_uchar,_atomic_or_8)
-STRONG_ALIAS(__sync_fetch_and_or_1,_atomic_or_8)
 STRONG_ALIAS(_atomic_or_uchar,_atomic_or_8)
 
 ATOMIC_OP8_NV(or, orr)
 
+SYNC_OP8_FETCH(or, orr)
+
 ATOMIC_OP_ALIAS(atomic_or_8_nv,_atomic_or_8_nv)
 ATOMIC_OP_ALIAS(atomic_or_uchar_nv,_atomic_or_8_nv)
-STRONG_ALIAS(__sync_or_and_fetch_1,_atomic_or_8_nv)
 STRONG_ALIAS(_atomic_or_uchar_nv,_atomic_or_8_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_sub_16.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_sub_16.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_sub_16.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_sub_16.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_sub_16.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_sub_16.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_sub_16.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,18 +33,20 @@
 
 ATOMIC_OP16(sub, sub)
 
+SYNC_FETCH_OP16(sub, sub)
+
 ATOMIC_OP_ALIAS(atomic_sub_16,_atomic_sub_16)
 ATOMIC_OP_ALIAS(atomic_sub_short,_atomic_sub_16)
 ATOMIC_OP_ALIAS(atomic_sub_ushort,_atomic_sub_16)
-STRONG_ALIAS(__sync_fetch_and_sub_2,_atomic_sub_16)
 STRONG_ALIAS(_atomic_sub_short,_atomic_sub_16)
 STRONG_ALIAS(_atomic_sub_ushort,_atomic_sub_16)
 
 ATOMIC_OP16_NV(sub, sub)
 
+SYNC_OP16_FETCH(sub, sub)
+
 ATOMIC_OP_ALIAS(atomic_sub_16_nv,_atomic_sub_16_nv)
 ATOMIC_OP_ALIAS(atomic_sub_short_nv,_atomic_sub_16_nv)
 ATOMIC_OP_ALIAS(atomic_sub_ushort_nv,_atomic_sub_16_nv)
-STRONG_ALIAS(__sync_sub_and_fetch_2,_atomic_sub_16_nv)
 STRONG_ALIAS(_atomic_sub_short_nv,_atomic_sub_16_nv)
 STRONG_ALIAS(_atomic_sub_ushort_nv,_atomic_sub_16_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_sub_32.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_sub_32.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_sub_32.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_sub_32.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_sub_32.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_sub_32.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_sub_32.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP32(sub, sub)
 
+SYNC_FETCH_OP32(sub, sub)
+
 ATOMIC_OP_ALIAS(atomic_sub_32,_atomic_sub_32)
 ATOMIC_OP_ALIAS(atomic_sub_int,_atomic_sub_32)
-STRONG_ALIAS(__sync_fetch_and_sub_4,_atomic_sub_32)
 STRONG_ALIAS(_atomic_sub_int,_atomic_sub_32)
 
 ATOMIC_OP32_NV(sub, sub)
 
+SYNC_OP32_FETCH(sub, sub)
+
 ATOMIC_OP_ALIAS(atomic_sub_32_nv,_atomic_sub_32_nv)
 ATOMIC_OP_ALIAS(atomic_sub_int_nv,_atomic_sub_32_nv)
-STRONG_ALIAS(__sync_sub_and_fetch_4,_atomic_sub_32_nv)
 STRONG_ALIAS(_atomic_sub_int_nv,_atomic_sub_32_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_sub_64.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_sub_64.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_sub_64.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_sub_64.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_sub_64.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_sub_64.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_sub_64.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,18 +33,20 @@
 
 ATOMIC_OP64(sub, sub)
 
+SYNC_FETCH_OP64(sub, sub)
+
 ATOMIC_OP_ALIAS(atomic_sub_64_nv,_atomic_sub_64_nv)
 ATOMIC_OP_ALIAS(atomic_sub_ptr_nv,_atomic_sub_64_nv)
 ATOMIC_OP_ALIAS(atomic_sub_long_nv,_atomic_sub_64_nv)
 STRONG_ALIAS(_atomic_sub_ptr_nv,_atomic_sub_64_nv)
 STRONG_ALIAS(_atomic_sub_long_nv,_atomic_sub_64_nv)
-STRONG_ALIAS(__sync_sub_and_fetch_8,_atomic_sub_64_nv)
 
 ATOMIC_OP64_NV(sub, sub)
 
+SYNC_OP64_FETCH(sub, sub)
+
 ATOMIC_OP_ALIAS(atomic_sub_64,_atomic_sub_64)
 ATOMIC_OP_ALIAS(atomic_sub_ptr,_atomic_sub_64)
 ATOMIC_OP_ALIAS(atomic_sub_long,_atomic_sub_64)
 STRONG_ALIAS(_atomic_sub_ptr,_atomic_sub_64)
 STRONG_ALIAS(_atomic_sub_long,_atomic_sub_64)
-STRONG_ALIAS(__sync_fetch_and_sub_8,_atomic_sub_64)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_sub_8.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_sub_8.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_sub_8.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_sub_8.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_sub_8.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_sub_8.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_sub_8.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP8(sub, sub)
 
+SYNC_FETCH_OP8(sub, sub)
+
 ATOMIC_OP_ALIAS(atomic_sub_8,_atomic_sub_8)
 ATOMIC_OP_ALIAS(atomic_sub_char,_atomic_sub_8)
-STRONG_ALIAS(__sync_fetch_and_sub_1,_atomic_sub_8)
 STRONG_ALIAS(_atomic_sub_char,_atomic_sub_8)
 
 ATOMIC_OP8_NV(sub, sub)
 
+SYNC_OP8_FETCH(sub, sub)
+
 ATOMIC_OP_ALIAS(atomic_sub_8_nv,_atomic_sub_8_nv)
 ATOMIC_OP_ALIAS(atomic_sub_char_nv,_atomic_sub_8_nv)
-STRONG_ALIAS(__sync_sub_and_fetch_1,_atomic_sub_8_nv)
 STRONG_ALIAS(_atomic_sub_char_nv,_atomic_sub_8_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_swap_16.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_swap_16.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,18 +35,26 @@ ENTRY_NP(_atomic_swap_16)
 	mov	x4, x0
 1:	ldxrh	w0, [x4]
 	stxrh	w3, w1, [x4]
-	cbnz	w3, 1b
-	dmb	st
+	cbnz	w3, 2f
 	ret
+2:	b	1b
 END(_atomic_swap_16)
 
 ATOMIC_OP_ALIAS(atomic_swap_16,_atomic_swap_16)
 ATOMIC_OP_ALIAS(atomic_swap_short,_atomic_swap_16)
 ATOMIC_OP_ALIAS(atomic_swap_ushort,_atomic_swap_16)
-STRONG_ALIAS(__sync_lock_test_and_set_2,_atomic_swap_16)
 STRONG_ALIAS(_atomic_swap_short,_atomic_swap_16)
 STRONG_ALIAS(_atomic_swap_ushort,_atomic_swap_16)
 
+ENTRY_NP(__sync_lock_test_and_set_2)
+	mov	x4, x0
+1:	ldaxrh	w0, [x4]
+	stxrh	w3, w1, [x4]
+	cbnz	w3, 2f
+	ret
+2:	b	1b
+END(__sync_lock_test_and_set_2)
+
 ENTRY_NP(__sync_lock_release_2)
 	stlrh	wzr, [x0]
 	ret
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_swap_32.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_swap_32.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,16 +35,24 @@ ENTRY_NP(_atomic_swap_32)
 	mov	x4, x0
 1:	ldxr	w0, [x4]
 	stxr	w3, w1, [x4]
-	cbnz	w3, 1b
-	dmb	st
+	cbnz	w3, 2f
 	ret
+2:	b	1b
 END(_atomic_swap_32)
 
 ATOMIC_OP_ALIAS(atomic_swap_32,_atomic_swap_32)
 ATOMIC_OP_ALIAS(atomic_swap_uint,_atomic_swap_32)
-STRONG_ALIAS(__sync_lock_test_and_set_4,_atomic_swap_32)
 STRONG_ALIAS(_atomic_swap_uint,_atomic_swap_32)
 
+ENTRY_NP(__sync_lock_test_and_set_4)
+	mov	x4, x0
+1:	ldaxr	w0, [x4]
+	stxr	w3, w1, [x4]
+	cbnz	w3, 2f
+	ret
+2:	b	1b
+END(__sync_lock_test_and_set_4)
+
 ENTRY_NP(__sync_lock_release_4)
 	stlr	wzr, [x0]
 	ret
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_swap_64.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_swap_64.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,18 +35,26 @@ ENTRY_NP(_atomic_swap_64)
 	mov	x4, x0
 1:	ldxr	x0, [x4]
 	stxr	w3, x1, [x4]
-	cbnz	w3, 1b
-	dmb	st
+	cbnz	w3, 2f
 	ret
+2:	b	1b
 END(_atomic_swap_64)
 
 ATOMIC_OP_ALIAS(atomic_swap_64,_atomic_swap_64)
 ATOMIC_OP_ALIAS(atomic_swap_ulong,_atomic_swap_64)
 ATOMIC_OP_ALIAS(atomic_swap_ptr,_atomic_swap_64)
-STRONG_ALIAS(__sync_lock_test_and_set_8,_atomic_swap_64)
 STRONG_ALIAS(_atomic_swap_ulong,_atomic_swap_64)
 STRONG_ALIAS(_atomic_swap_ptr,_atomic_swap_64)
 
+ENTRY_NP(__sync_lock_test_and_set_8)
+	mov	x4, x0
+1:	ldaxr	x0, [x4]
+	stxr	w3, x1, [x4]
+	cbnz	w3, 2f
+	ret
+2:	b	1b
+END(_atomic_swap_64)
+
 ENTRY_NP(__sync_lock_release_8)
 	stlr	xzr, [x0]
 	ret
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_swap_8.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_swap_8.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,18 +35,26 @@ ENTRY_NP(_atomic_swap_8)
 	mov	x4, x0
 1:	ldxrb	w0, [x4]
 	stxrb	w3, w1, [x4]
-	cbnz	w3, 1b
-	dmb	st
+	cbnz	w3, 2f
 	ret
+2:	b	1b
 END(_atomic_swap_8)
 
 ATOMIC_OP_ALIAS(atomic_swap_8,_atomic_swap_8)
 ATOMIC_OP_ALIAS(atomic_swap_char,_atomic_swap_8)
 ATOMIC_OP_ALIAS(atomic_swap_uchar,_atomic_swap_8)
-STRONG_ALIAS(__sync_lock_test_and_set_1,_atomic_swap_8)
 STRONG_ALIAS(_atomic_swap_char,_atomic_swap_8)
 STRONG_ALIAS(_atomic_swap_uchar,_atomic_swap_8)
 
+ENTRY_NP(__sync_lock_test_and_set_1)
+	mov	x4, x0
+1:	ldaxrb	w0, [x4]
+	stxrb	w3, w1, [x4]
+	cbnz	w3, 2f
+	ret
+2:	b	1b
+END(__sync_lock_test_and_set_1)
+
 ENTRY_NP(__sync_lock_release_1)
 	stlrb	wzr, [x0]
 	ret
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_xor_16.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_xor_16.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_xor_16.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_xor_16.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_xor_16.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_xor_16.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_xor_16.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP16(xor, eor)
 
+SYNC_FETCH_OP16(xor, eor)
+
 ATOMIC_OP_ALIAS(atomic_xor_16,_atomic_xor_16)
 ATOMIC_OP_ALIAS(atomic_xor_ushort,_atomic_xor_16)
-STRONG_ALIAS(__sync_fetch_and_xor_2,_atomic_xor_16)
 STRONG_ALIAS(_atomic_xor_ushort,_atomic_xor_16)
 
 ATOMIC_OP16_NV(xor, eor)
 
+SYNC_OP16_FETCH(xor, eor)
+
 ATOMIC_OP_ALIAS(atomic_xor_16_nv,_atomic_xor_16_nv)
 ATOMIC_OP_ALIAS(atomic_xor_ushort_nv,_atomic_xor_16_nv)
-STRONG_ALIAS(__sync_xor_and_fetch_2,_atomic_xor_16_nv)
 STRONG_ALIAS(_atomic_xor_ushort_nv,_atomic_xor_16_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_xor_32.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_xor_32.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_xor_32.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_xor_32.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_xor_32.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_xor_32.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_xor_32.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP32(xor, eor)
 
+SYNC_FETCH_OP32(xor, eor)
+
 ATOMIC_OP_ALIAS(atomic_xor_32,_atomic_xor_32)
 ATOMIC_OP_ALIAS(atomic_xor_uint,_atomic_xor_32)
-STRONG_ALIAS(__sync_fetch_and_xor_4,_atomic_xor_32)
 STRONG_ALIAS(_atomic_xor_uint,_atomic_xor_32)
 
 ATOMIC_OP32_NV(xor, eor)
 
+SYNC_OP32_FETCH(xor, eor)
+
 ATOMIC_OP_ALIAS(atomic_xor_32_nv,_atomic_xor_32_nv)
 ATOMIC_OP_ALIAS(atomic_xor_uint_nv,_atomic_xor_32_nv)
-STRONG_ALIAS(__sync_xor_and_fetch_4,_atomic_xor_32_nv)
 STRONG_ALIAS(_atomic_xor_uint_nv,_atomic_xor_32_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_xor_64.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_xor_64.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_xor_64.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_xor_64.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_xor_64.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_xor_64.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_xor_64.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,12 +33,14 @@
 
 ATOMIC_OP64(xor, eor)
 
+SYNC_FETCH_OP64(xor, eor)
+
 ATOMIC_OP_ALIAS(atomic_xor_64,_atomic_xor_64)
 ATOMIC_OP_ALIAS(atomic_xor_ulong,_atomic_xor_64)
-STRONG_ALIAS(__sync_fetch_and_xor_8,_atomic_xor_64)
 
 ATOMIC_OP64_NV(xor, eor)
 
+SYNC_OP64_FETCH(xor, eor)
+
 ATOMIC_OP_ALIAS(atomic_xor_64_nv,_atomic_xor_64_nv)
 ATOMIC_OP_ALIAS(atomic_xor_ulong_nv,_atomic_xor_64_nv)
-STRONG_ALIAS(__sync_xor_and_fetch_8,_atomic_xor_64_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_xor_8.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_xor_8.S:1.1 src/common/lib/libc/arch/aarch64/atomic/atomic_xor_8.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_xor_8.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_xor_8.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_xor_8.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: atomic_xor_8.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP8(xor, eor)
 
+SYNC_FETCH_OP8(xor, eor)
+
 ATOMIC_OP_ALIAS(atomic_xor_8,_atomic_xor_8)
 ATOMIC_OP_ALIAS(atomic_xor_uchar,_atomic_xor_8)
-STRONG_ALIAS(__sync_fetch_and_xor_1,_atomic_xor_8)
 STRONG_ALIAS(_atomic_xor_uchar,_atomic_xor_8)
 
 ATOMIC_OP8_NV(xor, eor)
 
+SYNC_OP8_FETCH(xor, eor)
+
 ATOMIC_OP_ALIAS(atomic_xor_8_nv,_atomic_xor_8_nv)
 ATOMIC_OP_ALIAS(atomic_xor_uchar_nv,_atomic_xor_8_nv)
-STRONG_ALIAS(__sync_xor_and_fetch_1,_atomic_xor_8_nv)
 STRONG_ALIAS(_atomic_xor_uchar_nv,_atomic_xor_8_nv)
Index: src/common/lib/libc/arch/aarch64/atomic/membar_ops.S
diff -u src/common/lib/libc/arch/aarch64/atomic/membar_ops.S:1.1 src/common/lib/libc/arch/aarch64/atomic/membar_ops.S:1.1.28.1
--- src/common/lib/libc/arch/aarch64/atomic/membar_ops.S:1.1	Sun Aug 10 05:47:35 2014
+++ src/common/lib/libc/arch/aarch64/atomic/membar_ops.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: membar_ops.S,v 1.1 2014/08/10 05:47:35 matt Exp $ */
+/* $NetBSD: membar_ops.S,v 1.1.28.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -32,24 +32,28 @@
 #include "atomic_op_asm.h"
 
 ENTRY_NP(_membar_producer)
-	dsb	sy
+	dmb	ishst
 	ret
 END(_membar_producer)
 ATOMIC_OP_ALIAS(membar_producer,_membar_producer)
 ATOMIC_OP_ALIAS(membar_write,_membar_producer)
 STRONG_ALIAS(_membar_write,_membar_producer)
 
+ENTRY_NP(_membar_consumer)
+	dmb	ishld
+	ret
+END(_membar_producer)
+ATOMIC_OP_ALIAS(membar_consumer,_membar_consumer)
+ATOMIC_OP_ALIAS(membar_read,_membar_consumer)
+STRONG_ALIAS(_membar_read,_membar_consumer)
+
 ENTRY_NP(_membar_sync)
-	dmb	sy
+	dmb	ish
 	ret
 END(_membar_sync)
 ATOMIC_OP_ALIAS(membar_sync,_membar_sync)
 ATOMIC_OP_ALIAS(membar_enter,_membar_sync)
 ATOMIC_OP_ALIAS(membar_exit,_membar_sync)
-ATOMIC_OP_ALIAS(membar_consumer,_membar_sync)
-ATOMIC_OP_ALIAS(membar_read,_membar_sync)
 STRONG_ALIAS(__sync_synchronize,_membar_sync)
 STRONG_ALIAS(_membar_enter,_membar_sync)
 STRONG_ALIAS(_membar_exit,_membar_sync)
-STRONG_ALIAS(_membar_consumer,_membar_sync)
-STRONG_ALIAS(_membar_read,_membar_sync)

Index: src/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S:1.3 src/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S:1.3.2.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S:1.3	Tue Feb 19 12:51:44 2019
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_64.S,v 1.3 2019/02/19 12:51:44 rin Exp $ */
+/* $NetBSD: atomic_cas_64.S,v 1.3.2.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -37,9 +37,9 @@ ENTRY_NP(_atomic_cas_64)
 	cmp	x0, x1			/*   compare? */
 	b.ne	2f			/*     return if different */
 	stxr	w3, x2, [x4]		/* store new value */
-	cbnz	w3, 1b			/*   succeed? nope, try again. */
-	dmb	st
+	cbnz	w3, 3f			/*   succeed? nope, try again. */
 2:	ret				/* return. */
+3:	b	1b
 END(_atomic_cas_64)
 
 ATOMIC_OP_ALIAS(atomic_cas_64,_atomic_cas_64)
@@ -48,9 +48,21 @@ ATOMIC_OP_ALIAS(atomic_cas_ptr,_atomic_c
 ATOMIC_OP_ALIAS(atomic_cas_64_ni,_atomic_cas_64)
 ATOMIC_OP_ALIAS(atomic_cas_ulong_ni,_atomic_cas_64)
 ATOMIC_OP_ALIAS(atomic_cas_ptr_ni,_atomic_cas_64)
-STRONG_ALIAS(__sync_val_compare_and_swap_8,_atomic_cas_64)
 STRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_64)
 STRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_64)
 STRONG_ALIAS(_atomic_cas_64_ni,_atomic_cas_64)
 STRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_64)
 STRONG_ALIAS(_atomic_cas_ptr_ni,_atomic_cas_64)
+
+ENTRY_NP(__sync_val_compare_and_swap_8)
+	mov	x4, x0			/* we need x0 for return value */
+	dmb	ish
+1:	ldxr	x0, [x4]		/* load old value */
+	cmp	x0, x1			/*   compare? */
+	b.ne	2f			/*     return if different */
+	stxr	w3, x2, [x4]		/* store new value */
+	cbnz	w3, 3f			/*   succeed? nope, try again. */
+	dmb	ish
+2:	ret				/* return. */
+3:	b	1b
+END(__sync_val_compare_and_swap_8)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_op_asm.h
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_op_asm.h:1.3 src/common/lib/libc/arch/aarch64/atomic/atomic_op_asm.h:1.3.2.1
--- src/common/lib/libc/arch/aarch64/atomic/atomic_op_asm.h:1.3	Fri Feb  8 06:56:56 2019
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_op_asm.h	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_op_asm.h,v 1.3 2019/02/08 06:56:56 ryo Exp $ */
+/* $NetBSD: atomic_op_asm.h,v 1.3.2.1 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -41,10 +41,21 @@ ENTRY_NP(_atomic_##OP##_8)						;\
 	INSN	w2, w0, w1		/* calculate new value */	;\
 	stxrb	w3, w2, [x4]		/* try to store */		;\
 	cbnz	w3, 1b			/*   succeed? no, try again */	;\
-	dmb	st							;\
 	ret				/* return old value */		;\
 END(_atomic_##OP##_8)
 
+#define	SYNC_FETCH_OP8(OP, INSN)					\
+ENTRY_NP(__sync_fetch_and_##OP##_1)					;\
+	mov	x4, x0							;\
+	dmb	ish							;\
+1:	ldxrb	w0, [x4]		/* load old value */		;\
+	INSN	w2, w0, w1		/* calculate new value */	;\
+	stxrb	w3, w2, [x4]		/* try to store */		;\
+	cbnz	w3, 1b			/*   succeed? no, try again */	;\
+	dmb	ish							;\
+	ret				/* return old value */		;\
+END(__sync_fetch_and_##OP##_1)
+
 #define	ATOMIC_OP8_NV(OP, INSN)						\
 ENTRY_NP(_atomic_##OP##_8_nv)						;\
 	mov	x4, x0			/* need r0 for return value */	;\
@@ -52,10 +63,21 @@ ENTRY_NP(_atomic_##OP##_8_nv)						;\
 	INSN	w0, w0, w1		/* calc new (return) value */	;\
 	stxrb	w3, w0, [x4]		/* try to store */		;\
 	cbnz	w3, 1b			/*   succeed? no, try again */	;\
-	dmb	sy							;\
 	ret				/* return new value */		;\
 END(_atomic_##OP##_8_nv)
 
+#define	SYNC_OP8_FETCH(OP, INSN)					\
+ENTRY_NP(__sync_##OP##_and_fetch_1)					;\
+	mov	x4, x0			/* need x0 for return value */	;\
+	dmb	ish							;\
+1:	ldxrb	w0, [x4]		/* load old value */		;\
+	INSN	w0, w0, w1		/* calc new (return) value */	;\
+	stxrb	w3, w0, [x4]		/* try to store */		;\
+	cbnz	w3, 1b			/*   succeed? no, try again */	;\
+	dmb	ish							;\
+	ret				/* return new value */		;\
+END(__sync_##OP##_and_fetch_1)
+
 #define	ATOMIC_OP16(OP, INSN)						\
 ENTRY_NP(_atomic_##OP##_16)						;\
 	mov	x4, x0							;\
@@ -63,10 +85,21 @@ ENTRY_NP(_atomic_##OP##_16)						;\
 	INSN	w2, w0, w1		/* calculate new value */	;\
 	stxrh	w3, w2, [x4]		/* try to store */		;\
 	cbnz	w3, 1b			/*   succeed? no, try again */	;\
-	dmb	st							;\
 	ret				/* return old value */		;\
 END(_atomic_##OP##_16)
 
+#define	SYNC_FETCH_OP16(OP, INSN)					\
+ENTRY_NP(__sync_fetch_and_##OP##_2)					;\
+	mov	x4, x0							;\
+	dmb	ish							;\
+1:	ldxrh	w0, [x4]		/* load old value */		;\
+	INSN	w2, w0, w1		/* calculate new value */	;\
+	stxrh	w3, w2, [x4]		/* try to store */		;\
+	cbnz	w3, 1b			/*   succeed? no, try again */	;\
+	dmb	ish							;\
+	ret				/* return old value */		;\
+END(__sync_fetch_and_##OP##_2)
+
 #define	ATOMIC_OP16_NV(OP, INSN)					\
 ENTRY_NP(_atomic_##OP##_16_nv)						;\
 	mov	x4, x0			/* need r0 for return value */	;\
@@ -74,10 +107,21 @@ ENTRY_NP(_atomic_##OP##_16_nv)						;\
 	INSN	w0, w0, w1		/* calc new (return) value */	;\
 	stxrh	w3, w0, [x4]		/* try to store */		;\
 	cbnz	w3, 1b			/*   succeed? no, try again */	;\
-	dmb	sy							;\
 	ret				/* return new value */		;\
 END(_atomic_##OP##_16_nv)
 
+#define	SYNC_OP16_FETCH(OP, INSN)					\
+ENTRY_NP(__sync__##OP##_and_fetch_2)					;\
+	mov	x4, x0			/* need x0 for return value */	;\
+	dmb	ish							;\
+1:	ldxrh	w0, [x4]		/* load old value */		;\
+	INSN	w0, w0, w1		/* calc new (return) value */	;\
+	stxrh	w3, w0, [x4]		/* try to store */		;\
+	cbnz	w3, 1b			/*   succeed? no, try again */	;\
+	dmb	ish							;\
+	ret				/* return new value */		;\
+END(__sync__##OP##_and_fetch_2)
+
 #define	ATOMIC_OP32(OP, INSN)						\
 ENTRY_NP(_atomic_##OP##_32)						;\
 	mov	x4, x0							;\
@@ -85,10 +129,21 @@ ENTRY_NP(_atomic_##OP##_32)						;\
 	INSN	w2, w0, w1		/* calculate new value */	;\
 	stxr	w3, w2, [x4]		/* try to store */		;\
 	cbnz	w3, 1b			/*   succeed? no, try again */	;\
-	dmb	st							;\
 	ret				/* return old value */		;\
 END(_atomic_##OP##_32)
 
+#define	SYNC_FETCH_OP32(OP, INSN)					\
+ENTRY_NP(__sync_fetch_and_##OP##_4)					;\
+	mov	x4, x0							;\
+	dmb	ish							;\
+1:	ldxr	w0, [x4]		/* load old value */		;\
+	INSN	w2, w0, w1		/* calculate new value */	;\
+	stxr	w3, w2, [x4]		/* try to store */		;\
+	cbnz	w3, 1b			/*   succeed? no, try again */	;\
+	dmb	ish							;\
+	ret				/* return old value */		;\
+END(__sync_fetch_and_##OP##_4)
+
 #define	ATOMIC_OP32_NV(OP, INSN)					\
 ENTRY_NP(_atomic_##OP##_32_nv)						;\
 	mov	x4, x0			/* need r0 for return value */	;\
@@ -96,10 +151,21 @@ ENTRY_NP(_atomic_##OP##_32_nv)						;\
 	INSN	w0, w0, w1		/* calc new (return) value */	;\
 	stxr	w3, w0, [x4]		/* try to store */		;\
 	cbnz	w3, 1b			/*   succeed? no, try again? */	;\
-	dmb	sy							;\
 	ret				/* return new value */		;\
 END(_atomic_##OP##_32_nv)
 
+#define	SYNC_OP32_FETCH(OP, INSN)					\
+ENTRY_NP(__sync__##OP##_and_fetch_4)					;\
+	mov	x4, x0			/* need x0 for return value */	;\
+	dmb	ish							;\
+1:	ldxr	w0, [x4]		/* load old value */		;\
+	INSN	w0, w0, w1		/* calc new (return) value */	;\
+	stxr	w3, w0, [x4]		/* try to store */		;\
+	cbnz	w3, 1b			/*   succeed? no, try again? */	;\
+	dmb	ish							;\
+	ret				/* return new value */		;\
+END(__sync__##OP##_and_fetch_4)
+
 #define	ATOMIC_OP64(OP, INSN)						\
 ENTRY_NP(_atomic_##OP##_64)						;\
 	mov	x4, x0							;\
@@ -107,10 +173,21 @@ ENTRY_NP(_atomic_##OP##_64)						;\
 	INSN	x2, x0, x1		/* calculate new value */	;\
 	stxr	w3, x2, [x4]		/* try to store */		;\
 	cbnz	w3, 1b			/*   succeed? no, try again */	;\
-	dmb	st							;\
 	ret				/* return old value */		;\
 END(_atomic_##OP##_64)
 
+#define	SYNC_FETCH_OP64(OP, INSN)					\
+ENTRY_NP(__sync_fetch_and_##OP##_8)					;\
+	mov	x4, x0							;\
+	dmb	ish							;\
+1:	ldxr	x0, [x4]		/* load old value */		;\
+	INSN	x2, x0, x1		/* calculate new value */	;\
+	stxr	w3, x2, [x4]		/* try to store */		;\
+	cbnz	w3, 1b			/*   succeed? no, try again */	;\
+	dmb	ish							;\
+	ret				/* return old value */		;\
+END(__sync_fetch_and_##OP##_8)
+
 #define	ATOMIC_OP64_NV(OP, INSN)					\
 ENTRY_NP(_atomic_##OP##_64_nv)						;\
 	mov	x4, x0			/* need r0 for return value */	;\
@@ -118,10 +195,21 @@ ENTRY_NP(_atomic_##OP##_64_nv)						;\
 	INSN	x0, x0, x1		/* calc new (return) value */	;\
 	stxr	w3, x0, [x4]		/* try to store */		;\
 	cbnz	w3, 1b			/*   succeed? no, try again? */	;\
-	dmb	sy							;\
 	ret				/* return new value */		;\
 END(_atomic_##OP##_64_nv)
 
+#define	SYNC_OP64_FETCH(OP, INSN)					\
+ENTRY_NP(__sync_##OP##_and_fetch_8)					;\
+	mov	x4, x0			/* need x0 for return value */	;\
+	dmb	ish							;\
+1:	ldxr	x0, [x4]		/* load old value */		;\
+	INSN	x0, x0, x1		/* calc new (return) value */	;\
+	stxr	w3, x0, [x4]		/* try to store */		;\
+	cbnz	w3, 1b			/*   succeed? no, try again? */	;\
+	dmb	ish							;\
+	ret				/* return new value */		;\
+END(__sync_##OP##_and_fetch_8)
+
 #if defined(_KERNEL)
 
 #define	ATOMIC_OP_ALIAS(a,s)	STRONG_ALIAS(a,s)

Index: src/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S:1.1.28.2 src/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S:1.1.28.3
--- src/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S:1.1.28.2	Thu Jul  8 11:22:01 2021
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_nand_16.S,v 1.1.28.2 2021/07/08 11:22:01 martin Exp $ */
+/* $NetBSD: atomic_nand_16.S,v 1.1.28.3 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,19 +35,31 @@
  * { tmp = *ptr; *ptr = ~(tmp & value); return tmp; }   // nand
  */
 ENTRY_NP(_atomic_nand_16)
-	mov	x4, x0
+	mov	x4, x0			/* need r0 for return value */
 1:	ldxrh	w0, [x4]		/* load old value (*ptr) */
 	and	w3, w0, w1		/* w3 =  (*ptr & value) */
 	mvn	w3, w3			/* w3 = ~(*ptr & value) */
 	stxrh	w2, w3, [x4]		/* try to store */
-	cbnz	w2, 1b			/*   succeed? no, try again */
-	dmb	st
+	cbnz	w2, 2f			/*   succeed? no, try again */
 	ret				/* return old value */
+2:	b	1b
 END(_atomic_nand_16)
 
+ENTRY_NP(__sync_fetch_and_nand_2)
+	mov	x4, x0			/* need r0 for return value */
+	dmb	ish
+1:	ldxrh	w0, [x4]		/* load old value (*ptr) */
+	and	w3, w0, w1		/* w3 =  (*ptr & value) */
+	mvn	w3, w3			/* w3 = ~(*ptr & value) */
+	stxrh	w2, w3, [x4]		/* try to store */
+	cbnz	w2, 2f			/*   succeed? no, try again */
+	dmb	ish
+	ret				/* return old value */
+2:	b	1b
+END(__sync_fetch_and_nand_2)
+
 ATOMIC_OP_ALIAS(atomic_nand_16,_atomic_nand_16)
 ATOMIC_OP_ALIAS(atomic_nand_ushort,_atomic_nand_16)
-STRONG_ALIAS(__sync_fetch_and_nand_2,_atomic_nand_16)
 STRONG_ALIAS(_atomic_nand_ushort,_atomic_nand_16)
 
 
@@ -60,12 +72,24 @@ ENTRY_NP(_atomic_nand_16_nv)
 	and	w0, w0, w1		/* w0 =  (*ptr & value) */
 	mvn	w0, w0			/* w0 = ~(*ptr & value), return value */
 	stxrh	w2, w0, [x4]		/* try to store */
-	cbnz	w2, 1b			/*   succeed? no, try again? */
-	dmb	st
+	cbnz	w2, 2f			/*   succeed? no, try again? */
 	ret				/* return new value */
+2:	b	1b
 END(_atomic_nand_16_nv)
 
+ENTRY_NP(__sync_nand_and_fetch_2)
+	mov	x4, x0			/* need r0 for return value */
+	dmb	ish
+1:	ldxrh	w0, [x4]		/* load old value (*ptr) */
+	and	w0, w0, w1		/* w0 =  (*ptr & value) */
+	mvn	w0, w0			/* w0 = ~(*ptr & value), return */
+	stxrh	w2, w0, [x4]		/* try to store */
+	cbnz	w2, 2f			/*   succeed? no, try again? */
+	dmb 	ish
+	ret				/* return new value */
+2:	b	1b
+END(__sync_nand_and_fetch_2)
+
 ATOMIC_OP_ALIAS(atomic_nand_16_nv,_atomic_nand_16_nv)
 ATOMIC_OP_ALIAS(atomic_nand_ushort_nv,_atomic_nand_16_nv)
-STRONG_ALIAS(__sync_nand_and_fetch_2,_atomic_nand_16_nv)
 STRONG_ALIAS(_atomic_nand_ushort_nv,_atomic_nand_16_nv)

Index: src/common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S:1.1.28.1 src/common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S:1.1.28.2
--- src/common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S:1.1.28.1	Tue Jul  6 04:13:50 2021
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_nand_32.S,v 1.1.28.1 2021/07/06 04:13:50 martin Exp $ */
+/* $NetBSD: atomic_nand_32.S,v 1.1.28.2 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,21 +35,33 @@
  * { tmp = *ptr; *ptr = ~(tmp & value); return tmp; }   // nand
  */
 ENTRY_NP(_atomic_nand_32)
-	mov	x4, x0
-1:	ldxr	w0, [x4]		/* load old value (to be returned) */
+	mov	x4, x0			/* need r0 for return value */
+1:	ldxr	w0, [x4]		/* load old value (*ptr) */
 	and	w3, w0, w1		/* w3 =  (*ptr & value) */
-	mvn	w3, w3			/* x3 = ~(*ptr & value) */
+	mvn	w3, w3			/* w3 = ~(*ptr & value) */
 	stxr	w2, w3, [x4]		/* try to store */
-	cbnz	w2, 1b			/*   succeed? no, try again */
-	dmb	st
+	cbnz	w2, 2f			/*   succeed? no, try again */
 	ret				/* return old value */
+2:	b	1b
 END(_atomic_nand_32)
 
 ATOMIC_OP_ALIAS(atomic_nand_32,_atomic_nand_32)
 ATOMIC_OP_ALIAS(atomic_nand_uint,_atomic_nand_32)
-STRONG_ALIAS(__sync_fetch_and_nand_4,_atomic_nand_32)
 STRONG_ALIAS(_atomic_nand_uint,_atomic_nand_32)
 
+ENTRY_NP(__sync_fetch_and_nand_4)
+	mov	x4, x0			/* need r0 for return value */
+	dmb	ish
+1:	ldxr	w0, [x4]		/* load old value (*ptr) */
+	and	w3, w0, w1		/* w3 =  (*ptr & value) */
+	mvn	w3, w3			/* w3 = ~(*ptr & value) */
+	stxr	w2, w3, [x4]		/* try to store */
+	cbnz	w2, 2f			/*   succeed? no, try again */
+	dmb	ish
+	ret				/* return old value */
+2:	b	1b
+END(__sync_fetch_and_nand_4)
+
 
 /*
  * { tmp = ~(*ptr & value); *ptr = tmp; return *ptr; }   // nand
@@ -57,15 +69,27 @@ STRONG_ALIAS(_atomic_nand_uint,_atomic_n
 ENTRY_NP(_atomic_nand_32_nv)
 	mov	x4, x0			/* need r0 for return value */
 1:	ldxr	w0, [x4]		/* load old value (*ptr) */
-	and	w0, w0, w1		/* x0 =  (*ptr & value) */
-	mvn	w0, w0			/* x0 = ~(*ptr & value), return value */
+	and	w0, w0, w1		/* w0 =  (*ptr & value) */
+	mvn	w0, w0			/* w0 = ~(*ptr & value), return value */
 	stxr	w2, w0, [x4]		/* try to store */
-	cbnz	w2, 1b			/*   succeed? no, try again? */
-	dmb	st
+	cbnz	w2, 2f			/*   succeed? no, try again? */
 	ret				/* return new value */
+2:	b	1b
 END(_atomic_nand_32_nv)
 
 ATOMIC_OP_ALIAS(atomic_nand_32_nv,_atomic_nand_32_nv)
 ATOMIC_OP_ALIAS(atomic_nand_uint_nv,_atomic_nand_32_nv)
-STRONG_ALIAS(__sync_nand_and_fetch_4,_atomic_nand_32_nv)
 STRONG_ALIAS(_atomic_nand_uint_nv,_atomic_nand_32_nv)
+
+ENTRY_NP(__sync_nand_and_fetch_4)
+	mov	x4, x0			/* need r0 for return value */
+	dmb	ish
+1:	ldxr	w0, [x4]		/* load old value (tmp) */
+	and	w0, w0, w1		/* w0 =  (tmp & value) */
+	mvn	w0, w0			/* w0 = ~(tmp & value), return */
+	stxr	w2, w0, [x4]		/* try to store */
+	cbnz	w2, 2f			/*   succeed? no, try again? */
+	dmb	ish
+	ret				/* return new value */
+2:	b	1b
+END(__sync_nand_and_fetch_4)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S:1.1.28.1 src/common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S:1.1.28.2
--- src/common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S:1.1.28.1	Tue Jul  6 04:13:50 2021
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_nand_64.S,v 1.1.28.1 2021/07/06 04:13:50 martin Exp $ */
+/* $NetBSD: atomic_nand_64.S,v 1.1.28.2 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,21 +35,33 @@
  * { tmp = *ptr; *ptr = ~(tmp & value); return tmp; }   // nand
  */
 ENTRY_NP(_atomic_nand_64)
-	mov	x4, x0
+	mov	x4, x0			/* need r0 for return value */
 1:	ldxr	x0, [x4]		/* load old value (*ptr) */
 	and	x2, x0, x1		/* x2 =  (*ptr & value) */
 	mvn	x2, x2			/* x2 = ~(*ptr & value) */
 	stxr	w3, x2, [x4]		/* try to store */
-	cbnz	w3, 1b			/*   succeed? no, try again */
-	dmb	st
+	cbnz	w3, 2f			/*   succeed? no, try again */
 	ret				/* return old value */
+2:	b	1b
 END(_atomic_nand_64)
 
 ATOMIC_OP_ALIAS(atomic_nand_64,_atomic_nand_64)
 ATOMIC_OP_ALIAS(atomic_nand_ulong,_atomic_nand_64)
-STRONG_ALIAS(__sync_fetch_and_nand_8,_atomic_nand_64)
 STRONG_ALIAS(_atomic_nand_ulong,_atomic_nand_64)
 
+ENTRY_NP(__sync_fetch_and_nand_8)
+	mov	x4, x0			/* need r0 for return value */
+	dmb	ish
+1:	ldxr	x0, [x4]		/* load old value (*ptr) */
+	and	x2, x0, x1		/* x2 =  (*ptr & value) */
+	mvn	x2, x2			/* x2 = ~(*ptr & value) */
+	stxr	w3, x2, [x4]		/* try to store */
+	cbnz	w3, 2f			/*   succeed? no, try again */
+	dmb	ish
+	ret				/* return old value */
+2:	b	1b
+END(__sync_fetch_and_nand_8)
+
 
 /*
  * { tmp = ~(*ptr & value); *ptr = tmp; return *ptr; }   // nand
@@ -60,12 +72,24 @@ ENTRY_NP(_atomic_nand_64_nv)
 	and	x0, x0, x1		/* x0 =  (*ptr & value) */
 	mvn	x0, x0			/* x0 = ~(*ptr & value), return value */
 	stxr	w3, x0, [x4]		/* try to store */
-	cbnz	w3, 1b			/*   succeed? no, try again? */
-	dmb	st
+	cbnz	w3, 2f			/*   succeed? no, try again? */
 	ret				/* return new value */
+2:	b	1b
 END(_atomic_nand_64_nv)
 
 ATOMIC_OP_ALIAS(atomic_nand_64_nv,_atomic_nand_64_nv)
 ATOMIC_OP_ALIAS(atomic_nand_ulong_nv,_atomic_nand_64_nv)
-STRONG_ALIAS(__sync_nand_and_fetch_8,_atomic_nand_64_nv)
 STRONG_ALIAS(_atomic_nand_ulong_nv,_atomic_nand_64_nv)
+
+ENTRY_NP(__sync_nand_and_fetch_8)
+	mov	x4, x0			/* need r0 for return value */
+	dmb	ish
+1:	ldxr	x0, [x4]		/* load old value (*ptr) */
+	and	x0, x0, x1		/* x0 =  (*ptr & value) */
+	mvn	x0, x0			/* x0 = ~(*ptr & value) */
+	stxr	w3, x0, [x4]		/* try to store */
+	cbnz	w3, 2f			/*   succeed? no, try again? */
+	dmb	ish
+	ret				/* return new value */
+2:	b	1b
+END(__sync_nand_and_fetch_8)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S:1.1.28.1 src/common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S:1.1.28.2
--- src/common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S:1.1.28.1	Tue Jul  6 04:13:50 2021
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_nand_8.S,v 1.1.28.1 2021/07/06 04:13:50 martin Exp $ */
+/* $NetBSD: atomic_nand_8.S,v 1.1.28.2 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,21 +35,34 @@
  * { tmp = *ptr; *ptr = ~(tmp & value); return tmp; }   // nand
  */
 ENTRY_NP(_atomic_nand_8)
-	mov	x4, x0
+	mov	x4, x0			/* need r0 for return value */
 1:	ldxrb	w0, [x4]		/* load old value (*ptr) */
 	and	w3, w0, w1		/* w3 =  (*ptr & value) */
 	mvn	w3, w3			/* w3 = ~(*ptr & value) */
 	stxrb	w2, w3, [x4]		/* try to store */
-	cbnz	w2, 1b			/*   succeed? no, try again */
-	dmb	st
+	cbnz	w2, 2f			/*   succeed? no, try again */
 	ret				/* return old value */
+2:	b	1b
 END(_atomic_nand_8)
 
 ATOMIC_OP_ALIAS(atomic_nand_8,_atomic_nand_8)
 ATOMIC_OP_ALIAS(atomic_nand_uchar,_atomic_nand_8)
-STRONG_ALIAS(__sync_fetch_and_nand_1,_atomic_nand_8)
 STRONG_ALIAS(_atomic_nand_uchar,_atomic_nand_8)
 
+ENTRY_NP(__sync_fetch_and_nand_1)
+	mov	x4, x0			/* need r0 for return value */
+	dmb	ish
+1:	ldxrb	w0, [x4]		/* load old value (*ptr) */
+	and	w3, w0, w1		/* w3 =  (*ptr & value) */
+	mvn	w3, w3			/* w3 = ~(*ptr & value) */
+	stxrb	w2, w3, [x4]		/* try to store */
+	cbnz	w2, 2f			/*   succeed? no, try again */
+	dmb	ish
+	ret				/* return old value */
+2:	b	1b
+END(__sync_fetch_and_nand_1)
+
+
 /*
  * { tmp = ~(*ptr & value); *ptr = tmp; return *ptr; }   // nand
  */
@@ -59,12 +72,24 @@ ENTRY_NP(_atomic_nand_8_nv)
 	and	w0, w0, w1		/* w0 =  (*ptr & value) */
 	mvn	w0, w0			/* w0 = ~(*ptr & value), return value */
 	stxrb	w2, w0, [x4]		/* try to store */
-	cbnz	w2, 1b			/*   succeed? no, try again? */
-	dmb	st
+	cbnz	w2, 2f			/*   succeed? no, try again? */
 	ret				/* return new value */
+2:	b	1b
 END(_atomic_nand_8_nv)
 
 ATOMIC_OP_ALIAS(atomic_nand_8_nv,_atomic_nand_8_nv)
 ATOMIC_OP_ALIAS(atomic_nand_uchar_nv,_atomic_nand_8_nv)
-STRONG_ALIAS(__sync_nand_and_fetch_1,_atomic_nand_8_nv)
 STRONG_ALIAS(_atomic_nand_uchar_nv,_atomic_nand_8_nv)
+
+ENTRY_NP(__sync_nand_and_fetch_1)
+	mov	x4, x0			/* need r0 for return value */
+	dmb	ish
+1:	ldxrb	w0, [x4]		/* load old value (*ptr) */
+	and	w0, w0, w1		/* w0 =  (*ptr & value) */
+	mvn	w0, w0			/* w0 = ~(*ptr & value) */
+	stxrb	w2, w0, [x4]		/* try to store */
+	cbnz	w2, 2f			/*   succeed? no, try again? */
+	dmb	ish
+	ret				/* return new value */
+2:	b	1b
+END(__sync_nand_and_fetch_1)
Index: src/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S:1.1.28.1 src/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S:1.1.28.2
--- src/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S:1.1.28.1	Tue Sep 17 19:23:23 2019
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S	Wed Aug 11 17:19:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_or_64.S,v 1.1.28.1 2019/09/17 19:23:23 martin Exp $ */
+/* $NetBSD: atomic_or_64.S,v 1.1.28.2 2021/08/11 17:19:01 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,14 +33,16 @@
 
 ATOMIC_OP64(or, orr)
 
+SYNC_FETCH_OP64(or, orr)
+
 ATOMIC_OP_ALIAS(atomic_or_64,_atomic_or_64)
 ATOMIC_OP_ALIAS(atomic_or_ulong,_atomic_or_64)
 STRONG_ALIAS(_atomic_or_ulong,_atomic_or_64)
-STRONG_ALIAS(__sync_fetch_and_or_8,_atomic_or_64)
 
 ATOMIC_OP64_NV(or, orr)
 
+SYNC_OP64_FETCH(or, orr)
+
 STRONG_ALIAS(_atomic_or_ulong_nv,_atomic_or_64_nv)
 ATOMIC_OP_ALIAS(atomic_or_64_nv,_atomic_or_64_nv)
 ATOMIC_OP_ALIAS(atomic_or_ulong_nv,_atomic_or_64_nv)
-STRONG_ALIAS(__sync_or_and_fetch_8,_atomic_or_64_nv)

Reply via email to