50 lines
1.2 KiB
ArmAsm
50 lines
1.2 KiB
ArmAsm
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
// Differential kernel for the loong64 atomics: the AM* family in its plain
|
|
// and _dbar (acquire/release) forms, spelled as the runtime's
|
|
// atomic_loong64.s spells them. Every AM* takes three operands:
|
|
// value, (address), result.
|
|
|
|
#include "textflag.h"
|
|
|
|
TEXT ·plain(SB), NOSPLIT, $0-0
|
|
AMSWAPB R14, (R13), R12
|
|
AMSWAPH R14, (R13), R12
|
|
AMSWAPW R5, (R4), R6
|
|
AMSWAPV R5, (R4), R0
|
|
AMCASB R14, (R13), R12
|
|
AMCASH R6, (R4), R5
|
|
AMCASW R6, (R4), R5
|
|
AMCASV R6, (R4), R5
|
|
AMADDW R5, (R4), R0
|
|
AMADDV R14, (R13), R12
|
|
AMANDW R5, (R4), R6
|
|
AMANDV R5, (R4), R6
|
|
AMORW R5, (R4), R0
|
|
AMORV R5, (R4), R6
|
|
AMXORW R5, (R4), R6
|
|
AMXORV R5, (R4), R6
|
|
AMMAXW R5, (R4), R6
|
|
AMMAXV R5, (R4), R6
|
|
AMMINW R5, (R4), R6
|
|
AMMINV R5, (R4), R6
|
|
AMMAXWU R5, (R4), R6
|
|
AMMAXVU R5, (R4), R6
|
|
AMMINWU R5, (R4), R6
|
|
AMMINVU R5, (R4), R6
|
|
RET
|
|
|
|
TEXT ·dbar(SB), NOSPLIT, $0-0
|
|
AMADDDBW R5, (R4), R6
|
|
AMADDDBV R5, (R4), R6
|
|
AMANDDBW R5, (R6), R0
|
|
AMANDDBV R5, (R4), R6
|
|
AMORDBW R5, (R6), R0
|
|
AMORDBV R5, (R4), R6
|
|
AMSWAPDBW R5, (R4), R6
|
|
AMSWAPDBV R5, (R4), R0
|
|
AMCASDBW R6, (R4), R5
|
|
AMCASDBV R6, (R4), R5
|
|
RET
|