//------------------------------------------------------------------------------ | |
// | |
// RISC-V synchronization functions. | |
// | |
// Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR> | |
// | |
// SPDX-License-Identifier: BSD-2-Clause-Patent | |
// | |
//------------------------------------------------------------------------------ | |
#include <Base.h> | |
.data | |
.text | |
.align 3 | |
.global ASM_PFX(InternalSyncCompareExchange32) | |
.global ASM_PFX(InternalSyncCompareExchange64) | |
.global ASM_PFX(InternalSyncIncrement) | |
.global ASM_PFX(InternalSyncDecrement) | |
// | |
// ompare and xchange a 32-bit value. | |
// | |
// @param a0 : Pointer to 32-bit value. | |
// @param a1 : Compare value. | |
// @param a2 : Exchange value. | |
// | |
ASM_PFX (InternalSyncCompareExchange32): | |
lr.w a3, (a0) // Load the value from a0 and make | |
// the reservation of address. | |
bne a3, a1, exit | |
sc.w a3, a2, (a0) // Write the value back to the address. | |
mv a3, a1 | |
exit: | |
mv a0, a3 | |
ret | |
// | |
// Compare and xchange a 64-bit value. | |
// | |
// @param a0 : Pointer to 64-bit value. | |
// @param a1 : Compare value. | |
// @param a2 : Exchange value. | |
// | |
ASM_PFX (InternalSyncCompareExchange64): | |
lr.d a3, (a0) // Load the value from a0 and make | |
// the reservation of address. | |
bne a3, a1, exit | |
sc.d a3, a2, (a0) // Write the value back to the address. | |
mv a3, a1 | |
exit2: | |
mv a0, a3 | |
ret | |
// | |
// Performs an atomic increment of an 32-bit unsigned integer. | |
// | |
// @param a0 : Pointer to 32-bit value. | |
// | |
ASM_PFX (InternalSyncIncrement): | |
li a1, 1 | |
amoadd.w a2, a1, (a0) | |
mv a0, a2 | |
ret | |
// | |
// Performs an atomic decrement of an 32-bit unsigned integer. | |
// | |
// @param a0 : Pointer to 32-bit value. | |
// | |
ASM_PFX (InternalSyncDecrement): | |
li a1, -1 | |
amoadd.w a2, a1, (a0) | |
mv a0, a2 | |
ret |