// Copyright (c) 2026 Petr Balvín (https://petrbalvin.org) // SPDX-License-Identifier: BSD-3-Clause // Differential kernel for the arm64 synchronisation instructions: the // acquire/release loads and stores, the exclusive family and the LSE // atomics with acquire and release semantics, plus the register-pair // loads and stores. Every function is byte-compared against go tool asm. #include "textflag.h" // func acquireRelease() TEXT ·acquireRelease(SB), NOSPLIT, $0-0 LDAR (R1), R2 LDARB (R3), R4 LDARH (R5), R6 LDARW (R7), R8 STLR R2, (R1) STLRB R4, (R3) STLRH R6, (R5) STLRW R8, (R7) RET // func exclusive() TEXT ·exclusive(SB), NOSPLIT, $0-0 LDAXR (R1), R2 LDAXRB (R3), R4 LDAXRW (R5), R6 STLXR R2, (R1), R8 STLXRB R4, (R3), R8 STLXRW R6, (R5), R8 RET // func lseAcquireRelease() TEXT ·lseAcquireRelease(SB), NOSPLIT, $0-0 CASALD R1, (R3), R2 CASALW R4, (R6), R5 LDADDALD R1, (R3), R2 LDADDALW R4, (R6), R5 LDCLRALB R1, (R3), R2 LDCLRALW R4, (R6), R5 LDCLRALD R1, (R3), R2 LDORALB R1, (R3), R2 LDORALW R4, (R6), R5 LDORALD R1, (R3), R2 SWPALB R1, (R3), R2 SWPALW R4, (R6), R5 SWPALD R1, (R3), R2 RET // func lseBase() TEXT ·lseBase(SB), NOSPLIT, $0-0 LDADDD R1, (R3), R2 LDADDW R4, (R6), R5 CASD R1, (R3), R2 CASW R4, (R6), R5 SWPD R1, (R3), R2 SWPW R4, (R6), R5 RET // func pairs() TEXT ·pairs(SB), NOSPLIT, $0-0 LDP (R1), (R2, R3) LDP 8(R4), (R5, R6) LDP -16(R1), (R2, R3) LDPW 4(R4), (R5, R6) STP (R2, R3), 24(R7) STP (R2, R3),-8(R7) STPW (R1, R2), 4(R0) FLDPD (R8), (F1, F2) FLDPD 8(R8), (F3, F4) FSTPD (F3, F4),-8(R9) RET