#------------------------------------------------------------------------------ # # LoongArch synchronization ASM functions. # # Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # #------------------------------------------------------------------------------ ASM_GLOBAL ASM_PFX(AsmInternalSyncCompareExchange16) ASM_GLOBAL ASM_PFX(AsmInternalSyncCompareExchange32) ASM_GLOBAL ASM_PFX(AsmInternalSyncCompareExchange64) ASM_GLOBAL ASM_PFX(AsmInternalSyncIncrement) ASM_GLOBAL ASM_PFX(AsmInternalSyncDecrement) /** UINT32 EFIAPI AsmInternalSyncCompareExchange16 ( IN volatile UINT32 *Ptr32, IN UINT64 Mask, IN UINT64 LocalCompareValue, IN UINT64 LocalExchangeValue ) **/ ASM_PFX(AsmInternalSyncCompareExchange16): 1: ll.w $t0, $a0, 0x0 and $t1, $t0, $a1 bne $t1, $a2, 2f andn $t1, $t0, $a1 or $t1, $t1, $a3 sc.w $t1, $a0, 0x0 beqz $t1, 1b b 3f 2: dbar 0 3: move $a0, $t0 jirl $zero, $ra, 0 /** UINT32 EFIAPI AsmInternalSyncCompareExchange32 ( IN volatile UINT32 *Value, IN UINT64 CompareValue, IN UINT64 ExchangeValue ) **/ ASM_PFX(AsmInternalSyncCompareExchange32): 1: ll.w $t0, $a0, 0x0 bne $t0, $a1, 2f move $t1, $a2 sc.w $t1, $a0, 0x0 beqz $t1, 1b b 3f 2: dbar 0 3: move $a0, $t0 jirl $zero, $ra, 0 /** UINT64 EFIAPI AsmInternalSyncCompareExchange64 ( IN volatile UINT64 *Value, IN UINT64 CompareValue, IN UINT64 ExchangeValue ) **/ ASM_PFX(AsmInternalSyncCompareExchange64): 1: ll.d $t0, $a0, 0x0 bne $t0, $a1, 2f move $t1, $a2 sc.d $t1, $a0, 0x0 beqz $t1, 1b b 3f 2: dbar 0 3: move $a0, $t0 jirl $zero, $ra, 0 /** UINT32 EFIAPI AsmInternalSyncIncrement ( IN volatile UINT32 *Value ) **/ ASM_PFX(AsmInternalSyncIncrement): li.w $t0, 1 amadd.w $zero, $t0, $a0 ld.w $a0, $a0, 0 jirl $zero, $ra, 0 /** UINT32 EFIAPI AsmInternalSyncDecrement ( IN volatile UINT32 *Value ) **/ ASM_PFX(AsmInternalSyncDecrement): li.w $t0, -1 amadd.w $zero, $t0, $a0 ld.w $a0, $a0, 0 jirl $zero, $ra, 0 .end