73 lines
1.6 KiB
ArmAsm
73 lines
1.6 KiB
ArmAsm
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (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
|