add fallback blas_lock implementation

to be used on armv5 and new platforms
This commit is contained in:
Grazvydas Ignotas 2015-08-16 18:10:34 +02:00
parent f2ac1a5cee
commit 6b92204a7c
10 changed files with 27 additions and 0 deletions

View File

@ -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

View File

@ -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){

View File

@ -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;

View File

@ -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){

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;