#------------------------------------------------------------------------------ | |
# | |
# LoongArch synchronization ASM functions. | |
# | |
# Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR> | |
# | |
# 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 |