From 323ba46f72eda8c4da84741467683fdda50653a5 Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Thu, 14 Feb 2013 11:00:59 +0200 Subject: Fix thumb armv5 atomics Change-Id: Ie9f98e5f5a08908d9d99e04bdc95fd506cc4a51e Reviewed-by: Thiago Macieira Reviewed-by: Paul Olav Tvete --- src/corelib/arch/qatomic_armv5.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/corelib/arch/qatomic_armv5.h b/src/corelib/arch/qatomic_armv5.h index 445379a99c..92e2b02e5b 100644 --- a/src/corelib/arch/qatomic_armv5.h +++ b/src/corelib/arch/qatomic_armv5.h @@ -163,12 +163,20 @@ __asm T QBasicAtomicOps<4>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL template<> template inline T QBasicAtomicOps<4>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHROW { +#if defined(__thumb__) + register T originalValue; + do { + originalValue = _q_value; + } while (_q_cmpxchg(originalValue, newValue, &_q_value) != 0); + return originalValue; +#else T originalValue; asm volatile("swp %0,%2,[%3]" : "=&r"(originalValue), "=m" (_q_value) : "r"(newValue), "r"(&_q_value) : "cc", "memory"); return originalValue; +#endif } #endif // Q_CC_RVCT -- cgit v1.2.3