Module Name:    src
Committed By:   skrll
Date:           Tue Apr 27 09:14:24 UTC 2021

Modified Files:
        src/common/lib/libc: Makefile.inc
        src/common/lib/libc/arch/aarch64/atomic: Makefile.inc
Added Files:
        src/common/lib/libc/arch/aarch64/atomic: __aarch64_lse.S
Removed Files:
        src/common/lib/libc/arch/aarch64/atomic: __aarch64_swp1_acq.S
            __aarch64_swp1_acq_rel.S __aarch64_swp1_rel.S
            __aarch64_swp1_relax.S __aarch64_swp2_acq.S
            __aarch64_swp2_acq_rel.S __aarch64_swp2_rel.S
            __aarch64_swp2_relax.S __aarch64_swp4_acq.S
            __aarch64_swp4_acq_rel.S __aarch64_swp4_rel.S
            __aarch64_swp4_relax.S __aarch64_swp8_acq.S
            __aarch64_swp8_acq_rel.S __aarch64_swp8_rel.S
            __aarch64_swp8_relax.S

Log Message:
Provide all the LSE operation fuctions.  The use of LSE instructions is
currently disabled.


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/common/lib/libc/Makefile.inc
cvs rdiff -u -r1.3 -r1.4 src/common/lib/libc/arch/aarch64/atomic/Makefile.inc
cvs rdiff -u -r0 -r1.1 \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_lse.S
cvs rdiff -u -r1.1 -r0 \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp1_acq.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp1_acq_rel.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp1_rel.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp1_relax.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp2_acq.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp2_acq_rel.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp2_rel.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp2_relax.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp4_acq.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp4_acq_rel.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp4_rel.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp4_relax.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp8_acq.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp8_acq_rel.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp8_rel.S \
    src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp8_relax.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/Makefile.inc
diff -u src/common/lib/libc/Makefile.inc:1.20 src/common/lib/libc/Makefile.inc:1.21
--- src/common/lib/libc/Makefile.inc:1.20	Thu Apr 30 03:28:18 2020
+++ src/common/lib/libc/Makefile.inc	Tue Apr 27 09:14:24 2021
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.inc,v 1.20 2020/04/30 03:28:18 riastradh Exp $
+# $NetBSD: Makefile.inc,v 1.21 2021/04/27 09:14:24 skrll Exp $
 
 .include <bsd.own.mk>
 
@@ -44,5 +44,6 @@ COMMON_ARCHDIR=${COMMON_DIR}/arch/${COMM
 CPPFLAGS+=-I${COMMON_DIR}/quad -I${COMMON_DIR}/string
 .if defined(COMMON_ARCHSUBDIR)
 CPPFLAGS+=-I${COMMON_ARCHDIR}/string
+CPPFLAGS+=-I${COMMON_ARCHDIR}/atomic
 .endif
 CPPFLAGS+=-I${COMMON_DIR}/hash/sha3

Index: src/common/lib/libc/arch/aarch64/atomic/Makefile.inc
diff -u src/common/lib/libc/arch/aarch64/atomic/Makefile.inc:1.3 src/common/lib/libc/arch/aarch64/atomic/Makefile.inc:1.4
--- src/common/lib/libc/arch/aarch64/atomic/Makefile.inc:1.3	Wed Apr 21 16:23:47 2021
+++ src/common/lib/libc/arch/aarch64/atomic/Makefile.inc	Tue Apr 27 09:14:24 2021
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.inc,v 1.3 2021/04/21 16:23:47 skrll Exp $
+# $NetBSD: Makefile.inc,v 1.4 2021/04/27 09:14:24 skrll Exp $
 
 .if defined(LIB) && (${LIB} == "kern" || ${LIB} == "c" || ${LIB} == "pthread" \
 	|| ${LIB} == "rump")
@@ -12,13 +12,24 @@ SRCS.atomic+=	atomic_dec_32.S atomic_dec
 SRCS.atomic+=	atomic_inc_32.S atomic_inc_64.S
 SRCS.atomic+=	membar_ops.S
 #and cas nand or sub swap xor
-.for op in swp
+.for op in swp cas clr set eor add
 .for sz in 1 2 4 8
-.for ar in relax acq rel acq_rel
-SRCS.atomic+=	__aarch64_${op}${sz}_${ar}.S
+.for ar in _relax _acq _rel _acq_rel
+__aarch64_${op}${sz}${ar}.S: __aarch64_lse.S
+	${_MKTARGET_CREATE}
+	printf '#define OP ${op}\n#define OP_${op}\n#define SZ ${sz}\n#define AR ${ar}\n#define AR${ar}\n#include "__aarch64_lse.S"\n' > ${.TARGET}
+SRCS.gen+=	__aarch64_${op}${sz}${ar}.S
 .endfor
 .endfor
 .endfor
+.for op in casp
+.for ar in _relax _acq _rel _acq_rel
+__aarch64_${op}${ar}.S: __aarch64_lse.S
+	${_MKTARGET_CREATE}
+	printf '#define OP ${op}\n#define OP_${op}\n#define AR ${ar}\n#define AR${ar}\n#include "__aarch64_lse.S"\n' > ${.TARGET}
+SRCS.gen+=	__aarch64_${op}${ar}.S
+.endfor
+.endfor
 #.for op in add and nand or sub xor
 #SRCS.atomic+=	sync_fetch_and_${op}_8.S
 #.endfor
@@ -30,4 +41,5 @@ SRCS.atomic+=	__aarch64_${op}${sz}_${ar}
 
 SRCS.atomic+=	atomic_init_cas.c
 
-SRCS+=	${SRCS.atomic}
+SRCS+=		${SRCS.atomic} ${SRCS.gen}
+CLEANFILES+=	${SRCS.gen}

Added files:

Index: src/common/lib/libc/arch/aarch64/atomic/__aarch64_lse.S
diff -u /dev/null src/common/lib/libc/arch/aarch64/atomic/__aarch64_lse.S:1.1
--- /dev/null	Tue Apr 27 09:14:24 2021
+++ src/common/lib/libc/arch/aarch64/atomic/__aarch64_lse.S	Tue Apr 27 09:14:24 2021
@@ -0,0 +1,207 @@
+/* $NetBSD: __aarch64_lse.S,v 1.1 2021/04/27 09:14:24 skrll Exp $ */
+
+/*-
+ * Copyright (c) 2021 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Nick Hudson.
+w *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+
+#include "atomic_op_asm.h"
+
+#if SZ == 1
+#define OPSFX	b
+#define R0	w0
+#define R1	w1
+#define R4	w4
+#endif
+
+#if SZ == 2
+#define OPSFX	h
+#define R0	w0
+#define R1	w1
+#define R4	w4
+#endif
+
+#if SZ == 4
+#define OPSFX
+#define R0	w0
+#define R1	w1
+#define R4	w4
+#endif
+
+#if SZ == 8
+#define OPSFX
+#define R0	x0
+#define R1	x1
+#define R4	x4
+#endif
+
+#if defined(AR_relax)
+#define ACQ
+#define REL
+#endif
+
+#if defined(AR_acq)
+#define ACQ	a
+#define REL
+#endif
+
+#if defined(AR_rel)
+#define ACQ
+#define REL	l
+#endif
+
+#if defined(AR_acq_rel)
+#define ACQ	a
+#define REL	l
+#endif
+
+#if defined(OP_clr)
+#define INSNOP	bic
+#endif
+
+#if defined(OP_set)
+#define INSNOP	orr
+#endif
+
+#if defined(OP_add)
+#define INSNOP	add
+#endif
+
+#if defined(OP_eor)
+#define INSNOP	eor
+#endif
+
+#define _CONCAT3(A, B, C)	__CONCAT3(A,B,C)
+#define _CONCAT4(A, B, C, D)	__CONCAT4(A,B,C,D)
+#define _CONCAT5(A, B, C, D, E)	__CONCAT5(A,B,C,D,E)
+
+#define FUNC2			_CONCAT3(__aarch64_,OP,AR)
+#define FUNC3			_CONCAT4(__aarch64_,OP,SZ,AR)
+
+#define CASP_FUNC		FUNC2
+#define CAS_FUNC		FUNC3
+#define SWP_FUNC		FUNC3
+#define INSN_FUNC		FUNC3
+
+#define LDXR			_CONCAT4(ld, ACQ, xr, OPSFX)
+#define STXR			_CONCAT4(st, REL, xr, OPSFX)
+#define LDXP			_CONCAT3(ld, ACQ, xp)
+#define STXP			_CONCAT3(st, REL, xp)
+
+#ifdef _HAVE_LSE
+#define SWP			_CONCAT4(swp, ACQ, REL, OPSFX)
+#define CAS			_CONCAT4(cas, ACQ, REL, OPSFX)
+#define CASP			_CONCAT3(casp, ACQ, REL)
+#define INSN			_CONCAT5(ld, OP, ACQ, REL, OPSFX)
+
+	.hidden	__aarch64_have_lse_atomics
+	.arch armv8-a+lse
+
+#define DO_LSE_INSN_IF_SUPPORTED(label)				\
+	adrp	x4, __aarch64_have_lse_atomics			;\
+	ldrb	w4, [x4, #:lo12:__aarch64_have_lse_atomics]	;\
+	cbnz	w4, label
+
+#endif
+
+#if defined(OP_swp)
+ENTRY_NP(SWP_FUNC)
+#ifdef _HAVE_LSE
+	DO_LSE_INSN_IF_SUPPORTED(99f)
+	SWP	R0, R0, [x1]
+	ret
+99:
+#endif
+	mov	x4, x0			/* need x0 for return value	 */
+1:	LDXR	R0, [x1]		/* load old value		 */
+	STXR	w3, R4, [x1]		/* store new value		 */
+	cbnz	w3, 2f			/*   succeed?? no, try again	 */
+	ret				/* return old value		 */
+2:	b	1b
+END(SWP_FUNC)
+#endif
+
+#if defined(OP_cas)
+ENTRY_NP(CAS_FUNC)
+#ifdef _HAVE_LSE
+	DO_LSE_INSN_IF_SUPPORTED(99f)
+	CAS	R0, R1, [x2]
+	ret
+99:
+#endif
+	mov	x4, x0			/* need x0 for return value	*/
+1:	LDXR	R0, [x2]		/* load old value		*/
+	cmp	R0, R4			/* compare			*/
+	b.ne	2f			/*   not equal? return		*/
+	STXR	w3, R1, [x2]		/* store new value		*/
+	cbnz	w3, 3f			/*   succeed? nope, try again.	*/
+2:	ret				/* return.			*/
+3:	b	1b
+END(CAS_FUNC)
+#endif
+
+#if defined(OP_casp)
+ENTRY_NP(CASP_FUNC)
+#ifdef _HAVE_LSE
+	DO_LSE_INSN_IF_SUPPORTED(99f)
+	CASP	x0, x1, x2, x3, [x4]
+	ret
+99:
+#endif
+	mov	x4, x0			/* need x0 for return value	*/
+1:	LDXP	x5, x6, [x4]		/* load old value		*/
+	cmp	x5, x0			/* compare			*/
+	b.ne	2f			/*   not equal? return		*/
+	cmp	x6, x1
+	b.ne	2f			/*   not equal? return		*/
+	STXP	w7, x2, x3, [x4]	/* store new value		*/
+	cbnz	w7, 3f			/*   succeed? nope, try again.	*/
+2:	ret				/* return.			*/
+3:	b	1b
+END(CASP_FUNC)
+#endif
+
+#if defined(OP_set) || defined(OP_clr) || defined(OP_add) || defined(OP_eor)
+ENTRY_NP(INSN_FUNC)
+#ifdef _HAVE_LSE
+	DO_LSE_INSN_IF_SUPPORTED(99f)
+	INSN	R0, R0, [x1]
+	ret
+99:
+#endif
+	mov	x4, x0			/* need x0 for return value	 */
+1:	LDXR	R0, [x1]		/* load old value		 */
+	INSNOP	R4, R0, R4
+	STXR	w3, R4, [x1]		/* store new value		 */
+	cbnz	w3, 2f			/*   succeed?? no, try again	 */
+	ret				/* return old value		 */
+2:	b	1b
+END(INSN_FUNC)
+#endif
+

Reply via email to