add fallback blas_lock implementation
to be used on armv5 and new platforms
This commit is contained in:
parent
f2ac1a5cee
commit
6b92204a7c
14
common.h
14
common.h
|
@ -435,9 +435,23 @@ static inline unsigned long long rpcc(void){
|
||||||
#define RPCC64BIT
|
#define RPCC64BIT
|
||||||
#endif // !RPCC_DEFINED
|
#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
|
#ifndef RPCC_DEFINED
|
||||||
#error "rpcc() implementation is missing for your platform"
|
#error "rpcc() implementation is missing for your platform"
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef BLAS_LOCK_DEFINED
|
||||||
|
#error "blas_lock() implementation is missing for your platform"
|
||||||
|
#endif
|
||||||
#endif // !ASSEMBLER
|
#endif // !ASSEMBLER
|
||||||
|
|
||||||
#ifdef OS_LINUX
|
#ifdef OS_LINUX
|
||||||
|
|
|
@ -76,6 +76,7 @@ static void __inline blas_lock(unsigned long *address){
|
||||||
"30:", address);
|
"30:", address);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#define BLAS_LOCK_DEFINED
|
||||||
|
|
||||||
static __inline unsigned int rpcc(void){
|
static __inline unsigned int rpcc(void){
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#ifndef ASSEMBLER
|
#ifndef ASSEMBLER
|
||||||
|
|
||||||
|
#if defined(ARMV6) || defined(ARMV7) || defined(ARMV8)
|
||||||
|
|
||||||
static void __inline blas_lock(volatile BLASULONG *address){
|
static void __inline blas_lock(volatile BLASULONG *address){
|
||||||
|
|
||||||
int register ret;
|
int register ret;
|
||||||
|
@ -71,6 +73,8 @@ static void __inline blas_lock(volatile BLASULONG *address){
|
||||||
MB;
|
MB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define BLAS_LOCK_DEFINED
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline int blas_quickdivide(blasint x, blasint y){
|
static inline int blas_quickdivide(blasint x, blasint y){
|
||||||
return x / y;
|
return x / y;
|
||||||
|
|
|
@ -69,6 +69,7 @@ static void __inline blas_lock(volatile BLASULONG *address){
|
||||||
} while (ret);
|
} while (ret);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#define BLAS_LOCK_DEFINED
|
||||||
|
|
||||||
|
|
||||||
static inline int blas_quickdivide(blasint x, blasint y){
|
static inline int blas_quickdivide(blasint x, blasint y){
|
||||||
|
|
|
@ -68,6 +68,7 @@ static __inline void blas_lock(volatile unsigned long *address){
|
||||||
: "ar.ccv", "memory");
|
: "ar.ccv", "memory");
|
||||||
} while (ret);
|
} while (ret);
|
||||||
}
|
}
|
||||||
|
#define BLAS_LOCK_DEFINED
|
||||||
|
|
||||||
static __inline unsigned long rpcc(void) {
|
static __inline unsigned long rpcc(void) {
|
||||||
unsigned long clocks;
|
unsigned long clocks;
|
||||||
|
@ -100,6 +101,7 @@ static __inline void blas_lock(volatile unsigned long *address){
|
||||||
while (*address || _InterlockedCompareExchange((volatile int *) address,1,0))
|
while (*address || _InterlockedCompareExchange((volatile int *) address,1,0))
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
#define BLAS_LOCK_DEFINED
|
||||||
|
|
||||||
static __inline unsigned int rpcc(void) {
|
static __inline unsigned int rpcc(void) {
|
||||||
return __getReg(_IA64_REG_AR_ITC);
|
return __getReg(_IA64_REG_AR_ITC);
|
||||||
|
|
|
@ -98,6 +98,7 @@ static void INLINE blas_lock(volatile unsigned long *address){
|
||||||
|
|
||||||
} while (ret);
|
} while (ret);
|
||||||
}
|
}
|
||||||
|
#define BLAS_LOCK_DEFINED
|
||||||
|
|
||||||
static inline unsigned int rpcc(void){
|
static inline unsigned int rpcc(void){
|
||||||
unsigned long ret;
|
unsigned long ret;
|
||||||
|
|
|
@ -87,6 +87,7 @@ static void INLINE blas_lock(volatile unsigned long *address){
|
||||||
#endif
|
#endif
|
||||||
} while (ret);
|
} while (ret);
|
||||||
}
|
}
|
||||||
|
#define BLAS_LOCK_DEFINED
|
||||||
|
|
||||||
static inline unsigned long rpcc(void){
|
static inline unsigned long rpcc(void){
|
||||||
unsigned long ret;
|
unsigned long ret;
|
||||||
|
|
|
@ -58,6 +58,7 @@ static void __inline blas_lock(volatile unsigned long *address){
|
||||||
: "memory");
|
: "memory");
|
||||||
} while (ret);
|
} while (ret);
|
||||||
}
|
}
|
||||||
|
#define BLAS_LOCK_DEFINED
|
||||||
|
|
||||||
static __inline unsigned long rpcc(void){
|
static __inline unsigned long rpcc(void){
|
||||||
unsigned long clocks;
|
unsigned long clocks;
|
||||||
|
|
|
@ -65,6 +65,7 @@ static void __inline blas_lock(volatile BLASULONG *address){
|
||||||
} while (ret);
|
} while (ret);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#define BLAS_LOCK_DEFINED
|
||||||
|
|
||||||
static __inline unsigned long long rpcc(void){
|
static __inline unsigned long long rpcc(void){
|
||||||
unsigned int a, d;
|
unsigned int a, d;
|
||||||
|
|
|
@ -74,6 +74,7 @@ static void __inline blas_lock(volatile BLASULONG *address){
|
||||||
|
|
||||||
} while (ret);
|
} while (ret);
|
||||||
}
|
}
|
||||||
|
#define BLAS_LOCK_DEFINED
|
||||||
|
|
||||||
static __inline BLASULONG rpcc(void){
|
static __inline BLASULONG rpcc(void){
|
||||||
BLASULONG a, d;
|
BLASULONG a, d;
|
||||||
|
|
Loading…
Reference in New Issue