diff --git a/libs/port/interlocked.c b/libs/port/interlocked.c index eb14daa32b3..143d22670e5 100644 --- a/libs/port/interlocked.c +++ b/libs/port/interlocked.c @@ -313,6 +313,28 @@ __int64 interlocked_cmpxchg64( __int64 *dest, __int64 xchg, __int64 compare ) return compare; } +#ifdef __aarch64__ +int interlocked_cmpxchg128( __int64 *dest, __int64 xchg_high, __int64 xchg_low, __int64 *compare ) +{ + int retv; + pthread_mutex_lock( &interlocked_mutex ); + if (dest[0] == compare[0] && dest[1] == compare[1]) + { + dest[0] = xchg_low; + dest[1] = xchg_high; + retv = 1; + } + else + { + compare[0] = dest[0]; + compare[1] = dest[1]; + retv = 0; + } + pthread_mutex_unlock( &interlocked_mutex ); + return retv; +} +#endif + int interlocked_xchg( int *dest, int val ) { int retv;