Module Name:    src
Committed By:   skrll
Date:           Thu Jul 29 10:29:05 UTC 2021

Modified Files:
        src/common/lib/libc/arch/aarch64/atomic: 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_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

Log Message:
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.2 \
    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_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_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
cvs rdiff -u -r1.3 -r1.4 \
    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
cvs rdiff -u -r1.5 -r1.6 \
    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.4 -r1.5 \
    src/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S \
    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_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
cvs rdiff -u -r1.2 -r1.3 \
    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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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_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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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_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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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.2
--- 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	Thu Jul 29 10:29:05 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.2 2021/07/29 10:29:05 skrll 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/atomic_cas_16.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S:1.3 src/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S:1.4
--- src/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S:1.3	Wed Oct  7 07:31:47 2020
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_16.S,v 1.3 2020/10/07 07:31:47 skrll Exp $ */
+/* $NetBSD: atomic_cas_16.S,v 1.4 2021/07/29 10:29:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -46,3 +46,16 @@ ATOMIC_OP_ALIAS(atomic_cas_16,_atomic_ca
 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.3 src/common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S:1.4
--- src/common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S:1.3	Wed Oct  7 07:31:47 2020
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_32.S,v 1.3 2020/10/07 07:31:47 skrll Exp $ */
+/* $NetBSD: atomic_cas_32.S,v 1.4 2021/07/29 10:29:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -46,7 +46,19 @@ ATOMIC_OP_ALIAS(atomic_cas_32,_atomic_ca
 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.3 src/common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S:1.4
--- src/common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S:1.3	Wed Oct  7 07:31:47 2020
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_8.S,v 1.3 2020/10/07 07:31:47 skrll Exp $ */
+/* $NetBSD: atomic_cas_8.S,v 1.4 2021/07/29 10:29:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -45,4 +45,16 @@ 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_cas_64.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S:1.5 src/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S:1.6
--- src/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S:1.5	Wed Oct  7 07:31:47 2020
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_64.S,v 1.5 2020/10/07 07:31:47 skrll Exp $ */
+/* $NetBSD: atomic_cas_64.S,v 1.6 2021/07/29 10:29:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -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.5 src/common/lib/libc/arch/aarch64/atomic/atomic_op_asm.h:1.6
--- src/common/lib/libc/arch/aarch64/atomic/atomic_op_asm.h:1.5	Tue Oct 13 21:17:35 2020
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_op_asm.h	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_op_asm.h,v 1.5 2020/10/13 21:17:35 skrll Exp $ */
+/* $NetBSD: atomic_op_asm.h,v 1.6 2021/07/29 10:29:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -44,6 +44,18 @@ ENTRY_NP(_atomic_##OP##_8)						;\
 	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 x0 for return value */	;\
@@ -54,6 +66,18 @@ ENTRY_NP(_atomic_##OP##_8_nv)						;\
 	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							;\
@@ -64,6 +88,18 @@ ENTRY_NP(_atomic_##OP##_16)						;\
 	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 x0 for return value */	;\
@@ -74,6 +110,18 @@ ENTRY_NP(_atomic_##OP##_16_nv)						;\
 	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							;\
@@ -84,6 +132,18 @@ ENTRY_NP(_atomic_##OP##_32)						;\
 	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 x0 for return value */	;\
@@ -94,6 +154,18 @@ ENTRY_NP(_atomic_##OP##_32_nv)						;\
 	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							;\
@@ -104,6 +176,18 @@ ENTRY_NP(_atomic_##OP##_64)						;\
 	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 x0 for return value */	;\
@@ -114,6 +198,18 @@ ENTRY_NP(_atomic_##OP##_64_nv)						;\
 	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.4 src/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S:1.5
--- src/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S:1.4	Tue Jul  6 08:31:41 2021
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_nand_16.S,v 1.4 2021/07/06 08:31:41 skrll Exp $ */
+/* $NetBSD: atomic_nand_16.S,v 1.5 2021/07/29 10:29:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  * { 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) */
@@ -45,9 +45,21 @@ ENTRY_NP(_atomic_nand_16)
 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)
 
 
@@ -65,7 +77,19 @@ ENTRY_NP(_atomic_nand_16_nv)
 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.4 src/common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S:1.5
--- src/common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S:1.4	Mon Jul  5 08:50:31 2021
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_nand_32.S,v 1.4 2021/07/05 08:50:31 skrll Exp $ */
+/* $NetBSD: atomic_nand_32.S,v 1.5 2021/07/29 10:29:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,10 +35,10 @@
  * { 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, 2f			/*   succeed? no, try again */
 	ret				/* return old value */
@@ -47,9 +47,21 @@ 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,8 +69,8 @@ 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, 2f			/*   succeed? no, try again? */
 	ret				/* return new value */
@@ -67,5 +79,17 @@ 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.4 src/common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S:1.5
--- src/common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S:1.4	Mon Jul  5 08:50:31 2021
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_nand_64.S,v 1.4 2021/07/05 08:50:31 skrll Exp $ */
+/* $NetBSD: atomic_nand_64.S,v 1.5 2021/07/29 10:29:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  * { 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) */
@@ -47,9 +47,21 @@ 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
@@ -67,5 +79,17 @@ 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.4 src/common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S:1.5
--- src/common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S:1.4	Mon Jul  5 08:50:31 2021
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_nand_8.S,v 1.4 2021/07/05 08:50:31 skrll Exp $ */
+/* $NetBSD: atomic_nand_8.S,v 1.5 2021/07/29 10:29:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  * { 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) */
@@ -47,9 +47,22 @@ 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
  */
@@ -66,5 +79,17 @@ 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_swap_16.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S:1.4 src/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S:1.5
--- src/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S:1.4	Wed Apr 21 16:23:47 2021
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_swap_16.S,v 1.4 2021/04/21 16:23:47 skrll Exp $ */
+/* $NetBSD: atomic_swap_16.S,v 1.5 2021/07/29 10:29:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -43,10 +43,18 @@ 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.4 src/common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S:1.5
--- src/common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S:1.4	Wed Apr 21 16:23:47 2021
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_swap_32.S,v 1.4 2021/04/21 16:23:47 skrll Exp $ */
+/* $NetBSD: atomic_swap_32.S,v 1.5 2021/07/29 10:29:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -42,9 +42,17 @@ 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.4 src/common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S:1.5
--- src/common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S:1.4	Wed Apr 21 16:23:47 2021
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_swap_64.S,v 1.4 2021/04/21 16:23:47 skrll Exp $ */
+/* $NetBSD: atomic_swap_64.S,v 1.5 2021/07/29 10:29:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -43,10 +43,18 @@ 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.4 src/common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S:1.5
--- src/common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S:1.4	Wed Apr 21 16:23:47 2021
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_swap_8.S,v 1.4 2021/04/21 16:23:47 skrll Exp $ */
+/* $NetBSD: atomic_swap_8.S,v 1.5 2021/07/29 10:29:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -43,10 +43,18 @@ 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_or_64.S
diff -u src/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S:1.2 src/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S:1.3
--- src/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S:1.2	Sun Sep 15 11:14:15 2019
+++ src/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S	Thu Jul 29 10:29:05 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_or_64.S,v 1.2 2019/09/15 11:14:15 skrll Exp $ */
+/* $NetBSD: atomic_or_64.S,v 1.3 2021/07/29 10:29:05 skrll 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