From 0dfbbbb746c2f9e149e901ca410ae8e949d56b55 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 27 Jan 2024 10:08:17 +0100 Subject: [PATCH] [NativeAOT] ARM: Add RhpLockCmpXchg8 and RhpLockCmpXchg16 --- .../nativeaot/Runtime/arm/Interlocked.S | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/coreclr/nativeaot/Runtime/arm/Interlocked.S b/src/coreclr/nativeaot/Runtime/arm/Interlocked.S index baf4e4b02216a1..ef32dbf3fabb05 100644 --- a/src/coreclr/nativeaot/Runtime/arm/Interlocked.S +++ b/src/coreclr/nativeaot/Runtime/arm/Interlocked.S @@ -7,6 +7,50 @@ #include // generated by the build from AsmOffsets.cpp #include +// WARNING: Code in EHHelpers.cpp makes assumptions about this helper, in particular: +// - Function "InWriteBarrierHelper" assumes an AV due to passed in null pointer will happen at RhpLockCmpXchg8AVLocation +// - Function "UnwindSimpleHelperToCaller" assumes no registers were pushed and LR contains the return address +// r0 = destination address +// r1 = value +// r2 = comparand +LEAF_ENTRY RhpLockCmpXchg8, _TEXT + dmb +ALTERNATE_ENTRY RhpLockCmpXchg8AVLocation +LOCAL_LABEL(CmpXchg8Retry): + ldrexb r3, [r0] + cmp r2, r3 + bne LOCAL_LABEL(CmpXchg8Exit) + strexb r12, r1, [r0] + cmp r12, #0 + bne LOCAL_LABEL(CmpXchg8Retry) +LOCAL_LABEL(CmpXchg8Exit): + mov r0, r3 + dmb + bx lr +LEAF_END RhpLockCmpXchg8, _TEXT + +// WARNING: Code in EHHelpers.cpp makes assumptions about this helper, in particular: +// - Function "InWriteBarrierHelper" assumes an AV due to passed in null pointer will happen at RhpLockCmpXchg16AVLocation +// - Function "UnwindSimpleHelperToCaller" assumes no registers were pushed and LR contains the return address +// r0 = destination address +// r1 = value +// r2 = comparand +LEAF_ENTRY RhpLockCmpXchg16, _TEXT + dmb +ALTERNATE_ENTRY RhpLockCmpXchg16AVLocation +LOCAL_LABEL(CmpXchg16Retry): + ldrexh r3, [r0] + cmp r2, r3 + bne LOCAL_LABEL(CmpXchg16Exit) + strexh r12, r1, [r0] + cmp r12, #0 + bne LOCAL_LABEL(CmpXchg16Retry) +LOCAL_LABEL(CmpXchg16Exit): + mov r0, r3 + dmb + bx lr +LEAF_END RhpLockCmpXchg16, _TEXT + // WARNING: Code in EHHelpers.cpp makes assumptions about this helper, in particular: // - Function "InWriteBarrierHelper" assumes an AV due to passed in null pointer will happen at RhpLockCmpXchg32AVLocation // - Function "UnwindSimpleHelperToCaller" assumes no registers were pushed and LR contains the return address