diff --git a/common.h b/common.h index 5998b5608b..6073f037fa 100644 --- a/common.h +++ b/common.h @@ -435,9 +435,23 @@ static inline unsigned long long rpcc(void){ #define RPCC64BIT #endif // !RPCC_DEFINED +#if !defined(BLAS_LOCK_DEFINED) && defined(__GNUC__) +static void __inline blas_lock(volatile BLASULONG *address){ + + do { + while (*address) {YIELDING;}; + + } while (!__sync_bool_compare_and_swap(address, 0, 1)); +} +#define BLAS_LOCK_DEFINED +#endif + #ifndef RPCC_DEFINED #error "rpcc() implementation is missing for your platform" #endif +#ifndef BLAS_LOCK_DEFINED +#error "blas_lock() implementation is missing for your platform" +#endif #endif // !ASSEMBLER #ifdef OS_LINUX diff --git a/common_alpha.h b/common_alpha.h index 86f58966a8..9739c941d4 100644 --- a/common_alpha.h +++ b/common_alpha.h @@ -76,6 +76,7 @@ static void __inline blas_lock(unsigned long *address){ "30:", address); #endif } +#define BLAS_LOCK_DEFINED static __inline unsigned int rpcc(void){ diff --git a/common_arm.h b/common_arm.h index 74b6378dd6..84691d7667 100644 --- a/common_arm.h +++ b/common_arm.h @@ -51,6 +51,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef ASSEMBLER +#if defined(ARMV6) || defined(ARMV7) || defined(ARMV8) + static void __inline blas_lock(volatile BLASULONG *address){ int register ret; @@ -71,6 +73,8 @@ static void __inline blas_lock(volatile BLASULONG *address){ MB; } +#define BLAS_LOCK_DEFINED +#endif static inline int blas_quickdivide(blasint x, blasint y){ return x / y; diff --git a/common_arm64.h b/common_arm64.h index cc08fa75bd..c4e588d1f0 100644 --- a/common_arm64.h +++ b/common_arm64.h @@ -69,6 +69,7 @@ static void __inline blas_lock(volatile BLASULONG *address){ } while (ret); } +#define BLAS_LOCK_DEFINED static inline int blas_quickdivide(blasint x, blasint y){ diff --git a/common_ia64.h b/common_ia64.h index d1f210749b..72b75fc4ee 100644 --- a/common_ia64.h +++ b/common_ia64.h @@ -68,6 +68,7 @@ static __inline void blas_lock(volatile unsigned long *address){ : "ar.ccv", "memory"); } while (ret); } +#define BLAS_LOCK_DEFINED static __inline unsigned long rpcc(void) { unsigned long clocks; @@ -100,6 +101,7 @@ static __inline void blas_lock(volatile unsigned long *address){ while (*address || _InterlockedCompareExchange((volatile int *) address,1,0)) ; } +#define BLAS_LOCK_DEFINED static __inline unsigned int rpcc(void) { return __getReg(_IA64_REG_AR_ITC); diff --git a/common_mips64.h b/common_mips64.h index bc1a52fb4f..f5c0ec7cfd 100644 --- a/common_mips64.h +++ b/common_mips64.h @@ -98,6 +98,7 @@ static void INLINE blas_lock(volatile unsigned long *address){ } while (ret); } +#define BLAS_LOCK_DEFINED static inline unsigned int rpcc(void){ unsigned long ret; diff --git a/common_power.h b/common_power.h index 3b9471a170..ab331b04a0 100644 --- a/common_power.h +++ b/common_power.h @@ -87,6 +87,7 @@ static void INLINE blas_lock(volatile unsigned long *address){ #endif } while (ret); } +#define BLAS_LOCK_DEFINED static inline unsigned long rpcc(void){ unsigned long ret; diff --git a/common_sparc.h b/common_sparc.h index 8a16e3d3aa..f99972db9c 100644 --- a/common_sparc.h +++ b/common_sparc.h @@ -58,6 +58,7 @@ static void __inline blas_lock(volatile unsigned long *address){ : "memory"); } while (ret); } +#define BLAS_LOCK_DEFINED static __inline unsigned long rpcc(void){ unsigned long clocks; diff --git a/common_x86.h b/common_x86.h index 9506716cee..6c90432a27 100644 --- a/common_x86.h +++ b/common_x86.h @@ -65,6 +65,7 @@ static void __inline blas_lock(volatile BLASULONG *address){ } while (ret); } +#define BLAS_LOCK_DEFINED static __inline unsigned long long rpcc(void){ unsigned int a, d; diff --git a/common_x86_64.h b/common_x86_64.h index 3a02beefb6..4c783b315c 100644 --- a/common_x86_64.h +++ b/common_x86_64.h @@ -74,6 +74,7 @@ static void __inline blas_lock(volatile BLASULONG *address){ } while (ret); } +#define BLAS_LOCK_DEFINED static __inline BLASULONG rpcc(void){ BLASULONG a, d;