mirror of https://github.com/acidanthera/audk.git
123 lines
2.4 KiB
ArmAsm
123 lines
2.4 KiB
ArmAsm
|
#------------------------------------------------------------------------------
|
||
|
#
|
||
|
# 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 $t0, $a2
|
||
|
sc.w $t0, $a0, 0x0
|
||
|
beqz $t0, 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 $t0, $a2
|
||
|
sc.d $t0, $a0, 0x0
|
||
|
beqz $t0, 1b
|
||
|
b 3f
|
||
|
2:
|
||
|
dbar 0
|
||
|
3:
|
||
|
move $a0, $t0
|
||
|
jirl $zero, $ra, 0
|
||
|
|
||
|
/**
|
||
|
UINT32
|
||
|
EFIAPI
|
||
|
AsmInternalSyncIncrement (
|
||
|
IN volatile UINT32 *Value
|
||
|
)
|
||
|
**/
|
||
|
ASM_PFX(AsmInternalSyncIncrement):
|
||
|
move $t0, $a0
|
||
|
dbar 0
|
||
|
ld.w $t1, $t0, 0x0
|
||
|
li.w $t2, 1
|
||
|
amadd.w $t1, $t2, $t0
|
||
|
|
||
|
ld.w $a0, $t0, 0x0
|
||
|
jirl $zero, $ra, 0
|
||
|
|
||
|
/**
|
||
|
UINT32
|
||
|
EFIAPI
|
||
|
AsmInternalSyncDecrement (
|
||
|
IN volatile UINT32 *Value
|
||
|
)
|
||
|
**/
|
||
|
ASM_PFX(AsmInternalSyncDecrement):
|
||
|
move $t0, $a0
|
||
|
dbar 0
|
||
|
ld.w $t1, $t0, 0x0
|
||
|
li.w $t2, -1
|
||
|
amadd.w $t1, $t2, $t0
|
||
|
|
||
|
ld.w $a0, $t0, 0x0
|
||
|
jirl $zero, $ra, 0
|
||
|
.end
|