//------------------------------------------------------------------------------ // // RISC-V synchronization functions. // // Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.
// // SPDX-License-Identifier: BSD-2-Clause-Patent // //------------------------------------------------------------------------------ #include .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